函数声明:理解为将一段可以重复使用的代码通过关键字def 包裹起来
格式:
def 函数名(参数列表): """ # 函数说明文档, params:参数 return:结果 """ #实现特定功能的多行代码 return (返回值) 函数名()
定义完函数后,函数是不会自动执行的,需要调用才可以。每次调用函数,函数都会从头开始执行,当这个函数中的代码执行到最后或遇到关键字return时,意味着调用结束。
def foo(): print("foo函数") #需要调用一个函数,这个函数必须先声明好了 foo()
debug模式运行:
#一个程序总,可以定义多个不同的函数,每一个函数都可以反复多次 #函数的声明 def bar(): print("bar1") print("bar2") print("bar3") # 函数的声明 def foo(): print("foo1") print("foo2") print("foo3") # 函数调用,一个函数可以调用多次,每次都是从第一行开始执行 foo() #函数调用 bar() #函数调用 foo() #函数调用
在函数定义阶段,括号内写的变量名叫做该函数的形式参数,简称形参。在函数调用阶段,括号内实际传入的值,叫做实际参数,简称实参。
形参就相当于变量名,而实参就相当于变量的值,函数调用传参的过程就是给形参变量名赋值的过程
函数参数只有在函数调用阶段有效,函数运行结束,参数作为垃圾被内存释放(也就是删除)
位置参数:有时也叫必备参数,指的是必须按照正确的顺序将实际参数传到函数中,换句话说,调用函数时传入实际参数的数量和位置都必须和定义函数时保持一致
默认参数:python允许参数设置默认值,即在定义函数时,直接给形式参数指定一个默认值。即便调用函数时没有给拥有默认值的形参传递参数,该参数可以直接使用定义函数时设置的默认值
# 当定义一个有默认值参数的函数时,有默认值的参数必须位于所有没默认值参数的后面,否则报错!
关键字参数:关键字参数可以避免牢记参数位置的麻烦,令函数的调用和参数传递更加灵活方便。关键字参数是指使用形式参数的名字来确定输入参数值。通过此方式指定函数实参时,不再需要与形参的位置完全一致,只要将参数名写正确即可。
# 使用位置参数和关键字参数混合传参的方式 需要注意,混合传参时关键字参数必须位于所有的位置参数之后
不定长参数:在函数定义中使用 args 和 **kwargs 传递可变长参数。args用作传递非命名键值可变长参数列表(位置参数) kwargs 用作传递键值可变长参数列表。 *args的参数会以元组的形式导入,存放所有未命名的变量参数。 **kwargs的参数会以字典的形式导入 不定长参数也叫收集参数。
注意点: 1.参数arg、args、**kwargs 三个参数的位置必须是一定的,必须是(arg、args、**kwargs)这个顺序,否则程序会报错
2.不定长参数的长度可以为零
3.args 和 kwargs 其实只是编程人员约定的变量名字,args 是arguments的缩写,表示位置参数,kwargs 是keyword ageuments 的缩写,表示关键字参数
默认返回值:函数中如果没有return语句或return后没有具体值,都默认返回None
返回多个值:return 也可以返回多个值,python其实会将多个值放在一个元组中 元组返回
作用域 LEGB
LEGB
字母 | 英语 | 释义 | 简称 | 作用空间 |
---|---|---|---|---|
L | Local(function) | 当前函数内的作用域 | 局部作用域 | 局部 |
E | Enclosing Functions Locals | 外部嵌套函数的作用域 | 嵌套作用域 | 局部 |
G | Global(module) | 函数外部所在的命名空间 | 全局作用域 | 全局 |
B | Built In(python) | Python内置模块的命名空间 | 内建作用域 | 内置 |
因为作用域的问题,按不同的作用域分为:局部变量与全局变量
局部变量:函数内部声明的变量。默认情况下,只有在函数运行时局部变量才会出现在内存中,当函数执行结束,内存中的局部变量就会被销毁,所以局部变量无法被当前函数以外的地方使用
全局变量:函数外部声明的变量,或者在函数内部显示声明为全局变量,默认在任意位置都可以使用,从被声明的位置开始,直到程序结束或者被del关键字删除
global
count = 1 def a(): count = 'a函数里面' def b(): global count # 告诉python,当前函数中使用的count,是顶级作用域的 print(count) count = 2 b() print(count) a() print(count)
nonlocal
count = 1
def a():
count = 'a函数里面'
def b():
nonlocal count # 告诉python,当前函数中使用的count,不是b作用域的而是,外部作用域的
print(count)
count = 2
b()
print(count)
a()
print(count)