python3学习笔记5

| |
[ 本站原创 | 不指定 06/10/2009 12:06 | by 樱花浪子 ]

5.Python:函数

函数是可重用的程序块,给程序块起个名字就可以再其他程序中引用改名字,这就是函数调用。已经用过的函数如len和range。

函数使用def关键字来定义,函数名后跟括号,括号中包含变量名,括号后跟冒号。然后是函数代码块。

def sayHello():

    print('Hello world')

sayHello()

sayHello()

运行输出:

>>>

Hello world

Hello world
函数参数

包含在括号中,用逗号分开,调用运行时赋值。

def printMax(a,b):

    if a>b:

        print(a,'is maxium')

    elif a==b:

        print(a,'is equal to',b)

    else:

        print(b,'is maxium')

printMax(3,4)

x=5

y=7

printMax(x,y)

运行输出:

>>>

4 is maxium

7 is maxium
局部变量

局部变量是在函数内部声明的变量,生存域在函数内,可以与函数外的变量同名。

x=50

def func(x):

    print('x is' ,x)

    x=2

    print('changed local x to',x)

func(x)

print('x is still',x)

运行输出:

>>>

x is 50

changed local x to 2

x is still 50
使用全局申明

如果你想在程序的最外层定义变量,你必须告诉python这个变量不是局部的,而是全局的,这可以用global语句来完成。不使用global语句是无法对程序外部定义的变量赋值的。如果在程序内部没有同名变量,那么你可以直接赋值,但是这样很不清楚。

x=50

def func():

    global x

    print('x is',x)

    x=2

    print('changed global x to',x)

func()

print('Value of x is',x)

运行输出:

>>>

x is 50

changed global x to 2

Value of x is 2
使用nonlocal语句

在局部和全局之间还有一种域,叫做非局部域nonlocal,当在函数中定义函数时,就会出现非局部域。

def func_outer():

    x=2

    print('x is',x)

    def func_inner():

        nonlocal x

        x=5

    func_inner()

    print('Changed local x to',x)

func_outer()

运行输出:

>>>

x is 2

Changed local x to 5
缺省参数值

某些函数的参数需要设置成可选的,当用户没有指定该参数值时,函数中使用此参数的默认值。设置默认值的方法是在函数声明时该参数后跟“=”和默认值,注意默认值应该是常量,或者说是不可变值。

def say(message,times=1):

    print(message*times)

say('Hello')

say('World',5)

运行输出:

>>>

Hello

WorldWorldWorldWorldWorld

注意:具有默认值的参数应该放在没有默认值参数的后面。
关键字参数

指定参数值时可以使用参数名,也可以按照参数在函数定义中的位置。这样做有两个好处,一是不用记参数的顺序了,二是只需要给必须赋值的参数赋值。

def func(a,b=5,c=10):

    print('a is',a,'and b is',b,'anc c is',c)

func(3,7)

func(25,c=24)

func(c=50,a=100)

运行输出:

a is 3 and b is 7 anc c is 10

a is 25 and b is 5 anc c is 24

a is 100 and b is 5 anc c is 50
可变参数函数

有时候你可能需要定义一个具有可变参数个数的函数,使用‘*’可以达到效果。

def total(initial=5,*numbers,**keywords):

    count=initial

    for number in numbers:

        count +=number

    for key in keywords:

        count += keywords[key]

    return count

print(total(10,1,2,3,vegetables=50,fruits=100))

运行输出:

>>>

166

当我们声明一个带星号的参数如*param,那么从这一个参数到结束的参数被收集成一个list,称为param。同样,当我们声明一个带双星号的参数如**param,那么从这个参数到结束的参数被收集成一个字典,称为param。

在后面的章节会讲list和dictionary的知识。
只能用关键字赋值的参数

如果你想指定某个参数只能通过关键字赋值,而不能靠位置来赋值,你可以声明这个参数为带星号的参数。

def total(initial=5,*numbers,vegetables):

    count=initial

    for number in numbers:

        count +=number

    count +=vegetables

    return count

print(total(10,1,2,3,vegetables=50))

print(total(10,1,2,3))

运行输出:

>>>

66

Traceback (most recent call last):

File "C:/Python30/mywork/func1.py", line 8, in

    print(total(10,1,2,3))

TypeError: total() needs keyword-only argument vegetables

注意:Keyword-only参数后面的参数必须指定默认值。
return 语句

return语句用来从函数中返回,比如跳出函数,返回值是可选的。

def maxium(x,y):

    if x>y:

        return x

    else:

        return y

print(maxium(2,3))

运行输出:

>>>

3

return不带返回值相当于return None。每个函数最后都隐式的包含return None语句,除非你写了自己的return语句。

def someFunction():

    pass

print(someFunction())

运行输出:

>>>

None

pass表示空的代码块。内建函数max能够完成找到最大的功能。
文档字符串

Python有一个极好的特性——文档字符串DocStrings。

def printMax(x,y):

    '''Prints the maxium of two numbers.

    The two values must be integers.'''

    x=int(x)

    y=int(y)

    if x>y:

        print(x,'is maxium')

    else:

        print(y,'is maxium')

printMax(3,5)

print(printMax.__doc__)

运行输出:

>>>

5 is maxium

Prints the maxium of two numbers.

The two values must be integers.

函数逻辑行的第一行的字符串就是该函数的文档字符串,模块和类中都有文档字符串的应用。文档字符串的传统是第一行首字母大写并以点结束,第二行为空,第三行为详细介绍。使用__doc__属性可以得到文档字符串。Help函数就是读取函数的文档字符串并显示出来。我强烈建议大家写程序时遵守文档字符串传统。
注解

函数的另一高级特性是注解,在这里可以很好的了解参数和返回值。如需详细了解注解请参考Python Enhancement Proposal No. 3107 (http://www.python.org/dev/ peps/pep-3107/ )