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实现下载网易云音乐的高清MV
Mar 16 Python
粗略分析Python中的内存泄漏
Apr 23 Python
python2.7的编码问题与解决方法
Oct 04 Python
Python快速排序算法实例分析
Nov 29 Python
python爬取亚马逊书籍信息代码分享
Dec 09 Python
python版opencv摄像头人脸实时检测方法
Aug 03 Python
Python使用type关键字创建类步骤详解
Jul 23 Python
python读取Kafka实例
Dec 23 Python
Python中常用的高阶函数实例详解
Feb 21 Python
详解python对象之间的交互
Sep 29 Python
python绘制雷达图实例讲解
Jan 03 Python
Python中非常使用的6种基本变量的操作与技巧
Mar 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变量引用的面试题
2010/08/08 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
2014/03/06 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
javascript过滤数组重复元素的实现方法
2017/05/03 Javascript
Vue组件通信实践记录(推荐)
2017/08/15 Javascript
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
2019/02/18 Javascript
js常见遍历操作小结
2019/06/06 Javascript
利用d3.js实现蜂巢图表带动画效果
2019/09/03 Javascript
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
[43:35]EG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
如何查找和删除数据库中的重复数据
2014/11/05 面试题
恶意软件的定义
2014/11/12 面试题
简历中求职的个人自我评价
2013/12/03 职场文书
大一军训感言
2014/01/09 职场文书
学校十一活动方案
2014/02/01 职场文书
在职党员进社区活动总结
2014/07/05 职场文书
新闻发布会活动策划方案
2014/09/15 职场文书
2014年光棍节活动策划方案(创意集锦)
2014/09/29 职场文书
毕业横幅标语
2014/10/08 职场文书
通知格式
2015/04/27 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
Ruby GDBM操作简介及数据存储原理
2022/04/19 Ruby