前言
學習是一個循序漸進的過程,不在於你學了多少,而在於你學會了多少。(裝個b好吧,hhhh)
知識總結
之前一直想在網上找一個總結好的筆記,但是一直都沒有找到,因此下定決心要總結一下,里面的都是在學習的過程中學到的一些最基礎的一些概念啊,類型啊,方法啊之類的額,真的是花費了不少的時間,當然大佬請繞過好吧。。

1 概念 2 1. 編程 3 語言是一個事物與另外一個事物溝通的介質,編程語言是程序員與計算機溝通的一個介質。 4 編程就是程序員用計算機能夠理解的表達方式(編程語言)來講自己的思維邏輯寫下來的一個過程。 5 編程的結果就是產生了一堆的文件,我們把這些文件稱之為軟件或者程序。 6 2. cpu, 內存,硬盤 7 cpu,內存,硬盤統稱為計算機的三大核心硬件。cpu主要主要用來計算,內存和硬盤用來存儲。出現兩種存儲硬件的格式主要是因為cpu的計算速度很快,而硬盤的 8 讀寫速度很慢,為了更加高效的利用cpu的資源就出現了一種中間的存儲也就是內存。但是內存不能持久化存儲,斷電易丟失。因此,在讀取數據的時候就出現了 9 這樣一種現象,數據從硬盤讀取到內存,然后通過cpu操作內存來實現一系列的操作。 10 3. 運行程序,硬件的工作過程 11 1. 程序保存在硬盤中 12 2. 程序要運行必須先加載到內存 13 3. cpu從內存中讀取指令,然后翻譯執行 14 4. 進制之間的轉換 15 名詞:bit,Bytes, KBytes, MBytes, GBytes, TBytes 16 1Bytes = 8bit 17 1KBytes = 1024Bytes 18 1MBytes = 1024KBytes ...依次類推 19 5. 操作系統 20 操作系統是一個協調\管理\控制計算機硬件資源與軟件資源的一個控制程序。可以把復雜的硬件操作封裝成簡單的功能接口用來給用戶或者應用程序使用, 21 以及合理的管理應用程序之間的資源分配。 22 6. 編程語言的分類 23 機器語言: 直接使用二進制指令編寫的程序,運行效率非常高,但是開發效率非常低。 24 匯編語言: 使用一些英文的標簽來代替二進制指令去編寫的程序,比機器語言的開發效率高,但是開發效率比起高級語言要低很多。 25 高級語言: 直接使用人能夠理解的表達方式去編寫程序,開發效率比機器語言和匯編語言都要搞,但是執行效率很低。 26 編譯型語言: 執行效率高於解釋型語言,開發效率低於解釋型語言。 27 解釋性語言: 執行效率低於編譯型語言,開發效率高於編譯型語言。 28 總結: 29 執行效率: 機器語言>匯編語言>編譯型語言>解釋型語言 30 開發效率: 機器語言<匯編語言<編譯型語言<解釋型語言 31 7. 執行python程序的兩種方式 32 (1).交互式環境: 輸入代碼立即執行,但是不能保存文件 33 (2).寫入文件: 可以保存文件 34 8. 變量: 是用來記錄當前事物的某種狀態,之后狀態可以進行變化。 35 變量的命名規范 36 (1).字母數字下划線 37 (2).不能以數字開頭 38 (3).對變量值有一定的描述性功能 39 (4).不能是python中的關鍵字 40 變量名的命名風格 41 (1).駝峰體 42 (2).下划線純小寫 43 變量的三個特征 44 (1).id 內存地址 45 (2).type 變量的類型 46 (3).value 變量的值 47 常量 48 常量的命名規范: python中默認是沒有常量的,只是約定俗成的全大寫的就是變量,我們不應該對其進行修改。 49 9. 引用計數 50 是python垃圾回收機制引入的一個名詞,主要是用來顯示當前變量值被關聯的次數,如果為0,就會被python自動進行回收。 51 10. 數據類型 52 數據指的是變量的值,數據類型指的是變量值的類型。在日常生活中事物有多種形態,對應於程序中也應該有多種形態,也就是多種類型。 53 11. python2和python3的區別 54 (1).input和raw_input,python2中的input必須要輸入明確的數據類型,輸入的是什么輸出就是什么 55 (2).編碼python2:ascci, python3:utf-8 56 (3).print()和print 57 12. 運算 58 算數運算:+-*/ // % ** 59 比較運算: 只能在同類型之間進行比較,int和float都屬於數字類型 60 賦值運算 61 增量賦值:類似於a += 1這種形式 62 鏈式賦值:類似於a = b = 1這種形式 63 交叉賦值:類似於x, y = y, x這種形式 64 解壓賦值:類似於a, b, c, d = [1, 2, 3, 4], 多了少了都不行 65 邏輯運算:判斷順序: 比較運算>not>and>or 66 身份運算:is比較的是兩個變量值的地址,==比較的是兩個變量值的值 67 13. 運行python程序的三個步驟 68 (1).打開python解釋器 69 (2).將硬盤中的python程序加載到內存中(前兩不就和正常的讀取文件一樣) 70 (3).檢測python語言並執行(這一步才開始正式的讀取python的語法) 71 14. 小整數池 72 小整數池是python中為了節省內存空間而創建的一種機制,也就是說在一定的數據范圍內,無論創建了多少分,使用的都是這一個地址。 73 15. if判斷的四種語法 74 (1). if 條件: 75 code 76 (2). if 條件: 77 code 78 else: 79 code 80 (3). if 條件: 81 code 82 elif 條件: 83 code 84 (4). if 條件: 85 if 條件: 86 code 87 16. 結束while循環的兩種方式 88 (1): 通過條件的更改最終使得進入while循環的條件不滿足 89 (2): 通過break關鍵字跳出循環 90 17. while else的用法 91 格式: 92 while 條件: 93 code1 94 else: 95 code2 96 當while循環因為條件不滿足而正常退出的時候,會執行code2的代碼 97 18. for循環主要用來做什么 98 python語言中真正的循環只有while一個,也就是說所有的事物都是可以通過while循環去獲得值得,for循環主要是用來做循環取值的。 99 19. 可變類型與不可變類型是按照什么標准划分的 100 通過改變變量的值來看內存地址是否發生改變來划分的。 101 不可變類型: int,float,str,tuple 值變內存地址也變 102 可變類型: list,dict,set 值變內存地址不會發生改變 103 20. 計算機系統分為哪三層 104 (1).應用程序層 105 (2).操作系統層 106 (3).計算機硬件層 107 21. 字符編碼 108 人類與計算機打交道用到的都是人類的字符,而計算機只能識別二進制,因此我們需要將人類的字符編碼成計算機能夠識別的語言, 109 從而實現人機的交互。而字符編碼表就是將人類的字符與計算機二進制進行一一對應的關系表。 110 編碼和解碼 111 我們通過字符編碼表將人類的字符轉換成計算機能夠識別的字符的過程就叫做編碼 112 我們通過字符編碼表將計算機的二進制代碼轉換成我們的能夠識別的字符的過程叫做解碼。 113 存在的一些字符編碼表 114 ascii 只能識別英文 115 gbk 1Bytes代表英文, 2Bytes代表中文 116 unicode 全部都是2Bytes 117 (1).能夠兼容萬國編碼 118 (3).與各個國家的字符編碼都有一一映射關系 119 utf-8 1Bytes代表英文,3Bytes代表中文 120 它只是unicode的一種轉換格式,並不能與各個國家的語言進行一一的映射 121 解決亂碼的核心法則 122 用什么編碼方式編碼的就用什么編碼方式進行解碼 123 python2默認的編碼方式:ascii 124 python3默認的編碼方式:utf-8 125 #coding:文件頭的兩個作用 126 (1):告訴程序員當前程序應該以什么樣的編碼方式進行存儲 127 (2):告訴python解釋器在加載當前程序的時候應該以什么樣的編碼方式進行解碼。 128 22. 字符編碼的操作核心法則(3條) 129 (1).python2中如果出現中文前面加上u。 eg: a = u'中國' 130 (2).在文件開頭要寫上 #coding:utf-8 131 (3).python3通過encode編碼之后可以得到bytes類型 132 23. 文件 133 文件是操作系統幫我們虛擬出來的一個可以操作計算機硬盤的一個接口。我們可以通過操作系統將對文件的操作轉換成對硬盤的操作, 134 從而將應用程序持久化存儲起來。 135 24. 文件處理的三個步驟 136 (1).通過關鍵字open打開系統調用得到一個文件句柄(應用程序的內存資源===>操作系統的內存資源) 137 (2).操作文件(讀和寫) 138 (3).通過close關閉一個文件句柄,也就是回收操作系統的資源。 139 25. 上下文管理的方式 140 通過with open關鍵字打開一個文件,從而得到一個文件句柄,我們不再需要去關注什么時候應該關閉掉文件,因為 141 上下文管理會自動幫我們關閉文件,從而回收操作系統資源。 142 26. 操作文件內容的三種純凈模式 143 r: (默認的)只讀模式,文件不存在則報錯。 144 w:只寫模式,文件不存在則創建,存在則清空寫入 145 a:只寫模式,文件不存在則創建,存在則追加寫入 146 27. 控制文件內容格式的兩種模式 147 t文本模式: 148 (1).只能針對文本文件 149 (2).讀寫文件都是以字符串為單位的 150 (3).必須指定encoding 151 b:二進制模式 152 (1).針對所有文件 153 (2).讀寫文件都是以字節為單位的 154 (3).不能指定encoding 155 28. 文件指針移動的單位是字節還是字符 156 只有在rt模式下移動的是字符,其余的都是字節模式 157 29. 文件是否可以修改? 158 文件准確來說是磁盤的映射,磁盤不能改,文件當然也就不能進行修改。但是我們可以通過以下的方式進行間接的修改 159 方式一: 將磁盤的文件一次性的讀入內存中,在內存中修改完成之后再覆蓋寫入到硬盤空間。 160 優點: 同一時間內硬盤中不會存在兩個文件。 161 缺點: 文件太大的時候會占用更多的內存空間。 162 方式二: 以讀的方式一行一行的讀入到內存中,然后一行行修改重新寫入到一個臨時文件中,最后將源文件刪除,臨時文件的名稱改成源文件的名稱 163 優點: 占用系統內存較少 164 缺點: 同一時間硬盤空間中數據會存在兩份。 165 30. 函數 166 函數就是實現某一功能的代碼塊。通過函數我們可以解決代碼冗余的問題,從而提高程序的可擴展性以及可讀性。 167 31. 函數的分類(2類) 168 (1).內置函數: Python解釋器幫我們編寫好的為了實現某種功能的函數,可以不用定義直接進行使用。 169 (2).自定義函數: 自己自定的為了實現某一個功能的函數。 170 32. 使用函數的原則 171 先定義后調用 172 33. 函數的兩個明確階段 173 (1).函數定義階段 174 (2).函數調用階段 175 34. 函數定義的三種形式 176 (1).有參函數 177 (2).無參函數 178 (3).空函數 179 35. 函數調用的三種形式 180 (1).語句的形式 func() 181 (2).表達式的形式 res = func() * 12 182 (3).當做參數傳遞的形式 res = max(max(1, 2), 3) 183 36. return的特點 184 return返回值: 185 (1).沒有類型的限制 186 (2).沒有個數的限制 187 <1>返回0個或者沒有返回 都是None 188 <2>返回1個 就是值本身 189 <3>返回多個 是個元組 190 return結束函數的功能,可以有多個return,但是只會執行一次 191 37. 函數參數的兩大類 192 形參(形參又分為哪四類): 在函數定義階段,括號內定義的參數 193 位置形參: 按照從左到右的順序依次定義的形參 194 <1>: 必須傳值,不能多不能少 195 默認形參: 按照key=value的形式定義的形參 196 <1>: 可以傳值,也可以不傳值 197 <2>: 默認形參必須在位置形參后面 198 <3>: 默認形參的值在函數定義階段就已經固定死了,定義階段后的改動不會影響該值 199 <4>: 默認形參的值通常應該是不可變類型 200 可變長形參: 201 *argv:*會將溢出的位置實參存成元組的形式,然后賦值給*后的argv 202 **kwargvs: **會將溢出的關鍵字實存成字典的形式,然后賦值給**后面kwargs 203 命名關鍵字形參 204 實參(實參又分為哪三類): 在函數調用階段,括號內定義的參數 205 位置實參 206 與位置形參一一對應 207 關鍵字實參 208 <1>: 關鍵字實參必須放在位置實參的后面 209 <2>: 不能重復傳值 210 可變實參: 指的是在調用階段,實參值個數是不固定的, 211 38. 為什么說函數是第一類對象? 212 函數的內存地址可以像一個變量值一樣去使用。 213 39. 函數與變量的四種使用方式 214 <1>.賦值 215 <2>.當做參數進行傳遞 216 <3>.作為返回值返回 217 <4>.可以當做容器類型的參數 應用: 功能字典 218 40. 函數的嵌套定義以及其應用場景 219 函數的嵌套定義: 指的是在一個函數內重新定義多個函數,但是不會進行調用。 220 應用場景: 可以將一系列相關的功能封裝到一塊提供給用戶進行使用。例如: 對於園的一些操作求周長面積等封裝到一個函數里面。 221 41. 函數的嵌套調用以及其應用場景 222 函數的嵌套調用: 指的是在一個函數內調用了其他的函數。 223 應用場景: 主要是用來將一個復雜的過程分成好幾個函數同時來完成,最后通過一個函數進行封裝。 224 42. 什么是名稱空間 225 名稱空間指的是存放變量名與內存地址綁定關系的地方。 226 43. 名稱空間的分類(三類) 227 <1>.內置名稱空間 228 解釋器啟動的時候就會產生,解釋器關閉的時候就會銷毀 229 <2>.全局名稱空間 230 python程序執行的時候產生,Python程序執行完畢之后銷毀 231 <3>.局部名稱空間 232 函數調用時臨時產生,函數調用完畢之后則銷毀 233 44. 名稱空間的產生順序 234 內置名稱空間---> 全局名稱空間_---> 局部名稱空間 235 45. 名稱空間的銷毀順序 236 局部名稱空間---> 全局名稱空間_---> 內置名稱空間 237 46. 什么是作用域 238 作用域指的是變量名的作用范圍 239 47. 作用域的分類(兩種) 240 全局作用域: 包含了全局和內置名稱空間的名字 241 全局存活,全局有效 242 局部作用域: 包含了局部命名空間的名字 243 臨時存活,局部有效 244 48. 作用域關系的核心要義(一句話) 245 作用域關系在函數定義階段已經定義死了,與函數調用無關。 246 49. 什么是閉包函數 247 在函數內部定義了一個函數,該函數又包含了對外層函數名字的引用。 248 50. 為函數體傳值的兩種方式(分別的特點) 249 (1). 通過參數進行傳值 每次調用都要進行傳值 250 (2). 通過閉包函數進行傳值 可以傳一次得到一個返回值,之后直接調用返回值就可以,在某些方面可以簡化用戶的操作 251 51. 什么是裝飾器 252 為原函數增加新的功能的工具就是裝飾器。我們可以通過裝飾器在不修改功能源代碼以及其調用方式的情況下為原函數增加新的功能。 253 加載裝飾器就是將原函數名偷梁換柱成了裝飾器最內層那個wrapper函數 254 # 在加載完畢后,調用原函數其實就是在調用wrapper函數 255 52. 裝飾器的分類(兩大類) 256 <1>有參裝飾器 257 <2>無參裝飾器 258 53. 什么是語法糖 259 語法糖(syntactic sugar)是指編程語言中可以更容易的表達一個操作的語法,它可以使程序員更加容易去使用這門語言: 260 操作可以變得更加清晰、方便,或者更加符合程序員的編程習慣 261 54. 裝飾器的語法糖 262 @裝飾器的名字:要在被裝飾對象正上方單獨一行寫上 263 55. 有參裝飾器的模板 264 def outter2(x,y,z): 265 def outter(func): 266 def wrapper(*args,**kwargs): 267 res=func(*args,**kwargs) 268 return res 269 return wrapper 270 return outter 271 56. 無參裝飾器的模板 272 def outter(func): 273 def wrapper(*args,**kwargs): 274 res=func(*args,**kwargs) 275 return res 276 return wrapper 277 57. 疊加裝飾器的加載順序 278 自下而上 279 58. 疊加裝飾器的執行順序 280 自上而下 281 59. 什么是迭代器 282 迭代器就是一個迭代取值的工具,該工具的特點就是可以不依賴索引取值。 283 60. 迭代器的兩個優點 284 <1>.提供了一種通用的不依賴索引的迭代取值方式 285 <2>.同一時刻在內存中只有一個值,更加節省內存 286 61. 迭代器的兩個缺點 287 <1>.沒有索引取值靈活,並且迭代器是一次性的 288 <2>.無法預知迭代器數據的個數 289 62. 什么是可迭代對象 290 但凡是有__iter__方法的都是可迭代對象,調用可迭代對象的__iter__方法可以得到一個迭代器對象。 291 63. 什么是迭代器對象 292 有__iter__和__next__方法的都是迭代器對象,調用迭代器對象的__iter__方法會得到它本身 293 64. python中的可迭代對象有哪些(6個) 294 list, tuple, dict, set, 文件對象, str 295 65. python中的迭代器對象有哪些(1個) 296 文件對象 297 66. for循環本質上是個迭代器循環,原理是什么(3步) 298 <1>.會調用對象__iter__將迭代器對象或者可迭代對象轉換成迭代器對象 299 <2>.調用迭代器對象的__next__方法取值並且賦值給變量,運行循環體代碼 300 <3>.循環往復,直到迭代器取值完畢之后拋出異常然后捕捉異常自動結束循環 301 67. 什么是生成器 302 生成器本質上就是一種迭代器,不過它是程序員自己通過yield關鍵字創建出來的一種迭代器對象。 303 68. python中提供生成器的關鍵字 304 yield,一旦函數中包含yield關鍵字,當我們去執行此函數的時候,就不會立刻的運行函數體代碼了,會得到一個返回值, 305 該返回值就是一個生成器對象。 306 69. 三元表達式 307 a = x if x > y else y 308 70. 列表生成式 309 l = [i ** 2 for i in range(9) if i > 5] 310 71. 生成器表達式 311 c = (i**2 for i in range(3)) 312 72. 字典生成式 313 d = {k:v for k,v in dd if k != 'sex'} 314 73. 什么是匿名函數 315 顧名思義: 沒有名字的函數就是匿名函數。有些功能我們使用一次就不在使用了,所以我們需要匿名函數。 316 74. 匿名函數的應用場景(2個) 317 <1>.用在一些內置函數中當做參數, 例如: max,min,sorted,filter,reduce,map 318 <2>. 319 75. 什么是函數遞歸 320 函數的遞歸就是函數嵌套調用的一種特殊用法,特殊在調用一個函數的過程中又直接或者間接地調用了該函數本身。我們可以通過 321 在某些條件下使用遞歸要比使用while循環更加的簡單。 322 76. 遞歸要滿足的兩個原則 323 <1>.每進入下一層遞歸,函數的規模都應該有所減少 324 <2>.遞歸必須有一個明確的結束條件或者說有一個明確的進入下一層遞歸的條件 325 77. 遞歸的兩個明確的階段 326 <1>.回溯:一層一層地遞歸調用下去 327 <2>.遞推:在某一層結束掉遞歸,然后一層一層返回。 328 78. 什么是面向過程編程 329 面向過程的核心在過程二字,基於該思想寫程序腦子里應該始終思考過程二字,就好比設計一個流水線,是一種機械式的思維方式 330 79. 面向過程編程的優點和缺點 331 優點: 將復雜的問題流程化,進而簡單化 332 缺點: 擴展性差 333 80. 什么是面向對象編程 334 面向對象的核心在對象二字,基於該思想寫程序就像是在創造一個世界,世界里的一切都是對象,是一種上帝式的思維方式。 335 81. 面向對象編程的優點和缺點 336 優點:擴展性強 337 缺點: 編程較為復雜 338 82. 什么是模塊 339 模塊就是一組功能的集合,本質上就是一個py文件。 340 83. 模塊的作用 341 讓我們可以從文件級別去管理我們的代碼。可以提高我們程序的可維護性與可讀性。 342 84. 模塊的分類(4類) 343 <1>.內置模塊 344 <2>.自定義模塊 345 <3>.包 346 <4>編譯為DLL的c或者C++ 347 85. 模塊導入的兩種方式,區別是什么 348 <1>.import導入 349 <2>.from ... import導入 350 86. import導入模塊的三個步驟 351 <1>.在當前模塊中創建一個名稱空間 352 <2>.執行模塊中的代碼,將名稱和地址的對應關系存儲到名稱空間中 353 <3>.在執行文件中產生一個新的名稱指向被導入的名稱空間 354 87. import導入的三種語法 355 <1>. import 模塊名 356 <2>. import 模塊名1, 模塊名2 357 <2>. import 模塊名 as mmm 358 88. from導入模塊的三個步驟 359 <1>.在當前模塊中創建一個名稱空間 360 <2>.執行模塊中的代碼,將名稱和地址的對應關系存儲到名稱空間中 361 <3>.復制被導入模塊中的名稱到當前名稱空間中,之后可以直接進行使用 362 89. from導入模塊的三種語法 363 <1> from 模塊 import 變量 364 <2> from 模塊 import 變量1, 變量2 365 <3> from 模塊 import 變量1 as mmm 366 <4> from 模塊 import * 367 90. 模塊的搜索順序 368 內置模塊--->內存中已經加載的模塊--->sys.path中已經存在的模塊 369 91. 什么是包 370 包是一堆模塊的集合。 371 92. __init__文件是干什么用的 372 導入該包內的所有模塊,用戶使用起來較為簡單,無需關系包內的東西,只需要導入__init__就可以使用包內的所有模塊。 373 93. __init__文件應該包含哪些內容 374 僅僅只是用於導入包內的模塊,不應該包含任何的業務邏輯。 375 94. 包的作用 376 我們可以從文件夾的級別去管理我們的代碼。提高可讀性與維護性。 377 95. 相對導入和絕對導入 378 相對導入:相對於被導入模塊的路徑, .表示當前目錄 ..當前往上一級目錄 379 絕對導入:從sys.path開始的完整路徑稱之為絕對導入 380 96. 相對路徑和絕對路徑 381 97. 文件的兩種執行方式,區別是什么? 382 <1>.直接通過python解釋器調用執行, __name__的值為__main__ 383 <2>.通過模塊的導入執行的, __name__的值為模塊名 384 區別在於__name__的值不一樣 385 98. 什么是對象 386 對象是特征與技能的結合體。 387 99. 什么是類,面向對象編程為什么要有類 388 類是一系列對象的相同特征與技能的結合體。在現實世界中是先有對象才有類的,但是在程序中,是先有類,才有對象的。 389 100. 什么叫做面向對象是更高程度的一種封裝 390 將一系列的特征與技能封裝到一個對象上面,只需要將對象給你,你就可以得到對象的特征和技能。 391 101. 類的兩種用途 392 <1>.類本質上就是一個名稱空間,我們可以通過類對名稱空間進行增刪改查 393 <2>.用來創建對象, 394 (1).創建一個空對象 395 (2).創建對象的過程會自動的調用__init__方法,然后將對象本身作為第一個參數傳遞進去。 396 102. __init__方法在什么時候會被觸發 397 在創建對象的時候會被自動的觸發,並把空對象作為第一個參數傳遞給類。 398 103. python3中類與類型是一個概念嗎 399 python3中統一了類與類型的概念 400 104. 什么是繼承 401 子類可以重用父類的屬性就叫做繼承,它描述的是一種遺傳的關系。我們可以通過繼承來減少代碼之間的冗余。 402 105. 什么是組合 403 一個對象的屬性來自於另外一個對象的現象就稱之為組合,也是為了減少類與類之間代碼的冗余。 404 106. 什么是多態 405 描述的是一種事物的多種形態,在代碼中主要為了統一標准。我們可以在不考慮對象的類型的情況下直接去使用對象下的方法。 406 107. 什么是封裝 407 將類的數據屬性進行隱藏的一種過程,這種隱藏並不是單純的隱藏,是對內不對外的。 408 108. 繼承分為哪兩類, 區別是什么 409 <1>.單繼承 410 <2>.多繼承 411 109. 類分為哪兩類, 區別是什么 412 <1>.新式類: 繼承了object類的子類,以及子類的子類...都稱為新式類。 413 <2>.經典類: 沒有繼承object類的子類,以及子類的子類...都稱之為經典類。 414 在python2中才會區分新式類和經典類,python3中默認都是繼承object類的新式類 415 416 110. 重用父類功能的兩種方式, 分別有什么特點 417 <1>.指名道姓的訪問某個類中的問題,與繼承無關。 418 <2>.通過super(父類,self)方法去調用父類中的__init__方法,嚴格依照繼承的關系 419 調用super方法會得到一個特殊的對象,該對象是專門用來訪問父類中的屬性的,super會嚴格按照mro列表進行查找。 420 111. 單繼承背景下屬性的查找順序 421 對象--->子類---->父類--->object類 422 112. 多繼承背景下屬性的查找順序(兩類) 423 菱形繼承 424 新式類:會從左到右,當左右的分支都查找不到的時候才會去查找聚合點 425 經典類:會從左到右,但是在第一個分支的時候就會把聚合點給查找 426 非菱形繼承 427 從左到右依次查找,一個分支查找完成之后才會查找另一個分支 428 113. 封裝的特點是什么? 429 封裝不是單純意義上的隱藏,對外不對內的。 430 114. 封裝數據屬性的目的 431 將數據屬性封裝起來,類外部的使用就無法直接操作該數據屬性了 432 需要類內部開一個接口給使用者,類的設計者可以在接口之上附加任意邏輯,從而嚴格 433 控制使用者對屬性的操作 434 115. 封裝函數屬性的目的 435 隔離復雜度 436 116. 隱藏的__開頭的屬性有哪些特點(4個) 437 (1). 只是一種語法意義上的變形,即__開頭的屬性會在檢測語法時發生變形_類名__屬性名 438 (2). 這種隱藏式對外不對內的,因為在類內部檢測語法時所有的代碼統一都發生的變形 439 (3). 這種變形只在檢測語法時發生一次,在類定義之后新增的__開頭的屬性並不會發生變形 440 (4). 如果父類不想讓子類覆蓋自己的屬性,可以在屬性前加__開頭 441 117. property裝飾器主要是用來解決什么問題的 442 有一些屬性會跟隨數據屬性變化而變化,因此我們要把它設計成方法屬性,為了讓用戶使用的時候像使用數據屬性一樣的,我們就需要在 443 方法上面加上@property 444 118. 什么是綁定方法與非綁定方法 445 綁定方法: 446 綁定對象的方法 447 綁定類的方法 448 非綁定方法: 就像正常的函數一樣 449 119. classmethod裝飾器是用來綁定什么的 450 綁定類的 451 120. staticmethod裝飾器是用來綁定什么的 452 綁定對象的 453 121. 什么是反射? 454 反射就是想通過字符串的形式來對對象的屬性進行增刪查改 455 122. 反射的四個方法(增刪改查) 456 hashattr(obj, 'name') 457 setattr(obj, 'name', 'egon') 458 delattr(obj, 'name') 459 getattr(obj, 'name') 460 461 組件 462 is 比較的是兩個地址 463 == 比較的兩個變量的值 464 id 打印出來的是變量的內存地址信息 465 input python中交互關鍵字 466 global 全局變量 467 nonlocal 468 __all__ 在模塊的導入過程中,我們可以通過__all__來控制外部可以使用此模塊的哪些內容 469 __name__ 執行文件的兩種方式會導致__name__的值不一樣, 直接執行__name__==__main__,導入模塊執行會__name__等於模塊名 470 sys.modules 當前內存中加載的模塊名稱mdcmd,是字典的形式 471 sys.path 當前的系統路徑,不是內置模塊,內存中也不存在此模塊的時候,就會按照順序到sys.path這個列表中去查詢 472 __init__方法 在類中出現的,當創建對象的時候會自動的調用此方法,並把創建的空對象當做第一個參數傳遞進去 473 __init__文件 在包中出現的,用來導入包內的其他模塊。在導入包的時候其實執行的__init__模塊 474 __dict__ 對象或者類去查看名稱空間用的,是一個字典 475 __file__ 當前文件的絕對路徑,(win中也就是從盤符開始的路徑) 476 super函數 目前學到的只是繼承父類的屬性的時候用到的,super(父類名,self).方法名, 會給我們返回一個特殊的對象,按照mro列表中的順序進行屬性查找的。 477 __str__ 在類中創建一個__str__方法, 一定要有返回值,否則會報錯,這樣直接print(對象)的時候會給我們打印返回的值 478 __del__ 在類中創建一個__del__方法,在方法中刪除系統資源,代表在對象被刪除的時候會給我們自動的刪除沒有被回收的系統資源 479 continue: 不執行當前continue之后的代碼, 直接進入下一次循環, 不應該將continue作為最后一步執行的代碼 480 break 跳出當前循環 481 while...else 不是因為break而跳出循環的時候就會執行else的代碼 482 a, b, *_ = [1, 2, 3, 4] 在解壓賦值的時候,如果我們不想要后面的一些值就需要以這樣的方式來書寫 483 __iter__ 在迭代器和可迭代對象的時候學習的,使用此方法之后會把可迭代對象轉換成迭代器對象 484 __next__ 具有此方法的對象都是迭代器對象,我們可以通過這個方法獲得迭代器對象的值 485 lambda 匿名函數 lambda 參數一, 參數二: 表達式 返回值就是表達式的值 486 487 488 數據類型 489 進制之間的轉換問題: 490 hex(256) 十進制轉成十六進制 將十六進制轉成十進制int('0x100', 16) 491 oct(256) 十進制轉成八進制 將八進制轉成十進制int('0o400', 8) 492 bin(256) 十進制轉成二進制 將二進制轉成十進制int('0b100', 2) 493 int 494 int() 沒有參數就返回0 495 int(0.7) 是浮點就省略后面的值 496 int('1') 字符串轉換只能是里面只能是整形 497 float 498 float() 沒有參數返回0.0 499 float('1') 500 float('1.1') 字符串可以帶有小數點 501 str 任何類型都是可以轉換成字符串類型的 502 strip() 去除兩邊的特定字符,可以去除多個字符'abcdefabc'.strip('abc')===》'def' 503 split() 以特定的字符分割字符串s.split('*', 2) # 從左往右以*為分割點分割兩次 504 join() 將列表,元祖,字典轉換成str的方法,拼接的值里面必須是字符串類型的,否則會報錯 505 endswith 以什么結尾 506 startswith 以什么開始 507 upper 全部變成大寫 508 lower 全部變成小寫 509 replace 參數一為舊值,參數二為新值,參數三為替換的次數,默認是全部 510 find, index 找對應的索引,index找不到報錯,find找不到返回-1,找到的時候返回索引的位置 511 rfind, rindex 其實就是找最后一個的索引位置 512 513 不常用的方法: 514 captilize 第一個字符大寫 '*ab'.capitalize()===》'Ab' 515 title 每個單詞首字母大寫 'abc*ab'.title()===》'Abc*Ab' 516 swapcase 大小寫反轉 517 518 center() 第一個參數是個數,第二個參數是字符 519 ljust s.ljust(10, '*')====>hello***** 520 rjust s.rjust(10, '*')====>*****hello 521 zfill 在字符串左邊 填充0 522 list 任何可迭代類型的數據都可以被轉換成列表 523 修改的方法 524 增: append,insert, extend 525 append 把一個整體添加到列表的最后面 526 insert 把一個數據整體的添加到索引的位置上面,第一個參數是索引,第二個參數是數據 527 extend 把可迭代類型的數據一個一個的添加到列表的最后面 528 刪: pop, remove 529 pop 根據索引刪除值並且將刪除的值返回回去 530 remove 根據列表的內容刪除一個值,沒有則報錯 531 index,count 532 index 根據索引找到對應的值,找不到則報錯 533 count 計算當前值出現的次數 534 copy,clear 535 copy 復制一個相同的列表 536 clear 清空當前列表 537 sort, reverse 538 sort 排序默認是升序,當參數reverse=True的時候就是倒序,排序的列表中必須全部是數字或者字母,否則會報錯 539 reverse 反轉 540 dict 只能轉換如下類型[('name', 'hu'), ('age', 18)], 字典的key必須是不可變類型 541 python2和python3在處理字典的時候會返回不一樣的值,python3會返回一個迭代器,而python2直接會把值給返回出來 542 copy,clear 543 copy 復制一個相同的字典 544 clear 清空當前字典 545 get 如果字典中不存在key,不會報錯,會返回一個None. a.get('sex') 546 pop 根據key去刪除字典的值,並且會把刪除key對應的value返回回來, key不存在就報錯 547 popitem 隨機的刪除一個鍵值對,並把鍵值對以元祖的形式返回回來,如果key不存在則報錯 548 update 和列表的extend很相似,原字典中有這個key直接更新,沒有就添加 549 fromkeys 550 #fromkeys可以通過已經給定的key快速的創建一個初始化的字典 551 res1 = {}.fromkeys('str', None) 552 res2 = {}.fromkeys(['name', 'age', 'sex'], None) 553 print(res1) 554 print(res2) 555 # 結果 556 # {'s': None, 't': None, 'r': None} 557 # {'name': None, 'age': None, 'sex': None} 558 setdefault 559 # setdefault有兩個參數,第一個參數是key,如果key在原字典中存在,則直接返回原字典對應的key的值 560 # 如果原字典中key不存在,則添加key到原字典中,value的值為第二個參數,並且返回第二個參數 561 a = {'name': 'hu', 'age': 18} 562 res = a.setdefault('sex', None) 563 print(a, res) 564 565 # 結果: 566 # {'name': 'hu', 'age': 18, 'sex': None} None 567 tuple 568 index 尋找值所對應的索引,找不到則報錯 569 count 尋找值出現的次數 570 set 值必須是不可變類型, 集合是無序不重復的 571 集合運算 572 交集 【&】符號代表交集 573 並集 【|】符號代表並集 574 差集 【-】符號代表差集,有順序之分print(linuxs - pythons) # 在linux中但是不在python中 575 對稱差集 【^】符號代表對稱差集 576 父子 【>=】父子關系 577 集合方法 578 add 添加值如果存在,就不變 579 pop 隨機刪除一個,並把結果返回 580 remove 刪除元素,元素不存在就報錯 581 discard 元素如果存在就刪除,不存在就不變 582 update 將一個集合更新到一個集合中,如果有則不變,沒有則添加 583 isdisjoint 如果兩個集合滅有交集,返回True 584 文件操作的方法 585 1. 不需要參數 586 readable 查看當前文件句柄是否可讀 587 writeable 查看當前文件句柄是否可寫 588 tell 查看當前指針距離文件頭的字節個數 589 close 關閉當前文件 590 flush 將當前緩沖區的內容刷新到文件中 591 592 fileno 593 isatty 594 2. 需要一個參數(只有在rt模式下讀取的才是字符) 595 read 默認讀取文件內的所有內容,傳入一個參數代表讀出幾個字節的 596 readline 讀取當前指針所在行的值,傳遞的參數代表的是讀取幾個字節 597 readlines 把每一行的值轉換成bytes類型,最后返回一個列表 598 write 將內容寫入到文件中 599 writelines 600 # 下面這兩種方法是一樣的 601 for i in line: 602 f.write(i) 603 f.writelines(line) 604 3. 需要兩個參數 605 seek 第一個參數代表移動的字節數,第二個參數0代表開頭,1代表當前位置,2代表文件末尾 606 內置函數(64個,目前只是寫了自己還不是很熟悉的) 607 max 求最大值, res = max(salaries, key=lambda key: salaries[key]), key是比較標准 608 min 求最小值, 609 sorted 從大到小順序排列 sorted(salaries, key=lambda key: salaries[key], reverse=True) 610 611 612 filter 過濾 res = filter(lambda item: not item.endswith('_dsb'), test) 如果不是以_dsb結尾的就保留下來,返回一個迭代器 613 它不能向map和reduce一樣對數據進行修改, 應用想去掉列表中的某個值x 614 reduce reduce需要導入才能進行使用 615 # 求1-100的和 616 # 這第三個參數是初始值,如果沒有,則會從迭代對象中找到一個值賦值給它 617 from functools import reduce 618 res = reduce(lambda x, y: x + y, range(100), 100) 619 print(res, type(res)) 620 621 # 拼接字符串 622 test = ['yuanhao_dsb', 'egon_dsb', 'wupeiqi_dsb', 'alex_dsb', 'egon'] 623 from functools import reduce 624 res = reduce(lambda x, y: x + y, test, '10000') 625 print(res, type(res)) 626 應用在拼接字符串或者是數字的疊加過程 627 map 映射 res = map(lambda item: item + '_dsb', lists)將lists的每個參數傳遞給item進行映射之后返回一個迭代器 628 應用在對某一類值進行修改 629 sum sum就是單純的求和 630 round 對浮點數進行四舍五入取值 631 power 返回冪運算值或者與其指定的數值的模 632 divmod 返回兩個數值的商和余數 633 dir 返回對象或者當前作用域內的屬性列表 634 ascii 返回對象的可打印表字符串表現方式 635 vars 返回當前作用域內的局部變量和其值組成的字典,或者返回對象的屬性列表 636 all 判斷可迭代對象每個元素是否都是True 637 any 判斷可迭代對象中是否又True的元素 638 zip 聚合傳入的每個迭代器中的相同位置的元素,返回一個新的元祖類型迭代器 639 reversed 反轉序列生成新的可迭代對象 640 bytearray 根據傳入的參數創建一個新的字節數組 641 bytes 根據傳入的參數創建一個新的不可變字節數組 642 memoryview 根據傳入的參數創建一個新的內存查看對象 643 frozenset 根據傳入的參數創建一個新的不可變集合 644 645 enumerate 根據可迭代對象創建枚舉對象 646 slice 根據傳入的參數創建一個切片對象 647 super 根據傳入的參數創建一個新的子類和父類的關系的代理對象 648 object 創建一個新的object對象 649 650 常用模塊(14個) 651 time 652 time.time() 1539593357.4160235 653 time.localtime() 做為一種中間格式用來轉換不同的時間格式 654 time.strftime('%Y-%m-%d %X') '2018-10-15 16:57:24' 655 time.asctime() 'Mon Oct 15 18:23:37 2018' 656 time.ctime() 'Mon Oct 15 18:23:44 2018' 657 658 time.asctime(b) # 通過asctime把結構化時間轉換成固定的外國人接受的時間 659 time.ctime(a) # 通過ctime將時間戳轉換成外國人能夠接受的時間 660 661 datetime 662 datetime.datetime.now() 獲取當前時間 2018-10-15 18:40:17.028194 663 datetime.datetime.fromtimestamp(time.time()) 將時間戳轉換成對應的時間 664 datetime.datetime.now() + datetime.timedelta(hours=3) 將當前時間加上三個小時 665 666 c_time.replace(month=11, year=2020, minute=10) 替換c_time的時間 667 sys 668 1. sys.argv # 這個是傳入的參數,返回的是列表的形式,第一個是當前執行文件的名稱 669 2. sys.path # 系統的環境變量,可以通過append方法進行更改 670 3. sys.modules # 內存已經加載的模塊,以字典的形式存在 671 4. sys.version # 解釋器的版本 672 5. sys.platform # 當前執行的平台 673 6. sys.exit() # 退出當前執行的python解釋器 674 675 # 了解 676 7. sys.api_version # api版本號 677 8. sys.maxsize # 最大值得整數32位為 2 ** 32 - 1 64位為2 ** 64 -1 678 9. sys.maxunicode # 最大的unicode 0x10FFFF 679 os 680 1. 目錄操作 681 增 682 os.mkdir 創建一個單級目錄 683 os.makedirs 創建多級目錄,遞歸創建 684 刪 685 os.rmdir 刪除一個目錄 686 os.removedirs 遞歸刪除目錄,如果目錄為空 687 改 688 chdir 改變當前目錄 689 pardir 當前執行目錄的父目錄 690 curdir 當前執行文件的目錄 691 查 692 getcwd() 獲得當前解釋器執行文件目錄 693 listdir() 以列表的形式返回當前目錄下面有什么內容 694 2. 文件操作 695 刪 696 os.remove() 刪除文件 697 改 698 os.rename() 修改文件名稱 699 查 700 os.stat 查看當前文件的狀態信息 701 os.path.getsize() 查看當前文件的大小 702 os.path.getatime() 查看當前文件的創建時間 703 os.path.getmtime() 查看當前文件的修改時間 704 3. 變量信息 705 os.stat # 文件的狀態信息 706 os.name # win是‘nt’, linux平台是'posix' 707 os.sep # 操作系統特定的路徑分隔符 708 os.linesep # 換行符win為'\t\n', linux為'\t' 709 os.pathsep # 分割文件路徑的字符串win為;, linux為: 710 os.environ # 系統環境變量 711 os.system() # 運行shell命令,直接顯示 712 4. 路徑的判斷 713 os.path.exists() # 判斷路徑是否存在 714 os.path.isfile() # 判斷是否是個文件 715 os.path.isdir() # 判斷是否是個目錄 716 os.path.join() # 拼接路徑 717 5. 路徑操作 718 os.path.split() # 以列表的形式返回文件名和目錄 719 os.path.basename # 獲得得就是split的文件名 720 os.path.dirname # 獲得得就是split的目錄 721 5. 規范化路徑 722 os.path.normcase() # 將大寫變小寫,並將所有斜杠轉成反斜杠(返回的是原字符串) 723 os.path.normpath() # 會把反斜杠轉換成斜杠,然后可以識別相對路徑 724 os.path.abspath() # 返回path規范化的絕對路徑 725 random 726 random.random() # 得到一個(0-1)之間的浮點數 727 random.uniform(1, 3) # 得到一個(1, 3)之間的一個小數 728 729 random.randint(1, 3) # 得到一個[1, 3]之間的整數 730 random.randrange(1, 3) # 得到一個[1, 3)之間的一個整數 731 732 random.choice([1, '23', [4, 5]]) # 獲得列表中的一個值 733 random.choices([1, '23', [4, 5]], k=2) # 獲得列表中的兩個值返回一個列表 734 random.sample([1, '23', [4, 5]], k=2) # 列表元素任意2個組合 735 736 # 打亂順序 737 l = [1,2,3,4,5] 738 random.shuffle(l) # 傳遞的必須是一個列表 739 hashlib 740 password = hashlib.md5('123'.encode('utf-8')) 741 password.update(''.encode('utf-8') 742 password.hexdigest() 743 744 json, pickle 745 f.write(pickle.dumps(user)) 746 pickle.dump(user, f) 747 pickle.load(f) 748 res = pickle.loads(f.read()) 749 shelve 750 import shelve 751 # shelve只有一個open函數 752 # 打開文件,文件可以存在也可以不存在, 753 f = shelve.open(r'shelve.txt', writeback=True) 754 # 在關閉之前可讀可寫參數writeback=True代表的是否可以進行修改 755 # f['user'] = {'name': 'hu'} 756 print(f['user']) 757 f['user']['sex'] = 'male' 758 f.close() 759 shutil 760 文件處理: 761 shutil.copyfileobj 傳入的是兩個對象,源文件,目的文件 762 shutil.copyfile 傳入的是兩個路徑,原路徑,目的路徑 763 shutil.copymode 只復制文件的權限,目的恩瑾可定是要存在 764 shutil.copystat 只復制文件的狀態信息,修改時間,查看時間,更改時間,flag是 765 shutil.copy 拷貝文件和權限 766 shutil.copy2 拷貝文件和狀態信息 767 shutil.move() 更改文件名稱 768 文件夾處理 769 shutil.copytree 拷貝目錄 770 shutil.ignore_patterns 根據這個模塊去設置是否不拷貝某個類型的文件 771 shutil.rmtree 刪除目錄 772 壓縮包處理 773 shutil.make_archive() 壓縮后的目錄名稱,格式,源目錄 774 shutile.unpack_archive() 壓縮后的目錄名稱, 格式,解壓后的目錄 775 776 tarfile.open().add() 777 zipfile.ZipFile().write() 778 xml 779 import xml.etree.ElementTree as ET 780 tree = ET.parse('xml文件名稱') 781 root = tree.getroot() 782 .......一系列的標簽查找與替換操作 783 784 root.iter('標簽名稱') 785 root.find('標簽名稱') 786 root.findall('標簽名稱') 787 788 node.text 標簽內容 789 node.attrib 標簽屬性 790 node.tag 標簽名 791 792 node.set('屬性名', '屬性值') 793 794 tree.write('xml文件名稱') 795 796 configparser開始的標准寫法 797 798 import configparser 799 config = configparser.ConfigParsesr() 800 config.read('a.txt', encoding='utf-8') 801 .....一系列檢查修改操作之后 802 803 config.sections() 804 config.get('某個分區', '某個key') 805 config.set('某個分區', '某個key', 'value') 806 config.has_section('某個分區') 807 config.has_option('某個分區', 'key') 808 809 config.write(open('conf.cfg', 'wt', encoding='utf-8')) 810 811 logging 日志模塊的使用方法 812 import logging.config 813 logger = logging.config.dictConfig(config=配置文件里面的配置字典) 814 return logging.getLogger('日志生成器的名稱') 815 re 816 位置匹配 817 \A 開頭 818 \Z 結尾 819 ^ 開頭 820 $ 結尾 821 范圍匹配 822 \d 數字 (\D相反是非數字) 823 \w 數字字母下划線 (\W相反) 824 \s 空字符(\t\n\f\b) (\s相反) 825 [...] 手動指定范圍,ascii碼表返回 826 [^...] 指定范圍以外的內容 827 重復匹配 828 * 0次或者多次 829 + 一次或者多次 830 ? 0次或者一次 非貪婪模式 831 {n} 精確匹配前面n個表達式 832 {n, m} 匹配n到m次由前面的正則表達式定義的片段,貪婪模式 833 834 分組 835 ()括號內的表達式是一個分組 836 subprocess 837 cmd = 'dir H:\python_study\day23' 838 find = 'findstr "py"' 839 840 sub1 = subprocess.Popen(cmd, 841 stdout=subprocess.PIPE, 842 shell=True,) 843 # 把sub1的標准輸出輸入到sub2的輸入中 844 sub2 = subprocess.Popen(find, 845 stdout=subprocess.PIPE, 846 stdin=sub1.stdout) 847 848 print(sub2.stdout.read().decode('gbk')) 849 小工具 850 cp拷貝文件 851 遞歸實現二分法的過程 852 遞歸實現冒泡排序的過程 853 854 logging的常用配置文件內容 855 """日志配置文件內容""" 856 from conf import settings 857 import os 858 # from lib.common import get_config_module 859 860 STANDARD_FORMAT = '%(asctime)s %(name)s %(funcName)s %(module)s %(message)s' 861 SIMPLE_FORMAT = '%(asctime)s %(module)s %(message)s' 862 COMPLETE_FORMAT = '%(asctime)s %(name)s %(funcName)s %(lineon)s %(module)s %(message)s' 863 864 # 拼接日志文件存儲路徑 865 LOGFILE_PATH = os.path.join(settings.LOG_DIR, 'atm_log', 'atm.log') 866 USER_LOGFILE_PATH = os.path.join(settings.LOG_DIR, 'usr_log', 'usr_log') 867 868 869 # print(LOGFILE_PATH, USER_LOGFILE_PATH) 870 # 這個就是之前通過手工的方式創建的四個日志核心組件 871 LOGGING_DIC = { 872 # 日志字典的版本,這個自己設置的 873 'version': 1, 874 # 日志格式定義字段,通過一定格式的字符串進行創建 875 'formatters': { 876 # 定義了日志的表示格式標准格式,簡單格式和完整格式 877 'standard': { 878 'format': STANDARD_FORMAT 879 }, 880 # 簡單格式 881 'simple': { 882 'format': SIMPLE_FORMAT 883 }, 884 # 完整格式 885 "complete":{ 886 "format": COMPLETE_FORMAT 887 } 888 }, 889 # 日志過濾器,暫時設置成空 890 'filters': {}, 891 # 日志處理器 892 'handlers': { 893 # 定義了兩種日志處理器 894 # 把日志內容打印到終端 895 'console': { 896 'level': 'DEBUG', # 日志級別 897 'class': 'logging.StreamHandler', # 日志流處理器 898 'formatter': 'simple' # 使用的打印格式是上面設置的simple 899 }, 900 'default': { 901 'level': 'DEBUG', 902 'class': 'logging.handlers.RotatingFileHandler', # 設置文件通過一定大小之后就換文件 903 'formatter': 'standard', # 寫入文件的格式是上面定義的標准格式 904 'filename': LOGFILE_PATH, # 寫入文件的路徑 905 'maxBytes': 1024 * 1024 * 5, # 日志文件的最大大小為5M 超出后 換文件 906 'backupCount': 5, # 最多留五個日志文件 907 'encoding': 'utf-8', # 寫入的時候編碼方式 908 }, 909 'user_stream': { 910 'level': 'DEBUG', 911 'class': 'logging.handlers.RotatingFileHandler', # 設置文件通過一定大小之后就換文件 912 'formatter': 'standard', # 寫入文件的格式是上面定義的標准格式 913 'filename': USER_LOGFILE_PATH, # 寫入文件的路徑 914 'maxBytes': 1024 * 1024 * 5, # 日志文件的最大大小為5M 超出后 換文件 915 'backupCount': 5, # 最多留五個日志文件 916 'encoding': 'utf-8', # 寫入的時候編碼方式 917 }, 918 }, 919 # 日志生成器 920 'loggers': { 921 # 在getLogger的時候 如果指定的名稱 不存在 或者不給名稱 用的就是默認的 922 # 在這里如果key為空 它就是默認的 923 # 你可以自己定義生成器的名稱 並且他們還能使用相同的默認配置 924 '': { 925 'handlers': ['default'], 926 'level': 'DEBUG', 927 'propagate': False, 928 }, 929 # 在getLogger的時候 如果指定的名稱 不存在 或者不給名稱 用的就是默認的 930 # 在這里如果key為空 它就是默認的 931 # 你可以自己定義生成器的名稱 並且他們還能使用相同的默認配置 932 'user_log': { 933 'handlers': ['user_stream', 'console'], 934 'level': 'DEBUG', 935 'propagate': False, 936 }, 937 }, 938 939 } 940 format參數中可能用到的格式化串: 941 %(name)s Logger的名字 942 %(levelno)s 數字形式的日志級別 943 %(levelname)s 文本形式的日志級別 944 %(pathname)s 調用日志輸出函數的模塊的完整路徑名,可能沒有 945 %(filename)s 調用日志輸出函數的模塊的文件名 946 %(module)s 調用日志輸出函數的模塊名 947 %(funcName)s 調用日志輸出函數的函數名 948 %(lineno)d 調用日志輸出函數的語句所在的代碼行 949 %(created)f 當前時間,用UNIX標准的表示時間的浮 點數表示 950 %(relativeCreated)d 輸出日志信息時的,自Logger創建以 來的毫秒數 951 %(asctime)s 字符串形式的當前時間。默認格式是 “2003-07-08 16:49:45,896”。逗號后面的是毫秒 952 %(thread)d 線程ID。可能沒有 953 %(threadName)s 線程名。可能沒有 954 %(process)d 進程ID。可能沒有 955 %(message)s用戶輸出的消息 956 957 時間中可能用到的格式化字符串 958 %a Locale’s abbreviated weekday name. 959 %A Locale’s full weekday name. 960 %b Locale’s abbreviated month name. 961 %B Locale’s full month name. 962 %c Locale’s appropriate date and time representation. 963 %d Day of the month as a decimal number [01,31]. 964 %H Hour (24-hour clock) as a decimal number [00,23]. 965 %I Hour (12-hour clock) as a decimal number [01,12]. 966 %j Day of the year as a decimal number [001,366]. 967 %m Month as a decimal number [01,12]. 968 %M Minute as a decimal number [00,59]. 969 %p Locale’s equivalent of either AM or PM. (1) 970 %S Second as a decimal number [00,61]. (2) 971 %U Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0. (3) 972 %w Weekday as a decimal number [0(Sunday),6]. 973 %W Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0. (3) 974 %x Locale’s appropriate date representation. 975 %X Locale’s appropriate time representation. 976 %y Year without century as a decimal number [00,99]. 977 %Y Year with century as a decimal number. 978 %z Time zone offset indicating a positive or negative time difference from UTC/GMT of the form +HHMM or -HHMM, where H represents decimal hour digits and M represents decimal minute digits [-23:59, +23:59]. 979 %Z Time zone name (no characters if no time zone exists). 980 %% A literal '%' character.
分割線-----------------------------------------------------------------------下面都是沒有帶答案的
一. 概念題
1. 編程 2. cpu, 內存,硬盤 3. 運行程序,硬件的工作過程 4. 進制之間的轉換 5. 操作系統 6. 編程語言的分類 機器語言 匯編語言 高級語言 編譯型語言 解釋性語言 7. 執行python程序的兩種方式 8. 變量 變量的命名規范 變量名的命名風格 變量的三個特征 常量 常量的命名規范 9. 引用計數 10. 數據類型 11. python2和python3的區別 12. 運算 比較運算 賦值運算 增量賦值 鏈式賦值 交叉賦值 解壓賦值 邏輯運算 身份運算 13. 運行python程序的三個步驟 14. 小整數池 15. if判斷的四種語法 16. 結束while循環的兩種方式 17. while else的用法 18. for主要用來做循環取值 19. 可變類型與不可變類型是按照什么標准划分的 20. 計算機系統分為哪三層 21. 字符編碼 編碼和解碼 解決亂碼的核心法則 python2默認的編碼方式 python3默認的編碼方式 #coding:文件頭的作用 22. 字符編碼的操作核心法則(3條) 23. 文件 24. 文件處理的三個步驟 25. 上下文管理的方式 26. 操作文件內容的三種純凈模式 27. 控制文件內容格式的兩種模式 28. 文件指針移動的單位是字節還是字符 29. 文件是否可以修改? 文件'修改'的兩種方式 30. 函數 31. 函數的分類 32. 使用函數的原則 33. 函數的兩個明確階段 34. 函數定義的三種形式 35. 函數調用的三種形式 36. return的特點 yield的特點 37. 函數參數的兩大類 形參(形參又分為幾類) 實參(實參又分為幾類) 38. 為什么說函數是第一類對象? 39. 函數與變量的四種使用方式 40. 函數的嵌套定義以及其應用場景 41. 函數的嵌套調用以及其應用場景 42. 什么是名稱空間 43. 名稱空間的分類(三類) 44. 名稱空間的產生順序 45. 名稱空間的銷毀順序 46. 什么是作用域 47. 作用域的分類(兩種) 48. 作用域關系的核心要義(一句話) 49. 什么是閉包函數 50. 為函數體傳值的兩種方式(分別的特點) 51. 什么是裝飾器 52. 裝飾器的分類(兩大類) 53. 什么是語法糖 54. 裝飾器的語法糖 55. 有參裝飾器的模板 56. 無參裝飾器的模板 57. 疊加裝飾器的加載順序 58. 疊加裝飾器的執行順序 59. 什么是迭代器 60. 迭代器的兩個優點 61. 迭代器的兩個缺點 62. 什么是可迭代對象 63. 什么是迭代器對象 64. python中的可迭代對象有哪些(6個) 65. python中的迭代器對象有哪些(1個) 66. for循環本質上是個迭代器循環,原理是什么(3步) 67. 什么是生成器 68. python中提供生成器的關鍵字 69. 三元表達式 70. 列表生成式 71. 生成器表達式 72. 字典生成式 73. 什么是匿名函數 74. 匿名函數的應用場景(2個) 75. 什么是函數遞歸 76. 遞歸要滿足的兩個原則 77. 遞歸的兩個明確的階段 78. 什么是面向過程編程 79. 面向過程編程的優點和缺點 80. 什么是面向對象編程 81. 面向對象編程的優點和缺點 82. 什么是模塊 83. 模塊的作用 84. 模塊的分類(4類) 85. 模塊導入的兩種方式,區別是什么 86. import導入模塊的三個步驟 87. import導入的三種語法 88. from導入模塊的三個步驟 89. from導入模塊的三種語法 90. 模塊的搜索順序 91. 什么是包 92. __init__文件是干什么用的 93. __init__文件應該包含哪些內容 94. 包的作用 95. 相對導入和絕對導入 96. 相對路徑和絕對路徑 97. 文件的兩種執行方式,區別是什么? 98. 什么是對象 99. 什么是類,面向對象編程為什么要有類 100. 什么叫做面向對象是更高程度的一種封裝 101. 類的兩種用途 102. __init__方法在什么時候會被觸發 103. python3中類與類型是一個概念嗎 104. 什么是繼承 105. 什么是組合 106. 什么是多態 107. 什么是封裝 108. 繼承分為哪兩類, 區別是什么 109. 類分為哪兩類, 區別是什么 110. 重用父類功能的兩種方式, 分別有什么特點 111. 單繼承背景下屬性的查找順序 112. 多繼承背景下屬性的查找順序(兩類) 菱形繼承 非菱形繼承 113. 封裝的特點是什么? 114. 封裝數據屬性的目的 115. 封裝函數屬性的目的 116. 隱藏的__開頭的屬性有哪些特點(4個) 117. property裝飾器主要是用來解決什么問題的 118. 什么是綁定方法與非綁定方法 119. classmethod裝飾器是用來綁定什么的 120. staticmethod裝飾器是用來綁定什么的 121. 什么是反射? 122. 反射的四個方法(增刪改查)
二. 零散的知識點
is 比較的是兩個地址 == 比較的兩個變量的值 id 打印出來的是變量的內存地址信息 input python中交互關鍵字 global 全局變量 nonlocal __all__ 在模塊的導入過程中,我們可以通過__all__來控制外部可以使用此模塊的哪些內容 __name__ 執行文件的兩種方式會導致__name__的值不一樣, 直接執行__name__==__main__,導入模塊執行會__name__等於模塊名 sys.modules 當前內存中加載的模塊名稱mdcmd,是字典的形式 sys.path 當前的系統路徑,不是內置模塊,內存中也不存在此模塊的時候,就會按照順序到sys.path這個列表中去查詢 __init__方法 在類中出現的,當創建對象的時候會自動的調用此方法,並把創建的空對象當做第一個參數傳遞進去 __init__文件 在包中出現的,用來導入包內的其他模塊。在導入包的時候其實執行的__init__模塊 __dict__ 對象或者類去查看名稱空間用的,是一個字典 __file__ 當前文件的絕對路徑,(win中也就是從盤符開始的路徑) super函數 目前學到的只是繼承父類的屬性的時候用到的,super(父類名,self).方法名, 會給我們返回一個特殊的對象,按照mro列表中的順序進行屬性查找的。 __str__ 在類中創建一個__str__方法, 一定要有返回值,否則會報錯,這樣直接print(對象)的時候會給我們打印返回的值 __del__ 在類中創建一個__del__方法,在方法中刪除系統資源,代表在對象被刪除的時候會給我們自動的刪除沒有被回收的系統資源 continue: 不執行當前continue之后的代碼, 直接進入下一次循環, 不應該將continue作為最后一步執行的代碼 break 跳出當前循環 while...else 不是因為break而跳出循環的時候就會執行else的代碼 a, b, *_ = [1, 2, 3, 4] 在解壓賦值的時候,如果我們不想要后面的一些值就需要以這樣的方式來書寫 __iter__ 在迭代器和可迭代對象的時候學習的,使用此方法之后會把可迭代對象轉換成迭代器對象 __next__ 具有此方法的對象都是迭代器對象,我們可以通過這個方法獲得迭代器對象的值 lambda 匿名函數 lambda 參數一, 參數二: 表達式 返回值就是表達式的值
三. 數據類型
數據類型
int
float
str
list
tuple
dict
set
四. 文件操作的常用方法
文件操作的方法
read
write
readline
readlines
writeline
writelines
seek
tell
五. 常用模塊
常用模塊(14個)
time
datetime
sys
os
random
shutil
pickle
shelve
json
xml
configparser
logging
re
hashlib
subprocess
七. 內置模塊
max 求最大值, res = max(salaries, key=lambda key: salaries[key]), key是比較標准 min 求最小值, sorted 從大到小順序排列 sorted(salaries, key=lambda key: salaries[key], reverse=True) filter 過濾 res = filter(lambda item: not item.endswith('_dsb'), test) 如果不是以_dsb結尾的就保留下來,返回一個迭代器 它不能向map和reduce一樣對數據進行修改, 應用想去掉列表中的某個值x reduce reduce需要導入才能進行使用 # 求1-100的和 # 這第三個參數是初始值,如果沒有,則會從迭代對象中找到一個值賦值給它 from functools import reduce res = reduce(lambda x, y: x + y, range(100), 100) print(res, type(res)) # 拼接字符串 test = ['yuanhao_dsb', 'egon_dsb', 'wupeiqi_dsb', 'alex_dsb', 'egon'] from functools import reduce res = reduce(lambda x, y: x + y, test, '10000') print(res, type(res)) 應用在拼接字符串或者是數字的疊加過程 map 映射 res = map(lambda item: item + '_dsb', lists)將lists的每個參數傳遞給item進行映射之后返回一個迭代器 應用在對某一類值進行修改 sum sum就是單純的求和 round 對浮點數進行四舍五入取值 power 返回冪運算值或者與其指定的數值的模 divmod 返回兩個數值的商和余數 dir 返回對象或者當前作用域內的屬性列表 ascii 返回對象的可打印表字符串表現方式 vars 返回當前作用域內的局部變量和其值組成的字典,或者返回對象的屬性列表 all 判斷可迭代對象每個元素是否都是True any 判斷可迭代對象中是否又True的元素 zip 聚合傳入的每個迭代器中的相同位置的元素,返回一個新的元祖類型迭代器 reversed 反轉序列生成新的可迭代對象 bytearray 根據傳入的參數創建一個新的字節數組 bytes 根據傳入的參數創建一個新的不可變字節數組 memoryview 根據傳入的參數創建一個新的內存查看對象 frozenset 根據傳入的參數創建一個新的不可變集合 enumerate 根據可迭代對象創建枚舉對象 slice 根據傳入的參數創建一個切片對象 super 根據傳入的參數創建一個新的子類和父類的關系的代理對象 object 創建一個新的object對象
。