1. 迭代器切片

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

import itertools
def count(n):while True:yield n n += 1c = count(0)
# print( c[10:20] )
# TypeError: 'generator' object is not subscriptablefor num in itertools.islice(c, 10, 15):print(num)
# >>> 10, 11, 12, 13, 14

这里需要强调的一点是 islice() 会消耗掉传入的迭代器中的数据。 而迭代器是不可逆的。 所以如果需要之后再次访问这个迭代器的话,就得先将它里面的数据放入一个列表中了。

2. 排列组合的迭代遍历

如果我们想迭代遍历集合中元素的所有可能的排列或组合,可以用itertools模块提供两函数来解决这类问题。

  • itertools.permutations() , 接受集合并产生一个元组序列,每个元组由集合中所有元素的一个可能排列组成。 也就是说通过打乱集合中元素排列顺序生成一个元组。如果想得到指定长度的排列,可以传递长度参数permutation(items, length)。
from itertools import permutationsitems = ['a', 'b', 'c']
for sample in permutations(items):print( sample )
# >>> ('a', 'b', 'c')
#     ('a', 'c', 'b')
#     ('b', 'a', 'c')
#     ('b', 'c', 'a')
#     ('c', 'a', 'b')
#     ('c', 'b', 'a')
  • itertools.combinations() 得到输入集合中元素的所有的组合
from itertools import combinations
for sample in combinations(items, 3):print(sample)
# >>> ('a', 'b', 'c')

对于 combinations() ,元素的顺序已经不重要了。 也就是说,组合 ('a', 'b') 跟 ('b', 'a') 其实是一样的.

3. 序列上索引值迭代 enumerate()

如果我们想在迭代一个序列的同时跟踪正在被处理的元素索引时可以采用这种方法。这种情况在遍历文件时想在错误消息中使用行号定位时候非常有用。

my_list = ['a', 'b', 'c']
for idx, val in enumerate(my_list):print(idx, val)
# >>> 0 a
#     1 b
#     2 c

遍历文件消息时,可以直接用于发现文件消息发生错误所处的位置(行号):

def parse_data(filename):with open(filename, 'rt') as f:for idx, line in enumerate(f,1): # from Line 1fields = line.split()try:# cnt = int (fields[1])passexcept ValueError as e:print('Line{}:Parse error: {}'.format(idx, e))parse_data('test.txt')

4. 同时迭代多个序列 zip()

如何同时迭代多个序列,每次分别从一个序列中取一个元素?zip()函数就是为了解决多个序列同时迭代而设计的。

  • zip() 最小迭代终止
xpts = [1, 5, 4, 2, 10]
ypts = [101, 78, 37, 15, 62, 99,56, 22]
for x, y in zip(xpts, ypts):print(x,y)
# >>> 1 101
#     5 78
#     4 37
#     2 15
#     10 62

zip(a, b) 会生成一个可返回元组 (x, y) 的迭代器,其中x来自a,y来自b。 一旦其中某个序列到底结尾,迭代宣告结束。 因此迭代长度跟参数中最短序列长度一致

  • zip_longest() 最大迭代终止
from itertools import zip_longestxpts = [1, 5, 4, 2, 10]
ypts = [101, 78, 37, 15, 62, 99, 56, 22]
for x, y in zip_longest(xpts, ypts):print(x,y)
# >>> 1 101
#     5 78
#     4 37
#     2 15
#     10 62
#    None 99
#    None 56
#    None 22

zip() 函数对于同时处理两个、两个以上的序列非常有用。需要注意的一点是:zip() 会创建一个迭代器来作为结果返回。 如果需要将结对的值存储在列表中,要使用list() 函数

xpts = [1, 5, 4, 2, 10]
ypts = [101, 78, 37, 15, 62, 99, 56, 22]
print(zip(xpts, ypts))
# >>> <zip object at 0x0000000007505F88>
print(list(zip(xpts, ypts)))
# >>> [(1, 101), (5, 78), (4, 37), (2, 15), (10, 62)]

5. 不同集合上元素的迭代

如果我们想在多个对象执行相同的操作,但是这些对象在不同的容器中。在不失可读性的情况下如何避免写重复的循环?itertools.chain() 可以用来简化这个任务。 它接受可迭代对象列表作为输入,并返回一个迭代器,有效的屏蔽掉在多个容器中迭代细节。

from itertools import chaina = [1, 2]
b = ['x', 'y', 'z']
for x in chain(a, b):print(x)
# >>> 1 2 x y zprint(chain(a, b))
# >>> <itertools.chain object at 0x0000000008B18978>print(list(chain(a,b)))
# >>> [1, 2, 'x', 'y', 'z']

itertools.chain() 接受一个或多个可迭代对象作为输入参数。 然后创建一个迭代器,依次连续的返回每个可迭代对象中的元素。 这种方式(chain(a,b))要比先将序列合并(a+b)再迭代要高效的多。a + b 操作会创建一个全新的序列并要求a和b的类型一致。 chian() 不会有这一步,所以如果输入序列非常大的时候会很省内存。 并且当可迭代对象类型不一样的时候 chain() 同样可以很好的工作。

文章参考《python3-cookbook》

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

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

    1. 手动遍历迭代器 next() 遍历一个可迭代对象中的所有元素,但是却不想使用for循环.为了手动的遍历可迭代对象,使用 next() 函数并在代码中捕获 StopIteration 异常. 通常 ...

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

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

  3. python 迭代器 生成器_python 迭代器与生成器

    迭代器 迭代器就是iter(可迭代对象函数)返回的对象,说人话.......可迭代对象由一个个迭代器组成 可以用next()函数获取可迭代对象的数据 迭代是访问集合元素的一种方式(因为集合是无序的,所 ...

  4. python 迭代器 生成器

    1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 1.1 使用迭代 ...

  5. python 迭代器 生成器_Python迭代器和生成器

    迭代器认知 迭代器 (iterator): 如果一个对象同时有__iter__()和__next__()魔术方法的话,这个对象就可以称为是迭代器. __iter__()的作用是可以让for循环遍历.而 ...

  6. python迭代器生成器装饰器

    基本概念 学习python中有什么不懂的地方,小编这里推荐加小编的python学习群:895 817 687有任何不懂的都可以在里面交流,还有很好的视频教程pdf学习资料,大家一起学习交流! 1.容器 ...

  7. python 生成器装饰器_4.python迭代器生成器装饰器

    基本概念 1.容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元 ...

  8. python 生成器装饰器_七.python迭代器生成器装饰器

    1.迭代器 1.1 什么是可迭代对象(Iterable)? 定义:可以直接作用于for循环的对象统称为可迭代对象,即Iterable. 可迭代对象包括: 1.集合数据类型:如list.tuple.di ...

  9. python 迭代器生成器

    目录 一.可迭代对象 1.1 判断是否为可迭代对象 二.迭代器 2.1 判断对象是否是一个迭代器 2.2 手写一个迭代器 2.3 迭代器应用场景 三.生成器 3.1 生成器介绍 3.2 使用yield ...

最新文章

  1. mysql 优化器算法_SQL 查询优化器底层原理解析【MySQL 篇】
  2. 深度学习需要掌握的 13 个概率分布(附代码)
  3. 系统程序员成长计划-组合的威力
  4. 天翼云从业认证课后习题(3.1天翼云计算产品)
  5. 判断一个字符串是否全部相同
  6. Linux用户组笔记整理
  7. 智能一代云平台(三):15年上半年维护总结
  8. TIF合并Java代码
  9. 简书bug(已修复):简友圈含英文时误删空格
  10. 新疆计算机在线准考证打印,新疆2019年计算机准考证打印时间
  11. 关于svn汉化包安装无效的解决办法
  12. Babelua 调试
  13. 怎么将wmv格式转换成mp4
  14. 计算机网络---网络编程套接字(二)
  15. python中等高线填充颜色_Matplotlib:使用透明颜色填充等高线图
  16. 大数据技术之Hive(四)函数、压缩和存储
  17. [Eclipse]GEF入门系列(二、GEF概述)
  18. leetcode动态规划之零钱兑换问题
  19. 购买重疾险的十大误区(建议收藏)
  20. 【OpenGL学习】光照贴图

热门文章

  1. 紫书 程序 3-3 蛇形填数
  2. 【HDOJ】1890 Robotic Sort
  3. netstat -an中state含义
  4. centos5.5 内核升级记录
  5. hdu 1599(Floyd求最小环)
  6. Linux16.04LTS 安装Intel RealSense D435驱动
  7. 数据结构(严蔚敏)之三——顺序栈之c语言实现
  8. NYOJ 289 苹果
  9. NYOJ 71 独木舟上的旅行 贪心算法 之 乘船问题
  10. 微信小程序~自定义属性设置和获取(data-)