Python3 函数新手入门与实战指南
Python3 函数新手入门与实战指南
手把手带你从零开始,把“函数”这个编程核心工具彻底搞懂、用好。
WEB项目地址:演示地址
① 零基础环境搭建与首个函数运行
环境准备(3 分钟搞定)
你不需要安装任何复杂工具。只要两步:
- 安装 Python:访问 python.org,下载 3.8 以上版本,安装时勾选 “Add Python to PATH”。
- 选择编辑器:
- 新手首选 VS Code(安装 Python 插件)
- 或直接用 Python 自带的 IDLE
- 也可在浏览器搜 “在线 Python 编译器” 立即体验
验证安装:打开终端(或 CMD),输入 python --version,看到版本号即成功。
第一个函数:向世界打招呼
在编辑器中新建 hello.py,输入以下代码:
# 定义一个函数
def say_hello():
print("Hello, 世界!")
# 调用(执行)这个函数
say_hello()
运行方法:
- VS Code:按
F5或点击运行按钮 - 终端:
python hello.py
你会看到输出:Hello, 世界!
恭喜,你已经完成了函数的“定义”与“调用”两个核心动作。
② 函数核心概念与生活化类比解析
函数是什么?
函数就是“有名字的代码块”,就像厨房里的菜谱:
- 菜谱(函数)记录了做一道菜的步骤(代码)
- 当你想吃这道菜时,只需喊菜名(调用函数),不用每次重新想步骤
- 同一个菜谱可以被多人多次使用(复用)
为什么需要函数?
| 生活场景 | 编程中的函数 |
|---|---|
| 你每天重复“起床-洗漱-出门”流程 | 把重复操作封装成函数,一键执行 |
| 麦当劳的炸鸡配方统一,全球味道一致 | 函数保证相同输入得到相同输出,减少错误 |
| 你可以把大任务拆成“洗菜、切菜、炒菜” | 函数让复杂程序分模块开发,易于维护 |
函数的“三要素”
- 名字 —— 用来调用它(如
say_hello) - 参数(可选) —— 传入的“原材料”(如食材)
- 返回值(可选) —— 输出的“成品”(如做好的菜)
③ 自定义函数的定义语法与调用步骤
基础语法结构
def 函数名(参数1, 参数2, ...):
"""文档字符串(可选,说明函数作用)"""
代码块
return 返回值 # 可选
从简单到复杂:三步学会
第一步:无参数、无返回值的函数
def show_menu():
"""显示系统菜单"""
print("1. 新增")
print("2. 删除")
print("3. 退出")
# 调用
show_menu()
第二步:带参数的函数
def greet(name):
"""向指定的人打招呼"""
print(f"你好,{name}!")
greet("小明") # 输出:你好,小明!
greet("小红") # 输出:你好,小红!
第三步:带返回值的函数
def add(a, b):
"""计算两个数的和"""
result = a + b
return result
total = add(3, 5) # 调用后,返回值赋给 total
print(total) # 8
⚠️ 记住:函数必须先定义(用
def),后调用。把定义放在调用之前。
④ 参数传递机制:位置参数与关键字参数
位置参数 —— 按顺序匹配
调用函数时,传入的实参按位置一一对应形参:
def info(name, age, city):
print(f"{name},{age}岁,来自{city}")
info("张三", 25, "北京") # 顺序必须一致
# 如果写成 info("北京", 25, "张三") 含义就错了
关键字参数 —— 指名道姓
调用时用 形参名=值 的方式,顺序可以打乱:
info(city="上海", name="李四", age=30)
# 输出:李四,30岁,来自上海
默认参数 —— 给参数设置“备用值”
定义函数时可以为参数指定默认值,调用时若省略则使用默认值:
def greet_user(name, greeting="你好"):
print(f"{greeting},{name}!")
greet_user("王五") # 你好,王五!
greet_user("赵六", "早上好") # 早上好,赵六!
📌 注意:带默认值的参数必须放在所有不带默认值的参数之后。即
def func(a, b=1)正确,def func(a=1, b)错误。
可变参数 —— 处理不确定数量的参数
*args —— 接收任意多个位置参数,打包成元组
def sum_all(*numbers):
total = 0
for n in numbers:
total += n
return total
print(sum_all(1, 2, 3)) # 6
print(sum_all(10, 20, 30, 40)) # 100
**kwargs —— 接收任意多个关键字参数,打包成字典
def print_info(**info):
for key, value in info.items():
print(f"{key} = {value}")
print_info(name="Tom", age=18, city="London")
# name = Tom
# age = 18
# city = London
⑤ 返回值处理与多结果返回技巧
返回值基础
return 用来从函数中返回结果,一旦执行 return,函数立即结束。
def is_even(num):
if num % 2 == 0:
return True
return False
print(is_even(4)) # True
print(is_even(7)) # False
函数没有 return 会怎样?
没有 return 的函数会隐式返回 None(Python 的空值):
def just_print(msg):
print(msg)
result = just_print("hello")
print(result) # None
返回多个值 —— 用元组打包
def get_min_max(numbers):
return min(numbers), max(numbers) # 返回元组 (min, max)
minimum, maximum = get_min_max([3, 1, 7, 5])
print(minimum, maximum) # 1 7
返回字典 —— 方便携带多种信息
def analyze_string(s):
return {
"length": len(s),
"upper": s.upper(),
"lower": s.lower()
}
result = analyze_string("Hello")
print(result["length"]) # 5
print(result["upper"]) # HELLO
⑥ 变量作用域规则与全局局部区分
局部变量 —— 函数内部的“私人空间”
在函数内部定义的变量,只能在函数内部使用,外部无法访问:
def test():
x = 10 # 局部变量
print(x)
test() # 10
print(x) # NameError: name 'x' is not defined
全局变量 —— “公共区域”
在函数外部定义的变量,可以在任何地方访问(但函数内修改需要特别声明):
global_var = 100 # 全局变量
def show_global():
print(global_var) # 可以读取
def modify_global():
global global_var # 必须声明 global
global_var = 200 # 修改全局变量
show_global() # 100
modify_global()
show_global() # 200
作用域查找顺序(LEGB 法则)
Python 查找变量时按这个顺序:
- Local(函数内部)
- Enclosing(外层嵌套函数)
- Global(全局)
- Built-in(内置,如
print、len)
新手常见误区
count = 0
def increment():
count += 1 # ❌ 报错:局部变量 'count' 未赋值前被引用
print(count)
increment()
原因:函数内对 count 进行赋值,Python 认为它是局部变量,但还没赋值就用于 +=。解决方案:使用 global count 声明,或把 count 作为参数传递。
⑦ 匿名函数 Lambda 的快速应用场景
什么是 Lambda?
Lambda 函数就是“一句话函数”——没有名字、只能写一行表达式的函数。语法:
lambda 参数1, 参数2, ... : 表达式
基础示例
# 普通函数
def square(x):
return x ** 2
# 等价的 lambda
square_lambda = lambda x: x ** 2
print(square(5)) # 25
print(square_lambda(5)) # 25
典型应用场景:作为参数传递给其他函数
Lambda 最常用的地方是配合 sorted()、filter()、map() 等高阶函数。
场景1:按指定规则排序
students = [
{"name": "Alice", "score": 85},
{"name": "Bob", "score": 92},
{"name": "Charlie", "score": 78}
]
# 按分数升序排序
sorted_students = sorted(students, key=lambda student: student["score"])
print(sorted_students)
# [{'name': 'Charlie', 'score': 78}, {'name': 'Alice', 'score': 85}, {'name': 'Bob', 'score': 92}]
场景2:过滤数据
numbers = [1, 2, 3, 4, 5, 6]
even_nums = list(filter(lambda x: x % 2 == 0, numbers))
print(even_nums) # [2, 4, 6]
场景3:批量转换数据
nums = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, nums))
print(squared) # [1, 4, 9, 16]
⚠️ 使用建议:Lambda 只适合简单逻辑(单行表达式)。一旦逻辑变复杂,请改用普通
def函数,代码更清晰。
⑧ 实战案例:构建实用数据处理工具
我们将开发一个小型员工绩效处理工具,综合运用上述所有知识点。
需求描述
有一份员工数据(姓名、部门、销售额、是否达标),需要:
- 计算每个部门的平均销售额
- 找出销售额最高的员工
- 对所有未达标的员工发送预警(模拟打印)
完整代码实现
# ---------- 数据准备 ----------
employees = [
{"name": "张伟", "dept": "销售部", "sales": 12000, "target_achieved": True},
{"name": "李娜", "dept": "销售部", "sales": 8500, "target_achieved": False},
{"name": "王强", "dept": "技术部", "sales": 15000, "target_achieved": True},
{"name": "赵敏", "dept": "技术部", "sales": 13000, "target_achieved": True},
{"name": "陈静", "dept": "市场部", "sales": 9000, "target_achieved": False},
{"name": "刘洋", "dept": "市场部", "sales": 11000, "target_achieved": True},
]
# ---------- 功能函数 ----------
def get_dept_average(dept_name, emp_list):
"""计算指定部门的平均销售额"""
dept_employees = [emp for emp in emp_list if emp["dept"] == dept_name]
if not dept_employees:
return 0
total_sales = sum(emp["sales"] for emp in dept_employees)
return total_sales / len(dept_employees)
def find_top_sales(emp_list):
"""找出销售额最高的员工(返回完整信息)"""
if not emp_list:
return None
top = max(emp_list, key=lambda emp: emp["sales"])
return top
def send_warnings(emp_list):
"""对所有未达标的员工打印预警信息"""
failed = [emp for emp in emp_list if not emp["target_achieved"]]
if not failed:
print("🎉 所有员工都达标!")
return
for emp in failed:
print(f"⚠️ 预警:{emp['name']} 销售额 {emp['sales']},未达标!")
def analyze_all(emp_list):
"""综合分析入口(调用其他函数)"""
# 获取所有部门
depts = set(emp["dept"] for emp in emp_list)
print("===== 部门平均销售额 =====")
for dept in depts:
avg = get_dept_average(dept, emp_list)
print(f"{dept}: {avg:.2f}")
print("\n===== 销售冠军 =====")
top = find_top_sales(emp_list)
if top:
print(f"🏆 {top['name']},销售额 {top['sales']},部门 {top['dept']}")
print("\n===== 达标预警 =====")
send_warnings(emp_list)
# ---------- 执行 ----------
if __name__ == "__main__":
analyze_all(employees)
输出结果
===== 部门平均销售额 =====
销售部: 10250.00
技术部: 14000.00
市场部: 10000.00
===== 销售冠军 =====
🏆 王强,销售额 15000,部门 技术部
===== 达标预警 =====
⚠️ 预警:李娜 销售额 8500,未达标!
⚠️ 预警:陈静 销售额 9000,未达标!
这个案例涵盖了:函数定义、参数传递、返回值、lambda 排序、列表推导、多函数协作,完美融会贯通。
⑨ 常见报错分析与调试排错方法
报错1:NameError —— 名字未定义
def test():
print(age) # age 从未定义
test()
# NameError: name 'age' is not defined
排查:检查变量是否拼写错误,或是否在函数外部定义但未传递进来。
报错2:TypeError —— 参数数量或类型不匹配
def add(a, b):
return a + b
add(3) # TypeError: missing 1 required positional argument
add(3, "5") # TypeError: unsupported operand type(s) for +: 'int' and 'str'
排查:确保传入参数个数正确,类型支持操作(如数字相加、字符串拼接)。
报错3:UnboundLocalError —— 局部变量使用前未赋值
x = 10
def func():
x += 1 # 以为能修改全局 x,实则创建局部 x 但未初始化
print(x)
func()
# UnboundLocalError: local variable 'x' referenced before assignment
排查:如果要在函数内修改全局变量,加上 global x;否则避免使用同名变量。
报错4:IndentationError —— 缩进错误
def greet():
print("hello") # 缩进不对
# IndentationError: expected an indented block
排查:函数体必须缩进(通常 4 个空格)。检查编辑器是否将 tab 与空格混用。
调试技巧
- 用
print()打印中间值 —— 最朴素的调试法,适合新手 - 使用
return分步验证 —— 把复杂函数拆成小函数,单独测试每个小函数 - 使用 Python 的
pdb调试器 —— 在代码中插入import pdb; pdb.set_trace()可设置断点 - 阅读错误栈 —— 从最下面一行开始看,那里是最直接的错误原因
⑩ 代码规范优化与复用性提升策略
规范1:命名要有意义
# ❌ 糟糕
def f(x, y):
return x + y
# ✅ 良好
def calculate_total(price, quantity):
return price * quantity
函数名用动词开头(如 get_、calc_、save_),参数名清晰表达含义。
规范2:函数要“单一职责”
一个函数只做一件事,做得纯粹:
# ❌ 一个函数干太多事
def process_data(data):
# 清洗数据
# 计算统计量
# 生成图表
# 发送邮件
pass
# ✅ 拆分为多个小函数
def clean_data(data): ...
def calc_stats(data): ...
def generate_chart(stats): ...
def send_report(chart): ...
规范3:添加文档字符串(docstring)
def calc_average(numbers):
"""
计算数字列表的平均值。
参数:
numbers: 数字列表(list of int/float)
返回:
float: 平均值,如果列表为空则返回 0.0
"""
if not numbers:
return 0.0
return sum(numbers) / len(numbers)
规范4:合理使用默认参数提升灵活性
def connect_db(host="localhost", port=3306, user="root", password=""):
# 可以设置常用默认值,调用时只传需要更改的
pass
# 调用时只需指定不同参数
connect_db(host="192.168.1.1", user="admin")
规范5:提前返回(Early Return)避免深层嵌套
# ❌ 多层 if 嵌套
def check_user(user):
if user:
if user.is_active:
if user.has_permission:
return "OK"
else:
return "No permission"
else:
return "Inactive"
else:
return "No user"
# ✅ 提前返回,逻辑平坦
def check_user(user):
if not user:
return "No user"
if not user.is_active:
return "Inactive"
if not user.has_permission:
return "No permission"
return "OK"
复用性策略:把通用逻辑抽离成工具函数
假设你在多个地方都需要“判断一个数是否为质数”,不要在每个文件里重写,而是统一放在 utils.py 中:
# utils.py
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
然后在其他文件中导入使用:
from utils import is_prime
if is_prime(17):
print("17 是质数")
总结:函数学习的三个境界
| 境界 | 标志 |
|---|---|
| 能写 | 会定义和调用函数,理解参数和返回值 |
| 会用 | 能熟练运用默认参数、*args、**kwargs,会使用 lambda |
| 善设计 | 懂得拆分函数、遵循单一职责、编写可复用的代码库 |
现在,你已经从零开始完成了 Python 函数的学习。动手写、反复练是掌握的关键——试着把日常重复的操作写成函数,你会发现自己写代码的速度和信心飞速提升!🚀
更多推荐



所有评论(0)