Photo by Chris Ried on Unsplashhtml
Python 是一種易於學習又功能強大的編程語言。它提供了高效的高級數據結構,還有簡單有效的面向對象編程。Python 優雅的語法和動態類型,以及解釋型語言的本質,使它成爲多數平臺上寫腳本和快速開發應用的理想語言。python
Python 解釋器及豐富的標準庫以源碼或機器碼的形式提供,能夠到 Python 官網 www.python.org/ 免費獲取適用於各個主要系統平臺的版本,並可自由地分發。這個網站還包含許多免費第三方 Python 模塊、程序和工具以及附加文檔的發佈頁面或連接。linux
Python 解釋器易於擴展,可使用 C 或 C++(或者其餘能夠經過 C 調用的語言)擴展新的功能和數據類型。Python 也可用於可定製化軟件中的擴展程序語言。shell
若是你常常在電腦上工做,總會有些任務會想讓它自動化。好比,對一大堆文本文件進行查找替換,對不少照片文件按照比較複雜的規則重命名並放入不一樣的文件夾。也可能你想寫一個小型的數據庫應用,一個特定的界面應用,或者一個簡單的遊戲。數據庫
若是你是專業的軟件開發人員,你可能須要編寫一些 C/C++/Java 庫,但總以爲一般的開發的流程(編寫、編譯、測試、再次編譯等)太慢了。可能給這樣的庫寫一組測試,就是很麻煩的工做了。或許你寫了個軟件,能夠支持插件擴展語言,但你不想爲了本身這一個應用,專門設計和實現一種新語言了。編程
那麼,Python 正好能知足你的須要。windows
對於這些任務,你也能夠寫 Unix 腳本或者 Windows 批處理完成,可是 shell 腳本最擅長移動文件和替換文本,並不適合 GUI 界面或者遊戲開發。你能夠寫一個 C/C++/Java 程序,可是可能初版本的草稿都要很長的開發時間。Python 的使用則更加簡單,能夠在 Windows,Mac OS X,以及 Unix 操做系統上使用,並且能夠幫你更快地完成工做。數組
Python 很容易使用,但它是一種真正的編程語言,提供了不少數據結構,也支持大型程序,遠超 shell 腳本或批處理文件的功能。Python 還提供比 C 語言更多的錯誤檢查,並且做爲一種 「超高級語言」,它有高級的內置數據類型,好比靈活的數組和字典。正由於這些更加通用的數據類型,Python 可以應付更多的問題,超過 Awk 甚至 Perl,並且不少東西在 Python 中至少和那些語言一樣簡單。數據結構
Python 容許你劃分程序模塊,在其餘的 Python 程序中重用。它內置了不少的標準模塊,你能夠在此基礎上開發程序——也能夠做爲例子,開始學習 Python 編程。例如,文件輸入輸出,系統調用,套接字,甚至圖形界面接口工做包好比 Tk 。app
Python 是一種解釋型語言,在程序開發階段能夠爲你節省大量時間,由於不須要編譯和連接。解釋器能夠交互式使用,這樣就能夠方便地嘗試語言特性,寫一些一次性的程序,或者在自底向上的程序開發中測試功能。它也是一個順手的桌面計算器。
Python 程序的書寫是緊湊而易讀的。Python 代碼一般比一樣功能的 C,C++,Java 代碼要短不少,緣由列舉以下:
Python 是 「可擴展的」:若是你知道怎麼寫 C 語言程序,就能很容易地給解釋器添加新的內置函數或模塊,不管是讓關鍵的程序以最高速度運行,仍是把 Python 程序連接到只提供預編譯程序的庫(好比硬件相關的圖形庫)。一旦你真正連接上了,就能在 Python 解釋器中擴展或者控制 C 語言編寫的應用了。
順便提一下,這種語言的名字(Python 意爲 「蟒蛇」)來自於 BBC 節目 「Monty Python 的飛行馬戲團」,而與爬行動物沒有關係。在文檔中用 Monty Python 來開玩笑不僅是能夠的,仍是推薦的!
如今你已經對 Python 躍躍欲試了,想要深刻了解一些細節了。由於學習語言的最佳方式是使用它,本教程邀請你一邊閱讀,一邊在 Python 解釋器中玩耍。
在 Python 可用的機器上,Python 解釋器一般放在 /usr/local/bin/python3.7
; 把 /usr/local/bin
放到你 Unix shell 的搜索路徑當中 , 這樣就能鍵入命令:
python3.7
複製代碼
就能運行了。
安裝時能夠選擇安裝目錄,因此解釋器也可能在別的地方;能夠問問你身邊的 Python 大牛,或者你的系統管理員。(好比 /usr/local/python
也是比較經常使用的備選路徑)
在 Windows 機器上, Python 安裝一般放在 C:\Python37
中,儘管你能夠在運行安裝程序時更改此設置。要將此目錄添加到路徑中,能夠將如下命令鍵入 命令提示符窗口:
set path=%path%;C:\python37
複製代碼
在主提示符中輸入文件結束字符(在 Unix 系統中是 Control-D
,Windows 系統中是 Control-Z
)就退出解釋器並返回退出狀態爲 0。若是這樣無論用,你還能夠寫這個命令退出:quit()
。
解釋器的行編輯功能也包括交互式編輯,在支持 readline 的系統中,能夠回看歷史命令,也有 Tab
代碼補全功能。要想快速檢查是否支持行編輯,在出現提示符後,按鍵盤 Control-P
。若是它 「嗶」 了一聲,它就是支持行編輯的;關於按鍵的詳細介紹請看附錄 交互式編輯和編輯歷史。若是什麼都沒發生,或者顯示出 ^P
,那麼就不支持行編輯功能;你只能用退格(Backspace
)鍵從當前行中刪除字符。
解釋器運行的時候有點像 Unix 命令行:在一個標準輸入 tty 設備上調用,它能交互式地讀取和執行命令;調用時提供文件名參數,或者有個文件重定向到標準輸入的話,它就會讀取和執行文件中的 腳本。
另外一種啓動解釋器的方式是 python -c command [arg] ...
,其中 command 要換成想執行的指令,就像命令行的 -c
選項。因爲 Python 代碼中常常會包含對終端來講比較特殊的字符,一般狀況下都建議用英文單引號把 command 括起來。
有些 Python 模塊也能夠做爲腳本使用。能夠這樣輸入:python -m module [arg] ...
,這會執行 module 的源文件,就跟你在命令行把路徑寫全了同樣。
在運行腳本的時候,有時可能也會須要在運行後進入交互模式。這種時候在文件參數前,加上選項 -i
就能夠了。
關於全部的命令行選項,請參考 命令行與環境。
在終端(tty)輸入並執行指令時,咱們說解釋器是運行在 交互模式(interactive mode)。在這種模式中,它會顯示 主提示符(primary prompt),提示輸入下一條指令,一般用三個大於號(>>>
)表示;連續輸入行的時候,它會顯示 次要提示符,默認是三個點(...
)。進入解釋器時,它會先顯示歡迎信息、版本信息、版權聲明,而後就會出現提示符:
$ python3.7
Python 3.7 (default, Sep 16 2015, 09:25:04)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
複製代碼
多行指令須要在連續的多行中輸入。好比,以 if
爲例:
>>> the_world_is_flat = True
>>> if the_world_is_flat:
... print("Be careful not to fall off!")
...
Be careful not to fall off!
複製代碼
有關交互模式的更多內容,請參考 交互模式。
默認狀況下,Python 源碼文件以 UTF-8 編碼方式處理。在這種編碼方式中,世界上大多數語言的字符均可以同時用於字符串字面值、變量或函數名稱以及註釋中——儘管標準庫中只用常規的 ASCII 字符做爲變量或函數名,並且任何可移植的代碼都應該遵照此約定。要正確顯示這些字符,你的編輯器必須能識別 UTF-8 編碼,並且必須使用能支持打開的文件中全部字符的字體。
若是不使用默認編碼,要聲明文件所使用的編碼,文件的 第一 行要寫成特殊的註釋。語法以下所示:
# -*- coding: encoding -*-
複製代碼
其中 encoding 能夠是 Python 支持的任意一種 codecs
。
好比,要聲明使用 utf-8 編碼,你的源碼文件要寫成:
# -*- coding: utf-8 -*-
複製代碼
關於 第一行 規則的一種例外狀況是,源碼以 UNIX "shebang" 行 開頭。這種狀況下,編碼聲明就要寫在文件的第二行。例如:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
複製代碼
and
, or
, not
int
, float
, complex
list
, tuple
, range
str
bytes
, bytearray
, memoryview
set
, frozenset
dict
Python 中的變量不須要提早聲明。 變量賦值後會自動建立。
>>> width = 20
>>> height = 5 * 9
>>> width * height
900
複製代碼
'……'
)"……"
)\
能夠用來轉義r
禁止反斜槓 \
轉義+
鏈接字符串>>> 'spam eggs' # single quotes
'spam eggs'
>>> 'doesn\'t' # use \' to escape the single quote...
"doesn't"
>>> "doesn't" # ...or use double quotes instead
"doesn't"
>>> '"Yes," they said.'
'"Yes," they said.'
>>> "\"Yes,\" they said."
'"Yes," they said.'
>>> '"Isn\'t," they said.'
'"Isn\'t," they said.'
複製代碼
除了索引,字符串還支持 切片。索引能夠獲得單個字符,而 切片 能夠獲取子字符串:
>>> word[0:2] # characters from position 0 (included) to 2 (excluded)
'Py'
>>> word[2:5] # characters from position 2 (included) to 5 (excluded)
'tho'
複製代碼
注意切片的開始老是被包括在結果中,而結束不被包括。這使得 s[:i] + s[i:] 老是等於 s
Python 中能夠經過組合一些值獲得多種 複合 數據類型,其中最經常使用的 列表。
>>> squares = [1, 4, 9, 16, 25]
>>> squares
[1, 4, 9, 16, 25]
複製代碼
enumerate()
內置函數所產生的二元組)set
或 dict
的實例)。>>> brother = ('小武', '小久', 2015, 2019)
>>> numbers = (1, 2, 3, 4, 5 )
>>> alpha = "a", "b", "c", "d"
>>> brother
('小武', '小久', 2015, 2019)
>>> numbers
(1, 2, 3, 4, 5)
>>> alpha
('a', 'b', 'c', 'd')
複製代碼
mapping 對象會將 hashable 值映射到任意對象。 映射屬於可變對象。 目前僅有一種標準映射類型 字典。
1
和 1.0
) 則二者能夠被用來索引同一字典條目。 (可是請注意,因爲計算機對於浮點數存儲的只是近似值,所以將其用做字典鍵是不明智的。)>>> a = dict(one=1, two=2, three=3)
>>> b = {'one': 1, 'two': 2, 'three': 3}
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> e = dict({'three': 3, 'one': 1, 'two': 2})
>>> a == b == c == d == e
True
複製代碼
set 對象是由具備惟一性的 hashable 對象所組成的無序多項集。 常見的用途包括成員檢測、從序列中去除重複項以及數學中的集合類計算。
無序的多項集
x in set, len(set)
和 for x in set
>>> basket = {'apple', 'orange', 'apple', 'grape', 'orange', 'banana'}
>>> print(basket)
{'orange', 'banana', 'grape', 'apple'}
>>> 'orange' in basket
True
>>> 'strawberry' in basket
False
複製代碼
if
語句用於有條件的執行:
>>> x = int(input("Please enter an integer:"))
Please enter an integer: 42
>>> if x < 0:
... x = 0
... print('Negative changed to zero')
... elif x == 0:
... print('Zero')
... elif x == 1:
... print('Single')
... else:
... print('More')
...
More
複製代碼
能夠有零個或多個 elif
部分,以及一個可選的 else
部分。 關鍵字 'elif
' 是'else if' 的縮寫,適合用於避免過多的縮進。 一個 if
... elif
... elif
... 序列能夠看做是其餘語言中的 switch
或 case
語句的替代。
for
語句用於對序列(例如字符串、元組或列表)或其餘可迭代對象中的元素進行迭代:
>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
... print(w, len(w))
...
cat 3
window 6
defenestrate 12
複製代碼
while
語句用於在表達式保持爲真的狀況下重複地執行:
>>> monkeys = 5
>>> while monkeys > 0:
... print("{} 只猴子當盪鞦韆,嘲笑鱷魚被水淹。鱷魚來了,鱷魚來了,啊嗚!".format(monkeys))
... monkeys -= 1
...
5 只猴子當盪鞦韆,嘲笑鱷魚被水淹。鱷魚來了,鱷魚來了,啊嗚!
4 只猴子當盪鞦韆,嘲笑鱷魚被水淹。鱷魚來了,鱷魚來了,啊嗚!
3 只猴子當盪鞦韆,嘲笑鱷魚被水淹。鱷魚來了,鱷魚來了,啊嗚!
2 只猴子當盪鞦韆,嘲笑鱷魚被水淹。鱷魚來了,鱷魚來了,啊嗚!
1 只猴子當盪鞦韆,嘲笑鱷魚被水淹。鱷魚來了,鱷魚來了,啊嗚!
複製代碼
break
和 continue
語句break
語句,和 C 中的相似,用於跳出最近的 for
或 while
循環.
循環語句可能帶有一個 else
子句;它會在循環遍歷完列表 (使用 for
) 或是在條件變爲假 (使用 while
) 的時候被執行,可是不會在循環被 break
語句終止時被執行。
>>> for n in range(2, 10):
... for x in range(2, n):
... if n % x == 0:
... print(n, 'equals', x, '*', n//x)
... break
... else:
... # loop fell through without finding a factor
... print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
複製代碼
pass
語句pass
語句什麼也不作。當語法上須要一個語句,但程序須要什麼動做也不作時,可使用它。例如:
>>> while True:
... pass # Busy-wait for keyboard interrupt (Ctrl+C)
...
複製代碼
這一般用於建立最小的類:
>>> class MyEmptyClass:
... pass
...
複製代碼
pass
的另外一個可使用的場合是在你編寫新的代碼時做爲一個函數或條件子句體的佔位符,容許你保持在更抽象的層次上進行思考。 pass
會被靜默地忽略:
>>> def initlog(*args):
... pass # Remember to implement this!
...
複製代碼
咱們能夠建立一個輸出任意範圍內 Fibonacci 數列的函數:
>>> def fib(n): # write Fibonacci series up to n
... """Print a Fibonacci series up to n."""
... a, b = 0, 1
... while a < n:
... print(a, end=' ')
... a, b = b, a+b
... print()
...
>>> # Now call the function we just defined:
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
複製代碼
關鍵字 def
引入一個函數 定義
它必須後跟函數名稱和帶括號的形式參數列表
構成函數體的語句從下一行開始,而且必須縮進。
函數體的第一個語句能夠(可選的)是字符串文字;這個字符串文字是函數的文檔字符串或 docstring
有些工具使用文檔字符串自動生成在線或印刷文檔,或者讓用戶以交互式的形式瀏覽代碼
在你編寫的代碼中包含文檔字符串是一種很好的作法,因此要養成習慣。
如今你將要寫更長,更復雜的 Python 代碼,是時候討論一下 代碼風格。大多數語言都能使用不一樣的風格編寫(或更簡潔,格式化的);有些比其餘的更具備可讀性。能讓其餘人輕鬆閱讀你的代碼老是一個好主意,採用一種好的編碼風格對此有很大幫助。
對於 Python,PEP 8 已經成爲大多數項目所遵循的風格指南;它促進了一種很是易讀且使人賞心悅目的編碼風格。每一個 Python 開發人員都應該在某個時候閱讀它;如下是爲你提取的最重要的幾個要點:
使用 4 個空格縮進,不要使用製表符。
4 個空格是一個在小縮進(容許更大的嵌套深度)和大縮進(更容易閱讀)的一種很好的折中方案。製表符會引入混亂,最好不要使用它。
換行,使一行不超過 79 個字符。
這有助於使用小型顯示器的用戶,而且能夠在較大的顯示器上並排放置多個代碼文件。
使用空行分隔函數和類,以及函數內的較大的代碼塊。
若是可能,把註釋放到單獨的一行。
使用文檔字符串。
在運算符先後和逗號後使用空格,但不能直接在括號內使用: a = f(1, 2) + g(3, 4)
。
類和函數命名的一致性;規範是使用 CamelCase
命名類,lower_case_with_underscores
命名函數和方法。始終使用 self
做爲第一個方法參數的名稱(有關類和方法,請參閱 初探類 )。
若是你的代碼旨在用於國際環境,請不要使用花哨的編碼。Python 默認的 UTF-8 或者純 ASCII 在任何狀況下都能有最好的表現。
一樣,哪怕只有很小的可能,遇到說不一樣語言的人閱讀或維護代碼,也不要在標識符中使用非 ASCII 字符。
>>> 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!
複製代碼