程序由模塊構成
模塊由語句構成
語句由表達式構成
表達式建立并處理對象
語句 | 角色 | 例子 |
賦值 | 創建引用值 | a,b,c=’good’,’bad’,’ugly’ |
調用 | 執行函數 | log.write(“spam,ham/n”) |
打印對象 | print ‘the killer’,joke | |
if/elif/else | 選擇動作 | if ‘python’ in text: print text |
for/else | 序列迭代 | for x in mylist: print x |
while/else | 一般循環 | while x>y: print x |
pass | 空占位符 | while True: pass |
break/continue | 循環跳躍 | while True: if not line:break |
try/except/finally | 捕捉異常 | try: action() except: print ‘action error’ |
raise | 觸發異常 | raise endSearch,location |
import,from | 模塊讀取 | import sys from sys import stdin |
def,return,yield | 創建函數 | def f(a,b,c=1,*d): return a+b+c+d[0] def gen(n) for I in n,yield i*2 |
class | 創建對象 | class subclass(Superclass): staticdata=[] |
global | 命名空間空間 | def function(): global x,y x=’new’ |
del | 刪除引用 | del data[k] |
exec | 執行代碼字符串 | exec “import” +modname exec code in gdict,ldict |
assert | 調試檢查 | assert x>y |
with/as | 環境管理器 | with open(‘data’) as myfile: process(myfile) |
eg:
while True:
reply=raw_input(‘Enter text:’)
if reply==’stop’:
break
try:
num=int(reply)
except:
print ‘Bad!’*8
else:
print int(reply)**2
print ‘Bye!’
解釋:try關鍵字后面跟上我們嘗試運行的代碼塊,再跟except部分,給異常處理
器代碼,再接else部分,如果try部分沒有異常,就執行這一部分代碼,如
有異常發生就執行except部分代碼
(1)賦值語句專門特性:
a、賦值對象建立專門引用值,賦值語句總是建立對象的引用值而不是拷
貝;
b、變量名會在首次賦值時被創建;
c、變量名在引用前必須先賦值;
d、隱式賦值語句:import、from、def、class、for、函數參數
(2)賦值語句的形式:
a、基本形式:spam=’spam’
b、元組及列表分解賦值:當“=”左邊編寫成元組或列表時,python會按照
位置把右邊的對象和左邊的目標從左到有想配對。
c、序列賦值語句:任何變量名的序列都可以賦值給任何值的序列,python會按照位置一次賦值一個元素
d、多重目標賦值:python賦值相同對象的引用值(最右邊的對象)給左邊所有的目標
e、增強賦值語句:例如:s+=2相當于s=s+2
(3)序列賦值:
a、高級序列賦值語句模式:可以在“=”兩側混合和匹配匹配序列類型,但左右兩邊元素的數目必須相等。若要通用,則需要使用分片的方法。
>>>string=’spam’
>>>a,b,c=string[0],string[1],string[2:]
>>>a,b,c=list(string[:2)+[string[2:]]
>>>(a,b),c=string[:2],string[2:]
b、賦值一系列整數給一組變量:
>>>red,green,blue=range(3)
>>>range(3)
[0,1,2]
(4)多目標賦值語句:
a、多目標賦值以及共享引用:
多目標賦值語句中,只有一個對象,由三個變量共享(全都指向內存內統一對象)在此需要注意對象的是否支持在原處的修改
(5)增強賦值語句:
a、增強賦值語句從C借鑒而來:
x+=y | x&=y | x-=y | x|=y |
x*=y | x^=y | x/=y | x>>=y |
x%=y | x<<=y | x**=y | x//=y(floor除法) |
b、增強賦值語句的一些優點:
左側只需計算一次,執行更快;
優化技術選擇,對于支持原處修改的對象而言,增強形式會自動執行原處的修改運算,而不是復制。
c、增強賦值與共享引用:
對列表而言,“+=”隱含了對原處做修改的意思,“+”總是生成新的對象
(6)表達式語句:
a、在python中,可以使用表達式作為語句,但表達式結果不會儲存,只有當表達式工作并作為附加的效果時才有意義。通常有兩種情況下表達式用作語句:調用函數和方 法、在交互模式下打印值
b、表達式語句通常用于執行可于原處修改列表的列表方法:
>>>L=[1,2]
>>>L.append(3) #這是一條表達式語句,返回值為None
>>>L
[1,2,3]
(7)打印語句:
a、重定向輸出流:
print x
等價于:
import sys
sys.stdout.write(str(x)+’/n’)
因為有可能把sys.stdout重新復制給標準輸出流意外的東西,這樣就可以有一種方法讓print語句將文字傳送到其他地方:
>>>import sys
>>>sys.stdout=open(‘log.txt’,’w’)
…
print x,y,z
b、print file 擴展: 重定向輸出流有一個問題:沒有直接的方式可以保存原始的輸出流。在打印到文件后可以切換回來。因為sys.stdout只是一個普通文件對象,一個例子如下:
>>>import sys
>>>temp=sys.stdout
>>>sys.stdout=open(‘log.txt’,’a’)
>>>print ‘spam’
>>>print 1,2,3
>>>sys.stdout.close()
>>>sys.stdout=temp
>>>print open(‘log.txt’).read()
spam
1,2,3
這樣的操作顯得復雜,于是增加了print的擴展功能,當print以>>開始,后面再跟輸出的文件對象或其他對象時,該print語句可以將文字傳給該對象的write方法。
>>>log=open(‘log.txt’,’a’)
>>>print >> log,’x’.’y’,’z’
這種print擴展形式通常把錯誤訊息打印到標準錯誤流sys.stderr,例如:
>>>import sys
>>>sys.stderr.write(‘Bad!’+’/n’)
Bad!
>>>print >>sys.stderr,’Bad!’
Bad!
if <test1>:
<statements1>
elif <test2>:
<statements2>
else:
<statements3>
(1)語句是逐個運行的;
(2)塊和語句的邊界會自動被檢查;
(3)復合語句=首行+“:”+縮進語句;
(4)空白行、空格以及注釋通常會被忽略;
(5)文檔字符串(docstring)會被忽略,但會保存并由工具顯示;
(6)代碼塊分隔符:python以行縮進檢測塊的邊界
(7)語句的分隔符:
a、如果使用語法括號對,語句可以橫跨數行;
b、如果語句以反斜線結尾,可以橫跨數行;
c、三重引號字符串常量可以橫跨數行;
d、分號可以分隔在同一行的多條語句
(8)真值測試:
a、任何非零數字或非空對象都為真;
b、數字零、空白對象、None都被認作是假;
c、比較和相等測試會遞歸地應用在數據結構中;
d、比較和相等測試會返回真或假的操作對象;
e、布爾and和or會返回真或假的操作對象
(9)布爾運算:
and運算:x and y; 若x、y均為真就返回真
or運算:x or y; 若x或y為真就返回真
not運算:not x; 若x為假就返回真
(10)if/else三元表達式:(只有當組成成分及其簡單才用,否則寫完整的if/else表達式)
A=Y if X else Z
等價于:
if X:
A=Y
else:
A=Z
(1)一般格式:
while <test>:
<statements1>
else:
<statements2>
2、break、continue、pass、循環else
(1)break
跳出最近所在的循環(跳過整個循環語句)
continue
跳到最近所在循環的開頭處(來到循環的首行)
pass
什么也不做,只是空占位語句
循環else塊
只有當循環正常離開時才會執行(也就是沒有碰到break語句)
(2)一般的循環格式:
a、加入break和continue語句后,while循環的一般格式為:
while <test1>:
<statements1>
if <test2>:break
if <test3>:continue
else:
<statements2>
break,continue語句可以出現在while(或for)循環主體的任何地方,但通常會進一步嵌在if語句中,根據相應的條件采取相應的操作
b、pass:
pass語句是空占位語句,當語法需要沒有任何實用的語句時,就可以實用這條語句;
c、continue/break語句:
eg:
x=10
while x:
x-=1
if x %2!=0:continue
print x
for循環是一個通用的序列迭代器:可以遍歷任何有序的序列對象內的元素;可用于字符串、列表、元組、其他內置可迭代對象以及通過類所創建的新對象
(1)一般格式:
for <target> in <object>:
<statements1>
else:
<statements2>
for語句也支持一個選用的else塊,如果循環離開時沒有碰到break語句,就會執行(也就是所有元素被訪問完后)
for循環的完整格式:
for <target> in <object>:
<statements1>
if <test1>:continue
if <test2>:break
else:
<statements2>
迭代工具包括有:for循環,列表解析,in成員測試,map內置函數等
(1)文件迭代器:
a、readline()方法可以從一個文件中讀取一行,每調就會前進到下一行,到達文件末尾時返回空字符串
b、next()方法也有類似功能
c、讀取文本文件的最佳方式,利用for循環,例如:
for line in open(‘文件’):
print line.upper
(2)其他內置類型迭代器:
a、列表迭代器:當for循環開始時,會通過它傳遞給iter()內置函數,以便從迭代對象獲取一個迭代器,返回的對象含有需要的next()方法
>>>L=[1,2,3]
>>>I=iter(L)
>>>I.next()
1
b、字典迭代器:會自動返回一個鍵
>>>D={‘a’:1,‘b’:2,’c’:3}
>>>for key in D:
print key,D[key]
…
a 1
b 2
c 3
c、其他迭代環境:(文件‘script1.py’事先已經寫好)
in成員關系測試:
>>>uppers=[line.upper() for line in open(‘script1.py’)]
map()內置函數:
>>>map(str.upper(),open(‘script1.py’))
其他內置函數:
>>>L=[1,2,3,4]
>>>sorted(L)
>>>sum(L)
>>>any([‘spam’,’’,’ni’])
True
>>>all([‘spam’,’’,’ni’])
False
5、編寫循環的技巧: (1)range函數
range函數傳入一個參數時,產生從零算起的整數列表;
range函數傳入兩個參數時,第一個參數視為下邊界;
range函數傳入三個參數時,第三個參數提供步進值;
range函數常用于for循環中;
range函數加上步進參數常用來實現非完備遍歷;
range函數常用于在循環遍歷列表時對其進行修改:
eg:>>>L=[1,2,3,4,5]
>>>for i inrange(len(L)):
L[i]+=1
>>>L
[2,3,4,5,6]
(2)并行遍歷:zip()和map()函數:
zip()函數會取得一個或多個序列作為參數,返回值為元組的列表,將這些序列中的并排元素配成對;
map()函數也可以把序列的元素配對,只是參數長度不同時會為較短的序列用None補齊;
a、利用zip()構造字典:
>>>keys=[‘spam’,‘eggs’,’toast’]
>>>vals=[1,2,3]
>>>zip(keys,vals)
>>>D={}
>>>for (k,v) inzip(keys,vals):
D[k]=v
>>>D
{‘spam’:1,’eggs’:2,’toast’:3}
當然我們也可以跳過for循環,利用dic()函數構造字典:
>>>D1=dic(zip(keys,vals))
(3)產生偏移和元素:enumerate()
enumerate()函數返回一個生程器對象:這種對象支持迭代協議,這個對象有一個next()方法,每次遍歷列表都會返回一個(index,value)的元組
eg:>>>S=’spam’
>>>E=enumerate(S)
>>>E.next()
(0,’s’)
(1)列表解析基礎:從語法上講,列表解析就是對集合中的每一個元素進行某種運算
eg:>>>L=[1,2,3,4]
>>>L=[x+10 for x in L]
>>>L
[11,12,13,14]
(2)列表解析都可以用for循環來完成
形式 | 角色 |
#注釋 | 文件中的文檔 |
dir函數 | 對象中可用屬性列表 |
文檔字符串:_ _doc_ _ | 附加在對象上的文件中的文檔 |
PyDoc:help函數 | 對象的交互幫助 |
PyDoc:HTML報表 | 瀏覽器中的模塊文檔 |
標準手冊 | 正式的語言和庫說明 |
網站資源 | 在線教程和例子 |
出版書籍 | 商業參考書籍 |
python支持可自動附加在對象上的文檔,而且在運行時可以保存查看。從語法上看,這類注釋寫成字符串,放在模塊文件、函數以及類語句的頂端,就在任何可執行代碼 前,python會自動封裝這個字符串,成為文檔字符串,使其成為相應對象的_ _doc_ _屬性。
eg:考慮下面文件docstrings.py
‘’’
Module documentation
Words Go Here
‘’‘
spam=40
def square(x):
‘’’
function documentation
can we have your liver then?
‘’’
return x**2
class employee:
‘class documentation’
pass
print square(4)
print square._ _doc_ _
執行命令:
>>>importdocstrings
16
function documentation
can we have your liverthen?
>>>printdocstrings._ _doc_ _
Module documentation
Words Go Here
>>>print docstrings.employee._ _doc_ _
class documentation
要從模塊中類的方法函數的文檔字符串,可以路徑訪問:module.class. method._ _doc_ _
PyDoc提供GUI接口將報表通過HTML網頁格式來呈現:linux系統下打開GUI的方法如下:
>>>import pydoc
>>>pydoc.gui()
在網站上可以獲得標準庫手冊等資源。
新聞熱點
疑難解答