函数简介
【print()】输出函数,【str()】等类型转换函数等等。这些其实都是Python的内置函数,也就是Python语言本身就提供的。
比如:当你饿了的时候,喊了一嗓子:"妈,我饿了,给我做个饭吧!"这就是非常典型的「函数的调用」。妈妈是提供了做饭的函数,而我们调用了这个函数。而做饭的这个函数其实就是一系列加油盐,翻炒动作的封装。
函数的定义
语法:
def func(形参,形参,形参...):
代码块
含义:def为声明函数的关键字,然后空格 + 函数名 + 英文冒号;之后换行 + 缩进,然后编写代码
函数名的定义与标识符相同,可参考:
https://blog.csdn.net/xdc1812547560/article/details/107193496
例子:
def cook():
print('妈妈正在做饭!')
函数的使用
函数的调用
语法:
调用函数
函数调用方法:函数名()
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')
---------------------------------------------------------------------------
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参数时默认就为'男'
例子:
声明函数,需要传入三个参数
def func(name, age, gender='男'):
print('名字:', name)
print('年龄:', age)
print('性别:', gender)
调用函数
func(name='张三', age='20')
名字: 张三
年龄: 20
性别: 男
当一个参数不是必须传入时,就可以使用默认参数给定默认值
但如果调用函数时指定了参数,则默认参数不生效
例子:
声明函数,需要传入三个参数
def func(name, age, gender='男'):
print('名字:', name)
print('年龄:', age)
print('性别:', gender)
调用函数
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