Python 提供了两种常见的模块导入方式:import
和 from ... import
。这两种方式在使用方式、命名空间管理、可读性和潜在问题方面都有显著区别。下面将详细说明这些方面。
1. 使用方式
import module
:
- 导入整个模块。
- 使用时需通过模块名访问模块中的对象。
实例
import math
result = math.sqrt(16)
print(result) # 输出 4.0
result = math.sqrt(16)
print(result) # 输出 4.0
from module import name
:
- 从模块中导入特定的对象(函数、类、变量等)。
- 使用时直接引用导入的对象,不需模块名前缀。
实例
from math import sqrt
result = sqrt(16)
print(result) # 输出 4.0
result = sqrt(16)
print(result) # 输出 4.0
2. 命名空间管理
import module
:
- 将整个模块作为一个对象导入到当前命名空间中。
- 模块中的对象通过
module.name
访问,不会与当前命名空间中的其他对象冲突。
from module import name
:
- 直接将模块中的对象导入到当前命名空间中。
- 可能会与当前命名空间中的其他对象发生命名冲突。
实例
from math import sqrt
from cmath import sqrt # 复数的 sqrt
result = sqrt(-1) # 可能会混淆使用的 sqrt 函数
print(result)
from cmath import sqrt # 复数的 sqrt
result = sqrt(-1) # 可能会混淆使用的 sqrt 函数
print(result)
3. 可读性和维护性
import module
:
- 代码中明确知道哪些对象来自哪个模块,因为总是使用模块名前缀。
- 提高代码可读性和可维护性。
实例
import os
current_directory = os.getcwd()
print(current_directory) # 输出当前工作目录
current_directory = os.getcwd()
print(current_directory) # 输出当前工作目录
from module import name
:
- 代码中直接使用对象名,可能难以看出这些对象来自哪个模块。
- 需要对代码进行更多注释或文档说明,以保持清晰。
实例
from os import getcwd
current_directory = getcwd()
print(current_directory) # 输出当前工作目录
current_directory = getcwd()
print(current_directory) # 输出当前工作目录
4. 选择性导入和内存使用
import module
:
- 导入整个模块,模块中的所有对象都可用。
- 适用于需要使用模块中多个对象的情况。
from module import name
:
- 仅导入模块中的特定对象,节省内存。
- 适用于只需要使用模块中少量对象的情况。
实例
# 只需使用 datetime 中的 date 对象
from datetime import date
today = date.today()
print(today) # 输出当前日期
from datetime import date
today = date.today()
print(today) # 输出当前日期
5. 导入所有对象
from module import *
:
- 导入模块中的所有对象到当前命名空间。
- 可能导致命名冲突,降低代码可读性,不推荐使用。
实例
from math import *
print(sqrt(16)) # 直接使用 sqrt 函数
print(sqrt(16)) # 直接使用 sqrt 函数
潜在问题:
实例
from math import *
from cmath import *
result = sqrt(-1) # 不明确使用哪个模块的 sqrt 函数
print(result)
from cmath import *
result = sqrt(-1) # 不明确使用哪个模块的 sqrt 函数
print(result)
总结
import module
:适用于需要使用整个模块,避免命名冲突,提高代码可读性。from module import name
:适用于只需要模块中部分对象的情况,简化代码,但需注意命名冲突。from module import *
:尽量避免使用,可能导致命名冲突和代码混淆。
选择适合的导入方式取决于具体的使用场景和需求,通常推荐在需要避免命名冲突和保持代码清晰时使用 import
语句,在需要简化代码和使用特定对象时使用 from ... import
语句。
点我分享笔记