乐趣区

python基础教程运算对象运算符表达式和语句

编程的本质就是数据和运算,数据由基本数据类型、数据结构来表示,运算就是对这些数据的各种操作,基本的加减乘除、是非判断、流程控制等等。这些操作就是今天我们要讲的运算符、表达式和语句。

前面我们学习 Python 的基本语法时,讲到了 Python 程序的 的概念,这个行再细分就是运算符(Operators)、运算对象(Operands)、表达式(Express)、语句(Statements)。

提示:运算和操作这两个概念在编程中往往是一样的

比如下面这一行代码:

a = 5; b = a + 7; c = a if a > b else b

先来分解一下这一行:

  • 语句:由表达式组成。此例共三条语句,用分号 ; 分开,即一个物理行有三个逻辑行;
  • 表达式:由运算符和操作对象组成。此例中的表达式有 a + 7a > b 等;
  • 运算对象:即各种对象。此例中的 a, b, c, 5, 7 等。

用一行表示它们的关系就是:

运算对象 + 运算符 -> 表达式 -> 语句

运算对象和运算符构成表达式,表达式构成语句

![(http://upload-images.jianshu….

运算对象

运算对象就是由各种对象构成的集合,这些对象里面有些是 常量 ,有些是 变量

常量

Python 中的常量我们已经见过很多了,比如整数:9, 7, 8等等,浮点数:3.14,0.618等等,字符串:'猿人学 Python',这些常量我们看到它们时就知道它们的意思,这就是字面意义上的常量。

字面意义上的常量就是按照它们的 字面意义 使用它们的值。比如,数字 8 总是代表它自己,它是一个常量,不能改变它的值。

变量

常量代表具有特定意义的对象,但不足以满足编程的需要。编程经常需要一种既可以存储数据有可以对它进行运算(操作)的东东,这个东东就是 变量 。编程中要经常使用变量,就需要给变量起个名字:变量名。变量名的起名规则就是前面讲 Python 基本语法时提到的 标识符,忘了的小猿可以再去看看那一节。

最开始那一行 Python 代码中的 a, b, c 都是变量,而 5, 12, 5 就是它们各自存储的值。如果再来一句 a = a + 3a 的值就变成了 8,变量a 的值就变了。
变量的赋值就是给变量一个值,比如a = 3,就是给 a 变量以 3 的值。

a = 3  # 把 3 赋值给 a,此时 a 的值为 3
b = a  # 把 a 赋值给 b,此时 b 的值等于 a 的值,也是 3
c, d = a, b  # 这是多重赋值,相当于 c = a; d = b

运算符

运算符就是对运算对象进行的具体运算名称。不同的运算符代表不同的运算,比如加减乘除。
通过 Python shell 可以方便的体验运算符的使用:

In [115]: 2 + 5
Out[115]: 7

In [116]: 8 * 9
Out[116]: 72

下面我们用一个表格来清晰的列出各种运算符及其用法。

运算符 名称 含义 示例
+ 两个对象相加 2 + 5得 7;'猿人学' + 'Python'得到'猿人学 Python'
- 两数相减,或负数 10 - 5得到 5;-3.1表示负数。
* 两数相乘,或字符串重复多次 3 * 7得到 21;'py' * 2得到pypy
** 返回 x 的 y 次幂 2**8得 256;2.3**3得 12.167
/ 两数相除 10 / 2得到 5;10 / 3 得到 3.333333
// 向下取整除 两数相除,返回离商最近且小的整数。如果除数和被除数中有浮点数,返回的也是浮点数。 11 // 2得到 5;-11 // 2得到 -6;5 // 1.34得到 3.0.
% 模除 求余数 10 % 3得到 1;10 % 3.3得到 0.1;-10 % 3.3得到 3.2,因为 -10 // 3.3 得 -4,-10 - 3.3*-4得到 3.2.
<< 左移 二进制操作,把数字的每个比特位向左移动特定位数(数字在内存中以二进制 0,1 表示) 2 << 3得到 16,2的二进制是:00000010,左移 3 位变成:0b00010000即 16
>> 右移 把一个数的比特位向右移动特定位数 2 >> 1得到 1
& 位与 两数对应的比特位进行与操作 8 & 9得 8
` ` 位或 两数对应的比特位进行或操作 `8 9` 得 9
^ 位异或 两数对应的比特位进行异或操作 8^9得 1
位反 一个数 x 的比特位全部取反,值为 -(x+1) ~8的 -9
< 小于 返回 x 是否小于 y。所有比较运算符返回的不是 True 就是False 8 < 9得到True
> 大于 返回 x 是否大于 y 8 > 9得到False
<= 小于等于 返回 x 是否小于等于 y x = 2; y = 3; x <= y 返回True
>= 大于等于 返回 x 是否大于等于 y x = 6; y = 4; x >= y 返回True
== 等于 比较对象是否相等 2 == 2返回 True3 == 2 返回 False'str' == 'str' 返回True
!= 不等于比较对象是否不相等 1 != 3返回 True3 != 3 返回 False
not 布尔 如果 x 是 True 则返回 False;如果 x 是False 则返回True x = False; not x返回True
and 布尔 x and y 如果 x 是 False 则返回False,否则返回 y 的布尔值 x = False; y = True; x and y返回False,因为 x 是 False。这种情况下,Python 不再检验 y 的布尔值,因为 and 左边的 x 已经是 False 了,不管右边的 y 是真是假都不影响整个表达式的值,所以就不再去验证 y 是真是假。这叫做“短路求值”。
or 布尔 如果 x 是 True 则返回 True,否则返回 y 的布尔值 x = True; y = False; x or y返回 True。这里同样适用“短路求值”

运算符优先级(Operator precedence)

小时候学数学的时候,我们知道先乘除后加减,比如要算 2 + 5 * 6 的话,先算 5 * 6 得到 30,再算 2 + 30 得到 32. 也就是说,乘法运算符的优先级高于加法运算符。

下面的表格就是 Python 的运算符的优先级,从低到高排列,同一个单元格里面的运算符具有相同的优先级,这时候运算顺序从左到右。不过,还是建议大家通过使用圆括号来分组表达式(运算符和运算对象),这样可以清楚的指出运算的先后顺序,同时也让程序更加易读。

运算符 描述
lambda Lambda 函数表达式
if-else 条件表达式
or 布尔或
and 布尔与
not 布尔非
innot inisis not<<=>>=!=== 比较,包括成员测试和同一性测试
` ` 位或
^ 位异或
& 位与
<<>> 移位
+- 加、减
*@///% 乘,矩阵乘法,除,向下取整除,模除
+x-x~x 整数,负数,位非(位反)
** 幂运算符。它的绑定不如其右侧的算数或按位一元运算符紧密,所以,2**-1 的值是 0.5.
await await 表达式(asyncio 中使用)
x[index]x[index:index]x(arguments...)x.attribute 下标,切片,函数调用,属性引用
(expressions...)[expressions...]{key:value...}{expressions...} 绑定或元组显示,列表显示,字典显示,集合显示

上面表格中有我们还没有接触到的运算符,这将会在后面的章节中讲解。

程序根据上表的顺序来进行运算,但是我们也可以通过圆括号来改变它们的计算顺序,比如 (2 + 7) * 3 中,就先计算圆括号里面的加法,然后再进行乘法。这个原则跟小学时学到的算术是一样的。

表达式(Expression)

表达式是一段可以计算为某个值的语法片段。换句话说,就是表达元素的累积,比如文字,名称,属性访问,运算符或函数调用,它们都返回一个值。与许多其它语言相比,并非所有语言结构都是表达式。还有一些语句不能用作表达式,比如 while 赋值 也是语句,但不是表达式。

从上面对表达式的定义来看,a > 3是表达式,a = 3不是表达式,而是赋值语句。

语句(Statements)

语句是程序段(一个代码“块”)的组成单位。一条语句可以是一个表达式或某个带有关键字的结构,例如 ifwhilefor
语句的例子:

a = 5  # 赋值语句
if a > 3:  #条件语句,其中 a > 3 是表达式
    print('a > 3')  #输出语句

总结

程序由语句组成;语句或是由表达式构成,或是赋值,或是 ifwhile 等关键字的结构;表达式由运算符和运算对象(数字、字符串等常量,变量等)组成,是语句的构成元素。

退出移动版