#coding=gbk</p><p>################Part 1: 文法和語句##################<br />#Python 語句中有一些基本規則和特殊字元:<br />#井號(#)表示之後的字元為 Python 注釋<br />#換行 (\n) 是標準的行分隔字元(通常一個語句一行)<br />#反斜線 ( \ ) 繼續上一行<br />#分號 ( ; )將兩個語句串連在一行中<br />#冒號 ( : ) 將代碼塊的頭和體分開<br />#語句(代碼塊)用縮排塊的方式體現<br />#不同的縮排深度分隔不同的代碼塊<br />#Python 檔案以模組的形式組織</p><p>#Python 語句,一般使用換行分隔,也就是說一行一個語句。一行過長的語句可以使用反斜線( \ ) 分解成幾行<br />#if(10>1)and\<br />#(10>5):<br /># print('this is true!')<br />#-->this is true!</p><p>#注意:有兩種例外情況一個語句不使用反斜線也可以跨行。在使用閉合操作符時,單一語句可以跨多行,<br />#例如:在含有小括弧、中括弧、花括弧時可以多行書寫。另外就是三引號包括下的字串也可以跨行書寫</p><p>#print('''the import thing in life is to have a great<br />#aim and the determination to attaion it!''')<br />#-->the import thing in life is to have a great<br />#aim and the determination to attaion it!</p><p>#myStr='''the import thing in life is to have a great<br />#aim and the determination to attaion it!'''<br />#print(myStr)<br />#-->the import thing in life is to have a great<br />#aim and the determination to attaion it!</p><p>#多個語句構成程式碼群組(:):<br />#縮排相同的一組語句構成一個代碼塊,我們稱之程式碼群組。像if、while、def 和class 這樣<br />#的複合陳述式,首行以關鍵字開始,以冒號( : )結束,該行之後的一行或多行代碼構成程式碼群組。<br />#我們將首行及後面的程式碼群組稱為一個子句(clause)。</p><p>#程式碼群組由不同的縮排分隔<br />#Python 使用縮排來分隔程式碼群組。代碼的層次關係是通過同樣深度的空格或定位字元縮排體現的。<br />#同一程式碼群組的程式碼必須嚴格靠左對齊(左邊有同樣多的空格或同樣多的定位字元),<br />#如果不嚴格遵守這個規則,同一組的代碼就可能被當成另一個組,甚至會導致語法錯誤。</p><p>#核心風格:縮排四個空格寬度,避免使用定位字元<br />#避免使用定位字元是因為不同的文字編輯器中定位字元代表的空白寬度不一,如果你的代碼要跨平台應用,或者會被不同的編輯器讀寫,建議不要使用定位字元</p><p>#同一行書寫多個語句(;)<br />#分號( ; )允許你將多個語句寫在同一行上,語句之間用分號隔開,而這些語句也不能在這行開始一個新的代碼塊。<br />#同一行上書寫多個語句會大大降低代碼的可讀性,Python 雖然允許但不提倡這麼做。</p><p>#模組<br />#每一個Python 指令檔都可以被當成是一個模組。模組以磁碟檔案的形式存在。當一個模<br />#塊變得過大,並且驅動了太多功能的話,就應該考慮拆一些代碼出來另外建一個模組。模組裡<br />#的代碼可以是一段直接執行的指令碼,也可以是一堆類似庫函數的代碼,從而可以被別的模組導<br />#入(import)調用。模組可以包含直接啟動並執行代碼塊、類定義、函數定義或這幾者的組合。</p><p>################Part 2: 變數賦值 ##################</p><p>#賦值並不是直接將一個值賦給一個變數,在Python 語言中,對象是通過引用傳遞的。在賦值時,不管這個對象是新建立的,還是一個已經存在的,都是將該對象的引用(並不是值)賦值給變數。</p><p>#從Python 2.0 開始, 等號可以和一個算術運算子組合在一起, 將計算結果重新賦值給左邊的變數,這被稱為增量賦值。<br />#x=x+1<br />#-->x+=1</p><p>#+= -= *= /= %= **= <<= >>= &= ^= |=<br />#Python 不支援類似 x++ 或 --x 這樣的前置/後置自增/自減運算。</p><p>#多重賦值<br />#x=y=z=1<br />#print(x,y,z)<br />#-->1 1 1<br />#一個值為1 的整數對象被建立,該對象的同一個引用被賦值給 x、y 和z</p><p>#“多元”賦值<br />#x,y,z=1,2,'Dave come from anqing!'<br />#print(x,y,z)<br />#-->1 2 Dave come from anqing!</p><p>#交換2個變數的值<br />#x,y=1,2<br />#print('first:',x,y)<br />#x,y=y,x<br />#print('second:',x,y)<br />#--><br />#first: 1 2<br />#second: 2 1</p><p>################Part 3: 標識符 ##################<br />#標識符是電腦語言中允許作為名字的有效字串集合。其中,有一部分是關鍵字,構成語<br />#言的標識符。這樣的標識符是不能做它用的標識符的,否則會引起語法錯誤(SyntaxError 異常)。</p><p>#Python 還有稱為built-in 標識符集合,雖然它們不是保留字,但是不推薦使用這些特別的名字.</p><p>#合法的Python 標識符<br />#Python 標識符字串規則和其他大部分用C 編寫的進階語言相似:<br /># 第一個字元必須是字母或底線(_)<br /># 剩下的字元可以是字母和數字或底線<br /># 大小寫敏感<br />#標識符不能以數字開頭;除了底線,其他的符號都不允許使用.</p><p>#內建<br />#Python 還有可以在任何一級代碼使用的“內建”的名字集合,這些名字可以由解譯器設定或使用。雖然built-in 不是關鍵字,但是應該把它當作“系統保留字”,<br />#不做他用。然而,有些情況要求覆蓋(也就是:重定義,替換)它們。Python 不支援重載標識符,所以任何時刻都只有一個名字綁定。<br />#built-in 是__builtins__模組的成員,在程式開始或在互動解譯器中給出>>>提示之前,由解譯器自動匯入的。<br />#把它們看成適用在任何一級Python 代碼的全域變數。</p><p>#專用底線標識符<br />#Python 用底線作為變數首碼和尾碼指定特殊變數。Python 中底線的特殊用法總結:<br /># _xxx 不用'from module import *'匯入<br /># __xxx__系統定義名字<br /># __xxx 類中的私人變數名</p><p>#核心風格:避免用底線作為變數名的開始<br />#因為底線對解譯器有特殊的意義,而且是內建標識符所使用的符號,我們建議程式員避<br />#免用底線作為變數名的開始。一般來講,變數名_xxx 被看作是“私人的”,在模組或類外不<br />#可以使用。當變數是私人的時候,用_xxx 來表示變數是很好的習慣。因為變數名__xxx__對<br />#Python 來說有特殊含義,對於普通的變數應當避免這種命名風格。</p><p>#文檔<br />#Python 還提供了一個機制,可以通過__doc__特別變數,動態獲得文檔字串。在模組,類<br />#聲明,或函式宣告中第一個沒有賦值的字串可以用屬性obj.__doc__來進行訪問,其中obj<br />#是一個模組,類,或函數的名字。這在運行時刻也可以運行。</p><p>#模組結構和布局<br />#用模組來合理組織你的Python 代碼是簡單又自然的方法。你應該建立一種統一且容易閱讀<br />#的結構,並將它應用到每一個檔案中去。下面就是一種非常合理的布局:<br /># (1) 起始行(Unix)<br /># (2) 模組文檔<br /># (3) 模組匯入<br /># (4) 變數定義<br /># (5) 類定義<br /># (6) 函數定義<br /># (7) 主程式</p><p>#(1) 起始行<br />#通常只有在類Unix 環境下才使用起始行,有起始行就能夠僅輸入指令碼名字來執行指令碼,無需直接調用解譯器。<br />#(2)模組文檔<br />#簡要介紹模組的功能及重要全域變數的含義,模組外可通過 module.__doc__ 訪問這些內容。<br />#(3)模組匯入<br />#匯入當前模組的代碼需要的所有模組;每個模組僅匯入一次(當前模組被載入時);函數<br />#內部的模組匯入代碼不會被執行, 除非該函數正在執行。<br />#(4)變數定義<br />#這裡定義的變數為全域變數,本模組中的所有函數都可直接使用。從好的編程風格角度說,<br />#除非必須,否則就要盡量使用局部變數代替全域變數,如果堅持這樣做,你的代碼就不但容易<br />#維護,而且還可以提高效能並節省記憶體。<br />#(5)類定義語句<br />#所有的類都需要在這裡定義。當模組被匯入時class 語句會被執行, 類也就會被定義。類的文檔變數是class.__doc__。<br />#(6)函數定義語句<br />#此處定義的函數可以通過module.function()在外部被訪問到,當模組被匯入時 def 語句<br />#會被執行, 函數也就都會定義好,函數的文檔變數是function.__doc__。<br />#(7) 主程式<br />#無論這個模組是被別的模組匯入還是作為指令碼直接執行,都會執行這部分代碼。通常這裡不會有太多功能性代碼,而是根據執行的模式調用不同的函數。</p><p>#推薦代碼風格:主程式調用main()函數<br />#if __name__==main():<br /># dave()<br />#<br />#檢查 __name__ 變數的值然後再執行相應的調用。主程式中的代碼通常包括變數賦值, 類定義和函數定義,<br />#隨後檢查__name__來決定是否調用另一個函數(通常調用main()函數)來完成該模組的功能。主程式通常都是做這些事。<br />#不管用什麼名字,強調一點那就是:這兒是放置測試代碼的好地方。</p><p>#很多項目都是一個主程式,由它匯入所有需要的模組。所以請記住,絕大部分的模組建立<br />#的目的是為了被別人調用而不是作為獨立執行的指令碼。我們也很可能建立一個Python 庫風格的<br />#模組,這種模組的建立目的就是為了被其他模組調用。總之,只有一個模組,也就是包含主程<br />#序的模組會被直接執行,或由使用者通過命令列執行,或作為批處理執行, 或由Unix cron 任務<br />#定時執行,或通過Web 服務器調用,或通過GUI 執行。</p><p>#注意:所有的模組都有能力來執行代碼。最進階別的Python 語句--也就是說, 那些沒有縮排的程式碼在模組被匯入時就會執行, 不管是不是真的需要執行。<br />#由於有這樣一個“特性”,比較安全的寫代碼的方式就是除了那些真正需要執行的代碼以外, 幾乎所有的功能代碼都在函數當中。再說一遍, 通常只有主程式模組中有大量的頂級可執行代碼,<br />#所有其它被匯入的模組只應該有很少的頂級執行代碼,所有的功能代碼都應該封裝在函數或類當中。</p><p>#核心筆記:__name__ 指示模組應如何被載入<br />#由於主程式碼無論模組是被匯入還是被直接執行都會運行, 我們必須知道模組如何決定運行方向。<br />#一個應用程式可能需要匯入另一個應用程式的一個模組,以便重用一些有用的代碼。這種情況下,你只想訪問那些位於其<br />#它應用程式中的代碼,而不是想運行那個應用程式。<br />#因此一個問題出現了,“Python 是否有一種方法能在運行時檢測該模組是被匯入還是被直接執行呢?” 答案: __name__ 系統變數。<br />#<br />#如果模組是被匯入, __name__ 的值為模組名字<br />#如果模組是被直接執行, __name__ 的值為 '__main__'</p><p>################Part 4: 記憶體管理 ##################</p><p>#變數定義<br />#大多數編譯型語言,變數在使用前必須先聲明,其中的 C 語言更加苛刻:變數聲明必須位於代碼塊最開始,且在任何其他語句之前。<br />#在Python 中,無需此類顯式變數聲明語句,變數在第一次被賦值時自動聲明。和其他大多數語言一樣,變數只有被建立和賦值後才能被使用。</p><p>#動態類型<br />#Python 中不但變數名無需事先聲明,而且也無需型別宣告。Python 語言中,對象的類型和記憶體佔用都是運行時確定的。<br />#儘管代碼被編譯成位元組碼,Python 仍然是一種解釋型語言。在建立--也就是賦值時,解譯器會根據文法和右側的運算元來決定新對象的類型。<br />#在對象建立後,一個該對象的應用會被賦值給左側的變數。</p><p>#記憶體配置<br />#作為一個負責任的程式員,我們知道在為變數分配記憶體時,是在借用系統資源,在用完之後, 應該釋放借用的系統資源。<br />#Python 解譯器承擔了記憶體管理的複雜任務, 這大大簡化了應用程式的編寫。你只需要關心你要解決的問題,至於底層的事情放心交給Python 解譯器去做就行了。</p><p>#引用計數<br />#要保持追蹤記憶體中的對象, Python 使用了引用計數這一簡單技術。也就是說Python 內部<br />#記錄著所有使用中的對象各有多少引用。一個內部跟蹤變數,稱為一個引用計數器。至於每個對象各有多少個引用, 簡稱引用計數。<br />#當對象被建立時, 就建立了一個引用計數, 當這個對象不再需要時, 也就是說, 這個對象的<br />#引用計數變為0 時, 它被記憶體回收。(嚴格來說這不是100%正確,不過現階段你可以就這麼認為)</p><p>#增加引用計數<br />#當對象被建立並(將其引用)賦值給變數時,該對象的引用計數就被設定為1。<br />#x = 3.14<br />#y = x<br />#語句 x=3.14 建立了一個浮點數對象並將其引用賦值給 x。 x 是第一個引用, 因此,該<br />#對象的引用計數被設定為1。語句 y=x 建立了一個指向同一對象的別名 y(參閱圖3-2)。事<br />#實上並沒有為Y 建立一個新對象, 而是該對象的引用計數增加了1 次(變成了2)。這是對象<br />#引用計數增加的方式之一。還有一些其它的方式也能增加對象的引用計數, 比如該對象作為參<br />#數被函數調用或這個對象被加入到某個容器物件當中時。</p><p>#總之,對象的引用計數在<br />#對象被建立<br />#x = 3.14<br />#或另外的別名被建立<br />#y = x<br />#或被作為參數傳遞給函數(新的本地引用)<br />#foobar(x)<br />#或成為容器物件的一個元素<br />#myList = [123, x, 'xyz']</p><p>#減少引用計數<br />#當對象的引用被銷毀時,引用計數會減小。最明顯的例子就是當引用離開其作用範圍時,<br />#這種情況最經常出現在函數運行結束時,所有局部變數都被自動銷毀,對象的引用計數也就隨<br />#之減少。當變數被賦值給另外一個對象時,原對象的引用計數也會自動減1:</p><p>#foo = 'xyz'<br />#bar = foo<br />#foo = 123<br />#當字串對象"xyz"被建立並賦值給foo 時, 它的引用計數是1. 當增加了一個別名 bar時, 引用計數變成了2.<br />#不過當foo 被重新賦值給整數對象123 時, xyz 對象的引用計數自動減1,又重新變成了1.</p><p>#其它造成對象的引用計數減少的方式包括使用 del 語句刪除一個變數(參閱下一節), 或<br />#者當一個對象被移出一個視窗對象時(或該容器物件本身的引用計數變成了0 時)。<br />#總結一下,一個對象的引用計數在以下情況會減少:</p><p>#一個本地引用離開了其作用範圍。比如 foobar()(參見上一下例子)函數結束時。<br />#對象的別名被顯式的銷毀。<br />#del y # or del x<br />#對象的一個別名被賦值給其它的對象<br />#x = 123<br />#對象被從一個視窗對象中移除<br />#myList.remove(x)<br />#視窗對象本身被銷毀<br />#del myList # or goes out-of-scope</p><p>#del 語句<br />#Del 語句會刪除對象的一個引用,它的文法是:<br />#del obj1[, obj2[,... objN]]<br />#例如,在上例中執行del y 會產生兩個結果:<br /># 從現在的名字空間中刪除 y<br /># x 的引用計數減一<br />#引申一步, 執行 del x 會刪除該對象的最後一個引用, 也就是該對象的引用計數會減為<br />#0, 這會導致該對象從此“無法訪問”或“無法抵達”。 從此刻起, 該對象就成為記憶體回收<br />#機制的回收對象。 注意任何追蹤或偵錯工具會給一個對象增加一個額外的引用, 這會延遲該<br />#對象被回收的時間。</p><p>#垃圾收集<br />#不再被使用的記憶體會被一種稱為垃圾收集的機制釋放。象上面說的, 雖然解譯器跟蹤對象<br />#的引用計數, 但垃圾收集器負責釋放記憶體。垃圾收集器是一塊獨立代碼, 它用來尋找引用計<br />#數為0 的對象。它也負責檢查那些雖然引用計數大於0 但也應該被銷毀的對象。 特定情形會導<br />#致循環參考。<br />#一個循環參考發生在當你有至少兩個對象互相引用時, 也就是說所有的引用都消失時, 這<br />#些引用仍然存在, 這說明只靠引用計數是不夠的。Python 的垃圾收集器實際上是一個引用計<br />#數器和一個迴圈垃圾收集器。 當一個對象的引用計數變為0,解譯器會暫停,釋放掉這個對象<br />#和僅有這個對象可訪問(可到達)的其它對象。作為引用計數的補充, 垃圾收集器也會留心被<br />#分配的總量很大(及未通過引用計數銷毀的那些)的對象。 在這種情況下, 解譯器會暫停下<br />#來, 試圖清理所有未引用的迴圈。</p><p>#核心技巧:使用局部變數替換模組變數<br />#如:<br />#import os<br />#ls = os.linesep<br />#<br />#類似 os.linesep 這樣的名字需要解譯器做兩次查詢:<br />#(1)尋找os 以確認它是一個模組,<br />#(2)在這個模組中尋找 linesep 變數。<br />#因為模組也是全域變數, 我們多消耗了系統資源。如果你在一個函數中類似這樣頻繁使用一個屬性,<br />#建議你為該屬性取一個本地變數別名。 變數尋找速度將會快很多--在尋找全域變數之前, 總是先尋找本地變數。<br />#這也是一個讓你的程式跑的更快的技巧: 將經常用到的模組屬性替換為一個本地引用。代碼跑得更快,而也不用<br />#老是敲那麼長的變數名了。<br />
-------------------------------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
Weibo: http://weibo.com/tianlesoftware
Email: dvd.dba@gmail.com
DBA1 群:62697716(滿); DBA2 群:62697977(滿) DBA3 群:62697850(滿)
DBA 超級群:63306533(滿); DBA4 群: 83829929(滿) DBA5群: 142216823(滿)
DBA6 群:158654907(滿) 聊天 群:40132017(滿) 聊天2群:69087192(滿)
--加群需要在備忘說明Oracle資料表空間和資料檔案的關係,否則拒絕申請