函数简介
【print()】输出函数,【str()】等类型转换函数等等。这些其实都是Python的内置函数,也就是Python语言本身就提供的。
比如:当你饿了的时候,喊了一嗓子:"妈,我饿了,给我做个饭吧!"这就是非常典型的「函数的调用」。妈妈是提供了做饭的函数,而我们调用了这个函数。而做饭的这个函数其实就是一系列加油盐,翻炒动作的封装。
函数的定义
语法:
def func(形参,形参,形参...):
代码块
含义:def为声明函数的关键字,然后空格 + 函数名 + 英文冒号;之后换行 + 缩进,然后编写代码
函数名的定义与标识符相同,可参考:
https://blog.csdn.net/xdc1812547560/article/details/107193496
例子:
def cook():
print('妈妈正在做饭!')
函数的使用
函数的调用
语法:cook(实参,实参,实参...)
调用函数
定义函数运行并不能看到结果,因为仅仅是定义了,并未去调用,打个比方,给小明取名为小明,但是没有人去叫小明这个名字,那么就没有起到实质性作用
函数调用方法:函数名()
def cook():
print('妈妈正在做饭!')
cook() #调用函数
结果:
妈妈正在做饭!
含义:声明了函数cook,通过cook()调用函数,在终端输出妈妈正在做饭!
函数传参
语法:
def func(形参):
代码块
调用函数:
func(实参)
含义:声明函数时,在括号中定义需要传入的参数,调用函数时就必须传入参数
例子:
def cook(food):
print('妈妈正在做' + food)
cook('火锅')
妈妈正在做火锅
声明函数cook时在括号中定义了一个参数food,在通过函数名调用该函数时就必须传入一个参数cook(‘火锅’)
位置参数
例子:
声明函数,需要传入三个参数
def func(name, age, gender):
print('名字:', name)
print('年龄:', age)
print('性别:', gender)
调用函数
func('张三', '20', '男')
结果:
名字: 张三
年龄: 20
性别: 男
含义:调用函数时传入三个参数,根据参数的顺序依次传入:name–‘张三’、age–‘20’、gender–‘男’
参数位置混乱例子:
声明函数,需要传入三个参数
def func(name, age, gender):
print('名字:', name)
print('年龄:', age)
print('性别:', gender)
调用函数
func('20', '男', '张三')
结果:
名字: 20
年龄: 男
性别: 张三
可以看到,位置传参时必须对应好参数的位置,否则就会出错
关键字参数
语法:func(参数1=‘值1’, 参数2=‘值2’)
例子:
声明函数,需要传入三个参数
def func(name, age, gender):
print('名字:', name)
print('年龄:', age)
print('性别:', gender)
调用函数
func(age='20', gender='男', name='张三')
结果:
名字: 张三
年龄: 20
性别: 男
含义:为每个参数指定传入的值,不用去管参数的位置
默认参数
调用函数时未按要求传入参数程序会报错:
声明函数,需要传入对应数量参数
在这里我们设定了三个形参,但是调用时只传入两个实参
def func(name, age, gender):
print('名字:', name)
print('年龄:', age)
print('性别:', gender)
调用函数
func(name='张三', age='20') #只传入name与age的参数,不传gender
结果
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-6-d26d9c8520b8> in <module>
----> 1 func(name='张三', age='20') #这里由于传入参数未按要求,所以报错
TypeError: func() missing 1 required positional argument: 'gender'
报错翻译为:TypeError: 缺少1个必需的位置参数:'gender'
设置默认参数语法:
def func(name, age, gender='男'):
代码块
这里为gender设置了默认参数'男',在调用函数时不传入gender参数时默认就为'男'
例子:
下面我们继续只传入两个实参,但是在形参这里定义好了gender的默认值
def func(name, age, gender='男'): #定义gender的默认参数
print('名字:', name)
print('年龄:', age)
print('性别:', gender)
调用函数
func(name='张三', age='20')
名字: 张三
年龄: 20
性别: 男
当一个参数不是必须传入时,就可以使用默认参数给定默认值
但如果调用函数时指定了参数,则默认参数不生效
可以将所有的形参设定默认值,这样即使不传入实参内容,函数依然可以顺利运行
例子:
调用函数
func(name='张三', age='20',gender='女')
名字: 张三
年龄: 20
性别: 女
关键字传参,位置传参,默认传参可以混合使用,但是混合使用时,位置参数必须写道前面,否则报错
不定长参数
上面我们说了当实参传递数少于形参传递数的方法,但是实参传递数多于形参数怎么办呢?
不定长参数
可以完美解决两种问题
当实参传递数与形参数不同时,可以用不定长参数解决
比如:
def num(a,b):
print(a+b)
num(200,300,400)
由于形参数与实参数不同,所以报错
TypeError: num() takes 2 positional arguments but 3 were given
在定义函数的时候,可以在形参的前面加上一个 *
,这样这个形参将会获取到所有实参
它将会把这些实参保存到一个元组当中
- *形参只能接受位置参数,不能接受关键字参数
def num(*a):
print(a)
num(200,300,400)
(200, 300, 400)
- 带
*
号的形参只能有⼀个,可以和其他参数配合使⽤
例一:
def num(*a,b):
print(a,b)
num(200,300,500,b=30)
(200, 300, 500) 30
例二:
def num(a,*b):
print(a,b)
num(200,300,500,30)
200 (300, 500, 30)
**
形参可以接收其他的关键字参数,它会将这些参数统⼀保存到字典当中。字 典的key就是参数的名字,字典的value就是参数的值**
形参只有⼀个,并且必须写在所有参数的后⾯
def num(b,**a):
print(a,b)
num(a=1,b=2,c=3)
{'a': 1, 'c': 3} 2
参数解包
参数解包即与序列解包配合,用来将元组内的值传给函数来作为参数
- 传递实参时,也可以在序列类型的参数前添加星号,这样它会⾃动的将序列 中元素依次作为参数传递
- 要求序列中的元素的个数必须和形参的个数⼀致
元组参数解包例:
def num(a,b,c):
print('a=',a)
print('b=',b)
print('c=',c)
t = (1,2,3) #定义一个元组
num(t[0],t[1],t[2]) #参数解包
a= 1
b= 2
c= 3
字典参数解包例::
def num(a,b,c):
print('a=',a)
print('b=',b)
print('c=',c)
t = {'a':1,'b':2,'c':3} #定义一个字典
num(**t)
a= 1
b= 2
c= 3