python基礎知識你學會了多少


前言

學習是一個循序漸進的過程,不在於你學了多少,而在於你學會了多少。(裝個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對象

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM