Python之函数(上)
1. 函数简介
- 函数:把具有独立功能的代码块组成一个对象模块,可以对这个模块进行多次调用,函数也是一个对象。
语法:
def 函数名([形参1,形参2,形参3.....]):
代码块
注意:
函数名必须符合标识符的规范 print是函数对数 print()是调用函数
2. 函数的参数
2.1 形参和实参
- 形参就是形式上的参数,没有实际的值,通过别人赋值后才有意义。相当于变量。
- 实参就是实际意义上的参数,是一个实际存在的参数,指定了形参,在调用函数时必须传递参数,实参将会赋值给对应的形参,简单来说有几个形参就有几个实参。
2.2 函数的传递方式
- 定义形参时可以为形参指定默认值。指定了默认值之后,如果用户传递了参数则默认值不会生效。如果用户没有传递参数则默认值就会生效
- 位置参数:位置参数就是将对应位置的实参赋值给对应位置的形参。基于实参的顺序。
def fn(a,b):
print('我的名字是',a)
print('我喜欢吃的水果是',b)
fn('张三','香蕉')
执行结果:
我的名字是 张三
我喜欢吃的水果是 香蕉
实参与形参的位置要对应不能颠倒:
def fn(a,b):
print('我的名字是',a)
print('我喜欢吃的水果是',b)
fn('香蕉','张三')
执行结果:
我的名字是 香蕉
我喜欢吃的水果是 张三
a和b是形参,张三和香蕉是实参,形参a对应的位置是实参张三,形参b对应的位置是实参香蕉,这就是位置传参。
- 关键字参数:关键字参数是根据参数名进⾏传递的。
def fn(a, b):
print('我的名字是',a)
print('我喜欢吃的水果是',b)
fn(b='香蕉',a='张三')
执行结果:
我的名字是 张三
我喜欢吃的水果是 香蕉
-
混合使⽤位置参数和关键字参数的时候必须将位置参数写到关键字参数前⾯去
-
位置参数在关键字参数之前
def fn(a, b, c): print('a=', a) print('b=', b) print('c=', c) fn(1,2,c=20)
执行结果:
a= 1 b= 2 c= 20
-
关键字参数在位置参数之前
def fn(a, b, c): print('a=', a) print('b=', b) print('c=', c) fn(c=20,1,2)
执行结果:
SyntaxError: positional argument follows keyword argument
** 为什么?**
解释:函数中有形参和实参,有两种传递方式:位置传参和关键字传参,两者可以混合使用,但是关键字传参要在位置传参后面。 -
3. 不定长参数
-
定义函数时,可以在形参前⾯加⼀个*,这样这个形参可以获取到所有的实参,它会将所有的实参保存到⼀个元组中
def fn(a, *b, c): print('a=', a) print('b=', b) print('c=', c) fn(1,2,3,4,c=5)
执行结果:
a= 1 b= (2, 3, 4) c= 5
-
带*号的形参只能有⼀个,可以和其他参数配合使⽤
-
*形参只能接受位置参数,不能接受关键字参数
def fn(*b): print('b=',b) fn(b=1,d=2,c=3)
执行结果:
TypeError: fn3() got an unexpected keyword argument 'b'
-
**形参可以接收其他的关键字参数,它会将这些参数统⼀保存到字典当中。字典的key就是参数的名字,字典的value就是参数的值
def fn(**b): print('b=',b) fn(b=1,d=2,c=3)
执行结果:
b= {'b': 1, 'd': 2, 'c': 3}
-
**形参只有⼀个,并且必须写在所有参数的后⾯
4. 参数的解包
-
传递实参时,也可以在序列类型的参数前添加星号,这样它会⾃动的将序列中元素依次作为参数传递
-
要求序列中的元素的个数必须和形参的个数⼀致
-
当传递位置参数时:
def fn3(a, b, c): print('a=', a) print('b=', b) print('c=', c) t=(1,2,3) fn3(*t)
执行结果:
a= 1 b= 2 c= 3
-
当传递关键字参数时:
def fn3(a, b, c): print('a=', a) print('b=', b) print('c=', c) d={'b':2,'c':3,'a':1} fn3(**d)
执行结果:
a= 1 b= 2 c= 3
-