码迷,mamicode.com
首页 > 编程语言 > 详细

Python生成器总结

时间:2018-05-05 00:25:32      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:prim   while   print   +=   SQ   区别   推导   长度   class   

什么是生成器?

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

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

一、生成器表达式:

#生成器表达式和列表推导式非常相似,只要把列表推导式的【】改成()即可。
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)

 

 

Python生成器总结

标签:prim   while   print   +=   SQ   区别   推导   长度   class   

原文地址:https://www.cnblogs.com/linshuhui/p/8987842.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!