Python的4种作用域
查找顺序:L –> E –> G –>B ,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,最后去内建中找
Python中变量作用域的改变
# 作用域代码示例 if True: """ 使用if条件分支语句定义的变量在外部也可以访问""" num = 9 print("num=%d" % num) # 全局变量:num=9 print(num) # 9 def func_method1(): """ 函数内定义的变量(局部变量),外部无法访问 :return: """ num = 5 print(num) print(num) # 9
Python的函数高级引用
# 高阶函数代码示例 import random def fun_method1(): """ 获取0~100的任意随机数字 :return: """ return random.randint(0, 100) def fun_method2(): """ 将函数名当做返回值 :return: """ def func_method3(): """ 获取1.5~9.9之间的任意小数,round保留两位小数 :return: """ return round(random.uniform(1.5,9.9),2) return func_method3 if __name__ == "__main__": # 函数名赋值给变量,就可以通过变量名来调用函数 var = fun_method1 print(var()) # 将函数名当做返回值:var1() => func_method3() var1 = fun_method2() print(var1())
Python中的闭包
def func_decorator1(): # num变量一般会在当前函数执行后被回收 num = 500 def func_num(): """ 闭包:函数内部定义函数,引用非当前函数的外部变量(非全局变量) :return: """ print(num) return func_num if __name__ == "__main__": var_func = func_decorator1() # func_decorator1函数执行完,局部变量就会一般会被回收掉 var_func() # 500;注:var_func() => func_num(),闭包函数还是可以访问已调用结束的函数局部变量
Python中的装饰器
现有问题:已经存在一个功能强大且没有bug的方法,但是添加了新的需求,需要保留该方法原有的功能,而且还要在该方法上增加新的功能
解决方法:①.直接在该方法上添加新的代码实现功能(缺点:可能会给这个测试通过的方法带来新的bug)
②.丢弃该方法,重写一个方法(缺点:会造成太多的重复代码,而且之前调用过该方法的地方都要修改)
③.写一个新的方法,然后调用该方法(缺点:之前调用该方法的地方没有你新添加的功能,如果需要你新增加的功能,也需要挨个改调用方法的方法名)
④.使用装饰器,在不改变原函数代码的情况下为函数增加功能而无需修改调用方式(强烈建议)
# 模拟装饰器代码示例 def func_one(): """ 已有的一个功能强大的函数 :return: """ print("func_one method...") def func_two(func): """ 另一个功能强大的函数,需要包含第一个强大函数的功能 :return: """ print("func_two method... *A*") def func_three(): print("func_two method... *B*") func() print("func_two method... *C*") print("func_two method... *D*") return func_three if __name__ == "__main__": # 调用方式:myFunc变量接收的类型是函数名func_three,即:myFunc() => func_three(),调用myFunc函数,其实是调用了func_three函数 myFunc = func_two(func_one) myFunc()
调用结果:
func_two method... *A*
func_two method... *D*
func_two method... *B*
func_one method...
func_two method... *C*
无参装饰器
# Python中的无参装饰器代码示例 def func_two(func): """ 装饰函数:接收一个被装饰的函数作为参数 :return: """ print("func_two method... *A*") def func_three(): print("func_two method... *B*") func() print("func_two method... *C*") print("func_two method... *D*") return func_three @func_two def func_one(): """ 被装饰函数:已有的一个功能强大的函数 :return: """ print("func_one method...") if __name__ == "__main__": # 调用方式:使用Python的装饰器,简化调用函数,func_one() => func_two(func_one),先实行装饰函数里面的代码,然后再次执行被装饰函数的方法 func_one()
调用结果:
func_two method... *A*
func_two method... *D*
func_two method... *B*
func_one method...
func_two method... *C*
有参装饰器(被装饰函数有参数)
# 装饰函数有参数代码示例 def func_two(func): """ 装饰函数:接收一个被装饰的函数作为参数 :return: """ print("func_two method... *A*") def func_three(name): """ 内部函数其实等同于被修饰的函数,被修饰的函数有参数,只需要在内部参数添加参数即可 :return: """ print("func_two method... *B*") func(name) print("func_two method... *C*") print("func_two method... *D*") return func_three @func_two def func_one(name): """ 被装饰函数有参数:已有的一个功能强大的函数 :return: """ print(f"func_one method...,My name is {name}") if __name__ == "__main__": # 调用方式:使用Python的装饰器,简化调用函数,func_one() => func_two(func_one),先执行装饰函数里面的代码,然后再次执行被装饰函数的方法 func_one("Tom")
调用结果:
func_two method... *A*
func_two method... *D*
func_two method... *B*
func_one method...,My name is Tom
func_two method... *C*
有参装饰器(装饰函数有参数)
# 装饰函数有参数代码示例 def func_four(param): """ 嵌套装饰函数:用来为装饰器函数传递参数 :param param: 装饰器需要的参数 :return: func_two """ def func_two(func): """ 装饰函数:接收一个功能强大的函数,需要有参数时,可以一层一层往上返回 :return: func_three """ print("func_two method... *A*") def func_three(name): """ 内部函数其实等同于被修饰的函数,被修饰的函数有参数,只需要在内部参数添加参数即可 :param name: 被装饰函数需要的参数 :return: """ print("func_two method... *B*") func(name) print("func_two method... *C*") print("func_two method... *D*") print(f"装饰函数需要有参数:{param}") return func_three return func_two @func_four(param="Hello") def func_one(name): """ 被装饰函数有参数:已有的一个功能强大的函数 :return: """ print(f"func_one method...,My name is {name}") if __name__ == "__main__": # 调用方式:使用Python的装饰器,简化调用函数,func_one() => func_two(func_one) # 先执行装饰函数里面的代码,然后再次执行被装饰函数的方法 func_one("Tom")
调用结果:
func_two method... *A* func_two method... *D* 装饰函数需要有参数:Hello func_two method... *B* func_one method...,My name is Tom func_two method... *C*
原文:https://www.cnblogs.com/jason2018524/p/13096641.html