Python训练第三十天

DAY 30 模块和库的导入

知识点回顾:

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

总结:导入包的核心就是找到目录,只有理解了python解释器的目录关系,才能导入包,如果py文件中导入失败,不妨多调试几次路径即可

(一)导入官方库

所谓学习python就是学习python常见的基础语法+学习你所处理任务需要用到的第三方库:

标准导入- 导入整个库

复制代码
import math
print("方式1:使用 import math")
print(f"圆周率π的值:{math.pi}")
print(f"2的平方根:{math.sqrt(2)}\n")
  • 从库中导入特定项

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

复制代码
from math import pi, sqrt
 
print("方式2:使用 from math import pi, sqrt")
print(f"圆周率π的值:{pi}")
print(f"2的平方根:{sqrt(2)}\n")
  • 非标准导入-整个库

import math和 from math import *的区别:使用from math import *代码尽管导入之后可以不使用前缀math.,但容易造成命名空间的污染和减少明确性,很难判断一个特定的函数是来自 `math` 模块还是其他模块

复制代码
from math import *
 
print(f"圆周率π的值:{pi}")
print(f"2的平方根:{sqrt(2)}")

(二)模块和包的定义

模块(Module):

本质:以 .py 结尾的单个文件,包含Python代码(函数、类、变量等)。

作用:将代码拆分到不同文件中,避免代码冗余,方便复用和维护。

包(Package)在python里,包就是库:

本质:有层次的文件目录结构(即文件夹),用于组织多个模块和子包。

核心特征:包的根目录下必须包含一个 init.py 文件(可以为空),用于标识该目录是一个包。

①场景: main.py 在根目录,circle.py 在子目录 model/

目录结构:

复制代码
项目根目录/
├── main.py
└── model/
    ├── __init__.py   (必需添加,将 model 目录标记为一个可导入的包)
    └── circle.py

项目根目录/

├── circle2.py

└── utils/

├── init.py (必需添加,将 model 目录标记为一个可导入的包)

└── circle.py

└── model/

└── main.py

复制代码
运行方式
python -m model.main
 
 
如果直接使用python model/main.py,会报错,
当使用 python -m model.main 时,Python 会将当前目录(即项目根目录)添加到 sys.path 的开头

(三)源代码的查看

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

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

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

@浙大疏锦行

相关推荐
wjs202444 分钟前
状态模式(State Pattern)
开发语言
我命由我123451 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
liulilittle1 小时前
C++ TAP(基于任务的异步编程模式)
服务器·开发语言·网络·c++·分布式·任务·tap
im_AMBER1 小时前
学习日志19 python
python·学习
励志要当大牛的小白菜2 小时前
ART配对软件使用
开发语言·c++·qt·算法
mortimer4 小时前
安装NVIDIA Parakeet时,我遇到的两个Pip“小插曲”
python·github
@昵称不存在5 小时前
Flask input 和datalist结合
后端·python·flask
爱装代码的小瓶子5 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
赵英英俊5 小时前
Python day25
python
东林牧之5 小时前
Django+celery异步:拿来即用,可移植性高
后端·python·django