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/ )
python3学习笔记4
python3学习笔记6


06/10/2009 12:06 | by 
