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中的decode()方法的使用
May 18 Python
Python对数据库操作
Mar 28 Python
Python中的字符串查找操作方法总结
Jun 27 Python
Pycharm编辑器技巧之自动导入模块详解
Jul 18 Python
python opencv之SURF算法示例
Feb 24 Python
Django基础知识与基本应用入门教程
Jul 20 Python
Python中函数参数匹配模型详解
Jun 09 Python
Python利用matplotlib做图中图及次坐标轴的实例
Jul 08 Python
Python解析json时提示“string indices must be integers”问题解决方法
Jul 31 Python
Python统计学一数据的概括性度量详解
Mar 03 Python
Python使用Selenium模拟浏览器自动操作功能
Sep 08 Python
python使用yaml 管理selenium元素的示例
Dec 01 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 文件夹删除、php清除缓存程序
2009/08/25 PHP
PHP 面向对象 final类与final方法
2010/05/05 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
PHP中两个float(浮点数)比较实例分析
2015/09/27 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
科讯商业版中用到的ajax空间与分页函数
2007/09/02 Javascript
JavaScript 未结束的字符串常量常见解决方法
2010/01/24 Javascript
js实现创建删除html元素小结
2015/09/30 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
2015/10/15 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
2018/11/02 Javascript
mpvue微信小程序多列选择器用法之省份城市选择的实现
2019/03/07 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
python类和函数中使用静态变量的方法
2015/05/09 Python
python中的代码编码格式转换问题
2015/06/10 Python
浅谈python jieba分词模块的基本用法
2017/11/09 Python
Python编程产生非均匀随机数的几种方法代码分享
2017/12/13 Python
python selenium操作cookie的实现
2020/03/18 Python
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
100%法国制造的游戏和玩具:Les Jouets Français
2021/03/02 全球购物
经济信息管理专业大学生求职信
2013/09/27 职场文书
车工岗位职责
2013/11/26 职场文书
大学生职业规划范文:象牙塔生活的四年计划
2014/01/14 职场文书
工作失职检讨书范文
2014/01/16 职场文书
二年级小学生评语
2014/04/21 职场文书
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
篮球友谊赛通讯稿
2014/10/10 职场文书
商业用房租赁协议书
2014/10/13 职场文书
2014年德育工作总结
2014/11/20 职场文书
刑事附带民事代理词
2015/05/25 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers