python-17

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

猜你喜欢

转载自www.cnblogs.com/neilyoung22/p/9206429.html
今日推荐