如何避免Python中的反模式编程使用实战讲解

 更新时间:2024年01月18日 08:53:30   作者:简讯Alfred  
这篇文章主要为大家介绍了如何Python中的反模式编程使用实战讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

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

反模式是什么

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

为什么要避免反模式

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

有哪些常见的 Python 反模式

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

不使用 with 打开文件

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

非必要不使用生成器

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

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

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

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

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

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

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

# Bad
def get_user(id):
    user = db.get_user(id)
        if user:
            return user
        else:
            return None, “User not found”

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

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

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

通过本文我们了解了 Python 中一些常见的反模式以及如何避免它们。通过遵循 Python 习惯和最佳实践,您可以编写出易于阅读、维护和调试的简洁代码,更多关于Python反模式编程的资料请关注脚本之家其它相关文章!

相关文章

  • Pandas实现数据类型转换的一些小技巧汇总

    Pandas实现数据类型转换的一些小技巧汇总

    这篇文章主要给大家汇总介绍了关于Pandas实现数据类型转换的一些小技巧,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • Python中常见的导入方式总结

    Python中常见的导入方式总结

    这篇文章主要介绍了Python中常见的导入方式总结,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • python中os和sys模块的区别与常用方法总结

    python中os和sys模块的区别与常用方法总结

    这篇文章主要给大家介绍了关于python中os和sys模块的区别与常用方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。
    2017-11-11
  • tensorflow模型保存、加载之变量重命名实例

    tensorflow模型保存、加载之变量重命名实例

    今天小编就为大家分享一篇tensorflow模型保存、加载之变量重命名实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 详解Python中的 type()函数

    详解Python中的 type()函数

    type()是一个内置函数,可以很方便地查询对象数据类型;主要有两种用法:一个参数和三个参数,这篇文章主要介绍了Python中的 type()函数,需要的朋友可以参考下
    2022-08-08
  • 学习python需要有编程基础吗

    学习python需要有编程基础吗

    在本篇文章里小编给大家分享的是一篇关于学习python有哪些必要条件,需要的朋友们可以学习下。
    2020-06-06
  • Python(Tornado)模拟登录小米抢手机

    Python(Tornado)模拟登录小米抢手机

    用Python(Tornado)模拟登录小米帐号,抢小米手机
    2013-11-11
  • 如何在Python中创建二叉树

    如何在Python中创建二叉树

    这篇文章主要介绍了如何在Python中创建二叉树,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-03-03
  • 在python tkinter界面中添加按钮的实例

    在python tkinter界面中添加按钮的实例

    今天小编就为大家分享一篇在python tkinter界面中添加按钮的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • pandas快速处理Excel,替换Nan,转字典的操作

    pandas快速处理Excel,替换Nan,转字典的操作

    这篇文章主要介绍了pandas快速处理Excel,替换Nan,转字典的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03

最新评论