基礎(chǔ)語法:
一.馮諾依曼體系架構(gòu):
五大部件:
CPU:包括運(yùn)算器和控制器,CPU只和一件設(shè)備,內(nèi)存打交道。
運(yùn)算器:是完成各種數(shù)學(xué)運(yùn)算的,邏輯運(yùn)算,數(shù)據(jù)傳輸?shù)葦?shù)據(jù)加工處理。數(shù)據(jù)是通過總線傳輸,總線則是使用電信號傳輸。
控制器:是用于控制程序的執(zhí)行。
存儲器:用于記憶程序和數(shù)據(jù),例如內(nèi)存(缺點(diǎn):掉電易失數(shù)據(jù))
輸入設(shè)備:將數(shù)據(jù)或者程序數(shù)據(jù)傳輸?shù)接?jì)算機(jī)中,例如鍵盤,鼠標(biāo)。
輸出設(shè)備:將數(shù)據(jù)或者程序的處理結(jié)果展示給用戶,例如顯示顯示器,打印機(jī)。
CPU有三級cache,寄存器,cpu臨時(shí)要計(jì)算的數(shù)據(jù)存儲在寄存器中,寄存器的頻率和CPU幾乎同頻率的運(yùn)算頻率,多級緩存則逐級遞減。
高級語言和低級語言之間需要一個(gè)轉(zhuǎn)換的工具:編譯器,解釋器。
編譯語言:把源代碼轉(zhuǎn)換成目標(biāo)機(jī)器的CPU指令。例如:C,C++。
解釋語言:解釋后轉(zhuǎn)換成字節(jié)碼,運(yùn)行在虛擬機(jī)上,解釋器執(zhí)行中間代碼(bytecode)。例如:java,python,C#等語言。
二.程序:算法 + 數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)是一切程序的核心
數(shù)據(jù)結(jié)構(gòu)是數(shù)據(jù)在計(jì)算機(jī)中的類型和組織方式
算法是處理數(shù)據(jù)的方式,算法有優(yōu)劣之分
算法運(yùn)行時(shí)間并不以秒為單位,算法運(yùn)行時(shí)間是從其增速的角度度量的。
python語言類型:
python是動態(tài)語言、強(qiáng)類型語言。
python中:賦值即定義,如果一個(gè)變量已經(jīng)定義,賦值相當(dāng)于重新定義。(動態(tài)語言的特性)
語言的分類:
- 靜態(tài)編譯語言:
事先聲明變量類型,類型不能再改變
編譯時(shí)檢查 - 動態(tài)編譯語言:
不用事先聲明類型,隨時(shí)可以賦值為其他類型
編程時(shí)不知道是什么類型,很難推斷。 - 強(qiáng)類型語言:
- 不同類型之間的操作,必須先強(qiáng)制類型轉(zhuǎn)換為同一類型。例:print('a'+1)
弱類型語言: - 不同類型之間操作,自動隱式轉(zhuǎn)換,Javascript中console.log(1,+'a')
- 不同類型之間的操作,必須先強(qiáng)制類型轉(zhuǎn)換為同一類型。例:print('a'+1)
重點(diǎn):什么是動態(tài)語言,什么是強(qiáng)類型語言,強(qiáng)弱怎么區(qū)分?
強(qiáng)弱是一個(gè)相對概念,用一個(gè)字符串加上一個(gè)數(shù)字就可判定。
python解釋器:
官方Cpython:c語言開發(fā),廣泛的python解釋器
IPython:一個(gè)交互式,功能增強(qiáng)的Cpython
PyPy:python語言寫的python解釋器,JIT(jist type)技術(shù),動態(tài)編譯python代碼。(效率比cpython高)。
Jython:python的源代碼編譯成java的字節(jié)碼,跑在JVM上。
IronPython:與Jython類似,運(yùn)行在.net平臺上的解釋器,python代碼被編譯成.net的字節(jié)碼。
重點(diǎn):你知道那些python解釋器?
運(yùn)算符優(yōu)先級:
- 算術(shù)運(yùn)算符 > 位運(yùn)算符 > 身份運(yùn)算符 > 成員運(yùn)算符 > 邏輯運(yùn)算符 > 賦值運(yùn)算符
- 單目運(yùn)算符 > 雙目運(yùn)算符
(JVM、PVM)內(nèi)存管理:
- 變量無須事先聲明,也不需要指定類型(動態(tài)語言的特性)
- python編程中一般無須關(guān)心變量的存亡,一般也不用關(guān)心內(nèi)存的管理。
- python使用引用技術(shù)記錄所有對象的引用數(shù):
- 當(dāng)對象引用數(shù)變?yōu)?,它就可以被垃圾回收(GC)的自動回收機(jī)制回收(不建議手動管理,會影響性能)
- 計(jì)數(shù)增加:
賦值給其他變量就增加引用計(jì)數(shù),例如:x=3;y=x. - 計(jì)數(shù)減少:
函數(shù)運(yùn)行結(jié)束時(shí),局部變量就會被自動銷毀,對象引用計(jì)數(shù)減少
變量被賦值給其他對象。例如:x=3,y=x(3的計(jì)數(shù)加一),x=4(4的計(jì)數(shù)加一,3的計(jì)數(shù)減一)
注意:有關(guān)性能的時(shí)候,就要考慮變量的引用問題,切記盡量不要手動干預(yù),但是該釋放內(nèi)存,還是盡量不釋放內(nèi)存,看需求。
注意:垃圾回收還有包括規(guī)整,即碎片整理
- 共享引用:多個(gè)變量引用一個(gè)對象
- ==是判斷內(nèi)容是否相等
- is是判斷是否指向同一內(nèi)存空間,使用id來查看內(nèi)存地址
- 界限為256,256以下的整數(shù)已被python緩存
- 判斷一個(gè)東西有多少在引用:
import sys sys.getrefcount(4)
False等價(jià)
布爾值,相當(dāng)于bool(value)
- 空集合
- 空字符串
- 空字典
- 空列表
- 空元組
- none對象
- 0
列表、鏈表、隊(duì)列、棧的區(qū)別
重點(diǎn):
下列四者區(qū)別和特點(diǎn)
- 內(nèi)存是線性編址的。
列表list:
一個(gè)隊(duì)列,一個(gè)排列整齊的隊(duì)伍
列表中的個(gè)體稱作元素,由若干個(gè)元素組成列表
元素可是是任意對象(數(shù)字,字符串,列表,元組,對象)
列表內(nèi)元素有順序,可以使用索引。
列表可以是一個(gè)可迭代對象
列表是可變的,連續(xù)的內(nèi)存中的順序結(jié)構(gòu),通過偏移量在查詢(檢索起來快)
“有順序”“可索引”“可變”“可迭代”“線性結(jié)構(gòu)”
盡量不要使用remove和insert,比較耗時(shí)鏈表:有序的在內(nèi)存中分布散落,
查詢比列表慢,插入比列表快queue:隊(duì)列,先進(jìn)先出
不是為了遍歷stack:棧,后進(jìn)先出
元組修改
一般對于返回None的都意味著沒有新的產(chǎn)生,就都是就地修改
元組:一個(gè)有序的元素組成的集合,不可變對象
元組 + 元組,元組*數(shù)字,返回一個(gè)新元組。并不是改變原先的元組
元組是只讀的
字符串:是一個(gè)字面常量,不可變,可迭代
運(yùn)算符判斷
| 題 | -> | 結(jié)果 |
|---|---|---|
| 6 or 2 > 1 | -> | 6 |
| 0 or 5 < 4 | -> | False |
| 5 < 4 or 3 | -> | 3 |
| 2 > 1 or 6 | -> | True |
| 3 and 2 > 1 | -> | True |
| 0 and 3 > 1 | -> | 0 |
| 2 > 1 and 3 | -> | 3 |
| 3 > 1and 0 | -> | 0 |
| print(1 or 2) | -> | 1 |
| print(0 or 100) | -> | 100 |
| print(1 and 2) | -> | 2 |
| print(bool(2)) | -> | True |
| print(bool(-2)) | -> | True |
| print(bool(0) | -> | False |
方法:
- x or y x為 (True) 非零,則返回x
- x and y x (True)非零,則返回y
- 非零轉(zhuǎn)換成bool True
- 0轉(zhuǎn)換成bool是False
拓展:while 1 的效率要比 while True高,因?yàn)門ure要先轉(zhuǎn)換成1,然后再轉(zhuǎn)化成二進(jìn)制
網(wǎng)絡(luò)傳輸,big:大端模式,
低字節(jié)放在高地址上就是大端模式
高字節(jié)放到低地址上就是小端模式
Windows小端模式 mac大端模式
python上下文:使用with方法不用每次都手動關(guān)閉文件
with open("file.xxx") as f:
for line in f.readlines():
print(line)
使用二進(jìn)制寫文件可以使用一個(gè)模塊
寫:pickle.dump(word,file)
讀:pickle.load(file)
封裝和解構(gòu):
封裝:
將多個(gè)值使用逗號分隔,結(jié)合在一起
本質(zhì)上返回了一個(gè)元組,只是省略了小括號
t1 = (1,2) # 定義為元組
t2 = 1,2 #將1,2封裝成元組解構(gòu)
把右邊的元素解開,并順序的賦給其他變量
左邊接納的變量數(shù)要和右邊解開的元素個(gè)數(shù)一致
使用*變量名接收,但不能單獨(dú)使用,被*變量名收集后組成一個(gè)列表
例如: head,*mid,tail = "abcdefghijklmnopqrstuvwxyz"
例:
temp = a
a = b
b = temp
等價(jià)于
a , b = b , a
等號右邊使用了封裝,而左邊使用了解構(gòu)
set和線性結(jié)構(gòu)
- 線性結(jié)構(gòu)的查詢時(shí)間復(fù)雜度是O(n),即隨著數(shù)據(jù)規(guī)模的增大而增大
- set、dict等結(jié)構(gòu),內(nèi)部使用hash值作為key,時(shí)間復(fù)雜度為O(1),查詢時(shí)間與數(shù)據(jù)規(guī)模無關(guān)。
- set的元素要求必須可哈希
可變的數(shù)據(jù)結(jié)構(gòu)不可哈希
元素不可索引
set可以迭代 - 線性結(jié)構(gòu):
- 可迭代 for ... in
- len()可以獲取長度
- 通過下標(biāo)可訪問
- 可以切片
- 包括:列表、元組、字符串、bytes、bytearray
不可變對象:元素、字符串、bytes - 可hash對象:
數(shù)值型:int、float、complex
布爾型:True、False
字符串:string、bytes
tuple,None
以上都為不可變類型 - 可變類型:list,dict,bytearray
- 可迭代對象
- 能夠通過迭代一次次返回不同的元素的對象。
- 所謂相同,不是指值是否相同,而是元素在容器中是否是同一個(gè),例如列表中值可以重復(fù)的,['a', 'a'],雖然這個(gè)列表有2個(gè)元素,值一樣,但是兩個(gè)'a'是不同的元素
- 可以迭代,但是未必有序,未必可索引
- 可迭代對象有:list、tuple、string、bytes、bytearray、range、set、dict、生成器等
- 可以使用成員操作符in、not in,in本質(zhì)上就是在遍歷對象
字典的遍歷和移除:不能直接遍歷刪除字典,要使用一個(gè)容器記錄一個(gè)這個(gè)字典的key,然后通過遍歷key來從字典中刪除。
權(quán)限判定可以將弄成集合加載到內(nèi)存中進(jìn)行集合計(jì)算,速度要比在數(shù)據(jù)庫中操作對比快得多。比如說微博的redis
OrderedDict
有序字典可以記錄元素插入的順序,打印的時(shí)候也是按照這個(gè)順序輸出打印
3.6版本的Python的字典就是記錄key插入的順序(IPython不一定有效果)-
應(yīng)用場景:
- 假如使用字典記錄了N個(gè)產(chǎn)品,這些產(chǎn)品使用ID由小到大加入到字典中
- 除了使用字典檢索的遍歷,有時(shí)候需要取出ID,但是希望是按照輸入的順序,因?yàn)檩斎腠樞蚴怯行虻?/li>
- 否則還需要重新把遍歷到的值排序