一、为什么要写 import
前面几篇里,我们用过 print()、input()、len() 这些函数。它们有个共同点:Python 装好就自带,写出来就能用,这叫作内置函数。
但 Python 自带的能力是有限的。想算平方根、想抽签、想看今天几号、想读写一个文件——这些 Python 其实全都替我们写好了,只是没有直接摆在你面前,而是分门别类地装在了一个个「工具箱」里。用之前,得先说一句「我要用哪个工具箱」,这句话就是 import。
打个比方:
- 内置函数 = 随身口袋里的笔,一伸手就有(
print、len)。 - 模块(module)= 抽屉里的文具盒,里面装着一堆现成的函数和常量,要先打开(
import)才能拿里面的东西。 - 包(package)= 一个装着好几个文具盒的书包,比如
numpy、pandas。
日常说话时,「库」「模块」「包」这三个词经常混着用,新手不用太纠结,只要记住一句:想用现成的工具,先 import。
下表是这门课最常用到的几个工具箱,先有个印象:
| 工具箱(模块) | 里面有什么 | 什么时候用 |
|---|---|---|
math | 开方、取整、圆周率、阶乘……各种数学计算 | 算面积、算平均数、处理小数 |
random | 随机整数、随机抽一个、打乱顺序 | 抽签、点名、猜数字、掷骰子 |
time | 当前时间戳、暂停几秒、格式化时间 | 让程序停一下、记录运行耗时 |
datetime | 日期、年月日时分秒 | 显示今天是几号、算两个日期差 |
os | 当前目录、拼接路径、判断文件在不在 | 读写文件、批量处理文件 |
json | 把数据转成 JSON 文字、再转回来 | 保存数据、读取接口返回的数据 |
import Math 会报 ModuleNotFoundError: No module named 'Math'。课程思政|科技自立自强 · 自己不会造,先学会用
内置函数像随身口袋里的笔,一伸手就有;math、random 这些模块则是抽屉里的文具盒,得先说一句 import 才能打开。没人能把所有能力都自己造一遍,会用别人的工具箱,也是一种本事;先把现成的用透,将来才有底气去造属于自己的那一件。
二、最常用的写法:import 模块名
这是最推荐、也最不容易出错的写法。
import math
print(math.sqrt(25)) # 开平方
print(math.pi) # 圆周率
运行结果:
5.0
3.141592653589793
写法上有两个要点:
import math单独占一行,写在用它的代码前面。- 调用的时候要带上模块名,中间用小数点连起来:
math.sqrt(25)。这个点读作「的」——math 的 sqrt。
sqrt 是从 math 借来的,不是自己写的;万一你自己也写了个叫 sqrt 的函数,两者也不会打架。一次导入多个模块也可以,中间用逗号隔开:
import math, random
print(math.sqrt(16)) # 4.0
print(random.randint(1, 6)) # 1~6 之间的随机整数,比如 4
import,方便以后加注释、看得出来依赖了什么。三、只拿一两件:from 模块名 import 名字
如果整份代码只用得到模块里的一两个函数,可以把它们单独请出来,用的时候就不用写前缀了。
from math import sqrt, pi
print(sqrt(25)) # 直接写函数名
print(pi)
运行结果:
5.0
3.141592653589793
注意 math. 前缀不见了:直接写 sqrt(25),不是 math.sqrt(25)。
from math import sqrt
def sqrt(x): # 自己又写了一个 sqrt
return "我自定义的sqrt"
print(sqrt(25)) # 我自定义的sqrt
运行结果就是 我自定义的sqrt,不再是数学开方。这类错误不会报错,程序照常跑,只是算出来的结果莫名其妙——最难查的就是这种。
from datetime import date)时才这样写;拿不准就用第一种 import 模块名。四、名字太长的写法:import 模块名 as 别名
as 就是「起个别名」的意思。语法是:
import math as m
print(m.sqrt(25)) # 用别名调用
print(m.pi)
运行结果:
5.0
3.141592653589793
需要留意:起了别名之后,原来的模块名就不好用了。
import math as m
print(m.pi) # 正常:3.141592653589793
print(math.sqrt(9)) # 报错!NameError: name 'math' is not defined.
真要两种都用,就老老实实再写一遍 import math。所以别名别乱起,否则过两天自己都想不起来 m 是什么。
别名真正用得多的地方,是那些名字又长、又已经形成约定的第三方库。这些别名不是你随便发明的,是全世界都这么写,照抄就行:
| 库 | 约定俗成的别名 | 常见写法 |
|---|---|---|
| numpy(数值计算) | np | import numpy as np |
| pandas(表格数据) | pd | import pandas as pd |
| matplotlib.pyplot(画图) | plt | import matplotlib.pyplot as plt |
| tkinter(做窗口界面) | tk | import tkinter as tk |
| seaborn(统计图表) | sns | import seaborn as sns |
| tensorflow(深度学习) | tf | import tensorflow as tf |
math 本来就只有 4 个字母,完全没必要给它起别名。五、标准库和第三方库:装与不装
库分成两大类,这是新手最容易卡住的地方:
| 标准库 | 第三方库 | |
|---|---|---|
| 是什么 | Python 官方自带,装 Python 时一起装好了 | 其他人(公司、个人)写出来发布给大家用的 |
| 要不要安装 | 不用,直接 import | 要先装,再 import |
| 怎么装 | —— | 在命令行里敲 pip install 库名 |
| 例子 | math、random、time、os、json、datetime | numpy、pandas、requests、matplotlib |
装第三方库是两步,新手最常把这两步搞混:
- 装:在命令行里敲(Windows 在开始菜单搜
cmd;macOS 打开「终端」App;注意别在 IDLE 里敲)pip install requests,回车等它跑完。 - 用:回到 Python 文件里写
import requests。
pip install 不是 Python 代码,千万不要写进 .py 文件里。写进去运行会报 SyntaxError: invalid syntax。它只在命令行里敲。| 安装时敲的命令 | 代码里要写 |
|---|---|
pip install pillow | import PIL |
pip install opencv-python | import cv2 |
pip install scikit-learn | import sklearn |
pip install beautifulsoup4 | import bs4 |
pip install pyyaml | import yaml |
import 库名 试一下:能跑就是本机已经有,报 ModuleNotFoundError 就说明还没装。课程思政|数据安全与法治素养 · 装库也要看来源
标准库官方自带,第三方库得自己用 pip install 装上,装和用是两件事。库从哪儿来、谁在维护,值得多问一句。来路不明的包,装进项目就可能顺手装进风险;认准官方源和正规版本,和爱护自己的数据是一回事。
六、先认识这六个标准库
下面这六个标准库不用装,直接就能用,几乎每份作业都会碰到。每段代码都可以原样复制到 IDLE 里跑一遍。
1. math:数学计算
import math
print(math.sqrt(16)) # 4.0 开平方
print(math.ceil(4.2)) # 5 向上取整
print(math.floor(4.8)) # 4 向下取整
print(round(math.pi, 2)) # 3.14 圆周率保留两位小数
print(math.factorial(5)) # 120 阶乘 5×4×3×2×1
round() 是内置函数(不用导入),math.ceil() 来自 math。向上取整是「不管小数多少都往大了进」,4.2 变 5;向下取整是「小数直接扔掉」,4.8 变 4,都跟四舍五入不一样。2. random:抽签、点名、掷骰子
import random
print(random.randint(1, 6)) # 掷骰子:1~6 的整数,比如 4
print(random.choice(['石头', '剪刀', '布'])) # 随机抽一个,比如 布
names = ['小满', '阿宝', '小可']
print(random.choice(names)) # 随机点一个名
randint(1, 6) 的两个数字都包含在内,所以是 1 到 6 共六种结果,正好是一颗骰子。choice() 括号里放的是一串数据,它会从中随机挑一个返回。3. time:时间与暂停
import time
print(time.strftime('%Y-%m-%d')) # 今天的日期(以运行当天为准)
print(time.strftime('%H:%M:%S')) # 现在几点几分几秒(以运行时为准)
print('开始')
time.sleep(2) # 让程序停 2 秒再往下走
print('两秒过去了')
%Y 是四位年份、%m 是月份、%d 是日期、%H:%M:%S 是时分秒,大小写含义不同,照抄就好。下面这段就可以看到暂停效果:开始
(等 2 秒)
两秒过去了
4. datetime:年月日
from datetime import date, datetime
print(date.today()) # 2026-09-20 今天
d = datetime.now() # 现在这一刻
print(d.year, d.month, d.day) # 2026 9 20
from datetime import date,因为 date、datetime 这两个名字很特别,几乎不会和别的东西重名。5. os:路径和文件
import os
print(os.path.join('笔记', 'python.txt')) # 笔记/python.txt 拼路径
print(os.path.exists('/Users/x')) # True 这个路径存在吗
os.path.join() 拼路径,比手写 '笔记/python.txt' 更保险:它会自动用当前系统的分隔符——Windows 下拼出来是 笔记\python.txt,macOS 和 Linux 下是 笔记/python.txt。同一份代码在两个系统上都能用。6. json:把数据存成文字
import json
data = {'name': '小满', 'age': 18}
text = json.dumps(data, ensure_ascii=False)
print(text) # {"name": "小满", "age": 18}
print(json.loads(text)['age']) # 18 再变回来
ensure_ascii=False。不写的话,中文会变成 \u5c0f\u6ee1 这种看不懂的样子。AI 助手小贴士|六个标准库各管一摊,让 AI 用「没有它会很难写」的例子讲清分工。
打开任意 AI 对话工具(网页版或 App 都可以),试试这样问:datetime、os、json、random、math、time 各解决什么问题?每个给一个「没有这个库就要自己写很多代码」的例子
七、五种写法,到底选哪种
把前面讲的重新排一下,就是一张可以贴在电脑旁边的选择表:
| 写法 | 调用时怎么写 | 主要风险 | 建议 |
|---|---|---|---|
import math | math.sqrt(25) | 没有风险,只是多打几个字 | 默认就用这个 |
from math import sqrt | sqrt(25) | 可能和自定义的名字撞车、被覆盖 | 确定只用一两个、且名字独特时用 |
import math as m | m.sqrt(25) | 别名太随意,别人和自己都看不懂 | 名字长或有社区约定时用 |
from math import * | sqrt(25) | 几十个名字一起进来,可能盖掉内置函数 | 脚本里别用 |
import importlib 动态导入 | 先拿到模块对象再调用 | 代码复杂,不好读 | 起步阶段用不上,见到能认识即可 |
import 模块名;第三方库照官方文档给的写法抄(比如 numpy 官方就写 import numpy as np)。暂时记不住就用这一条,绝不会错。顺便交个底:同一个模块用两种写法导入,是允许的,效果也都是好的那一份。
import math
from math import sqrt
print(math.sqrt(9), sqrt(9)) # 3.0 3.0
八、别写 from 模块 import *
from 模块名 import * 那个星号的意思是「把模块里所有东西全拿过来」。看起来最省事,其实是新手最容易踩的坑。
from math import *
print(sqrt(25)) # 5.0 能跑
print(pi) # 3.141592653589793 也能跑
能跑,但代价是:
- 一次倒进来几十个名字。光是
math里就有 60 多个,全部堆到你的程序里。 - 读完代码看不出谁从哪来。看到
sqrt(25),你没法判断这是 math 里的,还是你自己写的,还是别的库里的。 - 可能悄悄盖掉内置函数。这条最要命,看个实例:
print(pow(2, 3)) # 8 内置的 pow,结果是整数
from math import *
print(pow(2, 3)) # 8.0 math 里也有个 pow,把内置的盖掉了
同样是 2 的 3 次方,一个得到 8(整数),一个得到 8.0(小数)。程序不会报错,只是后面参与计算、比较或者写到文件里,结果就都对不上了。
.py 作业)里,一句 from 模块 import * 都别写。只在 IDLE 命令行里随手试试的时候,可以图个方便。课程思政|工匠精神与严谨求实 · 图省事的那把星号
from 模块 import * 看着最省事,却会把几十个名字一次倒进来,还可能悄悄盖掉内置函数——程序照跑不误,结果却对不上。最省事的写法,往往藏着最难查的坑。作业里老老实实写清 import 模块名,让每个名字都有来处,是自律,也是对读代码的人负责。
九、忘了名字怎么办:dir() 和 help()
新手最常问的是「这个库里到底有哪些函数?我该写哪个名字?」不用背,让 Python 自己告诉你。
dir(模块名):列出这个模块里所有东西的名字。数量很多,用眼睛扫一遍找关键词就行。help(模块名.函数名):打印这个函数的说明,告诉你它是干什么的、要传几个参数。
import math
print(dir(math)) # 会打印出一大串名字,60 多个
print(math.sqrt.__doc__) # 看某个函数的说明
运行结果(省略了一长串名字):
Return the square root of x.
help(math.sqrt),会打印出更完整的一段说明,长这样:Help on built-in function sqrt in module math:
sqrt(x, /)
Return the square root of x.
math. 之后按一下 Tab 键,会自动弹出这个模块里的名字列表,比背下来靠谱得多。十、import 写在文件的什么位置
先记结论,这是所有 Python 程序员的共同习惯:
- 统一写在文件最上面,放在文件开头的注释之后,和自己写的代码之间空一行。
- 分组写,顺序是:标准库 → 第三方库 → 自己写的模块,组与组之间空一行。
# 计算圆的面积
import math # ① 标准库
import random
import requests # ② 第三方库(要先 pip install)
import my_utils # ③ 自己写的模块
print(math.pi)
requests 要先 pip install requests,my_utils 得是你自己写过的一个文件,原样复制去跑会报 ModuleNotFoundError——把这两行换成你这次真正用到的库就行。为什么不能随手写在中间?因为 Python 执行到 import 那一行才会去加载模块。技术上,import 写在哪儿都行,只要在使用它之前执行过——下面这段把 import 放在函数后面,照样能跑:
def area(r):
return math.pi * r ** 2
import math # 放在函数定义后面,也能跑
print(area(5)) # 78.53981633974483
能跑,但不要这么写。原因很实在:别人打开你的文件,一眼看到开头的 import,就知道这份程序用到了哪些库;散落在中间的话,读到一半突然冒出一句,还得回头找。
import 写在函数里面(叫作局部导入),只在「这个函数才用得到、或者启动速度要快」的特殊情况下用。起步阶段先统一放文件顶部就好。十一、三个能直接跑的小例子
例 1:掷骰子
import random
print('掷骰子……')
print(f'你掷出了 {random.randint(1, 6)} 点')
例 2:随机点名
import random
names = ['小满', '阿宝', '小可', '果冻']
print(f'请 {random.choice(names)} 同学回答')
random.choice() 每次只挑一个,多按几次运行就是下一个。例 3:算圆的面积和周长
import math
r = float(input('请输入半径:'))
area = math.pi * r ** 2 # 面积 = π × r²
perimeter = 2 * math.pi * r # 周长 = 2 × π × r
print(f'面积是 {round(area, 2)}')
print(f'周长是 {round(perimeter, 2)}')
输入 5 运行的结果:
请输入半径:5
面积是 78.54
周长是 31.42
r ** 2 是 r 的平方,round(数值, 2) 是保留两位小数(内置函数,不用导入)。注意 input() 收到的一律是文字,要先用 float() 转成小数才能参与计算,这一点在第 6 篇《输入输出》里讲过。例 4:猜数字(把前面的东西拼起来)
import random
secret = random.randint(1, 10) # 电脑先偷偷想一个数
guess = int(input('猜一个 1~10 的数字:'))
if guess == secret:
print('猜对了!')
else:
print(f'猜错了,答案是 {secret}')
一次运行的经过:
猜一个 1~10 的数字:5
猜错了,答案是 9
else 换成 elif guess < secret: 之类的判断,就变成一个可以反复猜的游戏了。这一份先专注在「导入库」上,条件判断的细节在第 8 篇《基本数据类型》之后的控制结构里再展开。AI 助手小贴士|import 的两类报错长得像、原因完全不同。
打开任意 AI 对话工具(网页版或 App 都可以),试试这样问:ModuleNotFoundError 和 ImportError 有什么区别?分别举一个触发例子,并给出排查步骤
十二、常见问题(报错手册)
导入相关的报错来来回回就这几种,记住就能自己修。
| 报错信息 | 什么意思/怎么改 |
|---|---|
ModuleNotFoundError: No module named 'maths' | 找不到叫 maths 的模块。先看模块名是不是拼错了(这里多打了个 s,正确的是 math)。顺便注意大小写:import Math 同样会报这个错。 |
ModuleNotFoundError: No module named 'numpy' | 名字拼写没错还报这个,说明这个库本机还没装。到命令行里执行 pip install numpy 装好再运行。别忘了有的库「装的名字」和「导入的名字」不一样。 |
NameError: name 'math' is not defined. Did you forget to import 'math'? | 用了 math 却没写 import math。Python 都直接提醒你了,在文件顶部补上即可。 |
NameError: name 'sqrt' is not defined | 只写了 import math,却直接调用 sqrt(25)。要么改成 math.sqrt(25),要么把导入改成 from math import sqrt。 |
AttributeError: module 'math' has no attribute 'squre'. Did you mean: 'sqrt'? | 函数名拼错了,math 里没有 squre。注意看最后那句提示,Python 经常直接把正确的名字报给你。 |
SyntaxError: invalid syntax | 把 pip install xxx 写进了 .py 文件里。pip 命令只在命令行里敲,Python 文件里只写 import xxx。 |
TypeError: 'module' object is not callable | 把模块当成函数来调用了,比如写了 math(25)。模块只是个工具箱,得从里面取东西,正确的写法是 math.sqrt(25)。 |
import 写了吗?②模块名、函数名拼写和大小写对吗?③是第三方库的话,装了吗——而且装的名字和导入的名字一致吗?还有几个不算报错、但新手会疑惑的现象:
| 现象 | 怎么回事 |
|---|---|
random 每次结果都不一样 | 正常。随机就是随机。如果想让每次运行结果都相同(方便对照答案或检查程序),可以在导入之后写一句 random.seed(42),同一个种子每次都给出同一串结果。 |
| 自己写的函数和导入的名字重名,结果算错却不报错 | 后面的写法盖住了前面的。给自定义的变量、函数起名时,避开 sum、max、sqrt 这类已在用的名字。 |
import math 之后,还是想用 sqrt 这个名字 | 先写 import math,再补一句 from math import sqrt,两种写法可以共存,互不影响。 |
IDLE 里敲完 math. 之后什么也没出现 | 把 import math 先运行一遍(按 F5 或回车),模块加载过之后 Tab 提示才会出来。 |
AI 助手小贴士|import 的几种写法什么时候用哪个,适合让 AI 用生活类比讲一遍,比背规则记得牢。
打开任意 AI 对话工具(网页版或 App 都可以),试试这样问:import math、from math import sqrt、import numpy as np 这三种写法各适合什么场合?用生活里的类比解释,再说说 as 起别名的好处
十三、随堂自测(10 题)
点击选项即可判分,答错的题会立刻显示解析。答完可以看到正确率和错题清单,也可以重新答一遍。
1想在程序里用 math.sqrt() 这个开方功能,必须先写上哪一句?
- A. import math
- B. import math.sqrt
- C. from math import math
- D. math import
import 模块名 才是正确语法,模块名后面不能跟函数名。选项 B 想连函数一起导入是语法错;C、D 把顺序写反了。导入之后再写 math.sqrt(25) 调用即可。2写了 from math import sqrt 之后,下面哪种调用写法才对?
- A. math.sqrt(25)
- B. from sqrt(25)
- C. sqrt(25)
- D. import sqrt(25)
from ... import 把 sqrt 单独请出来之后,直接写函数名就行,不用再加 math. 前缀。反过来,如果只写了 import math,那就必须写 math.sqrt(25),少了前缀会报 NameError。3写完 import math as m 之后,下面哪种写法能算出 25 的开方?
- A. math.sqrt(25)
- B. m.sqrt(25)
- C. m(25)
- D. math(m).sqrt(25)
m 来接,写法还是「别名.函数名」。选项 A 会报 NameError: name 'math' is not defined;C 是把模块当函数调用;D 是编造的语法。4关于 from math import *,下面说法正确的是?
- A. 最省事的写法,正式脚本里推荐一直用
- B. 会把库里几十个名字一次全倒进来,还可能盖掉内置函数,不建议在脚本里用
- C. 只能导入模块里的一个函数
- D. 效果和 import math 完全一样
import math 需要 math. 前缀,两者调用写法完全不同。5执行 from math import * 之后,内置的 pow(2, 3) 结果变成了什么?
- A. 还是 8,整数
- B. 报错,pow 被删掉了
- C. 64
- D. 8.0,变成了小数
pow(2, 3) 得到整数 8;但 math 里也有一个 pow,星号导入把它盖了上来,而它返回的是浮点数,于是变成 8.0。程序不报错,结果却悄悄变了,这正是通配符导入最危险的地方。6敲了 import numpy,报 ModuleNotFoundError: No module named 'numpy',最可能的原因是?
- A. 写法错了,应该写 from numpy import *
- B. numpy 没装,要先在命令行里执行 pip install numpy
- C. numpy 不是 Python 的库,不能导入
- D. 要把 numpy 放在和 .py 文件同一个文件夹里
pip install numpy。选项 A 换成别的写法也一样报错;标准库才不用装,第三方库必须先安装。7在命令行里执行了 pip install pillow,回到代码里应该怎么写?
- A. import pillow
- B. import Pillow
- C. import PIL
- D. from pillow import PIL
PIL,两者不一样,这是新手最常踩的一个坑。同类情况还有 opencv-python → cv2、scikit-learn → sklearn。装完还报找不到,先回来对一下这两个名字。8明明已经 import math,调用 math.squre(25) 报 AttributeError: module 'math' has no attribute 'squre',问题出在哪?
- A. 函数名拼错了,math 里的是 sqrt
- B. math 还没有导入
- C. 25 应该写成字符串
- D. math 需要先 pip install
AttributeError 的意思是「这个模块里没有这个名字」,八成是拼写错误——把 sqrt 写成了 squre。注意报错最后那句 Did you mean: 'sqrt'?,Python 常常直接把正确名字告诉你,读报错一定要读到最后一个词。9关于 import 写在文件里的位置,下面哪种做法最好?
- A. 只能写在 if 语句里面
- B. 写在文件最开头,也可以随手写在中间,两种做法完全一样,没有好坏之分
- C. 必须写在每一个函数内部
- D. 放在文件最上面,并按「标准库 → 第三方库 → 本地模块」分组、用空行隔开
import 那一行才加载模块,所以技术上写在哪里都能跑(这就是选项 B 前半句对、后半句错的原因)。但业界统一习惯是放文件最上面并分组,这样别人一眼就知道这份程序依赖哪些库。10想在 IDLE 里查一查 math 库里有没有计算对数的函数、某个函数怎么用,最方便的做法是什么?
- A. 把 math 里 60 多个名字全背下来
- B. 重新安装一次 Python
- C. 敲 dir(math) 看有哪些名字,敲 help(math.sqrt) 看某个函数的用法
- D. 在代码里写 print(math)
dir(模块) 列出模块里的全部名字,用来找关键词;help(模块.函数) 打印某个函数的说明。不要背——在 IDLE 里敲完 math. 再按一下 Tab 键,还能直接弹出名字列表。选项 D 打印出来的是模块本身的信息,看不到函数清单。