当当当!写这篇随笔的时候,不出意外应该是新年过后了,再这里给大家拜个晚年咯~本期的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