python基础之生成器迭代器

来源:互联网 发布:psd文件怎么上传到淘宝 编辑:程序博客网 时间:2024/05/15 09:09

1 生成器:

为什么要有生成器?

  就拿列表来说吧,假如我们要创建一个list,这个list要求格式为:[1,4,9,16,25,36……]这么一直持续下去,直到有了一万个元素的时候为止。如果我们要创建这个list,那么应该是这样的:

[i*i for i in range(1,10001)]     #列表生成式,不要忘了#结果就不列出来了

  这样的话,这个list会占用极多的内存,如果我们能只将算法保存在list中,那么这个list所占的内存会大大减小,等我们需要用到list的值的时候,这个list会自动运行其中的算法,将第一个值输出,再次运行时,就会自动输出第二个值,以此类推…… 这个特殊的list就被我们称之为生成器(generator)。

如何创建生成器?

  创建生成器有很多方法:

 1 第一种方法:

复制代码
#将list生成式中的‘[’换为‘(’>>> (i*i for i in range(1,10001))<generator object <genexpr> at 0x7fb0a69dc6e0>>>> g=(i*i for i in range(1,10001))#使用next()函数获取g的下一个值>>> g.next()1>>> g.next()4>>> next(g)9#当没有元素可返回的时候,会报错>>> g=(i for i in range(1,3))>>> g.next()1>>> g.next()2>>> g.next()Traceback (most recent call last):  File "<stdin>", line 1, in <module>StopIteration#实际上,我们不推荐用next()函数,较为常用的是用for循环,实际上for循环的本质就是调用了next()函数。即:首先通过iter()将可迭代的数据转换为可迭代对象,然后调用next()g=(i for i in range(1,11))for i in g:    print(i)#结果为:12345678910#这样当没有值可供返回的时候就会退出循环并不会报错。
复制代码

 2 第二种方法:

  这种方法用在函数中,比如说用函数实现杨辉三角:

复制代码
            1          1   1        1   2   1      1   3   3   1    1   4   6   4   1  1   5   10  10  5  11……………………………………………………………1
复制代码

  个人实现该函数的代码:

复制代码
def yh():    l=[1]    n=[1]    while True:        yield n          #这里有一个yield关键字!,yield就是定义generator的关键字,yield类似于return,
               #当函数运行到这里就会结束,但不同的是,当下次继续运行该函数时,就会从yield下方开始,也就是接续上次运行的地方继续运行。
l.append(0) n
=copy.copy(l) #注意这里为什么要用copy功能!!!! for i in range(len(l)): n[i]=l[i]+l[i-1] l=nimport copyn=0for i in yh(): if n==10: break print(i) n=n+1
复制代码

  这里有一个yield关键字!,yield就是定义generator的关键字,yield类似于return,当函数运行到这里就会结束,但不同的是,当下次继续运行该函数时,就会从yield下方开始,也就是接续上次运行的地方继续运行。

  另外摘抄了一个比较短小精悍的代码:

复制代码
def yh():    N = [1]    while True:        yield N        N.append(0)        N = [N[i-1] + N[i] for i in range(len(N))]…………
…………
复制代码

 2  迭代器

  迭代器有什么用途?

  生成器存储了算法,而迭代器则负责一次输出一个该算法的结果。迭代器类似于生成器(事实上,并不仅仅只是生成器)与循环的结合,只不过这个循环“很懒”,一次只输出一个值。

  迭代和迭代器的区别:

  迭代:

    几乎所有的python对象都是可迭代的,像str dict list tuple generator set……等都是可迭代的。

  判断一个对象是否可迭代:

>>> from collections import Iterable>>> isinstance([], Iterable)True

  迭代器:

    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterable

  判断一个对象是否为迭代器对象:

 

复制代码
>>> from collections import Iterator>>> isinstance((x for x in range(10)), Iterator)True>>> isinstance([], Iterator)False>>> isinstance({}, Iterator)False>>> isinstance('abc', Iterator)False
复制代码

 

 

  生成器就是一个迭代器对象,他可以被next()函数调用。而像其他类型的对象,例如list,dict……需要使用iter()函数将其转换为迭代器对象。

 

>>> isinstance(iter([]), Iterator)True>>> isinstance(iter('abc'), Iterator)True

 

 

 

本文参考了廖雪峰大神的python教程。

0 0
原创粉丝点击