1 # 列表生成式 2 a = [x*2 for x in range(10)] # 这两个变量必须一致 3 print(a) 4 5 #列表 元组的高级赋值办法 6 b,c = ["123",6] 7 print(b) #123 8 print(c) #6
1 # python的垃圾回收机制
2 #给变量赋值的时候值的内存地址被变量引用
3 #如果值的内存地址没有被任何对象引用的话,python就将该内存进行回收释放
4
5 #生成器额2种创建方式
6
7 #生成器的创建方式一:
8 a = (x*2 for x in range(10))
9 #print(a) <generator object <genexpr> at 0x0000000001DEA1B0> 目前没有任何值,只是个迭代器
10
11 #生成器的创建方式二:
12 #在函数内部使用yield关键字创建生成器
13 #函数本身不是生成器,但是函数的执行就是生成器 如 test() 就是个生成器
14
15 def test():
16 print("ok")
17 yield 2 #yield后面的值相当于返回值
18 print("ok2")
19 yield 5
20
21 #生成器中值的遍历next()方法
22 #生成器可以当成迭代器去使用for方法迭代 for i in a: next(i)
23 a = test()
24 #next(a) #这样会执行yield关键字前面的语句,返回值为yield后面跟的值---ok
25 #next(a) #执行第二遍的时候,指针会跳到yield 2 这里 开始往下执行 后面依次这样,直到遇到return 就没有可迭代的对象了-ok2
26 #next(a) #没有可迭代的对象会报错!
27
28 for u in a:
29 # print(u) #ok 2 ok2 5
30 print(next(a)) #ok ok2 5 为什么会这样呢?
31
32 # 生成器的值只能按照顺序一个一个去取,不能随机去取
33 # 在pyhton 2.0 版本中,使用的变量方式是__next__()
34
35 #什么是可迭代对象呢?
36 #对象的内部有__iter__ 方法的都是可迭代对象
37
38 #斐波那契函数的实现函数
39 # 考察你变量的赋值
40 def fib(max):
41 n,a,b =0,0,1
42 while n < max:
43 print(b)
44 a,b = b,a+b
45 n = n+1
1 # 如何将一个菲薄纳妾函数转化成一个生成器呢? 2 # 思路 就是把print的输出地方转化为 yield + 输出值 3 4 5 #肥波纳妾函数 用生成器的实现 6 # def fib(max): 7 # n,a,b =0,0,1 8 # while n < max: 9 # print(b) 10 # a,b = b,a+b 11 # n = n+1 12 #*************************** 13 14 def fib(max): 15 n,a,b =0,0,1 16 while n < max: 17 yield b 18 a,b = b,a+b 19 n = n+1 20 21 x = fib(10) #生成器产生 22 #实现方式一: 23 for i in x: 24 print(i) 25 #实现方式二: 26 print(next(x)) 27 print(next(x)) 28 print(next(x)) 29 print(next(x)) 30 print(next(x)) 31 print(next(x)) 32 print(next(x)) 33 print(next(x)) 34 print(next(x)) 35 print(next(x))
1 #生成器 之 send() 方法
2
3 def test():
4 print("OK1") #OK1
5 count =yield 1 #eee
6 print(count) #OK
7 print("OK") #4
8 yield 4 # 4 作为x.send("eee")的返回值
9
10 x = test() #生成 生成器对象
11 # x.send("eee") #首次使用会报错!
12 # #send()方法首次使用传入参数会报错
13 # 原因:send穿参数值的前提是需要 在yield 返回1这个值后 也就是在yiled执行之后,才能执行send带参数的值赋值给变量count
14 # 此时 执行print(count)之后会打印出 send传入的值
15 # 但是 在执行第二个 yield之后,第二个yield的返回值会再次赋值给 count 所以导致
16 # print(x.send("eeee")) # 值为2
17
18 # 接下来进行测试;
19 x.send(None) #这样执行相当于 next(x)
20 q = x.send("eee")
21 print(q) #执行的结果为 2
1 #使用生成器实现伪并发 yield
2 #通过yield实现在单线程的情况下实现并发运算的效果
3 import time
4 def consumer(name):
5 print("%s 准备吃包子啦!" %name)
6 while True:
7 baozi = yield
8
9 print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
10
11 def producer(name):
12 c = consumer('A')
13 c2 = consumer('B')
14 c.__next__()
15 c2.__next__()
16 print("老子开始准备做包子啦!")
17 for i in range(10):
18 time.sleep(1)
19 print("做了2个包子!")
20 c.send(i)
21 c2.send(i)
22
23 producer("alex")
24
25 # 首先理清楚思路
1 # 迭代器 2 # 生成器一定是迭代器 迭代器不一定是生成器 3 # 迭代器的调用方法 该方法返回一个迭代器对象 4 x = [1,23,4,2,8] 5 x.__iter__() #方式一 6 iter(x) #方式二 python3 内置方法调用 7 8 # 什么事迭代器? 9 #条件一:有iter()方法 10 #条件二:有next()方法 11 # 哪些是可迭代对象呢? 12 # list tuple,dict string 13 14 #判断一个对象是否为可迭代对象的方法 使用 15 l= [1,2] 16 print(isinstance(l,list)) #判断[1,2] 是否为list对象 17 print(isinstance(l,Iterable)) #判断是否为可迭代对象 18 print(isinstance(l,Iterator)) #判断该对象是否为迭代器 19 20 # for 循环所做的三件事 21 # 1.调用可迭代对象的iter()方法 返回一个迭代器或者迭代对象 22 # 2.调用迭代器的next()方法进行数据的提取 23 # 3.处理迭代器的异常,比如超过迭代器的处理元素该怎么处理
参考链接:
http://www.cnblogs.com/yuanchenqi/articles/5769491.html
http://www.cnblogs.com/alex3714/articles/5765046.html
来源:https://www.cnblogs.com/neilyoung22/p/9206429.html