当前位置: 首页 > 科技 > 人工智能 > 如何编写出色的Python代码,并且避免其他错误的信息产生_

如何编写出色的Python代码,并且避免其他错误的信息产生_

天乐
2020-06-22 21:49:44 第一视角

Python是一种很棒的编程语言,它为我们提供了惊人的工具,让我们的代码更具可读性,简洁性和酷劲。今天,我想谈谈编写更多Pythonic代码的方法,我将介绍一些可提高代码质量的绝妙技巧,让我们开始吧…

使用 Unpacking

Python允许变量的元组(或列表)出现在操作的赋值侧。这让我们可以简化代码,使其更具可读性。让我们从拆开元组的示例开始:

很简单,在我们的赋值操作的左侧可以有多个变量,而在右侧的值将被逐一分配给每个变量。请注意,左侧的项目数应等于右侧的项目数,否则可能会受到ValueError如下所示:

但是,由于Python很棒,因此有多种方法可以防止这种情况的发生,你可以执行以下操作:

在这种情况下使用*运算符时,它将扩展进行拆包功能,让我们可以在单个变量中收集或打包多个值。只要记住在分配中只能有一个*运算符来避免SyntaxError。

但也可以解压缩列表:

或字符串...

实际上,你可以通过这种方式使用任何迭代。现在,让我向你展示一件更酷的事情,然后再跳到下一个主题:

这不是有史以来最漂亮的变量交换吗!

不检查

Python中的None关键字用于定义一个空值,或根本不定义任何值。与其他语言不同,Python中的None是其自己的数据类型(NoneType),只有None可以是None。让我们在示例中查看它如何工作:

如果要检查变量实际上是否为None,可以执行以下操作:

这是有效的,但是还有一种更Python化的方式可以做到这一点:

它执行相同的工作,但是看起来更人性化。

反复进行

Python中的迭代可以非常优雅,甚至可以说是非常Unpythonic(如果该单词存在的话)。如果你来自JS或C#,你会如何尝试在Python中循环?

然后我学会了其他一些选择:

但是也许你想要以相反的顺序进行迭代,那么,你可以执行以下操作:

很好,但是看起来还是很奇怪,也许还有另一种方式:

现在看起来很漂亮!但是如果我们需要索引和项目值怎么办?我们在第一次尝试中就拥有了所有这些,现在似乎已经失去了它。不用担心,还有另一种方式可以做到这一点:

但是有时我们要遍历1个以上的数组,我们该怎么做?我们可以使用打包/拆箱:

如果我们要单独访问每个值:

甚至更好:

有时我们需要遍历对象,Python让我们可以轻松地做到这一点:

但是我们也可以使用.items()对象的方法获取键和值:

对象还提供类似.keys()和方法.values(),具体取决于你的用例,它们会非常有帮助的。请注意,Python为我们提供了许多遍历事物的方法,有时候range()需要一个遍历a的循环,这是完全可以的,但是对于开发人员来说,其他一些更清晰的替代方案可能更清晰易读,因此我们应该尽可能地使用它们。

避免可变的可选参数

与其他许多语言一样,Python为我们提供了具有可选参数的可能性,并且由于它们非常方便,还可能带来一些意外的行为。让我们看下面的例子:

到目前为止,我们有一个名为add_value的函数,它在每次调用该函数时在列表中添加一个值,并在最后返回列表。该列表是一个可选参数。现在让我们调用函数并查看其行为:

完美,我们的可选参数正在运行,因此,我们获得了具有单个值的列表。让我们尝试添加更多:

等等...这是什么?这看起来并不正确,但是实际结果是正确的,一旦我们对其进行了解释,这会是有意义的……。也许没有……让我们看看。当我们定义函数时,Python会生成一个默认值的实例,然后在每次不提供可选值时都使用该实例。对于我们的用例来说,这是一个大问题,因为即使这不是我们在特定情况下所需要的,列表也会不断增长。那么我们如何解决它?我们可以做以下事情:

这是在Python中看起来很奇怪的东西,我不太喜欢它,尽管我们现在检测到的这个功能在很多情况下是非常有用的,我们只需要意识到这一点并明智地使用它即可。

属性与Getter和Setters

警告:本主题可能会引起Java开发人员的争议。如果你是Java开发人员或来自C ++尝试执行以下操作,这将非常诱人:

现在,这没什么问题,也不是Python的方式。在向你介绍Python方式之前,请让我拿起墨镜。

我现在准备战斗了。。

受保护和私有属性,但不是真正的……

在Python中不存在只能从对象内部访问的“受保护”或“私有”实例变量,但是所有Python开发人员都使用一些约定来指定这些属性。

如果现在尝试从类块外部访问x属性,则将获得x的实际值。这是正确的做法:

我们可以尝试使用_y:

并且我们得到了结果,但是这是不正确的做法,因为该属性以_开头,并且该类的开发人员希望该属性不能从外部访问。但是现在发生了什么__z:

在这种情况下,我们会得到一个错误,很好,但是仍然可以访问该属性,我们只需要在代码中添加一些“魔术”即可:

如果我们在属性名称前加上_classname,我们仍然可以访问该值,但是这样做是非常错误的。

根据Python文档:带有下划线的名称(例如_spam)应被视为API的非公开部分(无论是函数,方法还是数据成员)。它应被视为实现细节,如有更改,恕不另行通知。形式为__spam的任何标识符(至少两个前导下划线,至多一个下划线)在文本上被_classname__spam替换,其中classname是当前类名,前导下划线被去除。

使用上下文管理器处理资源

在处理资源(例如文件,数据库连接等)时,我们需要处理代码以成功关闭或释放资源,并且看到类似以下很常见的内容:

这段代码是正确的,除非在两者之间发生任何事情,如果发生错误怎么办,我们如何确保文件始终关闭?这是上下文管理器起作用的地方:

这是一种更安全的方法!

最后

Python是一种非常简单而优雅的语言。它的简单性使其在学习代码的学生或人们中非常受欢迎,但是,编写正确的Python代码非常重要。我希望阅读完本文后,你对使用Python编写代码的方式有一些想法,并可以进行更多研究。我希望你喜欢它!

提示:支持键盘“← →”键翻页
为你推荐
加载更多
意见反馈
返回顶部