20220608 函数进阶学习总结
一·返回值
1.返回值 - 从函数内部传递到函数外部的数据
1)确定函数的返回值 - 怎么将函数内部的数据传递出去
执行函数体的时候遇到return,return后面的值就是函数的返回值。(需要将哪个数据从函数内部传递到函数外部,就将哪个数据放在return的后面)
2)怎么获取函数返回值
获取函数调用表达式的值,就是获取函数的返回值。(每一个函数调用函数表达式都有结果,结果就是这个函数的返回值)。
函数返回的值能做的事情,调用表达式都可以做。
函数调用表达式 - 调用函数的语句。
3)什么时候需要函数返回值
如果实现函数的功能产生了新的数据,就将新的数据作为返回值返回(而不是在函数内部打印这个数据)
二·return的作用
1.return - 函数体中的关键字
1)确定函数返回值
2)提前结束函数 - 在执行函数体的时候,什么时候遇到return,函数什么时候结束。
def func1():
return 100
def func2():
return #return None
func1()
func2()
def func3():
print('a')
print('hello sister!')
for x in range(3):
if x == 1:
return 100
print('d')
func3()
y = func3()
print(y)
三·变量的作用
1.变量的作用域 - 变量定义后可以使用的范围
根据变量作用域的不同,可以将变量分为全局变量和局部变量两种。
2.全局变量和局部变量
1)全局变量
python中没有定义在函数中或者类中的变量就是全局变量
全局变量的作用域:是从定义开始到程序结束
全局变量默认情况下保存在全局栈区间(全局栈区间在程序结束后才会自动释放)
2)局部变量
定义在函数中的变量是局部变量(形参在)
每次调用函数的时候都会自动为这个函数创建一个临时栈区间,这个函数中产生的所有数据,默认情况下都是保存在临时栈区间中的。
当函数调用的时候,这个临时栈区间会被自动释放(里面的数据都会被自动销毁)
#x和a是全局变量
a = 100
for x in range(3):
b = 200
print('函数外面:', a, x, b)
def func1():
print('函数外面:',a, x, b)
func1()
# c 和 d是局部变量:
def func2(c):
d = 300
print('函数里面', c, d)
func2(220)
# print('函数外面', c)#报错!,未被定义
# print('函数外面', d)#报错!,未被定义
3.global的用法
用法1:如果想要在函数中修改一个全局变量的值,就可以在函数中变量使用前用global对变量进行说明
用法2:在函数中定义全局变量,也可以使用global
m = 100
def func3():
# 在函数里面修改全局变量的值,不会修改成功,而是定义一个新的局部变量
m = 299
print('函数里面的m:',m)
global n
n = 299
print('函数里面的n:',n)
global t
t = 300
print('函数里面的t',t)
func3()
print('函数外面的m:',m)
print('函数外面的t:',t)
print('函数外面的n:',n)
四·参数
1.位置参数和关键字参数
根据实参提供方式的不同,将实参分为位置参数和关键字参数两种
1)位置参数:以’数据1,数据2,数据3,…'的形式存在,让实参对应的数据和营参对应的变量位置上一一对应
2)关键字参数:以’参数名1 = 数据1, 参数名2 = 数据2, 参数名3 = 数据3,…'的形式存在
注意:多个关键字参数可以随意交换位置,他不会影响形参和实参的对应关系。
3)混用:调用函数的时候,位置参数和关键字参数可以一起使用,但是位置参数必须放在关键字参数的前面
def func1(x, y, z):
print(f'x:{x}, y:{y}, z:{z}')
func1(100,200,300)
func1(200,100,300)
func1(x = 100, y = 200, z = 300)
func1(y = 200, x = 100, z = 300)
func1(100, z = 300 ,y =200)
func1(100, y =200, z = 300)
# func1(100, y =200, 300) #报错,位置参数必须在关键字参数的前面
2.参数默认值的问题
定义函数的时候,可以以’变量名=值’的形式,给形参赋默认值,已经默认值的参数,在调用函数的时候,可以不用传参
定义函数的时候,可以有的参数有默认有的参数没有默认值,但是没有默认的参数必须在有默认值的参数前面
def fun2(x = 10, y = 20, z = 30):
print(f'x:{x}, y:{y}, z:{z}')
fun2() #x:10, y:20, z:30
fun2(100) #x:100, y:20, z:30
fun2(100, 200) #x:100, y:200, z:30
fun2(100, 200, 300) #x:100, y:200, z:300
fun2(z = 500) #x:10, y:20, z:500
def func3(x, y, z = 3):
print(f'x:{x}, y:{y}, z:{z}')
def func4(x, y = 2, z = 3):
print(f'x:{x}, y:{y}, z:{z}')
# def func5(x, y = 2, z):
# print(f'x:{x}, y:{y}, z:{z}') #报错
3.参数类型说明
没有默认值的参数 - 形参名:类型名
有默认值的参数,默认值的类型就是对应的参数类型
def func6(str1 : str, str = ''):
pass
def func6(str1 : str, str = '') -> int:#提前告诉我们这个函数的返回值是一个整数。
pass
4.不定长参数
1)带的不定长参数:定义函数的时候在某个形参的前面加,那么这个参数就变成了一个不定长参数,一个不定长参数可以接受多个形参
本质:带一个*的不定长参数的本质就是一个元组,它接收到的所有的实参就是这个元组种的元素。
注意:*对应的不定长传参
案例1:定义一个函数,计算多个数的和
# sum2(19, 27, 79, 2, 67)
def sum2(sum):
pass
sum2(1)
# sum2(1, 2) #报错
def sum3(*num):
print('num:',num)
sum3()
sum3(10)
sum3(10, 20)
sum3(10, 20, 30)
def func(x, *y):
print(f'x:{x},y:{y}')
func(100)
func(10, 12)
func(10, 12, 30)
# 如果一个定长的参数放在一个不定长参数的后面,那么这个定长参数必须用关键字参数传参
def funcv(*x, y):
print(f'x:{x},y:{y}')
funcv(y = 10)
funcv(10, 29, 3, y = 300)
#单独的*后面的参数必须用关键字参数传参
def funcvv(x,* ,y):
print(f'x:{x},y:{y}')
funcvv(10, y = 0)
funcvv(x = 1, y = 111)