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处理csv数据的方法
Mar 11 Python
Python算法之图的遍历
Nov 16 Python
Python基于Tkinter模块实现的弹球小游戏
Dec 27 Python
python文档字符串(函数使用说明)使用详解
Jul 30 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
Jul 31 Python
python wxpython 实现界面跳转功能
Dec 17 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
Jul 14 Python
Python logging模块进行封装实现原理解析
Aug 07 Python
python 代码运行时间获取方式详解
Sep 18 Python
Pandas数据类型之category的用法
Jun 28 Python
Python操作CSV格式文件的方法大全
Jul 15 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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
浅析php中常量,变量的作用域和生存周期
2013/08/10 PHP
PHP中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
微信公众平台开发之天气预报功能
2015/08/31 PHP
Yii中实现处理前后台登录的新方法
2015/12/28 PHP
PHP接入微信H5支付的方法示例
2019/10/28 PHP
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
extjs render 用法介绍
2013/09/11 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
微信小程序 转发功能的实现
2017/08/04 Javascript
JavaScript实现简单评论功能
2017/08/17 Javascript
vue注册组件的几种方式总结
2018/03/08 Javascript
简单的vuex 的使用案例笔记
2018/04/13 Javascript
vue基础之模板和过滤器用法实例分析
2019/03/12 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
很酷的python表白工具 你喜欢我吗
2019/04/11 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
python3排序的实例方法
2020/10/20 Python
解决html5中的video标签ios系统中无法播放使用的问题
2020/08/10 HTML / CSS
泰国办公用品购物网站:OfficeMate
2018/02/04 全球购物
意大利在线购买隐形眼镜网站:VisionDirect.it
2019/03/18 全球购物
三好学生自我鉴定
2013/12/17 职场文书
大学生第一学年自我鉴定
2014/09/12 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
领导干部作风建设剖析材料
2014/10/11 职场文书
企业开业庆典答谢词
2015/01/20 职场文书
公司介绍信范文
2015/01/31 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
python将图片转为矢量图的方法步骤
2021/03/30 Python
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python