1. 手动遍历迭代器 next()

遍历一个可迭代对象中的所有元素,但是却不想使用for循环。为了手动的遍历可迭代对象,使用 next() 函数并在代码中捕获 StopIteration 异常。 通常来讲, StopIteration 用来指示迭代的结尾。 然而,如果手动使用 next() 函数的话,还可以通过返回一个指定值来标记结尾,比如 None 。读取一个文件的所有行实例。

def manual_iter(filename):with open(filename) as f:try:while True:line = next(f)print(line, end = '')except StopIteration:passmanual_iter(filename = 'test.txt')      ############################with open('test.txt') as f:while True:line = next(f, None)if line is None:breakprint(line, end='')
# >>> sorry
#     i really don't know how to choose?
#     go abroad, tencent, or alibaba?
#     but anyway,
#     i absolutely don't choose to huawei...    

迭代机制:获取迭代器+运行迭代器

items = [1, 2, 3]
# Get the iterator
it = iter(items) # Invokes items.__iter__()
# Run the iterator
print( next(it) ) # 1
print( next(it) ) # 2
print( next(it) ) # 3
print( next(it) ) # Traceback : StopIteration

2. 代理迭代

有的时候,我们需要构建自定义容器对象,里面包含有列表、元组或其他可迭代对象。并且直接在新容器对象上执行迭代操作。实际上我们只需要定义一个__iter__()方法,将迭代操作代理到容器内部的对象上去。

class Node:def __init__(self, value):self.value = valueself._children = []def __repr__(self):return 'Node({!r})'.format(self.value)def add_child(self, node):self._children.append(node)def __iter__(self):return iter(self._children)if __name__ == '__main__':root = Node(0)child1 = Node(1)child2 = Node(2)root.add_child(child1)root.add_child(child2)for tar in root:print(tar)
# >>> Node(1) Node(2) 

在上面代码中, __iter__() 方法只是简单的将迭代请求传递给内部的 _children 属性。

3. 使用生成器创建新的迭代模式

如果想实现一种新的迭代模式,可以使用生成器函数来定义。 下面是一个生产某个范围内浮点数的生成器:

def frange(start, stop, increment):x = startwhile x < stop:yield x       # pointer to next objectx += incrementfor num in frange(0, 4, 0.5):print(num)
# >>> 0 0.5 1.0 1.5 2.0 2.5 3.0 3.5

一个函数中需要有一个 yield 语句即可将其转换为一个生成器。 跟普通函数不同的是,生成器只能用于迭代操作。一个生成器函数主要特征是它只会回应在迭代中使用到的 next 操作。 一旦生成器函数返回退出,迭代终止。

4. 反向迭代

当我们需要反向迭代时,就需要reversed()函数进行处理。

a = [1, 2, 3, 4]
for num in reversed(a):print (num)
# >>> 4 3 2 1

反向迭代仅仅当对象的大小可预先确定或者对象实现了 __reversed__() 的特殊方法时才能生效。 如果两者都不符合,那必须先将对象转换为一个列表才行,比如:

"""
a = [1, 2, 3, 4]
for num in reversed(a):print (num)
# >>> 4 3 2 1
"""
f = open('test.txt')
for line in reversed(list(f)):print(line, end='')
# >>> i absolutely don't choose to huawei.but anyway.
#     go abroad, tencent, or alibaba?
#     i really don't know how to choose?
#     sorry.
  • 自定义类上实现 __reversed__() 方法来实现反向迭代
class Countdown:def __init__(self, start):self.start = startdef __iter__(self):# Forwardn = self.startwhile n > 0:yield nn -= 1def __reversed__(self):# Reversen = 1while n <= self.start:yield nn += 1for rr in reversed(Countdown(30)):print(rr)
for rr in Countdown(30):print(rr)

定义一个反向迭代器可以使得代码非常的高效, 因为它不再需要将数据填充到一个列表中然后再去反向迭代这个列表。

文章参考《python3-cookbook》

python迭代器生成器使用技巧(1):遍历、代理、生成器创建迭代、反向迭代相关推荐

  1. python迭代器面试题_Python面试题之生成器/迭代器

    原博文 2017-07-02 21:36 − 1.为什么要有生成器? 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占 ...

  2. python迭代器生成器 学会再缩短一半开发效率 看看大牛是怎么写的

    一.迭代 什么叫做迭代? 比如在 Java 中,我们通过 List 集合的下标来遍历 List 集合中的元素,在 Python 中,给定一个 list 或 tuple,我们可以通过 for 循环来遍历 ...

  3. python迭代器生成器使用技巧(2):切片、遍历、索引值、多序列、多容器对象

    1. 迭代器切片 迭代器和生成器不能使用标准的切片操作,因为它们的长度事先并不知道(并且也没有实现索引). 函数 islice() 返回一个可以生成指定元素的迭代器,通过遍历并丢弃直到切片开始索引位置 ...

  4. python迭代器创建序列_Python 中迭代器与生成器实例详解

    Python 中迭代器与生成器实例详解 本文通过针对不同应用场景及其解决方案的方式,总结了Python中迭代器与生成器的一些相关知识,具体如下: 1.手动遍历迭代器 应用场景:想遍历一个可迭代对象中的 ...

  5. python迭代器两个基本方法可供参考_浅析python迭代器和生成器

    可迭代对象 概念 一个对象(在Python里面一切都是对象)只要实现了只要实现了__iter__()方法,那么这个对象就是可迭代对象 常见的可迭代对象 集合或序列类型(如list.tuple.set. ...

  6. python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)

    1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...

  7. 深入浅出地解读Python迭代器和生成器

    迭代器和生成器是Python很重要的进阶语法.虽然在一开始的学习中,不理解它们并不影响你写代码.但到一定阶段之后,如果没有掌握其原理,你可能无法彻底理解代码的运行逻辑.今天我们就给大家分享一篇关于迭代 ...

  8. python迭代器与生成器_Python的迭代器和生成器

    一 概要 在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set ...

  9. 二十、深入Python迭代器和生成器

    @Date:2019年07月13日 @Author: Runsen 学习python的过程中,迭代器与生成器是绕不开的话题, 什么是迭代器和生成器呢? 下面我们来了解一下什么是迭代.但在了解迭代器之前 ...

最新文章

  1. 洛谷 P2746 [USACO5.3]校园网Network of Schools
  2. 工厂模式——JavaScript
  3. c 僵尸进程_演示僵尸进程的C程序
  4. Android 四大组件 —— 服务
  5. 计算机网络之应用层:2、DNS域名解析系统
  6. caffe boost cuda __float128 undefined
  7. CSS(网页样式语言)基础,网页CSS设计样式基础知识点 小白教程
  8. 【Unity Shaders】Mobile Shader Adjustment —— 为手机定制Shader
  9. 精英讲师培训笔记01-提升口才的三个心法
  10. VS编译报错Error2019
  11. Matlab工具箱实现张正友相机标定
  12. JS 三级联动之 省市县。
  13. 2011高校信息化实践者精英论坛之上海交大BI系统汇报
  14. linux连公共wifi怎么输密码,公共Wifi密码怎么用 公共Wifi密码使用方法
  15. PPT制作心得与感悟
  16. Android Studio 3.0+ 新Dex编译器D8 Desugar R8
  17. Android常用的第三方开源库和框架
  18. 求任意两个整数的最大公因数
  19. 福克斯连接android手机,福克斯改装安卓9寸大屏幕导航和行车记录仪
  20. java开发工具还有那些?

热门文章

  1. linux下使用taskset设置进程cpu绑定不起作用
  2. MVC Razor 语法(转)
  3. Define change document object
  4. hdu 1511(dp)
  5. UVa 10844 (大数)
  6. NYOJ 658 字符串右移
  7. Codeforces Round #582 (Div. 3)
  8. 原型与原型链的简单理解
  9. python爬虫---实现项目(二) 分析Ajax请求抓取数据
  10. MySQL实战45讲学习笔记:MySQL架构(第一讲)