函数是代码重用最基本的部件
定义函数:Python使用def关键字定义函数
def 函数名(参数1,参数2):
xxx
变量作用域
Python变量作用域一共有4种
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内建作用域
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找
Python中,def/class/lambda中赋值的变量,其作用域为局部作用域,且三者的身份相同,故,类中函数要调用类中赋值变量,需增加self前缀
要点:
1.函数可直接调用全局变量
name = 1
def fun():
print(name)
if __name__ == "__main__":
fun()
>>>1
2.函数中赋值和全局变量同名的变量,此时函数内变量为新局部变量,故使用前需先赋值;在函数作用域中,局部变量覆盖同名全局作变量,但不会影响全局变量
name = 1
def fun():
print(name)
name = 0
if __name__ == "__main__":
fun()
>>>Traceback (most recent call last):
File "test.py", line 7, in <module>
fun()
File "test.py", line 3, in fun
print(name)
UnboundLocalError: local variable 'name' referenced before assignment
# name此时为局部变量
name = 1
def fun():
name = 0
print(name)
if __name__ == "__main__":
fun()
>>>0
3.局部作用域中想对全局变量赋值,或者想在局部作用域中生成全局变量,使用global关键字
# Python执行时,即使调用的函数,也会先执行函数外部的其他语句,再执行函数
# 故fun()执行前,会先打印1,然后执行了fun,在执行print打印name
name = 1
def fun():
global name
name = 0
print(name)
if __name__ == "__main__":
fun()
print(name)
>>>1
>>>0
4.函数中可以嵌套函数,特殊场景为闭包
闭包:引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外,如下
def A():
param=1
def B():
param1=param
print(param1)
return B
if __name__ == '__main__':
A()()
>>>1
B为A嵌套函数,B中引用外部函数变量(即上文中自由变量);
调用函数A,返回函数B实例(返回函数B即称闭包),此时变量param被记住。即A函数调用结束(局部变量函数调用后即时失效),param变量依然存在
global和nonlocal
global:函数中若想修改全局变量,需使用该关键字声明
nonlocal:允许嵌套def对其外部函数中变量赋值(一般只引用)且这个变量需已在外层被赋值过,而非在嵌套def中初始赋值