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_total比func1好得多。 - 多用注释,让别人(和未来的你)一眼看懂代码逻辑。
编程不是“写代码”,而是“解决问题”。而函数,就是你解决问题的“利器”。多练、多写、多重构,你的代码会越来越优雅。
现在,就动手写一个你自己的函数吧——哪怕只是一个“加法器”。你会发现,编程的乐趣,就藏在这些小小的“成功”里。