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 strip()函数 介绍
May 24 Python
安装Python的教程-Windows
Jul 22 Python
python制作小说爬虫实录
Aug 14 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
Nov 16 Python
python机器学习实战之最近邻kNN分类器
Dec 20 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
Jul 18 Python
python操作小程序云数据库实现简单的增删改查功能
Jun 06 Python
Python中socket网络通信是干嘛的
May 27 Python
Python将字典转换为XML的方法
Aug 01 Python
Python图像识别+KNN求解数独的实现
Nov 13 Python
matplotlib之pyplot模块之标题(title()和suptitle())
Feb 22 Python
Python机器学习之KNN近邻算法
May 14 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
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
php调用mysql数据 dbclass类
2011/05/07 PHP
PHP判断表单复选框选中状态完整例子
2014/06/24 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHP自动载入类文件函数__autoload的使用方法
2019/03/25 PHP
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
jQuery.prototype.init选择器构造函数源码思路分析
2013/02/05 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
jQuery如何获取同一个类标签的所有值(默认无法获取)
2014/09/25 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
2016/06/27 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
2017/03/01 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
input输入框内容实时监测(附代码)
2017/08/15 Javascript
es6系列教程_ Map详解以及常用api介绍
2017/09/25 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
JQuery通过后台获取数据遍历到前台的方法
2018/08/13 jQuery
JS实现十分钟倒计时代码实例
2018/10/18 Javascript
javascript导出csv文件(excel)的方法示例
2019/08/25 Javascript
js Math数学简单使用操作示例
2020/03/13 Javascript
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
使用Protocol Buffers的C语言拓展提速Python程序的示例
2015/04/16 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
解析Python 偏函数用法全方位实现
2020/06/26 Python
python中的错误如何查看
2020/07/08 Python
css3背景图片透明叠加属性cross-fade简介及用法实例
2013/01/08 HTML / CSS
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
公司新员工的演讲稿注意事项
2014/01/01 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
2014年团支部年度工作总结
2014/12/24 职场文书
项目建议书
2015/02/04 职场文书
大学生个人学年总结
2015/02/15 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书