python-17,,1 # 列表生成式2
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
评论关闭