import
和 from ... import
都是在 Python 中导入模块和模块内容的方式,但是它们的工作方式有所不同,并且具有不同的含义:
1. import <模块名>
:
- 此语句导入整个模块,并使其作为名称空间中的对象可用。
- 为了访问模块中的任何内容(例如函数、类或变量),你必须使用
<模块名>.<名称>
语法。 - 这通常可以帮助避免命名冲突,并使代码更清晰,特别是当使用具有类似名称的多个模块时。
# 示例:导入 math 模块
import math
# 使用语法“模块名.名称”访问 math 模块中的内容
result = math.sqrt(25)
print(result) # 输出:5.0
2. from <模块名> import <名称 | 名称列表>
:
- 此语句允许直接导入模块中的指定属性(例如函数、类或变量)。
- 导入的名称将直接在你的当前命名空间中可用,而无需模块名称作前缀。
- 这样做的好处是可以使代码更简洁,特别是当只使用模块中的少数几个特定属性时。
- 但是,需要格外谨慎,以避免与当前命名空间中的现有名称冲突。
- 导入多个名称时,可以使用逗号分隔它们。
# 示例:从 math 模块导入 sqrt 函数
from math import sqrt
# 直接使用 sqrt 函数,不需要 math 前缀
result = sqrt(25)
print(result) # 输出:5.0
# 示例:从 math 模块导入多个函数
from math import sqrt, pow, pi
# 直接使用 sqrt, pow 和 pi 函数,不需要 math 前缀
result = sqrt(25)
print(result) # 输出:5.0
result_pow = pow(2, 3)
print(result_pow) # 输出:8.0
print(pi) # 输出:3.141592653589793
- 甚至可以使用
*
作为通配符,从一个模块导入所有名称,但不建议这样做,因为可能会导致命名空间混乱和命名冲突。
# 示例:从 math 模块导入所有名称(不推荐)
from math import *
# 直接使用 sqrt 函数,不需要 math 前缀
result = sqrt(25)
print(result)
两者之间的比较
特性 | import <模块名> | from <模块名> import <名称> |
---|---|---|
导入内容 | 导入整个模块 | 导入指定的名称 |
访问 | <模块名>.<名称> 语法 | 直接通过名称 (不需要模块前缀) |
命名空间冲突 | 较少 | 更容易发生 |
代码简洁性 | 对于访问多个属性来说冗长 | 对于访问少数需要的属性来说更简洁 |
可读性 | 如果使用了大量属性,可能需要多次重复使用<模块名> ,冗长。 | 对于少量属性,更清晰,但可能会有命名冲突的风险。 |
推荐 | 当要使用模块内的多个属性时。 | 当要使用模块内的特定属性或者减少重复的模块名前缀时。 |
总结:
- 使用
import <模块名>
导入整个模块并使用模块名.名称
语法访问其内容时通常更安全,尤其是在模块的属性名称与本地属性名称冲突时。 - 使用
from <模块名> import <名称>
导入模块的特定属性时, 可以写出更简洁的代码,但你必须注意命名冲突的风险。 from <模块名> import *
导入模块所有内容,虽然方便,但是不推荐使用。