突然一時興起找了個Python的Tutorial看了一下下,哈哈,感覺非常好,很小巧很討喜的語言,比較有特點。第一印象是很簡單,語法簡潔而又功能強大,準備要嘗試學一下。
下面貼一點學習的筆記:
一、基本知識Python同時即是腳本解釋器,又是一個可以運行命令行的shell。在shell里可以計算任務Python表達式,甚至包括變量賦值,這些變量在shell打開時一直有效,關閉時丟失數據。
函數聲明,以def開始,函數名,參數,冒號后面跟函數體。需要注意的是Python里的格式都以縮進的形式來表達,沒有類C/C++中的大括號。另外函數
不需要指定返回值類型,實際上,如果函數有return語句,它將返回指定類型值,否則返回None(Python的空值)。
Python即是動態語言,它
不需要顯示數據類型聲明,賦值的同時即完成變量聲明。又是強類型語言,一個變量一旦獲得一個數據類型,它實際上就一直是這個類型的了。
Python里的“對象”概念,這里的“對象”不同于以前接觸到的OO里的對象,Python里的對象定義更為廣泛。一個程序塊,一個變量,甚至一個字符串都可以是一個對象。其具體含義還需要根據上下文來判斷。
三種重要的內置數據類型:Dictionary,List,Tuple:Dictionary對應于C++中的map和Java中的hashtable,也就是一個鍵值對集合。
List對應于C++中的vector和java中的ArrayList,一個可以動態自動擴展的數組。
Tuple是一個不可變的list,一旦創建就不能以方式改變它,但是好在Python提供了在Tuple和List之間相互轉換的函數。
需要注意的是List和Tuple是可以存儲混合類型的數組的,并且都可以通過索引取值(包括負的索引值,其表示從逆序取值)
For語句:Python里的for語句不同于C/C++中的for,更類似于C#中的
foreach
循環或者是Java中的
for (int i : IntArray)
。Python的for語句需要配合一個range函數使用,它有三個參數,并返回一個Tupe數組用于表示索引,三個參數是start,stop,step,例如range(0,5,1)則返回[0,1,2,3,4];range(5,0,-1)則返回[5,4,3,2,1]。
字符串格式化:與C中類似%d,%f,%s等等,通過字符串的join函數可以方便的將list的內容合并成字符串。
and/or:and和or負責執行布爾邏輯運算,但是它們不返回布爾值而是返回它們實際進行比較的值之一。非空的對象被認為是真,空對象則被認為是假。
and運算會返回第一個假值,而or運算返回第一個真值,其它部分都不會被計算到。
lambda函數:一種快速定義的單行最小函數,只有一行,類似于內聯的感覺。例如一個例子:
ld = lambda i : i*i
ld(10) # == 100
理論上lambda函數可以有多個參數(包括可選參數)并且隱含的返回單個表達式的值。
兩種導入(import)方法:
Python中有兩種導入模塊的方法: import xx / from xx import yy
它們的差別在于,from xx import
yy這種方式,yy被直接導入到了局部命名空間中(
類似于C++中的using),在以后使用yy的時候不再需要(
不能)加上模塊名稱限定。也就是說,如果使用import方式導入模塊,在使用
它里面的一個變量的時候,你不得不每次都加上前綴xx.來表示使用的是位于xx模塊中的變量,而使用from導入時,則不需要加入前綴。
異常處理:Python中使用
try...except來處理異常,使用
raise來引發異常。并且,一個except后面可以跟一個else塊來表示沒有捕獲預期異常時的行為。一個try塊后面也可以跟一個
finally塊來保證一些代碼總是被執行到,比如打開文件后的關閉操作。
注釋:
Python里使用
#來作為單選注釋開始符,使用三個冒號作為多行注釋"""content""",
需要注意的是后一種形式的注意經常被用來作為函數或者類的"說明",寫在這里的內容可以被其使用者當作參考手冊來使用,Ptyhon里所有對象都具有一個內置的
__doc__屬性,通過它可以查看各個對象的說明,應該養成寫__doc__的習慣。一般其格式為
首行以大寫字母開始,句號結尾。第二行是空行,從第三行開始是詳細的描述。
引號:
Python里有單引號,雙引號和三引號。其中
單引號和雙引號都可以用來表示字符串,例如
print 'string' == "string" 將會打印出True
設置這兩種字符串引號的目的是為了簡化引號的表示,例如如果字符串里含有引號本身就需要
使用\來進行標識,例如:'let\'s go!',“he said:\"get out!\"”。
如果字符串里含有大量這種情況會顯得非常麻煩,可以交替使用單引號和雙引號來避免這種情況。上面的例子可以改為:"let's go!",'he said:"get out!"'。
而三引號就是用來表示一個多行字符串。它們經常被用來定義
文檔字符串,它的首行以大寫字母開始,句號結尾。第二行是空行,從第三行開始是詳細的描述。建議從一開始就遵守這個慣例。
二、面向對象
類的定義:以class開頭,pass表示結束(實際上沒有特定的u),例如一個簡單的類定義為
class Person:
??? pass
如果要表示繼承關系只需要將基類用括號回到類名后面即可,Python支持多重繼續,每個基類中間以逗號隔開。
class Student(Person):
? pass
這里的pass語句僅表示占位之用,沒有特別的含義。
類成員定義:__init__方法,這個函數的功能很類似于Java或者C++中的構造函數,但是仍存在一點細小的差別,__init__函數的第一個參數一定是self,類似于C++中的this指針。
__init__方法的定義并
不是必須的,但是一旦你定義了它,就
必須顯示的調用父類的__init__方法。
需要注意的是,所有的類成員方法都必須定義一個
參數(self),
但它的名字不是一定的,其作用類似于C++中的
this指針。
__del__方法,類似于析構函數,在使用del語句的時候被調用。
重載:Python的類
沒有任何形式的函數重載,即一個方法名稱只能對應一個方法,如果子類中定義的與基類中同名的方法,則會將其覆蓋掉。
成員屬性:Python中有兩種類型的成員方法:
普通類方法和專用類方法。
成員也有兩種訪問級別:
公開的和私有的。
其中公開和私有成員的表示沒有特別的關鍵字,只是體現的方法名稱上,私有成員的名稱以兩個短小的下劃線作為開始例如:
class A:
? __privatevalue
? publicvalue
? def __set(self, v):
??? __privatevalue = v
? def get(self):
??? return publicvalue
? pass
并且,一個成員是屬于類的還是屬于對象的,是通過定義這個變量的域來確定的,定義在類體內的變量由所有成員共享,通過self定義的變量則為成員變量。
此外,類的成員方法還分為:
普通類方法和專用類方法。普通方法的定義與普通函數定義類似,它是公開的,在類外部可以被調用。而類的
專用方法,沒有特殊的關鍵字來表示,只是在方法的名稱前后各加上兩個短的下劃線,例如def __getitem__。這種專用方法是由用戶顯式調用的,它有點
操作符重載的意思在里面,但是功能比操作符重載要強大一些。Python允許我們自己定義需要的類專用方法,例如任何定義了__cmp__方法的類就可以用==進行比較,任何定義了__len__方法的類就可以用len(instance)進行取長度。
三、標準庫
1.文件操作
Python中有一個內置函數open可以用來打開文件
file = open("pictures/dog.bmp","rb")
open函數可以接受三個參數:
文件名,模式和緩沖區參數,但是只有每一個參數是必須的,文件會默認以文本方式打開。
文件的讀取和C中類似,tell()返回當前文件位置,seek來移動文件操作的位置。具體的函數使用方法可以使用print seek.__doc__來查看
處理I/O錯誤:
try:
? file = open(filename, "rb", 0)
? try:
??? file.seek(-128,2)
??? data = file.read(128)
??? file.seek(0,2)
??? file.write("succeeded")
??? finally:
????? file.close()
? expect IOError:
??? pass
Python提供了一個os.path模塊來進行目錄操作,具體使用方法就不詳細寫出來了,用過幾次就記住了。
2.序列化標準庫里有兩個模塊都提供這個功能,
pickle和
cPickle,用于將對象存儲到文件中而后再讀取出來。
但是后者是使用C語言寫的,速度要比前面的快很多,但是功能都是一樣的。
使用也很簡便主要就是使用dump和load函數
------------------待續----------------