起步走

Now is better than never.

Tim Peters, Zen of Python

Python 是一種廣泛用途程式語言(general-purposed programming language),具有高階、直譯、與簡潔的特性,由荷蘭電腦科學家 Guido van Rossum 於 1991 年創造,目前由 Python 軟體基金會維護。Python 在資料科學、網站開發與系統自動化等應用領域中倍受熱愛,全球知名公司像 Pixar 用於電影製作、Twitch 用於系統建置以及 Spotify 用於推薦歌曲。在 NumPy、SciPy、pandas、matplotlib、Scikit-Learn 與 TensorFlow 等套件的強力加持下 Python 成為世界各地資料科學團隊的首選,團隊裡的資料科學家使用 Python 從資料中挖掘特徵尋找洞見、資料工程師使用 Python 建構與部署機器學習與自動化系統,共同為企業獲取競爭優勢;截至 2018 年 11 月,Python 在 TIOBE Index 排名第 4 位、在 2018 IEEE 調查排名第 1 位;經濟學人雜誌在 2018 年 7 月亦特別撰文介紹 Python 正成為世界上最受歡迎的程式語言

如何選擇資料科學的入門程式語言

從事資料科學相關工作的人,免不了在起步時都會思索:「假如時間有限,我應該選擇學習 R 語言或者 Python?」網路上相關的討論串已經太多,像是 Quora 中的:Which is better for data analysis: R or PythonShould I learn Data Science using R and Python 或者 In Python vs. R, which one do you prefer,站在程式教育推廣的角度我們自然會說可以兩者都學,再視應用場景挑選適合的程式語言,但既然問題的前提是「時間有限」,那我們更不應該花費時間去閱讀這些討論串,閱讀下來對於程式語言鄙視鏈的收穫可能還比原本的題目來得大。

我直接引用我在 2017 年 iT 邦幫忙鐵人賽大數據組的冠軍系列文章:R 語言使用者的 Python 學習筆記第 30 天的總結,直截了當地回答資料科學的初學者如何在 Python 與 R 語言之間選擇:

  • 我是理工學院背景(STEM):選擇 Python
  • 我是社科商管學院背景(Non-STEM):選擇 R 語言
  • 我喜歡函數型編程:選擇 R 語言
  • 我喜歡物件導向編程:選擇 Python
  • 我想要作統計分析:選擇 R 語言
  • 我想要作資料視覺化:選擇 R 語言
  • 我想要作機器學習:選擇 Python
  • 我想要在網站後端建置機器學習系統:選擇 Python

至於其他也常為資料科學家、資料工程師所使用的程式語言像是 C/C++、JavaScript、Scala、Julia、Matlab 或者 SAS 則可能因進入門檻高、應用領域較為專一、使用者社群不夠廣大以及授權種類等緣由,較少被推薦給資料科學的初學者。

建立開發環境

展開 Python 學習旅程的第一個篇章是建立開發環境,會簡介兩種開發環境的建立方式:

  • 瀏覽器:採用 Google Colaboratory 的雲端服務
  • 本機端:採用 Anaconda 的完整解決方案

不論是 Google Colaboratory 或者 Anaconda,都是在副檔名為 .ipynb (Interactive Python Notebook)的筆記本中撰寫程式與檢視輸出。

建立瀏覽器的開發環境

Google Colaboratory 是一個在雲端的 Jupyter Notebook 環境,不需要使用者做任何的設定安裝,用作為機器學習教育和研究的工具,建議使用 Chrome 或 Firefox 這兩個瀏覽器開啟,Colaboratory 是由 Collaborate 與 Laboratory 兩個單字組合而成,表達出 Google 文件的協作特色與 Jupyter Notebook 的資料科學特質,可依照下列步驟建立瀏覽器的開發環境:

  1. 登入 Google 帳號,開啟雲端硬碟
  2. 點選「新增」
  3. 點選「連結更多應用程式」
  4. 搜尋「Colaboratory」
  5. 點選「連結」
  6. 新增 Google Colaboratory
  7. 完成瀏覽器的開發環境建置

登入 Google 帳號,開啟雲端硬碟

點選「新增」

點選「連結更多應用程式」

搜尋「Colaboratory」

點選「連結」

新增 Google Colaboratory

完成瀏覽器的開發環境建置

建立本機端的開發環境

Anaconda 提供完整的 Python 安裝解決方案,是資料科學團隊的首選推薦,原意為森蚺,是一種比蟒(Python)體型更為巨大的一種無毒蛇,棲息地為南美洲,私心相當喜歡這個富有創意的命名。Anaconda 除了會在電腦中安裝 Python 3 直譯器,它還具備諸多特色:

  • 模組與虛擬環境的管理器 conda
  • 預先安裝好 Python 資料科學應用模組,包含 NumPy、SciPy、pandas、matplotlib 與 Scikit-Learn 等
  • 多樣化的整合開發環境,包含 Jupyter Notebook、Jupyter Lab、Spyder 與 RStudio

可依照下列步驟建立瀏覽器的開發環境:

  1. 前往 Anaconda 下載頁面,依照作業系統點選對應的 Python 3 安裝檔
  2. 依照提示點選下一步
  3. 選擇安裝路徑
  4. 依照提示點選我同意
  5. 勾選將 Anaconda 加入路徑變數後點選安裝
  6. 等待安裝完成
  7. (Optional)如果沒有習慣使用的文字編輯器,可以安裝 VS Code,否則點選略過

依照作業系統點選對應的 Python 3 安裝檔

依照提示點選下一步

依照提示點選下一步

選擇安裝路徑

依照提示點選我同意

勾選將 Anaconda 加入路徑變數後點選安裝

等待安裝完成

如果沒有習慣使用的文字編輯器,可以安裝 VS Code,否則點選略過

打開終端機應用程式並且在適當的資料夾路徑啟動 Jupyter Notebook,Windows 使用者可採用命令提示字元、PowerShell 或 Anaconda Prompt;MacOS 使用者就打開內建的終端機(Terminal)應用程式即可,範例程式碼以使用者名稱 user、資料夾 Desktop 為例:

## Windows
cd C:\Users\user\Desktop
jupyter notebook

## MacOS
cd /Users/user/Desktop
jupyter notebook
1
2
3
4
5
6
7

打開終端機應用程式、移動到桌面並輸入 Jupyter Notebook

Jupyter Notebook 順利啟動

Jupyter Notebook 啟動之後電腦的預設瀏覽器會自動開啟筆記本的路徑,如果沒有自動開啟,則可以將 http://localhost:8888/?token= 這一長串網址貼到瀏覽器分頁,在 Jupyter Notebook 首頁可以選擇新增筆記本,這時會有一個以 Python 3 為運算核心的筆記本可以新增。

有一個以 Python 3 為運算核心的筆記本可以新增

完成本機端的開發環境建置

Jupyter Notebook 的筆記本是一個 JSON 格式的純文字檔,在編寫的時候會自動存檔,因此能夠在指定的資料夾中暫存是比較好的選擇,不然筆記本會散落在使用者目錄之下,使用 Jupyter Notebook 告一段落後,除了存檔與關掉瀏覽器分頁以外,別忘了回到終端機畫面,輸入 Control + c 並按 y 確認以終止服務。

終止服務

Python 程式設計起步走

第一步是認識賦值的符號 = ,它的作用是將其右邊的值指派給符號左邊的物件,舉例來說可以將 "Hello Python!" 指派給一個叫做 hello_msg 的物件,執行過後我們將可以使用 hello_msg,例如將它印出 print(hello_msg)

hello_msg = "Hello Python!"
print(hello_msg)
1
2
## Hello Python!
1

在為物件命名的時候,請遵守三個 Python 寫作風格:

  1. 使用全小寫英文,不同單字之間以底線 _ 相隔
  2. 使用英文名詞為物件(Objects)命名、使用英文動詞為函數(Functions)命名,讓名稱簡潔且具有意義
  3. 避免使用保留字內建函數作為物件的命名

接著要認識 # 符號,後面編寫註解,用口語方式告訴別人這段程式在做什麼事情。

# 好的 Python 物件命名
taiwan_number_one = True
taiwan_number_1 = True

# 不好的 Python 物件命名
taiwanNumberOne = True
Taiwan_Number_One = TRUE
TaiwanNumberOne = TRUE
twno1 = TRUE

# 更多不好的 Python 物件命名
True = "True"              # True 是保留字
int = 87                   # int() 是內建函數
def print(x):              # print() 是內建函數
  return -x
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

通常賦值採取一行宣告一個物件,但 Python 支援單行宣告多個物件的語法,這個特性讓使用者交換物件中的賦值時非常方便:

# 通常賦值採取一行宣告一個物件
hello_world = "Hello world"
hello_py = "Hello Python"
print(hello_world)
print(hello_py)

# 支援單行宣告多個物件
hello_world, hello_py = "Hello world", "Hello Python"
print(hello_world)
print(hello_py)

# 交換物件中的賦值時非常方便
hello_world, hello_py = hello_py, hello_world
print(hello_world)
print(hello_py)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## # 通常賦值採取一行宣告一個物件
## hello_world = "Hello world"
## hello_py = "Hello Python"
## print(hello_world)
## print(hello_py)
## 
## # 支援單行宣告多個物件
## hello_world, hello_py = "Hello world", "Hello Python"
## print(hello_world)
## print(hello_py)
## 
## # 交換物件中的賦值時非常方便
## hello_world, hello_py = hello_py, hello_world
## print(hello_world)
## print(hello_py)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

簡單常用的 Python 內建函數

呼叫 print() 函數可以將物件所被賦予的值輸出在 Console。

hello_msg = "Hello Python!"
print(hello_msg)
1
2
## Hello Python!
1

使用 del 指令將完成賦值的物件自環境中刪除,del 是 delete 的縮寫。

hello_msg = "Hello Python!"
print(hello_msg)
del hello_msg
print(hello_msg)
1
2
3
4
## Hello Python!
## ---------------------------------------------------------------------------
## NameError                                 Traceback (most recent call last)
## <ipython-input-1-4ed66a63cf23> in <module>()
##       3 print(hello_msg)
##       4 del hello_msg
## ----> 5 print(hello_msg)
## 
## NameError: name 'hello_msg' is not defined
1
2
3
4
5
6
7
8
9

呼叫 help() 函數查詢函數的說明文件,亦可以使用 ?

help(print)
?print
print?
1
2
3

呼叫 help() 函數查詢函數的說明文件

使用 import this 閱讀 Python 禪學(Zen of Python。)

import this
1
## The Zen of Python, by Tim Peters
## 
## Beautiful is better than ugly.
## Explicit is better than implicit.
## Simple is better than complex.
## Complex is better than complicated.
## Flat is better than nested.
## Sparse is better than dense.
## Readability counts.
## Special cases aren't special enough to break the rules.
## Although practicality beats purity.
## Errors should never pass silently.
## Unless explicitly silenced.
## In the face of ambiguity, refuse the temptation to guess.
## There should be one-- and preferably only one --obvious way to do it.
## Although that way may not be obvious at first unless you're Dutch.
## Now is better than never.
## Although never is often better than *right* now.
## If the implementation is hard to explain, it's a bad idea.
## If the implementation is easy to explain, it may be a good idea.
## Namespaces are one honking great idea -- let's do more of those!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

小結

在這個小節中我們簡介 Python 程式語言、如何選擇資料科學的入門程式語言、建置瀏覽器開發環境 Google Colaboratory、建置本機端開發環境 Jupyter Notebook、以及 Python 程式設計起步走。

延伸閱讀