参考 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+b
res = mySum(1, 2) #调用函数
print(res) # 3
函数与变量
解析变量
- 局部作用域-》外部嵌套作用域-》全局作用域-》内建作用域
# 函数内部变量只作用于函数内
def f():
a = 2
print(a) # NameError: name 'a' is not defined
# 按照解析顺序,函数内部没有变量a,则解析函数外部变量
a=1
print(a, id(a)) # 1 2072495417648
def f():
print(a, id(a)) # 1 2072495417648
f()
# 按照解析顺序,优先解析函数内部的变量a,并且两个a的数据不是同一个内存
a=1
print(a, id(a)) # 1 2840250378544
def f():
a = 2
print(a, id(a)) # 2 2840250378576
f()
print(a, id(a)) # 1 2840250378544
修改变量
- 函数内部默认不能修改函数外部变量的引用,使用global关键字可以改变全局变量的引用(图中的箭头表示变量对数据的引用)
# 按照解析顺序,优先解析函数内部的变量a,并且两个a的数据不是同一个内存
a=1
print(a, id(a)) # 1 2036525394224
def f():
global a
a = 2
print(a, id(a)) # 2 2036525394256
f()
print(a, id(a)) # 2 2036525394256
- 函数内部可以修改外部可变类型的值
a = [1, 2, 3]
print(a, id(a)) # [1, 2, 3] 2949613382528
def f():
a[0] = 6
print(a, id(a)) # [6, 2, 3] 2949613382528
f()
print(a, id(a)) # [6, 2, 3] 2949613382528
函数嵌套
函数嵌套定义
嵌套定义使用较少,后面的装饰器会使用,一般不推荐这样用
def myMul(a, b, c):
def mySum():
# 嵌套函数可使用外部函数的局部变量,形参a,b,c也属于函数作用域的变量
return b + c
res = mySum()
return a * res
res = myMul(2, 4, 6)
print(res) # 20
换一种语法形式也行
def myMul(a, b, c):
def mySum(x, y): # 嵌套定义mySum
return b + c
res = mySum(b, c)
return a * res
res = myMul(2, 4, 6)
print(res) # 20
函数嵌套调用
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
函数执行流程
- 函数定义:只执行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
```