python - 理解函数的一些问题
问题描述
# Define echo
def echo(n):
"""Return the inner_echo function."""
# Define inner_echo
def inner_echo(word1):
"""Concatenate n copies of word1."""
echo_word = word1 * n
return echo_word
# Return inner_echo
return inner_echo
# Call echo: twice
twice = echo(2)
# Call echo: thrice
thrice = echo(3)
# Call twice() and thrice() then print
print(twice('hello'), thrice('hello'))
我不明白最后一行:Print(twice('hello'), thrice('hello'))
。
如何将参数传递给变量两次或三次,没有像函数那样的参数占位符?
解决方案
您似乎认为echo
是部分评估。这不是这里发生的机制。
您的代码中发生的情况是,返回的对象本身就是一个可以依次调用的函数。我们称返回函数的函数为高阶函数。
为了说服自己echo
返回的函数确实是inner_echo
函数,试试下面的实验
def echo(n):
def inner_echo(word1):
return word1 * n
return inner_echo
twice = echo(2)
print(twice)
输出
<function echo.<locals>.inner_echo at 0x000002437BA36A60>
这告诉我们的是,这twice
确实是一个函数。此外,它当前存储在echo
调用的局部变量中。最后它的名字确实是inner_echo
。
部分评价
如前所述,您的代码中发生的不是部分评估。例如,在您的实际代码中,这是行不通的。
echo('foo', 2) # TypeError
如果是这样,您将不得不这样定义echo
。
from functools import partial
@partial
def echo(n, word):
print(word * n)
echo('foo', 2)
echo('bar')(3)
推荐阅读
- perl - perl - 包名:我可以使用来自根目录的路径吗?
- python - 循环遍历csv并从当前行中减去上一行?
- java - 接口实现了覆盖自己的方法来创建自己的对象作为默认值
- c++ - 如何结合范围 v3 转换、连接和循环?
- javascript - 带有 React 的正则表达式没有通过 API 调用给出正确的答案
- c - 在函数之间传递多维数组
- python - 为模型中现有对象中的新字段提供静态默认值?
- javascript - 如何使用来自 firebase 的 momentjs 检索多个值?
- c# - 如果 BindModelAsync 失败,则在 ASP.NET Core 中返回 400 错误请求的最佳实践
- stata - 将混合模型的结果保存在数据集中