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