Python生態環境簡介
| 作者: | Mir Nazim |
|---|---|
| 原文: | Python Ecosystem - An Introduction |
| 譯者: | dccrazyboy |
| 原譯: | Python生態環境簡介 |
當開發人員從PHP,Ruby或者別的開發環境轉換到Python時,所面對的最大問題是缺乏對Python開發的生態環境的充分理解。開發人員非常想得到一份關於完成大多數任務的指南或資源,而不論使用的方法是否規范。
下文所講到的基本上都來源於我的網站,那存儲着Python環境下對於網絡應用開發的一些基本資料,這些資料是為那些從別的平台轉到Python開發的實習生,研究生和有經驗的開發者准備的。
這不是一個完美的文檔,我的目標是將它做成一個永久的文檔,但願這篇文檔可以發展成為一個詳細的教程。
目標讀者
這不是一本關於Python的語法書。 這個教程不會教你花哨的Python用法讓你成為一名Python黑客。 我默認你已經了解Python的基礎用法。如果你不知道,別往下看了。 先去看看Zed Shaw的免費教Python入門的書《Learn Python The Hard Way》。
我不知道你是不是在用Linux(最好是Ubuntu/Debian)或者是類Linux系統。 為毛?因為Linux是我最了解的系統。 除了測試跨瀏覽器兼容性以外,我從沒在Windows或者Max OS X上面開發過。 下面是如何在不同平台安裝Python的教程。
去搜索下最適合你平台的Python安裝方法。我強烈建立問Stack Overflow。
版本之惑
Python 2.x是一個穩定的版本,Python 3是個新的版本。如果你不在乎,跳過這段直接看下面的Python安裝部分。
當開始學習Python時,安個3.x的版本看上去應該是第一步,但它可能並不一定是你想要的。
現在Python有兩個正在開發的版本-2.7.x和3.x(也被成為Python3,Py3k或Python 3000)。 跟Python2相比Python3就是另外一個語言。它們之間存在者或大或小的語法差異。 現今Python2.6/2.7是被安裝和應用的最為廣泛的版本。 許多的主流代碼和一些重要的packages/frameworks/tools/utilities/modules並不支持Python3。
因此,最安全的選擇是使用2.x(2.7最好)版本。如果你完全了解Python3的話在再用它。
Python 3 Wall of Shame 列出了很多包在Python3中的兼容性。在決定用Python3之前好好看看這個。
VM挑選
Python解釋器或Python虛擬機有很多種實現,CPython是最主流的實現。CPython同時也是別的虛擬機實現的參考解釋器。
PyPy是用Python實現的Python解釋器,Jython是用Jave實現運行在JVM上的解釋器,IronPython是用Microsoft .NET CLR實現的解釋器。
除非解釋器的選擇非常非常重要,我們一般都用CPython。
如果上面那些關於版本和虛擬機的廢話讓你頭疼,那你就安裝CPython的2.7.x版本,相信我!
安裝Python
大多數的Linux/Unix系統的Max OS X都自帶Python。如果沒有或者版本過低,你可以通過下面的命令安裝:
Ubuntu/Debian及其衍生系統:
$ sudo apt-get install python2.7
sudo 是一個是類Unix系統的一個命令,它允許用戶以別的用戶(一般是超級用戶,或者root)的權限運行程序。 更多請查閱Wikipedia。
Fedora/Red Hat及類似系統:
sudo yum install python2.7
使用RHEL你可能需要打開EPEL Repositories才能安裝。
從這起,我將在例子中使用sudo,你需要根據你的系統進行更改。
理解包
你首先需要理解的是Python沒有一個默認的包管理設施。事實上,包的概念在Python中是相當弱的。
可能你已經知道,Python代碼被組織為模塊。 一個模塊可能由包含一個函數的單一文件組成,也可能由包含多個模塊的目錄組成。 包和模塊的區別非常小,並且每個模塊都能被理解為包。
那么包和模塊的區別到底是什么(如果有的話)?為了明白這個,你首先應該明白Python是如何查找模塊的。
如同別的編程環境一樣,Python中的一些函數和類(例如str,len,Exception等)在全局(叫做內置函數)都是可用的。 別的就需要通過手動import 進來。例如:
>>> import os >>> from os.path import basename, dirname
這個包一定存在你的機子上,這樣才能被import語句導入。但Python是如何知道這些模塊的位置呢? 這些位置信息在你安裝Python虛擬機時就被自動設置好了,並且依賴於你的目標平台。
包的路徑可以在sys.path中查詢。下面是在我的筆記本上的結果,運行環境是Ubuntu 11.10。
>>> import sys >>> print sys.path ['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']
這里給出了Python搜索包的路徑。它將從最上面開始找,直到找到一個名字相符的。 這表明如果兩個不同的路徑分別包含了兩個具有相同名字的包,搜索將在找到第一個名字的時候停止,然后將永遠不會往下查找。
正如你所猜的,包搜索路徑很容易被劫持,為了確保Python首先載入你的包,所需做的如下:
>>> sys.path.insert(0, '/path/to/my/packages')
盡管這個方法在很多情況下都很好用,但一定要小心不要濫用。 只有當必要時再使用!不要濫用!
site 模塊控制包的搜索路徑。當Python虛擬機初始化時它會子同被導入。如果你想了解更多信息,請看 官方文檔 。
PYTHONPATH變量
PYTHONPATH 是一個用來增加默認包搜索目錄的環境變量。可以認為它是對於Python的一個特殊的 PATH 變量。 它僅僅是一個通過 :分割,包含Python模塊目錄的列表(並不是類似於 sys.path 的Python list)。 它可能就類似下面這樣:
export PYTHONPATH=/path/to/some/directory:/path/to/another/directory:/path/to/yet/another/directory
有時候你可能並不想覆蓋掉現存的 PYTHONPATH ,而僅僅是希望添加新目錄到頭部或尾部。
export PYTHONPATH=$PYTHONPATH:/path/to/some/directory # Append export PYTHONPATH=/path/to/some/directory:$PYTHONPATH # Prepend
PYTHONPATH , sys.path.insert 這些方法並非完美,我們最好也不要用這些方法。 使用它們,你可能可以解決本地的開發環境問題,但它在別的環境下也許並不適用。 有很多種方法可以達到這個效果,在下面我將一一闡述。
我們現在明白的Python如何找到安裝的包路徑,現在讓我們回到開始那個問題。 模塊和包的區別到底是什么?包是一個模塊或模塊/子模塊的集合,一般情況下被壓縮到一個壓縮包中。 其中包含1)依賴信息 2)將文件拷貝到標准的包搜索路徑的指令。3)編譯指令(如果在安裝前代碼必須被編譯的話)。 就這些東西!
第三方包
從一開始,如果要做一些實際Python開發,你一定會用到一些第三方包。
在Linux系統上至少有3種安裝第三方包的方法。
- 使用系統自帶的包管理系統(deb, rpm, 等)
- 通過社區開發的各種工具,例如 pip , easy_install 等
- 從源文件安裝
這三個方面,幾乎完成同樣的事情。即:安裝依賴,編譯代碼(如果需要的話),將一個包含模塊的包復制的標准軟件包搜索位置。
第二步和第三步在所有的操作系統上基本相同。 我再次希望您可以在 Stack Overflow 上找到你的平台的第三方包安裝方法。
在哪找第三方包?
在安裝第三方包之前,你首先要找到他們。以下是幾種方法:
- 你的系統包管理器中的發行版專用包。
- Python Package Index (or PyPI)
- 大量的源代碼服務器,例如 Launchpad, GitHub, BitBucket 等
通過發行版專用包安裝
通過包管理器安裝包安裝包就像使用命令行或者GUI安裝別的軟件那樣簡單。 例如在Ubuntu中安裝 simplejson
$ sudo apt-get install python-simplejson
通過pip安裝
easy_install漸漸不再流行。我們將主要介紹pip,它是easy_install的一個替代品。
pip是一個用來安裝和管理Python包的工具,就如同Python Packet Index一樣。 pip並沒有隨着Python一起安裝,因此我們需要先安裝它。Linux下,一般這樣安裝:
$ sudo apt-get install python-pip
在安裝任何其他包之前,我總是通過PyPI將pip升級到最新版本的, Ubuntu軟件庫中的版本普遍落后的PyPI。我通過pip升級pip它自己。
$ sudo pip install pip --upgrade
現在如果需要安裝任何包,你可以運行 pip install package-name 命令。 所以可以通過下面命令安裝 simplejson:
$ sudo pip install simplejson
刪除包也很簡單。
$ sudo pip uninstall simplejson
一般情況下, pip 會從PyPI自動安裝最新的穩定版, 但有時我們需要安裝一個特定版本的包,因為你的項目可能基於特殊的版本。 因此你可能需要使用類似如下的 pip install 命令:
$ sudo pip install simplejson==2.2.1
我們可能需要升級/降級/重新安裝包。此時可以通過下面的命令完成:
$ sudo pip install simplejson --upgrade # Upgrade a package to the latest version from PyPI $ sudo pip install simplejson==2.2.1 --upgrade # Upgrade/downgrade a package to a given version
現在,如果你想安裝一個處於開發版本的包,它在版本控制倉庫有,但是PyPI中還沒有怎么辦? pip 能夠很好的處理這種情況,但在這之前,你需要自己安裝這個版本控制倉庫。Ubuntu下,你可以如下安裝:
$ sudo apt-get install git-core mercurial subversion
安裝版本控制倉庫之后,從版本控制倉庫安裝包就如下所示:
$ sudo pip install git+http://hostname_or_ip/path/to/git-repo#egg=packagename $ sudo pip install hg+http://hostname_or_ip/path/to/hg-repo#egg=packagename $ sudo pip install svn+http://hostname_or_ip/path/to/svn-repo#egg=packagename
你也可以同樣簡單的從本地倉庫安裝,注意下面的三斜杠是文件目錄。
$ sudo pip install git+file:///path/to/local/repository
有一點需要注意,如果使用 git 協議安裝,你需要使用 git+git 前綴:
$ sudo pip install git+git://hostname_or_ip/path/to/git-repo#egg=packagename
現在你可能會好奇這些 egg 會被怎么使用。 現在你需要明白的是一個egg是一個被壓縮的Python包,里面包含了源代碼和一些元數據。pip 在安裝包前建立了egg信息。你可以在代碼倉庫的 setup.py 文件中找到egg名字。 找到 setup 塊然后找到類似於name="something" 的字段。 它可能看起來就像如下的代碼(這段代碼從simplejson的 srtup.py 得到)一樣。
setup( name="simplejson", # <--- This is your egg name version=VERSION, description=DESCRIPTION, long_description=LONG_DESCRIPTION, classifiers=CLASSIFIERS, author="Bob Ippolito", author_email="bob@redivi.com", url="http://github.com/simplejson/simplejson", license="MIT License", packages=['simplejson', 'simplejson.tests'], platforms=['any'], **kw)
如果沒有 setup.py 文件咋辦?這樣如何找到egg名?其實我們不需要。 把包源碼拷貝到你的工程目錄下,然后導入進去就可以直接用了。
--user 選項
上面的所有例子把包都安裝到系統范圍。如果你在 pip install 時使用 --user 選項,包將被安裝到 ~/.local 目錄下。在我的機子上,如下所示:
$ pip install --user markdown2
Downloading/unpacking markdown2
Downloading markdown2-1.0.1.19.zip (130Kb): 130Kb downloaded
Running setup.py egg_info for package markdown2
Installing collected packages: markdown2
Running setup.py install for markdown2
warning: build_py: byte-compiling is disabled, skipping.
changing mode of build/scripts-2.7/markdown2 from 664 to 775
warning: install_lib: byte-compiling is disabled, skipping.
changing mode of /home/mir/.local/bin/markdown2 to 775
Successfully installed markdown2
Cleaning up...
注意: markdown2 被安裝到 /home/mir/.local/bin/markdown2 這個目錄下。
有很多原因使你不想將包安裝到系統目錄中。 稍后我將講解如何對於每個項目設置獨立的Python環境。
從源碼安裝
從源碼安裝包僅僅需要一個命令,解壓這個包到一個目錄,然后執行下面的命令。
cd /path/to/package/directory python setup.py install
盡管這些安裝的辦法並沒有什么不同,但 pip 方式是最好的。 pip 讓你擁有輕松升級/降級包的能力,而手動安裝你就不得不去手動下載,解壓的安裝。 手動安裝包應該使你最后一個選擇,如果別的全部失敗了(一般不太可能)。
安裝需要編譯的包
我們現在已經了解了大多數包的安裝方法,但有些包還沒有介紹:包含C/C++代碼的Python包,它們需要在安裝前被編譯。 關於這些包最好的例子是數據庫適配器,圖片處理庫等。
雖然 pip 可以處理編譯安裝的源碼,但我個人更喜歡使用發行版的包管理器提供的包。 它將會安裝編譯好的二進制文件。
如果你還是想用 pip 安裝,下面是在Ubuntu系統上需要做的。
編譯器的相關工具:
$ sudo apt-get install build-essential
Python開發環境(頭文件等):
$ sudo aptitude install python-dev-all
如果你的系統沒有 python-dev-all ,看看這些相似的名字 python-dev , python2.X-dev 等等。
確保你已經安裝了 psycopg2 (PostgreSQL RDBMS adapter for Python),你將需要PostgreSQL的開發文件。
$ sudo aptitude install postgresql-server-dev-all
完成這些依賴的安裝后,你就能運行 pip install 了。
$ sudo pip install psycopg2
還需要注意一點: 並不是所有的包都能通過pip編譯安裝! 。 但如果你對編譯安裝很有自信,或者已經對於如何在自己的目標平台安裝有足夠的經驗。 那就大膽的手動安裝吧!
Python開發環境
不同的人喜歡用不同的方式建立各自的開發環境,但在幾乎所有的編程社區,總有一個(或一個以上)開發環境讓人更容易接受。 使用不同的開發環境雖然沒有什么錯誤,但有些環境設置更容易進行便利的測試,並做一些重復/模板化的任務,使得在每天的日常工作簡單並易於維護。
virtualenv
在Python的開發環境的最常用的方法是使用virtualenv包。 Virtualenv是一個用來創建獨立的Python環境的包。現在,出現了這樣的問題:為什么我們需要一個獨立的Python環境? 要回答這個問題,請允許我引用virtualenv自己的文檔:
我們需要處理的基本問題是包的依賴、版本和間接權限問題。想象一下,你有兩個應用,一個應用需要libfoo的版本1,而另一應用需要版本2。如何才能同時使用這些應用程序?如果您安裝到的/usr/lib/python2.7/site-packages(或任何平台的標准位置)的一切,在這種情況下,您可能會不小心升級不應該升級的應用程序。
簡單地說,你可以為每個項目建立不同的/獨立的Python環境,你將為每個項目安裝所有需要的軟件包到它們各自獨立的環境中。
使用 pip 命令來安裝virtualenv:
$ sudo pip install virtualenv
virtualenv安裝完畢后,可以通過運行下面的命令來為你的項目創建獨立的python環境。
$ mkdir my_project_venv $ virtualenv --distribute my_project_venv # The output will something like: New python executable in my_project_venv/bin/python Installing distribute.............................................done. Installing pip.....................done.
上面發生了什么?你創建了文件夾 my_project_venv 來存儲你的新的獨立Python環境。 --distribute 選項使virtualenv使用新的基於發行版的包管理系統而不是 setuptools 獲得的包。 你現在需要知道的就是 --distribute 選項會自動在新的虛擬環境中安裝 pip,這樣就不需要手動安裝了。 當你成為一個更有經驗的Python開發者,你就會明白其中細節。
現在看看 my_project_venv 目錄,你會看到這樣的結構:
# 這里只列出了將被討論的目錄和文件
.
|-- bin
| |-- activate # <-- 這個virtualenv的激活文件
| |-- pip # <-- 這個virtualenv的獨立pip
| `-- python # <-- python解釋器的一個副本
`-- lib
`-- python2.7 # <-- 所有的新包會被存在這
通過下面的命令激活這個virtualenv:
$ cd my_project_venv $ source bin/activate
執行完畢后,提示可能是這個樣子的:
(my_project_venv)$ # the virtualenv name prepended to the prompt
通過 deactivate 命令離開virtualenv環境
(my_project_venv)$ deactivate
運行下面的命令可以更好地理解兩者的差異,如果已經進入virtualenv請先離開。
首先讓我們看看如果調用python/pip命令它會調用那一個。
$ which python /usr/bin/python $ which pip /usr/local/bin/pip
再來一次!這次打開virtualenv,然后看看有什么不同。我的機子上顯示如下:
$ cd my_project_venv $ source bin/activate (my_project_venv)$ which python /home/mir/my_project_venv/bin/python (my_project_venv)$ which pip /home/mir/my_project_venv/bin/pip
virtualenv拷貝了Python可執行文件的副本,並創建一些有用的腳本和安裝了項目需要的軟件包,你可以在項目的整個生命周期中安裝/升級/刪除這些包。 它也修改了一些搜索路徑,例如PYTHONPATH,以確保:
- 當安裝包時,它們被安裝在當前活動的virtualenv里,而不是系統范圍內的Python路徑
- 當import代碼時,virtualenv將優先采取本環境中安裝的包,而不是系統Python目錄中安裝的包。
還有一點比較重要,在默認情況下,所有安裝在系統范圍內的包對於virtualenv是可見的。 這意味着如果你將simplejson安裝在您的系統Python目錄中,它會自動提供給所有的virtualenvs使用。 這種行為可以被更改,在創建virtualenv時增加 --no-site-packages 選項的virtualenv就不會讀取系統包,如下:
$ virtualenv my_project_venv --no-site-packages
virtualenvwrapper
virtualenvwrapper 是一個建立在 virtualenv 上的工具,通過它可以方便的創建/激活/管理/銷毀虛擬環境,沒它的話進行上面的操作將會相當麻煩。 可以通過下面命令安裝 virtualenvwrapper 。
$ sudo pip install virtualenvwrapper
安裝后,你需要配置它。下面是我的配置:
if [ `id -u` != '0' ]; then export VIRTUALENV_USE_DISTRIBUTE=1 # <-- Always use pip/distribute export WORKON_HOME=$HOME/.virtualenvs # <-- Where all virtualenvs will be stored source /usr/local/bin/virtualenvwrapper.sh export PIP_VIRTUALENV_BASE=$WORKON_HOME export PIP_RESPECT_VIRTUALENV=true fi
設置 WORKON_HOME 和 source /usr/local/bin/virtualenvwrapper.sh 只需要幾行代碼,別的部分是按照我個人喜好添加的。
將上面的配置添加到 ~/.bashrc 的末尾,然后將下面的命令運行一次:
$ source ~/.bashrc
如果你關閉所有的shell窗口和標簽,然后再打開一個新的shell窗口或標簽時, ~/.bashrc 也會被執行,此時將會自動的更新你的virtualenvwrapper 配置。 效果就跟執行上面的命令一樣。
新建/激活/關閉/刪除虛擬空間需要執行下面的命令:
$ mkvirtualenv my_project_venv $ workon my_project_venv $ deactivate $ rmvirtualenv my_project_venv
Tab補全在virtualenvwrapper中是可用的哦~
前往 virtualenvwrapper 主頁 查找更多關於它的信息。
通過pip和virtualenv進行依賴管理
pip 結合 virtualenv 可以為你的項目提供基本的依賴管理。
你可以通過 pip freeze 命令來查看當前已安裝的包版本。下面列出的是我寫着個博客所用到的包的版本:
$ pip freeze -l Jinja2==2.6 PyYAML==3.10 Pygments==1.4 distribute==0.6.19 markdown2==1.0.1.19
注意 -l 選項,它告訴 pip 只導出當前活動虛擬空間中安裝的包,排除那些全局空間安裝的包。
你可以把結果保存到文件里,然后將它添加到你的版本控制系統里。
$ pip freeze -l > requirements.txt
同時 pip 也能從一個包含 pip freeze 命令的文件中安裝包。
$ pip install -r requirements.txt
其他重要工具
雖然我們討論了基本的Python版本,虛擬機和包管理,但在日常工作中我們仍然還需要一些專用的工具來完成任務。 盡管我不能把每一個工具的細節都講到,然而我還是盡量給你提供基本的概述。
編輯器
對於Python編程有大量很優秀的編譯器。對於我個人而言,我更傾向於Vim,但這里我並不想挑起一場 編輯器戰爭 。
有大量支持Python的編輯器,例如:Vim/Gvim, Emacs, GNOME上的GEdit, KDE上的Kate, Scribes, ActiveState的Komodo Edit/IDE, WingWare的Wing IDE, JetBrains上PyCharm, Eclipse的PyDEV插件。此外,還有其他,但這些似乎是最流行的。你可以任意選擇最適合你的。
Pyflakes:源碼檢測工具
Pyflakes是一個檢查Python源碼並通過文本分析找出錯誤的工具。 它可以檢測出語法錯誤,和(部分)邏輯錯誤,導入但未使用的模塊,只使用一次的變量,等等。
你可以通過 pip 安裝:
$ pip install pyflakes
在命令行調用它,參數填源文件名即可,如下所示:
$ pyflakes filename.py
Pyflakes也可已被集成進編輯器。這是它在我的vim中的樣子。注意紅波浪線:
請自行前往Stack Overflow找出如何將Pyflakes添加到編輯器。
Requests:一個HTTP庫
Requests是一個將處理HTTP請求變得輕而易舉的庫。
同樣是通過 pip 安裝它:
$ pip install requests
下面是一個例子:
>>> import requests
>>> r = requests.get('https://api.github.com', auth=('user', 'pass'))
>>> r.status_code
204
>>> r.headers['content-type']
'application/json'
>>> r.content
...
Flask:一個web開發的微框架
Flask是一個基於Werkzeug和Jinja2的微框架。
通過 pip 安裝:
$ pip install Flask
這是一個簡單的例子:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
可以這樣運行它:
$ python hello.py * Running on http://localhost:5000/
Django:一個全棧式web開發框架
Django是一個全棧式web開發框架。它提供了ORM,HTTP庫,表單處理,XSS過濾,模板和別的特性。
通過 pip 安裝:
$ pip install Django
去 Django官網 查找更多信息。
Fabric:簡化SSH的使用並部署系統管理員任務
Fabric是一個命令行工具用來簡化程序對於SSH的使用或運行系統管理員任務。 它提供了一個基本套件可以執行本地或遠程shell命令(正常或通過sudo),上傳/下載文件,以及其他輔助功能,如提示用戶輸入,或中止執行的操作。
可以通過 pip 安裝:
$ pip install fabric
這是一個通過Fabric寫的任務:
from fabric.api import run
def host_type():
run('uname -s')
你可以在一台或多台服務器上執行這個命令:
$ fab -H localhost host_type [localhost] run: uname -s [localhost] out: Linux Done. Disconnecting from localhost... done.
SciPy:一個科學計算庫
如果你的工作涉及科學和數值計算,SciPy的是您不可或缺的重要工具。
SciPy官網這樣介紹:
SciPy的(讀做“Sigh Pie”)是數學、科學和工程方面的開源庫。 這也是Python在數值計算方面非常優秀的一個庫。 SciPy的庫依賴於NumPy,它提供了方便快速的N維矩陣操作。 SciPy庫與NumPy中的矩陣兼容,並提供了許多用戶友好且高效率的數值程序,如數值的積分和優化。 同時,他們運行在所有流行的操作系統上,安裝快速,並且都是免費的。NumPy和SciPy易於使用,但功能強大,足以滿足一些世界領先的科學家和工程師。 如果您需要在電腦上處理數字、顯示或公布結果,試試SciPy吧!
推薦閱讀
David Goodger的 Code Like a Pythonista: Idiomatic Python 包含了很多實用的Python例子和技術。
Doug Hellmann的 Python Module of the Week 系列的重點是建設一個使用Python標准庫中的模塊的示例代碼的倉庫。
贈言
這個教程到目前為止,所講述的僅是點到為止。Python世界中有大量的工具,庫和軟件可以幫你完成你的工作。 但你需要自己花時間去發現他們!
Python有一個偉大的社區和一群很聰明的維護者,他們對於新手非常有耐心。 因此,關注你最喜歡的開源項目,加入他們的郵件列表,跟有經驗的開發者交流經驗。 不久的將來,你的經驗也將足夠豐富,你將會成為他們其中的一員。
最后我想引用下 Zen Of Python 。我們思考,學習,受到啟發! Happy Pythoning
>>> 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!
