python函数之参数介绍
1. 函数基本介绍
1.1 定义
函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码。
1.2 语法
语法
def 函数名([形参1,形参2,形参3....]):
代码块
注意:
函数名必须符合标识符的规范(可以包含字母、数字、下划线但是不能以数字开头)
print是函数对象 print()是调用函数
1.3 特点
- 函数也是一个对象
- 函数用来保存一些可执行的代码,并且可以在需要时,对这些语句进行多次调用
- 函数可以提前保存起来,并给它起一个独一无二的名字,只要知道它的名字就能使用这段代码。函数还可以接收数据,并根据数据的不同做出不同的操作,最后再把处理结果反馈给我们。
print(fn) # fn是对象,打印fn,是指向<function fn at 0x000001F66A764168>
print(fn()) # hello,world ! None(无返回值,所以未None)
fn() # 结果:hello,world !
2.函数参数
2.1 函数的形参和实参
- 形参:即形式参数,形式上的参数,可以理解为数学的X,没有实际的值,通过别人赋值后才有意义,相当于变量。
- 实参:即实际参数,实际意义上的参数,是一个实际存在的参数,即在调用函数时提供的值或者变量,可以是字符串或是数字等。
- 在调用函数时必须传递实参,实参将会赋值给对应的形参,简单来说有几个形参就要有几个实参
#在调用函数时必须传递实参,实参将会赋值给对应的形参,简单来说有几个形参就要有几个实参
# 1,2是实际参数
result = add(1,2)
print(result) # 3
2.2 函数参数的传递方式
- 定义形参时,可以为形参指定默认值。指定了默认值以后,如果用户传递了参数则默认值不会生效。如果用户没有传递,则默认值就会生效
# 定义形参时,可以为形参指定默认值
# 指定了默认值以后,如果用户传递了参数默认值不会生效
# 如果用户没有传递参数,默认值则生效
def num(a=5,b=6):
print('a =',a,'b =',b)
result = a + b
print(result)
num() # 结果为: a = 5 b = 6 11
num(6,7) # 结果为:a = 6 b = 7 13
- 位置参数:位置参数就是将对应位置的实参赋值给对应位置的形参
- 关键字参数 : 关键字参数可以不按照形参定义的顺序去传递,而根据参数名进行传递
- 混合使用位置参数和关键字参数的时候必须将位置参数写到关键字参数前面去
def num(a=6,b=7):
print('a =',a,'b =',b)
result = a + b
print(result)
num(7,8) # 结果为:a = 7 b = 8 15 # 位置参数传参
num(b=10,a=8) # 结果为:a = 8 b = 10 15 # 关键字参数传参
num(10,b=10) # 结果为: a = 10 b = 10 20
# num(b=12,10) # 报错:位置参数需在关键字参数前面,positional argument follows keyword argument
2.3 不定长参数
2.3.1 *不定长参数
- 定义函数时,在形参前面加一个*,这样这个形参可以获取到所有的实参,它会将所有的实参保存到一个元组中
- 带*号的形参只能有一个,可以和其他参数配合使用
*形参只能接受位置参数,不能接受关键字参数
- 不定长参数只能以位置参数形式传递
'''
定义一个函数求任意个数的和
在定义函数的时候,可以在形参前面加上一个*,这样这个形参可以获取到所有的实参
它会将所有实参保存到一个元组中
'''
def fn(*a):
print('a =',a,type(a))
fn(*a = 1) # 报错:SyntaxError: invalid syntax *不定长参数只能传递位置参数
fn(1,2,3,4,5) # 结果为: a = (1, 2, 3, 4, 5) <class 'tuple'>
def s(*a):
# 定义一个变量 保存结果
result = 0
# 遍历元组,将元组中的元素进行累加
for r in a:
result += r
print(result)
s(12,560) # 结果为:572
def fn(a,b,*c):
print(a)
print(b)
print(c)
print(*c)
fn(1,2,3,4,5) #结果为 1 2 (3, 4, 5) 3 4 5
- 不定长参数不一定都要写在后面,但是注意 带*的参数后面的所有参数,必须以关键字形式来传递
- 带*号的参数只能有一个
- 位置参数在关键字参数前面
'''
不定长参数不一定都要写在后面,但是注意 带*的参数后面的所有参数,必须以关键字形式来传递
带*号的参数只能有一个
位置参数在关键字参数前面
'''
def fn2(a,*b,*c):
print('a =', a)
print('b =', b)
print('c =', c)
fn2(1,2,3,4) # 报错: SyntaxError: invalid syntax
def fn2(a,*b,c):
print('a =', a)
print('b =', b)
print('c =', c)
# fn2(1,2,3,4) # 报错: fn2() missing 1 required keyword-only argument: 'c'
# fn2(a=1,2,3,c=4) # 报错:positional argument follows keyword argument
fn2(1,2,3,c=4) # 结果:a = 1 b = (2, 3) c = 4
def fn2(*a,b,c):
print('a =', a)
print('b =', b)
print('c =', c)
# fn2(1,2,3,4) # 报错: fn2() missing 1 required keyword-only argument: 'c'
# fn2(a=1,2,3,c=4) # 报错:positional argument follows keyword argument
# fn2(1,2,3,c=4) # 报错 :fn2() missing 1 required keyword-only argument: 'b'
fn2(1,2,b=3,c=4) # a = (1, 2) b = 3 c = 4
2.3.2 **不定长参数
- **形参可以接收其他的关键字参数,它会将这些参数统一保存到字典当中。字典的key就是参数的名字,字典的value就是参数的值
- **形参只有一个,并且必须写在所有参数的后面(同于位置参数和关键字参数的摆放位置)
'''
**的形参可以接收其他的关键字参数 它会将这些参数统一保存到字典当中
字典的key就是参数的名字,字典的value就是参数的值
**形参只能有一个,并且必须写在所有参数后面
*a 处理的是位置参数 **a 是处理的是关键字参数
'''
def fn3(**a):
print('a =', a)
fn3(b=2,d=1,c=3)
def fn4(a,b,**c):
print('a =', a)
print('b=',b)
print('c=',c)
print('*c=',*c)
fn4(1.2,b=2,d=1,c=3)
'''
输出结果为:
a = {'b': 2, 'd': 1, 'c': 3}
a = 1.2
b= 2
c= {'d': 1, 'c': 3}
*c= d c
'''
2.4 参数的解包
- 传递实参时,也可以在序列类型的参数前添加星号,这样它会自动的将序列中元素依次作为参数传递
- 要求序列中的元素的个数必须和形参的个数一致
'''
- 传递实参时,也可以在序列类型的参数前添加星号,这样它会自动的将序列中元素依次作为参数传递
- 要求序列中的元素的个数必须和形参的个数一致
'''
def fn(a,b,c):
print(a,b,c)
list1 = [1,2,3]
dict = {'a':1,'b':2,'c':3}
fn(*list1) # 结果: 1 2 3
fn(**dict) # 结果: 1 2 3