操作符与表达式
4
我们知道程序其实是代码段的组合,就像我们写的作文是一个个的段落堆积起来的,每一个段落又由句子组成,句子又包含“主谓宾定状补”。本章我们就来讲讲程序里的“句子”。
4.1 操作符
操作符是用于告诉解释器执行特定的数学或逻辑运算的符号表。这里最最容易理解的就数字运算符比如:+、-、*、/。Python支持的操作符有以下类型:
Ø 算术运算符
Ø 比较(关系)运算符
Ø 赋值运算符
Ø 逻辑运算符
Ø 位运算符
Ø 会员操作符
Ø 标识操作符
以下我们通过表格形式演示这些操作符的使用:
4.1.1 算术运算符
操作符 | 描述 | 例子 | 代码示例 |
+ | 加法:左侧操作数加右侧操作数 | a + b | 4+6 |
- | 减法:左侧操作数右侧操作数 | a - b | 10-20 -10 |
* | 乘法:左侧操作数乘右侧操作数 | a * b | 10*2 20 |
/ | 除以:左侧操作数除以右侧操作数 | b / a | 6/2 3 |
% | 取模:左侧操作数除右侧操作数的余值 | b % a | 5%2 1 |
** | 幂运算- 执行对操作指数(幂)的计算,操作符前是底数,后是指数 | a**b | 2**3 8 |
// | 地板除:左侧操作数除右侧操作数得到的 一个整数或则尾数带0的浮点数(这个数字乘以右操作数最接近左侧操作符) | a//b | 9.9//2.0 4.0 9.1//2.3 3.0 9.2//2.3 4.0 9//2 4 |
- | 负数:是一个数的负数 | -a | -1 1 --1 1 |
4.1.2 比较运算符
运算符 | 描述 | 示例 | 代码示例 |
== | 等于:判断两个操作数的值是否相等,相等则返回True(真)反则则反。 | a==b | 2==2 True |
!= | 不等于:判断两个操作数的值是否不等,不等则返回True(真)反则则反。 | a!=b | 2!=3 True |
> | 不于:判断左侧操作数是否相等大于右侧操作数,大于则返回True(真)反则则反。 | a>b | 2>3 False |
< | 小于:判断左侧操作数是否相等小于右侧操作数,小于则返回True(真)反则则反。 | a<b | 2<3 True |
>= | 大于等于:判断左侧操作数是否相等大于等于右侧操作数,大于等于则返回True(真)反则则反 | a>=b | 2>=3 False |
<= | 小于等于:判断左侧操作数是否相等小于等于右侧操作数,小于等于则返回True(真)反则则反 | a<=b | 2<=3 True |
4.1.3 赋值运算符
运算符 | 描述 | 示例 | 运算符 |
= | 赋值:将右侧操作数赋值给左侧的操作数 | c = a + b | c=2+3 print(c) 5 |
+= | 加赋值:加赋值操作符,左侧操作数与右侧操作数和的结果再赋给左侧操作数 | c += a 注: 相当于c = c + a | c=1 c+=2 print(c) 3 |
-= | 减赋值:减赋值操作符,左侧操作数与右侧操作数差的结果再赋给左侧操作数 | c -= a | c=1 c-=2 print(c) -1 |
*= | 乘赋值:乘赋值操作符,左侧操作数与右侧操作数乘的结果再赋给左侧操作数 | c *= a 注:相当于c =c *a | c=2 c*=3 print(c) 6 |
/= | 除赋值:除赋值操作符,左侧操作数与右侧操作数相除的结果再赋给左侧操作数 | c /= a 注:相当于c=c/a | c=6 c/=2 print(c) 3 |
%= | 模赋值:模赋值操作符,左侧操作数与右侧操作数模的结果再赋给左侧操作数 | c %= a 注:相当于c =c %a | c=5 c%=2 print(c) 1 |
**= | 幂赋值:幂赋值操作符,左侧操作数的右侧操作数次幂的结果再赋给左侧操作数 | c **= a 注:相当于c =c**a | c=2 c**3 print(c) 8 |
//= | 地板除赋值:模赋值操作符,左侧操作数与右侧操作数地板除的结果再赋给左侧操作数 | c //= a 注:相当于c = c // a | c=9.1 c//2.3 print(c) 3.0 |
4.1.4 逻辑运算符
运算符 | 描述 | 示例 | 运算符 |
and | 与:如果两个操作数都是真的则真。反之则反。 | a and b | 1 and 0 (1>2) and (2<3) False |
or | 或:如果有两个操作数有一个真则真。都假则为假 | a or b | 1 or 0 1 (1>2) or 2<3) True |
not | 非:对逻辑运算符取反,真的反为假,假的反为真。 | not a | not 0 True not 1 False not (1>2) True |
4.1.5 位运算符
在演示位运算符号前,我们先假设有两个数 a =60、b=13; 它们以二进制标识如下:
a的二进制结构0011 1100
二进制转十进制:0*20+0*21+1*22+1*23+1*24+1*25
即0*2**0+0*2**1+1*2**2+1*2**3+1*2**4+1*2**5
b的二进制结构0000 1101
二进制转十进制:1*20+0*21+1*22+1*23
即1*2**0+0*2**1+1*2**2+1*2**3
那么
a) a&b
a&b = 0000 1100是怎么运算的呢?
运算详解:a和b的二进制对应位两两取与。
a) a|b
同理a|b是a和b的二进制对应位两两或,即得到a|b=0011 1101
b) a^b
这里是异或,即a和b的二进制对应位相同的则返回0,不同则为1,所以a^b = 0011 0001
c) ~a
这里是取反,即a的二进制对应位取反。所以~a = 1100 0011
d) a<<2
这里是左位移符号,即a的二进制都向右移动二位。所以是a<<2=2
a) a>>2
这里是右位移符号,即a的二进制都向左移动二位。所以是a>>2=15
注:参考e)即可推断出该值。
操作符 | 描述 | 示例 | 代码示例 |
& | 位与:二进制对应位进行与操作 | (a & b) = 12 即 0000 1100 | a=60 b=13 a&b 12 |
| | 位或:二进制对应位进行或操作 | (a | b) = 61 即 0011 1101 | a=60 b=13 a|b 61 |
^ | 位异或:二进制对应位进行异或操作。 | (a ^ b) = 49 即 0011 0001 | a=60 b=13 a^b 49 |
~ | 位取反:二进制对应位进行取反操作。 | (~a ) = -61 即 1100 0011以2的补码形式由于带符号二进制数。 | a=60 ~a -61 |
<< | 左移位:左操作数的值左移由右操作数指定的位数。 | a << 2 = 240 即 1111 0000 | a<<2 240 |
>> | 右移位:右操作数的值右移由右边操作数指定的位数。 | a >> 2 = 15 即 0000 | a>>2 15 |
4.1.6 会员操作符
操作符 | 描述 | 示例 | 代码示例 |
in | 成员存在:判断一个元素是否存在某个数据结构内,存在返回True,否则False。 | x in y | 'python' in ['python','xiaodao'] True |
not in | 成员不存在:判断一个元素是否存在某个数据结构内,不存在返回True,否则False。 | x not in y | 'python' not in ['python','xiaodao'] False |
4.1.7 标识操作符
运算符 | 描述 | 例子 | 运算符 |
is | 同一运算符:判断两个变量是不是一个,是则返回True,否则为False。 | x is y | x = y = [4,5,6] z = [4,5,6] x is y True |
is not | 非同一运算符:判断两个变量是不是一个,不是则返回True,否则为False。 | x is not y | x = y = [4,5,6] z = [4,5,6] x is not z True |
4.2 操作符优先级
在开始本章节之前让我们先回顾一下两头小羊过河的故事:
一天,两只小羊在独木桥前相遇,小白羊说:“让我先过去!”
“不对,应该让我先过去!”小黑羊大叫道。
小白羊很生气,它用角去顶小黑羊,小黑羊也不甘示弱,冲了上去,两只羊互不相让。
小白羊想:我的毛洁白无瑕,比你高贵,应该让我先过去。小黑羊想:我的力气比你大,肯定能战胜你。“扑通”一声,两只小羊同时掉下了水。
这个故事当然是教育我们要谦让,引入这个故事是要提到另外一点:优先级。通过上面章节的学习我们了解了7类常用的操作符,显然这些操作符是组合在一起用的。那么哪些操作符先执行,哪些后执行呢?我们来看Python里对操作符优先级的定义:
运算符通常是从左往右结合的,例如,有相同优先级的运算符按照从左向右的顺
序计算。例如,2+3+4 的顺序是(2+3)+4。一些运算符,如赋值运算符有从右向左的
结合顺序,例如a=b=c 被当成a=(b=c) 。
操作符优先级由高到低排列见下表:
运算符 | 描述 | 程序示例 |
** | 幂 | 2+2**6/4 18.0 6.0 |
~ + - | 补码,正负号 | |
* / % // | 乘,除,取模和地板除 | |
+ - | 加法和减法 | |
>> << | 左,右按位转移 | |
& | 位与 | |
^ | | 按位异'或`'和定期`或' | |
<= < > >= | 比较运算符 | |
<> == != | 等式运算符 | |
= %= /= //= -= += *= **= | 赋值运算符 | |
is is not | 标识运算符 | |
in not in | 成员运算符 | |
not or and | 逻辑运算符 |
注:当然我们可以通过()来改变优先级
4.3 表达式
表达式就像我们作文中的加了修饰的词,比如晴朗的天空。它一般有变量、操作符组成。比如我们计算一个矩形的面积可以这样做:
代码示例:
length = 5
breadth = 2
area = length * breadth
print('面积是', area)
面积是 10
print('周长是',2 * (length+ breadth))
周长是 14
4.4 总结
前面看到了如何使用操作符符,操作数和表达式,这是程序的最为基本的构成。接下来,将会看到如何通过语句在程序中使用这些内容。