Python生成器总结

什么是生成器?

可以理解为一种数据类型,这种数据类型自动实现了迭代器协议,所以生成器就是一个可迭代对象。生成器可以说是提供了一种新的模式,那就是可以计算一部分,然后返回计算结果。但是保留了当前状态,下次可在另外一个地方调用它,它会继续按以前状态继续执行下去。这对于数据量很大的程序有很大的用处。总之就是很强~~

生成器总共有两种产生方式:一种是声生成器表达式,一种是生成器函数。

一、生成器表达式:

#生成器表达式和列表推导式非常相似,只要把列表推导式的【】改成()即可。
g1=(i**2 for i in range(10))
print(next(g1))  #0
print(next(g1))   #1
print(next(g1))   #4

二、生成器函数

  从格式上来说生成器函数和普通函数很相似,只有一点的区别。那就是生成器函数不需要return,而是用一个新的关键字yield。yield语句的作用主要有两点。一是返回当前语句的技术结果,二是挂起函数的状态,当下次调用时,从当前位置继续执行。

  关于生成器函数我们先来看一个简单的例子。

def g_func():
    print('first')
    yield 11111
    print('second')
    yield 22222
    print('third')
    yield 3333
g=g_func()
print(g)   #<generator object g_func at 0x0030E180>
print(next(g))  
#first
11111
print(next(g))
#second
22222
print(next(g))
#third
3333

   接着我们来看一个高级一点的。现在有这样我们想产生一个大于某个数的的所有质数。这个一看是产生的是一个无穷的数列,所以正常方法是行不通的。就算是产生一个有穷的的序列,一旦我们的序列长度很大,直接生成这对内存占用也是巨大的,但是我们的生成器就可以完美解决这个问题。我们可以产生一个生成器,需要多少取多少即可。

import math
def is_prime(n):
    for i in range(2,int(math.sqrt(n))+1):
        if n <= 1: 
              return False
        if n%i==0:
            return False
    return True


def creat_prime(n):
    while True:
        if is_prime(n):
            yield print(n)
        n+=1
g=creat_prime(10)
for i in range(100):
    next(g)

 

猜你喜欢

转载自www.cnblogs.com/linshuhui/p/8987842.html