Python函数的用法

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

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

>>> def donothing():
...     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*k
    return nx,yx
r=test(100,100,2,3)        #若有传参则按照传入的来
print r
r=test(100,100,2)        #若没有传入参数,则按照初始化的参数进行计算
print r
x,y=test(100,100,2)        #实际上调用参数,返回的真实的仍然是一个tuple,只不过这里只把tuple内的两个值取出来而已
print x,y

输出:
(106, 94)
(110, 90)
110 90

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

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

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

最普通的写法:

def test(numbers):
    sum=0
    for i in numbers:
        sum=sum + i*i
    return sum

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

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

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

def test(*numbers):
    sum=0
    for i in numbers:
        sum=sum + i*i
    return sum

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

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

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

def test(*numbers):
    sum=0
    for i in numbers:
        sum=sum + i*i
    return sum
>>>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的习惯写法,当然也可以用其他参数名
 

 

posted @ 2014-12-17 14:17  weareyoung  阅读(225)  评论(0)    收藏  举报