码迷,mamicode.com
首页 > 编程语言 > 详细

Python求索之路3——迭代器、装饰器、生成器、正则

时间:2016-01-26 20:22:09      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

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")
View Code

 

3、装饰器

示例:

def login(func):
    print login
    return func#只返回func函数的内存地址,不调用func

def tv(name):
    print %s to tvpage % name

f = login(tv)
f(ahaii)

 

Python求索之路3——迭代器、装饰器、生成器、正则

标签:

原文地址:http://www.cnblogs.com/ahaii/p/5161229.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!