想想看,如果已编写了一些代码,现在需要在另一个地方再次使用,该怎么办呢?
比如,编写好了一段代码,用它来计算一些斐波那契数(著名的黄金分割数列,它其中的每个数都是前两个数的和)。
fibs = [0, 1]
for i in range(8):
fibs.append(fibs[-2] + fibs[-1])
运行上述代码后,fibs
将包含前10个斐波那契数。
fibs
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
上述代码只是计算出前10个斐波那契数。
当然了,也可以通过修改其中for
循环的处理范围,来获取任意长度的斐波那契数。
fibs = [0, 1]
# num = int(input('How many Fibonacci numbers do you want? '))
num=10
for i in range(num-2):
fibs.append(fibs[-2] + fibs[-1])
print(fibs)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
但是,如果要使用这些数字做其他事情,该如何办呢?
真正的程序员会让程序更抽象!要让前面的程序更抽象,可以像下面这样做:
num = input('How many numbers do you want?')
print(fibs(num))
在这里,只具体地编写了这个程序独特的部分(读取数字并打印结果)。
实际上,斐波那契数的计算是以抽象的方式完成的:只是让计算机这样做,而没有具体地告诉它如何做。
创建了一个名为fibs
的函数,并在需要计算斐波那契数时调用它。
显而易见,如果需要在多个地方计算斐波那契数,这样做可节省很多精力。
抽象是一种智慧,它不但可以节省人力,而且还是程序能够被人理解的关键所在。 计算机喜欢具体而明确的指令,但人通常不是这样的。例如,如果向人打听怎么去电影院, 就不希望对方回答:“向前走10步,向左转90度,接着走5步,再向右转45度,然后走123步。” 听到这样的回答,肯定一头雾水。
如果对方回答:“沿这条街往前走,看到过街天桥后走到马路对面,电影院就在左边。” 肯定能明白。这里的关键是知道如何沿街往前走,也知道如何过天桥,因此不需要有关这些方面的具体说明。
组织计算机程序时,也采取类似的方式。程序应非常抽象,如下载网页、计算使用频率、 打印每个单词的使用频率。 这很容易理解。下面就将前述简单描述转换为一个Python程序。
page = download_page()
freqs = compute_frequencies(page)
for word, freq in freqs:
print(word, freq)
看到这些代码,任何人都知道这个程序是做什么的。然而,至于具体该如何做,却未置一词。 只是让计算机去下载网页并计算使用频率,至于这些操作的具体细节,将在其他地方(独立的函数定义)中给出。