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通过websocket与js客户端通信示例分析
Jun 25 Python
Python求解平方根的方法
Mar 11 Python
在Python中执行系统命令的方法示例详解
Sep 14 Python
python selenium 对浏览器标签页进行关闭和切换的方法
May 21 Python
python 实现将字典dict、列表list中的中文正常显示方法
Jul 06 Python
python 批量解压压缩文件的实例代码
Jun 27 Python
Python数据分析模块pandas用法详解
Sep 04 Python
Pytorch之Variable的用法
Dec 31 Python
python deque模块简单使用代码实例
Mar 12 Python
python:HDF和CSV存储优劣对比分析
Jun 08 Python
Python数据分析库pandas高级接口dt的使用详解
Dec 11 Python
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
May 24 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
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
PHP4实际应用经验篇(3)
2006/10/09 PHP
PHP提取中文首字母
2008/04/09 PHP
微信公众平台之快递查询功能用法实例
2015/04/14 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
phpfpm的作用和用法
2019/10/10 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
JavaScript 滚轮事件使用说明
2010/03/07 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
es6学习笔记之Async函数基本教程
2017/05/11 Javascript
Vue单文件组件的如何使用方式介绍
2017/07/28 Javascript
利用JS hash制作单页Web应用的方法详解
2017/10/10 Javascript
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
python生成随机密码或随机字符串的方法
2015/07/03 Python
Python的SimpleHTTPServer模块用处及使用方法简介
2018/01/22 Python
Python如何调用外部系统命令
2019/08/07 Python
详解Python3 pickle模块用法
2019/09/16 Python
python实现滑雪者小游戏
2020/02/22 Python
css3图片边框border-image的用法
2017/06/30 HTML / CSS
苏格兰领先的多渠道鞋店:Begg Shoes
2019/10/22 全球购物
Linux开机引导的步骤是什么
2014/02/26 面试题
最新大学生自我评价
2013/09/24 职场文书
大学生就业自我鉴定
2013/10/26 职场文书
上班迟到检讨书
2014/01/10 职场文书
中学劳技课教师的自我评价
2014/02/05 职场文书
网络信息安全承诺书
2014/03/26 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
社会实践评语
2014/04/28 职场文书
村主任当选感言
2015/08/01 职场文书
小学教代会开幕词
2016/03/04 职场文书
Django Paginator分页器的使用示例
2021/06/23 Python
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS