2016年11月23日 星期三

Python 學習筆記 : 安裝執行環境與 IDLE 基本操作

這兩天被派去受 "Python 進階班" 的訓, 有一段時間沒接觸 Python 了, 趁這個機會溫習一下也好. 老師使用的是 Python 3, 而我以前在 GAE 用的是 Pyhton 2, 但其實差異沒有很多啦. 以下就這兩天的 Python 3 學習做個摘要整理.

Python 是一種跨平台的指令碼語言 (Scripting language), 乃 Python 之父 Guido van Rossum 為了發展 Amoeba 分散式處理作業系統, 於 1989 年以其先前發展之 ABC 教學語言為基礎, 揉合了 modula-3, UNIX shell, Icon, SmallTalk 與 C 語言的風格於荷蘭阿姆斯特丹大學發展而成. Python 語言的基本哲學是 : 做事時應該只有一種明確的方式, 這使得 Python 程式較簡潔易學.

Python 虛擬機器可在多種 OS 上運作, 但最先是在 Mac 機器上實作的. Python 的圖騰是一隻蟒蛇, 但其名稱的由來卻與蟒蛇一點關係也沒有, 而是源自英國 BBC 著名的喜劇影集 "Monty Python’s Flying Circus" 來的. 而其整合開發環境叫做 IDLE 而非 IDE 的原因是 Monty Python 開發小組的一個成員名為 Eric Idle 的緣故.

Python 在 2000-10-16 發布了 Python 2.0, 支援垃圾回收與 Unicode, 此版本是 Python 大受歡迎的開始. 2008-12-03 又發布了 Python 3.0, 但與舊版本不完全相容 (not backward-compatible), 這在程式語言演進上較為罕見. 關於 Python 2 與 Python 3 的差異可參考這篇 :

# Python 2.x 或 3.x?

Python 語言的特色整理如下 :
  1. Python 是物件導向的直譯式語言 (Interpreter language), 與 Java/C++ 等編譯語言比起來, 省掉了編譯與連結步驟, 簡化了開發流程, 但事實上是把中介碼 byte code 的編譯動作隱藏起來了.
  2. Python 與 Javascript, PHP 等語言一樣均屬於腳本語言 (Scripting language), 其與系統語言 (C/C++) 之差異是 : 系統語言目標是節省系統資源, 提高執行效能 (資訊家電需求), 而腳本語言之目標是節省程式員時間, 提高開發速度 (應用程式需求).
  3. Python 是動態語言 (Dynamic language), 在執行時期才確定資料型別, 這與 Javascript, VBscript, Ruby 等語言是相同的.
  4. Python 是強型別語言 (Strong-typed language), 資料型別須透過顯式型別轉換才能混合運算, 如同 Java.
  5. Python 不是格式自由語言, 採用強制縮排定義程式區塊, 以換行表示敘述結束. 縮排是語法的一部分, 違反縮排規則將無法執行.
  6. Python 是跨平台語言, 早期本身是用 ANSI C 語言撰寫的, 可以在 Unix/Linux/DOS/Windows/Macintosh 等作業系統上執行. Python 程式執行時會編譯成 pycode 中介碼, 與 Java 的 bytecode 類似.
  7. Python 是開放源碼 (Open source) 的.
  8. Python 內建比 Java/C/C++ 還豐富的資料型別, 從而有效地減少程式碼長度.
  9. Python 內建複數型別, 支援複數運算.
  10. Python 是完全物件導向的語言, 不論資料, 字串, 函式, 模組全部都是物件. 完全支援多重繼承, 多型, 過載, 衍生, 與泛型, 使程式碼可重複使用. 同時也有例外處理機制, 具備垃圾回收功能, 自動管理記憶體之使用. 
  11. 利用 py2exe, pypy, pyinstaller 可將 Python 原始碼轉成脫離編譯器執行環境的獨立執行程式.
  12. Pyhton 的設計哲學 : 優雅, 明確, 簡單. 希望 "用一種方法, 最好是只有一種方法來做一件事", 而非像 Perl 那樣 "有多種方法來做同一件事", 盡量避免歧義, 因此 Python 原始碼具有高度的可讀性.
  13. Python 雖然被歸類為 "指令碼/描述語言 (Scripting language)", 但其功能遠比 Shell script, Javascript, VBscript 等僅能處理簡單工作之指令碼語言強大, Python 開發者稱其為一種 "高階動態語言".
  14. Python 也被稱為 Glue language (膠合語言), 能夠將其他語言編寫的程式進行整合與封裝.
  15. 大多數 Linux 發行版本都已整合了 Python, 可以在終端機下直接執行 Python.
  16. Python 語言的架構是可延伸的, 並非所有的功能與特性都整合到核心, 而是歸類於其強大的標準函式庫中, 從而避免像 VBscript 那樣臃腫. Python 輕巧的語言核心只包括數字, 字串, 串列, 字典, 檔案等資料型別與函式, 其他額外功能如系統管理, 網路通訊, 文字處理, 資料庫, 圖形介面, XML 等全部由標準函式庫提供. 另外社群還提供豐富的套件, 如 Web 開發, 科學計算等等.
  17. Python 標準函式庫包含多個作業系統功能呼叫函式庫, 透過 pywin32 套件可以存取 Windows API 與 COM 服務; 而透過 IronPython 則可直接呼叫 .Net Framework.
  18. 以 Python 編寫系統管理指令在可讀性, 效能, 重覆使用, 擴充性方面都優於 shell 指令.
  19. Python 已有的實作 : CPython (C), JPython (Java), PyPy (Python), IronPyhon (.Net).
以上都是關於 Python 的背景知識, 現在 Python 越來越受歡迎, 不僅在科學計算領域被廣泛使用, 許多大學如 MIT 與柏克萊等校之資訊科學系也改用 Python 作為學生必修語言, 目前 Python 在 TIOBE 排行已經穩定在前五名 :


自 Python 1.0 於 1994 年問世以來, 過去 22 年來 Pyhton 的排名從 26 名穩定上升到目前的第五名, 其受歡迎的程度可見一斑 :


此外在嵌入式系統應用中, Python 也是樹莓派 Raspberry Pi 的預設作業系統 Raspbian 的內建程式語言, 樹莓派也因為 Python 龐大的第三方套件而展現驚人的功能, 廣泛應用在無人機, 機器人, 影像辨識, 自然語言處理等領域. Python 的厲害在於其豐富的第三方套件, 在 PyPi 網站上已登錄超過 9 萬個套件, 各種應用應有盡有, 參考 :

https://pypi.python.org/pypi

學習 Python 要先安裝其執行環境, 首先到官網下載 Python :

https://www.python.org/downloads/

如果要安裝 64 位元版本, 到下列網址尋找 x86-64 exceutable 版的 :

https://www.python.org/downloads/windows/

目前最新版是 3.5.2, 如果是用在 GAE 的話要下載 2.7 版, 因為 GAE 尚未支援 Python 3.  Python 2.7 版也是 Python 2 的最後版本.

安裝 Python 時要注意更改安裝路徑以及勾選 "Add Python 3.5 to PATH" :


注意, 這裡要選 "Customerized installation", 這樣才能更改安裝路徑 :


這個只要按 Next 即可 :


這裡就是修改安裝路徑的地方, 將原先又臭又長的路徑改為 C:\Python35 即可. 這樣安裝完後在 DOS 視窗的任何目錄下打 Python 都能執行 Python 程式.



直接輸入 Python 指令馬上即輸出結果. 例如 :

>>> 2+3
5
>>> print(2+3)
5

如果要跳出 Python 直譯器, 可輸入 exit() 或 quit() 或按 Ctrl+C 即回到 DOS 命令列.

此外也可以使用 Python 內建的 IDLE 交談式介面來執行 Python 程式, 其功能比由 DOS 進入 Python 執意環境要多, 例如可以編輯 Python 程式後點選 Run Module 來執行檔案.

當下了一些指令後, IDLE 視窗就會塞滿指令與回應, 能不能像在 DOS 一樣下個 CLS 指令就清除畫面呢? 很遺憾的是 IDLE 並沒有這樣的單一指令. 不過可以照下列文章介紹的方法為 IDLE 添加清除畫面快捷鍵 :

IDLE如何清屏?

先下載 ClearWindow.py 程式, 將其放在 Python 3 安裝目錄的 C:\Python35\Lib\idlelib 下, 然後用記事本編輯此目錄下的 config-extensions.def 檔, 將下列指令複製到檔尾後存檔, 將 IDLE 重開即可在 Option 下看到新增的 "Clear Shell Window" 功能選項了, 按此可清除畫面 :



這次受訓從老師那邊發現一本 Python 好書 :

Python 程式設計 : 從初學到活用 Python 開發技巧的 16 堂課 (何敏煌, 博碩)

Source : 天瓏

今天晚上就跑去明儀買回來, 打算好好研讀一番.

參考 :

Python 2.x或3.x?
Python Tutorial 第二堂(1)數值與字串型態

Python 3 與 Python 2 主要的差異如下 :

1. Input 輸入 :

在 Python 2 時可以使用 raw_input() 函數與 input() 函數讀取標準輸入, input() 事實上是透過 raw_input() 實作的, 兩者的傳回值型態不同, raw_input() 傳回值一律是字串, 且字串輸入時不用加引號, 例如 :

>>> raw_input("Name:")
Name:tony     (字串不須加引號)
'tony'
>>> raw_input("Age:")
Age:50
'50'                 (傳回字串)

可見 raw_input() 輸入時都不用加引號. 而 input() 則字串須加引號 :

>>> input("Name:")
Name:tony    (字串須加引號)

Traceback (most recent call last):
  File "    input("Name:")
  File "NameError: name 'tony' is not defined
>>> input("Name:")
Name:"tony"   (字串須加引號)
'tony'
>>> input("Name:")
Name:"tony"
'tony'
>>> input("Age:")
Age:50   (數字不須加引號)
50

可見 input() 只有數字不須加引號.

不過在 Python 3.2.3 版後已經不能用 raw_input() 了, 只能使用 input().

參考 :

# python 研究-raw_input 和 input 差異比較

2. Print 輸出 :

在 Python 2 時 print 是一個敘述 (指令), 列入關鍵字裡面, 使用方式如下 :

print "Hello World"

但是到了 Python 3 時 print 變成函數, 輸出資訊必須放在小括號內 :

print ("Hello World")

3. 中文支援 :

Python 2 雖然也支援中文, 但必須在第一行指定 UTF-8 字元編碼 :

# -*- coding:UTF-8 -*-

同時 .py 檔存檔時必須另存為 UTF-8 編碼格式.

但是在 Python 3 已經全面支援中文了 (預設使用 UTF-8 編碼), 連變數名稱也可以使用中文, 例如 :

>>> 哈囉世界="Hello World"
>>> 哈囉世界
'Hello World'

第一行不用再加 encoding 註記, 但仍要存成 UTF-8 格式.


另外, Python 支援大整數也是一個亮點, 在 C/Java 等語言裡, 整數 int 使用 4 個 bytes 儲存, 資料範圍 -2147483648~2147483647, 超出此範圍即發生溢位錯誤而無法儲存. 在 Python 無此問題, 再大的整數都可以處理. 在 Python 2 版還有分整數 int 與長整數 long, 大整數可以在後面加個 L 標示為長整數. 而且 2.2 版後若發生溢位會自動轉換成長整數, 不會出現執行錯誤. 到 Python 3 之後已經沒有 long 這種資料類型, 整數就只有 int 這個類型, 這個 int 其實就是 2 版的 long, 亦即在 Python 3 裡全部都是長整數.

不過, Python 對大整數的支援無上限指的是直到機器的極限, 看 CPU 是 32/64 位元而定. 而浮點數也是有機器限制的, 32 位元電腦只能表示到小數點後 12 位; 64 位元則至 16 位,  例如 :

>>> 1.0/3.0     (64 位元機器)
0.3333333333333333

而科學表示法可以處理到 1.7e308, 到 1.8e308 就變成 inf (無限大) 了 :

>>> 1.8e308
inf
>>> 1.7e308
1.7e+308
>>>

2017-04-11 補充 :

Python 3 與 Python 2 到底有哪些不同? 參見 :

# https://docs.python.org/3/whatsnew/3.0.html

2018-02-26 補充 :

在下面這篇文章中建議安裝 32 位元的版本, 參考 :

https://stackoverflow.com/questions/3117626/should-i-use-python-32bit-or-python-64bit

其理由是 :
  1. 通常不會用到很多記憶體, 32 位元就夠了.
  2. 比較不會遇到 COM 的問題.
  3. 大部分 DLL 是 32 位元的, 64 位元的 Python 通常無法載入 32 位元 DLL.
不過隨著 Python 版本更新, 這些已不是問題, 而且機器學習框架如 TensorFlow 要求 Python 64 位元版本, 因此我現在都改安裝 64 位元版本. 參考 :

Windows 安裝深度學習框架 TensorFlow 與 Keras


2018-06-23 補充 :

最近在 "超圖解 Python 物聯網實作入門 (旗標, 趙英傑)" 這本書發現愛沙尼亞 TARTU 大學開發的 Thonny 編輯器非常好用, 此 Python 專用編輯器自帶 Python 3.6.4 開發環境, 因此只要安裝 Thonny 即可編輯與執行 Python 程式, 不需在編輯器與命令提示字元視窗來回切換, 可說是超迷你版的 Anaconda, 主要差別是 Thonny 原生只帶了 pip 與 setuptools 這兩個外掛模組, 使用者可視需要利用其方便的安裝工具自行安裝自己用得到的外掛模組, 而 Ananconda 則幾乎是包山包海內建了大多數外掛模組因而顯得擁腫龐大. 參考這篇 :

好用的 Python 編輯器 Thonny

如果電腦中還沒安裝 Python, 那就直接安裝 Thonny 就好, 不需要另外在安裝 Python 了. 如果電腦裡已經有 Python 也沒關係, Thonny 自帶的 Python 與電腦原先安裝的 Python 井水不犯河水, 兩邊所安裝的外掛模組也是毫無關係的平行線. Thonny 唯一的問題是其自帶的 Python 是 32 位元且為 3.6.4 版, 而 TensorFlow 框架目前只支援到 3.5 且必須在 64 位元 Python 上跑, 因此無法安裝 TensorFlow. 

11 則留言 :

胖橋大宅 提到...

拜讀你的文章獲益良多,小弟有arduino問題不知是否方便向你請教,可以給我mail把問題寫下,敝姓廖我的mail:delight2006515@gmail.com叨擾之處請多包涵

小狐狸事務所 提到...

已在信件中回覆, 不知有收到嗎?

Unknown 提到...

你好,我是初次學python, 想請問python可以寫單晶片嗎~??

小狐狸事務所 提到...

可以喔, 可將 MicroPython 韌體上傳到 ESP8266 模組控制單晶片, 參考 :

http://yhhuang1966.blogspot.tw/2017/12/micropython-on-esp8266-ap.html

匿名 提到...

hi
請教如果想要將raspberry pi 3B 上IDEL編寫的程式打包轉成如exe執行檔執行不知可行嗎?

謝謝

小狐狸事務所 提到...

先把 IDLE 上的指令在 Windows 上打成 .py 檔案, 再用 py2exe 打包成 .exe 可執行檔, 參考 :
http://ghaouse.blogspot.tw/2011/09/py2exe.html

匿名 提到...

參考資料去做看起來是在window平台上執行,但是如果我打算在 raspberryPi3B 平台上安裝執行產生exe似乎就不行了對嗎?有參考做法嗎?謝謝

小狐狸事務所 提到...

EXE 是 Windows 上的執行檔, 在 Linux 機器上無法執行 (指令集不同). 如果硬要在 Pi 3 上跑 EXE 檔, 可能要找看看有沒有 Windows 的模擬器 (Emulator), 在 Pi 3 上模擬出 Windows 執行環境.

匿名 提到...

"
匿名 匿名 提到...
參考資料去做看起來是在window平台上執行,但是如果我打算在 raspberryPi3B 平台上安裝執行產生exe似乎就不行了對嗎?有參考做法嗎?謝謝"

那如果說,我在 raspberry 3B上寫好GUI程式,我要怎樣可以轉成exe
將程式打包起來可以安裝到其他raspberry 3B上安裝執行
因為看 raspberry上的應用程式不也是這樣嗎?
謝謝

小狐狸事務所 提到...

或許可以試試看 PyInstaller, 參考 :
https://ningyu1.github.io/site/post/59-py2exe-pyinstaller/

匿名 提到...

版主,

參考上面在rasp 3B使用pyinstaller方式後產生exe檔,
但是當我去點選執行程式後, 畫面會快速閃過去terminal 畫面,沒有出現使用python執行的UI程式??
不知是否有哪有漏掉或是需要修改的?
thks