python基本語法和編程風格

這篇博客簡單記錄一下python的基本語法和編程風格, 以及變量所佔的內存是何如分配和回收的。

1 語法和語句

1.1 註釋

‘#’符號在python裏面代表註釋符,python編譯器會自動忽略註釋符後面的語句,值得注意的是,#可以在一行的任何地方開始,而不用擔心python語句的縮進問題。

1.2 繼續 \

python語句,使用\來將一行代碼分解爲多行,比如:

>>> print "i love this \
... world"

運行結果爲:

i love this world

如果第二行縮進的話,如:

>>> print "i love this \
...             world"

則運行結果就會變成

i love this         world

也就是說,縮進的部分被解釋爲空格了。

1.3 同一行輸入多個語句 ;

用;可以讓多行代碼寫在同一行上,如

a = 1; print a

但是建議不要這麼寫,會降低代碼可讀性。

2變量賦值

在python中,變量賦值不是直接把值賦給變量,而是把該對象的引用賦值給變量。

多元賦值:

>>> x, y = 22, 33
>>> x
22
>>> y
33

因此,我們可以利用python的多元賦值,不用中間變量就可以把兩個變量的值進行交換

>>> x, y = y, x

3 標識符

3.1 關鍵字

關鍵字列表和 iskeyword()函數都放入了 keyword模塊以便查閱。

3.2 專用下劃線標識符

_XXX 不用’from module import *’導入
XXX 系統定義名字
__XXX 類中的私有變量名

因此,儘量避免用下劃線開頭定義變量名字,當變量是私有的時候,可以使用下劃線開頭定義變量。

4 基本風格指南

4.1 縮進

儘量使用4個空格來縮進,製表符在不同的文本編輯器對它的解釋是不用的,所以推薦不要使用製表符。
Guido van Rossum 在多年前寫下 Python 代碼風格指南。目前它已經被至少三個 PEP 代替:7(C 代碼風格指南)、8(Python 代碼風格指南)和 257(文檔字符串規範)。這些 PEP 被歸檔、維護並定期更新。

4.2 模塊結構和佈局

python文件模塊應該使用一種統一的佈局方式,便於閱讀,比如這種:
(1) 起始行(Unix)
(2) 模塊文檔
(3) 模塊導入
(4) 變量定義
(5) 類定義
(6) 函數定義
(7) 主程序
這個順序,直接上圖就能比較清楚的解釋了:
這裏寫圖片描述

通常,python所有語句都有能力執行代碼,而不是像其它的編程語言,只有main函數纔可以。所以一個比較安全的做法,就是把所有可以執行的函數都寫在main函數裏,而main函數外,儘量不寫能夠執行的代碼。

由於主程序代碼無論模塊是被導入還是被直接執行都會運行, 我們必須知道模塊如何決定運行方向。一個應用程序可能需要導入另一個應用程序的一個模塊,以便重用一些有用的代碼(否則就只能用拷貝粘貼那種非面向對象的愚蠢手段)。這種情況下,你只想訪問那些位於其
它應用程序中的代碼,而不是想運行那個應用程序。因此一個問題出現了,“Python 是否有一種方法能在運行時檢測該模塊是被導入還是被直接執行呢?” 答案就是……(鼓聲雷動)…..沒錯! name 系統變量就是正確答案。

如果模塊是被導入, name 的值爲模塊名字
如果模塊是被直接執行, name 的值爲 ‘main

5 內存管理

5.1 引用計數

要保持追蹤內存中的對象,python使用了引用計數這一簡單的技術,也就是說,每個對象都有一個引用計數器,用來記錄每個對象有多少引用,當對象的引用計數器爲0時,該對象就會被銷燬。和別的語言不用,python在賦值的時候,是把引用賦值給對象,而不是值本身。比如說, x = 1, python會創建1這個對象,然後把1這個對象的引用賦值給x,當執行 y = 1 時,會再把 1這個對象的引用賦值給y,這個時候,1的引用計數器就變成2了。如果我們不執行 y =1,而是 y = x,會發生同樣的事情。

總之,對象的引用計數在:

對象被創建
x = 3.14
或另外的別名被創建
y = x
或被作爲參數傳遞給函數(新的本地引用)
foobar(x)
或成爲容器對象的一個元素
myList = [123, x, ‘xyz’]

del語句:
既然引用計數可以增加,那麼也肯定可以減少,比如使用del語句。由於 x, y 都指向 1,del x 之後,1的引用計數就會減1,因爲只有y指向1了。
另外還有很多情況,1的引用計數會減少,比如:
一個本地引用離開了其作用範圍。比如 foobar()(參見上一下例子)函數結束時。
對象的別名被顯式的銷燬。
del y

對象的一個別名被賦值給其它的對象
x = 123
對象被從一個窗口對象中移除
myList.remove(x)
窗口對象本身被銷燬
del myList

5.2 垃圾收集

不再被使用的內存會被垃圾收集的機制銷燬,也就是說,引用計數爲0的對象會被銷燬,但實際情況也不一定都是這樣,比如下面的例子:

>>> a = [1]
>>> b = [2]
>>> a.append(b)
>>> b.append(a)
>>> a
[1, [2, [...]]]
>>> b
[2, [1, [...]]]

在這個例子裏,a在引用b,b又在引用a,雙方都在引用對方,所以它們兩個永遠不可能引用計數爲0。因此,如果只按照引用計數來銷燬變量的畫,a和b永遠都不會被銷燬。這個時候,python的循環垃圾收集器就派上用場了。因此,python的垃圾收集實際上就是一個引用計數器和一個循環垃圾收集器。

參考資料:Python核心編程(中文第二版)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章