- 位置参数和关键字参数
实参按照传递方式的不同分为位置参数和关键字参数两种
1)位置参数
调用函数的时候让实参和形参一一对应(第一个实参给第一个形参赋值,第二个实参给第二个形参赋值…)
格式:数据1, 数据2, 数据3, …
位置参数
func1(10, 20, 30) # x:10, y:20, z:30
func1(10, 30, 20) # x:10, y:30, z:20
2)关键字参数
让实参和形参通过关键字(形参名)对应
格式:形参名1=数据1,形参名2=数据2,…
关键字参数
func1(x=100, y=200, z=300) # x:100, y:200, z:300
func1(z=30, x=10, y=20) # x:10, y:20, z:30
# func1(x=100, y=200, y=300) # 报错!
3)关键参数和位置参数混用
混用的时候位置参数必须在关键字参数前面
*参数,指可以有多个参数
混用
func1(10, z=30, y=20) # x:10, y:20, z:30
# func1(x=20, 40, z=60) # 抱错!位置参数必须在关键字参数的前面
print(10, end='a')
print(10, 20, 30, sep=',')
def print(*data, end='\n', sep=' '):
pass
sorted([1, 23, 8], reverse=True)
- 参数默认值
定义函数的时候可以给以 ‘形参名=数据’ 的形式给参数赋默认值,调用函数的时候有默认值的参数可以不赋值
注意: 有默认值的参数必须在没有默认值参数的后面
def func2(x=1, y=10, z=100):
print(f'x:{x}, y:{y}, z:{z}')
func2(1, 2, 3) # x:1, y:2, z:3
func2(10, 20) # x:10, y:20, z:100
func2(10)
func2()
func2(y=200)
func2(z=300)
3.参数类型说明
定义函数的时候,可以对参数类型进行说明
- 赋默认值,默认值是什么类型,参数类型说明就是什么类型
- 形参名:数据类型
def func5(x: list) -> None:
x.append('100')
func5([])
4.不定长参数
在形参前加或者加**,就可以让这个参数变成不定长参数。不定长参数的形参可以同时接受多个实参
1)带的不定长参数
带*的参数会变成一个元组,元组中的元素就是对应的实参
注意:a. 一个函数可以同时存在带和不带的参数,如果不带的在带的后面,不带*的参数必须使用关键字参数
b.带/*的参数必须使用位置参数
2)带/**的不定长参数
带/**的不定长参数会变成一个字典;调用的时候用关键字参数传参,每个关键字就是字典的key,关键字后面的数据就是字典的value
注意:a.定义的时候定长参数必须放在/**不定长参数的前面
b.带/*和带/**的不定长参数可以同时存在,但是/*必须在/**前面。(如果同时存在可以让函数在调用的时候更加灵活)
def func6(*x):
print(f'x:{x}')
func6()
func6(10)
func6(10, 20)
func6(1, 2, 3, 4, 5)
# 练习:定义一个函数,可以求多个数的和
# sum1(10, 20) sum1(10, 20, 30)
def sum1(*num):
s = 0
for x in num:
s += x
print(s)
def func10(x, **y):
print(f'x:{x}, y:{y}')
func10(10, a=20, c=30, d=40) # x:10, y:{'a': 20, 'c': 30, 'd': 40}
func10(a=1, b=2, c=3, x=100) # x:100, y:{'a': 1, 'b': 2, 'c': 3}
def func8(*x, y):
print(f'x:{x}, y:{y}')
func8(1, 2, 3, y=10)