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 10 Python
Python中的getopt函数使用详解
Jul 28 Python
Python 基础知识之字符串处理
Jan 06 Python
python+mongodb数据抓取详细介绍
Oct 25 Python
Python使用flask框架操作sqlite3的两种方式
Jan 31 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
Aug 31 Python
selenium+python实现自动化登录的方法
Sep 04 Python
python pandas写入excel文件的方法示例
Jun 25 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
Aug 10 Python
python实现井字棋小游戏
Mar 04 Python
python实现交并比IOU教程
Apr 16 Python
python switch 实现多分支选择功能
Dec 21 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采集速度探究总结(原创)
2008/04/18 PHP
php 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
PHP多进程通信-消息队列使用
2019/03/08 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
JS实现浏览器菜单命令
2006/09/05 Javascript
Jquery 学习笔记(一)
2009/10/13 Javascript
JavaScript DOM 学习第二章 编辑文本
2010/02/19 Javascript
Javascript 面向对象 对象(Object)
2010/05/13 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
2015/03/24 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
2015/09/30 Javascript
javascript中apply、call和bind的使用区别
2016/04/05 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
Vue 设置axios请求格式为form-data的操作步骤
2019/10/29 Javascript
python练习程序批量修改文件名
2014/01/16 Python
Python 文件读写操作实例详解
2014/03/12 Python
在Python的Django框架中包装视图函数
2015/07/20 Python
python3 与python2 异常处理的区别与联系
2016/06/19 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
python对列进行平移变换的方法(shift)
2019/01/10 Python
python列表,字典,元组简单用法示例
2019/07/11 Python
python匿名函数用法实例分析
2019/08/03 Python
Python交互环境下打印和输入函数的实例内容
2020/02/16 Python
python中如何写类
2020/06/29 Python
Python爬虫之Selenium警告框(弹窗)处理
2020/12/04 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
CSS伪类与CSS伪元素的区别及由来具体说明
2012/12/07 HTML / CSS
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
几个常见的软件测试问题
2016/09/07 面试题
竞聘演讲稿范文
2014/01/12 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
全陪导游词
2015/02/04 职场文书