課程介紹#
階段一:基礎到高級#
三個項目
- ATM + 購物車:面向過程
- 選課系統:面向對象
- 計算機病毒:程序、服務端、客戶端
階段二:商業項目#
- BBS
- 路飛學城
- 微信小程序
- 爬蟲
- 數據分析:金融量化交易
- 自動化運維:cmdb、代碼發布
- GO 語言開發
- 人工智能方向
計算機#
計算機五大組成#
- 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
磁盤結構#
硬盤:
- 機械硬盤,即磁盤,依賴於機械轉動。
- 磁道:一圈數據 bit(二進制位)-Byte(字節)-kB,實際上硬盤廠商是按 1000 記位
- 扇區:512 字節,即硬盤一次性讀寫最小單位。操作系統一次讀取一個 block,即 8 個扇區 = 4096 字節
- 柱面:相同半徑的磁道疊在一起形成虛擬柱面
- 分區:即兩個柱面之間的部分
- 固態硬盤
IO 延遲#
硬盤讀寫速度很快,慢是在找數據的時間。
- 平均尋道時間
- 平均延遲時間:最低為硬盤轉半圈的時間
io 延遲為以上兩者之和。
優化程序核心方法就是減少從硬盤讀寫,儘量從內存。
虛擬內存 swap#
物理內存不足時在磁盤上劃取。會帶來 io 延遲。
IO 設備#
包含
- 設備控制:驅動程序
- 設備本身
總線#
連接主板上各組件交互。
- PCI 橋:北橋,連接高速設備
- ISA 橋:南橋,連接慢速設備
操作系統啟動流程#
BIOS: Basic Input Output System,出廠被寫入 ROM 設備。
啟動流程:
- 計算機加電
- BIOS 運行監測硬件正常
- BIOS 讀取 CMOS 存儲器的參數,選擇啟動設備
- 從啟動設備上讀取第一個扇區的內容(MBR 主引導記錄 512 字節,前 446 位引導信息,後 64 為分區信息,最後兩個為標誌位)
- 根據分區信息讀入 BootLoader 啟動裝載模塊,啟動操作系統
- 操作系統詢問 BIOS 獲得配置信息,加載驅動。
Python 入門#
編程語言介紹#
- 機器語言
- 匯編語言
- 高級語言
- 編譯型:c->gcc 編譯器 -> 機器語言,執行效率高
- 解釋型:py-> 字節碼 -> 解釋器(一行一行)-> 機器,跨平台性強
python 介紹#
- 解釋型
- 語法風格:PEP8 規範
解釋器#
解釋器可以用任意語言寫,CPython,Jpython。
2.6-2008
2.7-2010 後推出的過渡版本
3.0-2008
3.1-2009
3.2-2011
運行 python 程序的兩種方式#
- 交互式
- 腳本
程序運行三步驟#
- 啟動解釋器
- 解釋器讀取 py 進內存
- 解釋器解釋執行
變量與基本數據類型#
變量#
三大組成部分#
變量名 賦值符號 變量名
變量名#
推薦小寫加下劃線
變量值三個特徵#
- 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() # 可以識別漢字,阿拉伯數字