列表生成式
a = [x*2 for x in range(10)]
a = [x*2 for x in a]
def f(n):return n+1
a = [f(x) for x in range(10)]
print(a) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
列表生成器
s = (x*2 for x in range(5))
print(s) #<generator object <genexpr>
print(next(s) )# 尽量不用s._next_()
for i in s: print(i)
yield
def foo():
print("123")
yield 1
a = foo()
print(a) #<generator object <genexpr>
#next首先指向print,之后返回yield 1
#不过没有变量接受,屏幕不显示
next(foo())
next(foo())
---------------------------
def foo():
print('ok')
yield 1
print('ok2')
yield 2
for i in foo():
print(i)
结果:ok
1
ok2
2
for i in +可迭代对象(列表,元组,字典,)
本质因为内部有_iter_()方法
斐波那契:
普通函数
def fid(number):
n,before,after = 0,0,1
while n<number:
print(before)
after,before = before,after+before#算出=后面结果再赋值
n+=1
fid(5)
生成器对象--next
def fid(number):
n,before,after = 0,0,1
while n<number:
yield before
after,before = before,after+before
n+=1
g = fid(8)
print(next(g))
for i in fid(8):
print(i)
send
def bar():
print('ok1')
count=yield 1
print(count)
print('ok2')
yield 2
g = bar()# 创建生成器对象
print(g.send(None))
print(g.send('eee'))
# 结果:ok1
# 1
# eee
# ok2
# 2
# send与next的区别就是,send能给yield前面变量传值
# b.send(None)==next(b)