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)这样应该会报错吧,我没试
页: 1 [2] 3 4 5 6 7 8
查看完整版本: 提高你的 Python:解释 yield 和 Generators(生成器)