函数
![]()
函数的定义与调用
# !!!函数一定要先定义再调用!!!
# 1. 函数一定要遵循先定义后调用的原则
使用一个工具之前这个工具一定要存在,所以函数调用其那一定要先定义
# 2. 函数再定义阶段只检测语法不执行代码
定义函数时如果代码中由错误,python不会报错,只有函数被调用了,才会报错,如果定义的时候语法有问题,还是会报错滴!
# 3. 函数体代码只有函数被调用的时候才会执行
调用方式:函数名加括号,有参数的要在括号里传递参数
# 4. 函数名其实相当于变量名,指向的是内存中函数体代码的位置
def func(): # 定义函数,这是一个无参函数
print('hello world') # 函数体代码,这里写要实现的功能
func() # 调用函数,如果放在def func():上面会报错
函数的分类
1. 内置函数
python解释器提前定义好的函数,我们需要用时直接调用即可
eg:len,print,input...
2. 自定义函数
程序员为了实现某些功能自己编写的函数
2.1 无参函数
2.2 有参函数
2.3 空函数
# 无参函数
eg:
def func():
print('hello world')
# 调用无参函数直接函数名加括号就可以,括号内无序传参
# 有参函数
eg:
def func(a):
print('hello world')
# 定义函数的括号内有参数,在调用这类函数是,必须要在括号内给参数传值,且必须要与定义时的参数一一对应
eg:
func(1)
# 空函数
eg:
def func():
pass
# 空函数是指没有函数体代码的函数,函数体代码用pass代替,这类函数主要用于项目框架的搭建,等到需要用到这个函数的时候再向里面填充函数体代码
函数的返回值
# 函数的返回值是调用函数之后返回的结果,可以理解为你让别人帮你加工东西,人家加工好了给你的东西
eg:
def func(num):
return num+1
num1 = func(2) # 将函数func的返回值赋值给num1(接收返回值)
print(num1)
运行结果:
3
# 如何获取函数的返回值
'''变量名 = 函数调用'''
# 如何操作返回值
1. 当函数体代码没有return关键字时,返回值为None
eg:
def func():
print('程序猿伞兵一号')
res = func()
print(res)
运行结果:
程序猿伞兵一号
None
2. 当函数体代码写了return关键字,但没有跟任何值的时候,返回值也是None
eg:
def func():
print('程序猿伞兵一号')
return
print(func())
运行结果:
程序猿伞兵一号
None
3. 当函数体代码写了return关键字并且后面跟了值,那么值是什么就返回什么
eg:
def func():
print('程序猿伞兵一号')
return '程序猿伞兵一号'
print(func())
运行结果:
程序猿伞兵一号
程序猿伞兵一号
4. return后面可以跟多个值,用逗号隔开,会自动组成元组返回
eg:
def func():
print('程序猿伞兵一号')
return '程序猿伞兵一号',123,456
print(func())
运行结果:
程序猿伞兵一号
('程序猿伞兵一号',123,456)
5. 函数体代码遇到return会立即结束函数运行,其功能类似于循环里的break关键字
eg:
def func():
print('程序猿伞兵一号')
return 1
print('程序猿伞兵二号')
print(func)
运行结果:
程序猿伞兵一号
1
![]()
函数的参数(重点)
##########################################################
1. 函数的参数可以分为两大类
1.1 形式参数(形参)
函数在定义阶段括号内写的参数
相当于你去要铁匠铺打把锄头,铁匠给你列的要准备的原材料单子
1.2 实际参数(实参)
函数在调用阶段括号内写的参数
相当于你把材料准备好了交给铁匠的那个材料
2. 形参与实参的关系
形参相当于变量名,实参相当于变量值
在函数调用的时候传入实参,会与形参临时绑定
函数体代码执行时,通过形参的名字调用我们传入的实参值
函数运行结束后形参与实参自动解除绑定
##########################################################
eg:
def func(a, b): # a,b就是形参
print(a+b)
func(1, 2) # 1,2就是实参
运行结果:
3
变量a会临时指向1,变量b会临时指向2
函数运行时,函数体代码可以通过a,b两个变量名获取实参1,2
函数运行结束后解除a,b和1,2的绑定
形参ab处于没有绑定值得状态 等待下一次函数调用传入实参进行绑定
可以通过变量名给函数传参
eg:
def func(a, b):
print(a+b)
m = 1
n = 2
func(m, n)
运行结果:
3
位置参数
位置形参
在函数定义的时候,按照从左到右的顺序依次填写变量名
def func(a, b): # a,b就是位置形参
pass
位置实参
在函数调用的时候,按照从左到右的顺序依次填写真实数据
func(1,2) # 1,2就是位置实参,1赋值给a,2赋值给b
位置参数的特征
1. 位置形参与位置实参在绑定的时候都是按照从左到右的顺序依次绑定
2. 位置形参与位置实参的个数要一致,否则会报错
eg:
def func(a, b):
print(a, b)
# func() # 不传参,报错
# func(a) # 少传参,报错
# func(1,2) # 输出1 2
# func(1,2,3) # 多传参,报错
![]()
关键字参数
出现在实参中
和变量赋值的操作一样,不需要遵循位置顺序
eg:
def func(a, b):
print(a, b)
func(a = 1, b = 2) # 指名道姓把1给a,2给b
func(b = 2, a = 1) # 顺序不会报错,也不会影响传参
func(b = 2, 1) # 报错,关键字参数必须跟在位置参数后面
func(2, a = 1) # 报错,这里给a赋值了两次
运行结果:
1 2
1 2
默认参数
出现在形参中
函数定义阶段就给定一个默认值
调用函数时如果不传参数则使用默认值,传入了则使用传入的
默认参数可以不传参
默认参数必须定义在位置参数后面
eg:
def func(name,age,gender = '男'):
print(name,age,gender)
func('petter',18)
func('annie',18,'女')
运行结果:
petter 18 男
annie 18 女
'''默认参数多用于值有一定选择性的数据'''
![]()
可变长参数(重点)
可变长参数可以实现在函数调用阶段,无论传入多少值,函数都可以正常执行
'''
* 和 **
'''
*号:用于接收多余位置参数,并组织成元组的形式赋值给*后面的变量名
eg:
def func(a,b,*args):
print(a,b,args)
func() # 报错,a,b两个位置参数必须要传值
func(1,2) # 输出1 2 ()
func(1,2,3,4,5,6) # 输出 1 2 (3,4,5,6)
**号:用于接收多余的关键字参数,并组织成字典的形式赋值给**后面的变量名
eg:
def func(**kwargs):
print(kwargs)
func() # 输出{}
func(a = 1, b = 2, name = 'petter') # 输出{'a':1,'b':2,'name':'petter'}
# 当定义函数时括号里有其他参数,其他参数必须传值
可变长形参
eg:
def func(*args,**kwargs):
print(args, kwargs)
func(1,2,3,4,a = 1, b = 2, c = 3)
运行结果:
(1,2,3,4){'a':1,'b':2,'c':3}
# 以后在定义函数时,如果不确定要传多少参数,直接把两个可变长参数写上就可以了,python中,这个两个可变长参数有推荐命名,即*args和**kwargs
补充说明(重要)
*和**不止可以在形参中使用,也可以在实参中使用起作用是把元组和字典拆分成一个个的元素然后传入函数
eg:
def func(*args,**kwargs):
print(args, kwargs)
t1 = (1,2,3,4,5,6)
dict1 = {'a':1,'b':2,'c':3}
func(t1,dict1)
func(*t1,**dict1)
运行结果:
((1, 2, 3, 4, 5, 6), {'a': 1, 'b': 2, 'c': 3}) {}
(1, 2, 3, 4, 5, 6) {'a': 1, 'b': 2, 'c': 3}
# 如果不使用*和**,会把元组和字典当成一整个元素传进去
![]()