Python 优雅编程:会报恩的代码(四)

三余知行 2024-10-05 09:35:02 阅读 59

文章目录

引言urllib.parse.quote_plus判断指定路径的文件是否存在使用 os.path 模块使用 pathlib 模块

使用 imaplib 和 smtplib 实现邮件收发发送邮件接收邮件扩展和优化

使用 matplotlib 绘制人工神经网络拓扑图使用 `Keras` 构建卷积神经网络(CNN)模型构建

结语

引言

在 Python 编程中,有一些常用技巧和最佳实践可以帮助你编写更优雅、更高效的代码。本文将介绍的是 Python 中 <code>urllib.parse.quote_plus 的 URL 编码作用、判断指定路径的文件是否存在、使用 imaplibsmtplib 实现收发邮件、使用 matplotlib 绘制人工神经网络拓扑图、使用 Keras 构建卷积神经网络(CNN)等。

在这里插入图片描述

urllib.parse.quote_plus

在 Python 中连接 PostgreSQL、Redis 等时,可以使用 <code>urllib.parse.quote_plus 方法对密码进行 URL 编码,然后将其拼接到连接信息中。这样可以确保密码中的特殊字符被正确处理。

以下是一个示例代码,说明如何将密码进行编码并连接 Redis:

import redis

from urllib.parse import quote_plus

# 假设你有一个包含特殊字符的密码

password = "my#secret@password"

# 使用 quote_plus 对密码进行编码

encoded_password = quote_plus(password)

# 创建 Redis 连接

redis_url = f"redis://username:{ encoded_password}@localhost:6379/0"

redis_client = redis.from_url(redis_url)

# 现在可以使用 redis_client 进行操作

此方法将特殊字符(如 #@)转换为可以安全地包含在 URL 中的格式,从而避免连接错误。

判断指定路径的文件是否存在

在 Python 中,可以使用 os.path 模块或 pathlib 模块来判断指定路径的文件是否存在。下面分别介绍这两种方法。

使用 os.path 模块

import os

# 指定要检查的文件路径

file_path = 'your_file_path.txt'

# 判断文件是否存在

if os.path.isfile(file_path):

print(f"文件 { file_path} 存在。")

else:

print(f"文件 { file_path} 不存在。")

os.path.isfile(file_path) 检查指定路径是否为一个文件,并且该文件存在。如果存在返回 True,否则返回 False

使用 pathlib 模块

from pathlib import Path

# 指定要检查的文件路径

file_path = Path('your_file_path.txt')

# 判断文件是否存在

if file_path.is_file():

print(f"文件 { file_path} 存在。")

else:

print(f"文件 { file_path} 不存在。")

Path(file_path).is_file() 同样可以检查指定路径是否为一个文件,并且该文件存在。

无论你选择使用哪个模块,上述两种方法都能够有效地判断指定路径的文件是否存在。你可以根据实际需要和喜好选择其中一种。

os.path 传统方式,适用于较旧的 Python 版本(Python 2 和 3 均可使用)。pathlib 较新方法,推荐使用,因为它提供了更为面向对象的 API,使路径的操作更为直观和简洁。

使用 imaplib 和 smtplib 实现邮件收发

要在 Python 中实现使用 Google 邮箱(Gmail)进行邮件的收发,可以使用 smtplib 模块来发送邮件,以及 imaplib 模块来接收邮件。

发送邮件

依赖库

pip install secure-smtplib

发送邮件示例

import smtplib

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

def send_email(subject, body, to_email):

from_email = "你的邮箱@gmail.com"

password = "你的应用专用密码"

# 创建邮件

msg = MIMEMultipart()

msg['From'] = from_email

msg['To'] = to_email

msg['Subject'] = subject

msg.attach(MIMEText(body, 'plain'))

try:

# 登录并发送邮件

server = smtplib.SMTP('smtp.gmail.com', 587)

server.starttls() # 开始TLS加密

server.login(from_email, password)

server.sendmail(from_email, to_email, msg.as_string())

print("邮件发送成功")

except Exception as e:

print(f"邮件发送失败: { e}")

finally:

server.quit()

# 示例调用

send_email("测试邮件", "这是邮件正文", "收件人邮箱@gmail.com")

接收邮件

依赖库

pip install imaplib2

接收邮件示例

import imaplib

import email

def read_email():

email_user = '你的邮箱@gmail.com'

password = '你的应用专用密码'

mail = imaplib.IMAP4_SSL('imap.gmail.com')

mail.login(email_user, password)

mail.select('inbox')

# 搜索所有邮件

result, data = mail.search(None, 'ALL')

mail_ids = data[0].split()

# 读取最新一封邮件

latest_email_id = mail_ids[-1]

# 获取邮件

result, msg_data = mail.fetch(latest_email_id, '(RFC822)')

raw_email = msg_data[0][1]

# 解码邮件

msg = email.message_from_bytes(raw_email)

subject = msg['subject']

from_ = msg['from']

print(f'发件人: { from_}')

print(f'主题: { subject}')

mail.logout()

# 示例调用

read_email()

扩展和优化

通过上述代码,可以实现 Gmail 邮箱的基本邮件收发功能。根据具体需求,还可以进一步扩展和优化。

启用两步验证:如果已经启用了 Gmail 的两步验证,需使用应用专用密码,而不是你的账户密码。权限设置:确保在 Gmail 设置中允许“低安全性应用访问”或使用 OAuth 2.0 进行身份验证。代码安全性:在生产环境中,切勿将密码硬编码在代码中,使用环境变量或密钥管理工具。

使用 matplotlib 绘制人工神经网络拓扑图

要用 Python 绘制一个简单的人工神经网络,可以使用 matplotlib 库。

依赖库

pip install matplotlib

以下是展示如何绘制一个包含输入层、隐藏层和输出层的简单神经网络的示例代码:

import matplotlib.pyplot as plt

def draw_neural_network():

# 设置图形和轴

plt.figure(figsize=(8, 6))

# 网络参数

layers = [3, 5, 2] # 输入层3个神经元,隐藏层5个神经元,输出层2个神经元

n_layers = len(layers)

# 绘制神经元

for n, layer in enumerate(layers):

for m in range(layer):

circle = plt.Circle((n, m * 1.5), 0.3, color='skyblue', ec='black')code>

plt.gca().add_artist(circle)

plt.text(n, m * 1.5, f'Neuron { m+1}', fontsize=9, ha='center', va='center')code>

# 绘制连接线

for n in range(n_layers - 1):

for m in range(layers[n]):

for k in range(layers[n + 1]):

plt.plot([n, n + 1], [m * 1.5, k * 1.5], color='gray', alpha=0.5)code>

# 设置坐标轴范围和隐藏坐标轴

plt.xlim(-0.5, n_layers - 0.5)

plt.ylim(-1, max(layers) * 1.5)

plt.axis('off')

plt.title('Simple Neural Network')

plt.show()

# 示例调用

draw_neural_network()

运行此代码后,会看到一个简单的人工神经网络的拓扑图形。

在这里插入图片描述

这可以帮助理解神经网络的结构。还可以根据需要调整输入、隐藏和输出层的神经元数量。

layers: 设定神经网络的层次结构,这里包括 3 个输入神经元、5 个隐藏神经元和 2 个输出神经元。绘制神经元: 使用<code>Circle绘制每个神经元,并在其中心标注。绘制连接线: 使用plot绘制神经元之间的连接,表示层与层之间的权重连接。设置坐标系: 隐藏坐标轴并设置合适的范围,使图形更加美观。

使用 Keras 构建卷积神经网络(CNN)

下面是使用 Keras 库构建一个卷积神经网络(CNN)的代码示例:

from keras.models import Sequential

from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

# 构建模型

model = Sequential()

model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)))code>

model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())

model.add(Dense(units=128, activation='relu'))code>

model.add(Dense(units=10, activation='softmax'))code>

# 编译模型

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])code>

依赖模块

Sequential:用于按顺序构建模型的 Keras 类。Conv2D:卷积层,用于提取图像特征。MaxPooling2D:池化层,用于降低特征图的尺寸,减少计算量。Flatten:将多维输入展平为一维数组,便于连接到全连接层。Dense:全连接层,用于完成分类等任务。

模型构建

通过 Sequential() 创建一个顺序模型实例 model

model = Sequential()

通过 model.add()model 添加卷积层

model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)))code>

Conv2D(32, (3, 3), ...):添加一个卷积层,使用 32 个过滤器,每个过滤器的大小为 3x3。activation='relu'code>:使用 ReLU 激活函数,使非线性特性增强。input_shape=(64, 64, 3):输入图像的形状为 64x64 像素,3 个通道(RGB 图像)。

通过 model.add()model 添加池化层

model.add(MaxPooling2D(pool_size=(2, 2)))

MaxPooling2D(pool_size=(2, 2)):添加一个 2x2 的池化层,用于减小特征图的尺寸,从而减少计算量和降低过拟合风险。

通过 Flatten() 将卷积和池化层的输出展平成一维数组,为全连接层做好准备:

model.add(Flatten())

添加 Dense(units=128, activation='relu')code> 全连接层,包含 128 个神经元,使用 ReLU 激活函数:

model.add(Dense(units=128, activation='relu'))code>

添加 Dense(units=10, activation='softmax')code>:输出层,包含 10 个神经元(适用于处理 10 个类别),使用 Softmax 激活函数将输出转换为概率分布:

model.add(Dense(units=10, activation='softmax'))code>

编译模型:

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])code>

optimizer='adam'code>:使用 Adam 优化器,自动调整学习率,适合大多数情况。loss='categorical_crossentropy'code>:使用分类交叉熵损失函数,适用于多类别分类任务。metrics=['accuracy']:设置评估指标为准确率,以便在训练和测试时监测模型表现。

以上步骤构建了一个简单的卷积神经网络,可用于图像分类等任务。模型首先通过卷积层提取特征,然后使用池化减小特征尺寸,最后通过全连接层输出分类结果。

结语

本文介绍了 Python 中的 urllib 及其 quote_plus 功能、imaplibsmtplibpathlibpathmatplotlibKeras 等模块的一些特定用法,希望这些小技巧能在某个特定的时间正好帮到你。


PS:感谢每一位志同道合者的阅读,欢迎关注、点赞、评论!


上一篇:Python 优雅编程:会报恩的代码(三)专栏:「计算通践」



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。