鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

[扩展阅读] 提高你的 Python:解释 yield 和 Generators(生成器)

  [复制链接]
发表于 2016-8-23 22:18:50 | 显示全部楼层
有点难度  加油学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-23 22:22:23 | 显示全部楼层
  1. def print_successive_primes(iterations, base=10):
  2.     prime_generator = get_primes(base)
  3.     prime_generator.send(None)
  4.     for power in range(iterations):
  5.         print(prime_generator.send(base ** power))
复制代码

为什么这里算出来的是比base大的最小素数。求问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-26 10:09:06 | 显示全部楼层
不太明白send ()的数值是发送到get_primes里面的还是number= yield number左边的number里面的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-19 22:23:45 | 显示全部楼层
看不懂,只能在找书参考一下了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-15 13:21:40 | 显示全部楼层
next(函数A(原参数)):如果第一次调用函数A的话就从头开始。之后再调用 next(函数A(原参数)) 就从yield之后开始,一直到在遇到yidle。
函数B。send(变参数):如果第一次传入none的话,第二次再调用 函数B。send(变参数) 就从 变量 = yiedl 也就是变量赋值开始。一直到再遇到yiedl

把上面代码加两步,就明白了。
注意这不是抄袭
  1. import random

  2. def get_data():
  3.     """返回0到9之间的3个随机数"""
  4.     return random.sample(range(10), 3)

  5. def consume():
  6.     """显示每次传入的整数列表的动态平均值"""
  7.     running_sum = 0
  8.     data_items_seen = 0

  9.     while True:
  10.         print("——3——")  #.send( )返回前的最后一个位置
  11.         data = yield
  12.         print("——2——")   #.send( )调用后的第二个位置
  13.         data_items_seen += len(data)
  14.         running_sum += sum(data)
  15.         print('The running average is {}'.format(running_sum / float(data_items_seen)))

  16. def produce(consumer):
  17.     """产生序列集合,传递给消费函数(consumer)"""
  18.     while True:
  19.         data = get_data()
  20.         print('Produced {}'.format(data))
  21.         consumer.send(data)
  22.         yield
  23.         print("——1——")  #next( )调用后的第一个位置

  24. if __name__ == '__main__':
  25.     consumer = consume()
  26.     consumer.send(None)
  27.     producer = produce(consumer)

  28.     for _ in range(10):
  29.         print('Producing...')
  30.         next(producer)
复制代码

运行一下一看就知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-11-2 22:15:07 | 显示全部楼层
本帖最后由 庚午 于 2016-11-3 19:56 编辑

for current in range(3, int(math.sqrt(number) + 1), 2):

range的步长是不是应该-1

for current in range(3, int(math.sqrt(number) + 1), -1):
   ----------------------------------------------------------------
看错了不好意思啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-15 23:09:01 | 显示全部楼层
yield语句有点像return语句,代码执行到yield语句,generator函数的执行就会终止,并且会返回yield语句中的表达式的值给 Generator对象,这跟return语句一样,不同的是,这返回值只是作为遍历Generator对象的当前元素,而不能赋值给其他变量。
当对Generator对象继续迭代,generator函数中的yield后面的代码会继续执行,直到generator函数中的yield语句全部执 行完毕,或者是碰到generator函数中的空return语句(返回null的return语句),在generator函数中使用带有非null返 回值的return语句会报编译错误。
如果yield后面没有任何表达式(变量、常量都是表达式),那么它会返回NULL,这一点跟return语句一致。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-28 18:29:20 | 显示全部楼层
太棒啦,看的虽然不太懂,但知道是什么了,还需要再多看几遍,再多看看后续相关内容,哈哈,感谢感谢,楼主辛苦了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-29 10:27:02 | 显示全部楼层
表示后面比前面讲的清楚。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-2 22:26:29 | 显示全部楼层
前途是光明的,道路是曲折的,我还要继续努力啊!看起来还是蛮吃力的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-17 10:42:49 | 显示全部楼层
consume.send(data)..这里的 send 这个函数实在没看懂。我改了一下。也能运行,不知道对不对。

import random as r

def get_data():
    return r.sample(range(10),3)

def consume(w):
    running_sun=0
    data_items_seen=0

    while True:
        data = w
        running_sun+=sum(data)
        data_items_seen+=len(data)
        print('我是动态平均值:{}'.format(running_sun/float(data_items_seen)))
        break

def produce():
    while True:
        data = get_data()
        print('我是3个随机数:{}'.format(data))
        consume(data)
        yield
        
po = produce()
for i in range(10):
    next(po)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-23 22:17:56 | 显示全部楼层
不错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-25 13:16:36 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-25 18:13:45 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-10 10:17:50 | 显示全部楼层
看不太明白!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-23 12:36:55 | 显示全部楼层
#扩展阅读:解释yield和Generors
#以下标了condition 1和condition 2,均可自主实现指定功能,唯一不明的是
#为什么如果不是“number=yield number  ”,而是“yield number”,
#send就不会起到应有的作用?
def isPrime(Num):
        if Num==1:
                return False
        elif Num==2:
                return True
        else:               
                for i in range(2, Num//2+1):
                        if Num%i==0:
                                return False
        return True
                        
def getPrime(number):
        while True:
                if isPrime(number):
                      yield number                #condition 1
##                      number=yield number         #condition 2            
                number+=1

def printSuccessivePrime(iterations, base=10):
        primeGenerator=getPrime(base)  #condition 2
        primeGenerator.send(None)  #condition 2
        for power in range(iterations):
##                print(next(getPrime(base**power)))  #condition 1
                print(primeGenerator.send(base**power))  #condition 2

#注,当getPrime()处于condition 1,有以下:
>>> a=getPrime(100)
>>> a.send(None)
101
>>> a.send(1000)
103
>>> a.send(10000)
107
>>> a.send(100000)
109
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-26 08:25:40 | 显示全部楼层
好文,学习了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-22 20:09:11 | 显示全部楼层
有的地方还是不是太懂,就这个生成器一定要定义__next__()方法,但是当出现yield关键字是,就会自动 变为生成器,说的这个必须定义,又是在什么时候尼?不是特别明白 小甲鱼.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-27 11:25:56 | 显示全部楼层
厉害了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-28 18:22:53 | 显示全部楼层
第一段代码,素数的有隐藏的BUG,is_prime函数里面for 循环里,range出错,假如number == 3 ,就变成了 range(3, 2, 2)这样应该会报错吧,我没试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 00:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表