Day 30 模块和库的导入
另外创建一个'main.py'作为主要的运行文件。根据 main.py 和 circle.py 的文件位置,导入模块的方式和在终端运行的方法存在差异。在此之前,先明确‘根目录’,通常是打开的项目文件夹位置,在导入模块式,会从根目录开始查找。
- 导入官方库的三种手段
- 导入自定义库/模块的方式
- 导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致)
作业:自己新建几个不同路径文件尝试下如何导入
学习python,就是在基础语法上,去继续学习对应领域的库的使用,比如数据处理与分析(numpy\pandas\matplotlib)、web开发(Django\Flask)、机器学习(scikit-learn\TensorFlow)等等。

而在这个打卡训练营中,重点就是学习Machine Learning相关的知识和库的使用。
库、包与模块
首先说明库、包与模块这三个概念:
1. 模块(Module):一个'.py'文件就是一个模块,包含Python代码(函数、类、变量等)。可以将代码拆分到不同文件中,避免代码冗余,便于复用与维护。
# circle.py 就是一个模块
# circle.py
PI = 3.14159
def area(radius):
return PI * radius * radius
def circumference(radius):
return 2 * PI * radius
# main.py
import circle # 导入circle模块
print(circle.area(5)) # 使用模块中的函数
2. 包(Package):包含多个模块的文件夹,有‘__init__.py’文件(包的标识文件),可以多级嵌套。本质上是有层次的文件目录结构(文件夹),用于组织多个模块和子包。
model/ # 包
__init__.py # 包标识文件
circle.py # 模块
rectangle.py # 模块
utils/ # 子包
__init__.py
helper.py
# 导入包中的模块
import model.circle
from model import rectangle
from model.utils import helper
3. 库(Library):由一个或多个相关包,能够实现特定功能的集合。库分为官方库和第三方库。其中大部分第三方库需要通过pip install安装。
# 标准库
import math
import os
import datetime
# 第三方库
import requests # HTTP请求库
import pandas # 数据分析库
import numpy # 科学计算库
因此,这三者关系是这样的:函数/类/变量 → 模块 → 包 → 库。
导入库的方式
对于库的导入,常见有以下几种:
首先是,直接导入整个库,使用import 库名 或这from 库名 import *,虽然它们都能导入整个库但常使用第一种方法:
- import math:在使用的时候需要带上‘math.’前缀,好处是可以清楚地知道函数和变量的来源,缺点是代码看上去不太简洁
- from math import *:在使用的时候不需要‘math.’前缀,直接使用函数或变量即可,优点是代码简洁,缺点是容易引起命名空间污染(多个库中可能存在相同的函数名,无法区分来源)
# 标准导入:导入整个库
import math
print(f'圆周率π的值:{math.pi}')
print(f"2的平方根:{math.sqrt(2)}")
# 非标准导入:导入整个库
from math import *
print(f"圆周率π的值:{pi}")
print(f"2的平方根:{sqrt(2)}")
另外,就是从库中导入特定项。原则上,对于所有库都可以采取直接导入整个库的方法。但是对于某些库来说,本身包含内容多但实际只用了其中的几个功能,直接导入会占用过多内存。因此,使用什么功能就导入什么,这样也可以不用使用前缀。
# 导入特定的函数或变量
from math import pi,sqrt
print(f"圆周率π的值:{pi}")
print(f"2的平方根:{sqrt(2)}\n")
在之前的使用中,还注意到,可以对库进行缩写(import 库名 as 缩写),便于后续的调用,不过这本质上属于导入整个库的方法。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
自定义库和模块
创建一个‘circle.py’文件作为模块:
# circle.py
import math
def calculate_area(radius):
return math.pi*radius**2
另外创建一个'main.py'作为主要的运行文件。根据 main.py 和 circle.py 的文件位置,导入模块的方式和在终端运行的方法存在差异。在此之前,先明确‘根目录’,通常是打开的项目文件夹位置,在导入模块式,会从根目录开始查找。
main.py 和 circle.py 在同一目录下

main.py 文件,直接导入模块
import circle
radius = 5
area = circle.calculate_area(radius)
print(f"半径为 {radius} 的圆,面积是: {area}")
运行:直接在终端运行 python main.py
main.py 和 circle.py 在根目录的子目录下model(一个包)

main.py 文件,直接导入模块
# main.py
from circle import calculate_area
radius = 5
area = calculate_area(radius)
print(f"半径为 {radius} 的圆,面积是: {area}")
运行:需要给出路径,两种方法二选一
- 运行命令:python model/main.py
- 进入路径:cd xxx(main的相对路径),然后执行python main.py(注意如果先cd后,就不能采用第一个命令了)
main.py 在根目录,circle.py在子目录下

main.py,从model包中导入circle
from model.circle import calculate_area
# from model import circle (后续使用circle.calculate_area)
radius = 5
area = calculate_area(radius)
print(f"半径为 {radius} 的圆,面积是: {area}")
运行:直接在终端运行 python main.py
main.py 在子目录model下,circle.py在子目录utils下

运行方式 python -m model.main。如果直接使用python model/main.py,会报错,当使用 python -m model.main 时,Python 会将当前目录(即项目根目录)添加到 sys.path 的开头。
源代码的查看
对于纯python编写的第三方库,可以使用‘ctril’加鼠标点击函数,进入内部查看源代码。
实际上,很多库为了性能,底层使用了其它语言进行编写。比如OpenCV的核心是用C++编写,并且已经编译成二进制文件,编译后的二进制文件可以在不同操作系统上运行,Python中的用户通常不能直接看到方法的源代码。
二进制对于机器是易于理解和执行的,对于人类是难懂的。
- 二进制文件dll文件:在Python中import cv2,实际上是在调用预先编译好的二进制文件。这些文件包含了实现OpenCV功能的可执行代码,而非人类可读的源代码。
- 接口封装:用户只能看到Python函数和对象的接口(即函数的定义,不包括实现的细节)。这也意味着无法利用ctrl跳转到函数内部,pycharm的debugger功能同理也无法看到内部结构。
- 文档和源代码:尽管在Python中不能直接看到C++的源代码实现,用户可以参考官方文档来了解各个函数和方法的用法。如果需要查看实现细节,可以访问OpenCV的GitHub仓库查看C++源代码。
因此,虽然不能直接查看源码,但是通过阅读库的文档说明,可以细致地了解库的使用方法。
更多推荐


所有评论(0)