python之装饰器进阶(简单设置装饰器函数、列表推导式、变量地址传递效果)

my_list = [1, 2, 3, 4, 5]


# 定义装饰函数
# 1.定义装饰函数,参数为被装饰函数函数名
def sum_num(sum_s):
    # 2.定义闭包函数,参数为被装饰函数的形参
    def inner(lis):
        # 3. 传递被装饰函数,参数为被装饰函数的形参
        sum_s(lis)

    # 4.返回闭包函数地址,将被装饰函数地址指向闭包函数地址,即sums=inner()
    return inner


# 5.设置装饰器,名称为装饰函数名称
@sum_num
def sums(lists):
    # 方法一
    flag = 0
    for li in lists:
        li += 1
        lists[flag] = li
        flag += 1
    print(lists)

    # # 方法二
    # # TODO 列表推导式(简化)
    # lists = [li+1 for li in lists]
    # print(lists)


# TODO 执行方法一时,如果执行三次,为什么会被叠加3次?;
# 因为在第一次调用函数执行完成后,外部变量“my_list”列表从[1, 2, 3, 4, 5]变为[2, 3, 4, 5, 6];
# 第二次调用时,逐个加一的方法便以my_list=[2, 3, 4, 5, 6]为基础;
# 第三次同理;

# TODO 执行方法二时,为什么就不会从出现叠加的情况?
# 因为通过列表推导式,将逐个加一的方法赋值给了内部变量"lists",\
#   而使得原来的“my_list”中的列表内容有了新的地址,\
#   但外部变量‘my_list’的列表地址仍然不变(即‘my_list’的地址),
# 这使得函数在每一次执行结束后,都是以最开始的my_list = [1, 2, 3, 4, 5]为基础;

# TODO 简单的讲:
#   方法一在执行过程中,一直使用my_list原来的地址,再次执行函数会有叠加效果;
#   方法二在执行过程中,将my_list的列表地址传递给了新的地址即内部变量lists,直到命令结束\
#       再次执行命令时,原来的my_list的列表没有发生任何变化,不会产生叠加效果;
sums(my_list)
sums(my_list)
sums(my_list)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值