第一章 初嘗 Py
程式設計,與編織圖案、食譜有相同的地方
- 固定的單字、縮寫與符號。
- 語法:規定會用到的字,以及在哪裡使用的規則。
- 一系列需要依序執行的動作。
- 迴圈:有時會重複某些動作。
- 函式:有時會參考其他的連續動作。
- 預設讀者已經知道內容的相關知識。eg.食譜會預設你知道什麼是水,如何煮開水;編織圖案會假設你懂編織,不會經常刺傷自己。
- 有一個預期的結果。
位移值
Python串列取值的方式,以位移值來取出值。
例如:
第一個值:位移值為0
第四個值:位移值為3人習慣從1開始算,所以用位移值的概念取代位置概念較易理解。
>>> cliches = [
"At the end of the day",
"Having said that",
"The fact of the matter is",
"Be that as it may",
"The bottom line is",
"If you will",
]
print(cliches[3])
Be that as it may
Python dictionary(字典)
字典名稱: {
鍵(key): 值,
鍵(key): 值,
鍵(key): 值,
}
[]: Python 串列
{}: Python 字典
quote = {
"Moe": "A wise guy, huh?",
"Larry": "Ow!",
"Curly": "Nyuk nyuk!",
}
stooge = "Curly"
print(stooge, "says:", quote[stooge])
Curly says: Nyuk nyuk!
範例1.1
- 目標:會連結到Youtube網站,並抓取當時最獲好評的影片訊息
- 使用技術:
- Crawl 與 Scrape:網頁抓取 web scraping → 回傳的資料格式,是可供電腦處理的JSON格式(本書p.257)
- JSON 格式(JavaScript Object Notation):(本書p.200)
- 是一種人類看得懂的文字格式,它會描述裡面的類型、值與值的順序
- 它就像個小型的程式語言,且經常被用在不同的電腦語言與系統之間交換資料
- Python 程式可以將「JSON 文字轉換成 Python 資料結構」,就像是自己編寫程式來製作一般
範例1.1 intro/youtube.py
1 >>> import json
2 >>> from urllib.request import urlopen
3 >>> url = "https://gdata.youtube.com/feeds/api/standardfeeds/top_rated?alt=json?"
4 >>> response = urlopen(url)
5 >>> contents = response.read()
6 >>> text = contents.decode('utf8')
7 >>> data = json.loads(text)
8 >>> for video in data['feed']['entry'][0:6]:
9 >>> print(video['title']['$t'])
Evolution of Dance - By Judson Laipply
Linkin Park - Numb
Potter Puppet Pals: The Mysterious Ticking Noise
"Chocolate Rain" Original Song by Tay Zonday
Charlie bit my finger - again !
The mean Kitty Song
- 第一行:從json的Python標準程式庫匯入所有程式
- 第二行:從urllib程式庫匯入urlopen函式
- 第三行:從YouTube URL指派給變數URL
- 第四行:連結到該URL的網頁伺服器,並請求指定的網頁服務
- 第五行:取得回應的資料,並將它指派給變數content
- 第六行:將內容解碼成JSON格式的字串,並指派給變數content
- 第七行:將文字轉換成資料--Python的視訊資料結構
- 第八行:
- 一次將一個視訊資料放入變數video
- 使用二階Python字典(data['feed']['entry']),與一個slice([0:6])
- 第九行:使用print()函數來印出視訊的標題
其他
- 這個視訊資料結合了各種Python資料結構
- 此範例使用了Python標準程式庫模組(Python安裝時已加入)
【改寫版】範例1.1 intro/youtube.py(使用外部Python軟體套件requests)
1 >>> import requests
2 >>> url = "https://gdata.youtube.com/feeds/api/standardfeeds/top_rated?alt=json"
3 >>> response = requests.get(url)
4 >>> data = response.json()
5 >>> for video in data['feed']['entry'][0:6]:
6 >>> print(video['title']['$t']
現實世界的Python
你會在許多電腦環境中看到Python,包括:
- 監視器或終端機視窗的命令列
- 圖形化使用者介面,包括Web
- Web,包括用戶端與伺服器端
- 支援大型熱門網站的後端服務
- 雲端(第三方管理的伺服器)
- 行動設備
- 嵌入式設備
實際應用產品:Google、Youtube、Dropbox、Netflix、Hulu
- 其他應用:email搜尋裝置、電子商務網站、上百萬行的系統、網站、系統管理、資料處理
- 應用領域:藝術、科學、商業、特定用途
Python V.S. X語言
- 殼層(shell)程式
- Windows:稱為cmd,它會執行以 .bat 為副檔名的批次(batch)檔
- Linux與其他的類Unix系統(包括Mac OS X):都有許多殼層程式,最受歡迎的叫做 bash 或 sh
- 殼層具備簡單的功能,例如:簡單的邏輯,以及使用檔案名稱的萬用符號
- 可以將指令儲存在殼層指令碼(shell scripts)的檔案中,稍候再執行它們
- 殼層指令碼超過一百行,就無法妥善地執行,它們會比其他語言緩慢許多
- 靜態語言(static languages)
- 被稱為靜態語言,是因為這些語言變數類型永遠無法改變,所以是靜態。整數就是整數,永遠如此
- 變數(variable)
- 在程式中使用的值的名稱
- 宣告每一個變數的類型:
- 會在記憶體中佔多少空間,以及用它來做什麼
- 可以協助電腦捕捉一些錯誤,並提高執行速度,但會讓人投入更多思考與打字
- C、C++、JAVA,需要宣告類型:例如用int宣告式來將變數language定義成整數 (其他類型用不同方式儲存,包括浮點數,例如3.14159,以及字元或文字資料)
- 將程式編譯成非常低階的機器語言:電腦的硬體專用的,會讓電腦比較容易了解,但人類較難理解
- 動態語言(指令碼語言 scripting languages)
- 不會強迫你必須在使用變數之前,先宣告變數類型
- 例如:輸入 x = 5,動態語言知道 5 是一個整數,所以變數x也是整數
- 可讓你用較少的程式行數,來完成更多的工作
- 不會被編譯(compile),而是用一種所謂的編譯器(interpreter)程式來解譯(interpret)
- 動態語言的執行速度通常比編譯後的靜態語言還要慢,但隨著解譯器的品質愈來愈好,速度也愈來愈快
- 過去,動態語言主要被寫成短程式(指令碼),通常被用來準備資料,來讓以靜態語言寫成的長程式處理。這種程式通常被稱為膠水程式(glue code)。儘管動態語言很適合這種用途,但現在也都可以應付大多數的繁重處理工作
- 不會強迫你必須在使用變數之前,先宣告變數類型
為什麼要用Python?
- Python 是一種優秀的通用、高階語言
- 具備易讀性:
- 就算電腦程式只被寫一次,但它通常會被許多人不斷地閱讀與修改
- 讓人更容易學習與記憶它,因而更容易編寫
- 與其他熱門語言相較之下,Python有個溫和的學習曲線,可讓你提早開始寫作。它們也有深度,當有更多經驗時,可以進一步探索它
- 簡潔
- 可以編寫比其他靜態語言更精簡的程式
- 程式員每天編寫的程式行數都差不多,無論使用哪一種語言。所以只需編寫一半的行數,代表你的生產力加倍。在很多認為這很重要的公司,Python是一種 "不那麼機密" 的武器
- 免費的,可以自在地使用它。可以用Python來編寫任何東西,並在任何地方使用它
- 幾乎可以在任何地方運行,而且標準程式庫有一堆實用的軟體
不該使用 Python 的時機
對大部分應用來說,它的速度已經夠快了,但對講求速度的程式而言,它可能還不夠快。 如果你的程式需要花費大部分的時間來計算(術語稱為CPU密集),用C、C++或Java寫的程式,通常跑得比Python寫的同一個程式還要快。但並非都是如此!
- 在 Python 中使用較好的演算法(階段性解決方案),通常勝過在C中使用沒效率的演算法。使用Python較快速度開發軟體,可讓你有更多的時間嘗試其他的做法
- 許多應用程式在等待網路伺服器的回應時,通常會進入閒置狀態。CPU(中央處理器單元,電腦處理所有計算的晶片)幾乎沒有參與其中,因此靜態與動態程式的處理時間非常接近
- 標準的 Python 解譯器是用C寫成的。可用C程式來擴充(本書p.353 優化你的程式)
- Python 解譯器的速度已經愈來愈快。Java在它的起步階段也非常緩慢,為了提升它的速度而投入的研究與資金非常多。Python 不屬於任何一家企業,所以它的改善比較緩慢。(本書p.357 PyPy_PyPy專案及其影響)
- 你可能有一個極端的應用程式,無論你做什麼 Python 都無法滿足你的需求。通常我們會用C、C++、Java來取代它。但Go語言或許也是個解決方案(感覺像Python,但執行速度像C)
執行Python
如何執行Python程式?主要的方法有兩種:
- 互動式解譯器:
- Python附帶的互動式解譯器可讓你實驗小型程式。可以一行一行地輸入指令,馬上看到結果。透過緊湊的打字與觀看結果,可讓你快速地試驗
- 互動式解譯器的運作方式幾乎與Python處理檔案的方式一模一樣,但有個例外:當輸入有值的東西時,互動式解譯器會自動印出它的值。例如,如果你啟動Python,並在解譯器中輸入數字61,它會被回應到你的終端機上。
- 這種自動將值印出的動作,是互動式解譯器為了節省時間的功能,不是Python語言的一部分
- 當你想印出東西時,也可以在解譯器中使用print():
>>>61
61
>>>print(61)
61
使用Python檔
將61放入檔案中,並用Python來執行它,它是可以執行的,但不會印出任何東西。在非互動Python程式中,必須呼叫Print函式來印出東西。 製作一個Python程式檔,並執行它:
- 開啟文字編輯器
- 輸入 print(61)
- 存成檔名61.py的檔案。存成一般文字檔,不要用RTF或Word的"豐富"格式
- 如果你用的是圖形使用者介面,請開啟終端機視窗
- 輸入下列指令來執行你的程式:
$ python 61.py
- 你會看到輸出這一行
61
接下來要做什麼?
- 在實際的 Python 系統中輸入指令,它們必須遵循 Python 的語法
- 要開發 Python 程式,最基本的方法是使用純文字編輯器與終端視窗
- 本書中使用純文字表示,有時展示互動式的終端機對話,有時會用一段Python檔
- 目前也有許多優秀的整合開發環境可供Python使用,它們可能有圖形化使用者介面、進階文字編輯及協助畫面(在本書第十二章)
你的禪修時刻
- 每一種程式語言都有它們的風格
- 可用Python風格來表達自我
- Python有一段內嵌的詩篇,簡潔地表達Python的哲學(Python是唯一有這種彩蛋的語言)
- 如果想要體會禪意,只要在互動式解譯器中輸入 import this,再按下 enter 即可:
>>>import this
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!