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使用in操作符时元组和数组的区别分析
May 19 Python
全面理解Python中self的用法
Jun 04 Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
Sep 18 Python
python实现判断一个字符串是否是合法IP地址的示例
Jun 04 Python
Python设计模式之备忘录模式原理与用法详解
Jan 15 Python
利用python实现在微信群刷屏的方法
Feb 21 Python
详解Python3 基本数据类型
Apr 19 Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 Python
Python数据存储之 h5py详解
Dec 26 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
Mar 30 Python
python支持多继承吗
Jun 19 Python
Python读取pdf表格写入excel的方法
Jan 22 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 阴历-农历-转换类代码
2012/01/16 PHP
基于php实现长连接的方法与注意事项的问题
2013/05/10 PHP
php实现登陆模块功能示例
2016/10/20 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
jQuery中绑定事件的命名空间详解
2011/04/05 Javascript
用js获取电脑信息(是使用与IE浏览器)
2013/01/15 Javascript
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
2014/12/14 Javascript
浅谈jQuery中setInterval()方法
2015/07/07 Javascript
javascript跑马灯抽奖实例讲解
2020/04/17 Javascript
Javascript动画效果(3)
2016/10/11 Javascript
jQuery给指定的table动态添加删除行的操作方法
2016/10/12 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
详解React-Router中Url参数改变页面不刷新的解决办法
2018/05/08 Javascript
Vue.js更改调试地址端口号的实例
2018/09/19 Javascript
通过layer实现可输入的模态框的例子
2019/09/27 Javascript
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
Python 实现购物商城,含有用户入口和商家入口的示例
2017/09/15 Python
使用Python实现批量ping操作方法
2020/05/06 Python
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
《我的第一本书》教学反思
2014/02/15 职场文书
阅兵口号
2014/06/19 职场文书
银行授权委托书范本
2014/10/04 职场文书
财务会计实训报告
2014/11/05 职场文书
2014小学二年级班主任工作总结
2014/12/05 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
创业计划书之便利店
2019/09/05 职场文书
MySql数据库 查询时间序列间隔
2022/05/11 MySQL