如何在Python中创建一组参数化函数? [复制]

2023-12-23

我正在尝试创建一系列函数,并通过“shift”参数进行参数化。考虑下面的代码。

我希望 for 循环创建一组函数,每个函数都会改变 不同数量的争论。

# Python 3 code.
N = 5
fns = []
for idx in range(N):
    def f(x): # shift input by idx
        return x+idx
    fns.append(f)


print("---------------------------")
for i in range(N):
  print(fns[i](1))



print("---------------------------")
for idx in range(N):
  print(fns[idx](1))

运行代码后,我得到一些奇怪的东西:

---------------------------
5
5
5
5
5
---------------------------
1
2
3
4
5

为什么两个 for 循环的输出不同,尽管它们在概念上做的是相同的事情?

可能的原因?:在第二次循环中,我恢复了名称idx这是第一个中使用的for循环创建函数列表。

所以这里可能存在一些“绑定”魔法,即所有函数基本上都使用idx在其调用期间的紧邻范围内。

在第2次for循环的值idx在第一个的末尾for循环为 4,这导致第二个 for 循环输出相同的结果。在第三个 for 循环中,idx变量在每次迭代时再次改变值 这会导致函数按照第三个 for 循环的预期运行。

这是正确的解释吗?

但这显然是一种定义单参数函数族的有缺陷的方法。那么 Pythonic 的做法是什么呢?

注意:有些人可能建议定义f在第一个循环中接受两个参数:实际参数和移位参数。在我的代码中,由于某些技术原因,我无法在我正在使用的代码库中执行此操作。也许柯里化是一种选择?我不想去那里,如果有一个更简单的Python解决方案来创建一个(二,三...)参数函数族


由于 的值不同,两个循环中的输出存在差异idx.

在你的第一个for循环,您存储了函数的引用f() in fns列表。这里,值idx不存储为您的函数的一部分f() inside fnx.

for idx in range(N):
    def f(x): # shift input by idx
        return x+idx
    fns.append(f)

一旦执行了这个循环,idx保持值为4(N-1 从for loop).

因此,您的第二个循环使用打印值idx as 4. i.e. f()打印值4+1

for i in range(N):
  print(fns[i](1))

然而,在第三个循环中,您正在重新初始化的值idx作为...的一部分for循环和你的fns每次迭代都会获得 0 到 4 范围内的值。

for idx in range(N):
  print(fns[idx](1))

这就是为什么您会在这里看到从 1 到 N 的值(因为idx范围从 0 到 N-1)。

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

如何在Python中创建一组参数化函数? [复制] 的相关文章

随机推荐

  • 如何使用 React-Query 处理多个查询

    我已经开始使用 React Query 如果我只需要从数据库中的单个集合中获取数据 它会非常有效 但是 我正在努力寻找一种查询多个集合以在单个组件中使用的好方法 一个查询 没问题 const isLoading isError data e
  • CakePHP Twitter 克隆:无法让关注系统工作

    抱歉 标题不具有描述性 但我不知道如何表达它 目前 我正在尝试使用 cakePHP 开发 Twitter 克隆 因为我是网络编程新手 我带了3张桌子 用户 ID 姓名 id是自动生成的id 用户名 推文 id 内容 user id id是自
  • 在终端上显示输出并将最后 10 行添加到日志文件中

    我需要运行一个脚本并将完整内容输出到终端 然后我想从终端输出中获取最后 10 行并将它们放入日志文件中 我尝试过使用 script sh 2 gt 1 tail 10 gt log log但这会停止向终端的输出 利用流程替代bash wit
  • 按列分组的查询结果的行号

    我有一个包含以下列的表 编号 fk id 接收日期 可能有多个记录具有共同的fk id 它代表相关表中的外键id 我需要创建一个查询 为每条记录分配行号 按 fk id 分组 按 rcv date 排序 我最初从以下查询开始 它对于排序和分
  • json_decode() 无法正常工作

    这里我使用简单的html jquery ajax文件 ajax代码在这里 var email email protected cdn cgi l email protection var username ankur 07 var pass
  • Celery Beat:如何定义定义为类的周期性任务(基于类的任务)

    到目前为止 我只处理过定义为函数的 Celery 任务 我曾经定义它们的周期性CELERYBEAT SCHEDULE范围 像这样 from datetime import timedelta CELERYBEAT SCHEDULE add
  • 在 Swift 中实现协议的 NSManagedObject 的 EXC_BAD_ACCESS 错误

    我有以下两种方法 func isAuthenticated gt Bool var currentUser CurrentUser self getCurrentUser if currentUser nil return false se
  • 为什么serverstatus对mongodb写操作有不好的影响?

    我有 1 个 mongos 3 个 mongod 和 3 个配置服务器 当我写一些文档时 有时其中一个 mongods 的插入速度很慢 并且 mongod 日志文件中出现 serverstatus was very Slow 为什么 版本是
  • 如何使用 sqlite3.exe 从导出的 .sql 脚本创建数据库

    尝试将 SqlCe 数据库转换为 SQLite 我将其导出到 sql文件 现在我将如何使用sqlite exe以此创建数据库 sql file 放在哪里sql3 exe file 在 cmd 提示符或在sqlite exe shell 使用
  • Java 数组具有多种数据类型

    我可以使用什么来存储多种不同类型的数据 Int String 等 我有 PHP 背景 我可以将不同类型的数据存储到数组中 但我不知道如何在 Java 中做到这一点 举个例子 array array val1 gt 1 val2 gt cat
  • 是否可以从 PHP 检查 PHP 文件语法?

    我使用自动加载功能动态加载 PHP 类文件 这些文件可能由于某种原因丢失或损坏 自动加载将成功报告丢失的文件 以便应用程序逻辑可以处理该问题 但是 如果这些文件损坏 则整个处理会停止 用户会看到空白屏幕 并且错误日志中会显示 PHP 解析错
  • 尝试获取进程启动时间时“访问被拒绝”

    现在我正在尝试获取计算机上运行的所有进程的启动时间 到目前为止我的代码是这样的 foreach Process item in Process GetProcesses txtActivity AppendText item StartTi
  • 两个自动机之间的等价

    确定两个自动机之间的等价性的最佳或最简单的方法是什么 即 如果给定两个有限自动机 A 和 B 我如何确定两者是否识别相同的语言 它们都是确定性的或都是非确定性的 一种不同的 更简单的方法是对自动机进行补充和交叉 自动机A相当于B iff L
  • 允许同一 COM 库的多个版本

    我编写了一个 C 程序和库 允许用户更轻松地使用特定专有模拟器的 COM 接口 目前 我必须为我希望支持的每个版本的模拟器构建和分发不同版本的 C 库 开发模拟器的公司定期发布新版本 每个新版本都会有一个递增的主版本号 据我所知 版本之间的
  • PHP rtrim 函数修剪多余字符?为什么?

    如何rtrim工作 我有一个字符串 4dbb3dca 我不确定我的字符串是如何格式化的 我想打电话rtrim 4dbb3dca amp edit 可能 amp 特殊字符问题 但是在我的字符串之后4dbb3dc 我希望它是4dbb3dca 有
  • C++开发值得学Eclipse吗

    据我所知 从头开始学习使用 Eclipse 是很困难的 但我会得到诸如快速源代码浏览 调用图 静态代码分析等好处 使用 Eclipse for C CDT 还能带来哪些其他好处 我学习了 C Eclipse 它非常灵活并提供许多功能 我不再
  • 使用两个 1d 数组高效索引 2d numpy 数组

    我有一个大型 2d numpy 数组和两个 1d 数组 表示 2d 数组中的 x y 索引 我想使用这些一维数组对二维数组执行操作 我可以使用 for 循环来完成此操作 但在处理大型数组时速度非常慢 有更快的方法吗 我尝试简单地使用一维数组
  • Scala:隐式传递一个隐式参数,显式传递另一个参数。是否可以?

    让我们考虑一下这个函数 def foo implicit a Int b String println a b 现在 让我们假设有一个隐含的String and Int implicit val i1 1 在范围内 但我们想传递另一个 no
  • 构建器模式与配置对象

    构建器模式在创建不可变对象时很流行 但创建构建器会产生一些编程开销 所以我想知道为什么不简单地使用配置对象 构建器的用法如下所示 Product p Product Builder name Vodka alcohol 0 38 size
  • 如何在Python中创建一组参数化函数? [复制]

    这个问题在这里已经有答案了 我正在尝试创建一系列函数 并通过 shift 参数进行参数化 考虑下面的代码 我希望 for 循环创建一组函数 每个函数都会改变 不同数量的争论 Python 3 code N 5 fns for idx in