Python 迭代,for...in遍历,迭代原理与应用示例


Posted in Python onOctober 12, 2019

本文实例讲述了Python 迭代,for...in遍历,迭代原理与应用。分享给大家供大家参考,具体如下:

迭代是访问集合元素的一种方式。什么时候访问元素,什么时候再迭代,比一次性取出集合中的所有元素要节约内存。特别是访问大的集合时,用迭代的方式访问,比一次性把集合都读到内存要节省资源。

demo.py(迭代,遍历):

import time
from collections import Iterable
from collections import Iterator
# 有__iter__方法的类是Iterable(可迭代的)。
# 既有__iter__方法又有__next__方法是Iterator(迭代器)。
class Classmate(object):
  def __init__(self):
    self.names = list()
    self.current_num = 0
  def add(self, name):
    self.names.append(name)
  def __iter__(self):
    """Iterable对象必须实现__iter__方法"""
    return self # __iter__方法必须返回一个Iterator(既有__iter__方法,又有__next__方法)
  # __next__的返回值就是for循环遍历出的变量值
  def __next__(self):
    if self.current_num < len(self.names):
      ret = self.names[self.current_num]
      self.current_num += 1
      return ret
    else:
      raise StopIteration # 抛出StopIteration异常时,for遍历会停止迭代
classmate = Classmate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")
# print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable))
# classmate_iterator = iter(classmate) # iter()会调用对象的__iter__方法
# print("判断classmate_iterator是否是迭代器:", isinstance(classmate_iterator, Iterator))
# print(next(classmate_iterator))  # next()会调用对象的__next__方法
for name in classmate: # 遍历时会先调用classmate的__iter__方法(必须返回Iterator对象)。
  print(name)  # 遍历出的name就是返回的Iterator对象的__next__方法的返回值
  time.sleep(1) # 当__next__抛出StopIteration异常时,for遍历会停止迭代

运行结果:

老王
王二
张三

demo.py(迭代的应用):

li = list(可迭代对象)    # 将可迭代对象转换成list类型。 底层就是通过迭代实现的。
print(li)
tp = tuple(可迭代对象)    # 将可迭代对象转换成tuple类型。
print(tp)
# for ... in 可迭代对象     # for遍历也是通过迭代实现的

如上例改写如下:

示例1:

class Classmate(object):
  def __init__(self):
    self.names = list()
    self.current_num = 0
  def add(self, name):
    self.names.append(name)
  def __iter__(self):
    """Iterable对象必须实现__iter__方法"""
    return self # __iter__方法必须返回一个Iterator(既有__iter__方法,又有__next__方法)
  # __next__的返回值就是for循环遍历出的变量值
  def __next__(self):
    if self.current_num < len(self.names):
      ret = self.names[self.current_num]
      self.current_num += 1
      return ret
    else:
      raise StopIteration # 抛出StopIteration异常时,for遍历会停止迭代
classmate = Classmate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")
li = list(classmate)  # 将可迭代对象转换成list类型。 底层就是通过迭代实现的。
print(li)

输出:

['老王', '王二', '张三']

示例2:

class Classmate(object):
  def __init__(self):
    self.names = list()
    self.current_num = 0
  def add(self, name):
    self.names.append(name)
  def __iter__(self):
    """Iterable对象必须实现__iter__方法"""
    return self # __iter__方法必须返回一个Iterator(既有__iter__方法,又有__next__方法)
  # __next__的返回值就是for循环遍历出的变量值
  def __next__(self):
    if self.current_num < len(self.names):
      ret = self.names[self.current_num]
      self.current_num += 1
      return ret
    else:
      raise StopIteration # 抛出StopIteration异常时,for遍历会停止迭代
classmate = Classmate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")
tp = tuple(classmate)  # 将可迭代对象转换成tuple类型。
print(tp)

输出:

('老王', '王二', '张三')

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python之re操作方法(详解)
Jun 14 Python
Python数据结构与算法之图结构(Graph)实例分析
Sep 05 Python
Python随机生成均匀分布在单位圆内的点代码示例
Nov 13 Python
微信公众号token验证失败解决方案
Jul 22 Python
python使用Matplotlib改变坐标轴的默认位置
Oct 18 Python
selenium 多窗口切换的实现(windows)
Jan 18 Python
pycharm设置默认的UTF-8编码模式的方法详解
Jun 01 Python
Anaconda详细安装步骤图文教程
Nov 12 Python
python中二分查找法的实现方法
Dec 06 Python
Python lxml库的简单介绍及基本使用讲解
Dec 22 Python
Python3+Django get/post请求实现教程详解
Feb 16 Python
Python实现Telnet自动连接检测密码的示例
Apr 16 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
Oct 12 #Python
Python Collatz序列实现过程解析
Oct 12 #Python
python logging日志模块原理及操作解析
Oct 12 #Python
Python爬虫之urllib基础用法教程
Oct 12 #Python
python 生成器和迭代器的原理解析
Oct 12 #Python
python 表格打印代码实例解析
Oct 12 #Python
Django+uni-app实现数据通信中的请求跨域的示例代码
Oct 12 #Python
You might like
PHP四舍五入、取整、round函数使用示例
2015/02/06 PHP
php读取txt文件并将数据插入到数据库
2016/02/23 PHP
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
jQuery实现的网格线绘制方法
2016/06/20 Javascript
JS实现图片剪裁并预览效果
2016/08/12 Javascript
bootstrap监听滚动实现头部跟随滚动
2016/11/08 Javascript
vue日期组件 支持vue1.0和2.0
2017/01/09 Javascript
ES6生成器用法实例分析
2017/04/10 Javascript
JavaScript生成图形验证码
2020/08/24 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
2019/09/09 Javascript
vue远程加载sfc组件思路详解
2019/12/25 Javascript
JavaScript实现下拉列表
2021/01/20 Javascript
python选择排序算法实例总结
2015/07/01 Python
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
2019/04/12 Python
Python把图片转化为pdf代码实例
2020/07/28 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
html5弹跳球示例代码
2013/07/23 HTML / CSS
MCM英国官网:奢侈皮具制品
2017/04/18 全球购物
澳大利亚第一旅行车和房车配件店:Caravan RV Camping
2020/12/26 全球购物
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
2014的自我评价
2014/01/13 职场文书
高中化学教学反思
2014/01/13 职场文书
青年教师培训方案
2014/02/06 职场文书
纪检监察建议书
2014/05/19 职场文书
婚礼答谢礼品
2015/01/20 职场文书
大学生求职信怎么写
2015/03/19 职场文书
党员干部学习三严三实心得体会
2016/01/05 职场文书
四年级数学教学反思
2016/02/16 职场文书
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android