Python 中迭代器与生成器实例详解


Posted in Python onMarch 29, 2017

Python 中迭代器与生成器实例详解

本文通过针对不同应用场景及其解决方案的方式,总结了Python中迭代器与生成器的一些相关知识,具体如下:

1.手动遍历迭代器

应用场景:想遍历一个可迭代对象中的所有元素,但是不想用for循环

解决方案:使用next()函数,并捕获StopIteration异常

def manual_iter():
  with open('/etc/passwd') as f:
    try:
      while True:
        line=next(f)
        if line is None:
          break
        print(line,end='')
      except StopIteration:
        pass
#test case
items=[1,2,3]
it=iter(items)
next(it)
next(it)
next(it)

2.代理迭代

应用场景:想直接在一个包含有列表、元组或其他可迭代对象的容器对象上执行迭代操作

解决方案:定义一个iter()方法,将迭代操作代理到容器内部的对象上

示例:

class Node:
  def __init__(self,value):
    self._value=value
    self._children=[]
  def __repr__(self):
    return 'Node({!r})'.fromat(self._value)
  def add_child(self,node):
    self._children.append(node)
  def __iter__(self):
    #将迭代请求传递给内部的_children属性
    return iter(self._children)
#test case
if __name='__main__':
  root=Node(0)
  child1=Node(1)
  child2=Nide(2)
  root.add_child(child1)
  root.add_child(child2)
  for ch in root:
    print(ch)

3.反向迭代

应用场景:想要反向迭代一个序列

解决方案:使用内置的reversed()函数或者在自定义类上实现reversed()

示例1

a=[1,2,3,4]
for x in reversed(a):
  print(x) #4 3 2 1


f=open('somefile')
for line in reversed(list(f)):
  print(line,end='')
#test case
for rr in reversed(Countdown(30)):
  print(rr)

for rr in Countdown(30):
  print(rr)

示例2

class Countdown:
  def __init__(self,start):
    self.start=start
  #常规迭代
  def __iter__(self):
    n=self.start
    while n > 0:
      yield n
      n -= 1
  #反向迭代
  def __reversed__(self):
    n=1
    while n <= self.start:
      yield n
      n +=1

4.有选择的迭代

应用场景:想遍历一个可迭代对象,但是对它开始的某些元素并不感兴趣,想跳过

解决方案:使用itertools.dropwhile()

示例1

with open('/etc/passwd') as f:
  for line in f:
    print(line,end='')

示例2

from itertools import dropwhile
with open('/etc/passwd') as f:
  for line in dropwhile(lambda line:line.startwith('#'),f):
    print(line,end='')

5.同时迭代多个序列

应用场景:想同时迭代多个序列每次分别从一个序列中取一个元素

解决方案:使用zip()函数

Python 中迭代器与生成器实例详解

Python 中迭代器与生成器实例详解

Python 中迭代器与生成器实例详解

Python 中迭代器与生成器实例详解

6.不同集合上元素的迭代

应用场景:想在多个对象执行相同的操作,但是这些对象在不同的容器中

解决方案:使用itertool.chain()函数

Python 中迭代器与生成器实例详解

7.展开嵌套的序列

应用场景:想将一个多层嵌套的序列展开成一个单层列表

解决方案:使用包含yield from语句的递归生成器

示例

from collections import Iterable
def flatten(items,ignore_types=(str,bytes)):
  for x in items:
    if isinstance(x,Iterable) and not isinstance(x,ignore_types):
      yield from flatten(x)
    else:
      yield x
#test case
items=[1,2,[3,4,[5,6],7],8]
for x in flatten(items):
  print(x)

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
编程语言Python的发展史
Sep 26 Python
浅谈Python中列表生成式和生成器的区别
Aug 03 Python
python爬虫实战之最简单的网页爬虫教程
Aug 13 Python
用十张图详解TensorFlow数据读取机制(附代码)
Feb 06 Python
python中(str,list,tuple)基础知识汇总
Feb 20 Python
python队列Queue的详解
May 10 Python
python 处理微信对账单数据的实例代码
Jul 19 Python
Python操作Sonqube API获取检测结果并打印过程解析
Nov 27 Python
Python读取Excel数据并生成图表过程解析
Jun 18 Python
Python fileinput模块如何逐行读取多个文件
Oct 05 Python
浅谈Python 中的复数问题
May 19 Python
只需要这一行代码就能让python计算速度提高十倍
May 24 Python
Python利用Beautiful Soup模块搜索内容详解
Mar 29 #Python
windows系统下Python环境搭建教程
Mar 28 #Python
Python中Django 后台自定义表单控件
Mar 28 #Python
windows上安装Anaconda和python的教程详解
Mar 28 #Python
利用python爬取软考试题之ip自动代理
Mar 28 #Python
详解python调度框架APScheduler使用
Mar 28 #Python
Python中is与==判断的区别
Mar 28 #Python
You might like
php数据入库前清理 注意php intval与mysql的int取值范围不同
2010/12/12 PHP
php中url函数介绍及使用示例
2014/02/13 PHP
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
php封装json通信接口详解及实例
2017/03/07 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
javascript Object与Function使用
2010/01/11 Javascript
Javascript常考语句107条收集
2010/03/09 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
ie与ff下的event事件使用介绍
2013/11/25 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
jQuery手指滑动轮播效果
2016/12/22 Javascript
jQuery实现获取h1-h6标题元素值的方法
2017/03/06 Javascript
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
[03:17]DOTA2英雄基础教程 剧毒术士
2013/12/12 DOTA
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
[02:04]完美世界城市挑战赛秋季赛报名开始 谁是solo路人王?
2019/10/10 DOTA
Python的Django框架中使用SQLAlchemy操作数据库的教程
2016/06/02 Python
Django Admin 实现外键过滤的方法
2017/09/29 Python
PyQt5每天必学之单行文本框
2018/04/19 Python
python学习之hook钩子的原理和使用
2018/10/25 Python
python求平均数、方差、中位数的例子
2019/08/22 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
测绘工程本科生求职信
2013/10/10 职场文书
乌鸦喝水教学反思
2014/02/07 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
2014年学生党支部工作总结
2014/12/20 职场文书
师德先进个人材料
2014/12/20 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书
银行大堂经理培训心得体会
2016/01/09 职场文书
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS