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益智游戏计算汉诺塔问题示例
Mar 05 Python
Python登录并获取CSDN博客所有文章列表代码实例
Dec 28 Python
Python冲顶大会 快来答题!
Jan 17 Python
python生成带有表格的图片实例
Feb 03 Python
python join方法使用详解
Jul 30 Python
python内置函数sorted()用法深入分析
Oct 08 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
Sep 22 Python
tensorflow 限制显存大小的实现
Feb 03 Python
Python利用PyPDF2库获取PDF文件总页码实例
Apr 03 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
Apr 16 Python
Python调用shell cmd方法代码示例解析
Jun 18 Python
python 19个值得学习的编程技巧
Aug 15 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 strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
php环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
Dwz与thinkphp整合下的数据导出到Excel实例
2014/12/04 PHP
PHP也能干大事 随机函数
2015/04/14 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
jqgrid 简单学习笔记
2011/05/03 Javascript
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
2013/09/22 Javascript
javascript的动态加载、缓存、更新以及复用(一)
2014/06/09 Javascript
javascript常见操作汇总
2014/09/03 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
2015/04/16 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
2016/08/19 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
angularJS 发起$http.post和$http.get请求的实现方法
2017/05/18 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
2019/02/02 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
[42:27]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第三局
2016/03/05 DOTA
Python中的包和模块实例
2014/11/22 Python
详解Python中的from..import绝对导入语句
2016/06/21 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
Python Grid使用和布局详解
2018/06/30 Python
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
一套Java笔试题
2016/08/20 面试题
请说出以下代码输出什么
2013/08/30 面试题
应届生求职信范文
2014/05/26 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书
结婚典礼主持词
2015/06/29 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书