python-2/05-Python运算符与表达式.md
2024-12-26 09:59:08 +08:00

328 lines
14 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 05-Python运算符与表达式
[TOC]
## 一、基本概念
**什么是运算符**
运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算
例如2+3,其操作数是2和3而运算符则是"+"
**什么是表达式**
表达式,是由数字、运算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合。约束变量在表达式中已被指定数值,而自由变量则可以在表达式之外另行指定数值。
**Python运算符分类**
算术运算符
关系运算符
赋值运算符
逻辑运算符
位运算符
成员运算符
身份运算符
## 二、算术运算符
以下假设变量a为10变量b为20
| 运算符 | 描述 | 实例 |
| ------ | ----------------------------------------------- | -------------------------------------------------- |
| + | 加 - 两个对象相加 | a + b 输出结果 30 |
| - | 减 - 得到负数或是一个数减去另一个数 | a - b 输出结果 -10 |
| * | 乘 - 两个数相乘或是返回一个被重复若干次的字符串 | a * b 输出结果 200 |
| / | 除 - x除以y | b / a 输出结果 2 |
| % | 取模 - 返回除法的余数 | b % a 输出结果 0 |
| ** | 幂 - 返回x的y次幂 | a**b 为10的20次方 输出结果 100000000000000000000 |
| // | 取整除 - 返回商的整数部分 | 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0 |
交互模式下,上次输出的表达式会赋给变量 `_`。把 Python 当作计算器时,用该变量实现下一步计算更简单,例如:
```python
>>> tax = 12.5 / 100
>>> price = 100.50
>>> price * tax
12.5625
>>> price + _
113.0625
>>> round(_, 2)
113.06
```
最好把该变量当作只读类型。不要为它显式赋值,否则会创建一个同名独立局部变量,该变量会用它的魔法行为屏蔽内置变量。
## 三、关系运算符
也叫比较运算符
以下假设变量a为10变量b为20
| 运算符 | 描述 | 实例 |
| ------ | ------------------------------------------------------------ | --------------------- |
| == | 等于 - 比较对象是否相等 | (a == b) 返回 False。 |
| != | 不等于 - 比较两个对象是否不相等 | (a != b) 返回 true. |
| > | 大于 - 返回x是否大于y | (a > b) 返回 False。 |
| < | 小于 - 返回x是否小于y。所有比较运算符返回1表示真返回0表示假。这分别与特殊的变量True和False等价。注意这些变量名的大写。 | (a < b) 返回 true |
| >= | 大于等于- 返回x是否大于等于y。 | (a >= b) 返回 False。 |
| <= | 小于等于 -返回x是否小于等于y。 | (a <= b) 返回 true。 |
## 四、赋值运算符
以下假设变量a为10变量b为20
| 运算符 | 描述 | 实例 |
| ------ | ---------------- | ------------------------------------- |
| = | 简单的赋值运算符 | c = a + b 将 a + b 的运算结果赋值为 c |
| += | 加法赋值运算符 | c += a 等效于 c = c + a |
| -= | 减法赋值运算符 | c -= a 等效于 c = c - a |
| *= | 乘法赋值运算符 | c *= a 等效于 c = c * a |
| /= | 除法赋值运算符 | c /= a 等效于 c = c / a |
| %= | 取模赋值运算符 | c %= a 等效于 c = c % a |
| **= | 幂赋值运算符 | c `**=` a 等效于 c = c `**`a |
| //= | 取整除赋值运算符 | c //= a 等效于 c = c // a |
## 五、逻辑运算符
以下假设变量 a 为 10, b为 20:
| 运算符 | 逻辑表达式 | 描述 | 实例 |
| ------ | ---------- | ------------------------------------------------------------ | ----------------------- |
| and | x and y | 布尔"与" - 如果 x 为 Falsex and y 返回 False否则它返回 y 的计算值。 | (a and b) 返回 20。 |
| or | x or y | 布尔"或"- 如果 x 是非 0它返回 x 的值,否则它返回 y 的计算值。 | (a or b) 返回 10。 |
| not | not x | 布尔"非" - 如果 x 为 True返回 False 。如果 x 为 False它返回 True。 | not(a and b) 返回 False |
## 六、位运算符
按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下
下表中变量 a 为 60b 为 13
| 运算符 | 描述 | 实例 |
| ------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| & | 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 | (a & b) 输出结果 12 ,二进制解释: 0000 1100 |
| \| | 按位或运算符只要对应的二个二进位有一个为1时结果位就为1。 | (a \| b) 输出结果 61 ,二进制解释: 0011 1101 |
| ^ | 按位异或运算符当两对应的二进位相异时结果为1 | (a ^ b) 输出结果 49 ,二进制解释: 0011 0001 |
| ~ | 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 | (~a ) 输出结果 -61 ,二进制解释: 1100 0011 在一个有符号二进制数的补码形式。 |
| << | 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数低位补0。 | a << 2 输出结果 240 二进制解释 1111 0000 |
| >> | 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数高位补0低位舍弃 | a >> 2 输出结果 15 ,二进制解释: 0000 1111 |
注:上例中计算结果有问题,做好的结果没改,按实际结果来
## 七、成员运算符
除了以上的一些运算符之外Python还支持成员运算符测试实例中包含了一系列的成员包括字符串列表或元组。
| 运算符 | 描述 | 实例 |
| ------ | ------------------------------------------------------- | ------------------------------------------------- |
| in | 如果在指定的序列中找到值返回 True否则返回 False。 | x 在 y 序列中 , 如果 x 在 y 序列中返回 True。 |
| not in | 如果在指定的序列中没有找到值返回 True否则返回 False。 | x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。 |
## 八、身份运算符
身份运算符用于比较两个对象的存储单元python3推荐用==
| 运算符 | 描述 | 实例 |
| ------ | ------------------------------------------ | ------------------------------------------------------ |
| is | is是判断两个标识符是不是引用自一个对象 | x is y, 如果 id(x) 等于 id(y) , is 返回结果 1 |
| is not | is not是判断两个标识符是不是引用自不同对象 | x is not y, 如果 id(x) 不等于 id(y). is not 返回结果 1 |
## 九、三元运算符
变量名 = 表达式 if 判断条件 else 表达式
当 if 后边的 判断条件成立, 变量名的值就是 紧跟在等号后面的值,否则,变量名的值将会是 else 后面的值。
```python
x = 11
n = x -1 if x >10 else x +1
print(n)
x = 11
if x > 10:
n = x-1
else:
n = x+1
print(n)
```
## 十、运算符优先级
以下表格列出了从最高到最低优先级的所有运算符:
| 运算符 | 描述 |
| ------------------------ | ------------------------------------------------------ |
| ** | 指数 (最高优先级) |
| ~ + - | 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) |
| * / % // | 乘,除,取模和取整除 |
| + - | 加法减法 |
| >> << | 右移,左移运算符 |
| & | 位 'AND' |
| ^ \| | 位运算符 |
| <= < > >= | 比较运算符 |
| <> == != | 等于运算符 |
| = %= /= //= -= += *= **= | 赋值运算符 |
| is is not | 身份运算符 |
| in not in | 成员运算符 |
| not or and | 逻辑运算符 |
| lambada | 一种灵活,便捷的且具有函数功能的表达式,又称匿名函数 |
算术运算符 > 比较>逻辑
## 十一、进制转换
进制转换是人们利用符号来计数的方法。
由一组数码符号和两个基本因素"基数"与"位权"构成。
基数是指,进位计数制中所采用的数码(数制中用来表示"量"的符号)的个数。
位权是指,进位制中每一固定位置对应的单位值。
**简单转换理念**
把二进制三位一组分开就是八进制, 四位一组就是十六进制
**二进制与十进制**
1二进制转十进制"按权展开求和"
10112=1x2**3 + 0x2**2 + 1x2**1 + 1x2**0=(11)10
规律个位上的数字的次数是0十位上的数字的次数是1......,依次递增,而十分位的数字的次数是-1百分位上数字的次数是-2......,依次递减。
注意:不是任何一个十进制小数都能转换成有限位的二进制数。
2十进制转二进制:"除以2取余逆序排列"(除二取余法)
【例】:(89)10=(1011001)2
89÷2 ……1
44÷2 ……0
22÷2 ……0
11÷2 ……1
5÷2 ……1
2÷2 ……0
1
十进制小数转二进制数:"乘以2取整顺序排列"乘2取整法
【例】:(0625)10= (0101)2
0.625X2=1.25 ……1
0.25X2=0.50 ……0
0.50 X2=1.00 ……1
二进制与八进制:
二进制数转换成八进制数从小数点开始整数部分向左、小数部分向右每3位为一组用一位八进制数的数字表示不足3位的要用"0"补足3位就得到一个八进制数。
八进制数转换成二进制数把每一个八进制数转换成3位的二进制数就得到一个二进制数。
八进制数字与十进制数字对应关系如下:
000 -> 0 | 004-> 4 | 010=8
001 -> 1 |005 -> 5 | 011=9
002 -> 2 |006 -> 6 | 012=10
003 -> 3 |007 -> 7 | 013=11
【例】将八进制的37.416转换成二进制数:
3 7 4 1 6
011 111 100 001 110
37.4168 =11111.100001112
【例】将二进制的10110.0011 转换成八进制:
0 1 0 1 1 0 . 0 0 1 1 0 0
2 6 . 1 4
10110.00112 = 26.148
二进制与十六进制
二进制数转换成十六进制数二进制数转换成十六进制数时只要从小数点位置开始向左或向右每四位二进制划分一组不足四位数可补0然后写出每一组二进制数所对应的十六进制数码即可。
十六进制数转换成二进制数把每一个十六进制数转换成4位的二进制数就得到一个二进制数。
十六进制数字与二进制数字的对应关系如下:
0000 -> 0 | 0100 -> 4 | 1000 -> 8 | 1100 -> C
0001 -> 1 | 0101 -> 5 | 1001 -> 9 | 1101 -> D
0010 -> 2 | 0110 -> 6 | 1010 -> A | 1110 -> E
0011 -> 3 | 0111 -> 7 | 1011 -> B | 1111 -> F
【例】将十六进制数5DF.9 转换成二进制:
5 D F 9
0101 1101 1111 1001
5DF.916 =10111011111.10012{十六进制怎么会有小数点}
【例】将二进制数1100001.111 转换成十六进制:
0110 0001 1110
6 1 E
1100001.1112 =61.E16
**Python中进制转换**
2进制以0b开头:
如: 0b11 则表示十进制的3
8进制以0或者0o开头:
如: 011则表示十进制的9
16进制以0x开头:
如: 0x11则表示十进制的17
```python
# 10进制转为2进制
>>> bin(10)
'0b1010'
# 2进制转为10进制
>>> int("1001",2)
9
# 10进制转为16进制
>>> hex(10)
'0xa'
# 16进制到10进制
>>> int("ff", 16)
255
>>> int('0xab', 16)
171
# 10进制转为8进制 两种方式
>>> print ("%o" % 10)
12
>>> oct(8)
'010'
# 16进制到2进制
>>> bin(0xa)
'0b1010'
# 2进制到16进制
>>> hex(0b1001)
'0x9'
8进制转10进制
print(0o10)
int('010',8)
int('0o10',8)
```
# 尝试用Python写自己的grep
shell编写grep同等功能的命令