函数的初识:
以功能为导向,一个函数就是一个功能。随调随用。
优点:
减少代码重复性。
增强代码的可读性。
函数的结构:
def function_name():
函数体
def: 关键字,定义函数
function_name(): 函数名,与变量名设置相同,具有可描述性。
函数体:要缩进。函数中尽量不要出现print()
函数的调用:
当解释器读到 function_name() 才会执行此函数,如果没有读到则不会执行里面代码
解释器读到一次便会执行一次。
函数的返回值:
return:
在函数中遇到return直接结束函数。将数据返回给函数的执行者、调用者。function_name()
如果return后面什么都不写,或函数中没有return,则返回None
return 返回单个值:
return value
# 值本身是什么类型值返回的就是什么类型的值
return 返回多个值:
return 'str',123,[l1,l2]
# 返回多个值是以元组的形式返回给函数的执行者。
# 可利用元组的拆包将每个元素赋值给多个变量。
函数的传参:
将一些数据传到函数里面,让里面的代码使用上这个数据产生我们想要的结果
格式:
function_name( 参数 )
参数分为形参和实参:
形参:
写在定义函数的位置的变量叫形参,形式上的一个完整。表示这个函数需要什么值
1.位置参数:
def func(name,age,hight):
return name,age,hight
func('李白',23,170)
2.默认参数:
设置的意义:普遍经常使用的值。
def func(name, age, hight=170):
return name, age, hight
print(func('李白',age=23))
实参:
在函数调用的时候给函数传递的值,实际执行的时候给函数传递的信息。
1.位置参数:
从左至右,按顺序一一对应
def func(name,age,hight):
return name,age,hight
func('李白',23,170)
2.关键字参数:
可以不按顺序,各个参数要一一对应。
def func(name,age,hight):
return name,age,hight
func(age=23,name='李白',hight=170)
3.混合传参:
既有位置参数也有关键字参数,位置参数一定要在关键字参数之前。
def func(name,age,hight):
return name,age,hight
func('李白',age=23,hight=170)
可变长参数:
函数定义时:
* 代表聚合。它将所有接收溢出的位置参数聚合成一个元组,赋值给args。
args:约定俗称
def func(*args):
return args
print(func(1,2,3,'a','b'))
# (1, 2, 3, 'a', 'b')
** 代表将所有接收溢出的关键字参数聚合到一个字典中,赋值给kwargs。
kwargs:约定俗称
def func(**kwargs):
return kwargs
print(func(a='libai',b=123))
# {'a': 'libai', 'b': 123}
# 组合使用:
def (a,b,*args,name='李白',**kwargs)
# *args用在位置参数之后,默认参数之前
# **kwargs用在默认参数之后
在函数调用时
*: 代表将一个可迭代对象拆分,每一个元素表示一个实参。
def func(*args):
print(args)
func('李白',['a','b',1,2,3])
# 未使用* ,('李白', ['a', 'b', 1, 2, 3])
func(*'李白',*['a','b',1,2,3])
# 使用* ,('李', '白', 'a', 'b', 1, 2, 3))
**:将字典里的每个键值对拆分,键表示每个型参,值表示实参
dic1 = {'name': '太白', 'age': 18}
dic2 = {'hobby': '喝茶', 'sex': '男'}
def func(**kwargs):
print(kwargs) # {'name': '太白', 'age': 18, 'hobby': '喝茶', 'sex': '男'}
func(**dic1,**dic2)
在函数外的用法:
# 接收溢出的值
a, *b = (1,2,3,4)
print(a,b)
# 1 [2,3,4]
*rest,a,b = range(5)
print(rest,a,b)
# [0,1,2] 3 4
print([1,2, *[3,4,5]])
# [1,2,3,4,5]
仅限关键字参数:
放在*args和**kwargs(如果有)之间,只能以关键字参数传值,且必须传值,否则会报错
def func(a,*args,b,**kwargs):
return a,args,b,kwargs
print(func(1,2,b=3,c=4,d=5))
# (1, (2,), 3, {'c': 4, 'd': 5})
# b 只接收相应的关键字参数,且必须传参
形参角度最终的顺序:
def func(位置参数,*args,默认参数,仅限关键字参数,**kwargs)
def func(a,b,*args,x=3,y,**kwargs):
return a,b,args,x,y,kwargs
print(func(1,2,3,4,x=5,y=6,z=8))
# (1, 2, (3, 4), 5, 6, {'z': 8})
三元表达式:
仅支持if else格式:
条件为真时的结果 if 判断条件 else 条件为假时的结果
# 判断两个数的大小
def func(a,b):
return a if a > b else b
print(func(3,4))
# 4