Skip to content

14|函数定义与调用

程序写到一定长度后,重复逻辑会越来越明显。同样的代码出现在三个地方,后面格式要改,就得三个地方都改。漏掉一个,就会出现不一致。

函数给一段可复用逻辑起名字。逻辑只写一次,后面按名字调用。函数还能把主流程切成小块,让代码更容易阅读、测试和排查。

一、定义函数

python
def greet(name):
    """向指定的人打招呼。"""
    return f"hello, {name}"

def 是定义函数的关键字。后面跟函数名、圆括号里的参数列表、冒号,然后是缩进的函数体。

调用函数:

python
message = greet("Alice")
print(message)   # hello, Alice

二、函数名规范

函数名和变量名遵循同样的规则:只能包含字母、数字、下划线,不能以数字开头。Python 风格指南(PEP 8)建议:

  • 用小写字母加下划线:calculate_averagesend_email
  • 避免单字母函数名(除非是非常短的作用域,如 lambda
  • 用动词开头,描述函数做什么
不好的名字好的名字
fformat_date
calccalculate_total
do_somethingparse_config
fn1extract_username

三、文档字符串

函数开头的三引号字符串是文档字符串(docstring),说明这个函数做什么。

python
def calculate_average(numbers):
    """计算数字列表的平均值。

    Args:
        numbers: 数字列表。

    Returns:
        平均值。列表为空时返回 0。
    """
    if not numbers:
        return 0
    return sum(numbers) / len(numbers)

文档字符串的内容:这个函数做什么、参数是什么、返回什么。不需要套复杂模板,把关键信息说清楚即可。

help() 查看文档:

python
help(calculate_average)

四、没有返回值的函数

函数可以没有 return

python
def print_greeting(name):
    print(f"hello, {name}")

result = print_greeting("Alice")
print(result)   # None

没有 return 的函数返回 NoneNone 是 Python 表示"没有值"的特殊对象。

打印函数和计算函数的区别:

  • 计算函数返回结果,调用方决定怎么处理(打印、保存、进一步计算)
  • 打印函数直接输出到屏幕,结果无法被后续代码使用

好的实践是:函数要么返回结果,要么产生副作用(如打印、写文件),不要两者都做。混合职责会让函数难以复用。

五、函数的调用过程

调用函数时,Python 做三件事:

  1. 计算实参(传入的值)
  2. 把实参绑定到形参(函数定义时的参数名)
  3. 执行函数体
python
def add(a, b):
    return a + b

x, y = 10, 20
result = add(x, y)

执行 add(x, y) 时:x 的值 10 绑定给 ay 的值 20 绑定给 b,然后执行 return a + b

函数内部的变量和外部变量是隔离的(除非用 global,后面会讲)。

记忆锚点:函数用 def 定义,return 返回值;没有 return 返回 None;函数名用小写加下划线,动词开头;文档字符串说明做什么、参数、返回值;函数内部和外部变量隔离。