>>> from env_helper import info; info()
页面更新时间: 2023-06-24 15:45:05
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-9-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

8.1. 调用函数的智慧

想想看,如果你编写了一些代码,现在需要在另一个地方再次使用,该怎么办呢?

比如,你编写了一段代码,用它来计算一些斐波那契数(著名的黄金分割数列,它其中的每个数都是前两个数的和)。

>>> 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? '))
>>> for i in range(num-2):
>>>     fibs.append(fibs[-2] + fibs[-1])
>>> print(fibs)
How many Fibonacci numbers do you want?  5
[0, 1, 1, 2, 3]

但是,如果要使用这些数字做其他事情,该如何办呢?

想到办法了吗?让我们先来看一下,到底真正的程序员会怎么办?

真正的程序员会让程序更抽象!

要让前面的程序更抽象,可以像下面这样做:

>>> num = input('How many numbers do you want?')
>>> print(fibs(num))

在这里,只具体地编写了这个程序独特的部分(读取数字并打印结果)。实际上,斐波那契数的计算是以抽象的方式完成的:你只是让计算机这样做,而没有具体地告诉它如何做。你创建了一个名为fibs的函数,并在需要计算斐波那契数时调用它。显而易见,如果需要在多个地方计算斐波那契数,这样做可节省很多精力。

8.1.1. 抽象和结构

抽象是一种智慧,它不但可以节省人力,而且还是程序能够被人理解的关键所在。计算机喜欢具体而明确的指令,但人通常不是这样的。例如,如果你向人打听怎么去电影院,就不希望对方回答:“向前走10步,向左转90度,接着走5步,再向右转45度,然后走123步。”听到这样的回答,你肯定一头雾水。

如果对方回答:“沿这条街往前走,看到过街天桥后走到马路对面,电影院就在你左边。”你肯定能明白。这里的关键是你知道如何沿街往前走,也知道如何过天桥,因此不需要有关这些方面的具体说明。

组织计算机程序时,你也采取类似的方式。程序应非常抽象,如下载网页、计算使用频率、 打印每个单词的使用频率。这很容易理解。下面就将前述简单描述转换为一个Python程序。

page = download_page()
freqs = compute_frequencies(page)
for word, freq in freqs:
    print(word, freq)

看到这些代码,任何人都知道这个程序是做什么的。然而,至于具体该如何做,你未置一词。 你只是让计算机去下载网页并计算使用频率,至于这些操作的具体细节,将在其他地方(独立的函数定义)中给出。