Python 函数
用 def 定义函数、参数、返回值与默认参数。
你将学到
- 如何用 def 定义函数
- 参数、实参与返回值
- 默认参数与关键字参数
- 可变长参数 *args 和 **kwargs
- 文档字符串及其重要性
概念讲解
定义函数
用 def 关键字定义函数,后跟名称、括号中的参数和冒号。函数体缩进:
def greet(name):
return f"Hello, {name}!"
print(greet("Ada")) # Hello, Ada!
参数与返回值
函数接受参数(输入)并可返回值。如果没有 return 语句,函数返回 None:
def add(a, b):
return a + b
result = add(3, 4) # 7
默认参数
可以给参数默认值,使其可选:
def greet(name, greeting="Hello"):
return f"{greeting}, {name}!"
greet("Ada") # Hello, Ada!
greet("Ada", "Hi") # Hi, Ada!
greet("Ada", greeting="Hey") # 关键字参数
警告:永远不要用可变对象(如列表)做默认参数。默认值在函数定义时求值一次,所以同一个列表在所有调用间共享:
# 错误——列表在调用间共享!
def add_item(item, items=[]):
items.append(item)
return items
# 正确——每次调用创建新列表
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
关键字参数
可以按名称传参,使调用更可读,并允许跳过可选参数:
def create_user(name, age, role="user", active=True):
return {"name": name, "age": age, "role": role, "active": active}
create_user("Ada", 25, role="admin", active=False)
*args 和 **kwargs
- **
*args** 把多余的位置参数收集成元组 kwargs** 把多余的关键字参数收集成字典
def sum_all(*args):
return sum(args)
sum_all(1, 2, 3, 4) # 10
def log(**kwargs):
for key, value in kwargs.items():
print(f"{key} = {value}")
log(user="Ada", action="login", time="10:30")
文档字符串
文档字符串是函数开头的三引号字符串,记录函数做什么。可通过 help() 访问,对可读代码必不可少:
def calculate_bmi(weight, height):
"""计算身体质量指数。
Args:
weight: 体重(千克)
height: 身高(米)
Returns:
BMI 值(weight / height^2)
"""
return weight / (height ** 2)
好的文档字符串解释为什么,而非只是什么。Sphinx 和 IDE 用它们提供内联帮助。
示例代码
# 带返回值的基本函数
def greet(name, greeting="Hello"):
"""Return a greeting message."""
return f"{greeting}, {name}!"
print(greet("Ada"))
print(greet("Ada", greeting="Hi"))
# 多返回值的函数
def grade(score):
"""Convert a numeric score to a letter grade."""
if score >= 90:
return "A"
elif score >= 80:
return "B"
elif score >= 70:
return "C"
else:
return "F"
print(f"Score 85 earns: {grade(85)}")
# *args 可变位置参数
def sum_all(*args):
"""Sum any number of arguments."""
return sum(args)
print(sum_all(1, 2, 3, 4, 5)) # 15
# **kwargs 可变关键字参数
def make_profile(**kwargs):
"""Build a user profile from keyword arguments."""
return kwargs
profile = make_profile(name="Ada", age=25, role="admin")
print(profile)
# 安全的默认参数模式(避免可变默认值!)
def add_item(item, items=None):
"""Add an item to a list, creating a new list if none provided."""
if items is None:
items = []
items.append(item)
return items
print(add_item("a")) # ['a']
print(add_item("b")) # ['b']——不是 ['a', 'b']!
展示了带默认值的函数、多返回值的 grade 函数、*args、**kwargs,以及可变默认参数的安全模式。文档字符串展示了如何记录函数。
动手试一试
- Math Evaluator
计算表达式——类似于函数计算并返回的结果。
- Regex Tester
函数常封装正则逻辑——在线测试模式。
常见错误
错误写法
用可变默认参数如 def f(items=[])
正确做法
默认参数在定义时求值一次,所以同一个列表在所有调用间共享。用 def f(items=None): items = items or [] 每次创建新列表。
错误写法
忘记返回值,得到 None
正确做法
没有显式 return 的函数返回 None。如果函数应该产生值,确保写 return value。这是 NoneType 错误的常见来源。
相关资源
相关代码片段
- Sort Dictionary by Value
排序字典的函数——实用示例。
相关速查表
- Python Cheatsheet
函数定义、参数与文档字符串参考。
练习 Python 函数
2 个练习
查阅不认识的术语
新手友好的术语表用大白话解释编程术语——变量、函数、DOM、Promise 等等。
动手做项目
通过引导式项目应用所学,含起始代码与解决方案。
解读错误信息
用大白话解释常见错误——什么意思、为什么发生、如何修复。