练习题
- 怎样对python中的代码进行注释?
- python有哪些运算符,这些运算符的优先级是怎样的?
- python 中 is, is not 与 ==, != 的区别是什么?
- python 中包含哪些数据类型?这些数据类型之间如何转换?
1. 怎样对python中的代码进行注释?
- 在python中,# 表示单行注释,
- ‘’’’’'或者""""""用于区间注释
2. python有哪些运算符,这些运算符的优先级是怎样的?
算术运算符、比较运算符、逻辑运算符、位运算符、三元运算符
优先级:
- 一元运算符优于二元运算符。例如3 ** -2等价于3 ** (-2)。
- 先算术运算,后移位运算,最后位运算。例如 1 << 3 + 2 & 7等价于 (1 << (3 + 2)) & 7。
- 逻辑运算最后结合。例如3 < 4 and 4 < 5等价于(3 < 4) and (4 < 5)。
3. python 中 is, is not 与 ==, != 的区别是什么?
区别:
- is, is not对比的是两个变量的内存地址
- ==,!= 比较的是两个变量的值
- 比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not 和==,!=是完全等价的。
- 比较的两个变量,指向的是地址可变的类型(list,dict)等,则两者是有区别的
【例子】比较的两个变量均指向不可变类型。
a = "hello"
b = "hello"
print(a==b, a is b)
True True
【例子】比较的两个变量均指向可变类型。
a = ["hello"]
b = ["hello"]
print(a==b, a is b)
True False
4. python 中包含哪些数据类型?这些数据类型之间如何转换?
数据类型:
-
int 整型 <class ‘int’> -876, 10
-
float 浮点型<class ‘float’> 3.149, 11.11
-
bool 布尔型<class ‘bool’> True, False
类型转换:
-
转换为整型 int(x, base=10)
-
转换为字符串 str(object=’’)
-
转换为浮点型 float(x)
print(int('520')) # 520
print(int(520.52)) # 520
print(float('520.52')) # 520.52
print(float(520)) # 520.0
print(str(10 + 10)) # 20
print(str(10.1 + 5.2)) # 15.3
520
520
520.52
520.0
20
15.3
1. 原码、反码和补码
二进制有三种不同的表示形式:原码、反码和补码,计算机内部使用补码来表示。
原码:就是其二进制表示(注意,最高位是符号位)
00 00 00 11 —>3
10 00 00 11 ->-3
反码 :正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)
00 00 00 11 -> 3
11 11 11 00 -> -3
符号位 :最高位为符号位,0表示正数,1表示负数,再位运算中符号位也参与运算。
2. 按位非操作 ~
~1 = 0
-
~0 = 1
- 把num的补码中的0和1全部取反,有符号整数的符号位在~运算中同样会取反
00 00 01 01 ->5
~
11 11 10 10 ->-6
3. 按位与 &
只有两个对应位都为1时才为1
1 & 1
1
1 & 0
0
0 & 1
0
0 & 0
0
4.按位或 |
有1为1,无1为0
print(1 | 1)
print(1 | 0)
print(0 | 1)
print(0 | 0)
1
1
1
0
5.按位异或 ^
相同为0,不同为1
- a^0 = a 任意数a和0做异或,结果仍为a本身
- a^a = 0 任意数和自身做异或,结果为数字本身
print(1^1,
1^0,
0^1,
0^0)
0 1 1 0
6. 按位左移操作 <<
num << i 将num的二进制表示向左移动i位所得的值
相当于num = num*2^i
# 00 00 10 11 -> 11
11 << 3
# 01 01 10 00 -> 88
88
按位右移
num >> i
相当于num = num /(2^i)
11 >> 2
2
7 >> 2
1
8. 利用位运算实现快速计算
通过<<, >> 快速计算2的倍数问题:
- n << 1 -> 计算n*2
- n >> 1 -> 计算n/2,负数的计算不可用
- 1 << n -> 2^n
通过^快速交换两个整数
a ^= b
b ^= a
a ^= b
9. 利用位运算实现整数集合
一个数的二进制表示可以看作是一个集合(0表示不在集合中,1表示在集合中)
比如集合{1, 3, 4, 8},可以表示成01 00 01 10
练习题:
leetcode 习题 136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
尝试使用位运算解决此题。
解题思路: 使用异或操作:
- a^0 = a 任意数和0做异或,结果为数字本身
- a^a = 0 任意数和自身做异或,结果为数字本身
根据这个规律,将数组里的数字全部做异或,出现两次的元素异或结果为0,异或后的结果就是那个只出现了一次的元素。
"""
Input file
example1: [2,2,1]
example2: [4,1,2,1,2]
Output file
result1: 1
result2: 4
"""
class Solution:
def singleNumber(self, nums):
res = 0
for i in nums:
res = res^i
return res