模块概述
在Python中,模块(Module)是组织代码的重要方式,它能帮助开发者将代码分割成更小、更易于管理的单元,并促进代码复用性和可
维护性。一个模块就是一个包含Python定义和语句的文件。模块名就是文件名,通过模块,我们可以把相关的函数、类、变量等封装在
一起,从而实现功能上的分离和代码重用。我们重点要学习如何创建自定义模块,如何使用模块。
创建模块
只需创建一个以.py
为扩展名的文件即可。例如,创建一个名为 mymodule.py
的文件:
age = 23
name = "python模块"
使用模块
可以通过 import
语句来导入模块中的内容。有两种主要的方式:
-
直接导入整个模块:直接导入法
-
从模块中导入特定的内容:跳跃式、贪婪式(跳跃式的一种简洁写法)
直接导入法
import mymodule
print(mymodule.age)
print(mymodule.name)
print(mymodule.version)
跳跃式
-
结合
from
关键字实现按需导入from mymodule import age, name print(age) print(name)
-
还可以给导入的模块或对象起别名,方便使用
from mymodule import age, name as n print(n)
-
贪婪式
-
跳跃式的一种简洁写法
from mymodule import * print(age) print(name) print(version)
if name == 'main':
if __name__ == '__main__':
是 Python 中一种常见的惯用法,用于检测当前模块是被直接运行还是被导入到另一个模块中。
这是一种控制代码执行的方式,确保某些代码块只在脚本直接执行时运行,而不是在作为模块被导入时执行。
这在编写可重用的模块和测试代码时特别有用的。
mymodule.py
文件
age = 23
if __name__ == '__main__':
print(age)
test.py
文件:
from mymodule import *
print(age)
所以它能帮助我们开发者更好地组织代码,使其既适合单独执行,也适合作为库的一部分被其他程序使用。
遵循这一使用方法可以让我们的代码更易于测试、维护和复用。
python库
Python 拥有丰富而强大的标准库和第三方库,这些库极大地扩展了 Python 的功能,使其成为一种非常受欢迎的编程语言。
以下是 Python 中一些常见库的概述及其主要用途介绍
标准库
准库是 Python 解析器自带的一部分,无需额外安装。只要你安装了 Python解析器,就可以直接使用这些库。
经过长时间的发展和完善,标准库中的模块通常非常稳定,性能良好。
常见的标准库有:
-
random
:生成伪随机数以及进行随机选择等操作 -
math
:提供常见的数学函数 -
time
:处理时间相关的函数,如获取当前时间戳、休眠等
第三方库
第三方库不是 Python 内置的,需要通过包管理工具单独安装,由开发者社区维护和支持,通常针对特定领域或问题提供解决方案
相比标准库,第三方库更新速度更快,能够迅速适应新技术和发展趋势。
常见的第三方库有:
-
numpy
:高效数值计算的基础库 -
pandas
:提供灵活的数据结构和数据分析工具
random
概述
random库是Python语言的一个标准库,用于产生各种分布的伪随机数序列。
random库采用梅森旋转算法生成伪随机数序列,可用于对随机性要求不高的大多数工程应用。
常用函数
random
作用:生成一个[0.0,1.0)之间的随机小数,无参数。
请注意这些函数每次执行后的结果可能是不一样的。
import random
print(random.random())
randint
作用:生成指定区间随机整数,randint(a,b),用于生成一个[a,b]之间的整数,要求a≤b。
import random
# 生成10-20之间的随机整数
res = random.randint(10, 20)
# ValueError
res = random.randint(20, 10)
uniform
作用:生成指定区间随机小数,uniform(a,b) ,用于生成一个[a,b]之间的随机小数。
import random
res = random.uniform(10, 20)
print(res) # 生成10-20之间的随机小数
randrange
作用:指定步长生成对应随机数,randrange([start,] stop[,step] ) 用于生成 一 个[start,stop)之间的以step为步长的随机整数,
要求start≤stop,且有参数step时,start不可以缺省。
import random
res = random.randrange(10, 100, 5)
print(res) # 都是步长为5的结果
res = random.randrange(10, 100)
print(res) # 就是10-100之间随机数
res = random.randrange(10, 2)
print(res) # start > stop
choice
作用:从指定随机数中随机,randchoice(seq) 用于从序列seq中随机选取一个元素。
import random
res = random.choice([10, 20, 30, 40, 50])
print(res)
res = random.choice('I love python')
print(res)
res = random.choice(['Python', 'VC', 'VB', 'Java'])
print(res)
shuffle
作用:随机排列,shuffle(seq),用于将序列seq的顺序重新随机排列,并返回重新排列后的结果。
import random
s = [1, 2, 3, 4, 5]
random.shuffle(s)
print(s)
sample
作用:用于从序列seq中随机选取k个元素组成新的序列。
import random
# 从指定序列中 随机选取指定长度的随机数
res = random.sample([1, 2, 3, 4, 5], 3)
print(res)
math
概述
Python math 模块提供了许多对浮点数的数学运算函数。math 模块下的函数,返回值均为浮点数,除非另有明确说明。
数学常数
math库中的4个数学常数
常量 | 描述 |
---|---|
math.e | 返回欧拉数 (2.7182...) |
math.inf | 返回正无穷大浮点数 |
math.nan | 返回一个浮点值 NaN (not a number) |
math.pi | π 一般指圆周率。 圆周率 PI (3.1415...) |
import math
# 输出 e 的值
print(math.e)
# 输出正无穷大
print(math.inf)
# 输出负无穷大
print(-math.inf)
# 输出 nan
print(math.nan)
# 输出 nan 类型
print(type(math.nan))
# 输出 PI
print(math.pi)
常用函数
-
math.floor()
-
将数字向下舍入到最接近的整数
-
-
math.ceil(x)
-
将 x 向上舍入到最接近的整数
-
-
math.degrees(x)
-
将角度 x 从弧度转换为度数。1弧度约为57.3°
-
-
math.radians(x)
-
将角度 x 从度数转换为弧度
-
-
math.fabs(x)
-
返回 x 的绝对值
-
-
math.factorial(x)
-
返回 x 的阶乘。 如果 x 不是整数或为负数时则将引发 ValueError
-
-
math.fmod(x, y)
-
返回 x/y 的余数
-
-
math.fsum(iterable)
-
返回可迭代对象 (元组, 列表, 等)中的元素总和,是浮点值
-
-
math.sqrt(x)
-
返回 x 的平方根
-
-
math.pow(x, y)
-
将返回 x 的 y 次幂
-
-
math.prod(iterable)
-
计算可迭代对象中所有元素的积
import math print(math.floor(10.1)) print(math.ceil(10.1)) print(math.degrees(1)) print(math.radians(57.29577951308232)) print(math.fabs(-1)) print(math.factorial(4)) print(math.fmod(4, 3)) print(math.fsum((1, 2, 3, 4))) print(math.sqrt(8)) # 2.82 print(math.pow(2, 3)) print(math.prod([1, 2, 3, 4]))
-
Pydantic
概述
Pydantic 是一个Python库,用于数据验证和设置管理。它最初是为了弥补Python标准库在数据验证方面的不足而设计的。
Pydantic是在运行时验证类型是否有问题,Pydantic 会在运行时抛出错误。
安装
pip install pydantic
问题描述
dataclass:Python 3.7 引入的标准库特性,目的是简化创建只用于存储数据的类,减少样板代码。内置提供了init实现
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
p = Person(100, 23)
print(p)
上述代码在编辑器中是可以正常运行的,而且执行python指令去运行py文件也会正常运行
python main.py
但是如果我们使用mypy指令去运行py文件则会提示赋值类型错误。
mypy 是一个用于 检查Python 的静态类型检查工具,它可以帮助我们在不运行代码的情况下发现类型相关的错误。
静态类型检查能够在开发过程中尽早捕获类型错误,提高代码的可靠性和可维护性。
安装
pip install mypy
执行文件
mypy main.py
main.py:10: error: Argument 1 to "Person" has incompatible type "int"; expected "str" [arg-type]
Found 1 error in 1 file (checked 1 source file)
Pydantic数据验证功能
Pydantic默认自带数据验证功能,如果name传递的类型不是str则运行会报错
from pydantic import BaseModel
class Person(BaseModel):
name: str
age: int
# BaseModel会内部提供init函数,并且必须关键字参数传递
# 这时我们给name传递int类型,运行则会报错。
p = Person(name=100, age=23)
print(p)
邮箱验证
需要安装email-validator,这样EmailStr才会生效
pip install email-validator 或者去 pycharm中安装
可以校验邮箱格式是否正确
from pydantic import BaseModel, EmailStr
class Person(BaseModel):
name: str
age: int
email: EmailStr
p = Person(name="100", age=23, email="1024@163.com")
print(p)
自定义验证
使用field_validator装饰器 对指定的字段进行验证
如果验证不满足需求,可以自定义验证规则
可以要求年龄必须是正数
from pydantic import BaseModel, field_validator
class Person(BaseModel):
name: str
age: int
# 对age字段进行验证,要求是类方法
@field_validator("age")
def validate_age(cls, value):
if value < 0:
raise ValueError(f"年龄必须是正数: {value}")
return value
p = Person(name="zs", age=-10)
print(p)
Pydantic转换为JSON
from pydantic import BaseModel
class Person(BaseModel):
name: str
age: int
wedding: bool
p = Person(name="zs", age=10, wedding=True)
print(p.model_dump_json()) # 返回 JSON 格式的字符串。
print(p.model_dump()) # 返回 Python 字典或者列表
# json_str = '{"name": "John", "age": 25, "wedding": true}'
json_str = p.model_dump_json()
person = Person.model_validate_json(json_str)
print(person)
print(person.age)
# model_validate_json 可以将JSON字符串转换为Person对象
dataclass 和 pydantic 区别
-
设计目的
-
dataclass:Python 3.7 引入的标准库特性,目的是简化创建只用于存储数据的类,减少样板代码。
-
pydantic:第三方库,专注于数据验证和设置管理,保证数据符合特定的类型和约束。
-
-
数据验证
-
dataclass:本身不提供数据验证功能,虽然可以通过类型注解声明字段类型,但 Python 解释器不会强制类型检查。
-
pydantic:有强大的数据验证功能,创建模型实例时会自动验证数据类型和约束条件,不符合要求会抛出异常。
-
-
类型支持
-
dataclass:支持 Python 内置类型和自定义类型,但没有额外的类型处理功能。
-
pydantic:除了基本类型,还支持更复杂的类型,如 EmailStr、field_validator 等。
-
-
序列化和反序列化
-
dataclass:没有内置的序列化和反序列化机制。
-
pydantic:提供了方便的序列化和反序列化方法,如 model_dump、model_dump_json、parse_raw 等。
-
time
概述
time是Python提供的用于处理时间的标准库。
time提供了一系列操作时间的函数,具有系统级精确计时器的计时功能,可以实现程序计时、分析程序性能等与时间相关的功能。
类别分类
time库函数的功能主要分为三类:时间处理、时间、格式化和计时。
-
时间处理功能函数主要包括:
-
time.time()
-
time.gmtime()
-
time.localtime()
-
time.ctime()
-
-
时间格式化功能函数主要包括:
-
time.mktime()
-
time.strftime()
-
time.strptime()
-
-
计时功能函数主要包括:
-
time.sleep()
-
时间处理函数
时间处理功能函数主要包括:
-
time.time()
-
获得当前时间的时间戳
-
-
time.gmtime()
-
UTC时间
-
-
time.localtime()
-
本地时间
-
-
time.ctime()
-
返回一个表示本地时间的字符串。
import time print(time.time()) # 获得当前时间的时间戳(1970纪元后经过的浮点秒数) # 所谓时间戳,即从格林威治时间1970年01月01日00分00秒 # (北京时间1970年01月01日08时00分00秒)起至现在的总秒数。 print(time.gmtime()) # 返回的是UTC时间(格林威治标准时间) print(time.localtime()) # 如果你期望得到本地时间,应该使用 time.localtime()。 print(time.ctime()) # 返回一个表示本地时间的字符串。
-
时间格式化函数
时间格式化功能函数主要包括:
-
time.mktime()
-
mktime()函数将struct_time(或包含9个元素的元组对应于struct_time)作为参数,并返回自当地时间的纪元以来经过的秒数。
import time t = (1970, 1, 1, 8, 1, 0, 4, 362, 0) local_time = time.mktime(t) print(local_time)
time.strftime()
-
字符串格式化,该strftime()函数以struct_time(或与其对应的元组)作为参数,并根据所使用的格式代码返回表示它的字符串。
这里%Y,%m,%d,%H等都是格式代码:
%Y - 年
%m - 月
%d - 日
%H - 小时
%M - 分钟
%S - 秒
import time named_tuple = time.localtime() print(named_tuple) # 我们要把年月日等信息 按照我们的格式显示 time_string = time.strftime("%Y-%m-%d %H:%M:%S", named_tuple) print(time_string)
time.strptime()
-
该strptime()函数解析表示时间的字符串并返回时间格式
import time time_string = "2024-7-2" result = time.strptime(time_string, "%Y-%m-%d")
-
计时功能函数
计时功能函数主要包括:
-
time.sleep()
-
sleep()函数在给定的秒数内暂停(延迟)当前线程的执行。
import time print("这是立即打印。") time.sleep(2.4) print("这是2.4秒后打印的。")
-
字符串格式化
概述
如果有大量的字符串拼接需求,可以使用字符串模版来实现,字符串模板是一个由字符串和槽组成的字符串,用来控制字符串和变量的显
示效果,其中槽用大括号“{}”表示,对应format()方法中用逗号分隔的参数。
str = "姓名是:{},年龄是:{}".format("zs", 18)
匹配
按位置顺序匹配
"姓名是:{},年龄是:{}".format("zs", 18)
按自定义序号顺序匹配
str = "名字是:{1}, 年龄是:{0}".format(18, "Tom") # 带数字号,默认18 是0,tom是1
str = '{0} {1} {0}'.format('apple', '苹果') # 打乱顺序,同一个参数填充多次
按关键字匹配
str = "名字是:{name}, 年龄是:{age}".format(age=18, name="Tom")
print(str)
格式控制
小数点保留
print("{:.2f}".format(12345.67890)) # 小数点保留2位
print("{:25.2f}".format(12345.67890)) # 数字默认右对其 并小数点保留2位
print("{:.2}".format("Python")) # 字符串默认左对其 并保留2个字符
占位符
str = "租用%s的天数是%.2f,价格是%d" % ("benz", 2, 100)
print(str)
format
num = 100
name = 'zs'
str = f"正确的数字是{num}。名字是:{name}"
print(str)