Python训练Day30

@浙大疏锦行

  1. 导入官方库的三种手段
  2. 导入自定义库/模块的方式
  3. 导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致)

一、导入官方库

1.1 标准导入:导入整个库

这是最基本也是最常见的导入方式,直接使用`import`语句。

python 复制代码
# 方式1:导入整个模块
import math

print("方式1:使用 import math")
print(f"圆周率π的值:{math.pi}")
print(f"2的平方根:{math.sqrt(2)}\n")

1.2 从库中导入特定项

当使用from语法从库中导入特定的函数或类时,这些函数或类就可以在您的代码中直接使用,不需要添加模块名作为前缀。因为在导入时没有包括模块的完整路径,前面也不能加上库名。

python 复制代码
# 方式2:导入特定的函数或变量
from math import pi, sqrt

print("方式2:使用 from math import pi, sqrt")
print(f"圆周率π的值:{pi}")
print(f"2的平方根:{sqrt(2)}\n")

1.3 非标准导入:导入整个库

如下

●这将导入`math`模块中定义的所有公开函数和变量。

●和上述from同理,直接调用`sin()`、`cos()`等,而无需`math.`前缀。

虽然 import math和 from math import 看起来都是导入了 `math` 模块,但它们在导入方式、作用域处理以及对命名空间的影响上有重要的区别。

1. 命名空间的污染

`import math`:这种方法会将整个 `math` 模块导入到命名空间中,但是需要使用 `math.` 前缀来访问模块内的函数或变量。这种方式保持了命名空间的整洁,因为所有的 `math` 函数和变量都包含在 `math` 这个模块对象中。

`from math import *`:这种方法将 `math` 模块中的所有公开的函数和变量导入到当前的命名空间中,可以直接使用这些函数和变量而无需 `math.` 前缀。这种方式可能会导致命名空间污染,特别是当有多个模块都被这样导入时,很容易发生命名冲突。

2. 明确性和可维护性

`import math`:明确指出了函数和变量来源于 `math` 模块,这对代码的可读性和维护性都是有益的。其他阅读你代码的人可以清楚地看到每个函数的来源,这对大型项目和团队合作尤为重要。

`from math import *`:虽然代码看起来更简洁,但这种方法减少了代码的明确性。如果没有足够的上下文,很难判断一个特定的函数是来自 `math` 模块还是其他模块,尤其是当你导入了多个模块时。

python 复制代码
from math import *

print(f"圆周率π的值:{pi}")
print(f"2的平方根:{sqrt(2)}")

二、导入自定义库/模块的方式

模块、包的定义

模块(Module)

    • 本质 :以 .py 为扩展名的单个文件,包含可执行的 Python 代码(如函数、类、变量等)。
    • 作用:通过代码拆分到不同文件,减少冗余,提升代码复用性和可维护性。

包(Package)

  • 本质:具有层级结构的文件目录(文件夹),用于组织多个模块或子包。
  • 核心特征 :必须包含 __init__.py 文件(可为空),标识该目录为 Python 包。
  • 与库的关系:包是库的底层实现形式,库通常由包或模块集合构成。

关键区别

  • 模块 是单一文件, 是包含模块的目录(需含 __init__.py)。
  • 包通过目录结构实现模块的层级化管理,支持更复杂的代码组织。

三、源代码的查看

如果第三方库是纯python写的,往往在函数上按住ctrl即可进入函数内部查看源代码。但是很多第三方库为了性能,底层是用其他语言写的,这里我们计算机视觉库OpenCV为例。

OpenCV核心是用C++编写的(C++可以显著提高性能),但它通过Python等其他语言的接口(bindings)使得这些功能可以在Python环境中被调用。这些接口是通过一种叫做Python/C API的技术实现的,其中C++的功能被封装成Python模块,使得Python用户可以像使用纯Python编写的库一样使用OpenCV。OpenCV的核心是用C++编写,并且已经编译成二进制文件,编译后的二进制文件可以在不同操作系统上运行,Python中的用户通常不能直接看到方法的源代码。

二进制文件是机器语言,处理器可以直接理解和执行无需翻译,二进制语言反汇编是很困难的,用二进制语言除了效果好外,也是让用户无法看到源代码,保护了自己的知识产权。

这意味着:

●二进制文件dll文件:当你在Python中导入OpenCV库(通import cv2),你实际上是在调用预先编译好的二进制文件。这些文件包含了实现OpenCV功能的可执行代码,而非人类可读的源代码。

●接口封装:用户只能看到Python函数和对象的接口(即函数的定义,不包括实现的细节)。这也意味着无法从利用ctrl跳转到函数内部,pycharm的debugger功能同理也无法看到内部结构。

●文档和源代码:尽管在Python中不能直接看到C++的源代码实现,用户可以参考官方文档来了解各个函数和方法的用法。如果需要查看实现细节,可以访问OpenCV的GitHub仓库(https://github.com/opencv/opencv)查看C++源代码。

这就需要我们养成看文档的能力,文档就是以终为始思想的体现。文档就是api使用说明书,可能你日常买东西都不喜欢看使用说明书,但是在代码学习中,这一步是绕不开的。

你会发现很多B站视频的教学,其实远不如文档说明书细致。

相关推荐
简~7681 小时前
python for in循环不能遍历整数怎么解决
python·大学生
aiqianji2 小时前
垂直专业的AI短篇小说写作软件有哪些特点?
人工智能·python
aqi002 小时前
15天学会AI应用开发(十三)上下文与RAG的阶段性总结
人工智能·python·大模型·ai编程·ai应用
程序员杰哥2 小时前
接口测试知识总结
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
大海变好AI2 小时前
专业的智能体算力架构高性价比品牌公司
python
江华森2 小时前
深入理解 Flask 实现原理
后端·python·flask
FriendshipT3 小时前
Ultralytics:解读SPPF模块
人工智能·pytorch·python·深度学习·目标检测
AOwhisky3 小时前
Python 基础语法(上篇 + 下篇)——综合自测题
linux·windows·python
埃博拉酱3 小时前
Pip/Conda 混用导致的 CRT 版本冲突问题:[WinError 1114] 动态链接库(DLL)初始化例程失败
windows·python