變量、運算符與數(shù)據(jù)類型
- 在 Python 中毡熏,
#
表示注釋米死,作用于整行 -
''' '''
或者""" """
表示區(qū)間注釋,在三引號之間的所有內(nèi)容被注釋
print("Hello china")
# Hello china
"""
這是多行注釋侈离,用三個雙引號
這是多行注釋,用三個雙引號
這是多行注釋做修,用三個雙引號
"""
#注意下列這種情況霍狰,會輸出\n加內(nèi)容的形式抡草,即下面的寫法并不會被認為是注釋
#而會被認為是一種自動分割的一串語句饰及,并以\n來間隔
"""區(qū)間注釋
yes
多行注釋"""
#關(guān)于print函數(shù)
a=r"\a"
b=r"\m"
print(a,end='')
print(b)
print函數(shù)后默認添加換行符,如果我們不需要康震,必須為關(guān)鍵字參數(shù)end指定一個默認值'\ n'以外的值
后來了解到\n在python中的意思就是換行的意思
其實想要輸出\n還有另外的幾種方法
只需在前添加轉(zhuǎn)義符,
也可以在字符串前添加r燎含,r代表raw,元字符的意思腿短,免疫轉(zhuǎn)義符號
那么如果我們出現(xiàn)了想在語句中加“或者’的情況怎么辦呢
##當遇到想要把”或者'表示出來的情況應該如何去做呢
#print("hello"WORLD")屏箍,該處會出現(xiàn)報錯
#以單雙引號交替的方法把"或者'表示出來
a="hello 'WORLD"
print(a)
print("hello'WORLD")#一開始單獨運行這行代碼時出現(xiàn)了報錯,后面在運行了前兩句后報錯消失橘忱,懷疑是一開始的語法打錯了
print('hello"WORLD')
#運用轉(zhuǎn)義符來把"表示出來
print("hello\"WORLD")
#如何把\表示出來呢赴魁,
print("hello\\WORLD")
簡單運算應該怎么處理呢
特別要注意的是冪的運算的語法
+ |
加 | 1 + 1 |
---|---|---|
- |
減 | 2 - 1 |
* |
乘 | 3 * 4 |
/ |
除 | 3 / 4 |
// |
整除 | 3 // 4 |
% |
取余 | 3 % 4 |
** |
冪 | 2 ** 3 |
print(1 + 1)
print(2 - 1)
print(3 * 4)
print(3 / 4)
print(3 // 4)
print(3 % 4)
print(2 ** 10)
邏輯值運算
操作符 | 名稱 | 示例 |
---|---|---|
> |
大于 | 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) |
print(2 > 1)
print(2 >= 4)
print(1 < 2)
print(5 <= 2)
print(9 == 24)
print(3 != 24)
#邏輯值的運算應該于判斷之類的語句相聯(lián)系
位運算
1. 原碼、反碼和補碼
二進制有三種不同的表示形式:原碼钝诚、反碼和補碼颖御,計算機內(nèi)部使用補碼來表示。
原碼:就是其二進制表示(注意凝颇,有一位符號位)潘拱。
00 00 00 11 -> 3
10 00 00 11 -> -3
反碼:正數(shù)的反碼就是原碼,負數(shù)的反碼是符號位不變拧略,其余位取反(對應正數(shù)按位取反)芦岂。
00 00 00 11 -> 3
11 11 11 00 -> -3
補碼:正數(shù)的補碼就是原碼,負數(shù)的補碼是反碼+1垫蛆。
00 00 00 11 -> 3
11 11 11 01 -> -3
2. 按位運算
- 按位非操作 ~
~ 1 = 0
~ 0 = 1
~
把num
的補碼中的 0 和 1 全部取反(0 變?yōu)?1禽最,1 變?yōu)?0)有符號整數(shù)的符號位在 ~
運算中同樣會取反。
00 00 01 01 -> 5
~
---
11 11 10 10 -> -6
11 11 10 11 -> -5
~
---
00 00 01 00 -> 4
- 按位與操作 &
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
只有兩個對應位都為 1 時才為 1
00 00 01 01 -> 5
&
00 00 01 10 -> 6
---
00 00 01 00 -> 4
- 按位或操作 |
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
只要兩個對應位中有一個 1 時就為 1
00 00 01 01 -> 5
|
00 00 01 10 -> 6
---
00 00 01 11 -> 7
- 按位異或操作 ^
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
只有兩個對應位不同時才為 1
00 00 01 01 -> 5
^
00 00 01 10 -> 6
---
00 00 00 11 -> 3
異或操作的性質(zhì):滿足交換律和結(jié)合律
A: 00 00 11 00
B: 00 00 01 11
A^B: 00 00 10 11
B^A: 00 00 10 11
A^A: 00 00 00 00
A^0: 00 00 11 00
A^B^A: = A^A^B = B = 00 00 01 11
- 按位左移操作 <<
num << i
將num
的二進制表示向左移動i
位所得的值袱饭。
00 00 10 11 -> 11
11 << 3
---
01 01 10 00 -> 88
- 按位右移操作 >>
num >> i
將num
的二進制表示向右移動i
位所得的值弛随。
00 00 10 11 -> 11
11 >> 2
---
00 00 00 10 -> 2
3. 利用位運算實現(xiàn)快速計算
通過 <<
,>>
快速計算2的倍數(shù)問題宁赤。
n << 1 -> 計算 n*2
n >> 1 -> 計算 n/2舀透,負奇數(shù)的運算不可用
n << m -> 計算 n*(2^m),即乘以 2 的 m 次方
n >> m -> 計算 n/(2^m)决左,即除以 2 的 m 次方
1 << n -> 2^n
通過 ^
快速交換兩個整數(shù)愕够。 通過 ^
快速交換兩個整數(shù)走贪。
a ^= b
b ^= a
a ^= b
通過 a & (-a)
快速獲取a
的最后為 1 位置的整數(shù)。
00 00 01 01 -> 5
&
11 11 10 11 -> -5
---
00 00 00 01 -> 1
00 00 11 10 -> 14
&
11 11 00 10 -> -14
---
00 00 00 10 -> 2
4. 利用位運算實現(xiàn)整數(shù)集合
一個數(shù)的二進制表示可以看作是一個集合(0 表示不在集合中惑芭,1 表示在集合中)坠狡。
比如集合 {1, 3, 4, 8}
,可以表示成 01 00 01 10 10
而對應的位運算也就可以看作是對集合進行的操作遂跟。
元素與集合的操作:
a | (1<<i) -> 把 i 插入到集合中
a & ~(1<<i) -> 把 i 從集合中刪除
a & (1<<i) -> 判斷 i 是否屬于該集合(零不屬于逃沿,非零屬于)
集合之間的操作:
a 補 -> ~a
a 交 b -> a & b
a 并 b -> a | b
a 差 b -> a & (~b)
注意:整數(shù)在內(nèi)存中是以補碼的形式存在的,輸出自然也是按照補碼輸出幻锁。
【例子】C#語言輸出負數(shù)凯亮。
class Program
{
static void Main(string[] args)
{
string s1 = Convert.ToString(-3, 2);
Console.WriteLine(s1);
// 11111111111111111111111111111101
string s2 = Convert.ToString(-3, 16);
Console.WriteLine(s2);
// fffffffd
}
}
【例子】 Python 的bin()
輸出。
print(bin(3)) # 0b11
print(bin(-3)) # -0b11
print(bin(-3 & 0xffffffff))
# 0b11111111111111111111111111111101
print(bin(0xfffffffd))
# 0b11111111111111111111111111111101
print(0xfffffffd) # 4294967293
0b11
-0b11
0b11111111111111111111111111111101
0b11111111111111111111111111111101
4294967293
是不是很顛覆認知哄尔,我們從結(jié)果可以看出:
- Python中
bin
一個負數(shù)(十進制表示)假消,輸出的是它的原碼的二進制表示加上個負號,巨坑岭接。 - Python中的整型是補碼形式存儲的富拗。
- Python中整型是不限制長度的不會超范圍溢出。
所以為了獲得負數(shù)(十進制表示)的補碼鸣戴,需要手動將其和十六進制數(shù)0xffffffff
進行按位與操作啃沪,再交給bin()
進行輸出,得到的才是負數(shù)的補碼表示窄锅。
符號位:最高位為符號位创千,0表示正數(shù),1表示負數(shù)酬滤。在位運算中符號位也參與運算签餐。
操作符 | 名稱 | 示例 |
---|---|---|
~ |
按位取反 | ~4 |
& |
按位與 | 4 & 5 |
` | ` | 按位或 |
^ |
按位異或 | 4 ^ 5 |
<< |
左移 | 4 << 2 |
>> |
右移 | 4 >> 2 |
參考內(nèi)容
阿里云訓練營