Python 基础 - 第九节


📋 本节要点

知识点 说明
def 定义函数的关键字
函数 封装一段程序,可重复调用
return 返回函数执行结果
pass 空函数占位符
位置参数 按顺序传递的参数
默认参数 有默认值的参数
可变参数 *args 接收任意数量参数
关键字参数 **kwargs 接收键值对参数
命名关键字参数 * 后的命名参数

1. 函数概述

函数是将一段程序封装起来的代码块,可以重复使用,避免重复编写相同逻辑。

def 函数名称(参数):
    函数内容
    return 返回结果

函数本身不会执行,调用时才会执行。若无 return,函数返回 None。


2. 位置参数与 return

位置参数按顺序传递,依次赋值给形参。形参是定义时的参数,实参是调用时传入的值。

# 定义函数:x 和 n 是形参
def power(x, n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

# 调用函数:5 和 2 是实参,按位置传递
print(power(5, 2))  # 25(5²)
print(power(5, 3))  # 125(5³)

2.1 空函数 pass

如果函数暂时不写内容,用 pass 作为占位符,保证代码结构完整。

def my_function():
    pass  # 暂时不做任何事,以后补充

3. 默认参数

默认参数在定义时指定默认值,调用时可以不传该参数,适用于经常使用但变化较小的参数。

def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

print(power(5, 3))  # 125(传入 n=3)
print(power(5))     # 25(未传入 n,使用默认值 n=2)

重要:默认参数必须在位置参数的最后。

3.1 案例:成绩信息录入

def grade(name, math, english, gender="male"):
    info = {"name": name, "math": math, "english": english, "gender": gender}
    print(info)

# 按顺序传递
grade("小明", 89, 90, "female")

# 指定参数名传递(不依赖顺序)
grade(math=99, name="justin", english=88)

# 使用默认参数
grade("tom", 80, 89)

4. 可变参数 *args

当参数个数不确定时,用 *参数名 接收任意数量的参数,函数内部作为元组(tuple)处理。

# 不用可变参数:需传入列表
def calc(numbers):
    total = 0
    for n in numbers:
        total = total + n * n
    return total

print(calc([1, 2, 3]))  # 14

# 用可变参数:直接传多个值,更简洁
def calc(*numbers):
    total = 0
    for n in numbers:
        total = total + n * n
    return total

print(calc(1, 2, 3))    # 14(直接传)
print(calc(1, 2, 3, 4)) # 30(参数个数灵活)

# 已有列表时,前面加 * 解包传入
nums = [1, 2, 3]
print(calc(*nums))      # 14

5. 关键字参数 **kwargs

关键字参数允许传入任意多个带参数名的参数,函数内部作为字典(dict)处理。可变参数接收的是 tuple,关键字参数接收的是 dict。

def person(name, age, **kw):
    print("name:", name, "age:", age, "other:", kw)

person("Michael", 30)                         # 不传关键字参数
person("Adam", 45, gender="M", job="Engineer") # 传入任意多个关键字参数

# 已有字典时,前面加 ** 解包传入
extra = {"city": "Beijing", "job": "Engineer"}
person("Jack", 24, **extra)

6. 命名关键字参数

命名关键字参数用于限制只能传入指定的关键字参数,用 * 分隔,* 后面的参数必须指定名称。

# * 后面的 city 和 job 是命名关键字参数
def person(name, age, *, city, job):
    print(name, age, city, job)

# 必须指定参数名传入
person("Jack", 24, city="Beijing", job="Engineer")
# person("Jack", 24, "Beijing", "Engineer")  # 错误!必须指定参数名

# 命名关键字参数可以设置默认值
def person(name, age, *, city="Beijing", job):
    print(name, age, city, job)

person("Tom", 22, job="Teacher")  # city 使用默认值

参数组合顺序:必选参数 → 默认参数 → 可变参数 *args → 命名关键字参数 → 关键字参数 **kwargs


下一节预告:模块与导入