KANIKIG

KANIKIG

just for fun | 兴趣使然 Ph.D. in Engineering|❤️ #NFT $ETH| [Twitter](https://twitter.com/kanikig2)|[Github](https://github.com/KANIKIG)|[Telegram channel](https://t.me/kanikigtech)

Python全棧學習筆記

image

課程介紹#

階段一:基礎到高級#

三個項目

  • ATM + 購物車:面向過程
  • 選課系統:面向對象
  • 計算機病毒:程序、服務端、客戶端

階段二:商業項目#

  • BBS
  • 路飛學城
  • 微信小程序
  • 爬蟲
  • 數據分析:金融量化交易
  • 自動化運維:cmdb、代碼發布
  • GO 語言開發
  • 人工智能方向

計算機#

計算機五大組成#

dcc451da81cb39dbf8fed5fad5160924ab18305b.jpg

  • CPU 中央處理器
    • 控制器:控制所有其他組件
    • 運算器:數學運算與邏輯運算
  • 存儲器 io 設備:數據存取
    • 內存:基於電,斷電丟失數據,用於臨時存取
    • 外存:硬盤,基於磁,存取慢,永久保存
  • 輸入設備:鍵盤鼠標
  • 輸出設備:顯示器打印機

操作系統#

概念#

  • 控制計算機硬件
  • 硬件的複雜操作封裝

軟件

  • 應用軟件
  • 系統軟件

計算機體系三層結構#

  • 應用程序
  • 操作系統
  • 計算機硬件

平台與跨平台#

平台:

  • 操作系統
  • 計算機硬件

其他#

程序與三大核心硬件#

程序:硬盤 -> 內存

cpu 從內存讀取指令執行

cpu 詳解#

cpu 分類與指令集#
  • X86-32bit:intel
  • x86-64bit:AMD

指令集,就是 CPU 中用來計算和控制計算機系統的一套指令的集合

  • 精簡指令集 RISC:指令短,穩定
  • 複雜指令集 CISC:指令長,豐富
X86-64#
  • x86:intel 發明世界第一個 cpu8086,故將這種架構型號統稱為 x86。

  • 64 位:cpu 能一次性從內存中取出多少位二進制指令。

cpu 有向下兼容性。

寄存器#

和 cpu 同材質,速度比內存快。存 cpu 要用的關鍵數據,提升 CPU 取數據的速度。

內核態與用戶態#

兩種程序

  • 操作系統:內核態,調用控制硬件的指令集與運算指令集
  • 應用程序:用戶態,只調用運算相關指令集

故兩種狀態頻繁切換。

多線程與多核芯片#

moore 定律。

單核雙線程,即一個 cpu 幹兩個 cpu 的工作,偽並行,假雙核。

4 核 8 線程:每個 cpu2 線程。

  • intel:所有核調用一個 L2 緩存
  • AMD:每個核分配單獨 L2 緩存

存儲器 io 相關#

  • 寄存器 L1:32 位 32x32,64 位 64x64
  • 高速緩存 L2:cpu 先在高速緩存找,高速緩存命中,未命中再找內存
  • 內存
  • 磁盤
  • 磁帶

速度快 - 慢

RAM#

隨機存取存儲器

ROM#

只讀內存,速度和內存一樣。故一般用於出廠關鍵程序存儲,例如 BIOS

CMOS#

也是易失性。速度慢。耗電極低。主板有個主板電池,給時鐘芯片供電,計算後存到 cmos

磁盤結構#

v2-dc762f4e4037b261d0134171213c94a0_1440w.jpg

硬盤:

  • 機械硬盤,即磁盤,依賴於機械轉動。
    • 磁道:一圈數據 bit(二進制位)-Byte(字節)-kB,實際上硬盤廠商是按 1000 記位
    • 扇區:512 字節,即硬盤一次性讀寫最小單位。操作系統一次讀取一個 block,即 8 個扇區 = 4096 字節
    • 柱面:相同半徑的磁道疊在一起形成虛擬柱面
    • 分區:即兩個柱面之間的部分
  • 固態硬盤
IO 延遲#

硬盤讀寫速度很快,慢是在找數據的時間。

  • 平均尋道時間
  • 平均延遲時間:最低為硬盤轉半圈的時間

io 延遲為以上兩者之和。

優化程序核心方法就是減少從硬盤讀寫,儘量從內存。

虛擬內存 swap#

物理內存不足時在磁盤上劃取。會帶來 io 延遲。

IO 設備#

包含

  • 設備控制:驅動程序
  • 設備本身

總線#

連接主板上各組件交互。

t01696027505b77ec8c.jpg

  • PCI 橋:北橋,連接高速設備
  • ISA 橋:南橋,連接慢速設備

操作系統啟動流程#

BIOS: Basic Input Output System,出廠被寫入 ROM 設備。

啟動流程:

  1. 計算機加電
  2. BIOS 運行監測硬件正常
  3. BIOS 讀取 CMOS 存儲器的參數,選擇啟動設備
  4. 從啟動設備上讀取第一個扇區的內容(MBR 主引導記錄 512 字節,前 446 位引導信息,後 64 為分區信息,最後兩個為標誌位)
  5. 根據分區信息讀入 BootLoader 啟動裝載模塊,啟動操作系統
  6. 操作系統詢問 BIOS 獲得配置信息,加載驅動。

Python 入門#

編程語言介紹#

  1. 機器語言
  2. 匯編語言
  3. 高級語言
    1. 編譯型:c->gcc 編譯器 -> 機器語言,執行效率高
    2. 解釋型:py-> 字節碼 -> 解釋器(一行一行)-> 機器,跨平台性強

python 介紹#

  • 解釋型
  • 語法風格:PEP8 規範

解釋器#

解釋器可以用任意語言寫,CPython,Jpython。

2.6-2008

2.7-2010 後推出的過渡版本

3.0-2008

3.1-2009

3.2-2011

運行 python 程序的兩種方式#

  • 交互式
  • 腳本

程序運行三步驟#

  1. 啟動解釋器
  2. 解釋器讀取 py 進內存
  3. 解釋器解釋執行

變量與基本數據類型#

變量#

三大組成部分#

變量名  賦值符號  變量名

變量名#

推薦小寫加下劃線

變量值三個特徵#

  • id:變量值的內存地址
id()
  • type
type()
  • value

可變與不可變類型#

  • 可變類型:改 value,內存地址 id 不變
    • set
    • list
    • dict
  • 不可變:改 value,id 也變
    • number
    • bool
    • string
    • tuple

is 與 ==#

  • is 比較的是左右變量的內存地址是否相同
  • == 比較變量值

小整數對象池#

從解釋器啟動會在內存中事先申請一系列內存空間存放常用整數(-5, 256)

IDE 的小整數池會更大。

常量#

python 語法沒有常量概念!

全大寫代表常量,只是一種規範寫法,實際還是變量。

基本數據類型#

字符串#

單、雙、三引號定義均可,嵌套時单双應相反,或轉義

print('-' * 10)
# -----------

列表#

內存中存的是值的內存地址,不存值!

如果 list2 = list1,即兩者指向同一個堆,改變值,兩個都會改。

深淺拷貝

  • 淺拷貝:將列表第一層內存地址拷貝,但若有可變類型,還是會連在一起
list2 = list1.copy()
  • 深拷貝:完全獨立拷貝一份,不可變類型 id 不變,可變類型 id 改變
import copy
list3 = copy.deepcopy(list1)

字典#

a = {
  "key":"value"
	"1":1,
  "2":"qwe"
}

垃圾回收機制 GC#

引用計數#

垃圾:變量值沒有綁定變量名

引用計數:綁定某值的變量個數,python 會清除計數為 0 的值

del x	# 解除變量與值的綁定

直接引用,間接引用

標記清除#

循環引用問題,可能導致內存泄漏

內存棧區存變量名,堆區存值

分代回收#

多次掃描都沒有被回收的變量,會認為是常用變量,對他的掃描頻率會降低

用戶交互#

輸入#

input() # 存為str

# python2
raw_input()	# 存為str
input()	# 要求用戶輸入明確數據類型,輸入的是什么類型就為什么類型

格式化輸出#

  • % 格式化輸出
print("name: %(name)s, age:%(age)d" % {"name": "a", "age": 10})
# %s可以接受任何類型
  • str.format
print("name: {name}, age:{age}".format(name = "a", age = 10))
  • f
print(f"name: {name}, age:{age}")

基本運算符#

算數運算符#

10 // 3	#只保留整數部分,即整除
3 ** 10	#指數
10 % 3 #取餘數

比較運算符#

1 != 2
1 < x < 3

賦值運算符#

  • 變量賦值
a = 1
  • 增量賦值
 a += 1
 b *= 1
  • 鏈式賦值
z = y = x = 10 
  • 交叉賦值
m, n = n, m
  • 解壓賦值
list = [1, 2, 3, 4]
a, b, c, d = list
x, y, *_ = list	#取前兩個
*_ , x, y = list	#取後兩個
# 字典解壓取值的是key

邏輯運算符#

隱式布爾:所有值,除了 0,None, False,Null,空值 都是 True

優先級 not>and>or

短路運算:從左至右讀取條件,連續 and 有一個 false 就不再往右讀,並返回該位置的值

成員運算符 in#

"a" in "abc"
1 in [1, 2, 3]

身份運算符 is#

流程控制#

if#

if 16 < a < 20:

elif 條件從上到下,上面的不滿足才進下個條件

while#

條件循環

while+else#

循環正常結束,沒有被 break,運行 else

while True:
	...
else:
	...

for#

迭代循環

for variable in Iterable object:
	...
  

for i in range(1, 100):
	...
  

for+else#

range#

# py2
>>> range(0, 5)
[0, 1, 2, 3, 4]
#py3 優化
>>> range(0,5)
range(0,5)

print#

print("hello", end="*")	# 自定義結束,默認為換行

基本數據類型及內置方法#

數字類型#

int#

python3 沒有 long 長整型了

int('10')
bin(11) # 0b1011  0b開頭即二進制
oct(11) # 0o13	8進制
hex(11)	# 0xb	16進制
int(int('0b1011', 2))	# 二進制轉10進制

float#

float('11')

虛數#

x = 10 + 2j
x.real	#10
x.imag	#2

字符串#

# 不可變,是一個整體,不可單獨改某個字符
str(10)
msg = "hello"

# 切片
msg[0] # h
msg[-1] # o
msg[0:5] # hello 顧頭不顧尾
msg[0:5:2] # hlo
msg[5:0:-1] # olle

"alex" in ”alexxxx"	# true
"alex" not in ”alexxxx"	# false

msg = "    eee   "
res = msg.strip()	# 默認去除兩邊空格 字符串不可變,故需要新賦值
msg = "***eee***"
res = msg.strip(“*”)  # strip只去兩邊,不去中間
res = msg.lstrip()
res = msg.rstrip()

# 切分:按某字符分割字符串,返回列表
res = msg.split(":", 1) # 默認按空格為分隔符 分割次數,從左往右算
res = msg.lsplit(":", 1)
res = msg.rsplit(":", 1) #從右往左

res2 = ":".join(res) # 以:為分隔符拼接

res = msg.lower() # 小寫
res = msg.upper()
res = msg.startswith("aaa") # True 以什麼開頭
res = msg.endswith("aaa")
res = msg.replace("you", "me" ,1) #字符串替換,次數

123”.isdigit() # 純數字

msg.find("e") # 返回索引,找不到返回-1
msg.index("e") # 返回索引,找不到程序報錯
msg.count("e") # 數子串出現次數
"分割線".center(50, "*") #兩側用*填充
"分割線".ljust(50, "*") #右側填充
"分割線".rjust(50, "*")
"分割線".zfill(50) # 左側用0填充

# is 判斷系列 查文檔
isalpha()
isdigit()
isdecimal() # 只識別阿拉伯數字 py3 默認unicode
isnumeric() # 可以識別漢字,阿拉伯數字

列表#

元組#

字典#

集合#

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。