python-17
Posted neilyoung22
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于python-17的主要内容,如果未能解决你的问题,请参考以下文章