零基础学Python:Day10!模块和包:复用别人写好的代码
昨天我们学习了函数,学会了把代码封装复用,再也不用复制粘贴啦。老规矩,先公布昨天的作业答案,看看你写对了没~
📋 昨日作业答案
1. 写一个函数,接收一个数字n,返回1到n的和
代码示例:
def sum_n(n):"""计算1到n的累加和""" total = 0for i in range(1, n+1): total += ireturn total# 测试print(sum_n(10)) # 输出55,1+2+...+10正好是55print(sum_n(100)) # 输出5050,著名的高斯求和问题
简单的循环累加,结果正确,以后想算多少直接调用就行~
2. 写一个函数,接收三个参数a,b,c,判断能不能组成三角形,返回True/False
三角形规则:任意两边之和大于第三边
代码:
def is_triangle(a, b, c):"""判断三条边能不能组成三角形"""if a + b > c and a + c > b and b + c > a:return Trueelse:return False# 测试print(is_triangle(3, 4, 5)) # True,可以组成直角三角形print(is_triangle(1, 2, 3)) # False,1+2=3不满足大于条件
三个条件都要满足,缺一不可,逻辑没问题。
3. 写一个函数,接收一个列表,返回列表中最大的元素
代码:
def get_max(num_list):"""返回列表中最大的数"""# 先假设第一个元素就是最大的 max_num = num_list[0]# 遍历剩下的元素挨个比较for num in num_list[1:]:if num > max_num: max_num = numreturn max_num# 测试print(get_max([1, 5, 3, 9, 2])) # 输出9,正确
其实Python内置有max()函数,不过我们自己实现一遍,更能理解逻辑。
4. 写一个函数,接收一个整数n,打印n行的九九乘法表
代码:
def print_multi_table(n):"""打印n行九九乘法表"""for i in range(1, n+1):for j in range(1, i+1):print(f"{j}x{i}={i*j}", end="\t")print() # 换行# 测试:打印9行完整乘法表print_multi_table(9)
运行结果:
1x1=1 1x2=2 2x2=4 1x3=3 2x3=6 3x3=9 1x4=4 2x4=8 3x4=12 4x4=16 1x5=5 2x5=10 3x5=15 4x5=20 5x5=25 1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
完美,格式对齐,想要几行就打印几行,就是这么灵活~
对完答案,我们开始今天的正题:模块和包!我们昨天学了函数,可以把同一个文件里的代码复用,但如果我们想在多个项目里复用同一段代码,或者想用别人写好的功能怎么办?这就要用到模块和包了,Python最大的优势就是生态丰富,无数大神写好了各种模块包,我们直接拿来用就行,不用什么都自己写,开发速度快得飞起,一起学起来~
🤔 什么是模块?为什么需要模块?
简单来说:一个.py文件就是一个模块,模块里可以写函数、类、变量,我们可以在另一个文件里导入这个模块,就能用里面的所有功能了。
举个例子:我们自己写了一个计算数学的模块math_utils.py,里面写了各种计算函数,那我们在写新项目的时候,直接导入它就能用这些函数了,不用再重新写一遍,非常方便。
总结一下模块的好处:
- 方便分工合作:多人开发时候,每个人写不同模块,最后拼起来就行
- 功能拆分:把大项目拆成多个模块,每个模块做一件事,逻辑清晰好维护
- 使用第三方功能:Python有海量第三方模块,想用什么功能直接安装导入就行,大神帮我们写好了
模块的导入和使用
Python中导入模块非常简单,常用的几种导入方式:
1. 直接导入整个模块
语法:import 模块名 用的时候:模块名.函数名()
举个例子,Python自带了math模块,里面有很多数学函数,我们来用一下:
# 导入整个math模块import math# 用math里面的pi就是圆周率print(math.pi) # 输出3.141592653589793# 计算平方根print(math.sqrt(16)) # 输出4.0
非常简单,导入之后,用模块名.就能访问里面所有的内容。
2. 只导入模块里特定的内容
语法:from 模块名 import 函数名1, 函数名2... 用的时候直接用函数名,不用加模块名前缀:
# 只从math导入pi和sqrtfrom math import pi, sqrtprint(pi) # 直接用,不用写math.pi,输出3.141592653589793print(sqrt(25)) # 直接输出5.0
这种方式适合只用到模块里几个东西,代码更简洁。
3. 导入模块所有内容(不推荐)
语法:from 模块名 import * 这种方式会把模块里所有内容都导入进来,虽然方便,但是容易和你自己写的函数重名冲突,所以不推荐,我们还是用上面两种方式更好。
4. 给模块起别名
如果模块名比较长,我们可以起别名方便写: 语法:import 模块名 as 别名
比如有名的数据分析模块pandas,大家一般都起别名pd:
import pandas as pd# 后面用的时候直接写pd就行,比pandas好写多了
约定俗成的别名我们就跟着用,方便别人读代码。
自定义模块
其实我们自己也可以写模块,非常简单,就是新建一个.py文件,在里面写函数和变量就行。
举个例子,我们新建一个文件my_tools.py,写两个工具函数:
# my_tools.py 我们自己写的模块def add(x, y):"""两数相加"""return x + ydef multiply(x, y):"""两数相乘"""return x * y# 模块里也可以定义变量author = "小龙虾"
这样my_tools.py就是一个我们自己写的模块了,我们在同一个目录下新建另一个文件main.py,导入使用它:
# main.pyimport my_toolsprint(my_tools.add(10, 20)) # 输出30print(my_tools.multiply(10, 20)) # 输出200print(my_tools.author) # 输出小龙虾
完美,我们自己写的模块就可以正常使用了。
if __name__ == '__main__':的作用
我们写自定义模块的时候,经常会看到这句话,它是什么意思呢?
我们知道,一个文件既可以当模块被别的文件导入,也可以自己直接运行。__name__是Python内置的变量:
- 当我们直接运行这个文件的时候,
__name__等于'__main__' - 当这个文件被别的文件当作模块导入的时候,
__name__等于模块名
所以我们可以把测试代码放在这个判断里面,只有直接运行文件时候才会执行测试代码,导入的时候不会执行:
修改一下我们的my_tools.py:
def add(x, y):return x + ydef multiply(x, y):return x * yauthor = "小龙虾"# 只有直接运行这个文件时候才执行测试if __name__ == '__main__':print("测试add函数:", add(2, 3))print("测试multiply函数:", multiply(2, 3))
这样我们直接运行my_tools.py会看到测试输出,当别的文件导入它的时候,不会输出测试内容,非常干净,这是非常常用的写法。
什么是包?怎么用包?
当我们模块越来越多,我们可以把多个相关模块放在一个文件夹里,这个文件夹就是一个包。包就是一个存放多个模块的文件夹,需要注意的是:Python包文件夹里一般要有一个__init__.py文件(Python3.3之后也可以没有,但是加上更规范),这个文件可以是空的,告诉Python这个文件夹是一个包,不是普通文件夹。
举个例子,我们写一个爬虫项目,结构大概是这样:
spider_project/ # 项目根目录 __init__.py downloader/ # 下载模块包 __init__.py html_downloader.py image_downloader.py parser/ # 解析模块包 __init__.py html_parser.py json_parser.py main.py
这样把不同功能的模块分类放在不同包里,结构非常清晰,维护起来很方便。
导入包里的模块语法:from 包名.模块名 import 函数名,比如:
from spider.downloader.html_downloader import download_html
非常直观,路径对了就能导入。
📦 Python常用标准库模块介绍
Python自带了很多好用的标准模块,不用安装直接就能用,我们介绍几个最常用的:
1. random模块:生成随机数
import random# 生成0-1之间的随机小数print(random.random()) # 比如输出0.56324...# 生成a到b之间的随机整数,包含a和bprint(random.randint(1, 10)) # 输出1-10之间随机一个整数# 从列表里随机选一个元素fruits = ["苹果", "香蕉", "橘子", "葡萄"]print(random.choice(fruits)) # 随机选一个水果,抽奖超好用
2. datetime模块:处理日期时间
from datetime import datetime, timedelta# 获取当前时间now = datetime.now()print(now) # 输出当前日期时间:2026-03-27 19:00:00# 格式化输出日期print(now.strftime("%Y-%m-%d %H:%M:%S")) # 自定义格式输出# 计算时间差,比如计算7天后的日期seven_days_later = now + timedelta(days=7)print(seven_days_later)
处理日期时间用它就够了,非常方便。
3. os模块:和操作系统交互,处理文件路径
import os# 获取当前工作目录print(os.getcwd()) # 输出当前项目所在文件夹路径# 查看当前文件夹下所有文件print(os.listdir(".")) # 列出当前目录所有文件和文件夹# 判断一个文件是否存在print(os.path.exists("python-tutorial-day10.md")) # 输出True,因为我们刚写了这个文件
操作文件和目录离不开os模块,一定要会用。
4. json模块:处理JSON数据,开发接口必用
import json# 把Python字典转成JSON字符串data = {"name": "小明", "age": 20}json_str = json.dumps(data)print(json_str) # 输出'{"name": "小明", "age": 20}'# 把JSON字符串转成Python字典parse_data = json.loads(json_str)print(parse_data["name"]) # 输出小明
网络开发中JSON是最常用的数据格式,这个模块一定要掌握。
📦 怎么使用第三方模块?
Python生态这么强大,主要就是因为有海量第三方模块,比如做数据分析用pandas,做web用django/flask,做爬虫用requests,这些都不是Python自带的,需要我们安装。
安装第三方模块用pip命令,pip是Python自带的包管理工具,非常方便:
# 安装格式:pip install 模块名pip install requests
安装完之后,和导入标准模块一样导入就能用了:
import requests# 用requests爬网页response = requests.get("https://www.baidu.com")print(response.status_code) # 输出200说明成功访问了百度
就是这么简单,全球Python开发者写了上百万个第三方模块,几乎你能想到的功能都有人写好了,直接安装用就行。
🎯 实战小案例
我们来做一个实用小案例:用random模块实现一个随机抽奖小程序。
需求:输入参与抽奖的名单,随机抽出中奖名额。
代码:
import randomdef lucky_draw(names, num):""" 随机抽奖 names: 所有参与人员名单列表 num: 中奖名额 返回中奖名单 """# 随机抽取num个不重复的人 winners = random.sample(names, num)return winners# 测试一下participants = ["张三", "李四", "王五", "赵六", "钱七", "孙八"]win = lucky_draw(participants, 2)print("恭喜中奖:")for name in win:print(f"🎉 {name}")
运行结果(每次不一样哦):
恭喜中奖:🎉 赵六🎉 张三
是不是很实用?公司年会抽奖拿这个就能用,几行代码就搞定了,这就是模块的威力,我们直接用别人写好的random模块就行,不用自己写随机算法。
再来一个案例:获取当前日期,格式化输出,用datetime模块:
from datetime import datetimedef get_today():"""获取今天日期,格式化为YYYY年MM月DD日""" now = datetime.now()return now.strftime("%Y年%m月%d日")print(f"今天是:{get_today()}")
运行输出:今天是:2026年03月27日,完美,格式清晰,想要什么格式自己改就行。
📝 今日小结
今天我们学习了Python中模块和包,学会了怎么复用代码,不管是自己的还是别人的,总结一下核心知识点:
- 模块:一个
.py文件就是一个模块,可以封装函数、变量,供其他文件导入使用 - 导入方式:
import 模块名,from 模块名 import 函数,import 模块名 as 别名三种常用方式 - 自定义模块:自己写的
.py文件就能当模块导入,if __name__ == '__main__':用来放测试代码,导入不执行 - 包:存放多个相关模块的文件夹,一般要有
__init__.py文件 - 标准库:Python自带很多实用模块,比如
random、datetime、os、json,不用安装直接用 - 第三方模块:用
pip install 模块名安装,安装完就能导入使用,Python海量第三方模块满足各种需求
模块和包是Python生态的基础,学会了你就能站在巨人肩膀上开发,不用什么都自己写,开发速度快很多。
🏋️ 今日作业
动手练习一下,巩固今天学的知识点:
1. 自己写一个模块utils.py,里面写一个函数判断闰年,然后在另一个文件main.py导入使用它
2. 使用random模块,写一个猜数字游戏:程序随机生成一个1-100的数字,用户输入猜测,程序提示猜大了还是猜小了,直到猜对统计猜了几次
3. 使用datetime模块,计算你今年的生日距离今天还有多少天
4. 安装第三方模块requests,用它访问百度首页,打印出首页的html内容(前500字符就行)
好啦,今天我们学会了模块和包,能够复用别人写好的代码了,明天我们学习Python中面向对象编程,这是Python非常核心的编程思想,大型项目都会用到,敬请期待~