2.14. 定义函数

函数将一段代码以一个名称打包起来,以便从多个地方调用。任何计算、动作或成形的工作只要出现不止一次,函数就能把它变成一个单独的命名实体。

关键字是 def

def greet(name):
    print("hello,", name)

greet("Alice")
greet("Bob")

输出:

hello, Alice
hello, Bob

def 开头的行是定义——它创建函数但不运行函数体。调用 greet("Alice") 才会运行那个缩进的代码块。

2.14.1. 形参与实参

def 行括号中的名称是形参——是调用者将提供的值的占位符。实际传入的值是实参。一个函数可以接受零个或多个形参:

def square(x):
    return x * x

def add(a, b):
    return a + b

def is_even(n):
    return n % 2 == 0

以错误的实参数量进行调用会立即引发 TypeError

2.14.2. return

return 语句会立即结束函数,并将一个值交还给调用者:

def absolute(x):
    if x < 0:
        return -x
    return x

从未执行到 return 的函数(或带有一个无值的裸 return 的函数)返回 None

>>> def shout(text):
...     print(text.upper())
...
>>> result = shout("hi")
HI
>>> print(result)
None

一个函数可以有多个 return 语句;第一个被执行到的会生效,函数体的其余部分会被跳过。

2.14.2.1. 返回多个值

Python 每次调用返回一个对象,但该对象可以是一个 tuple——而且调用者可以当场将其解包:

def minmax(values):
    return (min(values), max(values))

lo, hi = minmax([3, 1, 4, 1, 5, 9])

返回值两侧的括号是可选的;return a, breturn (a, b) 是一样的。

2.14.3. 文档字符串

放在函数体第一条语句位置的字符串字面量是文档字符串。它被存储在函数对象上,也是 help() 所显示的内容:

def scale(value, factor):
    """Multiply ``value`` by ``factor`` and return the result."""
    return value * factor

当光标悬停在函数名上时,IDE 会在工具提示中显示文档字符串,因此即使是一行摘要也物有所值。当需要更多细节时,三引号字符串允许文档字符串跨越多行。

2.14.4. 命名约定

函数名使用 snake_case——用下划线分隔的小写单词。名称应描述该函数的功能:

  • 好的read_temperatureparse_headeris_valid

  • 避免do_stuffhandle1temp_func

前导下划线(_helper)将函数标记为其模块内部使用。这一约定被广泛遵守,但 Python 并不强制执行。