Python變數、運算子、資料型別及位運算
阿新 • • 發佈:2020-07-22
1.註釋
-
單行註釋:#
- 多行註釋: ''' ''' (用三個單引號) """ """(用三個雙引號在多行註釋開頭和結尾)
2.運算子
操作符 | 名稱 | 示例 |
+ | 加 | 1+1 |
- | 減 | 2-1 |
* | 乘 | 3*4 |
/ | 除 | 3/4 |
// | 整除 | 3//4 |
% | 取餘 | 3%4 |
** | 冪 | 2**3 |
比較運算子 | ||
---|---|---|
操作符 | 名稱 | 示例 |
> |
大於 | 2 > 1 |
>= |
大於等於 | 2 >= 4 |
< |
小於 | 1 < 2 |
<= |
小於等於 | 5 <= 2 |
== |
等於 | 3 == 4 |
!= |
不等於 | 3 != 5 |
邏輯運算子 | ||
---|---|---|
操作符 | 名稱 | 示例 |
and |
與 | (3 > 2) and (3 < 5) |
or |
或 | (1 > 3) or (9 < 2) |
not |
非 | not (2 > 1) |
位運算子 | ||
---|---|---|
操作符 | 名稱 | 示例 |
~ |
按位取反 | ~4 |
& |
按位與 | 4 & 5 |
| |
按位或 | 4 | 5 |
^ |
按位異或 | 4 ^ 5 |
<< |
左移 | 4 << 2 |
>> |
右移 | 4 >> 2 |
其他運算子 | ||
---|---|---|
操作符 | 名稱 | 示例 |
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, 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)
。
3.資料型別與轉換
型別 | 名稱 | 示例 |
---|---|---|
int | 整型<class 'int'> |
-876, 10 |
float | 浮點型<class 'float'> |
3.149, 11.11 |
bool | 布林型<class 'bool'> |
True, False |
1 a = 1031 2 print(a, type(a)) 3 # 1031 <class 'int'>
- 轉換為整型
int(x, base=10)
- 轉換為字串
str(object='')
- 轉換為浮點型
float(x)
5.位運算
二進位制有三種不同的表示形式:原碼、反碼和補碼,計算機內部使用補碼來表示。
原碼:就是其二進位制表示(注意,最高位是符號位)。
反碼:正數的反碼就是原碼,負數的反碼是符號位不變,其餘位取反(對應正數按位取反)。
補碼:正數的補碼就是原碼,負數的補碼是反碼+1。
符號位:最高位為符號位,0表示正數,1表示負數。在位運算中符號位也參與運算。
按位非操作 ~ |
~ 把num 的補碼中的 0 和 1 全部取反(0 變為 1,1 變為 0)有符號整數的符號位在~ 運算中同樣會取反。 |
按位與操作 & |
只有兩個對應位都為 1 時才為 1 |
按位或操作 | |
只要兩個對應位中有一個 1 時就為 1 |
按位異或操作 ^ |
只有兩個對應位不同時才為 1、異或操作的性質:滿足交換律和結合律 |
按位左移操作 << |
num << i 將num 的二進位制表示向左移動i 位所得的值。 |
按位右移操作 >> |
num >> i 將num 的二進位制表示向右移動i 位所得的值。 |
- Python中
bin
一個負數(十進位制表示),輸出的是它的原碼的二進位制表示加上個負號,巨坑。 - Python中的整型是補碼形式儲存的。
- Python中整型是不限制長度的不會超範圍溢位。
- 為了獲得負數(十進位制表示)的補碼,需要手動將其和十六進位制數
0xffffffff
進行按位與操作,再交給bin()
進行輸出,得到的才是負數的補碼錶示。
leetcode 習題 136. 只出現一次的數字
給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
嘗試使用位運算解決此題。
""" Input file example1: [2,2,1] example2: [4,1,2,1,2] Output file result1: 1 result2: 4 """ class Solution: def singleNumber(self, nums: List[int]) -> int: # your code here
def singleNumber(self, nums): """ :type nums: List[int] :rtype: int """ c = 0 for x in nums: c ^= x print(c) l1 = [1, 2, 2] l2 = [4, 1, 2, 1, 2] s = Solution() s.singleNumber(l1) # 1 s.singleNumber(l2) # 4
- 任何數與自身異或結果為 0。
- 任何數與 0 異或結果為本身。
只需將數組裡面的整數一起按位異或即可。