【问题标题】:Type error generated while using send method on a just created generator object在刚刚创建的生成器对象上使用 send 方法时生成的类型错误
【发布时间】:2021-02-28 08:57:12
【问题描述】:

我正在尝试理解生成器函数,根据我的阅读,如果您想将外部生成的值传递到函数的中间,而不是在开头作为一个论点。

我创建了一个生成器函数来返回最小的 1 位回文,最小的 2 位回文等等,直到位数等于 10。

    def isPalindrome(num):
        if num == int(str(num)[::-1]):
            return True
        return False
    
    def palindrome_special():
        num = 0
        while True:
            if isPalindrome(num):
                num = (yield num) - 1
            num = num + 1
    
    for number in palindrome_special():
        print(number)
        num_digits = len(str(number))
        if num_digits <= 10:
            palindrome_special().send(10 ** num_digits)

虽然此代码返回 TypeError:

Traceback(最近一次调用最后一次):

文件“C:/Users/anura/PycharmProjects/Advanced Python/advanced_generators.py”,第 17 行,在

palindrome_special().send(10 ** num_digits)

TypeError: can't send non-None value to a just-started generator

【问题讨论】:

  • 您的逻辑似乎有问题。 num = (yield num) - 1 中的 yield num 将返回 None。即使您解决了这个问题,num 的值也将始终为 0
  • @npk 你能解释一下为什么会返回 None 吗?
  • 因为yeild num是一个声明
  • @npk 为什么语句 yield num 返回 None?它不应该返回 .send() 值 10 ** 1 吗?
  • 我无法理解其中的逻辑。但是,您可以使用yield num; num = num-1,而不是num = (yield num) - 1。请确保您的生成器按预期工作,没有最后的 for 循环部分

标签: python python-3.x iterator generator typeerror


【解决方案1】:

您必须注意,如果生成器/协程的状态为“暂停”,则只能将“非无”值传递给生成器/协程。 生成器有 4 种状态:创建 - 暂停 - 关闭 - 运行

def coroutine():
    var = yield
    print(var)

obj = coroutine()
try:
    obj.send(4)
except StopIteration:
    pass

在这种情况下,您将再次收到该错误,因为它的状态为已创建。 现在让我们试试吧:

def coroutine():
    print('changing state to SUSPEND')
    var = yield
    print(var)

obj = coroutine()
next(obj)
try:
    obj.send(4)
except StopIteration:
    pass

如您所见,我首先使用 next() 将其状态更改为 SUSPEND,以便它现在可以接受值。生成器的执行点现在就在 'yield' 语句之前。

让我补充一点,next() 与 send(None) 做同样的事情。所以你可以在我写的第一个例子中使用obj.send(None)

【讨论】:

    猜你喜欢
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    相关资源
    最近更新 更多