一个生成器函数的定义很像一个普通的函数,除了当它要生成一个值的时候,使用yield关键字而不是return。如果一个def的主体包含yield,这个函数会自动变成一个生成器(即使它包含一个return)。除了以上内容,创建一个生成器没有什么多余步骤了。

  生成器函数返回生成器的迭代器。这可能是你最后一次见到“生成器的迭代器”这个术语了, 因为它们通常就被称作“生成器”。要注意的是生成器就是一类特殊的迭代器。作为一个迭代器,生成器必须要定义一些方法(method),其中一个就是__next__()。如同迭代器一样,我们可以使用next()函数来获取下一个值。

  为了从生成器获取下一个值,我们使用next()函数,就像对付迭代器一样。

  yield就是专门给生成器用的return。

   这里有个名词叫“协同程序”,这个就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始,Python是通过生成器来实现类似协同程序的概念,生成器可以暂时挂起函数,并保留函数的局部变量等数据,然后在再次调用它的时候,从上次暂停的位置继续执行下去。

这里说一下列表、字典、集合的推导式

  • 列表推导式:

  • 字典推导式:(注意有“:”)

  • 集合推导式:(无:号)

  • 生成器推导式:(圆括号括起来的就是)

 

生成器推导式如果作为函数的参数就不需要加()也可以。看下面实例:

上面的情况加不加括号都可以

题目:10以内的素数之和是:2+3+5+7 = 17 ,呢么请编写程序,计算200000以内的素数之和?

结果是:142913828922

代码如下:

import math

def is_prime(number):
    if   number  > 1:
        if number == 2:
            return True
        if number % 2 == 0:
            return False
        for current in range(3, int(math.sqrt(number) + 1), 2):
            if number % current == 0:
                return False
        return True
    return False 

def get_primes(number):
    while True:
        if is_prime(number):
            yield number
        number += 1

def solve():
    total = 2
    for next_prime in get_primes(3):
        if next_prime < 2000000:
            total += next_prime
        else:
            print(total)
            return

if __name__ == '__main__':
    solve()
posted on 2018-01-10 21:14  ~泪小白~  阅读(309)  评论(0编辑  收藏  举报