很多人第一次学 Python 时,都会有点懵: "为什么一会儿 import,这个 from ... import ...,还有什么 init.py,看着就头大。"
别急!其实导入模块这件事,本质就像打开工具箱找工具。只是工具箱有大有小,有时候我们只需要拿一把螺丝刀,有时候却要整套扳手。
今天这篇文章,就带你彻底搞懂 Python 的模块与包导入。别担心,我会用最接地气的方式讲解,还会带你跑几个小例子,学完你就能轻轻松松用好这些工具。😎

一、为什么要有模块和包?
如果你写过几行 Python 代码,就会发现:写个小脚本还好,但当代码越来越长时,整齐度和复用性简直是一场灾难。
这时候,模块和包就像收纳盒一样,把乱糟糟的代码装进去,随时拿取。
- 模块(module) :一个
.py
文件就是一个模块。 - 包(package) :一个文件夹,里面放着一堆模块。传统上需要
__init__.py
,但从 Python 3.3 起没这个也行。
你可以把它们想象成: 👉 模块 = 一本工具手册 👉 包 = 一整套工具书架
这样一来,你不需要每次都从头写函数,直接用别人整理好的工具就行。比如:
math
模块让你一行代码搞定开平方;os
模块让你轻松操作文件;- 甚至你自己写的函数,也能变成模块,随时调用。
是不是很香?🤩
二、最常见的导入方式:import
这是最简单的方式,相当于说:"Python,帮我打开整个工具箱!"
示例 1:导入彩蛋模块 this
kotlin
import this
运行后会发现,屏幕上出现一大段文字------这就是著名的 《Python 之禅》 。 它并不是技术文档,而是 Tim Peters 写的关于 Python 编程哲学的箴言。
其中几句特别经典:
- Simple is better than complex. 简单胜过复杂
- Readability counts. 可读性很重要
- Now is better than never. 现在做比永远不做好
很多 Python 开发者甚至会把它贴在工位墙上,像鸡汤一样提醒自己。
示例 2:导入 math
模块
lua
import math
# 计算平方根
result = math.sqrt(16)
print(f"16 的平方根是 {result}")
输出:
16 的平方根是 4.0
注意这里要写 math.sqrt
,因为 Python 必须知道你调用的是 math
里的函数,而不是别的地方的。 这点小"啰嗦",反而是为了安全,避免同名函数冲突。
三、只拿想要的:from ... import ...
有时候整个工具箱太大,而你只想用其中一两个工具,那就用:
javascript
from 模块 import 工具
比如我只想用 math
里的 sqrt
和 pi
:
python
from math import sqrt, pi
print(f"16 的平方根是 {sqrt(16)}")
print(f"圆周率是 {pi}")
是不是比 math.sqrt
更简洁?
但要小心"撞名"
假设你这么写:
lua
from math import pi
from numpy import pi
print(pi)
结果你就傻眼了------到底哪个 pi?🤯 这种情况会让调试变成噩梦。
正确写法:给变量改个外号
python
from math import pi as math_pi
from numpy import pi as numpy_pi
print(math_pi)
print(numpy_pi)
用 as
起个别名,干净又清晰。
四、一次性全拿:from 模块 import *
还有一种写法:
lua
from math import *
print(sqrt(16))
print(pi)
看起来很爽对吧?一行就能用所有工具。
但这其实是个坑:
- 污染命名空间:你导入的东西太多,很可能和自己写的函数撞名。
- 可读性差 :别人(包括未来的你)看到
sqrt(16)
,根本不知道它来自哪个模块。
所以除非特殊情况(比如交互式调试),最好少用这种写法。
五、关于包的导入
前面我们聊的都是单个模块,包其实就是"文件夹里的多个模块"。
比如你有一个文件结构:
markdown
my_project/
utils/
__init__.py
math_tools.py
string_tools.py
这时 utils
就是一个包,math_tools
、string_tools
是其中的模块。
你可以这样导入:
javascript
from utils import math_tools
或者只拿 math_tools
里的某个函数:
javascript
from utils.math_tools import add_numbers
这样,你就能把自己的代码组织得像积木一样清晰。
六、导入的最佳实践
学到这里,你可能有点晕:"这么多方式,到底该用哪个?" 其实核心思路很简单:既要方便自己写,又要方便别人读。
总结一下:
导入方式 | 优点 | 缺点 | 使用建议 |
---|---|---|---|
import 模块 |
最安全,冲突少 | 写代码时要多加前缀 | 推荐大多数情况用 |
from 模块 import 工具 |
简洁直观 | 可能撞名 | 小范围用,避免滥用 |
from 模块 import * |
一次全拿,少写字 | 污染命名空间,可读性差 | 除非特别需要,否则别用 |
七、延伸思考:模块导入的哲学
学到这里,不妨停下来想一想:
Python 之所以推崇模块化,本质上是为了------
- 避免重复造轮子:能用的就拿来用,别死磕。
- 让代码像搭积木一样:模块是积木块,包是积木盒。
- 保持清晰和可读:写给自己,更是写给未来的合作者。
换句话说:模块导入不仅仅是技术细节,更是一种写代码的思维方式。
当你慢慢习惯用模块组织代码时,你就会发现写 Python 变得越来越轻松。
八、预告:写你自己的模块
今天我们学的是"怎么用别人的工具"。下一步,你也可以自己写一个 .py
文件,然后在别的地方 import
。
比如写个 hello.py
:
python
def say_hello(name):
return f"Hello, {name}!"
然后在主程序里:
go
import hello
print(hello.say_hello("Python"))
这样,你也算迈出了成为"模块作者"的第一步。👏
写在最后
Python 的世界很大,学会导入模块和包,就像掌握了打开宝藏的钥匙。
记住:
- 不怕写不好代码,只怕不用好工具。
- import 是新手的拐杖,也是高手的武器。
等你再往前走,就会发现:函数、类、模块、包......它们其实是同一条线上的不同阶段。一步步学下去,你写的 Python 会越来越漂亮。
所以,别怕,现在就打开 Python,敲一行:
kotlin
import this
然后对自己说: 未来的 Python 大师,就是我!😎