首页 文章

使用send in python这两个函数有什么不同[关闭]

提问于
浏览
-3

我在python中学习生成器,这里的函数:

import math
def is_primes(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 get_primes1(number):
    while True:
        if is_primes(number):
            yield number
        number +=1

def get_primes2(number):
    while True:
        if is_primes(number):
            number=yield number
        number +=1

使用发送功能时:

a=get_primes1(2)
b=get_primes2(2)
a.send(None)#return 2
b.send(None)#return 2
a.send(1)#return 3,the parameter in send() looks useless.
b.send(1)#return 1,normal

当重复使用“a.send(1)”和“b.send(1)”时,a.send(1)返回较大的值,但b.send(1)仍然返回相同的值 . 为什么有区别?

我检查发送功能的含义:

恢复执行并向发送器函数“发送”一个值 . value参数成为当前yieldexpression的结果 . send()方法返回生成器产生的下一个值,如果生成器退出而不产生另一个值,则引发StopIteration . 当调用send()来启动生成器时,必须使用None作为参数调用它,因为没有可以接收该值的yield表达式 .

1 回答

  • 2

    发送功能如何在发电机中工作?

    def counter():
        total = 0
    
        while True:
            increment = yield total  #If next() was called, 
                                     #increment is assigned None. 
                                     #If send() was called,
                                     #increment is assigned send()'s argument.
    
            if increment:
                total += increment
            else:
                total += 1
    
    
    g = counter()
    print(next(g))
    print(next(g))
    print(g.send(3))
    print(next(g))
    
    --output:--
    0
    1
    4
    5
    

    每当通过正常的next()调用恢复生成器时,yield表达式的值为None .


    generate()方法,用于生成器迭代器,它恢复生成器并“发送”一个值,该值成为当前yield-expression的结果 . send()方法返回生成器产生的下一个值

    PEP 342

    但是b.send(1)仍然返回相同的值 . 为什么有区别?

    因为您反复将 number 重置为send()的参数值:

    a:  number = 2
        number += 1
        number += 1
    
    b:  number = 2
        number = 1
        number += 1
        number = 1
        number += 1
    

相关问题