本文共 1828 字,大约阅读时间需要 6 分钟。
2.6 定义方法
我们可以创建一个实现任意范围内的斐波那契数列的输出功能方法。
>>> def fib(n): # write Fibonacci series up to n 写出在n以内的斐波那契数列
... """Print a Fibonacci series up to n.""" 输出在n以内的斐波那契数列
... a, b = 0, 1
... while a < n:
... print(a, end=’ ’)
... a, b = b, a+b
... print()
...
>>> # 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是方法定义的标志。接下来紧跟方法名和被圆括号所包围的参数列表。方法的主体语句将在下一行开始并且必须缩进。
方法主体的首句可选择性地是一句字符,用来说明方法的主要功能。(更多的文档注释可以参照文档语句)。运用docString可以自动地生成网页或者打印文档。或者让用户更有效地浏览代码。在你写的代码中包含文档语句是个很好的行为,因此要养成这个习惯。
方法的实施标志着将会有一张新的符号表用来保存该方法的本地变量。更准确地说,在方法中所有的变量赋值都会保存到新的本地符号表中。然而,在变量符号表中首先看到的是引用。接着是围绕方法的本地符号表,接着是全局符号表,最后是内置名称的表。因此,尽管全局变量在一个方法中被引用,但它们不能被直接赋值(除非在全局语句中被命名)。
方法调用的真正参数时候,参数将会在被调用方法的本地符号表中被标记。因此,参数可以用调用值来传递。(这里的值其实是对象的引用,而不是对象值本身)。 当一个方法调用另一个方法,系统将会为新调用方法产生新的本地符号表。
在目前的符号表中方法定义采用方法名字。方法名字的值有个被解释器确认为用户自定义方法的类型。其他可以用在方法名称的值可以重新赋值给上面提到的方法名称。这可以认为是一个普遍的重命名机制。
>>> fib
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89
你从其他语言转过来学习python,你可能反对fib不是一个方法而是一个过程。因为它没有返回值。事实上,任何没有return语句的方法都有返回值,即使是相当无聊的方法。 这个返回值就是null(这是内置名称)。如果返回值只有一个可写值,那么输出为空是被解释器所禁止的。如果你真想用print()方法你就会看到:
>>> fib(0)
>>> print(fib(0))
None
写一个有返回斐波那契数列值得方法是很简单的,代替打印输出。
>>> 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特性。
n Return语句表示从方法中返回一个值。没有return语句表示放回一个None.没有执行到方法结尾也返回None.
n Result.append(a)语句是调用列表对象 result的一个方法。一个方法属于该对象就可以用对象.方法名称进行调用。不同类型可以定义不同的方法,不同类型的方法可以有相同的名称不会引起冲突。 在例子中显示的方法append()被定义在list对象中。该方法意思是在list末尾增加一个新的元素。 在这个例子它等同于result = result + [a], 但是比后者更有效率。
转载地址:http://gnkai.baihongyu.com/