从零学 Python 系列(五):函数与模块,让代码更简洁、更易复用
在前几篇中,我们已经掌握了变量、数据容器和流程控制,能写出一些简单的程序了。但如果面对复杂任务(比如写一个包含 1000 行代码的系统),直接堆砌代码会导致两个大问题:一是重复代码太多(比如同一个计算逻辑写了 10 遍),二是代码杂乱无章(想改一个功能要翻半天)。这篇就带你学习解决这些问题的 “利器”——函数(Function) 和模块(Module),让你的代码变得 “模块化、可复用”,专业度瞬间提升。
一、函数:把代码 “打包成工具”
函数就像一个 “预制工具”—— 你可以把常用的代码块(比如计算平均分、判断是否成年)打包起来,取个名字,以后需要用时直接 “调用” 这个名字,不用重复写代码。
1. 为什么需要函数?看一个对比
假设你需要计算 3 个班级的平均分,每个班级有 5 个学生的成绩。
没有函数的写法(重复代码多):
# 计算一班平均分
class1 = [85, 92, 78, 90, 88]
sum1 = 0
for score in class1:
sum1 += score
avg1 = sum1 / len(class1)
print("一班平均分:", avg1)
# 计算二班平均分(重复写了几乎一样的代码)
class2 = [76, 89, 91, 65, 82]
sum2 = 0
for score in class2:
sum2 += score
avg2 = sum2 / len(class2)
print("二班平均分:", avg2)
# 计算三班平均分(又重复了)
class3 = [95, 85, 75, 80, 90]
sum3 = 0
for score in class3:
sum3 += score
avg3 = sum3 / len(class3)
print("三班平均分:", avg3)
用函数的写法(代码更简洁):
# 定义“计算平均分”的函数(打包重复逻辑)
def calculate_average(scores):
total = 0
for score in scores:
total += score
return total / len(scores) # 返回计算结果
# 调用函数(直接使用打包好的逻辑)
class1 = [85, 92, 78, 90, 88]
class2 = [76, 89, 91, 65, 82]
class3 = [95, 85, 75, 80, 90]
print("一班平均分:", calculate_average(class1))
print("二班平均分:", calculate_average(class2))
print("三班平均分:", calculate_average(class3))
两段代码结果相同,但用函数的版本:
- 重复代码从 3 段变成 1 段,修改逻辑时只需改函数内部;
- 代码意图更清晰(看到
calculate_average就知道是算平均分)。
2. 定义函数:用 def 关键字 “打包” 代码
函数的定义格式很固定,记住这个模板:
def 函数名(参数1, 参数2, ...):
# 函数内部的代码(要缩进)
代码块
return 返回值 # 可选,没有return则返回None
(1)无参数、无返回值的函数
比如一个简单的 “打招呼” 函数,不需要输入数据,也不需要返回结果。
代码示例:
def say_hello():
print("Hello! 欢迎学习Python函数~")
# 调用函数:函数名+()
say_hello() # 输出:Hello! 欢迎学习Python函数~
say_hello() # 可以多次调用
(2)带参数的函数
参数就像函数的 “原材料入口”,让函数可以处理不同的数据(比如计算不同班级的平均分)。
代码示例:
# 带一个参数:name
def greet(name):
print(f"你好,{name}!")
# 调用时传入参数
greet("张三") # 输出:你好,张三!
greet("李四") # 输出:你好,李四!
# 带多个参数:a和b,计算和
def add(a, b):
print(f"{a} + {b} = {a + b}")
add(3, 5) # 输出:3 + 5 = 8
add(10, 20) # 输出:10 + 20 = 30
(3)带返回值的函数
用return语句把函数的计算结果 “送出去”,方便后续使用(比如把结果存到变量里)。
代码示例:
# 计算面积,返回结果
def calculate_area(length, width):
area = length * width
return area # 返回面积
# 调用函数,接收返回值
room_area = calculate_area(5, 4) # 5米×4米的房间
print(f"房间面积是:{room_area}平方米") # 输出:房间面积是:20平方米
# 直接用返回值做计算
total_area = calculate_area(5, 4) + calculate_area(3, 3) # 房间+阳台
print(f"总面积是:{total_area}平方米") # 输出:总面积是:29平方米
- 注意:
return之后的代码不会执行(函数会立即结束),比如:def test(): return 100 print("这句话不会被执行") # 永远不会运行 print(test()) # 输出:100
3. 函数的进阶技巧:默认参数与参数传递
(1)默认参数:给参数设 “默认值”
如果希望某些参数 “不填时用默认值”,可以在定义函数时指定默认值。
代码示例:
# 给gender设默认值"未知"
def introduce(name, age, gender="未知"):
print(f"姓名:{name},年龄:{age},性别:{gender}")
# 只传name和age(用默认gender)
introduce("张三", 18) # 输出:姓名:张三,年龄:18,性别:未知
# 传所有参数(覆盖默认值)
introduce("李四", 20, "男") # 输出:姓名:李四,年龄:20,性别:男
- 规则: 有默认值的参数必须放在无默认值参数的后面,否则会报错。
(2)关键字参数:让调用更清晰
调用函数时,可以用 “参数名 = 值” 的方式传参,不用记参数顺序。
代码示例:
def calculate_rectangle(length, width):
return length * width
# 按位置传参(需要记顺序)
area1 = calculate_rectangle(5, 4)
# 按关键字传参(更清晰,不怕顺序错)
area2 = calculate_rectangle(length=5, width=4)
area3 = calculate_rectangle(width=4, length=5) # 顺序反了也没关系
print(area1, area2, area3) # 输出:20 20 20(结果相同)
4. 实战:用函数重构 “学生成绩系统”
把之前的 “学生成绩查询系统” 中的重复逻辑(比如判断等级、计算平均分)拆成函数,让代码更清晰。
重构后代码:
# 函数1:判断成绩等级
def get_level(score):
if score >= 90:
return "优秀"
elif score >= 80:
return "良好"
elif score >= 60:
return "及格"
else:
return "不及格"
# 函数2:检查成绩是否合法
def is_valid_score(score):
return 0 <= score <= 100 # 返回布尔值
# 主程序
print("=== 简易成绩查询系统 ===")
while True:
score_input = input("请输入成绩(0-100,输入-1退出):")
score = int(score_input)
if score == -1:
print("退出系统,再见!")
break
if not is_valid_score(score): # 调用函数检查合法性
print("成绩无效,请重新输入!")
continue
level = get_level(score) # 调用函数获取等级
print(f"成绩等级:{level}\n")
- 优势: 现在如果想修改等级划分标准(比如把 60 分及格改成 50 分),只需改
get_level函数,不用动主程序,维护起来更方便。
二、模块:引用别人写好的 “工具包”
Python 的强大之处在于 “站在巨人的肩膀上”—— 全世界的开发者写了无数现成的 “模块”(可以理解为 “函数和变量的集合”),你不需要重复造轮子,直接引用就能用。
1. 什么是模块?举个例子
比如你想生成随机数(比如抽奖程序),不用自己写复杂的算法,Python 自带random模块,里面有现成的函数。
代码示例:
# 导入random模块
import random
# 调用模块里的函数:random.randint(a, b)生成a到b之间的随机整数
print("随机生成1-10的数字:", random.randint(1, 10))
print("随机生成100-200的数字:", random.randint(100, 200))
# 从列表中随机选一个元素
fruits = ["苹果", "香蕉", "橙子"]
print("随机选一个水果:", random.choice(fruits))
- 常见内置模块:
math:数学运算(求平方根、三角函数等);datetime:处理日期时间;os:操作文件和文件夹。
2. 导入模块的 3 种方式
(1)import 模块名(推荐)
导入整个模块,用 “模块名。函数名” 调用。
import math
print("3的平方:", math.pow(3, 2)) # 9.0
print("16的平方根:", math.sqrt(16)) # 4.0
(2)from 模块名 import 函数名
只导入需要的函数,调用时不用加模块名(但可能和自己的函数重名)。
from math import sqrt, pow
print("3的平方:", pow(3, 2)) # 直接用pow,不用math.pow
print("16的平方根:", sqrt(16)) # 直接用sqrt
(3)import 模块名 as 别名(模块名太长时用)
给模块起个别名,简化调用。
import datetime as dt # 给datetime起别名dt
# 获取当前时间
now = dt.datetime.now()
print("当前时间:", now) # 输出类似:2023-10-01 15:30:00.123456
3. 自定义模块:复用自己的代码
如果你的代码写得好,也可以把函数存成模块,在其他程序中引用。
步骤:
-
新建一个 Python 文件(比如
my_tools.py),写入函数:# my_tools.py def add(a, b): return a + b def multiply(a, b): return a * b -
在同一文件夹下的另一个文件(比如
main.py)中引用:# main.py import my_tools # 导入自己的模块 print("2+3=", my_tools.add(2, 3)) # 5 print("2×3=", my_tools.multiply(2, 3)) # 6生成中
下一篇预告:文件操作,让代码能 “读写数据”
学会了函数和模块,代码变得更整洁、更易复用了。但目前的程序有个问题:关闭程序后,数据(比如学生信息、成绩)会丢失。下一篇会带你学习 “文件操作”,让代码能把数据保存到电脑硬盘(比如 txt、csv 文件),也能从文件中读取数据,实现 “数据持久化”—— 这是做数据分析、写管理系统的必备技能。
如果这篇帮你理解了函数和模块,欢迎在评论区分享你的实践:比如你写了什么实用的函数,或者用了哪个有趣的模块,我们一起交流~
更多推荐


所有评论(0)