Python中import与from...import的异同及使用场景

关键词:模块、导入、命名空间、可读性、最佳实践

概要:本文详细分析了Python中两种模块导入方式(import和from...import)的异同点,从访问方式、命名空间影响、代码可读性、循环导入风险等维度进行对比。通过7个典型代码示例演示了不同导入方式的具体用法,包括基础导入、多成员导入、别名使用等场景。文章指出import更适合模块功能频繁调用的情况,能保持良好命名空间隔离;from...import则适用于特定功能简化代码书写,但需注意命名冲突风险。最后给出实践建议:多成员使用时优先import,单一功能简化代码可用from...import,避免使用import *以防污染命名空间。全文通过具体案例帮助开发者理解不同场景下的最佳导入策略。

一、主要异同点

1、相同点

● 两者都用于导入模块/包中的内容

● 都能将外部代码引入当前命名空间

2、不同点

特性

import

from...import

访问方式

需使用模块名前缀

可直接使用导入的名称

命名空间污染

较少(保持模块作用域)

较多(可能覆盖现有名称)

导入全部内容

使用import module

使用from module import *

代码可读性

明确显示来源

简洁但可能混淆来源

循环导入风险

较低

较高

二、使用场景建议

1、使用import的情况

● 需要明确知道函数/类的来源模块时

● 导入的模块名称较短时

● 需要避免命名冲突时

● 导入整个模块并频繁使用多个成员时

2、使用from...import的情况

● 模块名称很长,想简化代码时

● 只需要模块中的少量特定成员时

● 成员名称不会与当前命名空间冲突时

● 需要频繁使用某个成员时(减少重复输入模块名)

三、示例脚本

Python脚本

# 示例1: 基本import使用
import math  # 导入整个math模块

# 使用时需要加模块名前缀
result = math.sqrt(16)  # 调用math模块中的sqrt函数
print(result)  # 输出: 4.0

# 示例2: from...import基本使用
from math import sqrt  # 只导入math模块中的sqrt函数

# 可以直接使用函数名,无需模块前缀
result = sqrt(25)  # 直接调用sqrt函数
print(result)  # 输出: 5.0

# 示例3: 导入多个成员
from math import pi, sin, cos  # 从math模块导入多个成员

# 可以直接使用这些名称
print(pi)  # 输出: 3.141592653589793
print(sin(pi/2))  # 输出: 1.0

# 示例4: 导入整个模块并赋予别名
import numpy as np  # 导入numpy模块并简称为np

# 使用别名访问模块成员
array = np.array([1, 2, 3])  # 使用np前缀创建numpy数组
print(array)  # 输出: [1 2 3]

# 示例5: 导入模块中的全部成员(不推荐)
from math import *  # 导入math模块中的所有成员到当前命名空间

# 可以直接使用所有math模块的函数/变量
print(tan(pi/4))  # 输出: 0.9999999999999999
print(e)  # 输出: 2.718281828459045

# 示例6: 导入成员并赋予别名
from math import factorial as fact  # 导入factorial函数并简称为fact

# 使用别名调用函数
print(fact(5))  # 输出: 120

# 示例7: 展示命名冲突问题
from math import log  # 导入math的log函数

def log(message):  # 定义自己的log函数
    print(f"LOG: {message}")

# 此时log已被覆盖,无法访问math的log函数
log("Test")  # 输出: LOG: Test
# 如果还需要math的log,需要使用import math方式

# 示例8: 展示何时选择import vs from...import
# 情况1: 频繁使用datetime中的多个类
import datetime
now = datetime.datetime.now()  # 明确知道now()来自datetime模块
date = datetime.date(2023, 1, 1)

# 情况2: 只使用datetime中的特定类
from datetime import date
today = date.today()  # 代码更简洁
print(today)  # 输出当前日期

四、最佳实践建议

● 优先使用import module形式 - 提高代码可读性和可维护性

● 谨慎使用from...import * - 容易导致命名冲突和难以追踪的问题

● 长模块名使用别名 - 如import pandas as pd

● 大型项目保持一致性 - 在项目中统一导入风格

● 避免循环导入 - from...import更容易导致循环导入问题

——The END——

欢迎关注、收藏或转发。
微信公众号:cnFuJH
CSDN博客:理工男大辉郎-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

理工男大辉郎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值