Python入门05 — 运算符与表达式

2018-01-19 geekspeng 更多博文 » 博客 » GitHub »

Python

原文链接 http://geekspeng.cn/2018/01/19/Python%E5%85%A5%E9%97%A805-%E2%80%94-%E8%BF%90%E7%AE%97%E7%AC%A6%E4%B8%8E%E8%A1%A8%E8%BE%BE%E5%BC%8F.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


运算符是进行某些操作,并且可以用诸如 + 等符号或特殊关键词加以表达的功能。运算符需要一些数据来进行操作,这些数据就被称作操作数表达式可以拆分成运算符与操作数。一个表达式的简单例子便是 2+3,其中 23 被称为操作数,"+" 称为运算符。

<!-- more -->

算术运算符

  • +(加)
    • 两个对象相加。
    • 3+5 则输出 8'a' + 'b' 则输出 'ab'
  • -(减)
    • 从一个数中减去另一个数,如果第一个操作数不存在,则假定为零。
    • -5.2 将输出一个负数,50 - 24 输出 26
  • *(乘)
    • 给出两个数的乘积,或返回字符串重复指定次数后的结果。
    • 2 * 3 输出 6'la' * 3 输出 'lalala'
  • ** (乘方)
    • 返回 x 的 y 次方。
    • 3 ** 4 输出 81 (即 3 * 3 * 3 * 3)。
  • / (除)
    • x 除以 y
    • 13 / 3 输出 4.333333333333333
    • -13.5 / 3 输出 -4.5
  • // (整除)
    • x 除以 y 并对结果 向下取整 至最接近的整数。
    • 13 // 3 输出 4
    • -13 // 3 输出 -5
    • -13.5 / 3 输出 -5.0
  • % (取模)
    • 返回除法运算后的余数,被除数-(除数*整除的商)。
    • 13 % 3 输出 1-25.5 % 2.25 输出 1.5
    • -13.5 % 3 输出 1.51.5 = -13.5-(3*-5)

关系运算符

  • < (小于)
    • 返回 x 是否小于 y。
    • 5 < 3 输出 False3 < 6 输出 True
  • > (大于)
    • 返回 x 是否大于 y。
    • 5 > 3 返回 True
  • <= (小于等于)
    • 返回 x 是否小于或等于 y。
    • x = 3; y = 6; x<=y 返回 True
  • >= (大于等于)
    • 返回 x 是否大于或等于 y。
    • x = 4; y = 3; x>=3 返回 True
  • == (等于)
    • 比较两个对象是否相等。
    • x = 2; y = 2; x == y 返回 True
    • x = 'str'; y = 'stR'; x == y 返回 False
    • x = 'str'; y = 'str'; x == y 返回 True
  • != (不等于)
    • 比较两个对象是否不相等。
    • x = 2; y = 3; x != y 返回 True

提示 所有的比较运算符返回的结果均为 TrueFalse

提示 比较可以任意组成组成链接。

>> 3 < 5 < 7
True
>> 3 < 5 > 7
False
>> 3 < 5 > 4
True
>> 7 <= 6 >= 5
False
>> 7 >= 6 == 6
True
>> 7 >= 6 == 6 < 9 > 2
True

赋值运算符

  • = (赋值)
    • 简单的赋值运算符。
    • x = 2; y = 3;
  • += (加法赋值)
    • 加法赋值运算符。
    • x += 2; 等价于 x = x + 2
  • -= (减法赋值)
    • 减法赋值运算符。
    • x -= 2; 等价于 x = x - 2
  • *= (乘法赋值)
    • 乘法赋值运算符。
    • x *= 2; 等价于 x = x * 2
  • /= (除法赋值)
    • 除法赋值运算符。
    • x /= 2; 等价于 x = x / 2
  • //= (整除赋值)
    • 整除赋值运算符。
    • x //= 2; 等价于 x = x // 2
  • %= (取模赋值)
    • 取模赋值运算符。
    • x %= 2; 等价于 x = x % 2
  • **= (幂赋值)
    • 幂赋值运算符。
    • x **= 2; 等价于 x = x ** 2

提示 变量 = 变量 运算 表达式 等价于 变量 运算 = 表达式

逻辑运算符

  • not (逻辑“非”)
    • 如果 x 是 True,则返回 False。如果 x 是 False,则返回 True
    • x = True; not x 返回 False
  • and (逻辑“与”)
    • 如果 x 是 False,则 x and y 返回 False,否则返回 y 的计算值。
    • 当 x 是 False 时,x = False; y = True; x and y将返回 False
  • or(逻辑“或”)
    • 如果 x 是 True,则返回 True,否则它将返回 y 的计算值。
    • x = True; y = False; x or y 将返回 True

提示 逻辑运算 存在中“短路”现象:仅计算逻辑表达式中的一部分便能确定结果,而不对整个表达式进行计算的现象。逻辑与和逻辑或都存在短路现象,比如x = False; x and y将返回 False,而不会计算 y,因为它已经能确定整个表达式将是 False 而不会是别的值。同理x = True; x or y 将返回 Ture,而不会计算 y。

位运算符

  • & (按位与)
    • 对数字进行按位与操作。
    • 5 & 3 输出 15 用二进制数表示为 01013 用二进制数表示为 0011,按位与会得到 0001 ,表示成十进制为 1
  • | (按位或)
    • 对数字进行按位或操作。
    • 5 | 3 输出 75 用二进制数表示为 01013 用二进制数表示为 0011,按位与会得到 0111 ,表示成十进制为 7
  • ^(按位异或)
    • 对数字进行按位异或操作。
    • 5 ^ 3 输出 65 用二进制数表示为 01013 用二进制数表示为 0011,按位与会得到 0110 ,表示成十进制为 6
  • ~ (按位取反)
  • << (左移)
    • 将数字的位向左移动指定的位数。(每个数字在内存中以二进制数表示,即 0 和1)
    • 2 << 2 输出 82 用二进制数表示为 10,向左移 2 位会得到 1000 ,表示成十进制为 8
  • >> (右移)
    • 将数字的位向右移动指定的位数。
    • 11 >> 1 输出 511 在二进制中表示为 1011,右移一位后输出 0101 这一结果,表示成十进制为5

成员运算符

  • in (包含)
    • 如果在指定的序列中找到值返回 True,否则返回 False。
    • 'a' in 'abc' 输出为True,'d' in 'abc' 输出为False。
  • not in (不包含)
    • 如果在指定的序列中没有找到值返回 True,否则返回 False。
    • 'a' not in 'abc' 输出为False,'d' not in 'abc' 输出为True。

身份运算符

  • is
    • 判断两个标识符是不是引用自同一个对象。
    • a = 20; b = 20; a is b; 输出为 True,引用自同一个对象。
  • is not
    • 判断两个标识符是不是引用自不同对象。
    • a = [1, 2, 3]; b = a[:]; b is not a; , 输出为 True,不是引用自同一个对象。

提示 is 与 == 区别:is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。

>>> a = [1, 2, 3]
>>> b = a
>>> b is a
True
>>> b == a
True
>>> b = a[:]
>>> b is a
False
>>> b == a
True

运算符优先级

为了保持完整,下表是从 Python 参考手册 中引用而来。你最好使用圆括号操作符来对运算符与操作数进行分组,以更加明确地指定优先级。这也能使得程序更加可读。

  • lambda:Lambda 表达式
  • if - else :条件表达式
  • or:布尔“或”
  • and:布尔“与”
  • not x:布尔“非”
  • in, not in, is, is not, <, <=, >, >=, !=, ==:比较,包括成员资格测试(Membership Tests)和身份测试(Identity Tests)。
  • |:按位或
  • ^:按位异或
  • &:按位与
  • <<, >>:移动
  • +, -:加与减
  • *, /, //, %:乘、除、整除、取余
  • +x, -x, ~x:正、负、按位取反
  • **:求幂
  • x[index], x[index:index], x(arguments...), x.attribute:下标、切片、调用、属性引用
  • (expressions...), [expressions...], {key: value...}, {expressions...}:显示绑定或数组、显示列表、显示字典、显示设置

在上表中位列同一行的运算符具有相同优先级。例如 +-就具有相同的优先级。

改变运算顺序

为了使表达式更加易读,我们可以使用括号。举个例子,2 + (3 * 4) 自是要比 2 + 3 * 4 要更加容易理解,因为后者还要求你要了解运算符的优先级。和其它的一切一样,使用括号同样也要适度(而不要过度),同时亦应不要像 (2 + (3 * 4))这般冗余。

使用括号还有一个额外的优点——它能帮助我们改变运算的顺序。同样举个例子,如果你希望在表达式中计算乘法之前应先计算加法,那么你可以将表达式写作 (2 + 3) * 4