Python Cookbook 4迭代器和生成器

本文介绍了Python中迭代器和生成器的各种高级用法,包括反向迭代、迭代器切片、跳过迭代开头部分、排列组合迭代、序列索引值迭代、同时迭代多个序列、不同集合元素迭代、创建数据处理管道、展开嵌套序列、有序迭代合并及用迭代器替代while无限循环。详细讲解了各种操作的实现方法和应用场景。
摘要由CSDN通过智能技术生成

目录

 

4.5 反向迭代

4.7 迭代器切片

4.8 跳过可迭代对象的开始部分

4.9 排列组合的迭代

4.10 序列上索引值迭代

4.11 同时迭代多个序列

4.12 不同集合上元素的迭代

4.13 创建数据处理管道

4.14 展开嵌套的序列

4.15 顺序迭代合并后的排序迭代对象

4.16 迭代器代替while无限循环


4.5 反向迭代

#1 list.reverse()

反向列表中的元素

>>> ls = [1,3,2,'b','a']
>>> ls.reverse()
>>> ls
['a', 'b', 2, 3, 1]

#2  reversed()

和 iter() 相反,对序列生成一个反向的迭代器

>>> ls
['a', 'b', 2, 3, 1]

>>> i = iter(ls)
>>> next(i)
'a'
>>> next(i)
'b'

>>> r = reversed(ls)
>>> next(r)
1
>>> next(r)
3
>>> next(r)
2

# 3. __reversed__() 

reversed() 仅当对象的大小可预先确定,或者对象实现了 __reversed__() 的特殊方法时才能生效(这样才能被映射的内置函数Reversed()调用)。 如果两者都不符合,那你必须先将对象转换为一个列表才行,如果可迭代对象元素很多的话,将其预先转换为一个列表要消耗大量的内存。

可以通过在自定义类上实现 __reversed__() 方法来实现反向迭代:
object.__reversed__(self)
此方法(如果存在)会被 reversed() 内置函数调用以实现逆向迭代。它应当返回一个新的以逆序逐个迭代容器内所有对象的迭代器对象。

如果未提供 __reversed__() 方法,则 reversed() 内置函数将回退到使用序列协议 (__len__() 和 __getitem__())。支持序列协议的对象应当仅在能够提供比 reversed() 所提供的实现更高效的实现时才提供 __reversed__() 方法。
 

4.7 迭代器切片

itertools.islice(iterablestartstop[, step])

>>> ls = [x for x in range(10)]
>>> ls
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> i = iter(ls)

#迭代器不支持直接切片
>>> i[2,5]
Traceback (most recent call last):
  File "<pyshell#107>", line 1, in <module>
    i[2,5]
TypeError: 'list_iterator' object is not subscriptable

#itertools.islice()
>>> import itertools
>>> for x in itertools.islice(i,2,5):
	print(x)

	
2
3
4

实际上 itertools.islice()第一个参数是iterable,即

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值