在C++的程式員眼中,指令碼是個奇葩的邏輯。當然也可能我比較奇葩。不過從Lua走過來,python的理解也不那麼難。記錄一下剛學python要注意的東西,也算是個快速入門吧。如果你是從C++過來的,那你來對地方了。
避免運行指令碼閃過可以添加raw_input()。這相當於getline。
在命令列中可以直接鍵入filename.py來運行指令碼。 匯入模組用import moduleName。注意沒有.py。然後使用moduleName.attr即可使用相應的屬性。也可使用from module import attr命令,如此做則可直接使用屬性。第一次匯入模組時會運行指令碼,但第二次匯入不會。用reload可以重寫匯入模組,並運行模組。 互動模式下使用dir(moduleName)可以列出模組中的屬性名稱。
Python內建對象 數字: **表示乘方。 import math匯入數學庫,可使用pi、sqrt等常用方法。
import random 匯入隨機數庫。 使用random.random()產生0-1的隨機數。也可random.choice([1,2,3,4]),在列表中選擇。 random.int(1,10),在1到10中產生隨機數。 字串: 字串是常量,不可更改,只能重新賦值。 len()計算長度。支援下標隨機訪問。 可以用s[-1]的方式表示倒數,其等效於s[len(s)-1]。 拆分字串用分區(slice)機制。 形式為X[I:J]。表示取出X中從I到J的內容,左開右閉。 如果I、J空出來,則分別表示0和len(X)。當然I、J可為負數。
字串串連可以用'+',例如:S = S +'a'。此時S已經建立了一個新對象了。 字串尋找使用find(),返回位移量位置。 字串替換使用replace返回替換後的串。 字串的split使用split函數。分成的結果存入一個列表。 字串有基本操作的一些方法,如:upper、isalpha、rstrip等。 三引號可定義一段複雜文本。這些文字會被轉化為相應的串,包含定位字元等符號。同時也可用作注釋,相當於/***/
協助: dir(變數)的方法可以列出對象的所有屬性和方法。具體方法的解釋可使用help命令。例如:help(S.index)。 模式比對: import re。具體涉及Regex,再查吧。 列表: 列表能夠進行索引,切片等操作,像對字串一樣。例如用[:]、[-1]等。 列表與數組有些類似,但強大的多。列表沒有固定類型的約束,也能按需要增減大小,響應特定操作。有操作如:append、pop、'+'、sort、reverse。 列表解析通過在一個列表中運行一個運算式而建立一個新的列表。它編寫在方括弧中,並且有運算式和迴圈結構。有點像是sql語句。形如: [func(value) for value in list [statment]] 這條語句會將每一個list中的元素賦值給value,檢查statment中條件是否符合,然後運行func(value),將其值建立為新列表中的一個項。例如:[row[1] for row in M if row[1]%2 == 0]。 字典: 表示方法為{key:value,key:value...}。 value可以是任何資料類型比如列表。記憶體是自動管理的,不需要釋放。 字典的輸出並不是有序的,我推測內部實現方法是樹。 固定順序輸出可先將鍵排序,再用for key in Keys: 的方法。或直接用sorted()方法。例如:for key in sorted(D): 。
可以通過.has_key判斷是否有對應的鍵。
元組: 不能更改,其它跟列表相似。
檔案: open(filename,weight)。預設許可權為'r',建立或開啟檔案。write()寫入檔案。read()讀出檔案內容。注意只能讀一次。 python中,按算符的優先順序確定計算順序。表的操作符中越靠後的優先順序越高。當然還是提倡使用括弧。
Floor除法。拋棄小數部分之後的除值,即%的商的部分。
python中長整形任意大。當長度超過int時,會自動轉換為長整形。
支援位操作。八位元以0開頭,16進位以0x開頭。oct(num)、hex(num)、int()可以對數字進行轉換。
指令碼動態對象實現邏輯: 每一個聲明出的變數名並沒有實際的類型,變數名是一個void指標,指向對象。另一方面,對象知道自己的類型,每個對象都包含了一個頭部資訊,標記了這個對象的類型。賦值有三個操作:建立一個對象、建立一個變數、將變數與對象串連。
當變數名指向新對象時,舊對象記憶體就被回收(這要是能不慢都見鬼了)。
變數不能指向變數。只能指向對象。因此當兩個變數之間賦值時,實際意思是要保持一致。他們實際上共用了對象。這樣就不會存在記憶體訪問的問題,代價就是效率低到爆。當原變數更改而不是對象更改時,會產生分歧。因此對於列表L2=L1,當L1中的值改變時,對象變了,變數並沒有變,所以L2的值也會變化,如果你不希望這樣可以簡單的使用分區技術:L2 = L1[:]。如果是字典的話,就要import copy,使用copy.copy()函數了。
使用"=="操作符,測試兩個被引用的對象是否值相同。"is"操作符,檢查對象是否指向同一對象。注意小的數字和字串是在緩衝中被複用的。因此is判斷會為真。
大概就寫這些,以後可能在這裡再增加。有必要也會新寫一篇,歡迎大家關注。
本篇部落格出自阿修羅道,轉載請註明出處:http://blog.csdn.net/fansongy/article/details/8986698