参考 https://docs.python.org/zh-cn/3.9/tutorial/controlflow.html#defining-functions

语法格式

  1. # 定义函数
  2. def 函数名([可选参数]):
  3. ...
  4. [return]
  5. # 使用函数
  6. 函数名([可选参数])

函数的两个关键字 def return

  • def : 函数定义的关键字
  • return:函数的返回值关键字,如果不加return,默认返回None

不带参数

  1. def hello():
  2. print("Hello, I'm mf!")
  3. hello()

带参数

参数可以函数更灵活

  1. def hello(name):
  2. print("Hello, I'm {} !".format(name))
  3. hello('mf')

带返回值

  1. def mySum(a, b):#函数名
  2. return a+b
  3. res = mySum(1, 2) #调用函数
  4. print(res) # 3

函数与变量

解析变量

  • 局部作用域-》外部嵌套作用域-》全局作用域-》内建作用域

image.png

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

image.png

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

image.png

  1. # 按照解析顺序,优先解析函数内部的变量a,并且两个a的数据不是同一个内存
  2. a=1
  3. print(a, id(a)) # 1 2840250378544
  4. def f():
  5. a = 2
  6. print(a, id(a)) # 2 2840250378576
  7. f()
  8. print(a, id(a)) # 1 2840250378544

修改变量

  • 函数内部默认不能修改函数外部变量的引用,使用global关键字可以改变全局变量的引用(图中的箭头表示变量对数据的引用)

image.png
image.png

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

image.png
image.png

  1. a = [1, 2, 3]
  2. print(a, id(a)) # [1, 2, 3] 2949613382528
  3. def f():
  4. a[0] = 6
  5. print(a, id(a)) # [6, 2, 3] 2949613382528
  6. f()
  7. print(a, id(a)) # [6, 2, 3] 2949613382528

函数嵌套

函数中包含函数,函数中定义或调用其它函数

函数嵌套定义

嵌套定义使用较少,后面的装饰器会使用,一般不推荐这样用

  1. def myMul(a, b, c):
  2. def mySum():
  3. # 嵌套函数可使用外部函数的局部变量,形参a,b,c也属于函数作用域的变量
  4. return b + c
  5. res = mySum()
  6. return a * res
  7. res = myMul(2, 4, 6)
  8. print(res) # 20

换一种语法形式也行

  1. def myMul(a, b, c):
  2. def mySum(x, y): # 嵌套定义mySum
  3. return b + c
  4. res = mySum(b, c)
  5. return a * res
  6. res = myMul(2, 4, 6)
  7. print(res) # 20

函数嵌套调用

  1. def mySum(x, y):
  2. return x + y
  3. def myMul(a, b, c):
  4. res = mySum(b, c) # 嵌套调用mySum
  5. return a * res
  6. res = myMul(2, 4, 6)
  7. print(res) # 20

函数执行流程

  • 函数定义:只执行def这一行
  • 函数调用:进入被调用的函数,被调用的函数执行结束后,返回到被调用的地方

image.png
解析:

  1. 函数定义,只执行第1行
  2. 函数定义,执行第5行
  3. 执行第9行,此时调用函数myMul,进入函数定义代码:第1行
  4. 函数mySum执行结束后,返回到被调用的地方:第6行
  5. 执行第7行,函数myMul调用结束后,返回到被调用的地方:第9行
  6. 执行第10行
  7. 程序执行完毕,程序退出

    函数生命周期

    函数执行时,单独开辟一块空间,函数调用结束后,清除这块空间 ```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 ``` image.png
image.png
image.png
image.png