运算符+,-,*,/和**分别表示加法,减法,乘法,除法和幂,用法示例如下:
20+32 hour-1 hour*60+minute minute/60 5**2 (5+9)*(15-7)
在其它一些编程语言中,^表示异或运算,但是在Python中用XOR来表示异或位运算。本书不会讨论位运算,如果你对此感兴趣,请参考与位运算相关的链接:
在Python2版本中,除法运算可能不像你想象的那样:
>>> minute = 59
>>> minute/60
0
例子中minute的值为59,在传统算术中59除以60的结果是0.98333,而并不是0.而造成这种差异的原因是Python在执行的时候是向下取整数的,当两个数都是整数的时候,结果也是整数。因此向下取整数就会把小数部分去掉了,因此本例计算结果就是0了。
在Python3版本中,这个除法运算的结果就是一个浮点数。而新的运算符 // 则表示向下取整数。
>>> minute/60.0
0.98333333333333328
2.5 表达式和语句
一个表达式是值、变量和运算符的组合,值和变量本身都被认为是表达式,因此下面这些表达式都是合法的(假设变量x已经被赋值):
17
x
x + 17
语句是指Python解释器可以执行的代码单元,我们可以看到两种语句:打印和赋值。从技术上讲表达式也是语句,只是把它们区分开来理解起来可能会显得简单一些,它们之间最大的差别在于:表达式有值,而语句则没有。
2.6 交互模式和脚本模式
使用解释型语言有一个好处,就是把代码保存为脚本之前,你可以通过交互式的方式测试代码,但是交互模式和脚本模式之间的差异依然容易被混淆。
例如,你当你把Python当成一个计算器使用,你可能输入:
>>> miles = 26.2
>>> miles * 1.61
42.182
第一行赋值给变量miles,但是却看不到效果,第二行是一个表达式,所以解释器计算并显示了结果。由此我们得到了马拉松全程长度为大约42公里。
但是你要是把代码写在脚本里并且运行脚本,你根本看不到输出结果。在脚本模式中,表达式本身并不可见,而Python实际上已经对表达式进行了计算,你只有这样输入才会看到输出结果:
miles = 26.2
print miles * 1.61
最初你可能对解释器的这种行为感到疑惑。
通常情况下,脚本包含一系列的语句,如果输出代码超过一行以上,那么运行脚本的结果将会一次性的显示出来。
例如,脚本如下:
print 1
x = 2
print x
输出结果如下:
1
2
赋值语句不会有输出结果。
练习 1
输入以下语句,观察Python解释器的行为。
5
x = 5
x + 1
然后再把代码放在脚本里并执行该脚本,看看会输出了什么结果。之后把每个表达式改成print语句再运行查看结果。
2.7 运算顺序
当表达始终出现多个运算符的时候,计算顺序取决于优先等级。在算术运算中Python是遵循数学惯例的。英文缩写PEMDAS可一帮助你记住预算规则:
P - 括号具有最高优先级,可以强制解释器按所需顺序计算,由于括号内的表达式优先计算,因此 2*(3-1) 等于4,(1+1)**(5-2)等于8(**表示幂运算)。你也可以运用括号让表达式更容易阅读,例如 (minute*100)/60 和 minute*100/60 运算结果是一样的。
E - 幂运算的优先等级次之,所以2**1+1的结果是3,而不是4;3*1**3的结果是3,而不是27.
MDAS - 乘法和除法具有相同的优先等级,其优先级高于加法和减法,加法和减法则具有相同的优先级。2*3-1等于5,而不是4;6+4/2等于8,而不是5。
优先级相同的运算符按从左到右的顺序计算(指数运算除外),在表达式 degrees / 2 * pi 中,先算除法然后结果再乘以pi。如果改成除以2 π,你可以用括号这样写 degrees/(2*pi)或者写成degrees/2/pi。
我其实也不愿意花太多时间去记运算符的优先级的,如果我无法解释表达式优先级,我会使用括号让表达式看起来简单一些。
2.8 字符串操作
通常,你不能对字符串进行数学运算,即使字符串看起来像数字,如下所示代码是非法的:
'2'-'1' 'eggs'http://www.likecs.com/'easy' 'third'*'a charm'
“+” 运算符在字符串操作中是可行的,但是可能不是你所期望的那样:它执行连接操作,也就是把两个字符串首尾相连。
例如:
first = 'throat'
second = 'warbler'
print first + second
输出结果就是 throatwarbler
“*” 运算符在字符串操作中也是可行的,它执行重复操作,例如:
'Spam'*3 运算结果是 'SpamSpamSpam',也就是其中一个操作数是字符串,而另外一个必须是一个整数。
对字符串进行 + 和 * 操作的用法对比是有意义的,就像4*3等同于4+4+4,而'Spam'*3等同于'Spam'+'Spam'+'Spam'一样。另一方面,字符串串联和重复操作跟整数的相加和相乘还是有显著区别的,你能区分这里面的不同属性吗?
2.9 注释