Python 函数名、函数对象与“把函数作为参数传递”

在 Python 中,函数定义完成以后,函数名会绑定到对应的函数对象。

例如:

python 复制代码
def say_hello(name):
    print(f'Hello, {name}')
    return set(name)

可以简单理解为:

text 复制代码
say_hello
    ↓
对应的函数对象

1. 函数名和函数调用不是一回事

python 复制代码
say_hello

表示:

函数本身。

而:

python 复制代码
say_hello('DuDu')

表示:

调用这个函数,并把 'DuDu' 作为参数传进去。

因此:

text 复制代码
say_hello        → 函数本身
say_hello(...)   → 调用函数

2. 函数也可以赋值给其他变量

python 复制代码
other_variable = say_hello

这里没有 (),所以并没有调用函数。

可以理解为:

text 复制代码
say_hello ───────┐
                 ↓
              同一个函数对象
                 ↑
other_variable ──┘

所以:

python 复制代码
other_variable('DuDu')

实际上就等价于:

python 复制代码
say_hello('DuDu')

3. 函数可以作为参数传给另一个函数

例如:

python 复制代码
def use_say_hello(func, name):
    print(f'Hi, {func(name)}')

调用:

python 复制代码
use_say_hello(say_hello, 'HanHan')

这里传进去的是:

python 复制代码
say_hello

而不是:

python 复制代码
say_hello()

进入 use_say_hello() 后,可以简单理解为:

text 复制代码
func = say_hello
name = 'HanHan'

所以:

python 复制代码
func(name)

实际上就是:

python 复制代码
say_hello('HanHan')

4. 为什么传函数时不加 ()?

因为:

python 复制代码
say_hello

表示把函数本身传进去。

而:

python 复制代码
say_hello('HanHan')

会先执行函数,再把它的返回值传进去。

所以:

python 复制代码
use_say_hello(say_hello, 'HanHan')

表示:

把 say_hello 这个函数交给 use_say_hello(),由它决定什么时候调用。


5. 这也是 max(..., key=...) 的原理

例如:

python 复制代码
products = {
    '牛奶': 6.5,
    '面包': 8.9,
    '鸡蛋': 12.8,
    '咖啡': 25.6,
    '酸奶': 9.5
}

res = max(products.keys(), key=products.get)

print(res)

这里:

python 复制代码
products.get

同样没有 ()。

因为传给 key 的是 get 方法本身,而不是立即执行 get()。

max() 会把第一个参数中的元素依次传给 products.get:

python 复制代码
products.get('牛奶')   # 6.5
products.get('面包')   # 8.9
products.get('鸡蛋')   # 12.8
products.get('咖啡')   # 25.6
products.get('酸奶')   # 9.5

然后比较这些返回值:

text 复制代码
6.5、8.9、12.8、25.6、9.5

最大的是:

text 复制代码
25.6

但 max() 最终返回的是第一个参数中对应的原始元素:

text 复制代码
咖啡

所以:

key=XXX 决定按照什么结果进行比较,但 max() 最终返回的仍然是第一个参数中的原始元素。

然后根据这些返回值比较大小。

所以:

不加 ():传递函数或方法本身。
加 ():立即调用函数或方法。


一句话总结

text 复制代码
函数名
→ 指向函数对象

函数名()
→ 调用函数

other_variable = 函数名
→ 让另一个变量也指向这个函数

另一个函数(函数名)
→ 把函数本身作为参数传进去

Python 中函数本身也是对象,所以函数既可以赋值给变量,也可以作为参数传给另一个函数。

相关推荐
2601_957883841 小时前
2026年9月:雷神笔记本售后相关资讯
python·电脑
sunshine22 girl1 小时前
Java学习六 Java常见API-1-Radom随机数
java·开发语言·学习
可乐鸡翅yeah_1 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
天赐范式2 小时前
天赐范式第185天:让漂变开始定量——扫N看选择主导边界
python·信噪比·数字生命·天赐范式·动态运行时·种群大小·遗传漂变
潼心1412o2 小时前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法
Jo乔戈里2 小时前
免费本地搜图软件
图像处理·python·搜索引擎·ai
for_ever_love__2 小时前
字符串处理——f-string、切片与正则,清洗文本的第一把刀
python·大模型·虚拟环境
夜晚回家2 小时前
Python 零基础入门 | 输入的数字为什么不能直接算
开发语言·python
时间的拾荒人2 小时前
Qt 事件机制全解析:从事件处理到事件过滤器
开发语言·qt·面试