引言
Python/ target=_blank class=infotextkey>Python已成为许多编程初学者的必备语言。
因为Python在机器学习、数据处理和其他领域的广泛能力,
许多不同语言背景的人可能都会考虑改用Python。
Python的设计其实非常简单。
但在某些情况下,可能会让初学者感到困惑。
所以本文我想澄清一些令人困惑的Python特性。
图源:Juan Pablo Donadías
逻辑运算符: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变量所示
赋值表达式
在Python和许多其他编程语言中,表达式(expressions)和语句(statements)是两种截然不同的概念。
通常,表达式代表的是一个Python对象的计算结果。
我们可以在内置的eval方法中使用表达式,来生成求值。
相反,语句执行的是一个动作,而不是计算,语句是不能用来求值的。
语句的其中一种特殊形式是赋值(assignment)。
具体来讲,就是当我们给一个变量赋值时,它就变成了一个赋值语句,这个过程是一个动作。
我们在创建一个新变量,但不是进行求值。
下图是一个例子:
无法评估语句
Python从版本3.8开始引入了新功能,它允许特定的赋值语句具有表达式的特征。
也就是说,我们赋值给一个变量(assignment)的同时,也能得到一个值(expression)。
该功能需要使用一个新操作符 “:=”,有些人把它称为海象(walrus)运算符。
请看下面的示例:
请注意,这个例子是没有实际意义的,因为语法原因,我们在顶层使用赋值表达式时,必须用到括号。
接下来,我们会再看一个不需要括号的更实际的例子。
假设我们有一个数字的列表,想要计算出它们的累计求和(cumulative sum)并保存到列表中。
我们可以利用itertools模块中的accumulate函数运行,具体操作如下:
使用accumulate计算累计求和
当然,还有另一种利用赋值表达式的解决方案。
具体如下:
在列表的推导式中,我们要把表达式放在for关键字之前。
虽然赋值语句(Assignment)不能出现在那,但赋值表达式(assignment expression)是可以的。
重要的是,这个表达式能够更新total这个变量,我们还可以用它来获取累计求和。
上下文管理:with
在研究别人的代码时,你可能会碰到这样的用法。
就是用with语句打开文件,对文件本身执行必要的操作。
有可能你在其他文本相关的操作也会用到这个方法,但你有思考过为什么要这样操作吗?
毕竟,它会产生额外的缩进,多少会分散注意力。
这一功能背后的主要概念被称为上下文管理(Context Management)。
意思是,这个语句会创建一个上下文,你可以在其中访问管理资源。
在这个例子里,我们指的就是文本。
在没有上下文管理的情况下,我们应该对此文件执行以下操作:
文件操作
你可以看到,使用文件时,我们要打开和关闭它。
关闭文件这个动作很关键,因为如果文件在其他地方使用,
不关闭文件的话,更新的内容很可能就不会保存到文件中。
with语句的目的就是为我们处理这种情况的代码。
具体来说,就是退出with语句后,文件会被自动关闭。
如下所示:
总结
本文中,我们回顾了Python中让初学者困惑的三个特性,希望我解释清楚了。
下面,让我们快速回顾一下:
- 1、当我们使用组合条件时,Python会进行短路计算。使用and操作时,它将返回第一个虚值或最后一项。使用or操作时,它会返回第一个真值或最后一项。
- 2、表达式(expressions)和语句(statements)不同。赋值语句(assignment statement)不会产生任何值。但是,赋值表达式(嗄ssignment expression)在分配变量的同时还能求值。
- 3、当需要管理特定上下文时,我们可以使用with语句。最常见的情况是对一个文件进行操作。退出上下文时,上下文管理器会自动为我们关闭文件。