第三章 python 基礎
語句和語法
變量賦值
標識符和關鍵字
基本風格指南
內存管理
第一個python程序
開發工具
語句和語法
分號: 允許你將多個語句寫在同一行上,語句之間用分號隔開
冒號:將代碼的頭和體分開
反斜杠\ : 用于將一行過長的語句分解成多行
Python使用縮進來分隔代碼組(縮進相同的一組語句,多個語句)
縮進四個空格寬度,避免使用Tab
每一個腳本文件都可以當成是一個模塊,模塊可以包含直接運行的代碼塊、類、函數或者這些的組合。
變量賦值
在Python中,對象是通過引用傳遞的。在賦值時,不管這對象是新創建的還是已經存在的,都是將該對象的引用(并不是值)賦值給變量。
- Python的賦值語句不會返回值。
- 鏈式賦值
x = 1
y = x = x + 1
x,y
(2,2)
增量賦值+=,-=,*=等與賦值運算符結合的
Python不支持自增運算
多重賦值
x = y = z = 1
x
1
y
1
z
1
一個值為1的對象被創建,然后將該對象的同一個引用賦值給x,y,z。如果用id(object)將x,y,z的地址打印出來,地址值會是一樣的。
- 多元賦值(可以通過元組實現)
(x,y,z) = (1,2,'a string')
標識符(與C語言類似)
- 關鍵字構成Python語言的標識符(可以用keyword庫中的kwlist屬性把所有的關鍵字列出來)
- build-in標識符
- Python不支持重載標識符,任何時刻都只有一個名字綁定
- buildins可以看作全局變量
- 下劃線的特殊用法
- _xxx 不用'from module import * '導入
- _xxx _ 系統定義的名字
- __xxx 類中的私有變量名
基本風格指南
- 注釋#開始
- 文檔使用obj.doc來獲取,obj為模塊、類、函數的名字
- 縮進 四個空格寬度
- 模塊布局
1、開始行
2、模塊文檔--介紹模塊的功能和全局變量的含義,模塊外使用module.doc來訪問
3、模塊導入
4、變量定義--為全局變量(盡量使用局部變量代替全局變量)
5、類定義--當模塊被導入時class語句會被執行,類也就會被定義,類的文檔變量是class.doc
6、函數定義--可以通過module.function()在外部被訪問到,當模塊被導入時def語句會被執行,函數也就都會定義好,函數的文檔變量是function.doc
7、主程序--main()
例子
#/usr/bin/env python #(1) Startup line(Unix)
"this is a test module" #(2) Module document
import sys #(3) Module imports
import os
debug = True #(4)(Global)Variabledeclarations
class FooClass(object): #(5) Class declarations
'Fooclass'
def test(): #(6) function
declarations
"test function"
foo = FooClass()
if debug:
print 'ran test()'
if __name__ == '__main__': #(7) main body</td>
test()
- 內存管理
由Python解釋器承擔內存管理的任務。 - 引用計數:在Python內部記錄著所有使用中的對象各有多少引用。對象被創建時就創建一個引用計數,當這個對象的引用計數為0是,它就被回收。
- 引用計數的增加(同一個對象):該對象新增一個新的引用
-
對象被創建并將其引用賦值給變量時,引用計數設置為1。
1.賦值給其他變量
2.作為參數傳遞給函數或者方法或類實例
3.成為容器對象的一個元素
4.賦值為窗口對象的成員
- 引用計數的減少--當對象的引用被銷毀時,引用計數會減小。
- 當引用離開其作用范圍時(函數運行結束時),所有局部變量都會被自動兇啊會,對象的引用計數會減少
- 對象被顯式地銷毀 del x
- 對象的別名被賦值另外一個對象 x = 123
- 對象從一個窗口對象中移除
list.remove(x)
- 窗口對象本身被銷毀
del list
任何追蹤或調試程序會給一個對象增加一個額外的引用, 這會推遲該對象被回收的時間。
不再被使用的內存會被一種稱為垃圾收集的機制釋放。解釋器跟蹤對象的引用計數,垃圾收集器負責釋放內存。垃圾收集器尋找引用計數為0的對象,然后釋放內存。
例子
# writeText.py--提示用戶輸入每一行文本,然后寫入到文件中
import os
ls = os.linesep
# get filename
filename = 'd:\\test.txt'
# get file content lines
allText = []
print "\nEnter lines('.'by itself to quit)."
while True:
entry = raw_input('> ')
if entry == '.':
break
else:
allText.append(entry)
# 逐行寫入文件
# write lines to file with proper line-ending
fobj = open(filename,'w')
# (x, ls)表示每一行及其行結束符
fobj.writelines(['%s%s' % (x,ls) for x in allText]) #列表解析
fobj.close()
print 'Done!'
# readText.py--從指定的文件中讀取內容,并顯示
""" readText.py---read and display text file """
filename = "d:\\test.txt"
try:
fobj = open(filename,'r')
except IOError,e:
print "file open error:",e
else:
# display contents to the screen
for eachLine in fobj:
print eachLine
fobj.close()
使用局部變量替換模塊變量。
類似 os.linesep 這樣的名字需要解釋器做兩次查詢:
(1)查找 os 以確認它是一個模塊,
(2)在這個模塊中查找 linesep 變量。
os.path.exists() 和異常處理:
異常處理最適用的場合,是在沒有合適的函數處理異常狀況的時候。