函数进阶
1.函数栈区间的神明周期
每次调用函数的时候,系统会自动为这个函数创建一个临时的栈区间,用来保存这个函数产生的数据。
当函数调用结束的时候,这个栈区间会自动释放,里面保存的数据也会自动销毁
def func1():
a = 100 # a是保存在func1对应的临时栈区间中的
func1()
# print(a) # NameError: name 'a' is not defined。 函数调用结束的时候func1对应的临时栈区间会自动释放,数据全部销毁
2.return的作用
2.1)确定函数返回值:
执行函数体的时候如果遇到return,return后面的值是函数返回值:没有遇到return返回值是None
2.2)提前结束函数:
执行函数体的时候如果遇到return,函数直接结束
def func2():
# return - 直接结束函数,返回是None
# return 100 - 返回一个返回值
# return 100, 200 # - 返回多个返回值
for x in range(100):
print('======')
return
print('end')
func2()
3.参数
3.1)位置参数和关键字参数:(根据实参提供方式的不同分类)
1)位置参数 — 调用函数的时候直接提供实参对应的数据,让实参和形参在位置上一一对应
2)关键字参数 — 调用函数的时候在实参前面加‘参数名=’。关键字参数在使用的时候可以随意交换位置
3)位置参数和关键字参数混用:位置参数必须在关键字参数的前面
def func1(a, b, c):
print(f'a:{
a}, b:{
b}, c:{
c}')
位置参数
func1(10, 20, 30) # a:10, b:20, c:30
func1(20, 10, 30) # a:20, b:10, c:30
关键字参数
func1(a=10, b=20, c=30) # a:10, b:20, c:30
func1(b=20, a=10, c=30) # a:10, b:20, c:30
func1(10, b=20, c=30)
func1(100, c=300, b=200)
func1(10, 20, c=30)
# func1(a=10, 20, 30) # SyntaxError: positional argument follows keyword argument
def func2(x, y):
print(f'x:{
x}, y:{
y}')
func2(100, 200)
3.2)参数默认值
定义函数的时候可以以‘形参=值’的方式给参数提供默认值
如果一个参数有默认值。那么调用函数的时候有默认值的参数可以不用传参
注意:如果定义函数的时候有的参数有默认值,有的参数没有,那么没有默认值的参数必须在有默认值的参数的前面。
def func3(a=10, b=20, c=30):
print(f'a:{
a}, b:{
b}, c:{
c}')
func3() # a:10, b:20, c:30
func3(100) # a:100, b:20, c:30
func3(100, 200) # a:100, b:200, c:30
func3(100, 200, 300) # a:100, b:200, c:300
func3(b=200) # a:10, b:200, c:30
# SyntaxError: non-default argument follows default argument
# def func4(a=10, b=20, c):
# print(f'a:{a}, b:{b}, c:{c}')
def func4(a, b=20, c=30):
print(f'a:{
a}, b:{
b}, c:{
c}')