Python 旋风之旅—Python 的基本语义:运算符

在上一节中,我们开始研究了 Python 变量和对象的语义。 在这里,我们将深入探讨该语言中包含的各种运算符的语义。 在本节的最后,您将拥有可以开始比较和处理 Python 中的数据的基本能力。

算术运算符

Python实现了七个基本的二元算术运算符,其中两个可以兼作一元运算符。 下表中汇总了它们:

可以用直观的方式使用和组合这些运算符,也可以使用标准括号将操作符组合在一起。 例如:

# addition, subtraction, multiplication
(4 + 8) * (6.5 - 3)
42.0

向下取整除法是舍去小数部分的除法:

# True division
print(11 / 2)
5.5
# Floor division
print(11 // 2)
5

向下取整除法运算符是在 Python 3 中添加的; 您需要知道,如果在 Python 2 中工作,则标准除法运算符(/)的作用类似于整数的向下取整除法和浮点数的真除法。

 

最后,我将提一下在 Python 3.5 中添加的第八个算术运算符:a @ b运算符,用于表示 a 和 b 的矩阵乘积,用于各种线性代数软件包。

按位运算符

除了标准的数值运算,Python 还包括对整数执行按位逻辑运算的运算符。 与标准算术运算相比,它们的使用率要低得多,但是知道它们的存在是很有用的。 下表总结了六个按位运算符:

这些按位运算符仅在数字的二进制表示形式上有意义,可以使用内置的 bin 函数将数字转换为二进制形式:

bin(10)
'0b1010'

结果以“ 0b”为前缀,表示二进制形式。 其余数字表示数字10 等于总和

 同样,我们可以这样写:

bin(4)
'0b100'

现在,使用按位或,可以找到将4和10的位组合在一起的数字:

4 | 10
14
bin(4 | 10)
'0b1110'

这些按位运算符并不像标准算术运算符那样常用,但是至少浏览一下以了解它们执行什么类型的操作是有帮助的。 尤其是,来自其他语言的用户有时会在真正表示幂运算(即a ** b)时却是使用XOR(即a ^ b)。

赋值运算符

我们已经看到可以使用“ =”运算符来给变量赋值,并且存储这些值以供以后使用。 例如:

a = 24
print(a)
24

我们可以在表达式中使用前面提到的任何运算符使用这些变量。 例如,将2加到 a 我们这样写:

a + 2
26

我们可能想用新值更新这个变量 a。 在这种情况下,我们可以将加法和赋值结合起来并编写为 a = a +2。由于这种将运算和赋值结合在一起的操作非常普遍,所以 Python 内置了包括用于所有算术运算的更新运算符:

a += 2  # equivalent to a = a + 2
print(a)
26

下表是对应于前面列出的每个二元运算符的扩展赋值运算符; 简而言之,它们是:

每个等价于先对操作符左边的变量进行对应的操作,然后进行赋值:也就是说,对于任何运算符“■”,表达式a■= b等效于a = a■b,对于诸如列表,数组或 DataFrame 之类的可改变对象,这些扩展赋值操作(a■= b)实际上与它们更为冗长操作写法(a = a■b)略有不同:它们修改了原始对象的内容,而不是创建一个新的对象来存储结果。

比较运算符

另一种非常有用的操作是比较不同的值。 为此,Python 实现了标准比较运算符,该运算符返回布尔值 True 和 False。 下表列出了比较运算符:

这些比较运算符可以与算术运算符和按位运算符结合使用,以表示数字的几乎无限范围的测试。 例如,我们可以通过检查 2 的模数是否返回1来判断数字是否为奇数:

# 25 is odd
25 % 2 == 1
True
# 66 is odd
66 % 2 == 1
False

我们可以将多个比较串联在一起,以检查更复杂的关系:

# check if a is between 15 and 30
a = 25
15 < a < 30
True

然而,只是为了让您产生一点点头疼的感觉,请看一下此比较:

-1 == ~0
True

回想一下〜是位翻转运算符,显然,当您翻转所有零位时,最终得到-1。 如果您对为什么是这样感到好奇,请查找二进制整数的补码编码方案(这里涉及到了计算机的基础知识,为什么计算机采用二进制补码表示整数?),这是 Python 用来编码带符号整数的方法,并考虑一下当您开始翻转以这种方式编码的所有整数位时会发生什么。

布尔运算符

Python提供了布尔运算符,使用标准概念“and”,“or” 和 “not”的来组合值。 可以预想到的是,这些运算符就是使用单词 and , or和 not 表示:

x = 4
(x < 6) and (x > 2)
True
(x > 10) or (x % 2 == 0)
True
not (x < 6)
False

布尔代数爱好者可能会注意到不包括 XOR 运算符。 当然,可以使用其他运算符的复合语句,用不同的方式构造它。 然而,您可以使用以下巧妙技巧对布尔值进行XOR:

# (x > 1) xor (x < 10)
(x > 1) != (x < 10)
False

当我们开始讨论诸如条件和循环之类的控制语句时,这类布尔运算将变得非常有用。

关于该语言的一个有时令人困惑的事情是何时使用布尔运算符(and,or,not),何时使用按位运算符(&,|,〜)。 答案在于它们的名称:当您要计算整个语句的布尔值(即真或假)时,应使用布尔运算符。 当您要对有关对象的单个位或组件进行操作时,应使用按位操作。

相同和成员关系运算符

与 and, or 和 not 一样,Python 还包含类似散文的运算符,以检查相同(一致性)和成员关系。 它们是:

相同运算符:“is”和“is not”

相同运算符“is”和“is not”检查对象是否是同一个。 对象相同不同于相等,正如我们在这里看到的:

a = [1, 2, 3]
b = [1, 2, 3]
a == b     #a 与 b 的值(内容)相等
True
a is b    #a 与 b 不是同一个对象
False
a is not b
True

相同的对象是什么样的? 这是一个例子:

a = [1, 2, 3]
b = a            #b 和 a 现在指向相同的列表对象[1, 2, 3]
a is b
True

上面两种情况之间的区别在于,在第一种情况下,a 和 b 指向不同的对象,而在第二种情况下,它们指向同一个对象。 如上一节所述,Python变量是指针。 “ is”运算符检查两个变量是否指向同一容器(对象),而不是指向该容器包含的内容。 考虑到这一点,在大多数情况下,初学者常常使用 “is”,但是他们真正想要的是 ==.

Python tutor 能够直观显示object 引用关系:

http://www.pythontutor.com/visualize.html

成员关系运算符

成员关系运算符检查复合对象内的成员关系。 因此,例如,我们可以编写:

1 in [1, 2, 3]
True
2 not in [1, 2, 3]
False

这些成员关系运算是与低级别语言(例如 C 语言)相比使 Python 如此容易使用的一个示例。在 C 语言中,成员关系通常是通过手动在列表上构造一个循环并检查每个值的相等性来确定的。 在 Python 中,您只需键入想知道的内容,就像日常英语使用的表达一样。

 

本文来自翻译如下文章,仅用于学习

原文:https://jakevdp.github.io/WhirlwindTourOfPython/04-semantics-operators.html

更多教程请关注“数据分析处理”

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章