小甲鱼 发表于 2025-4-5 03:38:34

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

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

一、什么是 import?

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

这样做的好处是:


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

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

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


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

这里顺便做一下解释:


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

简单来说:


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


二、最简单的 import 用法

1. 导入整个模块

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

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

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

例如:

import math

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

# 使用 math 模块里的常量 pi
print(math.pi)# 输出 3.141592653589793

2. 使用别名

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

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

import math as m

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

print(m.pi)    # 3.141592653589793
这样,在代码中就可以用 m 代替 math 来调用其中的函数和常量。


三、导入特定的函数或类

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

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

from math import sqrt, pi

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

print(pi)      # 3.141592653589793
这样做的好处是简化了调用,不需要再加 math. 前缀。

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


四、使用 from ... import *

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

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

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

例如:

from math import *

print(sqrt(9))   # 3.0
print(sin(pi/2)) # 1.0
虽然这样写很直接,但使用 from math import * 会使得 math 模块中的所有名称都暴露在当前命名空间。

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

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


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

1. 同时导入多个模块

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

import os, sys

# 分别使用 os, sys 做一些操作
但更推荐的写法是 每行导入一个模块,这样可读性更高、便于团队协作:

import os
import sys

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

同理,可以这样做:

from math import sin, cos, tan

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


六、包与多层级导入

1. 什么是包?

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

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

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

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


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

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

import my_package.module_a
然后,就可以通过:

my_package.module_a.函数名()
来使用 module_a.py 中定义的函数。

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

例如:

import my_package.module_a as ma

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

from my_package.module_a import 函数名

3. 多级导入

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

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

例如:

# module_a.py
from my_package.module_b import some_function

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


七、if __name__ == "__main__"

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

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

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

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

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


ydwb 发表于 2025-4-5 08:37:15

感谢分享

某一个“天” 发表于 2025-4-5 13:34:51

{:10_257:}{:10_257:}

yangzihan1909 发表于 2025-4-5 15:28:02

import random怎么用

player-none 发表于 2025-4-5 18:51:03

很好,建议讲讲async/await,with/as,一直没搞懂

guxing425 发表于 2025-4-8 08:53:47

讲的非常好

happyweeks365 发表于 2025-4-10 10:13:23

66666666666666666666

琅琊王朝 发表于 2025-4-12 20:50:55

from 模块 import * 和 import 模块
有什么区别?
页: [1]
查看完整版本: 这是一篇关于python import语句的详细教程