python-17,,1 # 列表生成式2


1 # 列表生成式2 a = [x*2 for x in range(10)]        # 这两个变量必须一致3 print(a)4 5 #列表 元组的高级赋值办法6 b,c = ["123",6]7 print(b)    #1238 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 520 21 #生成器中值的遍历next()方法22 #生成器可以当成迭代器去使用for方法迭代 for i in a: next(i)23 a = test()24 #next(a)     #这样会执行yield关键字前面的语句,返回值为yield后面跟的值---ok25 #next(a)     #执行第二遍的时候,指针会跳到yield 2 这里 开始往下执行 后面依次这样,直到遇到return 就没有可迭代的对象了-ok226 #next(a)     #没有可迭代的对象会报错!27 28 for u in a:29     # print(u)          #ok 2 ok2 530     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,142     while n < max:43         print(b)44         a,b = b,a+b45         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+b11 #         n = n+112 #***************************13 14 def fib(max):15     n,a,b  =0,0,116     while n < max:17         yield b18         a,b = b,a+b19         n = n+120 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带参数的值赋值给变量count14 # 此时 执行print(count)之后会打印出 send传入的值15 # 但是 在执行第二个 yield之后,第二个yield的返回值会再次赋值给 count    所以导致16 # print(x.send("eeee"))  # 值为217 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 string13 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

python-17

评论关闭