深入理解迭代器和生成器

对于生成器来说,最大的作用可能是对于内存的节省,因为每次调用next()函数才会去取一次数据,直到抛出StopIteration异常。但这并不是本次笔记的重点,本次笔记的重点在于一定要牢记每次调用生成器之后,都会消耗生成器中的值

1
2
3
4
5
>>> a = (i for i in range(3))
>>> next(a)
0
>>> list(a)
[1, 2]

对于经常使用的(i in a)来说,其实它底层调用的还是生成器原理

1
2
3
4
while True:
val = next(a)
if val == i:
yield True

所以,先看以下示例

1
2
3
4
5
6
7
8
9
10
11
b = (i for i in range(5))

print(2 in b)
print(4 in b)
print(3 in b)

########## 输出 ##########

True
True
False

原因在于每次使用print函数时,都会消耗掉b中的值,而每次使用in函数时,比如2 in b就会消耗掉0, 1, 2这三个值,剩下3, 4这两个值,而4 in b时,其中存在4,就返回为True,此时b中已消耗完所有元素,在此调用就会失败。

在看一个leetcode示例,给定字符串 st ,判断 s 是否为 t 的子序列。

1
2
3
4
5
6
7
8
9
10
11
def is_subsequence(a, b):
b = iter(b)
return all(i in b for i in a)

print(is_subsequence([1, 3, 5], [1, 2, 3, 4, 5]))
print(is_subsequence([1, 4, 3], [1, 2, 3, 4, 5]))

########## 输出 ##########

True
False
-------------本文结束感谢您的阅读-------------