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中的异常处理
Apr 28 Python
Python脚本实现Web漏洞扫描工具
Oct 25 Python
Python获取SQLite查询结果表列名的方法
Jun 21 Python
Python3解决棋盘覆盖问题的方法示例
Dec 07 Python
python自动发送邮件脚本
Jun 20 Python
Python3转换html到pdf的不同解决方案
Mar 11 Python
利用Python半自动化生成Nessus报告的方法
Mar 19 Python
python 杀死自身进程的实现方法
Jul 01 Python
Python爬取腾讯视频评论的思路详解
Dec 19 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
Jun 12 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
Jul 14 Python
使用pipenv管理python虚拟环境的全过程
Sep 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
浅谈电磁辐射对健康的影响
2021/03/01 无线电
php中的时间显示
2007/01/18 PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
php入门学习知识点五 关于php数组的几个基本操作
2011/07/14 PHP
PHP写API输出的时用echo的原因详解
2019/04/28 PHP
Yii框架核心组件类实例详解
2019/08/06 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
2019/10/18 PHP
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
不用一句js代码初始化组件
2016/01/27 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
简单实现bootstrap选项卡效果
2017/02/08 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
极简主义法编写JavaScript类
2017/11/02 Javascript
JS选取DOM元素常见操作方法实例分析
2018/12/10 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛 DT VS HGT
2014/05/22 DOTA
Python实现的简单模板引擎功能示例
2017/09/02 Python
用python与文件进行交互的方法
2018/03/01 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
解决python flask中config配置管理的问题
2019/07/26 Python
使用pyecharts生成Echarts网页的实例
2019/08/12 Python
Python 实现递归法解决迷宫问题的示例代码
2020/01/12 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
浅谈keras中的keras.utils.to_categorical用法
2020/07/02 Python
Python进行特征提取的示例代码
2020/10/15 Python
CSS3之2D与3D变换的实现方法
2019/01/28 HTML / CSS
美国廉价机票预订网站:Cheapfaremart
2018/04/28 全球购物
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
服装设计行业个人的自我评价
2013/12/20 职场文书
银行办理业务介绍信
2014/01/18 职场文书
演讲稿祖国在我心中
2014/05/04 职场文书
安全生产月标语
2014/10/07 职场文书