Skip to content

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 错误的常见来源。

相关代码片段

相关速查表

练习 Python 函数

2 个练习

练习 Python 函数

查阅不认识的术语

新手友好的术语表用大白话解释编程术语——变量、函数、DOM、Promise 等等。

查看术语表

动手做项目

通过引导式项目应用所学,含起始代码与解决方案。

查看项目

解读错误信息

用大白话解释常见错误——什么意思、为什么发生、如何修复。

查看错误