函数-生成器、迭代器

#-----列表生成器-----

1 a = [x*2 for x in range(10)]
2 print(a,type(a)) #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] <class 'list'>
3 
4 def f(n):
5     return n**3
6 
7 a = [f(x) for x in range(10)]
8 print(a,type(a)) #[0, 1, 8, 27, 64, 125, 216, 343, 512, 729] <class 'list'>
#-----简单赋值方式

1 t = (12,45)
2 a,b = t
3 print(a)#12
4 print(b)#45
#----生成器(生成器就是可迭代对象)-----

 1 s = (x*2 for x in range(10))
 2 for i in s:
 3     print(i,end=" ") # 0 2 4 6 8 10 12 14 16 18
 4 
 5 #可迭代对象 :内部有iter 方法
 6 a = (1,2,3,5)
 7 a.__iter__()
 8 b = [2,3,4,5]
 9 b.__iter__()
10 c = {"a":"d","g":"r"}
11 c.__iter__()
12 e = set(a)
13 print(e,type(e))
14 e.__iter__()
#-----yield关键字生成斐波那契数列

 1 def fib(max):
 2     n,before,after = 0,0,1
 3     while n < max:
 4         yield after
 5         before,after = after,before+after
 6         n += 1
 7 
 8 g = fib(6)
 9 for i in g:
10     print(i)
#-----yield 使用

 1 def bar():
 2     print("ok1")
 3     str1 = yield 1
 4     print(str1)
 5 
 6     print("ok2")
 7     str2 = yield 2
 8     print(str2)
 9 b = bar()
10 next(b)
11 ret = b.send("ee")
12 print(ret)
#-----还可通过yield实现在单线程的情况下实现并发运算的效果

 1 import time
 2 
 3 def tourist(name):
 4     print("%s 开始吃包子" % name)
 5     while True:
 6         baozi = yield  #生成器函数(generator)
 7         print("%s吃了第%s个" % (name, baozi))
 8 
 9 def cook(name):
10     c1  = tourist("A")
11     c2 = tourist("B")
12     c1.__next__()
13     c2.__next__()
14     print("%s开始做包子了" % name)
15     for i in range(1,10):
16         time.sleep(0.2)
17         c1.send(i)
18         c2.send(i)
19 cook("dream")
View Code
#-----迭代器-----

1、有iter方法
2、有next方法
1 a = ["dream","rise","happy"]
2 d = iter(a) #<list_iterator object at 0x000001E01BFADA90>
3 print(d)
4 print(a.__iter__())#<list_iterator object at 0x00000258F8392668>

猜你喜欢

转载自www.cnblogs.com/rise-home/p/11612358.html