前面编写的程序都很小,但如果要编写大型程序,你很快会遇到麻烦。想想看,如果你在一个地方编写了一些代码,但需要在另一个地方再次使用,该如何办?例如,假设你编写了一段代码,他计算一些斐波那契数(一种数列,其中每个数都是前俩个数的和)。
fib=[0,1]
for i in range(8):
fib.append(fib[-2]+fib[-1])
运行上述代码后,fib将包含前十个斐波那契数
>>> fib
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
如果要使用这些数字做其他的事情,该如何办呢?当然,你可以在需要时再次编写这个循环,但如果已编写好的代码更复杂呢?在这种情况下,你还愿意多次编写这些代码吗(每当需要就编写一次)? 不,真正的程序员是不会这样做的,真正的程序员很懒。这里说的懒不是贬义词,而是说不做无谓的工作。
那么真正的程序员会如何做呢?让程序更抽象。要让前面的程序更抽象。例如下面
num=input('how many numbers do you want')
print(fib(num))
在这里,只具体地编写了这个程序独特的部分(读取数字并打印结果)。实际上,斐波那契数的计算是以抽象的方式完成的;你只是让计算机这样做,没有具体告诉它如何做。你创建了一个名为fibs的函数,并在需要计算斐波那契时调用它。如果需要多个地方计算斐波那契数,这样做可省很多精力。
函数执行特定的操作并返回一个值,你可以调用它.一般而言,要判断某个对象是否可调用,可用内置函数callable.
>>> import math
>>> x=1
>>> y=math.sqrt
>>> callable(x)
False
>>> callable(y)
True
>>>
函数是结构化编程的核心。那么如何定义函数呢? 使用def(表示定义函数)
>>> def hello(name):
... return '1'+name+'2'
运行这些代码后,将有一个hello的新函数。它返回一个字符串。
那我们编写一个返回斐波那契数列的列表函数。
def fib(num):
s=[0,1]
for i in range(2,num+1):
s.append(s[-1]+s[-2])
return s
while True:
num=int(input())
print(fib(num))
执行这些代码后,解释器就知道如何计算斐波那契数了,现在你不用再关心这些细节了,而只需调用fib.
在这个示例中,num和result也可用其他名字,但return语句非常重要。return语句用于从函数返回值(在前面的hello函数中,return语句的作用也是一样的)。
要给函数编写文档,以确保其他人能够理解,可添加注释(以#打头的内容),还有另一种编写注释的方式,就是添加独立的字符串。在有些地方,如def语句后面,添加这样的字符串很有用。放在函数开头的字符串称为文档字符串,将作为函数的一部分存储起来。
def square(x):
'一个平方函数'
return x*x
print(square.__doc__)
一个平方函数
doc(注意是俩个连着的下划线)是函数的一个属性。
特殊内置函数helo也很有用。在交互式解释器中,可使用它获取有关函数的信息,其中包含函数的文档字符串。
>>> help(square)
Help on function square in module __main__:
square(x)
一个平方函数