标签:
1、迭代器
迭代器是访问数据集合的一种方式,它只能从集合的第一个元素开始顺序访问,直到最后一个元素结束。类似于linux里的cat命令,只能挨行读取文本内容,不可以跳到中间或者尾部读取(不会把所有的数据都读到内存中),对于上G的文件,比较节约内存。该迭代的好处就是它事先不需要准备好集合里的所有元素,遍历到该元素时才会计算处理该元素,这点与列表有很大的不同。
示例1:
a = iter([‘add‘,‘dfdf‘,‘dfdfd‘]) print a.next()#取第一个值 print a.next()#取第二个值 print a.next()#取第三个值# a = iter([‘add‘,‘dfdf‘,‘dfdfd‘])
迭代器关键字iter(),读取集合元素时,只能使用next()方法挨个读取,每次读取一个值,不能随机读取。
示例2:
for line in open("test.txt").readlines():
print line
和
for line in open("test.txt"): #use file iterators print line
区别:
for line in open("test.txt").readlines()方法是将整个文件读到内存,然后每行读取;
for line in open("test.txt")方法利用迭代器,每次读取一行。
2、生成器
生成器也是一种迭代器,拥有next()方法并且行为与迭代器完全相同。当一个函数中包含yield关键字时,该函数就是一个生成器函数。这里的yield相当于普通函数里的return,只不过yield返回的是一个生成器。第一次执行next()方法时,才会调用生成器函数。当该函数执行到yied语句时会中止,并以yield的参数作为此次next()方法的返回值返回。之后每次调用next()方法时,生成器函数接着上次中止的yield语句往下继续执行,直到遇到yield语句再此中止。
示例:
def Get_Number():#1#4 yield 0#5#7 yield 1#8#10 yield 2#11#12 a = Get_Number()#2 print a.next()#3 print a.next()#6 print a.next()#9
程序第一次执行到print a.next()语句时会调用Get_Number函数,该函数执行到yield 0 时会返回yield后面的参数0,并中止函数的执行。然后程序继续执行第二句print a.next(),继续调用Get_Number函数,然后执行yield 1语句返回1,然后中止函数体的执行,再继续执行第三句print a.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(10): time.sleep(1) print("做了2个包子!") c.send(i) c2.send(i) producer("ahaii")
3、装饰器
示例:
def login(func): print ‘login‘ return func#只返回func函数的内存地址,不调用func def tv(name): print ‘%s to tvpage‘ % name f = login(tv) f(‘ahaii‘)
标签:
原文地址:http://www.cnblogs.com/ahaii/p/5161229.html