|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 大头目 于 2018-4-17 11:40 编辑
关于小甲鱼Python扩展阅读中的yield,折腾了半天,想和大家分享一下现阶段的理解。20180214
20180417理解更新如下:
- def consumer():
- r = ''
- while True:
- n = yield r #这里可以理解为两部分:n接受c.send(n)中n的值;到下一轮反馈r到c.send(n)的结果
- print(n,11111)
- if not n:
- return
- print('[CONSUMER] Consuming %s...' % n)
- r = '200 OK'
- def produce(c):
- c.send(None)
- n = 0
- while n < 5:
- n = n + 1
- print('[PRODUCER] Producing %s...' % n)
- rtest = c.send(n)
- print('[PRODUCER] Consumer return: %s' % rtest)
- c.close()
- c = consumer()
- produce(c)
复制代码
- import math
- def get_primes(number):
- while True:
- if is_prime(number):
- number = yield number #分为两部分理解:number接受send()中的值继续执行下面程序;yield在一轮走完后挂起,并反馈值到.send()的结果
- print('刚接手的number为%s' % number)
- print('叠加中的number为%s' % number)
- number += 1
-
- 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 print_successive_primes(iterations, base=10):
- #像普通函数一样,生成器函数可以接受一个参数
- prime_generator = get_primes(base)
-
- #pos2#下面这句很关键,生成器第一个send必须是None,这里等于需要先用None走一遍number = yield number的定义
- prime_generator.send(None)
-
- for power in range(iterations):
-
- #pos3#下面这句很关键,从power = 0开始向get_primes()发送参数,并反馈prime_generator中yield的反馈值作为下一次send中的base
- print(base,power)
- print(prime_generator.send(base + power))
- a = print_successive_primes(10,40)
复制代码 |
|