2022.10.09 周日
函数
1.函数的参数
- 位置参数 ——根据调用函数的时候实参的提供方法不同来分类的
- 位置参数:以;‘数据1,数据2,数据3…‘形式存在,通过位置来和形参一一对应
- 关键字参数:数据1,数据2,形参3 = 数据3,……‘形式存在(交换关键字参数的顺序不影响结果)
注意 位置参数和关键字可以一起使用,但是位置参数必须放在关键字参数前面
不管以什么样的形式传参,都必须保证每个参数都有值
- 关键字参数
2.参数默认值
在定义函数的时候,可以以 ‘形参=数据’ 的方式给参数赋默认值;
调用函数的时候有默认值的参数可以不用传参
注意 定义函数的时候如果有的参数有默认值有的没有,没有默认值的参数必须在有默认值参数的前面
3.参数类型说明 ——可以让形参在函数体中使用的时候有相关的提示
def func1(a: list, b = 'abc')
pass
func1() # 会提示a是列表,b是字符串
- 没有默认值的参数直接在参数名后加 ’ :类型名‘
- 有默认值的参数默认值的类型就是说明的类型
- 补充:通过类型注释对变量进行类型说明
list1 = [
{'a': 10, 'b': 20},
{'a': 100, 'b': 'abc'}
]
c = list1[-1]['b'] # type: str
4.不定长参数(了解) ——参数个数不确定
1.带*的不定长参数:在定义函数的时候在某个参数前加 * ,就可以让这个参数同时接受多个实参
def func2(name,age,*score):
pass
func2('小明',18,89)
func2('小明',18,89,80,72,61) ->89,80,72,61为给score的传递的参数
带 * 的不定长参数的本质是一个元祖,它接收到的所有的实参会成为这个元祖的元素
带 * 的不定长参数只能用位置参数传参
带 * 的不定长参数前面的定长参数也只能用位置参数
带 * 的不定长参数后面的定长参数只能使用关键字参数传参
def func3(*nums):
pass
func3(10,20,30,564,28)
def func4(x, y, *nums):
pass
func4(10,20,30,56,54) ->
def func5(*nums, x, y):
pass
func5(51,21,x = 10, y = 20)
def func6(a, * , b)
pass
func6()
形参列表中如果单独出现一个 * ,它的目的只是想要在调用这个函数的时候 * 后面的参数必须使用关键字参数,* 前面的参数必须使用位置参数
2.带**的不定长参数 ——定义函数的时候在某个参数前加 * *,就可以让这个参数同时接收多个实参(只能是关键字参数)
def fun7(**x):
pass
func7()
func7(a = 10)
func7(a = 10,b = 20, c = 30)
# *args,**kwargs存在的目的是为了让这个函数在调用的时候可以足够灵活(既可以使用不定个数位置参数,也可以使用不定个数关键字参数,位置参数和关键字参数还可以一起使用)
def func8(*args,**kwargs):
pass
func8(10,20)
func8(k = 100, t = 400)
func8(10,20,a = 10, b = 20, c = 30)
带 ** 的不定长参数的本质是一个字典,它接收到的所有的关键字参数会成为这个字典的元素
5.函数的返回值
初学者使用返回值的建议:只要实现函数的功能
1.什么是返回值——就是从函数内部传递到函数外部的数据,每个函数只能传一个数据到函数外部
- 在函数内部怎么确定函数返回值
在函数体实现函数功能的时候,可以在任何需要的地方(一般在最后)通过return关键字,将需要传递到函数外部的数据作为返回值返回
return使用方法: return 需要返回的数据
注意:
return除了可以返回数据,还会提前结束函数(执行函数体的时候只要遇到return整个函数直接结束)
如果执行函数体的时候没有遇到return,这个函数的返回值就是None
# 案例:定义函数求任意两个数的和
def sum2(num1, num2):
return num1 + num2
# 案例:定义函数求任意两个数的和以及乘积
def sum3(num1, num2)
return num1 + num2, num1 * num2 # 不能使用两次return,否则没意义
- 在函数外部怎么使用函数返回值
使用函数调用表达式的值就是使用函数的返回值(函数调用表达式有结果,这个结果就是这次调用函数的时候获得的返回值)
返回值能做的事情,函数调用表达式都可以做
6.变量作用域
根据变量作用域(可适用范围)不同,可以将变量分为全局变量和局部变量两种
-
全局变量 ——没有定义在函数或者类中的变量
全局变量的作用域是从定义开始到程序结束
-
局部变量 ——定义在函数中的变量
局部变量的作用域是从定义开始到函数结束(形参是局部变量)
# m和n都是局部变量 def func1(m): n = 100 print(f'在函数里面使用m和n:{m},{n}') func1(3) print(f'在函数外面使用m和n: {m},{n}') # 报错
-
关键字global
如果想要在函数里面定义一个全局变量或者修改一个全局变量的值,需要在函数中使用这个变量前加global进行说明
def func2():
num = 20
print(f'函数内部:{num}')
global name
name = '小明'
func2()
print(f'函数外部:{num}') # num在外部不能用
print(f'函数外部:{name}') # name在外部可以使用