python 生成器 和 迭代器

一、生成器

  有两种方法生成迭代器

    1、把一个列表生成式的[]改成()

1 it = (x*x for x in range(10))
2 print (it) #<generator object <genexpr> at 0x02CEAF60>
3 print (next(it)) #调用生成器的内部next方法
4 print (next(it))

    2、在函数中使用yield关键字,使函数变成一个生成器。

    最简单生成器

 1 def foo():
 2     print ('t1')
 3     yield 1      # 迭代器的返回值
 4     print ('t2')
 5     yield 2      # 迭代器返回第二个值
 6 
 7 f = foo()
 8 next(f)  #在python3中调用next方法,获取生成器返回值
 9 next(f)
10 next(f) #超过迭代范围,返回StopIteration异常

   使用send方法向生成器传参数

 1 def bar():
 2     print ('test content1...')
 3     var = yield 1
 4     print ('test content2...')
 5     print (var)
 6     yield 2
 7 b = bar()
 8 print (b.send(None)) 
 9 print (b.send('test_var'))
10 # 
11 # test content1...
12 # 1 #第一次yield回来的值
13 # test content2...
14 # test_var #第二次send才能船传值,且在第一个yield时接收
15 # 2 #第二次yield回来的值。

 

 

二、 迭代器

  Python的迭代协议要求一个 __iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。

1 it = iter([1,2,3]) #使用iter()函数创建迭代器。
2 print (next(it))
3 print (next(it))
4 print (next(it))
5 print (next(it))   #迭代器的值都已经返回,再次调用就会报错StopIteration异常。

 

for循环的内部在干什么?

class Bar:

    def __init__(self, n):
        self.n = n

    def __iter__(self):
        return self

    def __next__(self):
        if self.n == 8:
            raise StopIteration('no n number!!!!')
        self.n += 1
        return (self.n)

b = Bar(4)
print (next(b))
print (next(b))
print (next(b))
print (next(b))
print (next(b))

# for i in Bar(0):
#     print (i)

 

posted @ 2018-03-24 13:56  西康的博客  阅读(141)  评论(0编辑  收藏  举报