# 1. 開始學習Python
## 1.1 Python介紹
### 1.1.1 什麼是Python
Python 是一種[**高階程式語言**](https://zh.wikipedia.org/wiki/高级语言),也是一種[解釋型語言](https://www.itread01.com/content/1542366250.html),強調**程式碼的可讀性**、**簡潔的語法**。
特色是嚴格的縮排語法來表示區塊,非使用大括號或者關鍵字。
簡單、易學,相比於 C++、Java,Python可以用更短的程式碼達到一樣的結果。
Python的設計目標之一是讓程式碼具備高度的可閱讀性。它設計時盡量使用其它語言經常使用的標點符號和英文單字,讓程式碼看起來整潔美觀。因為Python是動態語言,它不像其他的靜態語言如C、Pascal那樣需要書寫聲明語句。
Python本身被設計為可擴充的。並非所有的特性和功能都整合到語言核心。Python提供了豐富的API和工具,以便程式設計師能夠輕鬆地使用C、C++、Cython來編寫擴充模組。Python編譯器本身也可以被整合到其它需要手稿語言的程式內。因此,有很多人把Python作為一種「膠水語言」使用。使用Python將其他語言編寫的程式進行整合和封裝。
Python開發者有意讓違反了縮排規則的程式不能通過解釋,以此來強迫程式員養成良好的編程習慣,也方便所有人尋找和閱讀。並且Python語言利用縮排表示語句塊的開始和結束(Off-side規則),而非使用花括號或者某種關鍵字。增加縮排表示語句塊的開始,而減少縮排則表示語句塊的結束。縮排成為了語法的一部分。例如if語句:
```
if age < 18:
print("你不能買菸") # 台灣法律規定18歲以下的人不能購菸
print("不過你可以買茶葉蛋")
print("這句話處於if語句塊的外面")
```
> 根據PEP 8的規定,必須使用4個空格來表示每級縮排。使用Tab字元和其它數目的空格雖然都可以被解釋器識別,但不符合編碼規範。支援Tab字元和其它數目的空格僅僅是為相容很舊的Python程式和某些有問題的編輯程式。偏向使用Tab字元的程式員可以設定文字編輯器將Tab鍵轉換為4個空格實現縮進而不致導致縮進錯誤。
> [PEP 8:Style Guide for Python Code](https://www.python.org/dev/peps/pep-0008/#id17)
### 1.1.2 Python的誕生
Python的創始人為吉多范羅蘇姆(荷蘭語:Guido van Rossum,生於1956年1月31日-),當時他在阿姆斯特丹的CWI工作。1989年的聖誕節期間,吉多·范羅蘇姆為了在打發時間,決心開發一個新的指令碼解釋程式,作為ABC語言的一種繼承,擔負同Amoeba作業系統的互動和例外處理。之所以選中Python作為程式的名字,是因為他是BBC電視劇——蒙提·派森的飛行馬戲團的愛好者。Python是為了替代使用Unix shell和C語言進行系統管理而從ABC語言發展起來,而它的模組系統主要受到了Modula-3的影響,它還結合了C語言的最少爭議特徵。就範羅蘇姆本人看來,ABC這種語言非常優美和強大,是專門為非專業程式設計師設計的。但是ABC語言並沒有成功,究其原因,他認為是非開放造成的。范羅蘇姆決心在Python中避免這一錯誤,並取得了非常好的效果。
目前范羅蘇姆仍然是Python的主要開發者,決定整個Python語言的發展方向。Python社群經常稱呼他是終身仁慈獨裁者(BDFL)。
Python 2.0於2000年10月16日發布,增加了實現完整的垃圾回收,並且支援Unicode。同時,整個開發過程更加透明,社群對開發進度的影響逐漸擴大。
Python 3.0於2008年12月3日發布,此版不完全相容之前的Python原始碼。不過,很多新特性後來也被移植到舊的Python 2.6/2.7版本。
> 本小節資料來源:https://zh.wikipedia.org/wiki/Python
### 1.1.3 Python優勢
Python最厲害的地方是擁有**非常多的函式庫**,幾乎所有想的到的功能都有人整理好。 支援多種程式碼類型,例如:物件導向、指令式、函數式和程式式。
##### 社群
- [Python Software Foundation](https://www.python.org/psf/):常簡稱為 **PSF**,主要任務為推廣、維護與促進 Python 程式語言的發展,同時也支持協助全球各地各式各樣 Python 程式設計師與社群的成長。PSF 是符合美國國內稅收法(Internal Revenue Code, IRC)中 [501(c)](http://en.wikipedia.org/wiki/501(c)_organization) 條款的非營利組織,持有 Python 程式語言背後的智慧財產權。
- [Python Enhancement Proposals](https://www.python.org/dev/peps/):常簡稱為 **PEPs**,Python 的改進大多是由 PEP 流程主導,PEP 流程會收集來自社群的意見,為將來打算加入 Python 的新特性提出文件提案,重要的 PEP 會經由社群與 Guido 審閱與評估,決定是否成為正式的 PEP 文件。
因此 PEP 文件本身說明了它對 Python 的改變,以及實作特性時應遵守的標準,**在剛開始認識 Python 時,有幾個重要的 PEP 是必須認識的**:
- [PEP 1](http://www.python.org/dev/peps/pep-0001/) - PEP 的作用與執行準則,說明了何為 PEP、PEP 的類型、提案方式等。
- [PEP 8](http://www.python.org/dev/peps/pep-0008/) - Python 的程式碼風格,包括了程式碼的編排、命名、註解等風格指引。
- [PEP 20](http://www.python.org/dev/peps/pep-0020/) - Python 禪學(The Zen of Python)。
- [PEP 257](http://www.python.org/dev/peps/pep-0257/) - 撰寫 Docstrings 時的慣例,Docstring 是可內建於 Python 程式中的說明文件字串,稍後就會說明。
- [pycon](https://pycon.org/):全世界各地都有 Python 使用者,這些使用者會在各地舉辦各式大大小小的研討會,如果想要知道各地的研討會資訊,可以從 [PyCon](http://www.pycon.org/) 這個網站開始,它列出了全球各地 Python 研討會的網址、活動日期等資訊。
- [pycon(台灣)](https://tw.pycon.org/2018/zh-hant/about/community/):pycon的台灣社群。
- [Python Taiwan(台灣)](http://www.python.org.tw/):Python 台灣使用者群組(簡稱 PyTUG - Python Taiwan User Group),由台灣的 Python 程式語言使用者、學習者或愛好者所組成。
##### Python 使用者群
除了研討會之外,Python 使用者會舉辦週期性的聚會,在[LocalUserGroups](https://wiki.python.org/moin/LocalUserGroups) 上可以找到全球各地的 Python 使用者聚會資訊,以台灣來說,週期性聚會資訊有:
- [PyTUG Wiki](http://wiki.python.org.tw/) - 台灣 Python 使用者群 Wiki 網站
- [PyTUG Groups](http://groups.google.com/group/pythontw) - 台灣 Python 使用者群論譠
- [PyHUG Meetups](http://www.meetup.com/pythonhug/) - 新竹 Python 使用者群
- [Taipei.py Meetups](http://www.meetup.com/Taipei-py/) - 台北 Python 使用者群
- [Tainan.py Meetups](http://www.meetup.com/Tainan-py-Python-Tainan-User-Group/) - 台南 Python 使用者群
##### 數據分析處理
Python 跟目前最盛行的 Big Data 大數據基本上是綁在一起,因為 Python 有幾個很方便的函式庫,專門處理數據分析。 以下列出幾種常用的函式庫:
- 網路爬蟲:selenium, requests, bs4。
- 資料處理:matplotlib, pandas, numpy。
##### 網站開發
目前而言,網站開發有許多種語言,像是 php, Node.js, Java 等等,而 Python 也是滿多人在使用的。
主要使用的函式庫:django, flask 等等,可以在這裡看到更多比較:[13個Python web框架比較](https://www.itread01.com/lccihk.html)。
##### 人工智慧
人工智慧絕對是 Python 近幾年盛行的主要原因,因為很方便的處理數據、分析數據。 人工智慧 (AI) 主要常見的有機器學習(Machine Learning)、深度學習(Deep Learning)等等。 深度學習驅動了機器學習,造就了人工智慧。 主要使用的函式庫:
- 機器學習:numpy, scipy。
- 深度學習:tensorflow, keras, torch。
##### 自動化測試
「測試」是一個產品出貨前,一定要經過的流程。 以往的人工測試太傷成本,所以引進自動化測試技術是必備的。
主要使用的函式庫:selenium, xlrd, pandas, pyvirturaldisply 。
##### Python的熱門程度
![Tiobe-Index-202007](https://i.imgur.com/GIkjGTY.png)
> 圖1.1-00
![Tiobe-Index-202007](https://i.imgur.com/bamjFCN.png)
> 圖1.1-01
> Tiobe Index: https://www.tiobe.com/tiobe-index/
### 1.1.3 為什麼大數據開發要選Python
- 通用:如果企業想要度量和統計數據以外的其他功能,比如說設計一個功能強大的網站,Python 是一個很好的選擇。
- 易學:沒有像C語言難懂的指標,支援多種程式設計方式,清楚的語法,讓你就像閱讀文章一樣。
- 豐富的模組:Python 的模組非常豐富,你想到的功能幾乎都有人開發了。
- 更好的整合性:可以整合諸如 C、C++ 或 Java 之類的語言,提供非常方便的連接各種語言。此外,用Python可以很有效率地建立與整合大數據相關開發工作。
- 提高效率:Python 的語法就像文章一樣好理解,可以更好地提升團隊效率及程式碼維護。
- 活躍的社群:參與討論的人多,意味著你的問題可以更快的得到解決跟吸收新的知識。
**結論:可以用 Python 清洗數據,接著再用 R 建立模型**
### 1.1.4 腳本語言(Script Language)介紹
先不說什麼是腳本語言(Script Language),程式設計語言大概有這些類型:
- 編譯型語言
程式必須經過一個編譯和一個連結階段來變成一個獨立的執行檔案,優點是執行效率高,缺點是開發就不方便。
- 解譯型語言
程式需經過解譯器來執行,優點是容易跨平台,缺點是執行速度較編譯型語言慢。
如:
- 腳本語言
腳本語言是解釋型的語言,也就是解釋型語言包括腳本語言。
### 1.1.5 Python 2 v.s. Python 3
1. Python3.1,io模組是使用Python語言實現的,比2.x快5~10倍
2. Python3.1,str.format()支援自動編號:
3. Python 3.1,64位版的int快了27%~55%。
4. Python 3.2,對全域解釋器鎖(GIL)進行了重大升級,顯著改進了Python處理多執行緒的方式。
5. python3.3,用C語言重寫了decimal模組,比以前快12倍(數據庫~120倍(高密度計算)。
6. Python3.3,utf-8編碼快了2~4倍,utf-16編碼的encode最多快了10倍。
7. python3.4,優化了pickle模組,性能提升好幾倍。
8. python3.4,python解釋器的啟動快了30%。
9. Python3.4, 新增tracemalloc模組。一個調試工具,用於追蹤、統計python的內存分配。
10.Python3.4, 新增enum模組,提供枚舉。好多人抱怨python沒有列舉值,現在有了,雖然是以模組的方式實現的。
11. Python 3.5,使異步變得不那麽棘手,async和await關鍵字成為語言語法的一部分。
12. Python3.5,新的語法:Type hints和typing模組。方便原始碼閱讀。
13. Python3.5,UTF-8、UTF-16、LATIN-1編碼的decode速度是以前的2~4倍。
14. Python3.5,新增.hex()函數,可以直接把bytes類型轉為16進制。
15.python3.5, 新增os.scandir()函數,更快、更省內存的遍歷檔案目錄。在POSIX系統上比以前快35倍,在Windows系統上快720倍。os.walk()目前也在使用此函數。
16. Python3.6, 用C語言實現asyncio.Future類和asyncio.Task類別,asyncio程式的性能快了25%~30%。
17. Python3.6, glob模組的glob()函數和iglob()函數現在使用os.scandir()函數。快了3~6倍。
18. Python3.6,pathlib.Path模組的glob()函數現在使用os.scandir()函數。快了1.5~4倍。
19. Python3.6, 新增secrets模組,生成強隨機數。以前的random模組只能生成偽隨機數,官方推薦在涉及安全問題時不再使用random模組。
20. Python3.7,time模組新增6個可以訪問納秒的函數,如time.time_ns()、time.perf_counter_ns()等等。
### 1.1.6 Python的實作
能執行 Python 語言的實作品有不少,接下來介紹幾個主要的實作 ...
CPython 是 Python 的參考實作,一般如果提到安裝 Python,沒有特別聲明的話,指的就是安裝 CPython,顧名思義以 C 撰寫,提供與 Python 套件(Package)與 C 擴充模組的最高相容性。Python 是直譯式語言,不過並非每次都從原始碼直譯後執行,CPython 會將原始碼編譯為中介位元碼(bytecode,也就是 .py 原始碼檔案被 CPython 執行過留下的 .pyc 檔案),爾後再由虛擬機器執行,這點與 Java 有點類似,之後再次執行時,就不用從原始碼而可以從位元碼開始直譯,以加快直譯速度。
PyPy名稱上來看,是用 Python 實現的 Python,正確地說,是使用 rPython 來實現 Python,rPython 不是完整的 Python,是 Python 的子集,不過 PyPy 可以執行完整的 Python 語言。PyPy 包括一個 JIT(Just-in-Time)編譯器(與 Java 的 HotSpot 技術類似),PyPy 可以將 Python 程式碼編譯為其他語言,像是 C(以及其他語言,例如 CIL、JavaScript),運行速度可比 CPython 要快,為了能進行語言轉換,你必須使用 rPython。PyPy 目的在改進 Python 的效能,同時追求與 CPython 的最大相容性(這意味著使用 PyPy 還是有相容性上的限制)。
Jython 是用 Java 實現的 Python,可以讓 Python 程式運行於 JVM 上,它會將 Python 程式碼轉譯為 Java 的位元碼(bytecode),既然可以運行在 JVM 上,自然就能匯入(import)取用 Java 的類別,因而利用 Java 領域中龐大的程式庫與各式資源,Jython 還有個 jythonc,可以將 Python 程式碼轉換為 Java 程式碼,這表示可以在 Java 程式中使用 Python 撰寫的程式庫(從 Jython 2.5 之後,jythonc 已經沒有再更新維護了)。
IronPython 是可與 .NET 平台結合的 Python 開放原始碼實現,可以使用 .NET Framework 程式庫,讓 .NET 其他語言也易於使用 Python 程式庫。IronPython 的創建者 Jim Hugunin 同時也是 Jython 創建者。
---
## 1.2 開發工具
### 1.2.1 Anaconda
Anaconda指的是一個開源的Python發行版本,其包含了conda、Python等180多個科學包及其依賴項。因為包含了大量的科學包,Anaconda 的下載檔案比較大,如果只需要某些包,或者需要節省頻寬或儲存空間,也可以使用Miniconda這個較小的發行版(僅包含conda和 Python)。
### 1.2.2 Anaconda該怎麼發音?
```
美式發音:a·nuh·kaan·duh
英式發音:a·nuh·kon·duh
```
##### 優點:
省時:一鍵安裝完90%一般人這一輩子會用到的Python套件,剩下的再用pip install個別去安裝即可
##### 缺點:
占空間:包含了一堆用不到的Python的套件(可安裝另一種miniconda)
### 1.2.3 下載與安裝
[Anaconda下載](https://www.anaconda.com/download)
![Anaconda Installers](https://i.imgur.com/Rh9puS4.png)
> 圖1.2.3-00
挑選你需要的作業系統版本即可。
### 1.2.4 更新spyder
```
# conda update spyder
```
> 注意:不要用pip或其他方式更新spyder,那有可能會損壞spyder
---
## 1.3 執行第一個Python程式
### 1.3.1 Hello, World!
```
print('Hello, World!')
```
![HelloWorld](https://i.imgur.com/tXDYVfN.png)
> 圖1.1-02
> 按下鍵盤上的「F5」或是點選IDE上的綠色三角形按鈕可以執行程式。
### 1.3.2 編輯器說明
##### 編輯區
程式碼都在這裡撰寫與編輯
##### 執行結果
程式執行結果或是錯誤都會顯示在這個地方
##### 輔助視窗
提供額外方便的功能,如:文件說明、變數清單、檔案總管等等。
### 1.3.3 好用快捷鍵
| 快捷鍵 | 描述 |
| ------------ | ------------------------------ |
| Ctrl+R | 取代 |
| Ctrl+1 | 單行註解,第一次註解,再次取消 |
| Ctrl+4 | 區塊註解,第一次註解,再次取消 |
| F5 | 執行程式 |
| Ctrl+P | 檔案切換 |
| Ctrl+L | 清空終端視窗 |
| Ctrl+I | 查看某個函式的說明文件 |
| Ctrl+Shift+V | 開啟變數視窗 |
| Ctrl+Home | 回到檔案開頭 |
| Ctrl+End | 跳到檔案結尾 |
### 1.3.4 從命令列執行
```
python HelloWorld.py
```