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, b 和 return (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_temperature、parse_header、is_valid。避免:
do_stuff、handle1、temp_func。
前导下划线(_helper)将函数标记为其模块内部使用。这一约定被广泛遵守,但 Python 并不强制执行。