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实现的文件夹清理程序分享
Nov 22 Python
将Python代码嵌入C++程序进行编写的实例
Jul 31 Python
全面解析Python的While循环语句的使用方法
Oct 13 Python
Python3 socket同步通信简单示例
Jun 07 Python
Python之多线程爬虫抓取网页图片的示例代码
Jan 10 Python
Python3多线程操作简单示例
May 22 Python
python生成器与迭代器详解
Jan 01 Python
Python3 log10()函数简单用法
Feb 19 Python
详解Pycharm出现out of memory的终极解决方法
Mar 03 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
Jan 07 Python
Python字符串对齐方法使用(ljust()、rjust()和center())
Apr 26 Python
详解NumPy中的线性关系与数据修剪压缩
May 25 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函数
2008/10/03 PHP
PHP 图像尺寸调整代码
2010/05/26 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
PHP常用正则表达式集锦
2014/08/17 PHP
php获取错误信息的方法
2015/07/17 PHP
PHP生成图片缩略图类示例
2017/01/12 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
javascript 极速 隐藏/显示万行表格列只需 60毫秒
2009/03/28 Javascript
通过Jquery遍历Json的两种数据结构的实现代码
2011/01/19 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
阿里巴巴技术文章分享 Javascript继承机制的实现
2016/01/14 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
jquery实现的回旋滚动效果完整实例【附demo源码下载】
2016/09/20 Javascript
浅析上传头像示例及其注意事项
2016/12/14 Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
2016/12/25 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
2020/10/28 Javascript
理解Python中的With语句
2015/02/02 Python
Python实现的密码强度检测器示例
2017/08/23 Python
django获取from表单multiple-select的value和id的方法
2019/07/19 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
Python安装whl文件过程图解
2020/02/18 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
python 画图 图例自由定义方式
2020/04/17 Python
matplotlib.pyplot.matshow 矩阵可视化实例
2020/06/16 Python
python 实现超级玛丽游戏
2020/11/25 Python
CSS3 完美实现圆角效果
2009/07/13 HTML / CSS
怀念母亲教学反思
2014/04/28 职场文书
乡镇干部个人整改措施思想汇报
2014/10/10 职场文书
故宫的导游词
2015/01/31 职场文书
2016年中学端午节主题活动总结
2016/04/01 职场文书
详解Python描述符的工作原理
2021/06/11 Python
使用CSS实现音波加载效果
2023/05/07 HTML / CSS