摘要:本文收納了Python學習者常用的庫和包,並介紹了Python使用中熱門的問題。
0一、Python 簡介
什麼是 Python
- 一種面向對象的高級動態可解釋型腳本語言。
- Python 解釋器一次讀取一行代碼,將其解釋爲低級機器語言 (如字節代碼) 並執行它。
- 所以這種語言常常會引起運行錯誤。
爲何選擇 Python (優點)
- Python 是當前最流行的語言,由於它更容易編碼且具備很強的可解釋性。
- Python 是一種面向對象的編程語言,也可用於編寫一些功能代碼。
- Python 是可以很好地彌補業務和開發人員之間差距。
- 與其餘語言 (如 C#/Java) 相比,Python 程序被推向市場的時間更短。
- Python 自帶大量的機器學習和分析包。
- 大量社區和書籍可用於支持 Python 開發人員。
- 從預測分析到UI,幾乎全部類型的應用程序均可以用 Python 實現。
- Python 程序無需聲明變量類型。 所以,所構建的應用程序能有更快的運行速度。
爲何不選擇 Python (劣勢)
- 與其餘語言 (C++,C#,Java) 相比,Python 程序的運行更慢,這是由於Python 中缺乏相似 Just In Time 優化器的支持。
- Python 語法空白約束給新手編碼實現帶來一些困難。
- Python 不像 R 語言那樣提供高級的統計功能。
- Python 不適合進行低級系統和硬件交互。
Python 是如何工做
下圖展現了 Python 在機器上的運行機制。這裏的關鍵是解釋器,它是負責將高級的 Python 語言編譯成低級的機器語言,以便理解。python
0二、變量——目標類型及範圍
- 可在程序中使用的變量存儲信息,如保存用戶輸入,程序的本地狀態等。
- Python 中的變量以名字命名。
Python 中變量類型包括數字,字符串,集合,列表,元組和字典,這些都是標準的數據類型。程序員
聲明並給變量賦值
以下所示:這裏首先分別爲變量 myFirstVariable 分配整型數值1,字符串「Hello You」。因爲 Python 中的數據類型是動態變化的,所以這種重複賦值操做是能夠實現的。正則表達式
Python 中變量賦值操做又稱爲綁定 (blinding)。數據庫
數值型
以下所示,Python 支持整型,小數,浮點型數據。express
此外,也能支持長整型,以 L 爲後綴表示,如999999999999L。編程
字符串
字符串就是字母的序列表示文本信息。數組
字符串的值用引號括起來,以下所示。安全
字符串是不可改變的,一旦建立,就不能被修改。以下所示:網絡
當字符串變量被賦予一個新值時,Python 將建立一個新的目標來存儲這個變量值。數據結構
局部變量和全局變量
局部變量
局部變量,如在一個函數內聲明一個變量,則該變量只存在於該函數中。
局部變量在外部是不能被訪問的,以下所示。
Python 中 if-else 和 for/while 循環模塊是不能建立局部變量,以下所示在 for/while 循環中:
輸出爲:
在 if-else 模塊中:
輸出爲
所有變量
- 全局變量能夠經過任意一個全局函數訪問,它們存在於 __main__ 框架中。
- 此外,在函數以外你也能夠聲明一個全局變量。值得注意得是,當須要爲一個全局變量分配新值時,必須使用「global」關鍵字,以下所示:
當移除「Global TestMode」只能在 some_function() 函數中將變量設置爲 False。若是你想在多個模塊間共享一個全局變量,那麼你須要建立一個共享模塊文件。如 configuration.py,並在文件中找到你所需的變量。最後導入共享模塊。
查看變量類型
- 經過 type() 函數來查看變臉類型,以下所示。
整型變量中的逗號
- 逗號可視爲是變量序列,以下所示。
0三、操做
數值操做
Python 支持基礎的加減乘除數值計算,也支持地板除法 (floor division),以下所示。
此外,Python 還支持指數運算 (**),以下所示。
同時,Python 還能進行除法取餘操做,以下所示。
字符串操做
字符串拼接
字符串複製
字符串切片
字符串反序
負索引
若是你想獲得字符串的最後一個字符,那須要使用負索引值,以下所示。
查看索引值
正則表達式
- split():經過正則表達式將一個字符串分割獲得一個列表。
- sub():經過正則表達式取代所要匹配的字符。
- subn():經過正則表達式取代所要匹配的字符並返回所替代字符的個數。
Casting
- str(x):將變量 x 轉爲字符串類型
- int(x):將變量 x 轉爲整型
- float(x):將變量 x 轉爲浮點型
集合操做
- 集合是一種無序的數據集合,定義一個集合變量,以下所示。
集合交集
- 獲取兩個集合的公共部分,以下所示。
集合差別
- 獲取兩個集合之間的不一樣部分,以下所示。
集合並集
- 獲取兩個集合的並集,以下所示。
三元運算符
- 用於在一行編寫條件語句,語法結構爲 [If True] if [Expression] Else [If False],以下所示。
0四、註釋
單行註釋
多行註釋
0五、表達式
可用於布爾運算,如:
- Equality:==
- Not Equality:!=
- Greater:>
- Less:<
- Greater or Equal:>=
- Less or Equal:<=
0六、Pickling
將對象轉換爲字符串並將字符串轉儲爲一個文件的過程稱爲 pickling,反之則稱爲 unpickling。
0七、函數
- 函數是一種能夠在代碼中執行的語句序列。若是在你的代碼中出現重複的語句,那麼能夠建立一個可重用的函數並在程序中使用它。
- 函數也能夠引用其餘函數。
- 函數消除了代碼中的重複,這使得代碼調試和問題查找變得更容易。
- 函數使得代碼更易於理解且易於管理。
- 函數容許將一個大型的應用程序拆分爲一些小的模塊。
定義一個新的函數
調用一個函數
查看字符串的長度
能夠調用函數 len(x),以下所示。
參數
參數能夠被添加到一個函數中,使得函數更通用。
經過參數,能夠將一個變量傳遞給方法,以下所示。
可選參數
爲參數提供一個默認值來傳遞一個可選參數,以下所示。
* 參數
若是想讓函數使用任意數量的參數,那麼須要在參數名前添加 *,以下所示。
** 參數
** 容許傳遞可變數量的關鍵字參數給函數,同時也能夠傳遞一個字典值做爲關鍵字參數。
Return
函數可以返回一個值,以下所示。
若是一個函數須要返回多個值的話,那麼最好返回一個元組 (以逗號隔開每一個值),以下所示。
Lambda 函數
- 是一種單行表達式的匿名函數
- 是一種內聯函數
- Lambda 函數沒有聲明,只是經過一個表達式來實現,以下所示。
函數的語法結構爲:variable = lambda arguments: expression
Lambda 函數也能夠做爲參數傳遞給其餘的函數。
dir() 和 help()
- dir() 用於顯示定義的符號
- help() 用於顯示幫助文檔
0八、模塊
什麼是模塊
- Python 語言附帶了200多個標準模塊。
- 模塊是一種將 python 程序中類似功能進行分組的組件。
- 任何 python 代碼文件均可以打包爲模塊,而後再導入。
- 模塊容許使用者在本身的代碼解決方案中進行組件化設計。
- 模塊提供了命名空間的概念,幫助使用者共享數據和服務。
- 模塊鼓勵代碼重用,並減小變量名稱衝突。
PYTHONPATH
- 這是 python 的環境變量,表示用於操做模塊的 python 解釋器所在的位置。PYTHONHOME 是一個用於搜索該路徑的模塊。
如何導入模塊
若是你有一個文件:MyFirstPythonFile 包含不少個函數,變量和對象,而後你能夠將這些功能導入到其餘類中,以下所示。
Python 內部會將模塊文件編譯爲二進制再運行模塊的代碼
若是想導入模塊中的全部對象,能夠這樣:
若是模塊中包含的函數或對象命名爲 my_object,那麼你能夠將其打印出來,以下所示。
值得注意的是,若是你不想在加載時執行模塊的話,那麼你須要檢查是否有 __name__ == ‘__main__’
From 導入模塊
若是你只是想訪問模塊中的一個對象或某個部分,能夠這樣:
這種方式導入模塊容許使用者在訪問模塊中的對象,而無需引用模塊,以下所示。
能夠經過 from * 來導入模塊中的全部對象,以下所示。
值得注意的是,模塊只能在第一次 import 時導入。若是你想使用 C 模塊,那麼你可使用 PyImport_ImportModule。此外,若是你想在兩個不一樣模塊中使用定義相同的對象,那麼能夠將 import 和 from 結合起來導入模塊。
0九、包 (Packages)
Python 中包是模塊的目錄。
若是你的 Python 代碼中提供了大量功能,這些功能被分組到模塊文件中,那麼能夠從模塊中建立一個包,以便更好地分配和管理這些模塊。
包可以更好地管理和組織模塊,這有助於使用者更輕鬆地解決問題和查找模塊。
能夠將第三方軟件包導入到代碼中,如 pandas/scikit learn 和 tensorflow等等。
包能夠包含大量的模塊。
若是代碼中的某些部分提供類似的功能,那麼能夠將模塊分組到一個包中,以下所示。
上圖中 packageroot 是一個根目錄 (root folder),packagefolder 是其根目錄下面的一個子目錄,而 my_module 是在 packagefolder 目錄下的一個 python 模塊文件。
此外,文件夾名能夠做爲命名空間,以下所示。
值得注意的是,須要確保所導入的包中每一個目錄都包含一個 __init__.py 文件。
PIP
- PIP 是 python 的包管理器。
- 可使用 PIP 來下載包,以下所示。
十、條件語句
條件語句 if else,以下所示。
請注意冒號和縮進在條件語句中的使用。
檢查類型
你也能夠在 else 部分繼續添加條件邏輯語句,這樣構成嵌套條件結構,以下所示。
十一、循環
While
While 語句提供一個條件,運行循環語句直到知足該條件位置,循環終止,以下所示。
For
循環必定的次數,以下所示。
循環遍歷整個字符串的全部字符,以下所示。
單行 for 循環
語法結構爲 [Variable] AggregateFunction ([Value] for [item] in [collection])
Yielding
- 假定你的列表中包含一萬億條數據,須要從列表中計算偶數的數量。這時候將整個列表加載到內存中並非最佳的作法,你能夠經過列表來生成每一個項。
- 使用 xrange 的循環結構
結合條件 if 的 for 循環
經過帶 if 的 for 循環來查找兩個單詞中的字母,以下所示。
Break
若是你想終止循環,能夠這樣:
使用 Fibonacci 函數的循環結構,以下所示。
十二、遞歸
函數調用自身的過程稱爲遞歸。
下面來演示一個階乘遞歸函數:
建立一個階乘函數,輸入爲 n
若是輸入 n=0,則0! = 1
若是輸入 n != 0,則n! = n(n-1)!
此外,Fibonacci 遞歸函數的流程以下所示:
建立一個 Fibonacci 遞歸函數,輸入爲 n
建立前兩個變量,併爲其分別賦值0和1
若是輸入 n = 0,則返回0;若是輸入 n =1,則返回1;不然,返回 (n-1)+(n-2)
值得注意的是,遞歸結構須要有一個退出檢查,不然函數將進行無限循環。
1三、框架 Frames 和棧 Stack 調用
Python 代碼被加載到堆棧中的框架。
函數及其參數和變量一塊兒被加載到框架中。
框架以正確的執行順序被加載到堆棧中。
堆棧描述了函數的執行。在函數外聲明的變量被存儲在 __main__ 中。
堆棧首先執行最後一個框架。
若是遇到運行錯誤,可使用回溯 (traceback) 來查找函數列表。
1四、集合 Collections
列表 Lists
列表是一種可以包含任何數據類型的序列數據結構,這種結構是可變的。
列表能夠進行整數索引,可使用中括號來建立一個列表,以下所示。
使用索引值來添加、更新、刪除列表中的項,以下所示。
此外,複製和切片一樣適用於列表 (可類比字符串中的操做), 列表還支持排序操做,以下所示。
元組 Tuples
在某種程度上元組和列表相似,都是能夠存儲任意對象序列的數據結構。
元組的運行比列表更快速。
元組能夠進行整數索引
元組是不可變的,以下所示。
值得注意的是,若是一個元組中的元素包含一個列表,那麼能夠對列表進行修改。一樣,當爲一個對象賦值並將該對象存儲到列表中,隨後若是對象發生變化的話,相應地,列表中的對象也會進行更新。
字典 Dictionaries
字典是編程語言中最重要的一種數據結構之一,它可以存儲鍵值對 (key/value) 對象。
字典有許多優勢,可以輕鬆地進行數據檢索,以下所示。
能夠經過以下方式建立一個字典。
打印字典中的內容,以下所示。
字典中的值能夠是任意類型的數據,包括字符串,數值,布爾型,列表甚至是字典,以下所示。
值得注意的是,若是你想對一個列表進行向量或矩陣操做,能夠調用 Numpy 包來實現。
1五、編譯 (Compilation) 與關聯 (Linking)
- 這些特徵可用於一些以其餘語言編寫的文件,例如 C 或 C++ 等。
- 一旦將代碼寫入文件後,能夠將文件放在 Modules 目錄中。
- 在 Setup.local 文件中添加一行是很是重要的,這能確保新建立的文件可以被加載。
編譯 Compilation
容許無任何錯誤地進行新擴展的編譯過程。
關聯 Linking
一旦新的擴展編譯完成,他們之間就會被關聯。
1六、迭代器 Iterators
Iterators
- 容許遍歷一個集合
- 全部迭代器都包含 __iter __() 和 __next __() 函數
- 只需在列表,字典,字符串或集合上執行 iter(x) 便可
- 能夠執行實例 next(iter),這裏 iter = iter(list)
- 若是集合中元素項的數目很是大且沒法一次加載內存中的全部文件,此時迭代器頗有用
- 有一些通用的迭代器使開發人員可以實現函數式編程,以下:
Filter
- 根據條件過濾掉相應的值
Map
- 對集合中的每一個值進行計算,即將值進行映射,如將文本轉爲整型數值。
Reduce
- 減小集合中的值,即獲得一個更小的集合。如集合求和,它本質上是可迭代的。
Zip
- 獲取多個集合並返回一個新集合
- 新集合的每一個項,包含每一個輸入集合中的元素
- Zip 容許同時對多個集合進行橫向操做,以下所示。
1七、面向對象設計——類 Classes
- Python 容許建立自定義類型,將這些用戶自定義的類型稱爲類。這些類具備自定義屬性和功能。
- 面向對象的設計容許程序員根據自身所需的屬性和功能自定義建立對象。
- 屬性也能夠引用另外一個對象。
- Python 中的類能夠引用其餘類。
- Python 支持封裝 -- 實例函數和變量。
- Python 支持繼承,以下所示。
- 類的一個實例稱爲對象。對象具備可變性,一旦建立對象,相應的屬性也將被更新。
__init__
- __init__ 函數在全部類中都存在。當須要進行類實例化時,該函數就將被執行。__init__ 函數能夠根據須要設置相應的屬性,以下所示。
值得注意的是,self 參數將包含對象的引用,這與 C# 語言中的 this 參數相似。
__str__
當調用 print 時,返回一個對象的字符串結果,以下所示。
所以,當執行 print 語句時,__str__ 將會被執行。
__cmp__
若是想要提供自定義邏輯來比較同一實例的兩個對象,可使用__cmp__ 實例函數。
__cmp__ 函數返回1 (更大), - 1 (更低) 和0 (相等),以指示兩個對象的大小。
能夠將 __cmp__ 想象成其餘編程語言中的 Equals() 方法。
Overloading
經過將更多參數做爲實例,來重載一個對象。
還能夠經過爲 __add__ 來實現想要的運算符,如 +。
對象的淺拷貝 (Shallow Copy) 和深拷貝 (Deep Copy)
等效對象 – 包含相同的值
相同對象 – 引用相同的對象 – 內存中指向相同的地址
若是要複製整個對象,可使用複製模塊 (copy module),以下所示。
這將致使淺拷貝,由於屬性的引用指針將會被複制。
若是對象的一個屬性是對象引用,那麼它將簡單地指向與原始對象相同的引用地址。
更新源對象中的屬性將致使目標對象中的屬性也會更新。
淺拷貝是複製引用指針。
這種狀況下能夠利用深拷貝,以下所示。
若是 MyClass 包含引用 MyOtherClass 對象的屬性,則屬性的內容將經過 deepcopy 複製到新建立的對象中。
深拷貝將對對象進行新的引用。
1八、面向對象設計——繼承
Python支持對象的繼承,即對象能夠繼承其父類的功能和屬性。
繼承的類能夠在其函數中包含不一樣的邏輯。
若是一個父類 ParentClass 有兩個子類 SubClass1 和 SubClass2,那麼你可使用Python來建立類,以下所示。
上例中兩個子類都將包含 my_function() 函數
類的繼承屬性鼓勵代碼的重用性和可維護性。
此外,python 中支持多類繼承,這與 C# 語言不一樣。
多類繼承 multi-Inheritance
若是你想調用父類函數,能夠這樣:
1九、垃圾收集——內存管理
Python 中的全部對象都存儲在一個堆積空間 (heap space),而 Python 解釋器能夠訪問此空間。
Python 有一個內置的垃圾收集機制。
這意味着 Python 能夠自動爲程序進行分配和取消內存,這與 C++ 或 C# 等其餘語言相似。
垃圾收集機制主要是清除程序中未引用/使用的那些對象的內存空間。
因爲多個對象能夠共享內存引用,所以 python 使用兩種機制:
- 引用計數:計算引用對象的數目。若是對象的計數爲0,則取消對象的空間分配。
- 循環引用:這種機制關注的是循環引用:當取消分配 (deallocation) 的數目大於閾值時,僅取消對象所在的內存空間分配。
在 Python 中新建立的對象,能夠經過以下方式進行檢查:
此外,也能夠經過及時或者基於事件機制來進行手動的垃圾收集。
20、 I/O
From Keyboard
使用 raw_input() 函數,以下所示。
文件 Files
使用with/as語句來打開並讀取文件,這與 C# 中讀取文件的操做一致。
此外,with 語句還能夠處理關閉鏈接和其餘清理操做。
打開一個文件,以下所示。
須要注意的是,readline() 可用於讀取文件中的每一行。
打開兩個文件,以下所示。
文件寫入,以下所示。
Python 中對文件的操做一般涉及 os 和 shutil 模塊。rw 表示讀寫模式,a表明可添加模式。
SQL
打開一個鏈接,以下所示。
執行一個 SQL 聲明,以下所示。
網絡服務 (Web Services)
查詢一個閒置服務,以下所示:
序列化和反序列化 JSON 文件
反序列化 JSON,以下所示:
序列化 JSON,以下所示:
2一、異常處理
拋出異常
若是你想拋出異常,那麼可使用 raise 關鍵字,以下所示。
捕獲異常
能夠經過以下方式捕獲異常信息:
若是想捕獲特定的異常,能夠這樣:
若是想使用 try/catch/finally 結構捕獲異常信息,能夠這樣:
值得注意的是,不管 finally 部分的代碼是否觸發,你均可以使用 finally 來關閉數據庫/文件的鏈接。
Try/Except/Else
若是想爲異常信息分配一個變量,能夠這樣:
若是想定義用於自定義的限制,能夠經過 assert 關鍵字實現,以下所示:
值得注意的是,python 中的異常一樣具備繼承性。
此外,你也能夠建立本身的異常類,以下所示:
2二、多線程和 GIL
- GIL 表示 Global Interpreter Lock。
- GIL 確保線程能夠在任什麼時候間執行,並容許 CPU 選擇要執行的所需線程。
- GIL 可以傳遞當前正在執行的線程。
- Python 支持多線程。
此外,GIL 會增長代碼執行的計算開銷。所以,運行多線程時需謹慎。
2三、裝飾器 Decorators
- 裝飾器能夠爲代碼添加功能,其本質上是一種調用其餘對象/函數的函數。 它是可調用函數,所以在調用裝飾器函數時將返回隨後須要調用的對象。
- 經過封裝包/裝一個類/函數,而後在調用函數時執行特定的代碼。
- 此外,還能夠經過實現通用邏輯來記錄,進行安全檢查等,而後使用 property 標記方法的屬性。
2四、Python 中的單元測試
Python 中有許多單元測試和模擬庫
下面以 unittest 爲例
假定你的函數每次將輸入值減小1,以下所示:
能夠經過以下方式來進行單元測試:
一樣地,也可使用 doctest 來測試 docstrings 中所編寫的代碼。
2五、一些與 Python 有關的熱門話題
爲何要使用 Python
- 編碼簡單,易於學習
- 面向對象編程語言
- 強大的分析功能和機器學習包
- 更快速地開發並將解決方案推向市場
- 提供內置的內存管理功能
- 提供巨大的社區支持和應用程序
- 無需編譯,由於它自己是一種可解釋的語言
- 動態輸入,即無需聲明變量
如何讓 Python 運行得更快
- Python 是一種高級語言,不適合在系統程序或硬件層面訪問。
- Python 不適用於跨平臺的應用程序。
- Python 是一種動態類型的解釋語言。與低級語言相比,它的優化和運行速度較慢。
- 實現基於 C 語言的擴展。
- 可使用 Spark 或 Hadoop 建立多進程
- 能夠利用 Cython,Numba 和 PyPy 來加速 Python 代碼或用 C 語言編寫它並在 Python 中公開。
Python 愛好者都是用哪些 IDEs?
- 包括 Spyder,Pycharm 等。此外,還會使用各類的 notebooks,如 Jupyter。
Python 中熱門的框架和包有哪些
- Python 中必須掌握的包有不少,包括 PyUnit (單元測試), PyDoc (文檔), SciPy (代數和數值計算), Pandas (數據管理), Sci-Kit learn (機器學習和數據科學), Tensorflow (人工智能), Numpy (數組和數值計算), BeautifulSoap (網頁爬取), Flask (微服務框架), Pyramid (企業應用), Django (UI MVVM), urllib (網頁爬取), Tkinter (GUI), mock (模擬庫), PyChecker (bug 檢測器), Pylint (模塊代碼分析) 等。
如何託管 Python 包
對於 Unix 系統:製做腳本文件,模式爲可執行且文件第一行必須是:
可使用命令行工具並執行它。也能夠經過 PyPRI 和 PyPI 服務。
Python 和 R 語言能合併嗎
R 語言中有着大量豐富的統計庫,可使用 Rpy2 python 包或在 Juputer 中使用 beaker 筆記本或 IR 內核,在 Python 中執行 R 代碼。
在運行 Python 前有沒有辦法可以捕獲異常?
在運行代碼以前,可使用 PyChecker 和 PyLink 來捕獲異常信息。
總結
本文概述了 Python 最重要的25個概念,這些知識對初學者來講足以編寫本身的 Python 包或使用現有的 Python 包,但願能幫助你們更好地學習 Python。
本文分享自華爲雲社區《Python從入門到精通25個關鍵技術點》,原文做者:簡單堅持。