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)
python之装饰器进阶(简单设置装饰器函数、列表推导式、变量地址传递效果)
最新推荐文章于 2024-10-02 10:53:34 发布