4.6. Defining Functions(定义函数)

来源:互联网 发布:淘宝卖家返利网 编辑:程序博客网 时间:2024/06/04 23:59

我们可以定义一个函数求出任意范围的斐波那契数列:

>>> def fib(n):    # write Fibonacci series up to n...     """Print a Fibonacci series up to n."""...     a, b = 0, 1...     while a < n:...         print a,...         a, b = b, a+b...>>> # Now call the function we just defined:... fib(2000)0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

关键字 def 是一个函数定义的开头。它接下来必须要跟着函数名和参数列表。函数体从第二行开始 ,并且必须要有缩进。

函数体的第一行可以是一个可选的字符串;这个字符串会成为此函数的文档。存在能把文档字符串输出在网页或是打印出来的工具,或是在交互模式下通过某些命令来查看;在代码中写上文档字符串是个好习惯。

函数执行时首先把参数赋给该函数体的局部变量。说得再细点,函数中所有的变量都在局部符号表中存储。然而变量的引用首先看来在本地符号表中,然后再装入函数的局部符号表,最后再到内置的名称。这样,全局变量不能直接在函数中赋值(除非用 global 语句)。

当函数被调用时,函数参数会传入函数的本地变量中;这样,参数通过传递(值永远是对象的引用,而不是对象的值)。当一个函数调用另一个函数时,一个新的局部符号表被创建。

函数定义的名字在最近的符号表中。函数名称会被解释器识别为用户定义的函数。函数名可以赋给一个新的变量,这个新变量就可以当函数用。这里展示一个大众的重命名的机制:

>>> fib<function fib at 10042ed0>>>> f = fib>>> f(100)0 1 1 2 3 5 8 13 21 34 55 89
用函数写一个返回斐波那契序列而不是直接打印这些数字的函数很简单:

>>> 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 a < n:...         result.append(a)    # see below...         a, b = b, a+b...     return result...>>> f100 = fib2(100)    # call it>>> f100                # write the result[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

这个例子,揭示了一些Python的特性:

  • return能在函数中返回值。函数体中没有return语句默认返回None。
  • result.apped(a)语句调用list类的result对象的方法。方法是对象中的函数,被记为obj.methodname,obj是对象,methodname是方法名。不同的类定义不懂得方法。不同类的方法也许会有相同的名字,这不会引起冲突。(你也可以定义自己的类和方法,用class语句,参见Classes)append()方法就定义在list类里面;这个方法用来在序列尾部添加元素。在这个例子中它和 result = result + [a]等价,但是效率更高。
译者小结:

谁给我解释解释什么是 符号表(symbol table)?


0 0