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路径连接符\
;
- join方法会根据当前系统添加对应的路径连接符;类linux路径连接符
- 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 格式器,决定日志的输出格式