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内置函数bin() oct()等实现进制转换
Dec 30 Python
Python语言编写电脑时间自动同步小工具
Mar 08 Python
利用soaplib搭建webservice详细步骤和实例代码
Nov 20 Python
实例讲解Python的函数闭包使用中应注意的问题
Jun 20 Python
Python实现的径向基(RBF)神经网络示例
Feb 06 Python
Python中pow()和math.pow()函数用法示例
Feb 11 Python
推荐10款最受Python开发者欢迎的Python IDE
Sep 16 Python
python批量赋值操作实例
Oct 22 Python
Django实现分页显示效果
Oct 31 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
May 26 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
Jun 03 Python
Python  word实现读取及导出代码解析
Jul 09 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数据库解决方案分析介绍
2015/09/24 PHP
PHP函数超时处理方法
2016/02/14 PHP
微信支付PHP SDK ―― 公众号支付代码详解
2016/09/13 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
javascript实现的网页局布刷新效果
2008/12/01 Javascript
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
js获取指定的cookie的具体实现
2014/02/20 Javascript
js实现特定位取反原理及示例
2014/06/30 Javascript
常用jQuery选择器总结
2014/07/11 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
JavaScript实现将数组数据添加到Select下拉框的方法
2015/08/21 Javascript
JavaScript变量作用域_动力节点Java学院整理
2017/06/27 Javascript
Angularjs实现上传图片预览功能
2017/09/01 Javascript
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
2018/09/03 Javascript
[28:28]Ti4 冒泡赛第二天NEWBEE vs NaVi 2
2014/07/15 DOTA
python动态监控日志内容的示例
2014/02/16 Python
Python Unittest自动化单元测试框架详解
2018/04/04 Python
Python3最长回文子串算法示例
2019/03/04 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
python之列表推导式的用法
2019/11/29 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
保时捷设计:Porsche Design
2019/03/30 全球购物
Charles & Colvard官网:美国莫桑石品牌
2019/06/05 全球购物
一些PHP的面试题
2015/05/06 面试题
银行服务感言
2014/03/01 职场文书
大学新生入学教育方案
2014/05/16 职场文书
员工辞退通知书
2015/04/17 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
Mysql中常用的join连接方式
2022/05/11 MySQL
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
2022/06/14 MySQL