python定义一个函数是用def语句,依次写出函数名、括号、括号中的参数和冒号,然后在缩进块中编写函数体,函数的返回值用return语句返回。
1 #!/usr/bin/env python3 2 3 def just(): 4 pass 5 return xx 6 7 8 just()
函数体内部的语句在执行时,一旦遇到return时,函数就执行完毕,并将结果返回。如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。
调用函数时,如果参数个数不对,python解释器会自动检查出来,并抛出TypeError,但是如果参数类型不对,python解释器就无法帮我们检查。
注意:
定义函数时要确定函数名和参数个数;
如果有必要可以先对参数的数据类型做检查;
函数体内部随时可以用return返回函数结果;
函数执行完毕也没有return语句时,自动return None;
函数可以同时返回多个值,以元组的形势;
Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
1 def abs1(xx): 2 if xx > 0: 3 return xx 4 else: 5 return -xx 6 7 8 def abs2(d): 9 return d*d 10 11 12 res = abs2(-18) 13 print(res)
默认参数可以简化函数的调用。设置默认参数时要注意:
必选参数在前,默认参数在后,否则Python的解释器会报错;
当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数;
1 def abs3(a,c=4): 2 return a*c 3 4 5 res = abs3(8,2) 6 print(res)
在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号,调用该函数时,可以传入任意个参数
1 def mult(*num): 2 for i in num: 3 print(i) 4 5 6 7 ces = ['eric','sky','just'] 8 mult(ces,'asa') 9 10 11 12 ['eric', 'sky', 'just'] 13 asa
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw检查
1 def mult(**kw): 2 print(kw) 3 4 5 cop = {'name':'sky','age':19} 6 #mult(name='eric',age=20) 7 mult(**cop) 8 9 10 11 {'age': 19, 'name': 'sky'}
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
1 def f1(a, b, c=0, *args, **kw): 2 print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw) 3 4 def f2(a, b, c=0, *, d, **kw): 5 print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw) 6 7 8 9 10 11 >>> f1(1, 2) 12 a = 1 b = 2 c = 0 args = () kw = {} 13 >>> f1(1, 2, c=3) 14 a = 1 b = 2 c = 3 args = () kw = {} 15 >>> f1(1, 2, 3, 'a', 'b') 16 a = 1 b = 2 c = 3 args = ('a', 'b') kw = {} 17 >>> f1(1, 2, 3, 'a', 'b', x=99) 18 a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99} 19 >>> f2(1, 2, d=99, ext=None) 20 a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}
注意定义可变参数和关键字参数的语法:
*args是可变参数,args接收的是一个tuple;
**kw是关键字参数,kw接收的是一个dict。
传入可变参数和关键字参数的语法:
可变参数既可以直接传入:func(1, 2, 3)
,又可以先组装list或tuple,再通过*args
传入:func(*(1, 2, 3))
;
关键字参数既可以直接传入:func(a=1, b=2)
,又可以先组装dict,再通过**kw
传入:func(**{'a': 1, 'b': 2})
。
使用*args
和**kw
是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。