模块和包的相关总结

参考文档1
参考文档2

1.模块 Module

概念: 在Python中,一个.py文件就称之为一个模块(Module)。

作用: python的模块是用于组织、封装和重用代码的文件。

包含的内容:一个模块中可以包含变量、函数、类和其他Python语句,它允许将代码逻辑划分为独立的单元,并提供了一种组织代码的方式,使代码更加模块化和易于维护。

Python的模块分类: 内建模块、第三方模块和自定义模块。
(1)系统内置模块:os、sys、datetime、time、random、json、logging等
https://ceshiren.com/t/topic/29187

  • random随机数模块
  • sys模块:提供访问与python解释器系统相关的变量和函数的功能
  • os模块:提供与操作系统交互的函数
  • datetime模块:处理日期和时间
  • time模块
  • json模块
  • logging模块

(2)第三方开源模块:
通过插件管理器或命令pip install进行安装
(3)自定义模块

注意:

  • 尽量不要与内置函数名字冲突。点这里查看Python的所有内置函数。
  • 在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在Python中,是通过_ 前缀来实现的。

1.1 安装第三方模块:
1.工具 pip
在Python中,安装第三方模块,是通过包管理工具pip完成的。

一般来说,第三方库都会在Python官方的pypi.python.org网站注册,要安装一个第三方库,必须先知道该库的名称,可以在官网或者pypi上搜索,比如Pillow的名称叫Pillow,因此,安装Pillow的命令就是:

pip install Pillow

2.python开源发行版本 Anaconda
引入原因:在使用Python时,我们经常需要用到很多第三方库,例如,上面提到的Pillow,以及MySQL驱动程序,Web框架Flask,科学计算Numpy等。用pip一个一个安装费时费力,还需要考虑兼容性。

Anaconda:这是一个基于Python的数据处理和科学计算平台,它已经内置了许多非常有用的第三方库,我们装上Anaconda,就相当于把数十个第三方模块自动安装好了,非常简单易用。Anaconda包含了Conda、Python、以及一堆安装好的工具包(比如conda、numpy、pandas)

conda:是一个开源的包,环境管理器,可以用于一个机器上安装不同版本的软件包及其依赖,并且能够在不同环境之间切换。

1.2 模块导入

1.import导入
(1)Python中使用 import 关键字来导入模块,导入模块后,在当前文件中做为一个对象使用,可以通过 . 来引用模块中定义的函数、变量或类等。

# 导入内建模块 math
import math
#可以使用其中的 sqrt()来计算平方根
result = math.sqrt(25)
print(result)

(2)如果被导入的模块名比较长,在使用时会不太方便,也可以使用 as 为模块指定一个别名,一旦指定了别名,原模块名就不能使用了。
2.from-import导入
(1)使用from module_name import object_name 语法,从模块中导入特定的对象,这样可以直接使用对象名,无需使用模块名前缀。

from math import sqrt

result = sqrt(25)
print(result)

方法一:import module1[,modele2…[,moduleN]]
方法二:from module import <name[,name2,…[,nameN]]>
import 模块名 引入一个完整的模块
from <模块名> import <方法|变量|类> 引入模块中一个或多个指定部分
from <模块名> import * 导入模块里面的所有函数、变量

2.包 Package

概念:
在Python中,包 (package) 是用于组织和管理模块 (Module) 的一种层级结构
包是一个特殊的目录,其中包含了一个名为 __init__.py 的文件,用于标记这个目录是一个包。包可以包含其他子包和模块,形成多级层次结构,方便组织和复用代码。

用途:
(1)组织代码:包可以将相关的模块组织在一起,使得代码结构更加清晰,有助于团队协作和维护。
(2)避免命名冲突:Python的模块是全局的,当不同的模块中定义了相同名称的函数或变量时,可能会引起命名冲突。使用包可以将模块放在不同的包中,避免当不同的模块中定义了相同名称的函数或变量时冲突。
(3)模块复用:包可以作为一个单元来导入和使用,使得代码在不同项目中的复用更加容易。
(4)隐藏内部实现:包可以将一些内容实现隐藏起来,只暴露外部接口,提供更好的封装性。

__init__.py说明

  • __init__.py文件是包的初始化文件,该文件是是区别包与文件夹的关键。
  • 当使用 from-import方式导入时,可以通过在文件中添加魔法属性 all 属性来设置包中哪些模块可以被导入和使用。
# 在 __init__.py 中添加下面代码 
__all__ = ["mm"]

# main.py中的代码
from mp import *
# 此时只能使用 __all__ 中指定的mm模块,nn 模块不能使用
mm.show()

2.1package导入

当前有包组织结构如下:

Project
    |
    |--- mp 
    |    |
    |    |--- __init__.py
    |    |--- mm.py 
    |    |    |
    |    |    |--- show()
    |    |--- nn.py
    |    |    |
    |    |    |--- info()
    |--- main.py

(1) 使用 import 直接导入包中指定模块

import mp.mm
mp.mm.show()

import mp.nn as nn
nn.info()

(2) 使用 from-import 导入包内指定模块或包内指定模块内的成员

# 导入包内指定模块
from mp import mm
mm.show()

# 导入包内指定模块中的成员
from mp.mm import *
show()

https://ceshiren.com/t/topic/29187

python内置模块

1.random随机函数

import random
# 浮点数
random.random() #生成0~1范围内的随机浮点数
random.uniform(1,3) # 生成[a,b]范围内随机浮点数
# 整数
random.randrange(1,3) # 生成[a,b]范围内随机整数
# 序列随机选择 
#序列可以为字符串、元组、列表
s = "python"
result1 = random.choice(s)
# 打乱顺序
# 随机打乱列表lst的元素顺序,并得到一个新的列表
number = [1,2,3,4,5]
random.shuffle(number)

2.sys模块

提供了访问与Python解释器系统相关的变量和函数的功能。它的主要用途是:

  • 与系统交互
  • 解释器配置
  • 命令行参数处理
  • 标准输入输出
  • 异常处理等

2.1 常用属性

  • sys.argv:获取命令行参数列表,包括脚本名称和传递为脚本的其他参数;
  • sys.version:获取当前Python解释器的版本信息–字符串形式;
  • sys.version_info:获取当前Python解释器的版本信息–元组形式;
  • sys.platform:获取当前运行的操作系统平台名称;
  • sys.modules:返回已导入的模块信息,返回一个字典;
  • sys.path:获取模块搜索路径列表,用于指定python解释器搜索模块的路径;
    • 先到当前路径去找;
    • 再到项目根目录去找;
    • 再到Python安装目录去找;
    • 再到Python解释器路径去找(虚拟环境);
    • 再到安装的第三方库去找;
    • 如果还是找不到,那就会报错没有这个模块;

2.2 常用方法

  • sys.getdefaultencoding():获取当前编码方式
  • sys.exit():退出Python解释器,也就是停止运行,后面的代码不会运行

3.os模块

提供了与操作系统交互的函数
说明:使用os库,可以编写跨平台的代码,因为它提供了对操作系统底层功能的抽象,而不用担心特定操作系统的细节。

3.1 路径操作

  • os.getcwd() 获取当前文件的路径
  • os.chdir(‘path’) 切换工作目录
    • 工作目录是指当前正在执行的脚步所在的目录,通过这个方法,可以在脚本执行过程中动态切换到不同的目录;
    • path必须存在,不然程序报错找不到路径;

path方法

  • os.path.abspath(path):返回绝对路径;
  • os.path.basename(path):返回文件名;
  • os.path.dirname(path):返回目录名-返回指定路径的父目录路径–通过连续获取父目录名可以找到项目的根目录;
  • os.path.split(path):路径分割-将一个路径拆分为目录名部分和文件名部分–得到一个元组;
  • os.path.join(path1,path2):拼接路径-用于连接多个路径部分,它将多个路径片段组合在一起,形成一个新的路径字符串;
    • join方法会根据当前系统添加对应的路径连接符;类linux路径连接符/,Windows路径连接符\
  • os.path.exists(path):判断路径是否存在;
  • os.path.isdir(path):判断是否是目录且存在;
  • os.path.isfile(path):判断是否是文件且存在;
  • os.path.getsize(path):获取文件大小,单位为字节;

3.2 目录和文件

  • os.listdir(path):列出指定目录的内容,返回列表;
    • 如果不给定path就是当前目录;
  • os.mkdir(path):创建一个单级新目录;
    • 创建文件就用open方法以写的形式;
  • os.makedirs(path):递归创建多级目录;
  • os.rmdir(path):删除空目录;
    • 只能删除非空目录;
    • 不能递归删除,只会删除目录的最后一级空目录;
  • os.rename(old_dir_name,new_dir_name):目录或者文件重命名;
    • 不管目录是否为空;
  • os.remove(filename):删除文件–只能删除文件,不能删除目录;

3.3 其他操作

  • os.name:获取系统名称,在Windows上值为nt,在linux、macos值为posix
  • os.chmod(path,mode):更改文件权限模式,path为需要更改文件权限的路径,mode是权限模式,通常用八进制表示,如0o755
    • Windows系统这个方法没用;
  • os.sep:用于表示操作系统特定的路径分隔符;
    • 得到的结果为字符串,此时可以使用字符串的join方法进行路径拼接;

4.datetime模块

在Python中,与时间处理有关的模块就包括:time,datetime以及calendar;
**作用:**datetime是Python标准库中用于处理日期和时间的模块。它提供了多种类和函数,用于处理日期、时间、时间间隔等操作,使得日期和时间的处理更加方便和灵活。
(1)导入

# 这个模块的模块名和类名同名,但是方法都是在类中,所以导包的时候要注意;
from datetime import datetime

(2)datetime.now() 获取当前日期的datetime对象
datetime.now():获取当前日期时间,结果为datetime对象;

from datetime import datetime

# 获取当前日期和时间
print(f"当前日期和时间:{datetime.now()}") # 2023-12-19 14:20:20.583270
print(type(datetime.now())) # <class 'datetime.datetime'>

(3)strftime() 将datetime对象格式化输出为字符串
strftime(self, format) 将datetime对象格式化为自定义的字符串日期时间格式
format格式有固定要求;

  • 年:%Y–大写;
  • 月:%m–小写;
  • 日:%d–小写;
  • 时:%H–大写;
  • 分:%M–大写;
  • 秒:%S–大写;
from datetime import datetime
# 将datetime对象格式化为自定义的字符串日期时间格式
date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"自定义日期时间格式:{date}") # 2023-12-19 14:23:44
print(type(date)) # <class 'str'>
print(datetime.now().strftime("%Y-%m-%d")) # 2023-12-19
print(datetime.now().strftime("%H:%M:%S")) # 14:23:44
print(datetime.now().strftime("%Y/%m/%d")) # 2023/12/19
print(datetime.now().strftime("%Y年%m月%d日")) # 2023年12月19日

说明:format的格式固定不变,其他的连接符号都可以变,比如:/、空格、_、:等等;

(4)strptime() 将日期时间字符串解析为datetime对象

from datetime import datetime

# 将日期时间字符串解析为datetime对象
date = "2023-12-19 14:23:44"
datetime_instance = datetime.strptime(date,"%Y-%m-%d %H:%M:%S")
print(type(datetime_instance)) # <class 'datetime.datetime'>

(5)计算时间间隔

  • datetime对象可以进行减法运算,计算两个时间间隔,默认结果是xx days, xx:xx:xx,可以用以下属性获取天和秒;
    • date_diff.days:间隔天;
    • date_diff.seconds:间隔秒;
  • 结合timedelta类进行加法运行,计算未来的某个时间;
from datetime import datetime, timedelta

# 初始化两个datetime对象
date1 = datetime(2023,11,1)
date2 = datetime(2023,11,30)
# 两个日期的时间间隔
date_diff = date2-date1
print(f"时间间隔:{date_diff}") # 时间间隔:29 days, 0:00:00
print(f"时间间隔多少天:{date_diff.days}") # 29
print(f"时间间隔多少秒:{date_diff.seconds}") # 0
print(f"时间间隔多少秒:{date_diff.microseconds}") # 0

# 计算未来日期
future_date = datetime.now() + timedelta(hours=360)
print(f"360小时后的日期:{future_date}") # 2024-01-03 21:32:33.668083
print(type(future_date)) # <class 'datetime.datetime'>

(6)比较日期
通过比较datetime对象来判断日期的先后

# 通过比较datetime对象来判断日期的先后
date1 = datetime(2023,11,1)
date2 = datetime(2023,11,30)
if date1 > date2:
    print("date2的日期先于date1")
elif date1 < date2:
    print("date1的日期先于date2")
else:
    print("date1和date2的日期一样")

(7)获取日期和时间部分
使用datetime的属性获取日期和实际的部分信息;

# 获取日期和时间的部分
print(f"当前年:{datetime.now().year}")
print(f"当前月:{datetime.now().month}")
print(f"当前日:{datetime.now().day}")
print(f"当前时:{datetime.now().hour}")
print(f"当前分:{datetime.now().minute}")
print(f"当前秒:{datetime.now().second}")

5.time模块

在Python中,通常有这几种方式来表示时间:
1)时间戳(timestamp)
通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。返回时间戳方式的函数主要有time(),clock()等。
2)格式化的时间字符串
3)元组struct_time
struct_time元组共有9个元素,返回struct_time的函数主要有gmtime(),localtime(),strptime()。下面列出这种方式元组中的几个元素:

索引(Index) 属性(Attribute) 值(Values)
0 tm_year(年) 比如2011
1 tm_mon(月) 1 - 12
2 tm_mday(日) 1 - 31
3 tm_hour(时) 0 - 23
4 tm_min(分) 0 - 59
5 tm_sec(秒) 0 - 61
6 tm_wday(weekday) 0 - 6(0表示周日)
7 tm_yday(一年中的第几天) 1 - 366
8 tm_isdst(是否是夏令时) 默认为-1

5.1 常用方法

(1)time.time():返回当前时间的时间戳
(2)time.localtime([secs]):将一个时间戳转换为当前时区的struct_time。secs参数未提供,则以当前时间为准。
(3)time.mktime(t):将一个struct_time转化为时间戳。
(4)time.sleep(secs):线程推迟指定的时间运行。单位为秒。
(5)time.strftime(format[, t]):
把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。如果元组中任何一个元素越界,ValueError的错误将会被抛出。

6.json模块

Python与json数据类型对应关系

Python JSON
dict object
list、tuple array
str string
int、float number
True true
False false
None null

6.1 json数据结构

  • 对象:用花括号{}包裹,包含一系列键值对,每个键值对之间用逗号分割;
  • 数组:用方括号[]包裹,包含一系列值,每个值之间用逗号分割;
  • 键值对:键和值之间使用冒号分割,键必须是字符串,值可以是字符串、数字、布尔值、对象、数组、或null;
  • json数据的最外层只能是数组或对象;
  • json中的字符串,必须使用双引号包含;

6.2 JSON序列化与反序列化

序列化 json.dumps(): JSON的序列化指的是将Python对象转换为JSON格式的字符串

反序列化 json.loads(): JSON的反序列化值将JSON格式字符串转成Python对象

为什么序列化?
(1) 存储
一个软件/程序的执行就在处理一系列状态的变化。在编程语言中,“状态”会以各种各样有结构的数据类型(也可简单的理解为变量)的形式被保存在内存中。

在断电或重启程序之前将程序当前内存中所有的数据都保存下来,以便于下次程序执行能够从文件中载入之前的数据就是序列化
(2)传输
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。

发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。

如果收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差异化带来的限制,实现了跨平台数据交互!

6.3 json文件读写

json.dump(): 将Python对象序列化为JSON格式并写入文件中
json.load(): 从JSON文件中读取数据为Python对象

7.logging模块

7.1 四大组件

(1)logger 日志器,程序可供使用的接口
(2)handler处理器,用于写入日志文件并输出到指定位置,如文件、控制台、网络。
(3)filter 过滤器,用于输出符合指定条件的日志记录
(4)formatter 格式器,决定日志的输出格式