一、函数是什么?
它相当于一个独立的代码块,可以被重复使用,如果需要增加一个功能或者修改一个功能,只需要,增加或者修改函数即可。
二、函数定义
三、函数的调用
函数名称(参数)
四、函数作用域
函数相当于一个封装好的盒子,里面可以定义局部变量,随着函数的调用和结束,其中的局部变量也随之建立和消亡。而且局部变量只能在该函数中有效。
上面说到过,函数可以嵌套使用,当一个函数内使用一个变量的时候,查找的原则是就近原则。也就是本函数有就使用本函数的,再到上级函数找,找到全局变量之后没有,再发现内置变量也没有的话就会报错。
当使用全局变量的时候,如果全局变量是可变类型的话,可以对其元素进行修改,如果是不可变类型则只能进行取值。
global
当你要使用全局变量的时候可以用@global。使用@global声明后,可以对全局变量进行修改
当你先定义了局部变量再用@global声明全局变量的时候就会报错
在实际开发中其实不会产生这种问题,因为根据命名规范,全局变量要大写表示。
注:global可以直接找到全局变量,可以用nonlocal找到上级的变量,这个和global差不多,只不过它找的是上一级函数的
五、装饰器
装饰器是给现有的模块增添新的小功能,可以对原函数进行功能扩展,而且还不需要修改原函数的内容,也不需要修改原函数的调用。
装饰器的使用符合了面向对象编程的开放封闭原则。
开放封闭原则主要体现在两个方面:
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立其工作,而不要对类尽任何修改。
六、为什么要用装饰器
使用装饰器之前,我们要知道,其实python里是万物皆对象,也就是万物都可传参。
函数也可以作为函数的参数进行传递的。
通过下面这个简单的例子可以更直观知道函数名是如何直接作为参数进行传递
简单装饰器
import time
def baiyu():
print("我是攻城狮白玉")
time.sleep(2)
def count_time(func):
def wrapper():
t1 = time.time()
func()
print("执行时间为:", time.time() - t1)
return wrapper
if __name__ == '__main__':
baiyu = count_time(baiyu) # 因为装饰器 count_time(baiyu) 返回的时函数对象 wrapper,这条语句相当于 baiyu = wrapper
baiyu() # 执行baiyu()就相当于执行wrapper()