在前几篇中,我们已经掌握了变量、数据容器和流程控制,能写出一些简单的程序了。但如果面对复杂任务(比如写一个包含 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. 自定义模块:复用自己的代码

如果你的代码写得好,也可以把函数存成模块,在其他程序中引用。

步骤:

  1. 新建一个 Python 文件(比如my_tools.py),写入函数:

    # my_tools.py
    def add(a, b):
        return a + b
    
    def multiply(a, b):
        return a * b
    
  2. 在同一文件夹下的另一个文件(比如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 文件),也能从文件中读取数据,实现 “数据持久化”—— 这是做数据分析、写管理系统的必备技能。

如果这篇帮你理解了函数和模块,欢迎在评论区分享你的实践:比如你写了什么实用的函数,或者用了哪个有趣的模块,我们一起交流~

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐