初学者最容易翻车的三大Python功能

初学者最容易翻车的三大Python功能

Python已成为许多编程初学者的必备语言。因为Python在机器学习、数据处理和其他领域的广泛能力,许多不同语言背景的人可能都会考虑改用Python。

Python的设计其实非常简单。但在某些情况下,可能会让初学者感到困惑。所以本文我想澄清一些令人困惑的Python特性。如果你想了解更多数据分析相关内容,可以阅读以下这些文章:
如何使用Python处理丢失的数据来进行机器学习
50⾏python爬⾍代码, 带你正确打开知乎新世界!
Python数据处理:关于Pandas你需要知道的都在这里
PolYamoR的简介:Python和R之间的双向翻译器

图片由Juan Pablo Donadías拍摄,摘自Unsplash.

1. 逻辑运算符:and, or

当我们构造if…else…语句时,通常需要给定一个求值的条件。当条件返回为True时,执行if函数。如果为False,则执行else函数。

如果某个条件是由多个部分组成的,就需要我们用逻辑运算符and和or进行连接。在这里,每个部分都同时为True的时候,and才能成立;但任一条件为True时,or就能成立。

有些人会把它们作为三元表达式使用,这种情况下,我们可以直接评判这些组合条件。具体参考以下示例:

以上这两个例子表明,这种方式会返回第一个非错误值(non-falsy object)。那么,下面这个代码又会返回什么结果呢?

如果运行这些代码,你会发现,what在这里返回的是空列表(empty list)。我们把这个结果的原因留到以后讨论。接下来,观察下面这个使用and逻辑运算符的示例:

仔细察看这些例子,看看你是否知道得出这些结果的原因。

在Python中,这些组合条件遵循的是短路原则(short circuit rule)意思是,在用and运算符时,系统会查找第一个错误值(falsy value)。如果找到,就会停止运算并返回falsy值,比如上面代码中的text1。如果找不到,就会返回最后一项,比如上面的number1和text2。    

or运算则会寻找第一个真值(truthy value)。如果找到就会停止运算,并返回真值(truth value),比如上面的number和text变量。但如果找不到任何内容,它会返回最后一项,如what变量所示。

2. 赋值表达式(Assignment Expression)

在Python和许多其他编程语言中,表达式(expressions)语句(statements)是两种截然不同的概念。通常,表达式代表的是一个Python对象的计算结果。我们可以在内置的eval方法中使用表达式,来生成求值。相反,语句执行的是一个动作,而不是计算,语句是不能用来求值的。

语句的其中一种特殊形式是赋值(assignment)具体来讲,就是当我们给一个变量赋值时,它就变成了一个赋值语句,这个过程是一个动作。我们在创建一个新变量,但不是进行求值。下图是一个例子:

无法评估语句

Python从版本3.8开始引入了新功能,它允许特定的赋值语句具有表达式的特征。也就是说,我们赋值给一个变量(assignment)的同时,也能得到一个值(expression)。该功能需要使用一个新操作符 “:=”,有些人把它称为海象(walrus)运算符。请看下面的示例:

请注意,这个例子是没有实际意义的,因为语法原因,我们在顶层使用赋值表达式时,必须用到括号。接下来,我们会再看一个不需要括号的更实际的例子。

假设我们有一个数字的列表,想要计算出它们的累计求和(cumulative sum)并保存到列表中。我们可以利用itertools模块中的accumulate函数运行,具体操作如下:

使用accumulate计算累计求和

当然,还有另一种利用赋值表达式的解决方案。具体如下:

在列表的推导式中,我们要把表达式放在for关键字之前。虽然赋值语句(Assignment)不能出现在那,但赋值表达式(assignment expression)是可以的。重要的是,这个表达式能够更新total这个变量,我们还可以用它来获取累计求和。

3. 上下文管理(Context Management):with

在研究别人的代码时,你可能会碰到这样的用法。就是用with语句打开文件,对文件本身执行必要的操作。

有可能你在其他文本相关的操作也会用到这个方法,但你有思考过为什么要这样操作吗?毕竟,它会产生额外的缩进,多少会分散注意力。

这一功能背后的主要概念被称为上下文管理(Context Management)意思是,这个语句会创建一个上下文,你可以在其中访问管理资源。在这个例子里,我们指的就是文本。在没有上下文管理的情况下,我们应该对此文件执行以下操作:

文件操作

你可以看到,使用文件时,我们要打开和关闭它。关闭文件这个动作很关键,因为如果文件在其他地方使用,不关闭文件的话,更新的内容很可能就不会保存到文件中。

with语句的目的就是为我们处理这种情况的代码。具体来说,就是退出with语句后,文件会被自动关闭。如下所示:

自动关闭文件

在我们退出with语句后,之前打开的文件会自动关闭。方便多了,对吧?

总结

本文中,我们回顾了Python中让初学者困惑的三个特性,希望我解释清楚了。下面,让我们快速回顾一下:

  • 1、当我们使用组合条件时,Python会进行短路计算。使用and操作时,它将返回第一个虚值或最后一项。使用or操作时,它会返回第一个真值或最后一项。
  • 2、表达式(expressions)语句(statements)不同。赋值语句(assignment statement)不会产生任何值。但是,赋值表达式(嗄ssignment expression)在分配变量的同时还能求值。
  • 3、当需要管理特定上下文时,我们可以使用with语句。最常见的情况是对一个文件进行操作。退出上下文时,上下文管理器会自动为我们关闭文件。

感谢你的阅读!你还可以订阅我们的YouTube频道,观看大量数据科学相关公开课:https://www.youtube.com/channel/UCa8NLpvi70mHVsW4J_x9OeQ;在LinkedIn上关注我们,扩展你的人际网络!https://www.linkedin.com/company/dataapplab/

原文作者:Yong Cui
翻译作者:Lea
美工编辑:过儿
校对审稿:Jiawei Tong
原文链接:https://betterprogramming.pub/3-seemingly-simple-python-features-that-confuse-beginners-313575312dcf