04. python 生成器&迭代器
生成器&迭代器
1. 常用函数
1.1 enumerate函数
a = [1, 2, 3, 4]
for index, item in enumerate(a): # idex是下标
print(index, item)
a[index] += 1
print(a)
1.2 map+lambda函数
a = [1, 2, 3, 4]
a = map(lambda x:x+1, a)
for i in a:
print(i)
1.3 列表生成式
a = [1, 2, 3, 4]
a = [i+1 for i in a]
print(a)
2. 生成器
2.1 迭代器与生成器的区别
注意:列表生成式是[], 生成器是()
# 生成器(一边生成,一边计算)
# generator
L = [x*x for x in range(10)] # 列表生成式
print(L)
# 这就是一个生成器
g = (x*x for x in range(10)) # <generator object <genexpr> at 0x000001D14DECDD48>
print(g)
#
# 访问生成器
for i in g: # 一直next(g),会一个一个出答案,直到没有结果抛出异常(stoplteration),自动跳出循环
print(i)
2.2 斐波那契数列
# Fibonacci 斐波那契数列
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a+b
n += 1
return "done"
fib(8)
2.3 迭代器编写斐波那契
注意:可以执行函数时去执行其他的代码
# generator
def fib(max):
n, a, b = 0, 0, 1
while n < max:
# print(b)
yield b # 遇到yield就会终中断,再次调用next()时,继续执行上次的代码
a, b = b, a+b
n += 1
return "done"
g = fib(10)
# print(g) # <generator object fib at 0x000001C43CDE74C8>
# 执行流程:每次调用next()的时候执行,遇到yield语句返回,再次被next()调用next()调用时从上次返回yield语句处继续执行
print(g.__next__())
print(g.__next__())
print("执行其它的")
print(g.__next__())
print(g.__next__())
'''
out :
# 1
# 1
# 执行其它的
# 2
# 3
'''
2.4 获取生成器返回值
def fib(max):
n, a, b = 0, 0, 1
while n < max:
# print(b)
yield b # 遇到yield就会终中断,再次调用next()时,继续执行上次的代码
a, b = b, a+b
n += 1
return "done"
# for n in fib(6):
# print(n) # 发现没有return值
# 如果想拿到返回值,就要捕获错误
g = fib(6)
while True:
try:
x = next(g)
print(x)
except StopIteration as e:
print(e.value)
break
3. 迭代器
3.1 迭代器介绍
"""
可以作用于for循环的:
1. list, tuple, dict, set, str
2. generator, generator function
这些都叫 可迭代对象:iterable
"""
# 所有可以被next()函数调用并且不断返回下一个值的对象叫 迭代器:Iterator
3.2 迭代器代码
注意: iter()创建迭代器, next()输出迭代器的下一个元素
3.2.1
import sys # 引入 sys 模块
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
while True:
try:
print (next(it))
except StopIteration:
sys.exit()
3.2.2
注意:魔法方法 iter() 返回自身,next() 决定迭代的规则
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)
3.2.3
class Fibs:
def __init__(self, n=10):
self.a = 0
self.b = 1
self.n = n
def __iter__(self):
return self
def __next__(self):
self.a, self.b = self.b, self.a + self.b
if self.a > self.n:
raise StopIteration
return self.a
fibs = Fibs()
for each in fibs:
print(each)
#第一次a = 0 b = 1
#当运行到next时先执行b的值给a,故a = 1 此时b = a+b =1
#第二次因赋值语句在前,a得到的是第一次运行时候a+b的值,所以a = 1
再坚持一下下,会越来越优秀

浙公网安备 33010602011771号