为什么我的“公式”变量不会像电子表格中那样自动更新?如何重新计算该值?

2023-12-06

我注意到初学者经常犯以下简单的逻辑错误。由于他们确实不理解这个问题,a)他们的问题不能真正说是由拼写错误引起的(完整的解释会很有用); b) 他们缺乏必要的理解,无法创建正确的示例、用正确的术语解释问题以及清楚地提问。因此,我代表他们要求制作一个规范的重复目标。

考虑这个代码示例:

x = 1
y = x + 2

for _ in range(5):
    x = x * 2 # so it will be 2 the first time, then 4, then 8, then 16, then 32
    print(y)

每次经过循环,x是双倍的。自从y被定义为x + 2,为什么它没有改变x变化?我怎样才能使值自动更新,并得到预期的输出

4
6
10
18
34

?


声明式编程

许多初学者期望 Python 能够以这种方式工作,但事实并非如此。更糟糕的是,他们可能不一致地期望它能这样工作。仔细考虑示例中的这一行:

x = x * 2

如果作业就像数学公式,我们必须解决x这里。唯一可能的(数字)值x将为零,因为任何其他数字都不等于该数字的两倍。我们应该如何解释代码前面所说的事实x = 1?这不是矛盾吗?我们是否应该在尝试定义时收到错误消息x两种不同的方式?或者期待x爆炸到无穷大,因为程序不断尝试将旧值加倍x

当然,这些事情都不会发生。与大多数常用的编程语言一样,Python 是陈述性的语言,意味着代码行描述actions以定义的顺序发生。存在循环的地方,重复循环内的代码;哪里有类似的东西if/else,某些代码可能会被跳过;但一般来说,同一“块”中的代码只是按照编写的顺序发生。

在示例中,首先x = 1发生,所以x等于1. Then y = x + 2发生,这使得y等于3暂且。这发生过因为任务,而不是因为x有一个价值。因此,当x稍后在代码中进行更改,即does not cause y改变。

顺应(控制)流程

那么,我们如何制作y改变?最简单的答案是:与我们最初赋予它这个值的方式相同 - 通过任务, using =。事实上,思考x = x * 2再次编码,我们已经看过了这个怎么做。

在示例代码中,我们想要y多次更改 - 每次循环一次,因为那是print(y)发生。应该赋予什么值?这取决于x - the current的价值x 在这个过程中的那个时刻,这是通过使用...确定的x。就像怎样x = x * 2检查现有值x,将其加倍,并且changes x达到翻倍的结果,所以我们可以写y = x + 2检查现有值x,添加两个,然后更改y成为新的价值。

Thus:

x = 1

for _ in range(5):
    x = x * 2
    y = x + 2
    print(y)

唯一改变的是这条线y = x + 2现在在循环内。我们希望每次更新都会发生x = x * 2发生后,立即发生(即,以便及时进行更改print(y))。所以,这直接告诉我们代码需要去哪里。

def建立关系

假设程序中有多个地方x变化:

x = x * 2
y = x + 2
print(y)
x = 24
y = x + 2
print(y)

最终,记住更新会变得很烦人y在每行代码发生变化之后x。它也是潜在的错误来源,随着程序的增长,这种情况会变得更糟。

在原始代码中,编写背后的想法y = x + 2 was to 表达一种关系之间x and y:我们希望代码能够处理y就好像它的意思是一样的x + 2,它出现的任何地方。用数学术语来说,我们想要处理y as a 的函数 x.

在 Python 中,像大多数其他编程语言一样,我们使用称为“函数”的东西来表达函数的数学概念。具体来说,在 Python 中,我们使用def函数来编写函数。看起来像:

def y(z):
    return z + 2

我们可以在函数中编写我们喜欢的任何代码,并且当函数被“调用”时,该代码将运行,就像我们现有的“顶级”代码运行一样。当Python第一次遇到以def不过,它仅从该代码创建一个函数 - 它尚未运行该代码。

所以,现在我们有一个名为y,这是一个函数,它接受一些z价值并回馈(即return是)计算的结果z + 2。我们可以通过写类似的方式来调用它y(x),这将给我们现有的x值和评估为该值加 2 的结果。

请注意,z这是函数自己的值的名称已传入,并且它不必匹配我们为该值命名。事实上,我们根本不必为该值指定自己的名称:例如,我们可以编写y(1),该函数将计算3.

我们所说的“评估”、“回馈”或“returning”?简单来说,调用该函数的代码就是一个表达, 就像1 + 2,并且当计算该值时,它会以相同的方式就地使用。所以,举例来说,a = y(1)将使a等于3:

  • 该函数接收一个值1,称之为z内部。
  • 该函数计算z + 2, i.e. 1 + 2,得到结果 3。
  • 功能return是的结果3.
  • 这意味着y(1) 评估为 3;因此,代码的执行就好像我们已经输入了3哪里的y(1) is.
  • 现在我们有相当于a = 3.

有关使用函数的更多信息,请参阅如何从函数中获取结果(输出)?以后如何使用结果?.

回到本节的开头,因此我们可以使用以下调用y直接为我们的prints:

x = x * 2
print(y(x))
x = 24
print(y(x))

我们不需要“更新”y when x变化;相反,我们确定值使用时间和地点。当然,从技术上来说我们无论如何都可以做到这一点:重要的是y在实际用于某事的地方是“正确的”。但是通过使用该函数,逻辑x + 2计算被打包、命名并放在一个地方。我们不需要写x + 2每次。在这个例子中看起来微不足道,但是y(x)无论计算多么复杂,只要x是唯一需要的输入。计算只需要写一次:在函数定义中,其他一切都只是说y(x).

也可以使y函数使用x值直接来自我们的“顶级”代码,而不是显式传递它。这可能很有用,但在一般情况下它会变得复杂,并且会使代码更难理解并且容易出现错误。为了正确理解,请阅读在函数中使用全局变量 and 范围规则的简短描述?.

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

为什么我的“公式”变量不会像电子表格中那样自动更新?如何重新计算该值? 的相关文章

  • 使用 python requests 模块时出现 HTTP 503 错误

    我正在尝试发出 HTTP 请求 但当前可以从 Firefox 浏览器访问的网站响应 503 错误 代码本身非常简单 在网上搜索一番后我添加了user Agent请求参数 但也没有帮助 有人能解释一下如何消除这个 503 错误吗 顺便说一句
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • 将html数据解析成python列表进行操作

    我正在尝试读取 html 网站并提取其数据 例如 我想查看公司过去 5 年的 EPS 每股收益 基本上 我可以读入它 并且可以使用 BeautifulSoup 或 html2text 创建一个巨大的文本块 然后我想搜索该文件 我一直在使用
  • Python getstatusoutput 替换不返回完整输出

    我发现了这个很棒的替代品getstatusoutput Python 2 中的函数在 Unix 和 Windows 上同样有效 不过我觉得这个方法有问题output被构建 它只返回输出的最后一行 但我不明白为什么 任何帮助都是极好的 def
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • 使用Python请求登录Google帐户

    在多个登录页面上 需要谷歌登录才能继续 我想用requestspython 中的库以便让我自己登录 通常这很容易使用requests库 但是我无法让它工作 我不确定这是否是由于 Google 做出的一些限制 也许我需要使用他们的 API 或
  • 在Python中连接反斜杠

    我是 python 新手 所以如果这听起来很简单 请原谅我 我想加入一些变量来生成一条路径 像这样 AAAABBBBCCCC 2 2014 04 2014 04 01 csv Id TypeOfMachine year month year
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • 如何通过 TLS 1.2 运行 django runserver

    我正在本地 Mac OS X 机器上测试 Stripe 订单 我正在实现这段代码 stripe api key settings STRIPE SECRET order stripe Order create currency usd em
  • 如何使用 pybrain 黑盒优化训练神经网络来处理监督数据集?

    我玩了一下 pybrain 了解如何生成具有自定义架构的神经网络 并使用反向传播算法将它们训练为监督数据集 然而 我对优化算法以及任务 学习代理和环境的概念感到困惑 例如 我将如何实现一个神经网络 例如 1 以使用 pybrain 遗传算法
  • pyspark 将 twitter json 流式传输到 DF

    我正在从事集成工作spark streaming with twitter using pythonAPI 我看到的大多数示例或代码片段和博客是他们从Twitter JSON文件进行最终处理 但根据我的用例 我需要所有字段twitter J
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 加快网络抓取速度

    我正在使用一个非常简单的网络抓取工具抓取 23770 个网页scrapy 我对 scrapy 甚至 python 都很陌生 但设法编写了一个可以完成这项工作的蜘蛛 然而 它确实很慢 爬行 23770 个页面大约需要 28 小时 我看过scr
  • Jupyter Notebook 找不到 Python 模块

    不知道发生了什么 但每当我使用 ipython 氢 原子 或 jupyter 笔记本时都找不到任何已安装的模块 我知道我安装了 pandas 但笔记本说找不到 我应该补充一点 当我正常运行脚本时 python script py 它确实导入
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • python import inside函数隐藏现有变量

    我在我正在处理的多子模块项目中遇到了一个奇怪的 UnboundLocalError 分配之前引用的局部变量 问题 并将其精简为这个片段 使用标准库中的日志记录模块 import logging def foo logging info fo
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • 如何按用户定义(例如非字母顺序)对数据框进行排序[重复]

    这个问题在这里已经有答案了 给定一个数据框dna gt dna chrom start chr2 39482 chr1 203918 chr1 198282 chrX 7839028 chr17 3874 以下代码重新排序dna by ch
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk

随机推荐

  • 对列表视图中的项目使用 setOnItemClickListener

    我有一个可以将音频保存在 SD 卡上的应用程序 我创建了一个列表视图 用于从 SD 卡检索文件名 我正在尝试设置一个侦听器 以便在单击文件名时我可以启动另一个播放该文件的意图 当我尝试设置监听器并传入一个新的OnItemClickListe
  • 背包C#实现任务

    我正在尝试在给定条件下编写背包 C 算法 但我总是遇到两个问题 我收到 索引超出数组范围 错误 或者我的结果仅为 0 我找到了几个 Knapsack 实现的代码示例 但无法弄清楚我做错了什么 代码示例 https www programmi
  • JS 库最佳实践:返回未定义或在错误的函数输入时抛出错误?

    当用 JavaScript 编写库时 处理函数无效输入的最标准 最友好 的方法是什么 我的直觉告诉我 返回 undefined 是完全可以的 但是抛出错误实际上更有帮助吗 还是真的不重要 我还可以看到返回 false null 甚至 1 但
  • 无法在 Windows 上使用 Android Studio 1.3.2 调试 NDK 示例

    我有Android Studio 1 3 2 NDK r10e gradle实验插件0 2 0 我已经克隆了ndk 样本仓库并仔细遵循以下说明NDK 预览 包括创建本机配置 当我选择 LLDB 作为调试器并调试 Teapot NDK 示例应
  • 在 webview 控件中显示本地 PDF 文件 - 显示空白 Pdf 文件

    我正在研究 Xamarin Forms UWP 我想在webview控件中显示本地PDF文件 我点击了这两个链接 https developer xamarin com recipes cross platform xamarin form
  • 右键单击停止传播

    如何停止 javascript 中右键单击事件的传播 以便父元素根本检测不到它们 当我单击以下 html 中的链接时 未检测到左键单击 但文档元素将右键单击检测为 单击 事件而不是 contextmenu 事件 我尝试将事件侦听器附加到 m
  • 如何才能完全禁用对assert()的调用?

    我的代码充满了对assert condition 在我使用的调试版本中g g这触发了我的断言 出乎意料的是 在我的发布版本中也触发了相同的断言 即没有编译的版本 g option 如何在编译时完全禁用断言 我应该明确定义NDEBUG在我生成
  • 具有 sql 转义的动态 mysql 查询是否与准备好的语句一样安全?

    我有一个应用程序 通过将动态 mysql 查询与 mysql mysqli 真实转义字符串结合使用 它将大大受益 如果我通过 mysql real escape 运行从用户收到的所有数据 它会和使用 mysql 准备好的语句一样安全吗 是的
  • 从 jQuery Mobile 重置值

    我需要重置我的页面的所有字段元素的值 这些元素是 输入 选择 组合框 复选框和单选组 搜索发现有如下代码 attr value input type checkbox attr checked false select each funct
  • 在 xslt 中添加一个或递增变量

    我想让计数器值根据条件递增 但我无法增加值或向全局变量加 1 我正在使用以下代码
  • Swift 扩展示例

    我本来想知道如何制作这样的东西 UIColor myCustomGreen 这样我就可以定义自己的颜色并在我的应用程序中使用它们 我之前研究过扩展 我认为我可能可以使用它们来解决我的问题 但我不记得到底如何设置扩展 在撰写本文时在 Goog
  • GAE (python) 中是否有与 Rails 的“flash”消息等效的东西?

    Ruby on Rails 有一种方法可以设置消息 例如flash notice and flash error 用户将在下一次机会看到 它对于在用户被重定向时 例如返回到登录页面 时通知用户登录失败等情况特别有用 在 Google App
  • 我应该在带有模板的主题观察者模式中使用动态转换吗

    通过参考文章使用模板实现主题 观察者模式 template
  • 5位数字可以表示的最大值和最小值是多少?以2的补码表示

    假设 2 的补码表示形式的 5 位数字可以表示的最大值和最小值是多少 我是否找到 5 位数字的最小值和最大值 即 00000 但我不确定最大值是多少 然后转换为二进制补码 这听起来很愚蠢 但这是我唯一能想到的 我的最后一个问题是 处理器中存
  • 将 erb 从数据库渲染到视图中问题请帮忙!

    我正在数据库中保存一些 erb 并将其呈现在视图中 如下所示 erb ERB new content render text gt erb result 我在尝试渲染 erb 时遇到错误 该 erb 中的 image tag 保存在数据库中
  • Firebase 身份验证对象可以处理同时身份验证类型吗?

    这个帖子描述如何将多个帐户绑定到一个帐户 uid in a users收藏 以下是这些安全规则 rules users uid write auth null data val null auth provider facebook aut
  • 有没有办法在Oracle数据库中创建自动递增的Guid主键?

    我主要使用 sql server 当我使用数据库时 并且我正在尝试学习 pl sql Oracle 中是否有相当于 sql server 自动生成的 Guid 作为主键的东西 您可以使用SYS GUID 生成 GUID 并将其用作列的默认值
  • 如何多次调用一个函数?

    我的问题是 我正在开发一个适合移动设备的网站 其中包含 2 个样式表 一个用于 面向 PC 的可视化 另一个用于移动可视化 除了 2 个 CSS 之外 我还需要一个函数来修改一些内容href从一种可视化模式切换到另一种可视化模式时菜单上的属
  • 尝试根据 JSON 字符串值动态设置图标

    我有一个位于服务器上的 JSON 格式的客户端配置 示例 JSON 类似于 icon facebook 我有下面的小部件 class MySocialIcons extends StatelessWidget MySocialIcons t
  • 为什么我的“公式”变量不会像电子表格中那样自动更新?如何重新计算该值?

    我注意到初学者经常犯以下简单的逻辑错误 由于他们确实不理解这个问题 a 他们的问题不能真正说是由拼写错误引起的 完整的解释会很有用 b 他们缺乏必要的理解 无法创建正确的示例 用正确的术语解释问题以及清楚地提问 因此 我代表他们要求制作一个