簡明Python教程是A Byte of Python的中譯本, 旨在引導(dǎo)讀者快速入門挣惰。本文總結(jié)了該教程Python 2.x版
與Python 3.x版
的內(nèi)容和差異。
介紹
Python的特色
- 解釋型
- 面向?qū)ο?/li>
- 動態(tài)數(shù)據(jù)類型
- 膠水語言
- 標(biāo)準(zhǔn)庫功能齊全
起步
使用交互式的提示符
- 在命令行輸入
python
進(jìn)入交互環(huán)境缤至。 - Python 2.x 直接輸入
print 'hello world'
短曾。Python 3.x 中print
不再是操作符,而成為函數(shù)谅猾,使用方法為print('hello world')
柄慰。 - 運(yùn)行
help()
獲取幫助,按q
退出幫助税娜。help(func)
得到函數(shù)的信息坐搔。加入引號print('str')
可得到操作符的信息。
使用源文件
- 將代碼保存為
helloworld.py
敬矩。然后概行,在終端執(zhí)行python helloworld.py
或者./helloworld.py
。 - 要直接運(yùn)行Python程序弧岳,在Unix有個標(biāo)準(zhǔn)的實現(xiàn)方法:在源文件行首加上
#!/usr/bin/python
凳忙。它被稱作組織行业踏,源文件的頭兩個字符是#!
(叫做pound bang
或者shebang
),后面跟著一個程序的絕對路徑涧卵。如果不知道位置堡称,可以寫成#!/usr/bin/env python
,但有多個python版本共存時不可以艺演,因為舊版本的Python可能運(yùn)行程序却紧。 - Unix/Linux用戶需要
chmod a+x helloworld.py
命令使文件可執(zhí)行。
基本概念
數(shù)
- 四種類型:整數(shù)胎撤、長整數(shù)晓殊、浮點數(shù)、復(fù)數(shù)
字符串
- 雙引號與單引號字符串完全相同
- 三引號(
'''
或"""
)指示多行的字符串 - 轉(zhuǎn)義符
\
也可用于表示下一行繼續(xù) - 自然字符串通過給字符串加上前綴
r
或R
來指定 - Unicode字符串前加前綴
u
或U
- 字符串不可變
- 相鄰字符串會被自動級連伤提,如
'hello' 'world'
會被自動轉(zhuǎn)為'helloworld'
巫俺。注意,如果輸入print 'hello','world'
肿男,逗號會變?yōu)榭崭窠樾冢Y(jié)果為hello world
。
標(biāo)識符
- 第一個字符為字母或下劃線
- 其他部分可以為字母舶沛、下劃線嘹承、數(shù)字
- 大小寫敏感
對象
- 數(shù)、字符串如庭、函數(shù)都是對象
- 使用變量時不需要聲明或定義數(shù)據(jù)類型
邏輯行與物理行
- 建議每個物理行只寫一句邏輯行
- 盡量避免使用分號
縮進(jìn)
- 同一層次的語句必須有相同的縮進(jìn)
運(yùn)算符與表達(dá)式
控制流
- if: 沒有
switch
叹卷,用if..elif..else
或字典完成同樣工作 - while: 有一個可選的
else
從句 - for..in: 如
for i in range(0,5)
, 可選else
從句 - break 和 continue: 在循環(huán)中使用
函數(shù)
global語句
- global語句聲明變量是全局的,當(dāng)在函數(shù)內(nèi)給賦變量的時候坪它,變化也反映在主塊中骤竹。
默認(rèn)參數(shù)
- 只有形參表末尾的參數(shù)可以有默認(rèn)值。如
def func(a, b=5)
是有效的往毡,def func(a=5, b)
是無效的蒙揣。
關(guān)鍵參數(shù)
- 使用名字(關(guān)鍵字)而不是位置(默認(rèn)從左到右賦值)來給函數(shù)指定實參。如
def func(a,b=2,c=3):
可以這樣調(diào)用func(c=50, a=100)
开瞭。有兩個好處:1. 不必?fù)?dān)心參數(shù)順序懒震。2. 可以只給我們想要的那些參數(shù)賦值
DocStrings
- 文檔字符串的慣例是一個多行字符串,它的首行以大寫字母開始惩阶,句號結(jié)尾挎狸。第二行是空行,從第三行開始是詳細(xì)的描述断楷。
- 可以通過
func.__doc__
(注意雙下劃線)得到函數(shù)的文檔字符串屬性锨匆。
模塊
簡介
- 利用
import
語句輸入sys
模塊 -
sys.argv
包含了命令行參數(shù)的列表
字節(jié)編譯的.pyc文件
- 使輸入模塊更快
- 與平臺無關(guān)
from..import語句
- 應(yīng)避免使用from..import而使用import語句,因為這樣可以使程序更易讀,也可以避免名稱的沖突恐锣。
模塊的name屬性
- 每個Python模塊都有它的
__name__
茅主,如果它是'__main__'
,說明這個模塊被用戶單獨運(yùn)行土榴。
dir()函數(shù)
- 可以使用內(nèi)建的
dir()
來列出模塊定義的標(biāo)識符诀姚,如dir(sys)
。標(biāo)識符有函數(shù)玷禽、類和變量赫段。 - 不給
dir()
傳遞參數(shù),默認(rèn)返回當(dāng)前模塊的屬性列表矢赁。 - 使用
del
語句刪除當(dāng)前模塊中的變量/屬性糯笙。
數(shù)據(jù)結(jié)構(gòu)
列表
- 列表是可變的數(shù)據(jù)類型
- 列表中的項目包括在方括號中,如
shoplist = ['apple', 'mango', 'carrot', 'banana']
- 刪除用
del
,如del shoplist[0]
元組
- 元組和字符串一樣是不可變的
- 元組的項目包括在圓括號中撩银,如
zoo = ('wolf', 'elephant', 'penguin')
字典
- 鍵值對包含在花括號中给涕,如
d = {key1 : value1, key2 : value2 }
-
del
語句刪除鍵/值對,如del dict['key']
序列
- 列表额获、元組和字符串都是序列
-
索引操作符和切片操作符
-
shoplist[0]
抓取第一個項目 -
shoplist[-2]
抓取倒數(shù)第二個項目 -
shoplist[:]
返回整個序列的拷貝 -
shoplist[:-1]
返回除最后一個項目外包含所有項目的序列切片 - 開始位置包含在序列切片中够庙,而結(jié)束位置被排斥在切片外。
-
引用
- 創(chuàng)建一個對象并給它賦一個變量的時候抄邀,這個變量僅僅引用那個對象耘眨,而不是表示這個對象本身!也就是說撤摸,變量名指向你計算機(jī)中存儲那個對象的內(nèi)存毅桃。這被稱作名稱到對象的綁定。
- 要復(fù)制一個列表或者類似的序列或者其他復(fù)雜的對象(不是如整數(shù)那樣的簡單對象)准夷,必須使用切片操作符來取得拷貝。
解決問題
- Windows把反斜杠
\
作為目錄分隔符莺掠,而Python中表示轉(zhuǎn)義符衫嵌。所以Windows下路徑字符串應(yīng)使用'C:\\Documents'
或r'C:\Documents'
。 -
os.sep
變量會根據(jù)操作系統(tǒng)給出目錄分隔符彻秆,即在Linux楔绞、Unix下是'/'
,在Windows下是'\\'
唇兑,在Mac OS下是':'
酒朵。使用os.sep
而非直接使用字符使程序具有移植性。 - 推薦使用
zipfile
和tarfile
創(chuàng)建歸檔扎附。不推薦使用os.system
蔫耽,它容易引發(fā)嚴(yán)重的錯誤。
面向?qū)ο缶幊?/p>
- 假如有一個類MyClass和這個類的實例MyObject留夜。調(diào)用
MyObject.method(arg1, arg2)
時匙铡,會由Python自動轉(zhuǎn)為MyClass.method(MyObject, arg1, arg2)
图甜。 - 方法與函數(shù)的區(qū)別只是一個額外的
self
變量 -
__init__
方法類似于C++、C#和Java中的constructor
,__del__
方法與destructor
的概念類似鳖眼。 - Python中所有的類成員(包括數(shù)據(jù)成員)都是公共的黑毅,所有的方法都是有效的。
只有一個例外:如果數(shù)據(jù)成員名稱以雙下劃線前綴钦讳,比如__privatevar
矿瘦,Python的名稱管理體系會把它作為私有變量。
輸入輸出
- 使file類的read愿卒、readline匪凡、write、close方法
- 讀模式('r')掘猿、寫模式('w')病游、追加模式('a')
- 使用
pickle
或cpickle
模塊的dump
、load
方法實現(xiàn)存取對象
異常
- 使用
try..except
語句來處理異常 - 使用
raise
語句引發(fā)異常稠通,可以引發(fā)的錯誤或異常應(yīng)該分別是一個Error或Exception類的直接或間接導(dǎo)出類衬衬。 - 在無論異常發(fā)生與否的情況下都執(zhí)行特定語句,使用
try..finally
- 在一個
try
塊下同時使用except
從句和finally
塊改橘,需要把一個嵌入另外一個滋尉。
標(biāo)準(zhǔn)庫
sys模塊
- sys.argv
- sys.version、sys.version_info
- sys.stdin飞主、sys.stdout狮惜、sys.stderr
os模塊
- os.name字符串指示正在使用的平臺。比如Windows是
'nt'
碌识,Linux/Unix是'posix'
碾篡。 - os.getcwd()得到當(dāng)前Python腳本工作的目錄路徑。
- os.getenv()和os.putenv()分別用來讀取和設(shè)置環(huán)境變量筏餐。
- os.listdir()返回指定目錄下的所有文件和目錄名开泽。
- os.remove()用來刪除一個文件。
- os.system()用來運(yùn)行shell命令魁瞪。
- os.linesep字符串給出當(dāng)前平臺使用的行終止符穆律。如Windows使用
'\r\n'
,Linux使用'\n'
导俘,而Mac使用'\r'
峦耘。 - os.path.split()函數(shù)返回一個路徑的目錄名和文件名。
- os.path.isfile()和os.path.isdir()分別檢驗給出的路徑是文件還是目錄旅薄。
- os.path.exists()檢驗給出的路徑是否真地存在辅髓。
更多
特殊的方法
- 特殊的方法都被用來模仿某個行為。例如,想要為類使用
x[key]
這樣的索引操作(就像列表和元組一樣)利朵,只需要實現(xiàn)__getitem__()
方法就可以律想。在《Python參考手冊》中可以找到所有的特殊方法。
單語句塊
- 語句塊通過縮進(jìn)層次與其它塊區(qū)分開绍弟。但如果語句塊只包含一條語句技即,可以在條件語句或循環(huán)語句的同一行指明它。但這種寫法不推薦使用樟遣。
if True: print('YES')
列表綜合
- 通過列表綜合而叼,可以從一個已有的列表導(dǎo)出一個新的列表。
#!/usr/bin/python
# Filename: list_comprehension.py
listone = [2, 3, 4]
listtwo = [2*i for i in listone if i > 2]
print listtwo # [6,8]
在函數(shù)中接收元組和列表
- 在args變量前有
*
前綴豹悬,所有多余的函數(shù)參數(shù)都會作為一個元組存儲在args中葵陵。如果使用的是**
前綴,多余的參數(shù)會被認(rèn)為是一個字典的鍵/值對瞻佛。
def powersum(power, *args):
total = 0
for i in args:
total += pow(i, power)
return total
print powersum(3,2,1) # 9
print powersum(3,10) # 1000
lambda語句
- lambda需要一個參數(shù)脱篙,后面僅跟單個表達(dá)式作為函數(shù)體,而表達(dá)式的值被這個新建的函數(shù)返回伤柄。注意绊困,即便是print語句也不能用在lambda形式中,只能使用表達(dá)式适刀。
def make_repeater(n):
return lambda s: s*n
twice = make_repeater(2)
print twice('word') # wordword
print twice(5) # 10
exec語句
- exec用來執(zhí)行儲存在字符串或文件中的語句
exec 'print "Hello World"'
eval語句
- eval用來計算存儲在字符串中的有效表達(dá)式
eval('2*3')
assert語句
- assert用來聲明某個條件是真的秤朗,非真的時候引發(fā)
AssertionError
。
>>> mylist = ['item']
>>> assert len(mylist) >= 1
>>> mylist.pop()
'item'
>>> assert len(mylist) >= 1
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError
repr函數(shù)
- repr函數(shù)用來取得對象的規(guī)范字符串表示笔喉。反引號(也稱轉(zhuǎn)換符)可以完成相同的功能取视。注意,在大多數(shù)時候有
eval(repr(object)) == object
常挚∽魈罚可以通過定義類的__repr__
方法來控制對象在被repr函數(shù)調(diào)用的時候返回的內(nèi)容。
>>> i = []
>>> i.append('item')
>>> `i`
"['item']"
>>> repr(i)
"['item']"