#author F
#迭代器
#列表生成式
list_build = [2*i for i in range(0, 24)] #2*i可以改成某函数
print(list_build)
# 相当于三行代码
list_man_made = []
for i in range(0, 24):
list_man_made.append(2*i)
print(list_man_made)
#生成器 : 只有在调用时候才会产生对应的数据 只记住当前的位置 只有一个__next__()方法
# cc = [2*i for i in range(0, 24000000000)]
'''
c = ( 2*i for i in range(0, 24000000000)) #c存的是内存地址,存了一个算法,并没有将整个列表生成
for i in c:
print(i)
#生成器和列表的区别是:调用时候才有数据 不调用则没有数据 加快了运行时间
print(c.__next__())
'''
#斐波那契数列
#1,1,2,3,5,8,13,21,...
def fib(max):
n, a, b = 0, 0, 1
while n<max:
print(b)
a, b=b, a+b
n = n+1
return 'done'
##赋值语句 a,b=b,a+b 赋值过程
# t = (b, a+b) #t是一个tuple
# a=t[0]
# b=t[1]
fib(100)
def fib1(max):
n, a, b = 0, 0, 1
while n<max:
yield b
a, b=b, a+b
n = n+1
return 'done' #用for循环done不会打印
print(fib1(10))
f = fib1(10)
print(f.__next__())
print(f.__next__())
print("干点别的事去")
print(f.__next__())
print(f.__next__())
print("==start==")
for i in f:
print(i)
##函数有yield存在就回变成一个生成器 return的值用异常抓取
def fib2(max): #这个已经不是函数了 只要有yield存在 就不是函数了
n, a, b = 0, 0, 1
while n<max:
yield b
a, b = b, a+b
n = n+1
return "done" #可以用来抛出异常
g = fib2(6)
while True:
try:
x = next(g)
print("g:",x)
except StopIteration as e:
print("Generator return value:", e.value)
break
Python生成器
最新推荐文章于 2022-10-08 16:45:57 发布