鱼C论坛

 找回密码
 立即注册
查看: 1791|回复: 5

Python小白从挖坑到脱坑之路004_关于yield

[复制链接]
发表于 2018-2-14 12:48:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 大头目 于 2018-4-17 11:40 编辑

关于小甲鱼Python扩展阅读中的yield,折腾了半天,想和大家分享一下现阶段的理解。20180214
20180417理解更新如下:
  1. def consumer():
  2.     r = ''
  3.     while True:
  4.         n = yield r     #这里可以理解为两部分:n接受c.send(n)中n的值;到下一轮反馈r到c.send(n)的结果
  5.         print(n,11111)
  6.         if not n:
  7.             return
  8.         print('[CONSUMER] Consuming %s...' % n)
  9.         r = '200 OK'

  10. def produce(c):
  11.     c.send(None)
  12.     n = 0
  13.     while n < 5:
  14.         n = n + 1
  15.         print('[PRODUCER] Producing %s...' % n)
  16.         rtest = c.send(n)
  17.         print('[PRODUCER] Consumer return: %s' % rtest)
  18.     c.close()

  19. c = consumer()
  20. produce(c)
复制代码

  1. import math
  2. def get_primes(number):
  3.     while True:
  4.         if is_prime(number):
  5.             number = yield number        #分为两部分理解:number接受send()中的值继续执行下面程序;yield在一轮走完后挂起,并反馈值到.send()的结果
  6.             print('刚接手的number为%s' % number)
  7.         print('叠加中的number为%s' % number)
  8.         number += 1
  9.         
  10. def is_prime(number):
  11.     if number > 1:
  12.         if number == 2:
  13.             return True
  14.         if number % 2 == 0:
  15.             return False
  16.         for current in range(3, int(math.sqrt(number) + 1), 2):
  17.             if number % current == 0:
  18.                 return False
  19.         return True
  20.     return False

  21. def print_successive_primes(iterations, base=10):
  22.     #像普通函数一样,生成器函数可以接受一个参数
  23.     prime_generator = get_primes(base)
  24.    
  25. #pos2#下面这句很关键,生成器第一个send必须是None,这里等于需要先用None走一遍number = yield number的定义
  26.     prime_generator.send(None)
  27.    
  28.     for power in range(iterations):
  29.                
  30. #pos3#下面这句很关键,从power = 0开始向get_primes()发送参数,并反馈prime_generator中yield的反馈值作为下一次send中的base
  31.         print(base,power)
  32.         print(prime_generator.send(base + power))


  33. a = print_successive_primes(10,40)
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-2-14 20:23:57 From FishC Mobile | 显示全部楼层
大佬都在吃年夜饭吗?新年旺旺!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-17 10:09:04 From FishC Mobile | 显示全部楼层
大佬们都在过年相亲吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-21 21:49:33 | 显示全部楼层
大佬们明天要上班了!记得调好闹钟!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-26 15:31:23 | 显示全部楼层
木有大佬指导吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-17 11:41:13 | 显示全部楼层
找到个简单的例子深化理解了一下,望大佬指正
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-28 00:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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