【python编程】避免 Python 中的反模式编程

news/2025/1/7 13:51:40/文章来源:https://www.cnblogs.com/o-O-oO/p/18646564

Python 受欢迎的原因之一是其灵活性,这对开发人员有很多好处。然而,它也包含一些陷阱和坏习惯,这些陷阱和坏习惯会导致代码难以阅读、维护或调试。在本文中,我们将介绍一些常见的 Python 反模式以及如何避免它们。建议新手程序员避免不好的编码习惯,并且不断练习良好的编码风格,会为以后的学习和工作打下良好基础。

反模式是什么

反模式经常被用来防御破坏性的、无效的或无益的情况。起初,这似乎是个好主意,但从长远来看,它可能会带来意想不到的后果或问题。反模式的出现可能是因为编写者缺乏经验或懒惰的结果。

为什么要避免反模式

反模式会降低代码的可读性、可维护性,甚至会影响到性能、安全性和兼容性。它们还可能增加难以发现的故障、错误或漏洞。通过避免反模式,您可以开发出符合 Python 习惯和最佳实践的整洁代码。阅读、编辑、测试和重用整洁的代码会更简单。

有哪些常见的 Python 反模式

Python 反模式有很多,但一定要避免以下四种。

一、不使用 with 打开文件

Python 中最常见的反模式之一就是不使用 with 语句打开文件。例如:


# Badf = open(“file.txt”, “r”)
data = f.read()
f.close()

这段代码很糟糕,因为它不能保证在出现异常或提前返回时正确关闭文件。如果文件没有关闭,可能会导致资源泄漏、文件损坏或权限错误。在 Python 中打开文件的正确方法是使用 with 语句,它会创建一个上下文管理器,在代码块结束时自动关闭文件。例如:

# Goodwith open(“file.txt”, “r”) as f:data = f.read()

这段代码就很棒,因为它可以确保无论块内发生了什么,文件都会被关闭。它还使代码更简洁,更易于阅读。

二、不需要使用 list/dict/set 解析

Python 中另一个常见的反模式是,当有更简单或更有效的方法来实现相同结果时,却使用 list/dict/set 解析。例如:

# Badnumbers = [1, 2, 3, 4]
squares = [n ** 2 for n in numbers]

这段代码很糟糕,因为它会创建一个新的列表对象,消耗内存和时间。创建不可变列表的更好方法是使用生成器表达式,它可以根据需要对每个元素进行评估。例如:


# Goodnumbers = [1, 2, 3, 4]
squares = (n ** 2 for n in numbers)

这段代码比上一段效果好一点。因为它不创建新的列表对象,而是返回一个生成器对象,可以循环使用或传递给另一个函数。它还可以节省内存和时间。

同样,如果有内置函数可以更高效地完成同样的事情,那么就应该避免使用 dict/set 解析。例如:

# Badwords = [“apple”, “banana”, “cherry”]
lengths = {w: len(w) for w in words}

这段代码会创建一个新的 dict 对象,消耗内存和时间。创建字长 dict 的更好方法是使用 dict 函数,并将生成器表达式作为参数。例如:

# Goodwords = [“apple”, “banana”, “cherry”]
lengths = dict((w, len(w)) for w in words)

这段代码没有创建一个新的 dict 对象,而是调用了一个以生成器对象为参数的 dict 函数。它还能节省内存和时间。

三、非必要不使用生成器

虽然生成器在创建懒惰迭代时非常有用,但并非在任何情况下都是最佳选择。有时,如果使用生成器会降低代码的可读性或性能,那么使用生成器就是一种反模式。例如:

# Baddef get_even_numbers(numbers):for n in numbers:if n % 2 == 0:yield nnumbers = [1, 2, 3, 4]
even_numbers = get_even_numbers(numbers)
print(list(even_numbers))

这段代码之所以糟糕,是因为它使用了一个生成器函数来过滤列表中的偶数。虽然这看起来是个好主意,但实际上却使代码变得更加冗长,效率也更低。从列表中过滤出偶数的更好方法是使用 filter 函数,它返回的生成器对象可以转化为列表。例如:

# Gooddef is_even(n):return n % 2 == 0numbers = [1, 2, 3, 4]
even_numbers = filter(is_even, numbers)
print(list(even_numbers))

这段代码使用过滤器函数创建了一个生成器对象,可以将其转化为一个列表。它还使代码更简洁,更易于阅读。

四、 在函数调用中返回不止一种类型的对象

Python 中另一个常见的反模式是在函数调用中返回不止一种对象类型。

# Baddef get_user(id):user = db.get_user(id)if user:return userelse:return None, “User not found”

这段代码并不 Pythonic,因为它会根据数据库查询结果返回缺少的 User 或 tuple 对象以及错误信息。这会使代码变得混乱和容易出错,因为调用者必须在使用返回值之前检查其类型。在函数调用中处理错误的更好方法是引发异常,调用者可以捕获并处理该异常。例如:

# Gooddef get_user(id):user = db.get_user(id)if user:return userelse:raise ValueError(“User not found”)try:user = get_user(id)
except ValueError as e:print(e)

这段代码如果找不到 user,它就会引发异常,调用者可以捕获并处理这个异常。它还能使代码更加一致和清晰。

通过本文我们了解了 Python 中一些常见的反模式以及如何避免它们。通过遵循 Python 习惯和最佳实践,您可以编写出易于阅读、维护和调试的简洁代码。

原创 简讯Alfred 爱生活爱扣钉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/864555.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

制造业知识中台:推动智能制造转型升级的智慧大脑

在当今全球制造业的激烈竞争中,智能制造已成为推动产业升级、提升竞争力的关键路径。制造业知识中台,作为连接数据、知识与业务的智慧中枢,正逐步展现出其在推动智能制造转型升级中的巨大潜力。它不仅能够帮助企业实现知识的有效整合与高效利用,还能通过智能化分析与应用,…

电子配件行业的未来之路:产品说明书数字化转型的力量

在科技飞速发展的今天,电子配件行业作为科技创新的前沿阵地,正经历着前所未有的变革。从智能手机、平板电脑到智能穿戴设备,各种新型电子配件层出不穷,极大地丰富了人们的生活。然而,随着产品种类的增多和功能的复杂化,如何确保消费者能够快速、准确地理解和使用这些产品…

基于四象限比例积分控制器的直流电机控制系统simulink建模与仿真

1.课题概述 基于四象限比例积分控制器的直流电机控制系统simulink建模与仿真。2.系统仿真结果 3.核心程序与模型 版本:MATLAB2022a4.系统原理简介直流电机由于其较好的调速性能和较高的控制精度,被广泛应用于各种工业控制场合。为了实现对直流电机转速和位置的精确控制,控制…

人工智能驱动的内部知识库:智能搜索、推荐与知识发现

随着人工智能技术的飞速发展,企业内部知识库的管理与应用方式正经历着前所未有的变革。智能搜索、个性化推荐与深度知识发现,这些曾经只存在于科幻小说中的场景,如今已借助AI技术,在企业的日常运营中成为现实。在这一变革浪潮中,HelpLook作为一款集成了先进AI算法的工具,…

视野修炼-技术周刊第116期 | NB Ping

① NB Ping - 多地址并发 Ping 工具 ② 动画图标 ③ RSS.Beauty - RSS 订阅源美化展示 ④ Console.trace:JavaScript调试的利器 ⑤ 关于跨端的前世今生 ⑥ LogoShip - 图标生成器欢迎来到第 116 期的【视野修炼 - 技术周刊】,下面是本期的精选内容简介 🔧开源工具&技术…

深度学习CUDA环境安装教程---动手学深度学习

首先说明我安装的是《动手学深度学习》中的环境 本人是小白,一次安装,可能有不对的地方,望包含。安装CUDA 因为我们是深度学习,很多时候要用到gpu进行训练,所以我们需要一种方式加快训练速度。 通俗地说,CUDA是一种协助“CPU任务分发+GPU并行处理”的编程模型/平台,用于…

基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真

1.程序功能描述 基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真.于过热气温控制系统过于复杂,涉及多个过热器及减温过程,在本次设计中将模型简化成喷水减温器和末级过热器的组合,对喷水减温器部分和蒸汽受热管部分进行数学建模,在建模过程中按均匀传热考虑,…

2024-2025-1 20241408陈烨南《计算机基础与程序设计》第十四周学习总结

这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标 无作业正文 本博客链接教材学习内容总结 无 教材学习中的问题和解决过程 Q:如何倒序输出字符串? A: 基于AI的学习代码调试中…

【Azure Event Hub】Kafka消息发送失败(Timeout Exception)

Azure closes inbound Transmission Control Protocol (TCP) idle > 240,000 ms, which can result in sending on dead connections (shown as expired batches because of send timeout).问题描述 使用Azure Event Hub,客户端通过kafka发送消息到Event Hub中,规律性的遇…

基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真

1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)figure plot(Error2,linewidth,2); grid on xlabel(迭代次数); ylabel(遗传算法优化过程); legend(Average fitness);[V,I] = min(J…

vscode ssh连接远程服务器时显示time out

现象:mobaxterm通过ssh能正常连接服务器,而在vscode里ssh连接服务器时则提示连接超时。 解决方法:ssh扩展的settings.json中的"remote.SSH.useLocalServer",改为false!!! 因为自己搜到的答案是改为“true”,我的本来就是显示的“true”,没有去管。 但是兜兜…

Training Deep Neural Networks with 8-bit Floating Point Numbers

目录概主要内容Wang N., Choi J., Brand D., Chen C. and Gopalakrishnan K. Training deep neural networks with 8-bit floating point numbers. NeurIPS, 2018.概 本文提出了一种 8-bit 的训练方式. 主要内容本文想要实现 8-bit 的训练, 作者认为主要挑战是两个向量的点击 (…