Python的函数用法,真真实实的简洁,简洁到让人感觉有点耍流氓的感觉了,下面来几个总结

1.想定义一个什么事也不做的空函数,可以用pass语句来占位

>>> defdonothing():

...pass

这里pass语句什么都不做,用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,暂时让代码能运行起来,如果缺少了pass代码就会报错。

2.Python中函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”:

>>> a = abs   #变量a指向abs函数

>>> a(-1)   #所以也可以通过a调用abs函数

1

3.函数返回多个值,其实只是一种假象,Python函数返回的仍然是单一值,并且返回值是一个tuple。从语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值只是为了写起来更方便,实际他就是一个tuple

def test(x,y,z,k=5): #这里可以将传入的参数做初始化
nx= x + z*k
yx= y - z*kreturnnx,yx
r=test(100,100,2,3) #若有传参则按照传入的来
printr
r=test(100,100,2) #若没有传入参数,则按照初始化的参数进行计算
printr
x,y=test(100,100,2) #实际上调用参数,返回的真实的仍然是一个tuple,只不过这里只把tuple内的两个值取出来而已
print x,y

输出:

(106, 94)

(110, 90)

110 90

这里有一个很奇特的现象就是传入的参数不用定义,并且在定义函数的时候直接可以在函数定义里将参数初始化。

4.Python函数可以定义可变的参数,即传入的参数个数是可变的,可以是多个,也可以是0个

举一个例子,计算a2 + b2 + c2 + ……。

最普通的写法:

deftest(numbers):
sum=0for i innumbers:
sum=sum + i*ireturn sum

但是调用的时候必须将参数封装成list或者tuple再传入,如

>>> test([1, 2, 3])14
>>> test(1, 2, 3))14

如果利用Python的可变参数特性可以这样写:

def test(*numbers):
sum=0for i innumbers:
sum=sum + i*ireturn sum

这样调用的时候只要传入参数就够了,而不用先封装

>>> test(1, 2,3)14
>>>test()
0

如果已经定义了可变参数,又要传入已经有的list或者tuple,只要在该list或者tuple前面加入 *并传入即可(原理是将list或tuple的元素变成可变参数)

def test(*numbers):
sum=0for i innumbers:
sum=sum + i*ireturnsum
>>>num=[1,2,3]
>>>test(*num)
14

4.Python函数可以定义关键字参数

关键字参数,我的理解就是有 key-value 对应关系的参数,看着是不是很眼熟?没错python内用这个的就是dic(字典)了,使用方法和可变参数类似,函数除了必选参数外,还接受关键字参数。在调用该函数时,可以只传入必选参数,也可以传入多个关键字参数(其实默认参数也是一个关键字的一种)如:

def person(name,age,city="北京",**other):print "name:",name,"age:",age,"city:",city,"Other:",other
>>> person ("fanghui",20)
name: fanghui age: 20 city: 北京 Other: {}
>>> person ("fanghui",20,gender="girl")
name: fanghui age: 20 city: 北京 Other: {gender: 'girl'}

和可变参数在传入之前要封装成list或tuple一样,关键字参数也需要封装成dic,如下面的例子:

def person(name,age,city="北京",**other):print "name:",name,"age:",age,"city:",city,"Other:",other>>> key={"gender":"girl","job":"student"}>>> person ("fanghui",20,key)
name: fanghui age:20 city: {'gender': 'girl', 'job': 'student'} Other: {} #掉进坑里了,需要加**>>> person ("fanghui",20,**key)
name: fanghui age: 20 city: 北京 Other: {'gender': 'girl', 'job': 'student'}#将city封装进dic
def person(name,age,**other):print "name:",name,"age:",age,"Other:",other>>> key={"city":"北京","gender":"girl","job":"student"}>>> person ("fanghui",20,**key)name: fanghui age: 20 Other: {'city': '\xb1\xb1\xbe\xa9', 'job': 'student', 'gender': 'girl'}    #这边中文变成了编码的原因暂时还有待考察

4.Python函数可以定义组合参数,即同时定义:必选参数、默认参数、可变参数和关键字参数

虽然参数可以组合定义,但是还是有一定顺序的,顺序必须为 必选参数、默认参数、可变参数和关键字参数,下面从网上找了一些很好的例子

def func(a, b, c=0, *args, **kw):print 'a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw#在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。

>>> func(1, 2) #必选参数一定要传参,不然会报错a= 1 b = 2 c = 0 args = () kw ={}>>> func(1, 2, c=3)
a= 1 b = 2 c = 3 args = () kw ={}>>> func(1, 2, 3, 'a', 'b')
a= 1 b = 2 c = 3 args = ('a', 'b') kw ={}>>> func(1, 2, 3, 'a', 'b', x=99)
a= 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}

#必通过tuple和dic调用一个函数

>>> args = (1, 2, 3, 4)>>> kw = {'x': 99}>>> func(*args, **kw)
a= 1 b = 2 c = 3 args = (4,) kw = {'x': 99}
总结:

必选参数一定要传,默认参数一定要用不可变对象,如果是可变对象,运行会有逻辑错误!

要注意定义可变参数和关键字参数的语法:

*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的习惯写法,当然也可以用其他参数名