首页 > 编程语言 > 详细

python-day4

时间:2016-02-17 14:37:00      阅读:183      评论:0      收藏:0      [点我收藏+]

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

 

python-day4

原文:http://www.cnblogs.com/python3/p/5195112.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!