参考 https://docs.python.org/zh-cn/3.9/tutorial/controlflow.html#defining-functions
语法格式
# 定义函数def 函数名([可选参数]):...[return]# 使用函数函数名([可选参数])
函数的两个关键字 def return
- def : 函数定义的关键字
 - return:函数的返回值关键字,如果不加return,默认返回None
 
不带参数
def hello():print("Hello, I'm mf!")hello()
带参数
参数可以函数更灵活
def hello(name):print("Hello, I'm {} !".format(name))hello('mf')
带返回值
def mySum(a, b):#函数名return a+bres = mySum(1, 2) #调用函数print(res) # 3
函数与变量
解析变量
- 局部作用域-》外部嵌套作用域-》全局作用域-》内建作用域
 

# 函数内部变量只作用于函数内def f():a = 2print(a) # NameError: name 'a' is not defined

# 按照解析顺序,函数内部没有变量a,则解析函数外部变量a=1print(a, id(a)) # 1 2072495417648def f():print(a, id(a)) # 1 2072495417648f()

# 按照解析顺序,优先解析函数内部的变量a,并且两个a的数据不是同一个内存a=1print(a, id(a)) # 1 2840250378544def f():a = 2print(a, id(a)) # 2 2840250378576f()print(a, id(a)) # 1 2840250378544
修改变量
- 函数内部默认不能修改函数外部变量的引用,使用global关键字可以改变全局变量的引用(图中的箭头表示变量对数据的引用)
 


# 按照解析顺序,优先解析函数内部的变量a,并且两个a的数据不是同一个内存a=1print(a, id(a)) # 1 2036525394224def f():global aa = 2print(a, id(a)) # 2 2036525394256f()print(a, id(a)) # 2 2036525394256
- 函数内部可以修改外部可变类型的值
 


a = [1, 2, 3]print(a, id(a)) # [1, 2, 3] 2949613382528def f():a[0] = 6print(a, id(a)) # [6, 2, 3] 2949613382528f()print(a, id(a)) # [6, 2, 3] 2949613382528
函数嵌套
函数嵌套定义
嵌套定义使用较少,后面的装饰器会使用,一般不推荐这样用
def myMul(a, b, c):def mySum():# 嵌套函数可使用外部函数的局部变量,形参a,b,c也属于函数作用域的变量return b + cres = mySum()return a * resres = myMul(2, 4, 6)print(res) # 20
换一种语法形式也行
def myMul(a, b, c):def mySum(x, y): # 嵌套定义mySumreturn b + cres = mySum(b, c)return a * resres = myMul(2, 4, 6)print(res) # 20
函数嵌套调用
def mySum(x, y):return x + ydef myMul(a, b, c):res = mySum(b, c) # 嵌套调用mySumreturn a * resres = myMul(2, 4, 6)print(res) # 20
函数执行流程
- 函数定义:只执行def这一行
 - 函数调用:进入被调用的函数,被调用的函数执行结束后,返回到被调用的地方
 

解析:
- 函数定义,只执行第1行
 - 函数定义,执行第5行
 - 执行第9行,此时调用函数
myMul,进入函数定义代码:第1行 - 函数
mySum执行结束后,返回到被调用的地方:第6行 - 执行第7行,函数
myMul调用结束后,返回到被调用的地方:第9行 - 执行第10行
 - 程序执行完毕,程序退出
函数生命周期
函数执行时,单独开辟一块空间,函数调用结束后,清除这块空间 ```python def mySum(x, y): return x + y 
def myMul(a, b, c): res = mySum(b, c) # 嵌套调用mySum return a * res
res = myMul(2, 4, 6)
print(res)  # 20
```




