1. 生成器
squares = [i**2 for i in range(10000)]
for i in squares:
pass
把所有元素都存在列表里,占用了大量内存,而实际上每次只用到列表中的一个元素。
生成器:
1.惰性计算
2.边执行边计算,无需一次性存入大量数据
3.实际上一直在执行next(操作),直到无值可取
1.1 生成器表达式 (…)
圆括号
squares = (i**2 for i in range(100000))
for i in squares:
pass
【例】求0-500的和
sum((i for i in range(501)))
## 5050
1.2 生成器函数 yield
【例】 生成斐波那契数列
1.数组迭代和存储
2.若有中间操作,每次只用到其中一个元素,比如每次只打印一个数字(不需要一次性使用全部元素),可以把这个中间操作放在循环里面执行
3.这种情况也可以构造生成器函数,方便单独进行中间操作,把print换成yield即可
当我们调用这个函数fib(),它首先会顺序执行,当执行到yield时停止,yield就会返回yield后面跟着的那个元素,相当于 return 的功能,所不同的是,执行完返回之后仍然会停在这里,直到我们执行下一次的操作 next(),继续执行剩余操作,并返回到while判断语句,符合条件则执行 yield,再次返回,并停留在这里,等待下一次操作 next()…
总结:在每次调用 next() 的时候执行,遇到 yield 语句则返回(相应元素),再次执行时从上次返回的 yield 语句处继续执行
1.3 调用生成器 next() / send()
2. 迭代器
2.1 可迭代对象 - 可以for循环
可直接作用于for循环的对象,统称为可迭代对象: Iterable
- 列表,元组,字典,集合,字符串,文件
- 生成器
1.可用 isinstance( .., Iterable)
判断可迭代对象
from collections import Iterable
isinstance([1,2,3], Iterable)
# True
isinstance("python", Iterable)
# True
2.迭代器还能被 next()
函数调用
比如生成器不仅可用于 for
循环,还可以被 next()
函数调用,直到没有数据可取,抛出 StopIteration
(生成器不仅是可迭代对象,还是迭代器)
squares = (i**2 for i