首页 > Python资料 博客日记
Python 优雅编程:会报恩的代码(四)
2024-09-18 08:00:08Python资料围观35次
文章目录
引言
在 Python 编程中,有一些常用技巧和最佳实践可以帮助你编写更优雅、更高效的代码。本文将介绍的是 Python 中 urllib.parse.quote_plus
的 URL 编码作用、判断指定路径的文件是否存在、使用 imaplib
与 smtplib
实现收发邮件、使用 matplotlib
绘制人工神经网络拓扑图、使用 Keras
构建卷积神经网络(CNN)等。
urllib.parse.quote_plus
在 Python 中连接 PostgreSQL、Redis 等时,可以使用 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')
plt.gca().add_artist(circle)
plt.text(n, m * 1.5, f'Neuron {m+1}', fontsize=9, ha='center', va='center')
# 绘制连接线
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)
# 设置坐标轴范围和隐藏坐标轴
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 个输出神经元。
- 绘制神经元: 使用
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)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(units=128, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
依赖模块
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)))
Conv2D(32, (3, 3), ...)
:添加一个卷积层,使用 32 个过滤器,每个过滤器的大小为 3x3。activation='relu'
:使用 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')
全连接层,包含 128 个神经元,使用 ReLU 激活函数:
model.add(Dense(units=128, activation='relu'))
- 添加
Dense(units=10, activation='softmax')
:输出层,包含 10 个神经元(适用于处理 10 个类别),使用 Softmax 激活函数将输出转换为概率分布:
model.add(Dense(units=10, activation='softmax'))
- 编译模型:
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
optimizer='adam'
:使用 Adam 优化器,自动调整学习率,适合大多数情况。loss='categorical_crossentropy'
:使用分类交叉熵损失函数,适用于多类别分类任务。metrics=['accuracy']
:设置评估指标为准确率,以便在训练和测试时监测模型表现。
以上步骤构建了一个简单的卷积神经网络,可用于图像分类等任务。模型首先通过卷积层提取特征,然后使用池化减小特征尺寸,最后通过全连接层输出分类结果。
结语
本文介绍了 Python 中的 urllib
及其 quote_plus
功能、imaplib
与 smtplib
、pathlib
与 path
、matplotlib
、Keras
等模块的一些特定用法,希望这些小技巧能在某个特定的时间正好帮到你。
PS:感谢每一位志同道合者的阅读,欢迎关注、点赞、评论!
- 上一篇:Python 优雅编程:会报恩的代码(三)
- 专栏:「计算通践」
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj