1 函数嵌套定义
Python 允许函数的嵌套定义,在函数内部可以再定义另外一个函数。
def func(iterable, operator, value): # 自定义函数
if operator not in '+-*/':
return 'operator error'
def nested(item): # 嵌套定义函数
return eval(repr(item) + operator + repr(value))
return map(nested, iterable)
print(list(func(range(5), '+', 5)))
print(list(func(range(5), '/', 5)))
2 可调用对象
函数属于 Python 可调用对象之一,由于构造方法的存在,类也是可调用的。像 list()、tuple()、dict()、set() 这样的工厂函数实际上都是调用了类的构造方法。另外,包含任何 _ _ call _ _ () 方法的类的对象也是可调用的。
# 使用嵌套函数的定义实现可调用对象的定义
def linear(a, b):
def get(x):
return a * x + b
return get # 返回可被调用的函数
# 定义一个可调用对象
obj = linear(0.3, 2)
# 调用该对象
print(obj(5))
# 可调用对象类的定义
class linear:
def __init__(self, a, b):
self.a, self.b = a, b
def __call__(self, x): # 这里是关键
return self.a * x + self.b
# 定义一个可调用对象
obj = linear(0.3, 2)
# 调用该对象
print(obj(5))
3 修饰器
修饰器是函数嵌套定义的另一个重要应用。修饰器本质上也是一个函数,只不过这个函数接收其他函数作为参数并对其进行一定的改造之后返回新函数。
静态方法、类方法、属性等也都是通过修饰器实现的,Python 中还有很多这样的用法。
def before(func): # 定义修饰器
def wrapper():
print('before() called.')
return func()
return wrapper
@before
def test():
print('127')
return 'python'
# 调用被修饰的函数
x = test()
print('x: ', x)
def before(func): # 定义修饰器
def wrapper():
print('before() called.')
return func()
return wrapper
def after(func): # 定义修饰器
def wrapper(*args, **kwargs):
get = func(*args, **kwargs)
print('after() called.')
return get
return wrapper
@before
@after
def test(): # 同时使用两个修饰器改造函数
print(3)
# 调用被修饰的函数
test()