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 中函数本身也是对象,所以函数既可以赋值给变量,也可以作为参数传给另一个函数。

相关推荐
镜子AI5 小时前
镜子AI工程教程:用Python实现关键词布局检查器与语义改写查重(附完整代码)
人工智能·python·microsoft
小oo呆6 小时前
【学习心得】Python协程
python
信誓旦旦的程序猿6 小时前
【Python量化实战宝典 #22】涨跌停、连板情绪手册:情绪指标构建(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
gCode Teacher 格码致知6 小时前
Pandas教学-21:subplots的使用
python·pandas·1024程序员节
2601_967980117 小时前
Python开发的顶级开源项目全景图:2025-2026年生态概览
python·机器学习·开源项目·数据科学·生态概览
小成202303202657 小时前
C++~07补充
开发语言·c++
benchmark_cc7 小时前
量化开发中,什么时候应该停止手动下载股票数据?
python·数据分析·pandas·量化交易·1024程序员节·股票数据·quantdash
泡茶喝茶写代码7 小时前
A股量化策略回测实战:从行情数据到绩效评估(第 15 篇):新高新低策略
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
全栈练习生8 小时前
Jev 决策模型
python·ai·1024程序员节