Appearance
14|函数定义与调用
程序写到一定长度后,重复逻辑会越来越明显。同样的代码出现在三个地方,后面格式要改,就得三个地方都改。漏掉一个,就会出现不一致。
函数给一段可复用逻辑起名字。逻辑只写一次,后面按名字调用。函数还能把主流程切成小块,让代码更容易阅读、测试和排查。
一、定义函数
python
def greet(name):
"""向指定的人打招呼。"""
return f"hello, {name}"def 是定义函数的关键字。后面跟函数名、圆括号里的参数列表、冒号,然后是缩进的函数体。
调用函数:
python
message = greet("Alice")
print(message) # hello, Alice二、函数名规范
函数名和变量名遵循同样的规则:只能包含字母、数字、下划线,不能以数字开头。Python 风格指南(PEP 8)建议:
- 用小写字母加下划线:
calculate_average、send_email - 避免单字母函数名(除非是非常短的作用域,如
lambda) - 用动词开头,描述函数做什么
| 不好的名字 | 好的名字 |
|---|---|
f | format_date |
calc | calculate_total |
do_something | parse_config |
fn1 | extract_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 的函数返回 None。None 是 Python 表示"没有值"的特殊对象。
打印函数和计算函数的区别:
- 计算函数返回结果,调用方决定怎么处理(打印、保存、进一步计算)
- 打印函数直接输出到屏幕,结果无法被后续代码使用
好的实践是:函数要么返回结果,要么产生副作用(如打印、写文件),不要两者都做。混合职责会让函数难以复用。
五、函数的调用过程
调用函数时,Python 做三件事:
- 计算实参(传入的值)
- 把实参绑定到形参(函数定义时的参数名)
- 执行函数体
python
def add(a, b):
return a + b
x, y = 10, 20
result = add(x, y)执行 add(x, y) 时:x 的值 10 绑定给 a,y 的值 20 绑定给 b,然后执行 return a + b。
函数内部的变量和外部变量是隔离的(除非用 global,后面会讲)。
记忆锚点:函数用 def 定义,return 返回值;没有 return 返回 None;函数名用小写加下划线,动词开头;文档字符串说明做什么、参数、返回值;函数内部和外部变量隔离。