点我,看原文,代码即可运行
把函数赋值给变量
def say(text):
print(text)
speak = say
speak('hello') # hello
del say
say('hello') # NameError: name 'say' is not defined
speak('hello') # hello
speak
只是这个函数对象的另一个名字,也就是说你可以删除原来的名字(say
),仍然可以通过 speak
调用这个函数。这就像普通的变量赋值一样。请看下图了解。
函数作为变量,存储到数据结构
正如我们在第一节中了解到的,函数是 Python 中的对象,我们可以将它们存储在数据结构中,就像任何其他对象一样。 要访问存储在其中的函数对象,假设列表的工作方式如下:
def say(text):
print(text)
funcs = [say, str.lower, str.upper]
for func in funcs:
print(func, "执行返回值:", func("Hello"))
# 运行结果:
# Hello
# <function say at 0x7f9b880c6320> 执行返回值: None
# <method 'lower' of 'str' objects> 执行返回值: hello
# <method 'upper' of 'str' objects> 执行返回值: HELLO
函数作为参数传递
第一次听到这个词,你会觉得很奇怪,但是你可以确定,函数也是一个对象,可以作为参数传递给另一个函数。
def sayUpper(text):
print(text.upper())
def sayLower(text):
print(text.lower())
def speak(text, func):
func(text)
speak('Hello', sayUpper) # HELLO
speak('Hello', sayLower) # hello
上面的例子我们定义了两个函数,sayUpper
和 sayLower
,然后调用 speak
函数,将他们作为参数传递给 speak
函数。
函数作为返回值
函数可以作为返回值,这个返回值就是一个函数。
def speaker(volume):
def quiet(text):
return text.lower()
def loud(text):
return text.upper()
if volume < 20:
return quiet
else:
return loud
s = speaker(10)
print(s('Hello')) # hello
S = speaker(30)
print(S('Hello')) # HELLO
上面的例子定义了一个函数 speaker
,它接受一个参数 volume
,如果 volume
小于 20,返回一个函数 quiet
,否则返回一个函数 loud
。执行 speaker
函数,我们传入 10,它将返回一个函数 quiet
,执行 speaker
函数,我们传入 30
,它将返回一个函数 loud
。例子中s
、S
变量都是函数,它们都是 speaker
函数的返回值。
像执行函数一样执行对象
所有函数都是对象,但所有对象都不是函数。 但是,可以将对象设置为可调用的,这允许将它们视为函数(在某些情况下)。 为此,我们可以使用 __call__
属性。
class Subtrack:
def __init__(self, a, b):
self.a = a
self.b = b
def __call__(self, x):
return self.a - self.b - x
X = Subtrack(10, 5)
print(X(2)) # 3
上面的例子定义了一个类 Subtrack
,它有两个属性a
和 b
,并且定义了一个函数 __call__
,它可以将对象设置为可调用的。 为此,我们可以使用 __call__
属性。X
是 Subtrack 类的实例,因为存在__call__
函数,它可以像函数一样被调用。需要主要并不是所有的类都有 __call__
属性。
总结
通过上面的学习你是否更熟悉了 Python 的函数了?
欢迎大家留言讨论,点赞、收藏,支持!
pythontip 出品,Happy Coding!
公众号: 夸克编程