3.1 語句和文法
# 表示注釋
\n 表示換行符
\ 表示繼續上一行
; 将兩個語句連接配接在一行
: 将代碼塊的頭和體分開
語句(代碼塊)用縮進塊的方式展現
不同的縮進深度分隔不同的代碼塊
Python檔案以子產品的形式組織
3.1.1 注釋(#)
顧名思義
3.1.2 繼續(\)
同shell的換行連接配接符
if (a == 1) and \
(b == 2):
print a,b
注:在含有小括号,中括号,花括号,三引号時不使用\也可以多行書寫
3.1.3 多個語句構成代碼組(:):
縮進相同的一組語句構成一個代碼組,我們稱之代碼組
例如: if,while,def,class的符合語句,首行以關鍵字開始,以冒号:結束,改行之後的一行或多行代碼構成代碼組.
我們将首行及後面的代碼組成為一個子句(clause)
3.1.4 代碼組由不同的縮進分隔
使用4個空格作為一個代碼組,避免使用制表符
3.1.5 同一行書寫多個語句;
import sys; x = 'foo'; sys.stdout.write(x + '\n')
不推薦
3.1.6 子產品
每一腳本檔案,一段執行腳本,一段庫檔案代碼都可組成一個子產品
3.2 變量指派
指派運算符 =
注:指派并不是直接将一個值賦給一個變量的
Python語言中,對象是通過引用傳遞的,在指派時,不管這個對象是新建立的,還是一個已經存在的,都是将該對象的引用(并不是值)指派給變量
Python指派語句不會傳回值
>>> x = 1
>>> y = (x = x + 1)
File "<stdin>", line 1
y = (x = x + 1)
^
SyntaxError: invalid syntax
鍊式指派沒問題
>>> y = x = x + 1
>>> x,y
(2, 2)
增量指派
x = x + 1 或 x += 1
>>> m = 12
>>> m %= 7
>>> m
5
>>> m **=2
25
>>> aList = [123,'xyz']
>>> aList += [45.6e7]
>>> aList
[123, 'xyz', 456000000.0]
注:Python不支援類似x++或--x這樣的前置/後置自增/自減運算
多重指派
>>> x = y = z =1
>>> x
1
>>> y
>>> z
"多元"指派
采用這種方式指派時,等号兩邊的對象都是元祖
>>> x,y,z = 1,2,'a string'
2
'a string'
建議這麼寫
>>> (x,y,z) = (1,2,'a string')
C語言交換變量需要用一個臨時變量tmp來儲存其中一個值
例:
tmp=x;
x=y;
y=tmp;
Python的多元指派可以實作無需中間變量即可交換兩個變量的值
>>> x,y =1,2
>>> x,y =y,x
3.3 辨別符
辨別符是電腦語言中允許作為名字的有效字元串集合,有一部分是關鍵字,關鍵字不能作為辨別符,否則會引起文法錯誤(SyntaxError 異常)
3.3.1 合法的Python辨別符
(1) 第一個字元必須是字母或下劃線_
(2) 剩下的字元可以是字母和數字或下劃線
(3) 大小寫敏感
3.3.2 關鍵字
關鍵字清單和iskeyword()函數都放入了keyword子產品一邊查閱
3.3.3 内建
built-in是__builttins__子產品的成員,在程式開始或互動解釋器>>>進入前,已由解釋器自動導入,視為Python的全局變量
3.3.4 專用下劃線辨別符
_xxx 不用'from module import x'導入
__xxx__ 系統定義名稱
__xxx 類中的私有變量名
注:避免使用下劃線作為變量名的開始,因為_xxx被看成是私有的,在子產品或類外不可以使用
3.4 基本風格指南
注釋
確定注釋的準确性
文檔
可以通過__doc__特别變量,動态獲得文檔字串
縮進
推薦四個空格作為一層代碼的縮進,跨平台使用不要使用TAB做縮進
選擇辨別符名稱
言簡意赅
3.4.1 子產品結構和布局
(1)起始行
僅在類Unix環境下才使用起始行,可僅輸入腳本名字來執行腳本,無需直接調用解釋器
(2)子產品文檔
介紹子產品功能及重要全局變量含義,子產品外可通過module.__doc__通路這些内容
(3)子產品導入
導入目前子產品的代碼需要的所有子產品:
(4)變量定義
除非必須,盡量使用局部變量代替全局變量
(5)類定義語句
所有類都需要在這裡定義,當子產品被導入時class語句會被執行,類也就會被定義,類的文檔變量時class.__doc__
(6)函數定義語句
此處定義的函數可以通過module.function()在外部被通路到,當子產品被導入時def語句被執行,函數也就會定義好,函數文檔的變量是function.__doc__
(7)主程式
無論這個子產品是被别的子產品導入還是作為腳本直接執行,都會執行這部分代碼
-------------------------------------
#!/usr/bin/env python #(1)起始行
"this is a test module" #(2)子產品文檔
import sys
import os #(3)子產品導入
debug = True #(4)(全局)變量
class FooClass(object):
"Foo class" #(5)類定義語句
def test():
"test function"
foo = FooClass()
if debug:
print 'ran test()' #(6)函數定義語句
if __name__ == '__main__':
test() #(7)主程式
--------------------------------------
注:
推薦代碼風格:主程式調用main()函數
如果子產品是被導入,__name__的值為子產品名字
如果子產品是被直接執行,__name__的值為'__mail__'
3.4.2 在主程式中書寫測試代碼
3.5 記憶體管理
變量無需事先聲明
變量無需指定類型
程式員不用關心記憶體管理
變量名會被"回收"
del 語句能夠直接釋放資源
3.5.1 變量定義
變量無需聲明,也無需放到代碼塊最開始
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
變量一旦被複制,就可以通過變量名來通路它
>>> x = 4
>>> y = 'this is a string'
4
'this is a string'
3.5.2 動态類型
3.5.3 記憶體配置設定
3.5.4 引用計數
要保持追蹤記憶體中的對象,Python使用了引用計數這一簡單計數,當對象被建立,就建立了一個引用計數,當這個對象不再需要時,這個對象引用變為0,而後被垃圾回收
增加引用計數
當對象被建立并指派給變量,該對象的引用計數就設為1
x = 3.14 # 3.14作為對象被引用+1
y = x # 引用+2
foobar(x) # 作為參數傳遞給函數 引用+3
myList = [123,x,'xyz'] # 作為容器對象的一個元素 引用+4
減少引用計數
當變量被指派給另外一個對象時,原對象的引用計數-1
foo = 'xyz' # 引用+1
bar = foo # 引用+2
foo = 123 # 引用-1
當使用del語句删除一個變量,引用計數-1
del bar # 引用-1
對象被從一個視窗對象中移除,引用計數-1
myList.remove(x)
視窗對象本身被銷毀
del myList
3.5.5 垃圾收集
不再被使用的記憶體會被一種稱為垃圾回收的機制釋放,垃圾回收器作為一塊獨立代碼用來釋放記憶體,不僅用來尋找引用計數為0的對象,還負責引用計數大于0但也應該被銷毀的對象
3.6 第一個Python程式
例3.1
# vi makeTextFile.py
#!/usr/bin/env python
'make TextFile.py -- create text file'
import os
ls = os.linesep
# get filename
while True:
if os.path.exists('fname.txt'):
print "ERROR: '%s' already exists" %fname
else:
break
# get file content (text) lines
all =[]
print "\nEnter lines ('.' by itself to quit)\n"
#loop until user terminates input
entry = raw_input(">")
if entry == '.':
all.append(entry)
#write lines to file with proper line_ending
fobj = open('fname.txt','w')
fobj.writelines(['%s%s' %(x,ls) for x in all])
fobj.close()
print 'DONE!'
例3.2
# vi readTextFile.py
-----------------------------------------
'readTextFile.py -- read and display text file'
fname = raw_input('Enter filename:')
# attempt to open file for reading
try:
fobj = open(fname,'r')
except IOError,e:
print "*** file open error: ", e
else:
# display contents to the screen
for eachLine in fobj:
print eachLine,
fobj.close()
3.6 相關子產品和開發工具
Debugger: pdb
Logger: logging
Profilers: profile,hotshot,cProfile
本文轉自 showerlee 51CTO部落格,原文連結:http://blog.51cto.com/showerlee/1330261,如需轉載請自行聯系原作者