一、生成器

从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码。

它基于yield指令,允许停止函数并立即返回结果。
此函数保存其执行上下文,如果需要,可立即继续执行。如下:

def func():
    yield 1
    yield 2
    yield 3
    yield 4

上述代码中:func是函数称为生成器,当执行此函数func()时会得到一个迭代器。 ———说明:生成器可以迭代,见<应用>

>>> temp = func()  #这句是生成一个生成器
>>> temp.__next__() #通过__next__()获取生成器中的值
1
>>> temp.__next__()
2
>>> temp.__next__()
3
>>> temp.__next__()
4
>>> temp.__next__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

但是注意了:

>>> temp = func()  #这句是生成一个生成器
>>> temp.__next__() #通过__next__()获取生成器中的值
1
>>> temp.__next__()
2
>>> func().__next__()  #如果这样直接引用func()。就等同于再生成一个生成器。
1
>>> func().__next__()
1

在代码中:range()其实就是一个生成器,我获取一个值,它生成一个值。

那么我们又是如何去实现循环获取值的呢?

自定义生成器:

def nrange(num):
    temp = -1
    while True:
        temp = temp + 1
        if temp >= num:
            return
        else:
            yield temp

如上:nrange因为调用了yield。所以成了生成器。

二、迭代器

迭代器:简单理解就是可以循环执行的。是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。

特点:

  1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
  2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问
  3. 访问到一半时不能往回退
  4. 便于循环比较大的数据集合,节省内存
  5. 既然迭代器可循环,那么就可以直接使用for循环来对它进行循环访问

它有两个基本方法:

  1)next方法
    返回容器的下一个元素
  2)__iter__方法
    返回迭代器自身

迭代器可使用内建的iter方法创建,见例子:

>>> a = iter([1,2,3,4,5])
>>> a
<list_iterator object at 0x101402630>
>>> a.__next__()
1
>>> a.__next__()
2
>>> a.__next__()
3
>>> a.__next__()
4
>>> a.__next__()
5
>>> a.__next__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

使用for循环对其进行访问:

for i in iter("abc"):
    print(i)
"""
>>>执行结果:
a
b
c
"""

应用:

生成器生成后,通过迭代器访问。

def nrange(num):  #定义生成器
    temp = -1
    while True:
        temp = temp + 1
        if temp >= num:
            return
        else:
            yield temp

for i in nrange(3):  #访问生成器
    print(i)
"""
>>>执行结果:
0
1
2
""

 

posted on 2017-06-07 17:38  进_进  阅读(116)  评论(0)    收藏  举报