一、函数定义方式
函数定义用关键字def
,其参数传递不用设置类型,也不用定义返回,然后在函数名称后加上:
号,这点和java
很不一样,相对来说更加简单了;另外包含关系上用四个空格来标识,而非java的;
号;
如下为一个范例,定义了一个函数用来生成任意上界的菲波那契数列:
# -*- coding: UTF-8 -*-
def fib(n):
a,b = 0,1
while a<n:
print a,
a,b = b, a+b
if __name__ == '__main__':
a = fib(2000)
结果:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
二、高级用法
除了最简单的传参方法后还有特别的传参方法,有三种可用方式,下面一一做说明;
大体来说,参数传递分为必选参数和可选参数(注意必选参数必须在前面),可选参数在调用函数的时候可传可不传,这点比java
要好用(用java得多写好几个函数);
1、默认参数值
默认参数值即在函数定义的时候为一个或者多个参数定义一个默认值,如果调用参数的时候不传入该参数则自动使用默认参数值,下面是一个范例:
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
while True:
ok = raw_input(prompt)
if ok in ('y', 'ye', 'yes'):
return True
if ok in ('n', 'no', 'nop', 'nope'):
return False
retries = retries - 1
if retries < 0:
raise IOError('refusenik user')
print complaint
在这个例子中参数retries
和complaint
这两个参数即为可选参数,其=
号后边的即为默认参数值;
那么调用的时候我们就可以这样:
- 只传入默认参数
prompt
ask_ok('Do you really want to quit?')
- 给出一个可选的参数:
ask_ok('OK to overwrite the file?', 2)
- 或者给出所有的参数:
ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
注意:这里注意参数顺序不要错误,另外默认参数值只会被赋值一次,但也有例外情况,譬如默认值是个列表、字典或者大多数类的实例。例如,下面的函数在后续调用过程中会累积(前面)传给它的参数:
>>> def f(a,L=[0]):
L.append(a)
return L
>>> print f(1)
[0, 1]
>>> print f(2)
[0, 1, 2]
>>> print f(3)
[0, 1, 2, 3]
为什么会这样呢,解释如下:
Python函数在定义的时候,默认参数L
的值就被计算出来了,即[]
,因为默认参数L
也是一个变量,它指向对象[]
,每次调用该函数,如果改变了L
的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]
了。
定义默认参数要牢记一点:默认参数必须指向不变对象!
可以像如下这样修改就不会有这个问题了:
>>> def ff(a, L=None):
if L is None:
L=[]