今天你 AI 赋能了吗?打开浏览器,在地址栏输入 xuefulu.ai ,按下 Enter 即可访问学府路1号!
2026年10月14日 星期三 10:40:09
常用网址: | | 学府路1号 https://xuefulu.ai | 下载 Python https://xuefulu.ai/Python.html | 下载 TRAE https://xuefulu.ai/Trae.html

一、为什么要写 import

前面几篇里,我们用过 print()、input()、len() 这些函数。它们有个共同点:Python 装好就自带,写出来就能用,这叫作内置函数。

但 Python 自带的能力是有限的。想算平方根、想抽签、想看今天几号、想读写一个文件——这些 Python 其实全都替我们写好了,只是没有直接摆在你面前,而是分门别类地装在了一个个「工具箱」里。用之前,得先说一句「我要用哪个工具箱」,这句话就是 import。

打个比方:

日常说话时,「库」「模块」「包」这三个词经常混着用,新手不用太纠结,只要记住一句:想用现成的工具,先 import。

下表是这门课最常用到的几个工具箱,先有个印象:

工具箱(模块)里面有什么什么时候用
math开方、取整、圆周率、阶乘……各种数学计算算面积、算平均数、处理小数
random随机整数、随机抽一个、打乱顺序抽签、点名、猜数字、掷骰子
time当前时间戳、暂停几秒、格式化时间让程序停一下、记录运行耗时
datetime日期、年月日时分秒显示今天是几号、算两个日期差
os当前目录、拼接路径、判断文件在不在读写文件、批量处理文件
json把数据转成 JSON 文字、再转回来保存数据、读取接口返回的数据
一个小规矩:模块名一律用小写字母,而且区分大小写。写 import Math 会报 ModuleNotFoundError: No module named 'Math'。

课程思政|科技自立自强 · 自己不会造,先学会用

内置函数像随身口袋里的笔,一伸手就有;math、random 这些模块则是抽屉里的文具盒,得先说一句 import 才能打开。没人能把所有能力都自己造一遍,会用别人的工具箱,也是一种本事;先把现成的用透,将来才有底气去造属于自己的那一件。

二、最常用的写法:import 模块名

这是最推荐、也最不容易出错的写法。

Python
import math

print(math.sqrt(25))      # 开平方
print(math.pi)            # 圆周率

运行结果:

输出
5.0
3.141592653589793

写法上有两个要点:

  1. import math 单独占一行,写在用它的代码前面。
  2. 调用的时候要带上模块名,中间用小数点连起来:math.sqrt(25)。这个点读作「的」——math 的 sqrt。
为什么不嫌麻烦写前缀?因为一眼就能看出 sqrt 是从 math 借来的,不是自己写的;万一你自己也写了个叫 sqrt 的函数,两者也不会打架。

一次导入多个模块也可以,中间用逗号隔开:

Python
import math, random

print(math.sqrt(16))          # 4.0
print(random.randint(1, 6))   # 1~6 之间的随机整数,比如 4
语法没错,但正式一点的代码习惯一行只写一个 import,方便以后加注释、看得出来依赖了什么。

三、只拿一两件:from 模块名 import 名字

如果整份代码只用得到模块里的一两个函数,可以把它们单独请出来,用的时候就不用写前缀了。

Python
from math import sqrt, pi

print(sqrt(25))     # 直接写函数名
print(pi)

运行结果:

输出
5.0
3.141592653589793

注意 math. 前缀不见了:直接写 sqrt(25),不是 math.sqrt(25)。

⚠️ 小心名字撞车。不带前缀的名字,等于把它直接摆进了你自己的桌面。如果后面你又定义了一个同名的东西,谁写在后面谁作数,先导入的会被盖掉。
Python
from math import sqrt

def sqrt(x):                    # 自己又写了一个 sqrt
    return "我自定义的sqrt"

print(sqrt(25))                 # 我自定义的sqrt

运行结果就是 我自定义的sqrt,不再是数学开方。这类错误不会报错,程序照常跑,只是算出来的结果莫名其妙——最难查的就是这种。

所以:确定只用一两个功能、而且名字很特别(比如 from datetime import date)时才这样写;拿不准就用第一种 import 模块名。

四、名字太长的写法:import 模块名 as 别名

as 就是「起个别名」的意思。语法是:

Python
import math as m

print(m.sqrt(25))     # 用别名调用
print(m.pi)

运行结果:

输出
5.0
3.141592653589793

需要留意:起了别名之后,原来的模块名就不好用了。

Python
import math as m
print(m.pi)          # 正常:3.141592653589793
print(math.sqrt(9))  # 报错!NameError: name 'math' is not defined.

真要两种都用,就老老实实再写一遍 import math。所以别名别乱起,否则过两天自己都想不起来 m 是什么。

别名真正用得多的地方,是那些名字又长、又已经形成约定的第三方库。这些别名不是你随便发明的,是全世界都这么写,照抄就行:

库约定俗成的别名常见写法
numpy(数值计算)npimport numpy as np
pandas(表格数据)pdimport pandas as pd
matplotlib.pyplot(画图)pltimport matplotlib.pyplot as plt
tkinter(做窗口界面)tkimport tkinter as tk
seaborn(统计图表)snsimport seaborn as sns
tensorflow(深度学习)tfimport tensorflow as tf
记住一个判断标准:别人也在用的别名才用,自己发明的别名只会让自己和别人都看不懂。math 本来就只有 4 个字母,完全没必要给它起别名。

五、标准库和第三方库:装与不装

库分成两大类,这是新手最容易卡住的地方:

标准库第三方库
是什么Python 官方自带,装 Python 时一起装好了其他人(公司、个人)写出来发布给大家用的
要不要安装不用,直接 import要先装,再 import
怎么装——在命令行里敲 pip install 库名
例子math、random、time、os、json、datetimenumpy、pandas、requests、matplotlib

装第三方库是两步,新手最常把这两步搞混:

  1. 装:在命令行里敲(Windows 在开始菜单搜 cmd;macOS 打开「终端」App;注意别在 IDLE 里敲) pip install requests,回车等它跑完。
  2. 用:回到 Python 文件里写 import requests。
⚠️ pip install 不是 Python 代码,千万不要写进 .py 文件里。写进去运行会报 SyntaxError: invalid syntax。它只在命令行里敲。
还有一个大坑:装的时候用的名字,和导入时写的名字可能不一样。常见的有这几组,遇到「明明装了却说找不到」就回来对一下:
安装时敲的命令代码里要写
pip install pillowimport PIL
pip install opencv-pythonimport cv2
pip install scikit-learnimport sklearn
pip install beautifulsoup4import bs4
pip install pyyamlimport yaml
分不清某个库是标准库还是第三方库?直接写 import 库名 试一下:能跑就是本机已经有,报 ModuleNotFoundError 就说明还没装。

课程思政|数据安全与法治素养 · 装库也要看来源

标准库官方自带,第三方库得自己用 pip install 装上,装和用是两件事。库从哪儿来、谁在维护,值得多问一句。来路不明的包,装进项目就可能顺手装进风险;认准官方源和正规版本,和爱护自己的数据是一回事。

六、先认识这六个标准库

下面这六个标准库不用装,直接就能用,几乎每份作业都会碰到。每段代码都可以原样复制到 IDLE 里跑一遍。

1. math:数学计算

Python
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:抽签、点名、掷骰子

Python
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:时间与暂停

Python
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:年月日

Python
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:路径和文件

Python
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:把数据存成文字

Python
import json

data = {'name': '小满', 'age': 18}

text = json.dumps(data, ensure_ascii=False)
print(text)                        # {"name": "小满", "age": 18}

print(json.loads(text)['age'])     # 18  再变回来
⚠️ 转 JSON 时一定要写 ensure_ascii=False。不写的话,中文会变成 \u5c0f\u6ee1 这种看不懂的样子。

AI 助手小贴士|六个标准库各管一摊,让 AI 用「没有它会很难写」的例子讲清分工。

打开任意 AI 对话工具(网页版或 App 都可以),试试这样问:datetime、os、json、random、math、time 各解决什么问题?每个给一个「没有这个库就要自己写很多代码」的例子

七、五种写法,到底选哪种

把前面讲的重新排一下,就是一张可以贴在电脑旁边的选择表:

写法调用时怎么写主要风险建议
import mathmath.sqrt(25)没有风险,只是多打几个字默认就用这个
from math import sqrtsqrt(25)可能和自定义的名字撞车、被覆盖确定只用一两个、且名字独特时用
import math as mm.sqrt(25)别名太随意,别人和自己都看不懂名字长或有社区约定时用
from math import *sqrt(25)几十个名字一起进来,可能盖掉内置函数脚本里别用
import importlib 动态导入先拿到模块对象再调用代码复杂,不好读起步阶段用不上,见到能认识即可
黄金法则:标准库一律用 import 模块名;第三方库照官方文档给的写法抄(比如 numpy 官方就写 import numpy as np)。暂时记不住就用这一条,绝不会错。

顺便交个底:同一个模块用两种写法导入,是允许的,效果也都是好的那一份。

Python
import math
from math import sqrt

print(math.sqrt(9), sqrt(9))    # 3.0 3.0

八、别写 from 模块 import *

from 模块名 import * 那个星号的意思是「把模块里所有东西全拿过来」。看起来最省事,其实是新手最容易踩的坑。

Python
from math import *

print(sqrt(25))      # 5.0  能跑
print(pi)            # 3.141592653589793  也能跑

能跑,但代价是:

  1. 一次倒进来几十个名字。光是 math 里就有 60 多个,全部堆到你的程序里。
  2. 读完代码看不出谁从哪来。看到 sqrt(25),你没法判断这是 math 里的,还是你自己写的,还是别的库里的。
  3. 可能悄悄盖掉内置函数。这条最要命,看个实例:
Python
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 自己告诉你。

  1. dir(模块名):列出这个模块里所有东西的名字。数量很多,用眼睛扫一遍找关键词就行。
  2. help(模块名.函数名):打印这个函数的说明,告诉你它是干什么的、要传几个参数。
Python
import math

print(dir(math))            # 会打印出一大串名字,60 多个
print(math.sqrt.__doc__)    # 看某个函数的说明

运行结果(省略了一长串名字):

输出
Return the square root of x.
更顺手的做法是在 IDLE 的交互窗口里直接敲 help(math.sqrt),会打印出更完整的一段说明,长这样:
Python
Help on built-in function sqrt in module math:

sqrt(x, /)
    Return the square root of x.
在 IDLE 里还有一个偷懒技巧:敲完 math. 之后按一下 Tab 键,会自动弹出这个模块里的名字列表,比背下来靠谱得多。

十、import 写在文件的什么位置

先记结论,这是所有 Python 程序员的共同习惯:

  1. 统一写在文件最上面,放在文件开头的注释之后,和自己写的代码之间空一行。
  2. 分组写,顺序是:标准库 → 第三方库 → 自己写的模块,组与组之间空一行。
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 放在函数后面,照样能跑:

Python
def area(r):
    return math.pi * r ** 2

import math            # 放在函数定义后面,也能跑

print(area(5))         # 78.53981633974483

能跑,但不要这么写。原因很实在:别人打开你的文件,一眼看到开头的 import,就知道这份程序用到了哪些库;散落在中间的话,读到一半突然冒出一句,还得回头找。

还有一种写法:把 import 写在函数里面(叫作局部导入),只在「这个函数才用得到、或者启动速度要快」的特殊情况下用。起步阶段先统一放文件顶部就好。

十一、三个能直接跑的小例子

例 1:掷骰子

Python
import random

print('掷骰子……')
print(f'你掷出了 {random.randint(1, 6)} 点')
每次运行结果都不一样,这是正常的——随机的意思就是随机。

例 2:随机点名

Python
import random

names = ['小满', '阿宝', '小可', '果冻']
print(f'请 {random.choice(names)} 同学回答')
把名单换成你们班的同学,就是一个可以真的用起来的点名器。random.choice() 每次只挑一个,多按几次运行就是下一个。

例 3:算圆的面积和周长

Python
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:猜数字(把前面的东西拼起来)

Python
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 题)

点击选项即可判分,答错的题会立刻显示解析。答完可以看到正确率和错题清单,也可以重新答一遍。

已答 0 / 10 · 正确 0 —

1想在程序里用 math.sqrt() 这个开方功能,必须先写上哪一句?

  • A. import math
  • B. import math.sqrt
  • C. from math import math
  • D. math import
答案:A。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)
答案:C。用 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)
答案:B。起了别名之后,原来的名字就用不了了,要用别名 m 来接,写法还是「别名.函数名」。选项 A 会报 NameError: name 'math' is not defined;C 是把模块当函数调用;D 是编造的语法。

4关于 from math import *,下面说法正确的是?

  • A. 最省事的写法,正式脚本里推荐一直用
  • B. 会把库里几十个名字一次全倒进来,还可能盖掉内置函数,不建议在脚本里用
  • C. 只能导入模块里的一个函数
  • D. 效果和 import math 完全一样
答案:B。星号代表「全部导入」,光是 math 就有 60 多个名字,一次全进你的程序,既看不出谁从哪来,又可能悄悄覆盖内置函数。选项 D 也要排除:import math 需要 math. 前缀,两者调用写法完全不同。

5执行 from math import * 之后,内置的 pow(2, 3) 结果变成了什么?

  • A. 还是 8,整数
  • B. 报错,pow 被删掉了
  • C. 64
  • D. 8.0,变成了小数
答案:D。普通情况下 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 文件同一个文件夹里
答案:B。这个报错的意思是「本机找不到这个模块」。拼写没错还报,就是没装——numpy 是第三方库,得先在命令行里 pip install numpy。选项 A 换成别的写法也一样报错;标准库才不用装,第三方库必须先安装。

7在命令行里执行了 pip install pillow,回到代码里应该怎么写?

  • A. import pillow
  • B. import Pillow
  • C. import PIL
  • D. from pillow import PIL
答案:C。pillow 是「安装时用的名字」,导入时写的其实是 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
答案:A。AttributeError 的意思是「这个模块里没有这个名字」,八成是拼写错误——把 sqrt 写成了 squre。注意报错最后那句 Did you mean: 'sqrt'?,Python 常常直接把正确名字告诉你,读报错一定要读到最后一个词。

9关于 import 写在文件里的位置,下面哪种做法最好?

  • A. 只能写在 if 语句里面
  • B. 写在文件最开头,也可以随手写在中间,两种做法完全一样,没有好坏之分
  • C. 必须写在每一个函数内部
  • D. 放在文件最上面,并按「标准库 → 第三方库 → 本地模块」分组、用空行隔开
答案:D。Python 执行到 import 那一行才加载模块,所以技术上写在哪里都能跑(这就是选项 B 前半句对、后半句错的原因)。但业界统一习惯是放文件最上面并分组,这样别人一眼就知道这份程序依赖哪些库。

10想在 IDLE 里查一查 math 库里有没有计算对数的函数、某个函数怎么用,最方便的做法是什么?

  • A. 把 math 里 60 多个名字全背下来
  • B. 重新安装一次 Python
  • C. 敲 dir(math) 看有哪些名字,敲 help(math.sqrt) 看某个函数的用法
  • D. 在代码里写 print(math)
答案:C。dir(模块) 列出模块里的全部名字,用来找关键词;help(模块.函数) 打印某个函数的说明。不要背——在 IDLE 里敲完 math. 再按一下 Tab 键,还能直接弹出名字列表。选项 D 打印出来的是模块本身的信息,看不到函数清单。