1. 程式人生 > 實用技巧 >Python變數、運算子、資料型別及位運算

Python變數、運算子、資料型別及位運算

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 << inum的二進位制表示向左移動i位所得的值。

按位右移操作 >>

num >> inum的二進位制表示向右移動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 異或結果為本身。

只需將數組裡面的整數一起按位異或即可。