moonmoonbear
发表于 2016-8-23 22:18:50
有点难度加油学习{:10_257:}
moonmoonbear
发表于 2016-8-23 22:22:23
def print_successive_primes(iterations, base=10):
prime_generator = get_primes(base)
prime_generator.send(None)
for power in range(iterations):
print(prime_generator.send(base ** power))
为什么这里算出来的是比base大的最小素数。求问
yanghuiqin
发表于 2016-8-26 10:09:06
不太明白send ()的数值是发送到get_primes里面的还是number= yield number左边的number里面的?
庚午
发表于 2016-9-19 22:23:45
看不懂,只能在找书参考一下了
疾风。意破天晴
发表于 2016-10-15 13:21:40
next(函数A(原参数)):如果第一次调用函数A的话就从头开始。之后再调用 next(函数A(原参数)) 就从yield之后开始,一直到在遇到yidle。
函数B。send(变参数):如果第一次传入none的话,第二次再调用 函数B。send(变参数) 就从 变量 = yiedl 也就是变量赋值开始。一直到再遇到yiedl
把上面代码加两步,就明白了。
注意这不是抄袭
import random
def get_data():
"""返回0到9之间的3个随机数"""
return random.sample(range(10), 3)
def consume():
"""显示每次传入的整数列表的动态平均值"""
running_sum = 0
data_items_seen = 0
while True:
print("——3——")#.send( )返回前的最后一个位置
data = yield
print("——2——") #.send( )调用后的第二个位置
data_items_seen += len(data)
running_sum += sum(data)
print('The running average is {}'.format(running_sum / float(data_items_seen)))
def produce(consumer):
"""产生序列集合,传递给消费函数(consumer)"""
while True:
data = get_data()
print('Produced {}'.format(data))
consumer.send(data)
yield
print("——1——")#next( )调用后的第一个位置
if __name__ == '__main__':
consumer = consume()
consumer.send(None)
producer = produce(consumer)
for _ in range(10):
print('Producing...')
next(producer)
运行一下一看就知道了
庚午
发表于 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):
----------------------------------------------------------------
看错了不好意思啊
莉子
发表于 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语句一致。
phoenix_zhuzhu
发表于 2016-11-28 18:29:20
太棒啦,看的虽然不太懂,但知道是什么了,还需要再多看几遍,再多看看后续相关内容,哈哈,感谢感谢,楼主辛苦了
一刀封喉
发表于 2016-11-29 10:27:02
表示后面比前面讲的清楚。
梦想绘制者
发表于 2016-12-2 22:26:29
前途是光明的,道路是曲折的,我还要继续努力啊!看起来还是蛮吃力的。
aluominhai
发表于 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)
一只菜鸟飞过来
发表于 2016-12-23 22:17:56
不错
流月飞星
发表于 2016-12-25 13:16:36
{:10_249:}
枯叶_
发表于 2016-12-25 18:13:45
学习
andylee245
发表于 2017-1-10 10:17:50
{:10_269:}{:10_269:}{:10_269:}看不太明白!
pda999
发表于 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
xiamii
发表于 2017-1-26 08:25:40
好文,学习了。
sunnychou
发表于 2017-2-22 20:09:11
有的地方还是不是太懂,就这个生成器一定要定义__next__()方法,但是当出现yield关键字是,就会自动 变为生成器,说的这个必须定义,又是在什么时候尼?不是特别明白
流月飞星
发表于 2017-2-27 11:25:56
厉害了
狼小逸
发表于 2017-2-28 18:22:53
第一段代码,素数的有隐藏的BUG,is_prime函数里面for 循环里,range出错,假如number == 3 ,就变成了 range(3, 2, 2)这样应该会报错吧,我没试