【python进阶】生成器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_36372879/article/details/86378411

参考链接:https://eastlakeside.gitbooks.io/interpy-zh/content/Generators/Iterable.html
Python中任意的对象,只要它定义了可以返回一个迭代器的__iter__方法,或者定义了可以支持下标索引的__getitem__方法(这些双下划线方法会在其他章节中全面解释),那么它就是一个可迭代对象。简单说,可迭代对象就是能提供迭代器的任意对象。

许多Python 2里的标准库函数都会返回列表,而Python 3都修改成了返回生成器,因为生成器占用更少的资源。
生成器也是一种迭代器

xrange和range的区别

xrange返回的就是一个生成器
要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间,这两个基本上都是在循环的时候用:
在python3里面,xrange已经被并到了range
也就是你打印range的类型,已经是一个生成器了。

print(range(5))
print(list(range(5)))
print(type(range(5)))
a = range(5)
print(a[0])

在这里插入图片描述
python3都修改返回成了生成器了

python yield

参考链接:https://www.jianshu.com/p/d09778f4e055

  1. 通常的for…in…循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件。它可以是mylist = [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。
    它的缺陷是所有数据都在内存中,如果有海量数据的话将会非常耗内存。
  2. 生成器是可以迭代的,但只可以读取它一次。因为用的时候才生成。比如 mygenerator = (x*x for x in range(3)),注意这里用到了(),它就不是数组,而上面的例子是[]。
  3. 我理解的生成器(generator)能够迭代的关键是它有一个next()方法,工作原理就是通过重复调用next()方法,直到捕获一个异常。可以用上面的mygenerator测试。
  4. 带有 yield 的函数不再是一个普通函数,而是一个生成器generator,可用于迭代,工作原理同上。
  5. yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码(下一行)开始执行。
  6. 简要理解:yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始。
def yield_test(n):
    for i in range(n):
        yield call(i)
        print("生成器里面的数:",i)
        # 做一些其它的事情
    print("do something.")
    print("end.")

def call(i):
    return i * 2


for i in yield_test(5):
    print('yield相当于return:', i)

可以看到输出为:
在这里插入图片描述

计算斐波拉契数列的生成器

def fibon(n):
    a = b = 1
    for i in range(n):
        yield a
        a, b = b, a + b

函数的使用方法:

for x in fibon(100):
    print(x)    #这里的x是yield返回的值,然后继续执行生成器的下一句

这样不用担心使用大量的资源

测试生成器内部next函数

def generator_function():
    for i in range(3):
        yield i

gen = generator_function()
print(next(gen))
# Output: 0
print(next(gen))
# Output: 1
print(next(gen))
# Output: 2
print(next(gen))

可以看到最后输出了异常,停止迭代
在这里插入图片描述

iter迭代器

my_string = "Yasoob"
next(my_string)

python会报错:不是一个迭代器
在这里插入图片描述

my_string = "Yasoob"
my_iter = iter(my_string)
print(next(my_iter))

可以看到会输出Y

猜你喜欢

转载自blog.csdn.net/weixin_36372879/article/details/86378411