文章目錄
0. 計算機硬件基礎
基於圖靈提出的概念,馮諾依曼體系:計算機包含運算器、控制器、輸入設備、輸出設備、存儲器。其中CPU包含了運算和控制功能,是編程主要針對的對象。CPU不直接在IO設備輸入輸出數據;IO設備輸入輸出是有內存操作的。
馮諾依曼體系,梯度下降
cpu>CPU1級>2級>3級緩存>內存>IO設備
詳細說:
CPU–>>內存的1級CPU獨享緩存–CPU獨享二級緩存–多核CPU共享三級緩存–>>內存–>>IO設備
動態語言和靜態語言
靜態語言一旦定義類型,就不能變化了
動態語言不用事先聲明類型,隨時可以複製爲其它類型,沒有做類型約束,上線後容易出問題。
隱式類型轉換
- 隱式類型轉換舉例:
- 不能隱式類型轉換:
強類型語言,必須做強制類型轉換:
弱類型語言,可以隱式轉換,以Javascript爲例:
Python基礎語法
數字運算
數值類型
- 整數int:Python3不再區分int和long,long被重命名爲int所以,只有int類型了。
- 進製表示方法:10 進制 10; 16進制0xa;八進制0o10;二進制0b10。
- 進制函數:bin() oct() hex()
- 浮點數float,對等於c的double類型
- 複數complex
-
- Bool屬於int的子類,只有True和False兩個實例。
加減乘除
加+、減-、乘*、整除/、//向下取整、%取模、**取冪
注:python2中/和//都是整除
字符串處理
- ‘’’ 三引號可以換行’’’
r和f前綴
r前綴:字符前加r或者R,表示該字符串不做特殊處理:
f前綴:格式化字符串輸出
a =1
b =2
f"{a}的朋友是{b}"
>>> '1的朋友是2'
轉義序列
\ \t \r \n ’ "
前綴r,把裏面所有字符當做普通字符對待,轉義字符不再轉義。
續行
行尾使用, 注意\之後處理緊跟換行之外,不能有其它字符。
括號不支持跨行。
標識符
- 即以前稱謂的變量名。
- 以字母、數字和下劃線爲組成,字母開頭;不能數字開頭。
- 沒有常量。(只有字面量常量,比如1,‘abc’)
進制
每8位(bit)爲一個字節byte。
一個字節能表示整數的範圍:
- 無符號數即 216 -1=255
- 有符號數,包含127個正數和127個負數,加上0,也是255種。
轉爲10進制,按位乘以權,累加求和。
二進制種最低位爲1,一定是奇數,最低位爲0一定是偶數。
二進制轉16進制
每4位一斷:
二進制 | 十六進制 |
---|---|
1000 0000 | 8 0 |
特殊二進制0b | 十進制 | 十六進制0x |
---|---|---|
1 | 1 | 1 |
11 | 3 | 3 |
111 | 7 | 7 |
1111 | 15 | F |
1 1111 | 31 | 1F |
11 1111 | 63 | 3F |
111 1111 | 127 | 7F |
1111 1111 | 255 | FF |
1 0000 0000 | 256 | 100 |
特殊十六進制記憶
特殊十六進制0x | 十進制 |
---|---|
9 | 9 |
A | 10 |
D | 13 |
10 | 16 |
20 | 32 |
30 | 48 |
31 | 49 |
41 | 65 |
61 | 97 |
7F | 127 |
FF | 255 |
FE | 254 |
二進制轉8進制,每3位一斷:
二進制 | 八進制 |
---|---|
10 000 000 | 2 0 0 |
十六、八進制轉二進制
- 十六進制轉二進制,按位展開即可,
例如0xF8, 得二進制0b 1111 1000 - 八進制轉二進制,按位展開即可,
例如0o664,得二進制0b 110 110 100
十進制轉2、8、16進制
- 十進制轉二進制
除以基數2,直到商爲0,反向提取餘數。 - 十進制轉八進制
除以基數8,直到商爲0,反向提取餘數。 - 十進制轉十六進制
除以基數16,直到商爲0,反向提取餘數。
碼制
原碼
原碼:把生活應該有的正負概念,原原本本的表示出來。把左邊第一位騰出位置,存放符號,正用0來表示,負用1來表示。
反碼
反碼:但使用“原碼”儲存的方式,方便了看的人類,卻苦了計算機。例如,我們希望 (+1)和(-1)相加是0,但計算機只能算出0001+1001=1010 (-2)。 爲了解決“正負相加等於0”的問題,在“原碼”的基礎上,人們發明了“反碼”。
“反碼”表示方式是用來處理負數的,符號位置不變,其餘位置相反。
就算計無需算原碼:0001+1001=1010 (-2);只需算反碼:0001+1110=1111,剛好反碼錶示方式中,1111象徵-0。
補碼
(+1)和(-1)相加,變成了0001+1101=1111,剛好反碼錶示方式中,1111象徵-0人們總是進益求精,歷史遺留下來的問題—— 有兩個零存在,+0 和 -0我們希望只有一個0,所以發明了"補碼",同樣是針對"負數"做處理的"補碼"的意思是,從原來"反碼"的基礎上,補充一個新的代碼,(+1)
有得必有失,在補一位1的時候,要丟掉最高位我們要處理"反碼"中的"-0",當1111再補上一個1之後,變成了10000,丟掉最高位就是0000,剛好和左邊正數的0,完美融合掉了這樣就解決了+0和-0同時存在的問題另外"正負數相加等於0"的問題,同樣得到滿足舉例,3和(-3)相加,0011 + 1101 =10000,丟掉最高位,就是0000(0)。
簡述:
- 原碼呢,就是後面不動,第一位表示符號。5是0101,-5是1101.優點是,人能直接念出來1101是-5。缺點呢,你把0101和1101加起來,是啥?反正和0沒啥關係吧…對,缺點就是沒法直接加。
- 反碼的負數是把原碼“符號位不變,數值位取反”。如-5原碼是1101,所以它的反碼就是1010;老師只給了一行課件,我跟它真的不熟,我不知道他有什麼用,個人揣測它是原碼到補碼的一種過渡形態。也就是說,我們可以快速從反碼知道原碼和補碼。
- 補碼,用補碼錶示負數就是反碼+1。-5的反碼是1010,所以它的補碼就是1011。它的優點是,可以把負數直接拿來算加法。
碼 | 規則 | 正數- | 負數 |
---|---|---|---|
原碼 | 左邊第一位騰出位置,存放符號,正用0來表示,負用1來表示。 | 0110 1100 | 1110 1100 |
反碼 | 計算機使用:反碼可由原碼得到。如果機器數是==正數,則該機器數的反碼與原碼一樣==;如果機器數是負數,則該機器數的反碼是對它的 原碼符號位不變,各位取反而得到的。 | 0110 1100 | 1001 0011 |
補碼 | 爲給人看的:補碼可由原碼得到。如果機器數是==正數,則該機器數的補碼與原碼一樣==;如果機器數是負數,則該機器數的補碼是對它的原碼符號位不變,各位取反,並在未位加1,即反碼+1而得到補碼的補碼就是原碼 | 0110 11000 | 1001 0100 |
補碼求原碼
已知一個數的補碼,求原碼的操作分兩種情況:
如果補碼的符號位爲“0”,表示是一個正數,所以補碼就是該數的原碼。
如果補碼的符號位爲“1”,表示是一個負數,求原碼的操作可以是:符號位爲1;其餘各位取反,然後再整個數加1。
補碼加、減運算公式
在做補碼加減法時,只需將符號位和數值部分一起參與運算,並且將符號位產生的進位丟掉即可。
補碼加法公式
[X+Y]補 = [X]補 + [Y]補
補碼減法公式
[X-Y]補 = [X]補-[Y]補 = [X]補 + [-Y]補
其中:[-Y]補稱爲負補,求負補的辦法是:對補碼的每一位(包括符合位)求反,且未位加1.
假設字長爲8的計算機sbyte類型所能表示的最大數是11111111,若再加1稱爲100000000(9位),但因只有8位,最高位1自然丟失。又回了00000000,所以字長爲8的二進制系統的模爲2^8。
思考題1:內存中如果看0xFF,這個數一定是255嗎?
不一定,如果是無符號數,纔是255. 在計算機中,負整數就是由補碼存儲的。
例如 5-1,即5+(-1)
0000 0101 -->5的原碼
1111 1111 -->-1的補碼
---------------------------
0000 0101 --結果是4 (溢出位刪除)
運算符
比較運算符
支持鏈式比較: 4>3>2
成員運算符
in, not in
身份運算符
is , is not
位運算
&: 位與;
|:位或
^:異或
<<:左移
>>: 右移
~:按位取反,包括符號位
內存操作會用到,舉例5&3=1:
0000 0101
0000 0011 &與
----------------
0000 0001
5|3=7:
0000 0101
0000 0011 |或
----------------
0000 0111
5^3=6:
0000 0101
0000 0011 |異或,相異出一
----------------
0000 0110
~12 =-13
0000 1100 12
1111 0011 取反(計算機存儲的是這個)
---------------------
1000 1101 爲給人看,出補碼的補碼,即原碼 -13
邏輯運算真值表
快速計算法 :與做乘法,或做加法(其中1+1=2->1 作爲特例)。
Python運算符優先級:算數運算>比較>邏輯;not>and>or
按照這個規則,可以很容易識別如下執行順序:
1 + 2 > 3 and 4 + 5 < 10
更詳細一點: 算術運算符>位運算符>比較運算符>邏輯
單目運算符>雙目運算符 -2 優先於 -2 < -1。
冪>乘除 2*2**3 =16
四則運算>移位>比較。
多用括號,避免閱讀歧義
(1 + 2 > 3) and (4 + 5 < 10) #簡單易懂,可以不用括號
((1 + 2 == 3) and "a" and (4 + 5 < 10) and 0) or (1 and 0) #複雜的,要用括號註釋
and 要將可以短路的0值放到前面;
or要將可以短路的1值放到最前面。
2. 表達式
內置函數
e.g.
Type
- Type是元類,即構造其它類的類
- True 是Bool類; True in int類,但不是int類。
isinstance 的用法
False等價
False 等價布爾值,相當於 bool(value)
- 空容器
-
- 空集合set
-
- 空字典dict
-
- 空列表list
-
- 空元組tuple
空字符串
None
0
Print 的sep和end
取整運算
正數負數都是
惰性對象range
前包後不包。
for i in range(1,10,2):
print(i)
range倒序輸出的實現:
for i in range(10,-1,-2):
print(i)
3. 分支和循環
分支語句
單分支 if
多分支 if …elif(elif隱含上一個if不成立的條件)
循環語句
for 循環的else子語句,在循環沒有被break的是才執行
即,被break後,不會else
for i in range(1,10,2):
print(i)
if i > 6:
break
else:
print("這句不會被執行")
>>>
1
3
5
7
3. 線性表
線性表的類別
- 順序表:使用一大塊連續內存順序存儲的元素,這樣的成爲順序表。
- 鏈表:是線性結構的線性表,內存分佈上看着不連續,但是內部有指向,所以它是有明確的順序的。
3.1 Python列表的操作
列表操作原理
詳見: https://blog.csdn.net/pagean/article/details/104999730
3.2 Python元組的操作: 待撰
3.3 Python字典的操作 :待撰
3.4 Python集合的操作:待撰
Python入門測試
詳見: https://blog.csdn.net/pagean/article/details/105043990