Python 测验 – 函数(最佳实践)

Python 测验 – 函数:从入门到实战的完整指南

你有没有遇到过这样的情况?写了一堆代码,发现重复的逻辑反复出现,改一个地方要改好几处,一不小心就出错。这时候,你可能需要一个“魔法盒子”——函数。它不仅能帮你把重复的代码收起来,还能让程序结构更清晰、更易维护。

在 Python 中,函数是组织代码的核心工具。无论你是初学者还是中级开发者,掌握函数的使用方式,都意味着你离写出“像样的代码”更近了一步。今天,我们就来深入聊聊 Python 中的函数,通过实际案例、清晰讲解和代码示例,带你一步步掌握它的精髓。


什么是函数?它就像一个“工具箱”

想象你正在做饭。如果你每次炒菜都要自己磨刀、洗锅、找调料,那效率会非常低。但如果你有一个“厨房工具箱”,里面提前放好了刀、锅、调料,你只需要打开箱子,按步骤操作就行。函数在程序中就扮演了这个“工具箱”的角色。

在 Python 中,函数是一段可重复使用的代码块,它接收输入(参数),执行特定任务,然后返回结果(可选)。它的核心价值是:封装复用

def add_numbers(a, b):
    # a 和 b 是参数,函数接收它们作为输入
    result = a + b
    # 把计算结果返回给调用者
    return result

sum_result = add_numbers(5, 3)
print(sum_result)  # 输出:8

注释说明:

  • def 是定义函数的关键字,后面跟函数名。
  • add_numbers(a, b):括号内是参数列表,用于接收外部传入的数据。
  • result = a + b:函数体中执行的具体逻辑。
  • return result:将结果返回给调用者,如果没有 return,函数默认返回 None
  • add_numbers(5, 3) 是调用函数,把 5 和 3 传进去,得到 8。

函数参数的类型:位置参数、默认参数、可变参数

函数的“输入”方式多种多样,掌握这些参数类型,能让你写出更灵活的函数。

位置参数:按顺序传值

这是最基础的参数形式,调用时必须按定义顺序传参。

def greet(name, age):
    # name 和 age 是位置参数
    print(f"你好,{name},你今年 {age} 岁了!")

greet("小明", 20)  # 输出:你好,小明,你今年 20 岁了!

注释说明:

  • greet("小明", 20) 中,“小明”对应 name,20 对应 age
  • 如果顺序错了,结果也会错,比如 greet(20, "小明") 会输出“你好,20,你今年 小明 岁了!”——明显逻辑错误。

默认参数:给参数设置“默认值”

当你希望某些参数有默认行为时,就可以用默认参数。

def create_profile(name, age=18, city="北京"):
    # age 和 city 有默认值,调用时可省略
    print(f"姓名:{name},年龄:{age},城市:{city}")

create_profile("小红")           # 输出:姓名:小红,年龄:18,城市:北京
create_profile("小刚", 25)      # 输出:姓名:小刚,年龄:25,城市:北京
create_profile("小丽", 22, "上海")  # 输出:姓名:小丽,年龄:22,城市:上海

注释说明:

  • age=18 表示如果调用时没有传 age,就用 18 作为默认值。
  • 默认参数必须放在所有位置参数之后,否则会报错。
  • 默认参数的值在函数定义时计算一次,如果参数是可变对象(如列表),可能会出现“共享引用”问题,需特别注意。

可变参数:处理不确定数量的输入

有时你不知道用户会传几个参数,这时可以用 *args**kwargs

def calculate_total(*numbers):
    # *numbers 接收任意数量的位置参数,打包成元组
    total = sum(numbers)
    return total

print(calculate_total(1, 2, 3))        # 输出:6
print(calculate_total(10, 20, 30, 40)) # 输出:100
def user_info(**details):
    # **details 接收任意数量的关键字参数,打包成字典
    for key, value in details.items():
        print(f"{key}: {value}")

user_info(name="小王", job="程序员", salary=15000)

注释说明:

  • *args 是“任意数量的位置参数”,用 * 号表示。
  • **kwargs 是“任意数量的关键字参数”,用 ** 表示。
  • 通常用于设计通用接口,比如日志记录、配置解析等场景。

返回值:函数的“输出结果”

函数不是只能“做事情”,它还可以“给出答案”。这个答案就是返回值。

def check_number(n):
    if n > 0:
        return "正数"
    elif n < 0:
        return "负数"
    else:
        return "零"

result = check_number(-5)
print(result)  # 输出:负数

注释说明:

  • return 语句会立即终止函数执行,返回指定值。
  • 一个函数可以有多个 return,但只执行第一个遇到的。
  • 如果没有 return,函数会返回 None
  • 返回值可以是任意类型:数字、字符串、列表、甚至另一个函数。

作用域:变量的“活动范围”

变量不是“全宇宙通用”的。在函数内部定义的变量,通常只在函数内有效。这就是作用域。

x = 10  # 全局变量

def modify_x():
    x = 20      # 局部变量,只在函数内有效
    print(f"函数内 x = {x}")

modify_x()      # 输出:函数内 x = 20
print(f"函数外 x = {x}")  # 输出:函数外 x = 10

注释说明:

  • x = 10 是全局变量,在函数外定义,所有地方都能访问。
  • x = 20 是局部变量,只在 modify_x 函数内部存在。
  • 如果想在函数内修改全局变量,必须用 global 关键字:
x = 10

def change_global():
    global x
    x = 100
    print(f"函数内 x = {x}")

change_global()   # 输出:函数内 x = 100
print(f"函数外 x = {x}")  # 输出:函数外 x = 100

注释说明:

  • global x 声明 x 是全局变量,函数内部的修改会直接影响外部。
  • 不建议滥用 global,它会让代码难以维护。

实战案例:用函数实现一个简易测验系统

让我们把前面学到的知识整合起来,做一个“Python 测验 – 函数”的小项目。

questions = [
    {"question": "Python 是什么类型的语言?", "options": ["编译型", "解释型", "汇编型"], "answer": 1},
    {"question": "print() 函数的作用是?", "options": ["输出内容", "输入内容", "计算和"], "answer": 0},
    {"question": "Python 中列表用什么符号表示?", "options": ["{}", "[]", "()"], "answer": 1}
]

def ask_question(question_data):
    # 显示题目和选项
    print(question_data["question"])
    for i, option in enumerate(question_data["options"]):
        print(f"{i + 1}. {option}")
    
    # 获取用户输入,转换为整数
    user_answer = int(input("请输入你的答案(1/2/3):")) - 1
    
    # 判断是否正确
    if user_answer == question_data["answer"]:
        print("✅ 正确!")
        return 1  # 正确得1分
    else:
        print(f"❌ 错误!正确答案是:{question_data['options'][question_data['answer']]}")
        return 0  # 错误得0分

def run_quiz():
    score = 0
    print("🎉 欢迎参加 Python 测验 – 函数!")
    
    # 遍历所有题目,逐个提问
    for q in questions:
        score += ask_question(q)
    
    # 输出最终成绩
    print(f"\n🎯 测验结束!你的得分是:{score}/{len(questions)}")

run_quiz()

注释说明:

  • questions 是一个包含字典的列表,每道题有题目、选项和正确答案。
  • ask_question() 函数负责展示题目、接收输入、判断对错并返回分数。
  • run_quiz() 是主函数,控制测验流程。
  • 通过函数拆分,代码结构清晰,易于扩展(比如增加新题、支持多轮测验)。

总结:函数是编程的“骨架”

函数不只是写代码的工具,它是你构建复杂程序的“骨架”。它让你的代码不再是一团乱麻,而是有逻辑、有结构、可维护、可复用的“工程”。

在“Python 测验 – 函数”中,我们从基础定义讲到参数类型,从返回值讲到作用域,最后用一个完整的测验系统实战收尾。希望你不仅学会了怎么写函数,更理解了为什么写函数。

记住:

  • 一个好函数,应该只做一件事
  • 函数名要清晰表达意图,比如 calculate_totalfunc1 好得多。
  • 多用注释,让别人(和未来的你)一眼看懂代码逻辑。

编程不是“写代码”,而是“解决问题”。而函数,就是你解决问题的“利器”。多练、多写、多重构,你的代码会越来越优雅。

现在,就动手写一个你自己的函数吧——哪怕只是一个“加法器”。你会发现,编程的乐趣,就藏在这些小小的“成功”里。