温馨提示:
本文仅限参考,因为每个人理解的函数意思都不一样。
python中函数定义:函数是逻辑结构化和过程化的一种编程方法
python中函数定义方法:
def test(x):
"The function definitions"
x+=1
return x
def:定义函数的关键字
test:函数名
():内可定义形参
"":文档描述(非必要,但是强烈建议为你的函数添加描述信息)
x+=1:泛指代码块或程序处理逻辑
return:定义返回值
调用运行:可以带参数也可以不带
函数名()
使用函数的好处:
1.代码重用
2.保持一致性,易维护
3.可扩展性
函数和过程:
过程定义:过程就是简单特殊没有返回值的函数
这么看来我们在讨论为何使用函数的的时候引入的函数,都没有返回值,没有返回值就是过程,没错,但是在python中有比较神奇的事情
def test01():
msg = 'hello The little green frog'
print (msg)
def test02():
msg = 'hello WuDaLang'
return msg
t1 = test01()
t2 = test02()
print ('from test01 return is [%s]' % t1)
print ('from test02 return is [%s]' % t2)
当一个函数/过程没有使用return显示的定义返回值时,python解释器会直接返回为None,所以在python中即便是过程也可以算作函数。
def test1():
pass
# 补充:
# pass:指空代码,无意义,仅仅用于表示代码块
def test02():
return 0,10,'hello',['alex','server'],{'sb':'lb'}
t1=test1()
t2=test2()
print ('from test1 return is [%s]: ' %type(t1),t1)
print ('from test2 return is [%s]: ' %type(t2),t2)
补充:
返回值数=0:返回None
返回值数=1:返回object
返回值数>1:返回tuple
函数参数:
形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传 送给形参。因此应预先用赋值,输入等办法使参数获得确定值
def text(x, y):
# 形参(x, y)
'''
:param x:整型数字
:return: 返回计算结果
'''
res = x ** y
return res
# 常量
text(2,3)
# 实参
a = 2
b = 3
c = text(a,b)
print(c)
一、位置参数
调用函数时根据函数定义的参数位置来传递参数
def text(x, y):
print(x)
print(y)
# 位置参数,实参与形参位置一一对应
text(1, 2)
二、关键字参数
位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序的
def text(x,y,z):
print(x)
print(y)
print(z)
# 关键字参数,位置无需固定
text(x=1,y=3,z=2)
三、位置参数与关键字参数混合使用
def test(x,y,z):
print(x)
print(y)
print(z)
# 位置参数一定要在关键字参数左边
test(1,y=2,z=3)
四、默认参数
'''
默认参数,为参数提供默认值,调用函数时可传可不传该默认参数的值
'''
# 位置参数一定要在默认参数左边否则报错
def handle(x, type="world"):
print(x)
print(type)
handle(x=1,type='type')
# 错误:错误的定义方式
# def handle(age=1,x):
# 错误: 注意不能这样写,type参数就变成位置参数了,没有什么意义了
# handle('hello',type)
五、可变参数
1、包裹位置参数
'''
*args将实参中按照位置传值,把多出来的值都给args,args收集起来,合并一个元祖(tuple)的方式呈现
'''
# 参数组(不固定长度参数):*列表 **字典
def text(x, *args):
print(x)
print(args)
# 以元组形式展示
text(1, 1, 2, 3)
2、包裹关键字参数
'''
**kwargs将实参按照关键字传值,把多余的值给kwargs,kwargs收集起来,合并一个字典(dict)的方式呈现
'''
# *args只能处理位置参数,关键字参数不能用*args,需要通过**kwargs来处理
test(1,y=2,z=3)
def test(x,**kwargs):
print(x)
print(kwargs)
# 以字典形式展示
test(1,y=2,z=3)
# 错误:z=3一个参数不能传两个值,否则报错
# test(1,y=2,z=3,z=3)
六、解包裹参数
*和**,也可以在函数调用的时候使用,称之为解包裹(unpacking)
1、在传递列表或字典时,让的每一个元素对应相应的位置参数
def test(x, *args):
print(x)
# 列表索引取值
print(args[0][0])
# 字典键值对取值
print(args[0]['y'])
# 转化
print(args)
# 列表
test(1, [1, 2, 3])
# 字典
test(1,{'y':'z'})
# 列如把列表或字典以元组的形式展示,只需要在列表或字典前面加上*
test(1,*[2,3,4,4])
test(1,*{'key':'value','key2':'value'})
2、在传递词典字典时,让词典的每个键值对作为一个关键字参数传递给函数
def test(x,**kwargs):
print(x)
# 通过索引取值
print(kwargs)
test(1,**{'key':'value'})
错误:需要在上**如果不加上**则报错
TypeError: test() takes 1 positional argument but 2 were given
七、*args与**kwargs混合使用
补充:def 函数名(x,**kwargs,*args)不能这样写,函数要按照python所支持规定来定义函数(def 函数名(x,*args,*kwargs))
def test(x,*args,**kwargs):
print(x)
# 通过索引取值
print(args,args[1])
# 通过字典的key取字典的value
print(kwargs,kwargs['key'])
# 通过get获取字典的value
print(kwargs,kwargs.get('key'))
test(1,*[1,2,3],**{'key':1})
八、位置参数、默认参数、可变参数的混合使用
基本原则:先位置参数,包裹位置,默认参数,包裹关键字(定义和调用都应遵循)
def func(x,*args,type='age',**kwargs):
print(x)
print(args)
print(type)
print(kwargs)
func(1,3,4,1,4,1,type='name',y=2,z=3)