gpt4 book ai didi

Computerphile 的 Python 示例,关于 yield 和 yield from

转载 作者:行者123 更新时间:2023-12-04 12:57:29 25 4
gpt4 key购买 nike

主题:Python 中的懒惰 - Computerphile
网址:https://www.youtube.com/watch?v=5jwV3zxXc8E
在这个例子中,它试图从 Python 中从 2 到 Infinity 的无穷大数列中生成素数

yield and yield from feature


代码:
def nats(n):
yield n
yield from nats(n+1)

def sieve(s):
n = next(s)
yield n
yield from sieve(i for i in s if i%n!=0)

p = sieve(nats(2))
next(p)
next(p)
在函数 nats 中,每次调用 next() 时,它都会从 n 开始生成无穷大数并产生 n
series = nats(1)
next(series) # output 1
next(series) # output 2
....
next(series) # output n
问题
在函数sieve中,它调用生成器对象并产生来自 的n。 s ;s 在这个例子中是 nats(2)
下一行是最棘手的部分
毯子里面
sieve(i for i in s if i%n!=0)
它通过对象循环 s
当 if 语句触发它返回 i 是
sieve(i)
我的问题是
  • 什么实际上是?整数或生成器对象
  • 假设 n = 2 for 循环序列是什么样的
    % 2 我不知道什么是 应该是
  • 当它触发时 如果 i%n!=0 它返回 k iter 或只是 第 k 个 单号/对象
  • 综上所述,最后变成筛子( i ) 有什么区别筛(nats(2))
  • 有人可以逐步了解 for 循环的工作原理
  • 最佳答案

  • sieve总是用生成器对象调用。如前所述,nats(n) (它确实需要一个 int)是一个生成器,因为它包含一个产量。所以这解释了 p = sieve(nats(2)) .让我们看看当您拨打 sieve(i for i in s if i%n!=0) 时会发生什么.中间的那一点实际上是一个发电机本身!它不是在调用 sieve具有 i 的任何特定值但是用生成i的方式.

  • 所以当你拨打 sieve像这样,第一行是 n = next(s) .这要求下一个值 s产生。这就是视频试图解释的部分内容是这些生成器根据需要做事。 (i for i in s if i%n!=0)没有立即找到 i并将其传递给 sieve , 如果提供 sieve一种找到 i 的方法需要的时候。这是什么 next(s)正在做,它要求实际找到一个特定的 i .在这种情况下,它将在原始 s 中寻找下一个值。 (记住 s 现在意味着不同的东西)其中 i%n != 0 .
  • 所以让我们说 n等于 2。这并不意味着 s是 2,但是您从 s 获得的第一个值是 2。所以当它调用 sieve 时再次,下一个值将是三个导致 3%2 != 0是真的,因此它是从生成器中产生的,依此类推。
  • 所以这又回到了 (i for i in s if i%n!=0)是一个发电机。它不会以正确的方式返回任何东西,它不会给 sieve 一个数字.只有在它调用 sieve 之后并且那个新调用请求下一个值,它将获取下一个值。所以它确实产生了一个数字,但只有当你拨打 next(s) 时要求它。
  • 我希望你现在可以看到它永远不会调用 sieve(i) ,它只会调用 sieve带发电机。 nats(2)是生成器,但 (i for i in s if i%n!=0) 也是生成器.

  • 我认为这也为您解释了第五点,但如果您仍然感到困惑,那么我(或其他人)可以确切地显示正在发生的事情,尽管仅用文字很难解释。

    关于Computerphile 的 Python 示例,关于 yield 和 yield from,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64781630/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com