鱼C论坛

 找回密码
 立即注册
查看: 280|回复: 7

[技术交流] 这是一篇关于python import语句的详细教程

[复制链接]
发表于 2025-4-5 03:38:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是一篇关于python import语句的详细教程


一、什么是 import?

在 Python 中,我们可以把一些功能单独放在一个 “模块”(module)或者 “包”(package)中。

这样做的好处是:

  • 代码更整洁
  • 重复利用已有功能
  • 方便协作和维护

为了在当前 Python 文件中使用这些功能,就需要用到 import 语句。

它的作用就像 “把另外一个文件里的工具拿到我当前文件来用” 一样。


大家可能经常听到过 “模块” 和 “包” 这两个名词,但却搞不清楚它们的区别?

这里顺便做一下解释:

  • 模块(Module):一般是一个以 .py 为后缀的 Python 文件,里面可以包含函数、类、变量、常量等。
  • 包(Package):包含一个 __init__.py 文件的文件夹,它通常用于组织多个相关的模块,形成一个更大的功能集合。

简单来说:

  • 模块是最基本的组织单位,通常就是一个 .py 文件。
  • 包可以包含多个模块,甚至可以嵌套更深层次的包。


二、最简单的 import 用法

1. 导入整个模块

当我们想把某个模块的全部功能拿过来使用时,可以使用最基础的 import 语句:

  1. import math
复制代码

这里我们导入了 Python 自带的 math 模块,它在数学计算方面提供了许多有用的函数和常量,比如 sqrt()、sin()、pi 等等。

导入后,要使用模块中的函数或变量,需要加上模块的名称作为前缀。

例如:

  1. import math

  2. # 使用 math 模块里的 sqrt 函数
  3. result = math.sqrt(16)
  4. print(result)  # 输出 4.0

  5. # 使用 math 模块里的常量 pi
  6. print(math.pi)  # 输出 3.141592653589793
复制代码


2. 使用别名

在使用外部模块时,如果模块名称比较长或容易拼写错误,可以给模块起一个短一点的别名。

这时我们用 as 关键字来给模块起一个别名,例如:

  1. import math as m

  2. result = m.sqrt(16)
  3. print(result)  # 4.0

  4. print(m.pi)    # 3.141592653589793
复制代码

这样,在代码中就可以用 m 代替 math 来调用其中的函数和常量。


三、导入特定的函数或类

有时候我们只想从模块中导入某几个函数(或类、变量等),我们就可以用下面的语法:

  1. from 模块 import 某些函数或类
复制代码

例如,我们只想用 math 模块中的 sqrt 函数和 pi 常量,就可以写:

  1. from math import sqrt, pi

  2. # 直接使用 sqrt,不需要 math.sqrt
  3. result = sqrt(25)
  4. print(result)  # 5.0

  5. print(pi)      # 3.141592653589793
复制代码

这样做的好处是简化了调用,不需要再加 math. 前缀。

但是需要注意,如果你的代码中出现了跟 sqrt 或 pi 同名的函数或变量,可能会导致冲突或者覆盖。要尽量避免命名冲突。


四、使用 from ... import *

当需要导入模块中的所有内容(包括函数、常量、类等)时,可以使用:

  1. from 模块 import *
复制代码

这样的写法一次性把模块中的所有可用内容都导入到当前作用域。

看似简单方便,但不建议在大型项目中使用,因为导入过多全局符号会增加命名冲突风险,也让程序的可读性变差。

例如:

  1. from math import *

  2. print(sqrt(9))   # 3.0
  3. print(sin(pi/2)) # 1.0
复制代码

虽然这样写很直接,但使用 from math import * 会使得 math 模块中的所有名称都暴露在当前命名空间。

如果有命名冲突,就会比较麻烦。因此小甲鱼并不推荐大家使用这种写法!

《Python 官方风格指南》(PEP 8)也建议避免使用 import *


五、同时导入多个模块或多个函数

1. 同时导入多个模块

在一行里直接逗号分隔即可:

  1. import os, sys

  2. # 分别使用 os, sys 做一些操作
复制代码

但更推荐的写法是 每行导入一个模块,这样可读性更高、便于团队协作:

  1. import os
  2. import sys
复制代码


2. 同时导入同一个模块下的多个函数

同理,可以这样做:

  1. from math import sin, cos, tan

  2. print(sin(3.14))
  3. print(cos(3.14))
  4. print(tan(3.14))
复制代码

不过如果函数非常多,不可读性就会变差;这时可能直接 import math 更好。


六、包与多层级导入

1. 什么是包?

当我们把多个 .py 文件放到同一个文件夹里,并且在这个文件夹下只要有一个 __init__.py 文件(该文件可以是空文件),那么这个文件夹就可以看作一个“包”(package)。

包是为了方便地组织大量的模块,形成清晰的目录结构。

例如,我们有一个文件夹布局如下:

  1. my_package/
  2.     __init__.py
  3.     module_a.py
  4.     module_b.py
  5.     sub_package/
  6.         __init__.py
  7.         module_c.py
复制代码

这样,my_package 就是一个包,module_a.py、module_b.py 是它的模块,而 sub_package 是一个子包,其中有 module_c.py。


2. 怎样导入包中的模块?

假设我们在 main.py 文件中,想要导入并使用 my_package 下面的 module_a.py,可以写成:

  1. import my_package.module_a
复制代码

然后,就可以通过:

  1. my_package.module_a.函数名()
复制代码

来使用 module_a.py 中定义的函数。

如果文件名/函数名太长,也可以加别名。

例如:

  1. import my_package.module_a as ma

  2. ma.函数名()
复制代码

当然,如果我们只想从 module_a.py 中导入某个函数,可以使用:

  1. from my_package.module_a import 函数名
复制代码


3. 多级导入

假设我们在 module_a.py 中也想用到 module_b.py 里的某些东西,也是可以用 import 语句引入。

只要它们在同一个包下,就可以通过包名和模块名来定位。

例如:

  1. # module_a.py
  2. from my_package.module_b import some_function

  3. def example_func():
  4.     return some_function()
复制代码

这样 module_a 中的 example_func() 会返回 some_function() 的结果。


七、if __name__ == "__main__"

在一些 Python 文件中,我们常常能看到如下结构:

  1. def main():
  2.     # 主函数内容
  3.     print("这个是主函数内容")

  4. if __name__ == "__main__":
  5.     main()
复制代码

这个写法的作用是在当前文件作为程序入口点执行时,才会去执行 main() 函数里的内容;

如果这个文件被其它文件 import 了,此时 __name__ 的值就不会是 "__main__",那么这里的 if 块就不会执行。

这在模块开发和调试时非常常见,可以确保只有单独运行该文件才执行特定逻辑,而被导入时仅仅提供模块里的函数、类给别人使用。


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-4-5 08:37:15 | 显示全部楼层
感谢分享
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-4-5 13:34:51 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-4-5 15:28:02 From FishC Mobile | 显示全部楼层
import random怎么用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-4-5 18:51:03 | 显示全部楼层
很好,建议讲讲async/await,with/as,一直没搞懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-4-8 08:53:47 | 显示全部楼层
讲的非常好
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-4-10 10:13:23 | 显示全部楼层
66666666666666666666
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
  1. from 模块 import *
复制代码
  1. import 模块
复制代码

有什么区别?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-19 10:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表