23、類(lèi)屬性
1)類(lèi)屬性是一個(gè)類(lèi)的屬性,在創(chuàng)建任何類(lèi)實(shí)例之前就有效了。類(lèi)屬性既可以通過(guò)直接對(duì)類(lèi)的引用,也可以通過(guò)對(duì)類(lèi)的任意實(shí)例的引用來(lái)使用。
2)類(lèi)屬性可以作為類(lèi)級(jí)別的常量來(lái)使用,但是它們不是真正的常量,可以修改它們。
3)__class__ 是每個(gè)類(lèi)實(shí)例的一個(gè)內(nèi)置屬性(也是每個(gè)類(lèi)的),它是一個(gè)類(lèi)的引用,而 self 是一個(gè)類(lèi)的實(shí)例
24、私有
1)python有私有函數(shù)、私有類(lèi)方法和私有屬性,它們不能被從模塊外(或類(lèi)外)調(diào)用。
2)如果一個(gè)Python函數(shù)的名字,類(lèi)方法,或?qū)傩砸詢蓚€(gè)下劃線開(kāi)始(但不是結(jié)束),它是私有的;其它所有的都是公有的。
3)Python沒(méi)有類(lèi)方法保護(hù)的概念(只能用于它們自已的類(lèi)和子父中)。類(lèi)方法要不私有(只能在它們自已的類(lèi)中使用)要不公有(任何地方都可使用)。
25、異常
1)一個(gè) try...except ,try后面的塊是要監(jiān)聽(tīng)的塊,有異常時(shí)執(zhí)行except后的塊。還可以有一條 else 子句,就象 if 語(yǔ)句。如果在 try 塊中沒(méi)有異常引發(fā),然后 else 子句被執(zhí)行。
2)一個(gè)try ... finally,finally后的塊總被執(zhí)行。
26、文件對(duì)象
1)Python有一個(gè)內(nèi)置函數(shù)open,用來(lái)打開(kāi)在磁盤(pán)上的文件。open 返回一個(gè)文件對(duì)象,它擁有一些方法和屬性,可以得到打開(kāi)文件的信息,和對(duì)打開(kāi)文件進(jìn)行操作。
2)open 方法可以接收三個(gè)參數(shù):文件名,模式,和緩沖區(qū)參數(shù)。只有第一個(gè)參數(shù),文件名,是必須的;其它兩個(gè)是可選的。如果沒(méi)有指定,文件以文本方式打開(kāi)。
3)文件對(duì)象的mode屬性,標(biāo)明文件屬性以何種方式被打開(kāi)
4)文件對(duì)象的 name 屬性標(biāo)明文件對(duì)象所打開(kāi)的文件名。
5)文件對(duì)象的 tell 方法指明在打開(kāi)文件中的當(dāng)前位置
6)文件對(duì)象的 seek 方法在打開(kāi)文件中移動(dòng)到另一個(gè)位置。第二個(gè)參數(shù)指出第一個(gè)參數(shù)是什么意思:0 表示移動(dòng)到一個(gè)絕對(duì)位置(從文件開(kāi)始算起),1 表示移到一個(gè)相對(duì)位置(從當(dāng)前位置算起),還有 2 表示對(duì)于文件尾的一個(gè)相對(duì)位置。
7)read 方法從打開(kāi)文件中讀取指定個(gè)數(shù)的字節(jié),并且返回含有讀取數(shù)據(jù)的字符串。可選參數(shù)指定了讀取的最大字節(jié)數(shù)。如果沒(méi)有指定參數(shù),read 將讀到文件末尾。
8)文件對(duì)象的 closed 屬性表示對(duì)象是否打開(kāi)或關(guān)閉了文件
9)調(diào)用文件對(duì)象的 close 方法來(lái)關(guān)閉一個(gè)文件,以釋放掉你加在文件上的鎖(如果有的話),刷新被緩沖的系統(tǒng)確實(shí)還未寫(xiě)入的輸出(如果有的話),并且翻放系統(tǒng)資源。closed 屬性證實(shí)了文件被關(guān)閉了。
10)當(dāng)文件被關(guān)閉后,文件對(duì)象所對(duì)應(yīng)的變量仍然存在,直到超出作用域,或被刪除,此時(shí)所有的對(duì)文件的操作(close除外)都會(huì)拋出異常,close只是靜靜地失敗。
27、python有for循環(huán)
28、賦值
1)使用一個(gè)序列或列表一次給多個(gè)變量賦值,如下例
>>> v = ('a', 'b', 'e')
>>> (x, y, z) = v
>>> (x, y, z) = range(3)
2)內(nèi)置函數(shù)range接受一個(gè)表示上限的參數(shù),返回一個(gè)從0開(kāi)始的整數(shù)列表。
3)如果一個(gè)函數(shù)返回一個(gè)序列或列表,則可將它組賦值給一組變量,就象函數(shù)一次返回一組值一樣。如:
>>> (filepath, filename) = os.path.split("/music/ap/mahadeva.mp3")
>>> (shortname, extension) = os.path.splitext(filename)
20、定義類(lèi)
以FileInfo類(lèi)的定義為例
from UserDict import UserDict
class FileInfo(UserDict):
"store file metadata"
def __init__(self, filename=None):
UserDict.__init__(self)
self["name"] = filename
1)父類(lèi)放在類(lèi)名后的小括號(hào)內(nèi);
2)類(lèi)可以有文檔字符串
3)__init__函數(shù)在對(duì)象被創(chuàng)建后被自動(dòng)調(diào)用的第一個(gè)函數(shù),可以指定任何個(gè)數(shù)的參數(shù)。
4)慣例,__init__應(yīng)為類(lèi)中第一個(gè)定義的方法,其第一個(gè)參數(shù)指向類(lèi)的當(dāng)前實(shí)例的第一個(gè)引用,且應(yīng)命之為self。__init__中要顯式地調(diào)用父類(lèi)的__init__方法。
5)__init__無(wú)返回值。
6)__init__的定義是可選的,一旦定義必須顯式調(diào)用父類(lèi)的__init__方法。
7)除了可自由定義的普通的類(lèi)方法,還有一些可以定義的專(zhuān)用方法。專(zhuān)用方法是在特殊情況下或當(dāng)使用特別語(yǔ)法時(shí)由Python替你調(diào)用的,而不是在代碼中直接調(diào)用(象普通的方法那樣)。也就是說(shuō),python提供了一種方法,可以將非方法調(diào)用語(yǔ)法映射到方法調(diào)用上。最常見(jiàn)是__getitem__和__setitem__方法。例如,在上例中增加兩個(gè)方法的定義,就可以實(shí)現(xiàn)方便的取值和賦值:
def __getitem__(self, key): return self.data[key]
def __setitem__(self, key, item): self.data[key] = item
>f = fileinfo.FileInfo("/music/_singles/kairo.mp3")
>f[“name”]
>f[“anothername”]=...
8)__repr__專(zhuān)用函數(shù),返回一個(gè)對(duì)象的字符串表示。Python用內(nèi)置函數(shù)repr來(lái)顯示變量的值,如果repr的參數(shù)是某個(gè)對(duì)象時(shí),那用它的類(lèi)的__repr__返回對(duì)象的字符串表示。
9)__cmp__專(zhuān)用函數(shù),在比較類(lèi)實(shí)例時(shí)被調(diào)用。即當(dāng)作==比較時(shí),被調(diào)用。
10)__len__專(zhuān)用函數(shù),當(dāng)調(diào)用內(nèi)置函數(shù)len(instance)時(shí)被調(diào)用,對(duì)字符串返回字符的個(gè)數(shù),對(duì)字典返回關(guān)鍵字的個(gè)數(shù),對(duì)序列或列表返回元素個(gè)數(shù)。對(duì)自由定義的類(lèi),可自由定義返回的len的值的含義。:)
11)__delitem__專(zhuān)用函數(shù), 在調(diào)用 del instance[key]被調(diào)用。
12)__setitem__,__getitem__,__cmp__,__len__,等方法加入到類(lèi)的定義中后,可以使任何類(lèi)看起來(lái)象“字典”。還有其它的一些專(zhuān)用方法,可以使類(lèi)看起來(lái)象數(shù)值一樣可以對(duì)它進(jìn)行運(yùn)行。
21、類(lèi)的實(shí)例化和清除
1)象調(diào)用函數(shù)一樣調(diào)用類(lèi),就可以實(shí)例化一個(gè)類(lèi),傳入的參數(shù)是__init__定義的參數(shù)(參數(shù)是以從右向左的順序傳遞給__init__的,python會(huì)自動(dòng)添加self),返回一個(gè)實(shí)例對(duì)象。
2)一個(gè)類(lèi)的所有實(shí)例,共享類(lèi)的文檔字符串,
3)python采用引用計(jì)數(shù)的技術(shù)進(jìn)行垃圾回收,因而維護(hù)著對(duì)第一個(gè)創(chuàng)建的實(shí)例的引用的列表,當(dāng)計(jì)數(shù)為0時(shí),實(shí)例自動(dòng)被破壞。
4)不用顯式的釋放一個(gè)實(shí)例,因?yàn)楫?dāng)變量超出作用域時(shí)自動(dòng)失效,而至其所對(duì)應(yīng)的實(shí)例的引用數(shù)減一。
5)在Python中,你不能子類(lèi)化象字符串、列表和字典的內(nèi)置數(shù)據(jù)類(lèi)型。作為補(bǔ)償,Python附帶了封裝類(lèi),可以模擬這些內(nèi)置的數(shù)據(jù)類(lèi)型的行為: UserString,UserList,和 UserDict。
6)子類(lèi)中定義的方法覆蓋父類(lèi)的方法,python不支持函數(shù)重載。由此,子類(lèi)的__init__與父類(lèi)的__init__的參數(shù)序列可以有較大的不同。
7)python支持?jǐn)?shù)據(jù)屬性,即C++中所謂的“數(shù)據(jù)成員”,對(duì)其值的引用需要以"實(shí)例名.屬性名"的方式。注意,數(shù)據(jù)屬性是類(lèi)實(shí)例擁有的屬性,還有一種屬性是叫屬性,是類(lèi)所擁有的
8)
22、當(dāng):號(hào)后面的塊(即需要縮進(jìn)的內(nèi)容)只有一條語(yǔ)句時(shí),可以直接將此語(yǔ)句放在:后面。
其它平臺(tái)
下載 Python-2.4.2.tgz 或 Python-2.4.2.tar.bz2,
tar -zxvf Python-2.4.2.tgz 或bzcat Python-2.4.2.tar.bz2 | tar -xf -
./configure
make
make install
二、語(yǔ)法
1、函數(shù)聲明
關(guān)鍵字 def 為函數(shù)聲明的開(kāi)始,不區(qū)分有返回值的函數(shù)與無(wú)返回值的函數(shù)。它沒(méi)有子程序,全部都是函數(shù)。
函數(shù)沒(méi)有定義返回的數(shù)據(jù)類(lèi)型。如果函數(shù)執(zhí)行了一個(gè) return 語(yǔ)句,它將返回一個(gè)值,否則會(huì)返回 None (Python的空值)。
參數(shù) params 并不需要指明數(shù)據(jù)類(lèi)型
2、文檔字符串
任何在三重雙引號(hào)中的東西都是函數(shù)的文檔字符串,它們用來(lái)說(shuō)明函數(shù)可以做什么。
如果存在文檔字符串,它必須要在函數(shù)中的被首先定義(也就是說(shuō)在冒號(hào)后面被定義)。
文檔字符串在運(yùn)行時(shí)可作為函數(shù)的屬性。
3、在Python中每個(gè)東西都是對(duì)象
并且?guī)缀趺總€(gè)東西都有屬性和方法。
所有的函數(shù)都有一個(gè)內(nèi)置的屬性 __doc__,它會(huì)返回在函數(shù)源代碼中定義的文檔字符串。
4、縮排代碼
Python函數(shù)沒(méi)有明顯的 begin 或 end,或任何括號(hào)或大括號(hào)來(lái)標(biāo)識(shí)函數(shù)開(kāi)始結(jié)束。唯一的分隔是通過(guò)一個(gè)冒號(hào)(:)和代碼本身的縮排來(lái)表示。
代碼塊(函數(shù),if 語(yǔ)句,for 循環(huán),等等)通過(guò)它們的縮排來(lái)定義。縮排表示塊的開(kāi)始,非縮排表示結(jié)束,不存在明顯的括號(hào),大括號(hào),或關(guān)鍵字。這就意味著空白是有意義的,并且要一致。
5、if __name__
在 if 表達(dá)式周?chē)恍枰±ㄌ?hào)
象C語(yǔ)言一樣,Python使用 == 進(jìn)行比較,使用 = 進(jìn)行賦值。
模塊是對(duì)象,并且所有的模塊都有一個(gè)內(nèi)置屬性 __name__。如果 import 模塊,那么 __name__ 的值通常為模塊的文件名,不帶路徑或者文件擴(kuò)展名。如果直接運(yùn)行模塊, __name__ 的值將是一個(gè)特別的缺省值, __main__。
通過(guò)在程序中加入下一個(gè)if,就可以很簡(jiǎn)單地實(shí)現(xiàn)單元測(cè)試。
if __name__ == "__main__":
6、字典
Python的內(nèi)置數(shù)據(jù)類(lèi)型之一是字典,它在關(guān)鍵字與值之間定義了一對(duì)一的關(guān)系。這一點(diǎn)就象Perl中的關(guān)聯(lián)數(shù)組,Java中的 Map ,或VBScipt中的 Scripting.Dictionary 對(duì)象。如:
>>> d = {"server":"mpilgrim", "database":"master"}
1)每一個(gè)元素都是一個(gè)鍵-值對(duì),整個(gè)元素集合用大括號(hào)括起來(lái),賦值給變量d.
2)server 是一個(gè)鍵字,它所關(guān)聯(lián)的值為 mpilgrim,用 d["server"] 來(lái)引用.
3)你可以通過(guò)鍵字來(lái)得到值,但是不能通過(guò)值得到鍵字。
>>> d["database"] = "pubs"
4)可如上式一樣修改字典.
5)不能在一個(gè)字典中有重復(fù)的鍵字。給一個(gè)存在的鍵字賦值會(huì)抹掉原來(lái)的值。
6)可以在任何時(shí)候加入新的鍵-值對(duì)。這種語(yǔ)法同修改存在的值一樣。
7)字典沒(méi)有元素順序的概念。
8)字典的值可以是任意數(shù)據(jù)類(lèi)型,包括字符串,整數(shù),對(duì)象,或者甚至其它的字典。
9)字典的關(guān)鍵字要嚴(yán)格一些,但是它們可以是字符串,整數(shù)和幾種其它的類(lèi)型
>>> del d['server']
10)可如上式一樣刪除元素
>>> d.clear()
11)可如上式一樣清空所有元素
7、列表
1)個(gè)列表是一個(gè)用方括號(hào)包括的有序元素集。
>>> li = ["a", "b", "mpilgrim", "z", "example"]
2)可如上式定義列表
3)一個(gè)列表可以象一個(gè)以0開(kāi)始的數(shù)組一樣使用。任何一個(gè)非空列表的第一個(gè)元素總是 xxx[0]。
4)負(fù)數(shù)索引從列表的尾部開(kāi)始向后計(jì)數(shù)存取元素。li[n] == li[n – len(li)],如:
>>> li[-3]
結(jié)果為"mpilgrim"。
5)任何一個(gè)非空的列表最后一個(gè)元素總是 li[-1]。
6)你可以通過(guò)指定2個(gè)索引得到列表的子集,叫做一個(gè)“分片”。返回值是一個(gè)新的列表,它包含了列表中按順序從第一個(gè)分片索引開(kāi)始,直到但是不包括第二個(gè)分片索引的所有元素。
7)如果一個(gè)或兩個(gè)分片索引是負(fù)數(shù),分片也可以工作,但如果兩個(gè)索引的所代表的位置大者在前則返回空列表。
8)如果任一個(gè)分片索引為0,你可以將其省略,默認(rèn)為0。所以li[:3]同li[0:3] 一樣。
9)li[:n] 將總是返回前 n 個(gè)元素,而 li[n:] 將返回其它的元素。
10)如果兩個(gè)分片索引均省略,將包括列表的所有元素。但是與原始的列表 li 不是同一個(gè),它是一個(gè)新的列表,恰好擁有與 li 全部一樣的元素。li[:] 是生成一個(gè)列表拷貝的縮寫(xiě)。
11)append 增加單個(gè)元素到列表的尾部。如:
>>> li.append("new")
12)insert 在列表中插入單個(gè)元素。數(shù)值參數(shù)是使得列表增加的第一個(gè)元素的索引(注意,不是序號(hào)).如下:
>>> li.insert(2, "new")
13)列表元素不需要唯一
14)用extend 連接列表。注意不要用多個(gè)參數(shù)調(diào)用 extend ,要使用一個(gè)列表參數(shù)調(diào)用。如下:
>>> li.extend(["two", "elements"])
15)index 在列表中查找值第一次的出現(xiàn)并返回索引值
>>> li.index("example")
16)如果在列表中沒(méi)有找到值,Python會(huì)引發(fā)一個(gè)異常
17)要測(cè)試一個(gè)值是否在列表內(nèi),使用 in,如果值找到了,它返回 1 ,或者沒(méi)找到則為 0 。(在Python中不存在布爾類(lèi)型。在一個(gè)布爾上下文中(象 if 語(yǔ)句),0 是假,所有其它的數(shù)值為真。這一點(diǎn)也可以擴(kuò)展到其它類(lèi)型。一個(gè)空串(""),一個(gè)空列表([]),和一個(gè)空字典({})都是假,所有其它的字符串,列表,和字典是真。)如:
>>> "new" in li
18)remove 從列表中除掉第一次出現(xiàn)的值。(僅第一次出現(xiàn)的值),如:
>>> li.remove("new")
19)如果在列表中沒(méi)有找到值,Python引發(fā)一個(gè)異常。它反映了 index 方法的行為。
20)用pop除掉列表的最后一個(gè)元素,然后返回除掉的值。注意這一點(diǎn)同 li[-1]不同,后者返回一個(gè)值但不改變列表,也不同于 li.remove(value),后者改變列表但不返回值。如:
>>> li.pop()
21)列表也可以用 + 操作符連接起來(lái)。list = list + otherlist 相當(dāng)于 list.extend(otherlist)。但是 + 操作符將連接后的列表作為一個(gè)值返回,而 extend 僅修改存在的列表。如:
>>> li = li + ['example', 'new']
22)Python支持 += 操作符。li += ['two'] 相當(dāng)于 li = li + ['two']。+= 操作符可用于列表,字符串,和整數(shù),并且它也可以在用戶定義類(lèi)中被重載。
23)* 操作符作為一個(gè)重復(fù)符可用在列表上。li = [1, 2] * 3 相當(dāng)于 li = [1, 2] + [1, 2] + [1, 2], 將三個(gè)列表連成一個(gè)。
8、序列
1)序列是不可變列表。一旦創(chuàng)建了一個(gè)序列就不能以任何方式改變它。
2)序列的定義同列表的定義方式相同,除了整個(gè)元素集是用小括號(hào)包圍的而不是方括號(hào)
3)當(dāng)分割一個(gè)列表時(shí),會(huì)得到一個(gè)新的列表;當(dāng)分割一個(gè)序列時(shí),會(huì)得到一個(gè)新的序列。
4)序列沒(méi)有方法,所以不能查找、刪除和增加元素,但可以用in來(lái)檢查元素是否在序列里。
5)序列比列表操作速度快。
6)序列可以在字典中被用作關(guān)鍵字,但是列表不行。
7)內(nèi)置的 tuple 函數(shù)接收一個(gè)列表,返回一個(gè)有著相同元素的序列。而 list 函數(shù)接收一個(gè)序列,返回一個(gè)列表。從效果上看,tuple 凍結(jié)一個(gè)列表,而 list 解凍一個(gè)序列。
8)序列用在字符串格式化.
9、變量
1)Python象大多數(shù)其它語(yǔ)言一樣有局部和全局變量,但是它沒(méi)有明顯的變量聲明。變量通過(guò)賦值產(chǎn)生,當(dāng)超出作用范圍時(shí)自動(dòng)消滅。
2)當(dāng)一條命令用續(xù)行符(“\”)分割成多行時(shí),后續(xù)的行可以以任何方式縮排,Python通常的嚴(yán)格的縮排規(guī)則不需遵守。
3)嚴(yán)格地講,在小括號(hào),方括號(hào)或大括號(hào)中的表達(dá)式(如定義字典)可以用或者不用續(xù)行符(“\”)分割成多行。
4)Python不允許你引用一個(gè)未被賦值的變量,試圖這樣做會(huì)引發(fā)一個(gè)異常。
10、字符串格式化
1)基本語(yǔ)法如下:
"帶占位符的字符串" % (參數(shù)序列)
2)試圖將一個(gè)字符串同一個(gè)非字符串連接會(huì)引發(fā)一個(gè)異常。字符串連接只能在每個(gè)都是字符串時(shí)起作用。此時(shí)選擇格式化串會(huì)是個(gè)不錯(cuò)的主意。
11、映射
1)基本語(yǔ)法如下:
[ 函數(shù)或表達(dá)式 for 循環(huán)變量 in 列表/序列 ]
2)映射是通過(guò)循環(huán)遍歷一個(gè)列表/序列,并對(duì)每個(gè)元素應(yīng)用一個(gè)函數(shù),然后返回一個(gè)包含為計(jì)算后的值的新列表。
3)注意列表映射不改變被映射的列表。
4)新列表?yè)碛信c原有列表/序列擁有相同數(shù)量的元素?cái)?shù)
your_name = raw_input("please input your name:") hint = "welcome! %s" % your_name print hint |
inputed_num = 0 while 1: ? ? inputed_num = input("input a number between 1 and 10\n") ? ? if inputed_num >= 10: ? ?? ???pass ? ? elif inputed_num < 1: ? ?? ???pass ? ? else: ? ?? ???break print "hehe, don't follow, won't out" |
from Tkinter import * root = Tk() w = Label(root, text="Hello, world!") w.pack() root.mainloop() |
################ #呵呵,還忘記了講注釋 #第一個(gè)算是完整的程序 ################ contact = {} contact_list = [] while 1: ? ? contact['name'] = raw_input("please input name: ") ? ? contact['phone'] = raw_input("please input phone number: ") ? ? contact_list.append(contact.copy()) ? ? go_on = raw_input("continue?\n") ? ? if go_on == "yes": ? ?? ???pass ? ? elif go_on == "no": ? ?? ???break ? ? else: ? ?? ???print "you didn't say no\n" i = 1 for contact in contact_list: ? ? print "%d: name=%s" % (i, contact['name']) ? ? print "%d: phone=%s" % (i, contact['phone']) ? ? i = i + 1 |
print input() |
print raw_input() |
eval(raw_input()) |
Traceback (most recent call last): ??File " ? ? input() ??File " NameError: name 'sdfsdf' is not defined |
try: ? ? print input() except: ? ? print 'there is an error in your input' |
try: ? ? print input() except ZeroDivisionError: ? ? print 'can not be divided by zero' |
try: ? ? print input() except ZeroDivisionError: ? ? print 'can not be divided by zero' except: ? ? print 'there is an error in your input' |
def square(x): ? ? return x**2 print square(5) |
def multiply(a, b): ? ? return a*b print multiply(1,2) |
def swap(a, b): ? ? return (b,a) print swap(1,2) |
my_turple = (1, 2, 3) my_list = [] for i in my_turple: ? ? my_list.append(i) print my_list |
def test_func(list_be_passed): ? ? list_be_passed[0] = 'towin' my_list = ['taowen'] print my_list test_func(my_list) print my_list |
This is line #1 This is line #2 This is line #3 END |
>>> xxx = file('c:\\a.txt', 'r') |
>>> xxx = file('c:\\a.txt', 'r') >>> xxx_content = xxx.read() >>> print xxx_content This is line #1 This is line #2 This is line #3 END >>> xxx.close() >>> >>> infile = file('c:\\a.txt', 'r') >>> xxx = file('c:\\a.txt', 'r') >>> for xxx_line in xxx.readlines(): ? ? ? ? print 'Line:', xxx_line ??????? Line: This is line #1 Line: This is line #2 Line: This is line #3 Line: END >>> xxx.close() >>> |
>>> xxx=file('c:\\test.txt','w') >>> xxx.write('billrice') >>> xxx.write('testtest') >>> xxx.write('enter\n') >>> xxx.writelines(['billrice','ricerice']) >>> xxx.close() >>> >>> xxx=file('c:\\test.txt','r') >>> content=xxx.read() >>> print content billricetesttestenter billricericerice >>> |
運(yùn)行環(huán)境可以是linux或者是windows:
1、linux
redhat的linux安裝上去之后一定會(huì)有python的(必須的組件),在命令行中輸入python回車(chē)。這樣就可以進(jìn)入一個(gè)
>>>的提示符
2、windows
安裝好了python之后,在開(kāi)始菜單里面找到Python2.3->IDLE,運(yùn)行也會(huì)進(jìn)入一個(gè)有
>>>提示符的窗口
開(kāi)始嘗試Python
1、輸入:
welcome = "Hello!"
回車(chē)
然后又回到了>>>
2、輸入:
print welcome
回車(chē)
然后就可以看到你自己輸入的問(wèn)候了。
Lesson 2 搞定環(huán)境之后的前行
Python有一個(gè)交互式的命令行,大家已經(jīng)看到了吧。所以可以比較方便的學(xué)習(xí)和嘗試,不用“新建-存檔-編譯-調(diào)試”,非常適合快速的嘗試。
一開(kāi)始從變量開(kāi)始(其實(shí)說(shuō)變量,更準(zhǔn)確的是對(duì)象,Python中什么都可以理解為對(duì)象)。
變量
welcome = "hello!"
welcome就是變量名,字符串就是變量的類(lèi)型,hello!就是變量的內(nèi)容,""表示這個(gè)變量是字符串,""中間的是字符串的內(nèi)容。
熟悉其他語(yǔ)言的人,特別是編譯類(lèi)型的語(yǔ)言,覺(jué)得沒(méi)有變量的聲明很奇怪。在python中用賦值來(lái)表示我要這么一個(gè)變量,即使你不知道要放什么內(nèi)容,只是要先弄一個(gè)地方來(lái)放你的東西,也要這么寫(xiě):
store = ""
不過(guò)這個(gè)還是說(shuō)明了store是字符串,因?yàn)?"的緣故。
have a try
代碼:
tmp_storage = "" welcome = "hello!" tmp_storage = welcome print tmp_storage |
字符串
字符串是用""標(biāo)記的,但是用''也可以(不要說(shuō)你看不出一個(gè)是雙引號(hào),一個(gè)是單引號(hào)),兩者之間是有一丁點(diǎn)區(qū)別,不過(guò)你可以不用理會(huì)。其實(shí)是差不多的。字符串有很多自己的操作,最常用的是這樣的:
代碼:
welcome = "hello" you = "world!" print welcome+you |
運(yùn)行之后就會(huì)發(fā)現(xiàn)她輸出了helloworld!。
更多變量
變量還有幾種類(lèi)型。
數(shù)
字符串
列表
字典
文件
勿庸置疑,這些都是非常非常常用的。對(duì)于數(shù)字就不用講了那就是:
代碼:
radius = 10 pi = 3.14 area = pi*radius**2 print "the area is", area |
下次講列表和字典
Lesson 3 Python中的數(shù)學(xué)結(jié)構(gòu)
數(shù)學(xué)中你學(xué)什么東西最多遍?我想根據(jù)我的一點(diǎn)淺薄經(jīng)驗(yàn)(雖然我是數(shù)學(xué)系的),學(xué)得最多的是集合,無(wú)論什么數(shù)學(xué)書(shū)都從集合開(kāi)始講起。然后講函數(shù)呢,又必然把映射再講一遍。可以說(shuō),集合和映射是數(shù)學(xué)中最基本的結(jié)構(gòu)了。
Python對(duì)于數(shù)據(jù)結(jié)構(gòu)非常明智的內(nèi)置了兩個(gè),回想我寫(xiě)C的程序,往往是一開(kāi)始就是用struct拼一個(gè)鏈表出來(lái)(重復(fù)勞動(dòng))。Python中提供了列表(list)和字典(dict)兩種數(shù)據(jù)結(jié)構(gòu)。他們分別對(duì)應(yīng)的原型是集合和映射。這個(gè)你應(yīng)該明白了,只是表示方法有一點(diǎn)不一樣而已。
列表
列表的英文名是list嘛,所以我取一個(gè)名字叫
代碼:
my_list = [] 這個(gè)就產(chǎn)生了一個(gè)空的列表。然后給它賦值 my_list = [1,2] print my_list my_list.append(3) print my_list |
字典
代碼:
contact = {} |
這個(gè)產(chǎn)生了一個(gè)空字典,contact。然后往里面填充內(nèi)容:
代碼:
contact={} contact["name"]="taowen" contact["phone"]=68942443 |
name就是你查字典的時(shí)候要查找的單詞,taowen就是查到的內(nèi)容。不過(guò)你現(xiàn)在不是查,而是在寫(xiě)這個(gè)字典。同理添加了phone這個(gè)詞條。
現(xiàn)在添加好了,看看contact的內(nèi)容,怎么查看?自己想辦法吧。。。
如果你悟性夠,就會(huì)發(fā)現(xiàn)python很多操作是通用的,既然能夠print 1, print "", print my_list,那么其他數(shù)據(jù)類(lèi)型的變量就沒(méi)有理由不能用了。
結(jié)合列表和字典
代碼:
contact_list=[] contact1={} contact1['name']='taowen' contact1['phone']=68942443 contact_list.append(contact1) contact2={} contact2['name']='god' contact2['phone']=44448888 contact_list.append(contact2) |
呵呵,夠復(fù)雜的吧。你可以想出我為什么要用兩個(gè)contact字典呢?。。。
Lesson 4 用不同的方式來(lái)操作Python
到現(xiàn)在為止,我們用的都是交互式的命令行來(lái)操作的,的卻是很方便,是吧?不過(guò),復(fù)雜一些的情況就不那么好使了,來(lái)?yè)Q一種方式來(lái)操作Python
在IDLE中點(diǎn)擊File->New Window,出現(xiàn)一個(gè)新窗口(對(duì)于linux下,你要用vim或者emacs或者pico把文本的源文件寫(xiě)好了)。為了方便,先點(diǎn)擊File->Save,填入my_try.py。這樣能夠讓編輯器知道在編輯python的源文件,會(huì)把你輸入的代碼進(jìn)行一點(diǎn)上色的處理。
填入下面的代碼:
代碼:
i = 5 n = 0 while i>0: n = n + i i = i - 1 print n |
你會(huì)發(fā)現(xiàn)輸入:之后,自動(dòng)會(huì)給縮進(jìn)。而且也沒(méi)有在python中發(fā)現(xiàn)和C/C++中類(lèi)似的{}標(biāo)記也沒(méi)有pascal中的begin end;,其實(shí)縮進(jìn)就是python中表示一段代碼的從屬關(guān)系的標(biāo)記方法。表示n=n+1和i=i-1這兩句都是while的。程序的運(yùn)行邏輯應(yīng)該不用解釋了吧。就是運(yùn)行5+4+3+2+1的結(jié)果。
運(yùn)行代碼
按F5,可能提示你沒(méi)有存盤(pán),照著辦就是了。
發(fā)揮你的能力,計(jì)算從1到10的所有偶數(shù)的和(提示,可能沒(méi)有你想象的那么智能)。
什么是Python?
Python是一種即譯式的,互動(dòng)的,面向?qū)ο蟮木幊陶Z(yǔ)言,它包含了模組式的操作,異常處理,動(dòng)態(tài)資料形態(tài),十分高層次的動(dòng)態(tài)資料結(jié)構(gòu),以及類(lèi)別的使用。Python揉合了簡(jiǎn)單的語(yǔ)法和強(qiáng)大的功能。它的語(yǔ)法表達(dá)優(yōu)美易讀。它具有很多優(yōu)秀的腳本語(yǔ)言的特點(diǎn):解釋的,面向?qū)ο蟮模瑑?nèi)建的高級(jí)數(shù)據(jù)結(jié)構(gòu),支持模塊和包,支持多種平臺(tái),可擴(kuò)展。而且它還支持交互式方式運(yùn)行,圖形方式運(yùn)行。它擁有眾多的編程界面支持各種操作系統(tǒng)平臺(tái)以及眾多的各類(lèi)函數(shù)庫(kù)。利用C和C++可以對(duì)它進(jìn)行擴(kuò)充。個(gè)別的應(yīng)用軟件如果需要有一個(gè)可程序化界面也可以利用它來(lái)做為擴(kuò)展語(yǔ)言用。最后,Python的可移植度非常高:它可以在許多的Unix類(lèi)平臺(tái)上運(yùn)行,在Mac,MS-DOS,視窗Windows,Windows NT,OS/2,BeOS,以至RISCOS上都有相關(guān)的Python版本。
簡(jiǎn)單的說(shuō)它具有以下一些特征:
是一種解釋性的,面向?qū)ο蟮模哂袆?dòng)態(tài)語(yǔ)義的程序設(shè)計(jì)語(yǔ)言。
適合快速開(kāi)發(fā)。
能集成到其他流行的服務(wù)器,也自帶服務(wù)器。
提供清晰的數(shù)據(jù)/邏輯/表示的分離。
帶有可擴(kuò)展的內(nèi)置對(duì)象和強(qiáng)大的集成安全模塊。
Python的歷史
Python的創(chuàng)始人為Guido van Rossum。1989年圣誕節(jié)期間,在阿姆斯特丹,Guido為了打發(fā)圣誕節(jié)的無(wú)趣,決心開(kāi)發(fā)一個(gè)新的腳本解釋程序,做為ABC語(yǔ)言的一種繼承。之所以選中Python(大蟒蛇的意思)作為程序的名字,是因?yàn)樗且粋€(gè)Monty 大蟒蛇飛行馬戲團(tuán)的愛(ài)好者。
ABC是由Guido參加設(shè)計(jì)的一種教學(xué)語(yǔ)言(沒(méi)聽(tīng)說(shuō)過(guò))。就Guido本人看來(lái),ABC這種語(yǔ)言非常優(yōu)美和強(qiáng)大,是專(zhuān)門(mén)為非專(zhuān)業(yè)程序員設(shè)計(jì)的。但是ABC語(yǔ)言并沒(méi)有成功,究其原因,Guido認(rèn)為是非開(kāi)放造成的。Guido決心在Python中避免這一錯(cuò)誤(的確如此,Python與其它的語(yǔ)言如C,C++和Java結(jié)合的非常好)。同時(shí),他還想實(shí)現(xiàn)在ABC中閃現(xiàn)過(guò)但未曾實(shí)現(xiàn)的東西。
就這樣,Python在Guido手中誕生了(真要感謝他)。實(shí)際上,第一個(gè)實(shí)現(xiàn)是在Mac機(jī)上。可以說(shuō),Python是從ABC發(fā)展起來(lái),主要受到了Modula-3(另一種相當(dāng)優(yōu)美且強(qiáng)大的語(yǔ)言,為小型團(tuán)體所設(shè)計(jì)的)的影響。并且結(jié)合了Unix Shell和C的習(xí)慣。
Python可用在哪些地方?
Python可以用在許多場(chǎng)合。當(dāng)你需要大量的動(dòng)態(tài)調(diào)整,要容易使用,功能強(qiáng)大并且富有彈性的情況,Python可以發(fā)揮很好的功效。
在處理文字方面,Python的核心功能(不需要任何擴(kuò)充庫(kù)的情況下)比別的編程語(yǔ)言更為易用而且速度相當(dāng)。這使Python在需要處理字符串的工作(包括系統(tǒng)管理,CGI編程)上成為高效的語(yǔ)言。
當(dāng)Python加上它的標(biāo)準(zhǔn)擴(kuò)充庫(kù)(如PIL,COM,Numeric,Oracledb,kjbuckets,tkinter,win32api,等等)或是特別擴(kuò)充庫(kù)(你自己寫(xiě)的,或是用SWING做的,或是利用ILU/COBRA/com的)后,它可以變成一個(gè)很好的“膠合語(yǔ)言”或者叫“指導(dǎo)語(yǔ)言”。就是指把不同的編程環(huán)境和互不相關(guān)的軟件功能整合的工具。例如把Numeric和Oracledb透過(guò)Python結(jié)合起來(lái)你就可以替你的資料庫(kù)數(shù)據(jù)做系統(tǒng)分析。Python的簡(jiǎn)單、易用以及方便而強(qiáng)大的c/c++擴(kuò)展方面使它成為一種十分優(yōu)秀的“膠合語(yǔ)言”。
許多開(kāi)發(fā)人員也在寫(xiě)圖形用戶界面時(shí)廣泛的采用了Python。如果在Windows下,如果想做一個(gè)圖形界面程序,那么Python可以勝任。可以去wxPython.org看一下,它是一個(gè)Python的擴(kuò)展庫(kù),可以用來(lái)實(shí)現(xiàn)跨平臺(tái)的圖形編程,它支持windows和unix/linux。在那個(gè)網(wǎng)站上有一些演示,可以學(xué)習(xí)一下。Python可以做CGI。有些主頁(yè)提供了對(duì)Python的CGI支持。現(xiàn)在還有一些用Python做的游戲。如果想了解更多的Python可以做什么,可以去SourceForge上查找有關(guān)Python的項(xiàng)目,上面有很多東西。
運(yùn)行方式
Python可以以命令行方式運(yùn)行,也可以交互式方式運(yùn)行,還具有圖形集成環(huán)境,這樣開(kāi)發(fā)Python就相當(dāng)方便。現(xiàn)在已經(jīng)出現(xiàn)了許多用Python編寫(xiě)的可視化編程軟件,用于實(shí)現(xiàn)象Delphi一樣的功能。
面向?qū)ο?/P>
Python是一個(gè)真正的面向?qū)ο笳Z(yǔ)言。它甚至支持異常的處理。如果學(xué)過(guò)Java,應(yīng)該對(duì)這個(gè)不陌生。但其它的腳本語(yǔ)言,如PHP,好象就沒(méi)有。這使得程序的編寫(xiě)更加清晰,而不需要許多的錯(cuò)誤檢查了。
模塊和包
這一點(diǎn)更象是Java。對(duì)于Java的支持,大家可以了解JPython。JPython是用Java寫(xiě)的Python,它完全支持Java,在這個(gè)環(huán)境下使用Python可以隨意地使用Java的類(lèi)庫(kù)。語(yǔ)言擴(kuò)展可以用C、C++或Java為Python編寫(xiě)新的新言模塊,如函數(shù)。或者與Python直接編譯在一起,或者采用動(dòng)態(tài)庫(kù)裝入方式實(shí)現(xiàn)。也專(zhuān)門(mén)有人編寫(xiě)了一個(gè)工具,可以實(shí)現(xiàn)為Python自動(dòng)實(shí)現(xiàn)函數(shù)接口封裝,這就是SWIG(Simplified Wrapper and Interface Generator),或稱(chēng)做簡(jiǎn)單封裝和接口生成器(可以在http://sourceforge.net/projects/swig/)。
有趣的語(yǔ)法
Guido認(rèn)為Python的語(yǔ)法是非常優(yōu)美的。其中一點(diǎn)就是,塊語(yǔ)句的表示不是C語(yǔ)言常用的{}對(duì),或其它符號(hào)對(duì),而是采用縮近表示法!有趣吧。就這一點(diǎn)來(lái)說(shuō),Guido的解釋是:首先,使用縮近表示法減少了視覺(jué)上的混亂,并且使程序變短,這樣就減少了需要對(duì)基本代碼單元注意的范圍;其次,它減少了程序員的自由度,更有利于統(tǒng)一風(fēng)格,使得閱讀別人的程序更容易。感覺(jué)還是不錯(cuò)的,就C語(yǔ)言來(lái)說(shuō),在if語(yǔ)句后面大括號(hào)的寫(xiě)法就好幾種,不同的人喜歡不同的樣子,還不如統(tǒng)一起來(lái),都不會(huì)看得別扭。
在每個(gè)類(lèi)或函數(shù)的定義后面,第一行可以是說(shuō)明語(yǔ)句,根本不需要注釋符標(biāo)記。對(duì)于后面跟塊語(yǔ)句的語(yǔ)句,后面應(yīng)跟上一個(gè)冒號(hào)。一行語(yǔ)句不能太長(zhǎng),因?yàn)闆](méi)有行結(jié)束符,如果超長(zhǎng)則要使用續(xù)行符(\)。還有一些有趣的比如說(shuō),象下面的一個(gè)比較處理,用C語(yǔ)言為:
if (2<a&&a<5)
用Python可以表示為
if (2<a<5) :
什么是Zope?
Zope是一個(gè)開(kāi)放源代碼的Web應(yīng)用服務(wù)器,采用Python語(yǔ)言開(kāi)發(fā),使用它您可以方便的構(gòu)建內(nèi)容管理、內(nèi)部網(wǎng)、門(mén)戶網(wǎng)站、和其他的定制應(yīng)用。
高度面向?qū)ο蟮腤eb開(kāi)發(fā)平臺(tái),采用Python語(yǔ)言開(kāi)發(fā)。
可以運(yùn)行在幾乎所有流行的操作系統(tǒng)上,支持多語(yǔ)言。
能集成到其他流行的服務(wù)器,也自帶服務(wù)器。
提供清晰的數(shù)據(jù)/邏輯/表示的分離 。
帶有可擴(kuò)展的內(nèi)置對(duì)象和強(qiáng)大的集成安全模塊。
什么是Plone?
Pone是一個(gè)Zope上的一個(gè)用戶友好、功能強(qiáng)大的開(kāi)放源代碼內(nèi)容管理系統(tǒng)。Plone適合用作內(nèi)部網(wǎng)/外部網(wǎng)的服務(wù)器、文檔發(fā)布系統(tǒng)、門(mén)戶服務(wù)器和異地協(xié)同群件工具,到目前,Plone其實(shí)已經(jīng)發(fā)展成為了一個(gè)應(yīng)用開(kāi)發(fā)平臺(tái)。
是一種功能強(qiáng)大的開(kāi)放源碼(Open Source)內(nèi)容管理系統(tǒng)(CMS) 。
通過(guò)Web瀏覽器來(lái)訪問(wèn)、編輯內(nèi)容和管理,易于更新內(nèi)容 。
無(wú)需編程,即可創(chuàng)建新的內(nèi)容類(lèi)型 。
協(xié)同的編輯和發(fā)布機(jī)制 。
Python的IDE開(kāi)發(fā)環(huán)境:
Wingide:http:// www.wingide.com
ipython: http://ipython.scipy.org/
參考資料:
Python中文社區(qū):http://python.cn
Zope/Plone中文社區(qū):http://zope.cn
Zope官方網(wǎng)站:http://www.zope.org
中文Zope用戶組:http://www.czug.org/
Python類(lèi)庫(kù): http://www.pypackage.org/
Python中文論壇:http://www.linuxforum.net/
O'Reilly: http://www.oreillynet.com
wxPython.org: http://www.wxPython.org
Jpython.org: http://jython.org