Python基礎筆記

2021-10-08 04:27:46 字數 4841 閱讀 4443

1、fn是函式物件,fn()是呼叫函式。所有的函式都是可呼叫物件。乙個類例項也可以變成乙個可呼叫物件,只需要實現乙個特殊方法__call__()。

2、如果形參執行的是乙個物件(如a),當我們通過形參去修改物件時,會影響到所有指向該物件的變數。

解決方法:a.copy()或a[:]

3、在定義函式時,可以在形參前邊加上乙個*,這樣這個形參將會獲得到所有的實參,它將會將所有的實參儲存到乙個元組中,如a,b,*c = (1,2,3,4,5,6),則a=1,b=2,c=(3,4,5,6),如果*在中間,則需要使用關鍵字引數的形式傳遞。

​ 如果在形參的開頭直接寫乙個*,則要求我們的所有的引數必須以關鍵字引數的形式傳遞。

​ *形參只能接受位置引數,而不能接受關鍵字引數

​ **形參可以接受其他的關鍵字引數,它會將這些引數統一儲存到乙個字典中,**形參只能有乙個,並且必須寫在所有引數的最後

​ 傳遞實參時,也可以在序列型別的引數前新增*,這樣他會自動將序列中的元素依次作為引數傳遞,要求序列中元素的個數必須和形參個數一致(如t=(10,20,30),fn(*t))

​ 通過**來對乙個字典進行解包操作

4、help(function)可以檢視function函式功能,可通過def fn(a:int,b:bool,c:str)對變數進行描述,這並不代表a必須是int型別,僅僅是乙個描述。

5、通過locals()可檢視當前命名空間

6、sorted()和sort()用法基本一致,使用sorted()可以對任意的序列進行排序,並且使用sorted()排序不會影響原來的物件,而是返回乙個新物件

7、形成閉包的條件:

​ ①函式巢狀

​ ②將內部函式作為返回值返回

​ ③內部函式必須要使用到外部函式的變數

8、如果我們直接通過修改函式的**來完成函式列印的需求,會產生以下問題:

​ ①如果要修改的函式過多,修改起來會很麻煩

​ ②不方便後期的維護

​ ③違反開閉原則(ocp)

我們希望在不修改原函式的基礎上,對函式進行擴充套件,我們可以採用裝飾器,在不修改原來函式的情況下來對函式進行擴充套件,在開發中,都是通過裝飾器來擴充套件函式功能。在定義函式時,可以通過@裝飾器來使用指定的裝飾器,來裝飾當前的函式,同時可以為乙個函式指定多個裝飾器。

9、封裝是物件導向三大特性之一,封裝指的是隱藏物件中一些不希望被外部所訪問到的屬性和方法

​ 如何隱藏乙個物件中的屬性?

- 將物件的屬性名,修改為乙個外部不知道的名字
​ 如何獲取(修改)物件中的屬性?

- 需要提供乙個getter和setter方法使外部可以訪問到屬性

- getter獲取物件中的指定屬性(get_屬性名)

- setter用來設定物件的指定屬性(set_屬性名)

​ 使用封裝,確實增加了類的定義複雜程度,但是它也確保了資料的安全性

- 隱藏了屬性名,使呼叫者無法隨意的修改物件中的屬性

- 增加了getter和setter方法,很好的控制了屬性是否是唯讀的

如果希望屬性是唯讀的,則可以直接去掉setter

如果希望屬性不能被外部訪問,則可以直接去掉getter

- 使用setter方法設定屬性,可以增加資料的驗證,確保資料的值是正確的

- 使用getter方法獲取屬性,使用setter方法設定屬性

可以在讀取屬性和修改屬性的同時做一些其他的處理

10、可以為物件的屬性使用雙下劃線開頭,__***

​ 雙下劃線開頭的屬性,是物件的隱藏屬性,隱藏屬性只能在類的內部訪問,無法通過物件訪問

​ 其實隱藏屬性只不過是python自動為屬性改了乙個名字

​ 實際上是將名字修改為了_類名__屬性名,比如__name -> _person__name

​ 使用__開頭的屬性,實際上依然可以在外部訪問,所以這種方式一般不用

​ 一般我們會將一些私有屬性(不希望被外部訪問的屬性)以_開頭

​ 一般情況下,使用_開頭的屬性都是私有屬性,沒有特殊需要不要修改私有屬性

11、property裝飾器,用來將乙個get方法,轉換為物件的屬性

​ 新增為property裝飾器以後,我們就可以像呼叫屬性一樣使用get方法

​ 使用property裝飾的方法,必須和屬性名一樣

​ setter方法的裝飾器:@屬性名.setter

12、繼承是物件導向三大特性之一

​ 通過繼承我們可以使乙個類獲取到其他類中的屬性和方法

​ 在定義類時,可以在類名後的括號中指定當前類的父類(超類,基類,super)

​ 子類(衍生類)可以直接繼承父類中的所有屬性和方法

​ 通過繼承可以直接讓子類獲取到父類的方法或屬性,避免編寫重複性的**,並且也符合ocp原則,所以需要通過繼承來對乙個類進行擴充套件

13、在建立類時,如果省略了父類,則預設父類為object,object是所有類的父類,所有類都繼承自object。

父類中的所有方法都會被子類繼承,包括特殊方法,也可以重寫特殊方法。希望可以直接呼叫父類的__init__來初始化父類中定義的屬性,super()可以用來獲取當前類的父類,並且通過super()返回物件呼叫父類方法時,不需要傳遞self。

14、類名.__base__這個屬性可以用來獲取當前類的所有父類

​ 在python中是支援多重繼承的,也就是可以為乙個類同時指定多個父類

​ 可以在類名的()後面新增多個類,來實現多重繼承

​ 多重繼承,會使子類同時擁有多個父類,並且會獲得到所有父類中的方法

​ 在開發中沒有特殊情況,應該避免使用多重繼承,因為多重繼承會讓**過於複雜

​ 如果多個父類中有同名的方法,則會從第乙個父類中尋找,然後找第二個,然後找第三個。。。前面會覆蓋後面的

15、多型是物件導向的三大特徵之一,多型從字面上理解是多種形態。乙個物件可以以不同的形態去呈現。如果乙個函式只適用於乙個類,其他類的物件都無法使用該函式,這個函式就違反了多型,這樣導致函式的適應性非常地差。

16、物件導向的三大特徵

繼承 多型

17、類屬性,直接在類中定義的屬性是類屬性,類屬性可以通過類或類的例項訪問到,但是類屬性只能通過類物件來修改,無法通過例項物件修改。

​ 例項屬性,通過例項物件新增的屬性屬於例項屬性,例項屬性只能通過例項物件來訪問和修改,類物件無法訪問修改

類方法靜態方法

19、特殊方法(魔法方法)

特殊方法都是使用__開頭和結尾的,特殊方法一般不需要我們手動呼叫,需要在一些特殊情況下自動執行

20、當我們模組中**過多,或者乙個模組需要被分解為多個模組,這時就需要使用到包

普通的模組就是乙個py檔案,而包是乙個資料夾

包中必須要包含乙個__init__.py這個檔案,這個檔案中可以包含包中的主要內容

__pycache__是模組的快取檔案

py**在執行前,需要被解析器先轉換為機器碼,然後再執行

因此在使用模組時,也需要將模組的**先轉換為機器碼然後再交由計算機執行

而為了提高程式執行的效能,python會在編譯過一次以後,將**儲存到乙個快取檔案中

這樣在下次載入這個模組時,就可以不再重新編譯而是直接載入快取中編譯好的**即可

21、程式執行過程中,一旦出現異常將會導致程式立即終止,異常以後的**全部都不會執行

處理異常

22、檔案的讀取

通過open()來開啟乙個檔案,可以將檔案分為兩種型別

一種是純文字檔案(使用utf-8等編碼編寫的文字檔案),一種是二進位制檔案(、***、ppt等檔案)

open()開啟檔案時,預設是以文字檔案的形式開啟的,但是open()預設的編碼為none,因此處理文字檔案時,必須要指定檔案的編碼

with open(file_name, encoding=『utf-8』) as file_obj:

- 通過read()來讀取檔案中的內容

- 如果直接呼叫read()會將文字檔案的所有內容全部都讀取出來

- 如果要讀取的檔案較大的話,會一次性將檔案的內容載入到記憶體中,容易導致記憶體洩露

因此對於較大的檔案,不要直接呼叫read()

read()可以接受乙個size作為引數,該引數用來指定要讀取的字元的數量,預設值為-1,它會讀取檔案中的所有字元,可以為size指定乙個值,這樣read()會讀取指定數量的字元。每一次讀取都是從上次讀取到位置開始讀取的,如果已經讀到了檔案的最後,則會返回" "空串,readline()用於一行一行讀取內容,它會一次性將讀取到的內容封裝到乙個列表中返回

- tell()方法用來檢視當前讀取的位置

- seek()可以修改當前讀取的位置,需要兩個引數

- 第乙個引數,是要切換到的位置

- 第二個引數,計算位置方式

- 可選值:

- 0 從頭開始,預設值

- 1 從當前位置計算

- 2 從最後位置開始計算

23、檔案的寫入

使用open()開啟檔案時必須要指定開啟檔案所要做的操作(讀、寫、追加)

如果不指定操作型別,則預設是讀取檔案,而讀取檔案時是不能向檔案中寫入的

- 『r』表示唯讀;

- 『w』表示是可讀的,使用w寫入檔案時,如果檔案不存在會建立檔案,如果檔案存在則會截斷檔案(即刪除原來檔案中的所有內容)

- 『a』表示追加內容,如果檔案不存在會建立檔案,如果檔案存在則會向檔案中追加內容

- +為操作符增加功能

- 『x』用來新建資料夾,如果不存在則建立,存在則報錯

- 『r+』既可讀又可寫。

讀取模式

- 『t』讀取文字檔案(預設值)

- 『b』讀取二進位制檔案

write()可以向檔案中寫入內容

如果操作的是乙個文字檔案的話,則write()需要傳遞乙個字串作為引數

該方法可以分多次向檔案中寫入內容,寫入完成以後,該方法會返回寫入的字元的個數

python基礎筆記 python基礎筆記

一 變數 定義變數的規則 1 變數名只能是字母 數字 下劃線的組合 2 變數名不能以數字開頭 3 python中使用的關鍵字不能作為變數 注意 行業預設規則 1 變數命令見名知意 2 駝峰 3 字母全大寫代表是常量 例子 name mr liao name1 name print name,name...

免費python基礎筆記 python基礎學習筆記

1.python中的編碼格式 a.ascii碼 ascii碼共有127個字元,包括數字,大小寫字母,和一些符號,比如常見的字元的ascii碼表示有 a 65,z 132,ascii碼是用乙個位元組表示的,其主要的缺點就是因為在記憶體中只佔乙個位元組,所以無法被用來表示中文,只能表示一些單字元元素。針...

python基礎筆記

python的資料型別 1 基本資料型別 none,boolean,integer,float,long,complex 匯入python精確除法 from future import division 2 序列型別 list,tuple,string,xrange 只在python 2.中有 py...