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读文件逐行处理的示例代码分享
Dec 27 Python
Python的迭代器和生成器
Jul 29 Python
用Python写一个无界面的2048小游戏
May 24 Python
详解Python判定IP地址合法性的三种方法
Mar 06 Python
python dataframe astype 字段类型转换方法
Apr 11 Python
用Python写脚本,实现完全备份和增量备份的示例
Apr 29 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
Jul 12 Python
django小技巧之html模板中调用对象属性或对象的方法
Nov 30 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
Aug 17 Python
Python 类的私有属性和私有方法实例分析
Sep 29 Python
浅谈Python类的单继承相关知识
May 12 Python
Pygame Rect区域位置的使用(图文)
Nov 17 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
dedecms系统常用术语汇总
2007/04/03 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
laravel 解决crontab不执行的问题
2019/10/22 PHP
js玩一玩WSH吧
2007/02/23 Javascript
JS 自动完成 AutoComplete(Ajax 查询)
2009/07/07 Javascript
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
2009/12/27 Javascript
jQuery 点击图片跳转上一张或下一张功能的实现代码
2010/03/12 Javascript
jQuery 2.0.3 源码分析之core(一)整体架构
2014/05/27 Javascript
js获取时间并实现字符串和时间戳之间的转换
2015/01/05 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
2015/07/27 Javascript
jQuery中fadein与fadeout方法用法示例
2016/09/16 Javascript
React快速入门教程
2017/01/17 Javascript
js 动态生成html 触发事件传参字符转义的实例
2017/02/14 Javascript
Node.js创建Web、TCP服务器
2017/12/05 Javascript
vue中如何使用ztree
2018/02/06 Javascript
vue.js删除列表中的一行
2018/06/30 Javascript
[00:37]DOTA2上海特级锦标赛 Secert 战队宣传片
2016/03/03 DOTA
收集的几个Python小技巧分享
2014/11/22 Python
python optparse模块使用实例
2015/04/09 Python
基于Python对象引用、可变性和垃圾回收详解
2017/08/21 Python
python+pillow绘制矩阵盖尔圆简单实例
2018/01/16 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
Python搭建代理IP池实现获取IP的方法
2019/10/27 Python
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/09/18 面试题
电子商务专业在校生实习自我鉴定
2013/09/29 职场文书
求职毕业生自荐书
2014/02/08 职场文书
中餐厅经理岗位职责
2014/04/11 职场文书
《白鹅》教学反思
2014/04/13 职场文书
致共产党员倡议书
2014/04/16 职场文书
校园文化艺术节宣传标语
2014/10/09 职场文书
班主任经验交流心得体会
2015/11/02 职场文书
2016年社区六一儿童节活动总结
2016/04/06 职场文书