Skip to content

函数:定义、参数、返回值与调用 ​

核心概念 ​

函数是可重用的代码块,接收输入(参数),执行操作,返回结果。Python 中函数是一等对象(first-class objects),可以赋值给变量、作为参数传递、从其他函数返回。

关键要素:

  • 定义:使用 def 关键字
  • 参数:函数输入,可选
  • 返回值:使用 return,可选
  • 调用:使用函数名和括号

定义第一个函数 ​

基本语法:

python
def greet(name):
    """向某人问好"""
    return f"Hello, {name}!"

# 调用函数
message = greet("Alice")
print(message)  # Hello, Alice!

关键点:

  • def 开始函数定义
  • greet 是函数名(遵循变量命名规则)
  • name 是参数
  • 三引号字符串是文档字符串(docstring),描述函数作用
  • return 返回结果

参数与返回值 ​

无参数函数 ​

python
def say_hello():
    print("Hello, World!")
    # 没有 return,隐式返回 None

result = say_hello()  # 打印 "Hello, World!"
print(result)  # None

多个参数 ​

python
def add(a, b):
    return a + b

print(add(3, 5))  # 8
print(add("Hello, ", "World"))  # Hello, World

Python 是动态类型,参数可以是任何类型。函数行为取决于运行时类型。

返回多个值 ​

使用元组:

python
def get_user_info():
    name = "Alice"
    age = 30
    return name, age  # 实际返回元组 (name, age)

name, age = get_user_info()  # 解包
print(f"{name} is {age} years old")

# 或作为元组使用
info = get_user_info()
print(info)  # ('Alice', 30)

无 return 或空 return ​

python
def print_sum(a, b):
    print(a + b)
    # 没有 return

result = print_sum(3, 5)  # 打印 8
print(result)  # None

def early_exit(x):
    if x < 0:
        return  # 提前返回,值为 None
    return x * 2

print(early_exit(-5))  # None
print(early_exit(5))   # 10

默认参数值 ​

参数可以有默认值:

python
def greet(name, greeting="Hello"):
    return f"{greeting}, {name}!"

print(greet("Alice"))  # Hello, Alice!
print(greet("Bob", "Hi"))  # Hi, Bob!

重要规则:有默认值的参数必须在无默认值参数之后

python
# 正确
def func(a, b, c=3, d=4):
    pass

# 错误
def func(a, b=2, c, d=4):  # SyntaxError
    pass

默认值陷阱:可变对象 ​

危险代码:

python
def add_item(item, items=[]):
    items.append(item)
    return items

print(add_item("apple"))   # ['apple']
print(add_item("banana"))  # ['apple', 'banana'] !!

问题:默认值 [] 在函数定义时创建一次,所有调用共享同一个列表对象。

正确写法:

python
def add_item(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

print(add_item("apple"))   # ['apple']
print(add_item("banana"))  # ['banana']

使用 None 作为哨兵值,在函数体内创建新列表。

位置参数 vs 关键字参数 ​

位置参数 ​

按顺序传递:

python
def divide(a, b):
    return a / b

print(divide(10, 2))  # 5.0
print(divide(2, 10))  # 0.2,顺序很重要

关键字参数 ​

明确指定参数名:

python
print(divide(a=10, b=2))  # 5.0
print(divide(b=2, a=10))  # 5.0,顺序无关

混合使用 ​

位置参数必须在关键字参数之前:

python
def create_user(name, age, city="Unknown"):
    return f"{name}, {age}, from {city}"

# 正确
print(create_user("Alice", 30))
print(create_user("Bob", 25, city="NYC"))
print(create_user("Carol", 28, "LA"))

# 错误
print(create_user(name="Dan", 35))  # SyntaxError

文档字符串(Docstring) ​

函数的第一个字符串是文档字符串,描述函数作用、参数和返回值:

python
def calculate_area(length, width):
    """
    计算矩形面积。
    
    参数:
        length: 矩形长度
        width: 矩形宽度
    
    返回:
        矩形面积(浮点数)
    """
    return length * width

# 访问文档字符串
print(calculate_area.__doc__)
help(calculate_area)

良好的文档字符串包括:

  • 简短描述(一行)
  • 详细说明(可选)
  • 参数说明
  • 返回值说明
  • 异常说明(如果适用)

函数是对象 ​

Python 中函数是一等对象:

python
def square(x):
    return x * x

# 函数赋值给变量
f = square
print(f(5))  # 25

# 函数作为参数
def apply_twice(func, value):
    return func(func(value))

print(apply_twice(square, 3))  # square(square(3)) = 81

# 函数列表
operations = [square, abs, len]
print(operations[0](4))  # 16

匿名函数:lambda ​

简单的单表达式函数可以用 lambda 定义:

python
# 普通函数
def add(a, b):
    return a + b

# lambda 等价
add_lambda = lambda a, b: a + b

print(add_lambda(3, 5))  # 8

# 常用于排序等场景
pairs = [(1, 'one'), (3, 'three'), (2, 'two')]
pairs.sort(key=lambda pair: pair[1])  # 按字符串排序
print(pairs)  # [(1, 'one'), (3, 'three'), (2, 'two')]

限制:lambda 只能包含一个表达式,不能有语句(如 if 语句块、return)。复杂逻辑用 def 定义函数。

练习 ​

  1. 温度转换:编写函数 celsius_to_fahrenheit(c) 和 fahrenheit_to_celsius(f),实现温度转换。公式:F = C × 9/5 + 32。

  2. 默认参数:编写函数 power(base, exponent=2),计算幂次方。默认计算平方。测试 power(3) 和 power(2, 10)。

  3. 默认值陷阱:解释以下代码的输出,并修复它:

    python
    def append_to(element, target=[]):
        target.append(element)
        return target
    
    list1 = append_to(1)
    list2 = append_to(2)
    print(list1)  # 输出什么?
    print(list2)  # 输出什么?
  4. 多返回值:编写函数 min_max(numbers),返回列表中的最小值和最大值。测试:min_max([3, 1, 4, 1, 5, 9, 2, 6])。

  5. 函数作为参数:编写函数 apply_operation(func, numbers),将函数 func 应用到列表 numbers 的每个元素。测试:

    python
    def double(x):
        return x * 2
    
    print(apply_operation(double, [1, 2, 3, 4]))
    # 期望输出:[2, 4, 6, 8]

完成练习后,打开本章答案页核对。

下一步 ​

理解了函数定义和调用,下一节学习作用域:函数如何找到变量,LEGB 规则,全局与局部变量。

回到第二章概览 · 返回Python 学习路线

用心记录每一步成长