2017年10月6日
終于算完了,趁著十一草草看完峦嗤,性價比不高不低吧蕊唐,有些困惑的問題得到了解決所以還是很值得的,尤其是可變變量那塊烁设。數(shù)據(jù)結(jié)構(gòu)和算法一章最為粗糙刃泌,計劃換本專門的書看。
記錄一些程序設(shè)計/Python中的新知識或比較重要的理念
目錄
- 基本元素
- 函數(shù)和模塊
- 面向?qū)ο蟮某绦蛟O(shè)計
- 算法和數(shù)據(jù)結(jié)構(gòu)
第一章 程序設(shè)計的基本原色
1.控制臺中運行Python文件
2.Python程序開發(fā)流程
3.使用分號(;)可以在一行書寫多條語句,不建議使用
4.SyntaxError:編譯錯誤
5.數(shù)據(jù)類型:一種數(shù)據(jù)類型是一系列值以及為這些值定義的一系列操作方法的集合
6.字面量(Literal)_數(shù)據(jù)類型的值耙替;標識符(Identifier)大小寫敏感;常量(Constant variable)約定全大寫
7.Python中所有的數(shù)據(jù)都表示為對象及對象之間關(guān)系
8.+號連接字符串進行字符串拼接
9.數(shù)據(jù)類型顯示變換:str(),int(),float()
10.Python賦值過程中的綁定關(guān)系2芴濉K咨取!【后邊的列表更為明顯】
11.Python語言中箕别,int的取值范圍可以為任意大
12.優(yōu)先級:算數(shù)>比較>布爾铜幽;not>and>or
13.math.log()默認底數(shù)為自然常數(shù)e
14.Python內(nèi)部采用Unicode編碼存儲
15.Python用三個引號表示多行字符串
16.Python的余數(shù)和被除數(shù)同號,實現(xiàn)b*(a//b)+a%b==a
17.應(yīng)當避免比較兩個浮點數(shù)的相等性
18.round()函數(shù)做四舍五入串稀。實際上是四舍六入五成雙
19.id(a);type(a);repr(a);分別取地址除抛、類型和值
20.Python支持任意長度的鏈式比較運算、任意長度的鏈式賦值語句
21.Python語言中母截,語句塊取決于縮進的空白字符的個數(shù)到忽,通常采用4個空格縮進
22.i+=1 √
23.應(yīng)用實例:①調(diào)和數(shù)計算;②牛頓法求平方根清寇;③數(shù)制轉(zhuǎn)換喘漏;④蒙特卡洛模擬;⑤整數(shù)的因子分解华烟;
24.多行書寫:括號內(nèi)直接換行翩迈;無括號行位加反斜杠
25.Python支持break,continue,pass;不支持switch,goto盔夜;【path用于限制是否“通過”繼續(xù)執(zhí)行】
26.while可以實現(xiàn)任何循環(huán)负饲,for語句只能實現(xiàn)固定計數(shù)的循環(huán)
27.數(shù)據(jù)結(jié)構(gòu):是一種用于計算機程序處理的數(shù)據(jù)組織方式
28.“差一錯誤”(off-by one error),表示因數(shù)組索引從0開始而引起的超出索引錯誤
29.別名:當兩個變量指向同一個對象時喂链,則互為“別名”
簡單說即——x返十、y引用同一個數(shù)組,x修改數(shù)組衩藤,則y也會改變
30.數(shù)組的復(fù)制操作——數(shù)組切片吧慢。y=x[:],簡潔赏表,開銷大
31.數(shù)組的4個核心操作:創(chuàng)建數(shù)組检诗、索引訪問、索引賦值瓢剿、迭代遍歷
32.厄拉多塞素數(shù)篩選法(Sieve of Eratosthenes)逢慌,P118
33.數(shù)組的負數(shù)下標,a[-i]=a[len(a)-i]
34.a[i:j]=a[i,j)间狂,左閉右開
35.隨機沖浪模型(randome surfer model)攻泼,P187,頁面排名(the page's rank),馬爾科夫鏈(Markov chain)
36.補:條件/循環(huán)等程序塊的縮寫忙菠,可以直接追加到冒號同行后面
第二章 函數(shù)和模塊
1.在計算任務(wù)中何鸡,任何時候只要可以清晰地分離任務(wù),則建議使用函數(shù)分離任務(wù)
2.函數(shù)定義
3.函數(shù)定義位置必須位于調(diào)用該函數(shù)的全局代碼之前牛欢÷饽校∴Python程序結(jié)構(gòu)依次為①import;②函數(shù)傍睹;③全局
4.函數(shù)的副作用隔盛,指函數(shù)內(nèi)產(chǎn)生的輸入、輸出拾稳、改變系統(tǒng)狀態(tài)情況吮炕;應(yīng)盡量避免
5.多態(tài)性polymorphism,同名不同參
6.不可變數(shù)據(jù)類型:int float str bool访得,對于不可變對象的修改龙亲,看似改了值,實際上創(chuàng)建了新的對象
7.函數(shù)的形參震鹉、實參互為別名
8.一個以數(shù)組為參數(shù)俱笛,對數(shù)組進行修改的函數(shù),其修改的是數(shù)組本身而不是副本
9.Python語言不支持函數(shù)重載的編程語言传趾,通常使用默認參數(shù)來實現(xiàn)
10.Python在函數(shù)定義時對默認參數(shù)只求值一次迎膜,并不是每次調(diào)用都求一次
11.Python程序可以看做是一系列文件,每個文件是一個獨立的模塊浆兰,每個模塊包含若干函數(shù)
12.模塊module:模塊包含可被其他程序調(diào)用的函數(shù)磕仅;客戶端client:客戶端是調(diào)用其他模塊中的函數(shù)的程序
13.Python語言的傳統(tǒng)是把測試代碼放在名為main()的函數(shù)中
14.Python的import語句會執(zhí)行導(dǎo)入模塊中的所有全局代碼(包括函數(shù)定義),所以模塊中不能遺留全局代碼簸呈,采用main()的方法進行測試榕订,即“單元測試”
15.模塊設(shè)計的指導(dǎo)性原則:為客戶端提供需要的函數(shù),不要包含其他多余的內(nèi)容
16.按照慣例蜕便,使用下劃線開始的函數(shù)名作為私有函數(shù)劫恒,表示不應(yīng)直接調(diào)用這個函數(shù)(實際可以做到)
17.隨機過程的迭代案例:①謝爾賓斯基三角形(Sierpinski triangle);②巴恩斯利蕨(Barnsley fern)轿腺;
18.第一次導(dǎo)入模塊時两嘴,Python編譯代碼并把結(jié)果保存到.pyc文件中,再次調(diào)用無需重新編譯
19.遞歸案例:①歐幾里得法求最大公約數(shù)族壳;②漢諾塔問題憔辫;③格雷碼;④遞歸圖形H-樹仿荆;⑤布朗橋
20.使用遞歸代碼創(chuàng)建的數(shù)組會占用大量內(nèi)存
第三章 面向?qū)ο蟮某绦蛟O(shè)計
1.在一個計算中贰您,當數(shù)據(jù)和相關(guān)的計算任務(wù)可以清楚地分開時坏平,則必須分開
2.定義新的數(shù)據(jù)類型并處理包含數(shù)據(jù)類型值得對象的能力成為數(shù)據(jù)抽象(data abstraction)
3.函數(shù)與方法類似,函數(shù)調(diào)用通常使用一個模塊名锦亦,而方法調(diào)用使用變量名
4.一個對象具有三個標準屬性:標識舶替、類型、值(狀態(tài))
標識(identity):其在計算機內(nèi)存中的存儲位置孽亲,唯一標示該對象
類型(type):對象類型
值(value):對象當前表示的數(shù)據(jù)類型的值
5.按慣例坎穿,內(nèi)置數(shù)據(jù)類型以小寫字母開始,而用戶自定義數(shù)據(jù)類型以大寫字母開始
6.沒有任何引用指向的對象返劲,成為孤立對象(Orphaned object),系統(tǒng)會自動重用其占據(jù)的內(nèi)存
7.其他程序員手動操作內(nèi)存管理時栖茉,忘記釋放孤立對象所占據(jù)內(nèi)存空間的錯誤成為內(nèi)存泄漏(Memory leak)
8.不允許在類/數(shù)據(jù)類型中定義兩個同名的方法篮绿,重載使用默認參數(shù)
9.API,應(yīng)用程序編程接口是所有客戶端之間的契約吕漂。
10.使用類來實現(xiàn)一個數(shù)據(jù)類型亲配,三個部分:一個構(gòu)造函數(shù)、若干實例變量惶凝、若干方法
構(gòu)造函數(shù)init()吼虎,方法potentialAt(),內(nèi)置函數(shù)str()苍鲜,測試函數(shù)main()
11.可使用init()作為構(gòu)造函數(shù)思灰,只能在其中定義和初始化實例變量,返回指向新對象的一個引用混滔,self參數(shù)指向新建對象
12.方法中的變量包括——實例變量洒疚、參數(shù)變量、局部變量
13.海龜繪圖(Turtle graphic)遞歸圖形:科赫曲線(Koch curve)坯屿、等角螺旋(Spira mirabilis)油湖、布朗運動(Brownian motion)、曼德布洛特集合(Mandelbrot set)
14.將客戶端和實現(xiàn)分離開從而隱藏信息的過程稱為“封裝”——使用一個數(shù)據(jù)類型無需理解其具體實現(xiàn)——使用一個程序替代另一個程序而無需修改客戶端代碼
15.未使用封裝引起的問題案例:Y2K問題领跛、郵政編碼問題乏德、IPv4和IPv6
16.初始化對象的參數(shù)為一個可變對象時(如數(shù)組),應(yīng)在初始化時進行拷貝(如self._c=a[:])吠昭,否則客戶端能繞過對象修改數(shù)組
17.Python的內(nèi)置數(shù)據(jù)類型元組tuple喊括,創(chuàng)建之后其元素不可被修改,可以使用元組組包怎诫、元組解包
18.OOP瘾晃,①封裝:黑盒;②多態(tài):單接口幻妓、多方法蹦误;③繼承:獲取另一個對象的屬性的過程
19.特殊方法劫拢,以內(nèi)置函數(shù)為例,當客戶端調(diào)用str(x)時强胰,會先看x對象有沒有str()方法舱沧,并調(diào)用之
20.引用相等:is/is not ,表示引用地址相等偶洋;對象相等:==/!=熟吏,表示值相等,如果有eq()方法的話
21.Python中一切皆對象玄窝,函數(shù)也是牵寺,函數(shù)可作為函數(shù)的參數(shù)和返回值
22.異常時程序運行時發(fā)生的破壞性事件,通常表示一種錯誤恩脂。
23.斷言時在程序某個位置確定應(yīng)該為True時的一個布爾表達式帽氓,通常用于調(diào)試,默認開啟俩块,可關(guān)黎休。
第四章 算法和數(shù)據(jù)結(jié)構(gòu)
1.增長量級
2.Python可變數(shù)組的擴容機制——以倍增和減半策略保證可變數(shù)組的25%~100%的使用量
3.攤銷分析,對常量型操作的總成本除以操作次數(shù)得到一個常量玉凯,是為攤銷分析
4.Python字符串和數(shù)組相似势腮,區(qū)別在于——字符串是不可變對象
5.Python靈活,帶內(nèi)存消耗大漫仆,最重要的功能特征之一就是內(nèi)存分配系統(tǒng)捎拯,設(shè)計目標是減輕管理內(nèi)存的繁重工作
6.緩存,Python為一個值僅創(chuàng)建一個對象拷貝歹啼,包括True玄渗、False、[-5,256]
7.調(diào)用一個函數(shù)時狸眼,系統(tǒng)從棧(stack)中分配函數(shù)所需內(nèi)存藤树,用于函數(shù)的局部變量;創(chuàng)建一個對象時拓萌,系統(tǒng)從堆(heap)中分配內(nèi)存岁钓。
8.每個用戶自定義類型的對象可能消耗大量的內(nèi)存。