Python 基础-函数

来源:互联网 发布:unity3d导航网格寻路 编辑:程序博客网 时间:2024/06/08 02:37
>>> def fib2(n): #return Fibonacci series up to n         #如何从函数中返回一个包含菲波那契数列的数值链表
... """ Return a list containing the Fibonacci series up to n. """
... result = []
... a,b=0,1
... while b<n:
... result.append(b) # see below
... a,b = b,a+b
... return result
... #这里要回车 不要输入
>>> f100 = fib2(100) # call it
>>> f100 # write the result
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>>


4.7 深入函数定义
4.7.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 1
... if ok in ('n','no','nop','nope'): return 0
... retries = retries-1
... if retries <0: raise IOError,'refusenik user'
... print complaint
...
>>> ask_ok('Do you really want to quit?')
Do you really want to quit?y
1
>>> ask_ok('Do you really want to quit?')
Do you really want to quit?no
0
>>> ask_ok('Do you really want to quit?')
Do you really want to quit?
Yes or no,please!
Do you really want to quit?i
Yes or no,please!
Do you really want to quit?y
1
>>> ask_ok('Do you really want to quit?',1)
Do you really want to quit?d
Yes or no,please!
Do you really want to quit?y
1
>>> ask_ok('Do you really want to quit?',0)
Do you really want to quit?
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in ask_ok
IOError: refusenik user
>>>


>>>
>>> i=5
>>> def f(arg=i):
... print arg
...
>>> i =6
>>> f() #默认值在函数定义段被解析,如下所示:
5
>>>


重要警告:默认值只会解析一次。当默认值是一个可变对象,诸如链表、字典或大部分类实例时,会产生一些差异。例如,以下函数在后继的调用中会积累它的参数值:

>>> def f(a,L=[]):
... L.append(a)
... return L
...
>>> print f(1)
[1]
>>> print f(2)
[1, 2]
>>> print f(3)
[1, 2, 3]
>>> print f(1)
[1, 2, 3, 1]
>>>


如果你不想在不同的函数调用之间共享参数默认值,可以如下面的实例一样编写函数:

>>> def f(a,L=None):

... if L is None:
... L=[]
... L.append(a)
... return L
...
>>> print f(1)
[1]
>>> print f(2)
[2]
>>> print f(3)
[3]
>>>

4.7.2 参数关键字
    #
函数可以通过参数关键字的形式来调用,形如“keyword = value”。例如,以下的函数:

>>> def parrot(voltage,state='a stiff',action = 'voom',type='Norwegian Blue'):
... print "-- This parrot wouldn't ", action,
... print "if you put",voltage,"Volts through it."
... print "--Lovely plumage the ", type
... print "-- It's ",state,"!"
...
>>> parrot(1000)
-- This parrot wouldn't voom if you put 1000 Volts through it.
--Lovely plumage the Norwegian Blue
-- It's a stiff !
>>> parrot(action='V0000M',voltage=1000000)
-- This parrot wouldn't V0000M if you put 1000000 Volts through it.
--Lovely plumage the Norwegian Blue
-- It's a stiff !
>>> parrot('a thousand',state='pushing up the daisies')
-- This parrot wouldn't voom if you put a thousand Volts through it.
--Lovely plumage the Norwegian Blue
-- It's pushing up the daisies !
>>> ##以下是错误的调用

>>> parrot() # required argument missing(缺少必要参数)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: parrot() takes at least 1 argument (0 given)
>>> parrot(voltage=5.0,'dead')
File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg
>>> parrot(voltage=5,'dead') # non-keyword argument following keyword(在关键字后面有非关键字参数)
File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg
>>> parrot(voltage=5,action='dead')
-- This parrot wouldn't dead if you put 5 Volts through it.
--Lovely plumage the Norwegian Blue
-- It's a stiff !
>>>

>>> parrot(110,voltage=220) # duplicate value for argument(对参数进行了重复赋值)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: parrot() got multiple values for keyword argument 'voltage'
>>> parrot(action =110,voltage=220)
-- This parrot wouldn't 110 if you put 220 Volts through it.
--Lovely plumage the Norwegian Blue
-- It's a stiff !
>>> parrot(actor='John Cleese') # unknown keyword(未知关键字)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: parrot() got an unexpected keyword argument 'actor'
>>> parrot(action='John Cleese')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: parrot() takes at least 1 non-keyword argument (0 given)
>>> parrot(11,action='John Cleese')
-- This parrot wouldn't John Cleese if you put 11 Volts through it.
--Lovely plumage the Norwegian Blue
-- It's a stiff !
>>>


4.7.5 文档字符串

这里介绍文档字符串的概念和格式。

第一行应该是关于对象用途的简介。简短起见,不用明确的陈述对象名或类型,因为它们可以从别的途径了解到(除非这个名字碰巧就是描述这个函数操作的动词)。这一行应该以大写字母开头,以句号结尾。

如果文档字符串有多行,第二行应该空出来,与接下来的详细描述明确分隔。接下来的文档应该有一或多段描述对象的调用约定、边界效应等。

Python的解释器不会从多行的文档字符串中去除缩进,所以必要的时候应当自己清除缩进。这符合通常的习惯。第一行之后的第一个非空行决定了整个文档的缩进格式。(我们不用第一行是因为它通常紧靠着起始的引号,缩进格式显示的不清楚。)留白“相当于”是字符串的起始缩进。每一行都不应该有缩进,如果有缩进的话,所有的留白都应该清除掉。相当于留白就是验证后的制表符扩展(通常是8个空格)。(这一段译得不通,有疑问的读者请参见原文--译者)

以下是一个多行文档字符串的示例:


>>> def my_fun():
... """Do nothing, but document it.
...
... No,really,it doesn't do anything.
... """
... pass
...
>>> print my_fun.__doc__
Do nothing, but document it.

No,really,it doesn't do anything.

>>>