《簡明 Python 教程》筆記
《簡明 Python 教程》筆記
原版:http://python.swaroopch.com/
中譯版:https://bop.mol.uno/
- 有 int、float 沒 long、double。沒 char,string 不可變。
- help 函數
如果你有一行非常長的代碼,你可以通過使用反斜杠將其拆分成多個物理行。這被稱作顯式行連接(Explicit Line Joining)5:
s = ‘This is a string. \ This continues the string.‘ print(s)
在某些情況下,會存在一個隱含的假設,允許你不使用反斜杠。這一情況即邏輯行以括號開始,它可以是方括號或花括號,但不能是結束括號。這被稱作 隱式行連接(Implicit Line Joining)。i = \ 5
當我們聲明一個諸如 *param 的星號參數時,從此處開始直到結束的所有位置參數(Positional Arguments)都將被收集並匯集成一個稱為“param”的元組(Tuple)。
類似地,當我們聲明一個諸如 **param 的雙星號參數時,從此處開始直至結束的所有關鍵字參數都將被收集並匯集成一個名為 param 的字典(Dictionary)。def total(a=5, *numbers, **phonebook): print(‘a‘, a) #遍歷元組中的所有項目 for single_item in numbers: print(‘single_item‘
- 如果 return 語句沒有搭配任何一個值則代表著 返回 None。None 在 Python 中一個特殊的類型,代表著虛無。每一個函數都在其末尾隱含了一句 return None,除非你寫了你自己的 return 語句。
- Python 中的 pass 語句用於指示一個沒有內容的語句塊。
- 函數的第一行邏輯行中的字符串是該函數的 文檔字符串(DocString),通過函數的
__doc__
屬性獲取,help 函數就是取的這個值。字符串約定(不是必須)是一串多行字符串,其中第一行以某一大寫字母開始,以句號結束。第二行為空行,後跟的第三行開始是任何詳細的解釋說明。 - 當模塊第一次被導入時,它所包含的代碼將被執行。
- 包是指一個包含模塊與一個特殊的
__init__.py
文件的文件夾,後者向 Python 表明這一文件夾是特別的,因為其包含了 Python 模塊。 - Python 中有四種內置的數據結構——列表(List)、元組(Tuple)、字典(Dictionary)和集合(Set)。
- 列表是可變的(Mutable)而字符串是不可變的(Immutable)。
- 元組(Tuple)用於將多個對象保存到一起。你可以將它們近似地看作列表,但是元組不能提供列表類能夠提供給你的廣泛的功能。元組的一大特征類似於字符串,它們是不可變的,也就是說,你不能編輯或更改元組。
- 一個空的元組由一對圓括號構成,就像 myempty = () 這樣。然而,一個只擁有一個項目的元組並不像這樣簡單。你必須在第一個(也是唯一一個)項目的後面加上一個逗號來指定它,如此一來 Python 才可以識別出在這個表達式想表達的究竟是一個元組還是只是一個被括號所環繞的對象。
- 字典的鍵值只能使用不可變的對象(如字符串)。
- 列表、元組和字符串可以看作序列(Sequence)的某種表現形式。序列的主要功能是資格測試(Membership Test)(也就是 in 與 not in 表達式)和索引操作(Indexing Operations),它們能夠允許我們直接獲取序列中的特定項目。
- 如果你希望創建一份諸如序列等復雜對象的副本(而非整數這種簡單的對象(Object)),你必須使用切片操作來制作副本。如果你僅僅是將一個變量名賦予給另一個名稱,那麽它們都將引用同一個對象。
- 圍繞函數,也就是那些能夠處理數據的代碼塊設計我們的程序,這被稱作面向過程(Procedure-oriented)的編程方式。還有另外一種組織起你的程序的方式,它將數據與功能進行組合,並將其包裝在被稱作“對象”的東西內。在大多數情況下,你可以使用過程式編程,但是當你需要編寫一個大型程序或面對某一更適合此方法的問題時,你可以考慮使用面向對象式的編程技術。
- 類方法與普通函數只有一種特定的區別——前者必須多加一個參數(習慣叫self,但是可以是任何名字)在參數列表開頭,這個名字必須添加到參數列表的開頭,但是你不用在你調用這個功能時為這個參數賦值,Python 會為它提供。
- 當你調用一個這個對象的方法,如 myobject.method(arg1, arg2) 時,Python 將會自動將其轉換成 MyClass.method(myobject, arg1, arg2)——這就是 self 的全部特殊之處所在。
__init__
方法會在類的對象被實例化(Instantiated)時立即運行,相當於java 的構造方法。- 字段(field)只不過是綁定(Bound)到類與對象的命名空間(Namespace)的普通變量。字段(Field)有兩種類型:類變量與對象變量
- 除了
類名.字段
,我們還可以使用self.__class__.字段
來引用類變量,因為每個對象都通過 self.class 屬性來引用它的類。 類方法(classmethod)和靜態方法(staticmethod)
class Person: @classmethod def id(cls): pass
裝飾器(decorator)@classmethod
等價於調用 id = classmethod(id)
- 雙下劃線開頭的字段或方法是私有的,對類和對象來說都是如此。
class Student(SchoolMember):
表示Student
是SchoolMember
的子類。要想使用繼承,在定義類需要在類後面跟一個包含基類名稱的元組。- 如果子類中定義了
__init__
方法,則實例化子類時不會自動調用父類的__init__
方法;如果子類中沒有定義,則初始化子類時會自動調用父類的__init__
。 - Python 提供了一個叫作
Pickle
的標準模塊,通過它你可以將任何純 Python 對象存儲到一個文件中,並在稍後將其取回。這叫作持久地(Persistently)存儲對象。 - 通過在程序的第一行寫
# encoding=utf-8
表明當前 python 文件時用 utf-8 編碼的。 用
try..except..else..finally
處理異常。用raise
拋出異常,被拋出的必須是Exception
的子類對象。
python try: text = input(‘Enter something --> ‘) except EOFError: print(‘Why did you do an EOF on me?‘) except KeyboardInterrupt as ex: print(‘You cancelled the operation.‘) else: # 如果沒有異常則執行 print(‘You entered {}‘.format(text)) finally: pass
with
語句。可以使一些finally
寫起來簡單些。
python with open("poem.txt") as f: for line in f: print(line, end=‘‘)
with
會獲取到 open() 返回的對象 f,並在接下來的代碼塊執行之前先執行 f.__enter__()
,在代碼塊執行之後接著執行 f.__exit__()
。
- 熟悉 Python 標準庫 之後,許多事都變得很容易。
用元組多項賦值,也可以以此實現多返回。
python a,b = 1,2
- class 中有些方法有特殊意義,特殊方法用來模擬內置類(built-in types)的一些行為。
__init__(self, ...)
This method is called just before the newly created object is returned for usage.__del__(self)
Called just before the object is destroyed (which has unpredictable timing, so avoid using this).__str__(self)
Called when we use the print function or when str() is used.__lt__(self, other)
Called when the less than operator (<) is used. Similarly, there are special methods for all the operators (+, >, etc.)__getitem__(self, key)
Called when x[key] indexing operation is used.__len__(self)
Called when the built-in len() function is used for the sequence object.
lambda 表達式
:points = [{‘x‘: 2, ‘y‘: 3}, {‘x‘: 4, ‘y‘: 1}] points.sort(key=lambda i: i[‘y‘]) print(points)
列表推導(List Comprehension):
listone = [2, 3, 4] listtwo = [2*i for i in listone if i > 2] print(listtwo)
- 通過使用
*
和**
前綴可以向函數傳遞元素個數不確定的元組和字典。 What Next。 //TODO
《簡明 Python 教程》筆記