当当当!写这篇随笔的时候,不出意外应该是新年过后了,再这里给大家拜个晚年咯~本期的python学习迎来了几个灰常灰常绕脑子的东西<迭代器><装饰器><递归><正则表达式>,老实说。这次的饰品看完后,感觉就是一个字:晕!两个字:很晕!
一.迭代器
迭代器和他的好基友生成器
迭代器是以iter()为使用条件的,并且只有next()一种使用的条件
names = iter([‘k1‘,‘k2‘,‘k3‘]) print(names) print(names.__next__()) 输出结果:<list_iterator object at 0x000002065E9320B8> k1
可以看到迭代是使用iter()来定义的,如果是其他的定义方式,那么在例子中的print会直接把names变量里的元素全部打印出来,但使用了iter以后,可以看到打印的其实是一个内存的地址,而要输出结果则必须使用next()方法
names = iter([‘k1‘,‘k2‘,‘k3‘]) print(names.__next__()) print(names.__next__()) 输出结果:k1 k2
可以看到,names中有3个元素,在迭代的情况下,元素的输出完全是由next方法来控制的,每一个next只能从变量中依次获取一个元素
names = iter([‘k1‘,‘k2‘,‘k3‘]) print(names.__next__()) print(names.__next__()) print(names.__next__()) print(names.__next__()) 输出结果:k1 k2 k3 print(names.__next__()) StopIteration
可以看到,names中有3个元素,当next()的方法被调用四次以后,会直接报错,告诉你迭代已经被终止了
二.生成器
生成器其实是在函数中使用了yield方法的一种迭代器
def cash_out(amount): while amount >0: amount -= 100 #return 1 print(‘钱多多 %s‘ % amount) yield 100 atm = cash_out(500) print(type(atm)) print(atm.__next__()) print(atm.__next__()) print(‘OK~‘) print(atm.__next__()) 输出结果: 钱多多 400 100 钱多多 300 100 OK~ 钱多多 200 100
这个例子是一个简单的生成器的例子,在函数中使用了yield方法,将整个函数变成了一个生成器,这样需要输出结果的时候只需要使用next方法即可,当整个函数运行到yield时,会暂停下来,等待被后续的next()方法继续调用,此时是可以执行其他的操作的,这样让整个循环的方式更加灵活
import time def consumer(name): print("%s 准备吃包子" % name) while True: baozi = yield print(‘包子 %s 来了,被 %s 吃了‘% (baozi,name)) def producer(name): c = consumer(‘A‘) c2 = consumer(‘B‘) c.__next__() c2.__next__() print(‘老子开始做包子啦‘) for i in range(3): time.sleep(1) print(‘%s 做了2个包子!‘ % name) c.send(i+1) c2.send(i+1) producer(‘Zero‘) 输出结果: A 准备吃包子 B 准备吃包子 老子开始做包子啦 Zero 做了2个包子! 包子 1 来了,被 A 吃了 包子 1 来了,被 B 吃了 Zero 做了2个包子! 包子 2 来了,被 A 吃了 包子 2 来了,被 B 吃了 Zero 做了2个包子! 包子 3 来了,被 A 吃了 包子 3 来了,被 B 吃了
这个吃包子的例子就是一个使用生成器做的异步处理的方法,这里出现了一个baozi = yield 的方法,yield 不但可以输出值,更可以接受值,而send方法则可以将需要的值输送给yield
原文:http://www.cnblogs.com/python3/p/5195112.html