来自 Computerphile 的关于产量和产量的 Python 示例

2023-11-30

主题:Python 中的惰性 - Computerphile
网址:https://www.youtube.com/watch?v=5jwV3zxXc8E

在此示例中,它尝试在 Python 中从 2 到 Infinity 的无穷系列数字生成素数:

产量和特征产量

Code:

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    



Question
在函数 sieve 中,它调用生成器对象并产生来自s;s 在本例中是 nats(2)
下一行是最棘手的部分

毯子里面

sieve(i for i in s if i%n!=0)

它通过对象的循环s当 if 语句触发时,它返回 i ,即

sieve(i)

我的问题是

  1. what i实际上是?整数或生成器对象
  2. 假设 n = 2 for 循环序列是什么样的
    i%2 我不知道是什么i应该
  3. 当它触发时如果我%n!=0它返回k iter i要不就kth单个数字/对象
  4. 毕竟以上最后变成了筛(i)有什么区别筛(nats(2))
  5. 有人可以逐步介绍 for 循环的工作原理吗

  1. sieve始终使用生成器对象进行调用。如前所述,nats(n)(它确实需要一个 int)是一个生成器,因为它包含一个yield。这样就解释了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.

  1. 那么我们这么说吧n等于 2。这并不意味着s是 2,但是你得到的第一个值是s是 2。所以当它调用时sieve同样,下一个值将是三,这会导致3%2 != 0是真的,因此它是从生成器中产生的,依此类推。

  2. 所以这又回到了如何(i for i in s if i%n!=0)是一个发电机。它不会以正确的方式返回任何内容,也不会给出数字sieve。只有在调用之后sieve新的调用请求下一个值,它将获取下一个值。所以它确实会产生一个号码,但只有当你打电话时next(s)去询问它。

  3. 我希望你现在能明白它永远不会调用sieve(i),它只调用sieve带发电机。nats(2)是一个生成器,但也是(i for i in s if i%n!=0).

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 Computerphile 的关于产量和产量的 Python 示例 的相关文章

  • 使用 pythonbrew 编译 Python 3.2 和 2.7 时出现问题

    我正在尝试使用构建多个版本的 python蟒蛇酿造 http pypi python org pypi pythonbrew 0 7 3 但我遇到了一些测试失败 这是在运行的虚拟机上 Ubuntu 8 04 32 位 当我使用时会发生这种情
  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • 如何使用Python创建历史时间线

    So I ve seen a few answers on here that helped a bit but my dataset is larger than the ones that have been answered prev
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 有没有办法检测正在运行的代码是否正在上下文管理器内执行?

    正如标题所述 有没有办法做到这样的事情 def call back if called inside context print running in context else print called outside context 这将
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • 如何计算 pandas 数据帧上的连续有序值

    我试图从给定的数据帧中获取连续 0 值的最大计数 其中包含来自 pandas 数据帧的 id date value 列 如下所示 id date value 354 2019 03 01 0 354 2019 03 02 0 354 201
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐