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中的列表推导浅析
Apr 26 Python
Python中os.path用法分析
Jan 15 Python
Python中使用插入排序算法的简单分析与代码示例
May 04 Python
Python实现进程同步和通信的方法
Jan 02 Python
matplotlib subplots 调整子图间矩的实例
May 25 Python
Python操作配置文件ini的三种方法讲解
Feb 22 Python
Python 实现输入任意多个数,并计算其平均值的例子
Jul 16 Python
python词云库wordCloud使用方法详解(解决中文乱码)
Feb 17 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 Python
Python库安装速度过慢解决方案
Jul 14 Python
基于Python3读写INI配置文件过程解析
Jul 23 Python
Python多个MP4合成视频的实现方法
Jul 16 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抓取页面与代码解析 推荐
2010/07/23 PHP
PHP中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
用PHP+MySQL搭建聊天室功能实例代码
2012/08/20 PHP
php var_export与var_dump 输出的不同
2013/08/09 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
很酷的javascript loading效果代码
2008/06/18 Javascript
基于jquery完美拖拽,可返回拖动轨迹
2012/03/29 Javascript
在浏览器中实现图片粘贴的jQuery插件-- pasteimg使用指南
2014/12/29 Javascript
使用console进行性能测试
2015/04/27 Javascript
jQuery原型属性和原型方法详解
2015/07/07 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
javascript实现全角转半角的方法
2016/01/23 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
Bootstrap fileinput文件上传组件使用详解
2017/06/06 Javascript
Nodejs实现多房间简易聊天室功能
2017/06/20 NodeJs
超级简易的JS计算器实例讲解(实现加减乘除)
2017/08/08 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
深入理解requireJS-实现一个简单的模块加载器
2018/01/15 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
深度了解vue.js中hooks的相关知识
2019/06/14 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
vue微信分享插件使用方法详解
2020/02/18 Javascript
Django+Ajax+jQuery实现网页动态更新的实例
2018/05/28 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
python的dict判断key是否存在的方法
2020/12/09 Python
用CSS3绘制三角形的简单方法
2015/07/17 HTML / CSS
新西兰廉价汽车租赁:Snap Rentals
2018/09/14 全球购物
大学生旅游业创业计划书
2014/01/29 职场文书
六查六看心得体会
2014/10/14 职场文书
2015大学迎新晚会策划书
2015/07/16 职场文书
Python中三种花式打印的示例详解
2022/03/19 Python
优化Mysql查询的示例
2022/04/26 MySQL