Python 学习手记(1): import 和 from ... import 的区别

10 阅读3分钟

importfrom ... 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 * 导入模块所有内容,虽然方便,但是不推荐使用。