代码中的注释经常用来表达代码内容的含义或者保存一些不执行但要保留的代码进行对比查看
# 你好,世界
'''
有些人心如草木,
却向阳而生
'''
print("余生大大 --->")
算数运算符
符号
操作符 | 名称 | 示例 |
---|---|---|
+ | 加 | 1 + 1 |
- | 减 | 2 - 1 |
* | 乘 | 3 * 4 |
/ | 除 | 3 / 4 |
// | 整除(地板除) | 3 // 4 |
% | 取余 | 3 % 4 |
** | 幂 | 2 ** 3 |
代码
print(1 + 1) # 加
print(2 - 1) # 减
print(3 * 7) # 称
print(7 / 9) # 除
print(41 // 7)# 整除,舍弃小数
print(5 % 3) # 取余数
print(2 ** 9) # 幂
结果
比较运算符
符号
操作符 | 名称 | 示例 |
---|---|---|
> | 大于 | 2 > 1 |
>= | 大于等于 | 2 >= 4 |
< | 小于 | 1 < 2 |
<= | 小于等于 | 5 <= 2 |
== | 等于 | 3 == 4 |
!= | 不等于 | 3 != 5 |
代码
print(2 > 1) # True
print(2 >= 4) # False
print(1 < 2) # True
print(5 <= 2) # False
print(3 == 4) # False
print(3 != 5) # True
结果
逻辑运算符
符号
操作符 | 名称 | 示例 |
---|---|---|
and | 与 | (3 > 2) and (3 < 5) |
or | 或 | (1 > 3) or (9 < 2) |
not | 非 | not (2 > 1) |
代码
print((3 > 2) and (3 > 5)) # and 的条件必须都符合才输出true
print((1 > 3) or (9 > 2)) # or 的条件只要一个符合就输出true
print(not (2 > 1)) # not相当于取反,结果为true加上not就输出反向结果
结果
位运算符
符号
操作符 | 名称 | 示例 |
---|---|---|
~ | 按位取反 | ~4 |
& | 按位与 | 4 & 5 |
| | 按位或 | 4 | 5 |
^ | 按位异或 | 4 ^ 5 |
<< | 左移 | 4 << 2 |
>> | 右移 | 4 >> 2 |
按位取反(~
)
按位取反运算符~为单目运算符(只有一个操作数),右结合性,作用是对参与运算的二进制位取反。例如~1为0,~0为1,这和逻辑运算中的!非常类似。也就是把数值在内存中的二进制存储进行取反。
例如,~9可以转换为如下的运算:
~ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0110 (-10 在内存中的存储)
按位与(&
)
按位与运算符&的运算规则是:只有参与&运算的两个位都为 1 时,结果才为 1,否则为 0。例如1&1为 1,0&0为 0,1&0也为 0,这和逻辑运算符&&非常类似。也就是说两个数值的内存二进制0,1对比,1&1为1 0&0为0 1&0为0
-9&5可以转换成如下的运算:结果为5
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
& 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
按位或(|)
按位或运算符|的运算规则是:两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0。例如1|1为 1,0|0为0,1|0 为1,这和逻辑运算中的||非常类似。跟上面的相反,1|1为1,0|0为0,1|0为1
-9&5可以转换成如下的运算:结果为-9
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
| 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
按位异或(^)
按位异或运算^的运算规则是:参与运算的两个二进制位不同时,结果为 1,相同时结果为 0。例如0^1为 1,0^0为 0,1^1为 0。
-9&5可以转换成如下的运算:结果为-14
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
^ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0010 (-14 在内存中的存储)
左移运算符(<<)
Python 左移运算符<<用来把操作数的各个二进制位全部左移若干位,高位丢弃,低位补 0。
9<<3可以转换为如下的运算:结果为72
<< 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0100 1000 (72 在内存中的存储)
如果数据较小,被丢弃的高位不包含 1,那么左移 n 位相当于乘以 2 的 n 次方。
9<<3可以理解为 9*2的3次方:9*(2*2*2)=72
右移运算符(>>)
Python 右移运算符>>用来把操作数的各个二进制位全部右移若干位,低位丢弃,高位补 0 或 1。如果数据的最高位是 0,那么就补 0;如果最高位是 1,那么就补 1。
9>>3可以转换为如下的运算:结果为1
>> 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0001 (1 在内存中的存储)
(-9)>>3可以转换为如下的运算:结果为-2
>> 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 1110 (-2 在内存中的存储)
上面两个可以看出9>>3高位丢的0就补0,(-9)>>3丢的1就补1
如果被丢弃的低位不包含 1,那么右移 n 位相当于除以 2 的 n 次方(但被移除的位中经常会包含 1)。
代码
#bin() 返回一个整数 int 或者长整数 long int 的二进制表示。
print(bin(4)) # 0b100
print(bin(5)) # 0b101
print(bin(~4), ~4) # -0b101 -5
print(bin(4 & 5), 4 & 5) # 0b100 4
print(bin(4 | 5), 4 | 5) # 0b101 5
print(bin(4 ^ 5), 4 ^ 5) # 0b1 1
print(bin(4 << 2), 4 << 2) # 0b10000 16
print(bin(4 >> 2), 4 >> 2) # 0b1 1
结果
三元运算符
代码
x, y = 4, 5
small = x if x < y else y # 如果x < y则输出前面的x 否则输出 y
print(small) # 4
结果
其他运算符
符号
操作符 | 名称 | 示例 |
---|---|---|
in | 存在 | 'A' in ['A', 'B', 'C'] |
not in | 不存在 | 'h' not in ['A', 'B', 'C'] |
is | 是 | "hello" is "hello" |
is not | 不是 | "hello" is not "hello" |
代码
# is 和 not in
letters = ['A', 'B', 'C']
print('A' in letters) # 如果A存在于那个数组中为真
print('A' not in letters) # 如果A不存在于那个数组中为真
# in 和 not in
a = "hello"
b = "hello"
print(a is b, a == b) # True True
print(a is not b, a != b) # False False
注意
is, is not 对比的是两个变量的内存地址
==, != 对比的是两个变量的值
比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not 和 ==,!= 是完全等价的。
对比的两个变量,指向的是地址可变的类型(list,dict等),则两者是有区别的。
结果
运算符的优先级
3 ** -2
等价于3 ** (-2)
。1 << 3 + 2 & 7
等价于 (1 << (3 + 2)) & 7
。3 < 4 and 4 < 5
等价于(3 < 4) and (4 < 5)
。print(-3 ** 2) # -9
print(3 ** -2) # 0.1111111111111111
print(1 << 3 + 2 & 7) # 0
print(-3 * 2 + 5 / -2 - 4) # -12.5
print(3 < 4 and 4 < 5) # True
# 纯字符类型则拼接
yu = "心如草木"
sheng = "向阳而生"
print(yu + "," + sheng)
# 数值类型则计算
num = 1;
numT = 3;
print(num + numT)
# 字符类和数值类不能混用
print(num + numT + yu)
只要是对象,就有相应的属性 (attributes) 和方法(methods),在开发时经常需要将数据类型转换和统一。
a = 1031
print(a, type(a))
a = 122
# 数值转字符串
a = str(a);
print(a, type(a))
# 字符串转浮点
a = float(a);
print(a, type(a))
# 浮点转数值
a = int(a);
print(a, type(a))
# 数值转布尔(bool如果是0、0.0或者空字符串及空的变量则为false)
a = bool(a)
print(a, type(a))
is
, is not
与 ==
, !=
的区别是什么?