55 函数嵌套定义、可调用对象与修饰器

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()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我还记得那天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值