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

8.2. 自定义函数

函数执行特定的操作并返回一个值,执行一个函数的操作称为“调用”。一般而言,要判断某个对象是否可调用,可使用内置函数 callable()

>>> import math
>>> x = 1
>>> y = math.sqrt
>>> callable(x)
False
>>> callable(y)
True

调用时可能需要提供一些参数——放在圆括号中的内容。

前一节说过,函数是结构化编程的核心。那么如何定义函数呢?使用 def 语句,表示定义函数。

>>> def hello(name):
>>>     return 'Hello, ' + name + '!'

运行这些代码后,将有一个名为 hello 的新函数。它返回一个字符串,其中包含向唯一参数指定的人发出的问候语。你可像使用内置函数那样使用这个函数。

>>> print(hello('world'))
Hello, world!
>>> print(hello('Gumby'))
Hello, Gumby!

很不错吧?如果编写一个函数,返回一个由斐波那契数组成的列表呢?很容易!只需使用前 面介绍的代码,但不从用户那里读取数字,而是通过参数来获取。

>>> def fibs(num):
>>>     result = [0, 1]
>>>     for i in range(num-2):
>>>         result.append(result[-2] + result[-1])
>>>     return result
>>> def test():
>>>     pass
>>> test()
>>> print(test())
None

执行这些代码后,解释器就知道如何计算斐波那契数了。现在你不用再关心这些细节,而只需调用函数 fibs()

>>> fibs(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>> fibs(15)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

在这个示例中,num和result也可以使用其他名字,但return语句非常重要。return语句用于 从函数返回值(在前面的hello函数中,return语句的作用也是一样的)。

8.2.1. 给函数编写文档

要给函数编写文档,以确保其他人能够理解,可添加注释(以 # 打头的内容)。 还有另一种 编写注释的方式,就是添加独立的字符串。 在有些地方,如 def 语句后面(以及模块和类的开头),添加这样的字符串很有用。 放在函数开头的字符串称为文档字符串(docstring),将作为函数的一部分存储起来。

下面的代码演示了如何给函数添加文档字符串:

>>> def square(x):
>>>     'Calculates the square of the number x.'
>>>     return x * x

可以像下面这样访问文档字符串:

>>> square.__doc__
'Calculates the square of the number x.'

注意 doc 是函数的一个属性。属性名中的双下划线表示这是一个特殊的属性。

特殊的内置函数 help() 很有用。 在交互式解释器中,可使用它获取有关函数的信息,其中包含函数的文档字符串。

>>> help(square)
Help on function square in module __main__:

square(x)
    Calculates the square of the number x.

8.2.2. 其实并不是函数的函数

数学意义上的函数总是返回根据参数计算得到的结果。在Python中,有些函数什么都不返回。 在诸如Pascal等的语言中,这样的函数可能另有其名(如过程)。 但在Python中,函数就是函数, 即使它严格来说并非函数。 什么都不返回的函数不包含 return 语句,或者包含 return 语句,但没有在 return 后面指定值。

>>> def test():
>>>     print('This is printed')
>>>     return
>>>     print('This is not')

这里使用 return 语句只是为了结束函数。

>>> x = test()
This is printed

如你所见,跳过了第二条 print 语句。(这有点像在循环中使用 break ,但跳出的是函数。)既然test什么都不返回,那么 x 指向的是什么呢?下面就来看看:

>>> x

什么都没有。再仔细地看看。

>>> print(x)
None

这是一个你熟悉的值:None。由此可知,所有的函数都返回值。如果你没有告诉它们该返回 什么,将返回None。

警告

不要让这种默认行为带来麻烦。如果你在 if 之类的语句中返回值,务必确保其他分支也返回值, 以免在调用者期望函数返回一个序列时(举个例子),不小心返回了 None