第十一章 模块

第十一章 模块

文章目录

  • 第十一章 模块
    • 11.1 使用模块
      • 11.1.1 认识模块
      • 11.1.2 导入模块
      • 11.1.3 导入成员名称
    • 11.2 使用包
      • 11.2.1 认识包和库
      • 11.2.2 导入包
    • 11.3 常用模块
        • 11.3.1 日期和时间
          • 1.`time` 模块
          • 2.`datetime`模块
            • 1. 导入 `datetime` 模块
            • 2. `date` 类
            • 3. `time` 类
            • 4. `datetime` 类
            • 5. `timedelta` 类
        • 11.3.2 随机数
        • 11.3.3 摘要算法
        • 11.3.4 JSON处理
        • 11.3.5 图像处理

11.1 使用模块

11.1.1 认识模块

当程序的代码量非常大的时候,一般需要将代码分为一些有组织的代码段,这些代码段之间有一定的联系。
Python模块一般都位于安装,目录下Lib文件中,执行help("modules"),命令,可以查看已经安装的所有模块列表。Python模块可以分为以下三类:

  • 内置标准块
  • 第三方开源模块
  • 自定义模块
    内置模块不需要安装,第三方模块和自定义模块需要手动安装。访问:Python开源模块库网址:PyPI。
    使用第三方模块时,需要先下载并安装该模块,然后就可以像使用标准模块一样导入并使用。
  1. 下载模块并安装。在PyPI首页 搜索模块,找到需要的模块,单击Download files进入下载页面。然后,选择下载二进制文件(.whl),或者源代码压缩包(.gz)。最后,使用pip命令进行安装,安装时把模块名替换为二进制安装文件即可。注意,在命令行下改变当前目录到安装文件的目录下。
  2. 使用pip命令安装。直接通过Python提供的pip命令安装。语法格式如下:
>pip install 模块名

pip命令自动下载模块包并完成安装。pip命令默认连接Python官方服务器下载。

11.1.2 导入模块

使用import语句可以导入模块,语法格式如下:

import module

Remark:
所有的模块在导入时候的顺序:

  • 标准块
  • 第三方开源模块
  • 自定义模块
    一个模块无论被导入多少次,它只被加载一次,当,Python解释器在源代码中遇到import关键字时,自动在搜索路径中搜寻对应的模块,如果发现是初次导入,就加载运行这个文件。在程序顶层导入,那么它的作用域就是全局的;在函数中导入,作用域就是局部的。

11.1.3 导入成员名称

使用from-import语句可以将指定模块中的成员名称导入作用域中,如函数、类或变量等,语法结构如下:

from module_name import name1, name2, ...
from module_name import *

11.2 使用包

11.2.1 认识包和库

包含于
包含于
模块

11.2.2 导入包

导入一个包,其本质就是解释该包下的__init__.py文件。导入包内模块有两种方式:绝对路径导入和相对路径导入。

  1. 绝对路径导入:通过指定“包.模块.名字”的完整路径进行导入。
  2. 相对路径导入:在一个包的内部,模块之间可以使用相对路径导入。
  • 在导入路径前面添加一个点(.),表示当前目录。
  • 在导入路径前面添加两个点(…),表示父级目录。
  1. 导入一个包内的指定模块:
  2. 从模块中导入一个成员名称:

11.3 常用模块

11.3.1 日期和时间

Python提供了多个内置模块用于操作日期和时间,如:timedatecalendar

1.time 模块

时间也是一种数据类型,这种类型的数据一般分为三种形式:时间戳、结构化时间和格式化时间字符串。

  • 时间戳:从 1970年1月1日 00:00:00 UTC(协调世界时) 开始经过的秒数(或毫秒数,取决于系统)。
    【示例】使用time模块的time()函数获取当前时间的时间戳。
import time
now=time.time()
print(now)
  • 结构化时间:结构化时间是一个struct_time元组,包含9个字段。
序号 属性 字段
0 tm_year 4位数年 2008
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 一周的第几天 0~6
7 tm_yday 一年的第几日 1~366
8 tm_isdst 夏令时 1表示夏令时,0非夏令时 ,-1表示未知,默认为-1
  • 格式化时间字符串:
    【示例】使用ctime()函数获取当前时间的字符串
import time
print(time.ctime())
2.datetime模块

datetime 模块是 Python 标准库中用于处理日期和时间的强大工具,它提供了多种类来操作日期和时间,如 datetimedatetimetimedelta 等。下面详细介绍这些类及其常见用法。

1. 导入 datetime 模块

在使用 datetime 模块的功能之前,需要先导入它。

import datetime
2. date

date 类用于处理日期,包含年、月、日信息。

创建 date 对象

# 创建一个指定日期的 date 对象
d = datetime.date(2025, 2, 9)
print(d)  # 输出: 2025-02-09

获取日期的属性

year = d.year
month = d.month
day = d.day
print(year, month, day)  # 输出: 2025 2 9

获取当前日期

today = datetime.date.today()
print(today)  # 输出当前日期
3. time

time 类用于处理时间,包含时、分、秒、微秒信息。

创建 time 对象

# 创建一个指定时间的 time 对象
t = datetime.time(12, 30, 45, 123456)
print(t)  # 输出: 12:30:45.123456

获取时间的属性

hour = t.hour
minute = t.minute
second = t.second
microsecond = t.microsecond
print(hour, minute, second, microsecond)  # 输出: 12 30 45 123456
4. datetime

datetime 类是 date 类和 time 类的结合,包含年、月、日、时、分、秒、微秒信息。

创建 datetime 对象

# 创建一个指定日期和时间的 datetime 对象
dt = datetime.datetime(2025, 2, 9, 12, 30, 45)
print(dt)  # 输出: 2025-02-09 12:30:45

获取当前日期和时间

now = datetime.datetime.now()
print(now)  # 输出当前日期和时间

从字符串解析 datetime 对象

date_string = "2025-02-09 12:30:45"
dt = datetime.datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(dt)  # 输出: 2025-02-09 12:30:45

datetime 对象格式化为字符串

dt = datetime.datetime.now()
formatted_date = dt.strftime("%Y/%m/%d %H:%M:%S")
print(formatted_date)  # 输出格式化后的日期和时间
5. timedelta

timedelta 类用于表示两个日期或时间之间的差值。

计算日期差值

d1 = datetime.date(2025, 2, 9)
d2 = datetime.date(2025, 2, 10)
delta = d2 - d1
print(delta.days)  # 输出: 1

日期加减操作

dt = datetime.datetime.now()
# 增加一天
new_dt = dt + datetime.timedelta(days=1)
print(new_dt)
11.3.2 随机数

random用来生成随机数:

  • random.random():生成0~1.0的随机浮点数
  • random.uniform(a,b):生成a~b的随机浮点数
  • random.ranint(a,b):生成a~b的随机整数
  • random.randrange([start=0],stop[,step=1])指定范围步长的集合内的随机数
  • random.choice(sequence):从序列中取出一个元素
  • random.shufflex(x[,random]):用于一个列表中的元素打乱
  • random.sample(sequence,k):丛指定的序列随机获取指定长度的切片
11.3.3 摘要算法

摘要算法,也称为哈希算法或散列算法,它是一种将任意长度的数据转换为固定长度哈希值的算法。这个哈希值通常是一段十六进制的字符串,具有唯一性和确定性,常用于数据完整性验证、密码存储、数字签名等领域。以下为你详细介绍摘要算法:

常见摘要算法

  1. MD5(Message-Digest Algorithm 5)
  • 原理:MD5 算法会把输入的任意长度数据通过一系列复杂的运算,最终生成一个 128 位(通常表示为 32 位十六进制数)的哈希值。
  • 特点:运算速度快,但安全性较低,已经被发现存在哈希碰撞(不同的输入产生相同的哈希值)的问题,因此不适合用于安全性要求较高的场景。
  • Python 示例
import hashlib

data = "Hello, World!".encode('utf-8')
md5_hash = hashlib.md5(data).hexdigest()
print(md5_hash)
  1. SHA-1(Secure Hash Algorithm 1)
  • 原理:SHA - 1 算法可以将任意长度的数据转换为 160 位(通常表示为 40 位十六进制数)的哈希值。
  • 特点:安全性比 MD5 高,但也被发现存在安全漏洞,现在也逐渐不推荐用于安全敏感的应用场景。
  • Python 示例
import hashlib

data = "Hello, World!".encode('utf-8')
sha1_hash = hashlib.sha1(data).hexdigest()
print(sha1_hash)
  1. SHA - 2 系列
  • 原理:SHA - 2 是一系列算法的统称,包括 SHA - 224、SHA - 256、SHA - 384 和 SHA - 512 等,分别生成 224 位、256 位、384 位和 512 位的哈希值。
  • 特点:目前被广泛认为是比较安全的摘要算法,在密码学和安全领域有广泛应用。
  • Python 示例(以 SHA - 256 为例)
import hashlib

data = "Hello, World!".encode('utf-8')
sha256_hash = hashlib.sha256(data).hexdigest()
print(sha256_hash)
  1. SHA - 3 系列
  • 原理:SHA - 3 是新一代的哈希算法,为了应对日益增长的安全需求而设计,同样有不同的输出长度可供选择。
  • 特点:安全性高,且在设计上避免了一些 SHA - 2 可能存在的潜在问题。
  • Python 示例(以 SHA3 - 256 为例)
import hashlib

data = "Hello, World!".encode('utf-8')
sha3_256_hash = hashlib.sha3_256(data).hexdigest()
print(sha3_256_hash)
11.3.4 JSON处理
11.3.5 图像处理
  • 安装pillow

  • 操作图像

import unittest
from PIL import Image
import os


class TestPillowLibrary(unittest.TestCase):
    def setUp(self):
        # 定义测试图片的路径
        self.image_path = 'test_image.jpg'
        # 检查测试图片是否存在
        if not os.path.exists(self.image_path):
            raise FileNotFoundError(f"测试图片 {self.image_path} 未找到,请确保该图片存在于当前目录。")

    def test_image_open(self):
        try:
            # 尝试打开图片
            with Image.open(self.image_path) as img:
                self.assertEqual(img.format, 'JPEG')
        except Exception as e:
            self.fail(f"打开图片时出现错误: {e}")

    def test_image_resize(self):
        try:
            # 打开图片
            with Image.open(self.image_path) as img:
                # 原图片的尺寸
                original_width, original_height = img.size
                # 调整图片大小
                new_size = (original_width // 2, original_height // 2)
                resized_img = img.resize(new_size)
                # 检查调整后的尺寸是否正确
                self.assertEqual(resized_img.size, new_size)
        except Exception as e:
            self.fail(f"调整图片大小时出现错误: {e}")

    def test_image_save(self):
        try:
            # 打开图片
            with Image.open(self.image_path) as img:
                # 定义保存的文件名
                save_path = 'test_saved_image.jpg'
                # 保存图片
                img.save(save_path)
                # 检查保存的文件是否存在
                self.assertTrue(os.path.exists(save_path))
                # 删除保存的测试文件
                os.remove(save_path)
        except Exception as e:
            self.fail(f"保存图片时出现错误: {e}")


if __name__ == '__main__':
    unittest.main()

你可能感兴趣的:(python,python)