空手憶歲月 2018-08-22 16:13:21 暑假?zèng)]回家 ,一不小心培訓(xùn)了python,反正免費(fèi)的不聽(tīng)白不聽(tīng),總比呆在寢室無(wú)聊好的多,慶幸的是堅(jiān)持下來(lái)了,現(xiàn)在回想起來(lái)雖然學(xué)習(xí)時(shí)間很短,但確實(shí)感觸蠻大的,因此寫(xiě)這篇文章總結(jié)一下。第一節(jié)課就被授課者嚇到了,python處理TB級(jí)的數(shù)據(jù),是Hadoopj級(jí)別的,而擁有者能力的語(yǔ)言只有R,Ruby等少數(shù)語(yǔ)言,以后用幾個(gè)庫(kù)Scipy,Numpy,Matplotlib,可以做數(shù)值計(jì)算等,Matlab的絕大部分功能都可以用python寫(xiě)出來(lái) ,與MATLAB相比,Python是一門(mén)更易學(xué)、更嚴(yán)謹(jǐn)?shù)某绦蛟O(shè)計(jì)語(yǔ)言。它能讓用戶編寫(xiě)出更易讀、易維護(hù)的代碼。能不能別再嚇我的,我的小心臟受不了~~這里主要是以經(jīng)典的python為例,即python2.x,另外聽(tīng)說(shuō)EVE主要是用python寫(xiě)的~~,不得不說(shuō)有點(diǎn)難以置性。 首先接觸python就被它的另類所嚇到了,啥,簡(jiǎn)單粗暴沒(méi)括號(hào),嚇?biāo)牢伊?。那怎么玩啊,在python中沒(méi)有分號(hào),單引號(hào)和雙引號(hào)是不區(qū)分的,不像C中單個(gè)字符用單引號(hào),字符串用雙引號(hào)。python的代碼段是靠縮進(jìn)來(lái)表示的,不能用大括號(hào)。通過(guò)四個(gè)空格符或一個(gè)Tab鍵即可,不過(guò)在函數(shù)開(kāi)頭后應(yīng)有冒號(hào),來(lái)表示下面的代碼是其內(nèi)部的內(nèi)容。其次有些條件語(yǔ)句中的括號(hào)是可以省略的,如: if a>b:(Tab)...當(dāng)然加了括號(hào)也正確。而且不用寫(xiě)main函數(shù),也不用導(dǎo)入isotream或是stdio.h之類的庫(kù)。 Python 簡(jiǎn)介 1.免費(fèi)開(kāi)源 2.簡(jiǎn)單易學(xué) 3.解釋性語(yǔ)言,與C/C++等編譯性語(yǔ)言不同 4. 可移植,這個(gè)估計(jì)是流行起來(lái)的很重要的一個(gè)因素吧。python的程序都可以無(wú)需任何修改地移植到現(xiàn)今主流的系統(tǒng)平臺(tái)上。包括Windows,Linux,Macintosh,Solaris,OS/2,Android等等 5.同是支持面向?qū)ο蠛兔嫦蜻^(guò)程編程,類似C++。至于其面向?qū)ο蟮木幊?,python還有世界上最強(qiáng)大的類庫(kù)。 6.嵌入性:可以作為腳本語(yǔ)言嵌入到其他程序中,比如C/C++ 7.可擴(kuò)展性:python開(kāi)發(fā)周期短,由于python是基于c開(kāi)發(fā)的,所以用C/C++來(lái)編寫(xiě)Python的擴(kuò)展,現(xiàn)在也有支持Java實(shí)現(xiàn)的Jpython。 8.豐富的類庫(kù): 9.內(nèi)存管理器 這個(gè)特別棒,再也不用要先給變量申請(qǐng)內(nèi)存了,也不用想著用完后釋放等等這些麻煩死了的東西。 10.python的應(yīng)用有系統(tǒng)編程,圖形處理,數(shù)字處理,文本處理,數(shù)據(jù)庫(kù)編程,網(wǎng)絡(luò)編程,Web編程,多媒體應(yīng)用,他們也用python寫(xiě)串口之類的。。 關(guān)于python版本的問(wèn)題 我想很多人都會(huì)果斷用最新的python3.4.1(寫(xiě)文章時(shí)是2014.7.31,估計(jì)幾年后如果這篇文章有幸被別人看到,對(duì)方肯定會(huì)呵呵的),人都是這樣,喜歡最新版本的。但是python3.x和python2.x不兼容,也就是說(shuō)你寫(xiě)的python3.x的程序不能在python2.x IDEL中運(yùn)行,反過(guò)來(lái)也是如此。很多庫(kù)不支持python3.0之后的版本,很多擴(kuò)展庫(kù)都沒(méi)有,你還怎么快樂(lè)玩耍。。比如python語(yǔ)言web框架的Django就不支持。再說(shuō)了網(wǎng)上很多優(yōu)秀代碼都是用python2.x寫(xiě)的,優(yōu)秀的代碼直接拿過(guò)來(lái)用就可以了,你自己寫(xiě)的費(fèi)事費(fèi)時(shí),還不一定好用??吹揭槐緯?shū)上的建議:目前大多數(shù)的應(yīng)用是python2.5/2.6居多。windows建議學(xué)2.6,Linux就玩2.5,怪不得前幾天有個(gè)人在群里說(shuō)他還在用2.5,估計(jì)是玩Linux的。在本人學(xué)習(xí)時(shí),他們授課是用python2.7.8的,是python2.x的最新版本(此時(shí)python3.x的最新版本是python3.4.1)。還是那句話吧,python2和python3并不是100%不兼容,只不過(guò)語(yǔ)法上做了一些修繕,更加精煉罷了。會(huì)python2的人對(duì)python3是不感冒的。 下面是python的print問(wèn)題: 書(shū)上明明寫(xiě)的是print ''hello world'',會(huì)出錯(cuò),必須寫(xiě)成print (''hello world''),其實(shí)這就是版本問(wèn)題,前一種是python2的語(yǔ)法,后一種是pyhton3的語(yǔ)法。書(shū)上大部分是python2,所以如果你用python3的話,很多資料的代碼你都要進(jìn)行改寫(xiě),很是麻煩。 一些基本內(nèi)容 1.round是四舍五入的函數(shù),如round(-9.1)=-9,round(10.7)=11 2.賦值可以多個(gè)同時(shí)進(jìn)行,如a,b=3,6,而且類似a<b<7,運(yùn)行顯示True。a<7<b,運(yùn)行顯示False。這一點(diǎn)與C不一樣,由此可見(jiàn)python的人性化啊~ ~ 3.浮點(diǎn)數(shù)轉(zhuǎn)化成整數(shù)是直接截?cái)?,并非四舍五?/p> 4.python的變量是不能指定其類型的,他是通過(guò)所附的值來(lái)決定的,故int a=4是錯(cuò)誤的,而應(yīng)該寫(xiě)成a = 4,此外,long型整數(shù)沒(méi)有最大的長(zhǎng)度,具體取決于你的機(jī)器配置,一般幾百位的整數(shù)顯示時(shí)會(huì)在后面加一個(gè)L來(lái)表示其為long型。 5.‘+’可實(shí)現(xiàn)數(shù)字的相加或是字符串或是列表的相加,特別方便。如>>>a=[1,''hello'']+[2,''Mike''],則a就成了[1,''hello'',2,''Mike''] 6.用‘’來(lái)實(shí)現(xiàn)轉(zhuǎn)義,方法同C 7.逗號(hào)可以使print(不是print,python中的輸出函數(shù)是print)函數(shù)不換行的輸出。如print a,b 這和C比起來(lái)不知簡(jiǎn)單多上倍啊,要是打印個(gè)列表,python直接一個(gè)print 就出來(lái)了。。。 8.*可以實(shí)現(xiàn)字符串或列表的重復(fù) >>> a=''hello'' >>> b=a*4 >>> b ''hellohellohellohello'' >>> list1=[1,''d''] >>> list2=list1*3 >>> list2 [1, ''d'', 1, ''d'', 1, ''d''] 另外**是乘方,python還支持復(fù)數(shù),如:1-2j 9.輸入與輸出,其中輸入時(shí)通過(guò)input函數(shù),例:str1=input(''提示性語(yǔ)句'') 此時(shí)str1的類型取決于輸入類型。還有一個(gè)函數(shù)是raw_input,可以將輸入以字符串的形式處理。 輸出時(shí)可以直接在print后加變量名或表達(dá)式, 如: >>>print ''The area of the circle is",area,''sq cm'' The area of the circle is 80 sq cm 另外也可以用C語(yǔ)言的風(fēng)格輸出,不過(guò)有一點(diǎn)差異。 print ''The area of the circle is %f",area,''sq cm'' %area (注意,最末尾的百分號(hào)前面只有一個(gè)空格,否則會(huì)出錯(cuò)),如果有多個(gè)參數(shù)則%(參1,參2,...) 10.通過(guò)range可以方便的實(shí)現(xiàn)一個(gè)特殊的整數(shù)列表 range(下限,上限,步長(zhǎng)),左閉右開(kāi),同list的切片。 如:0~100 : range(0,101),或簡(jiǎn)寫(xiě)成range(101) 50~100的偶數(shù): range(0,101,2) 在表示C/C++語(yǔ)言中常用的循環(huán)時(shí),利用range可以很方便。 如:C/C++ for(int i =0;i<100;i++) { .... } Python for i in range(100): ... 這個(gè)i 是局部變量,進(jìn)行range列表的迭代,可以實(shí)現(xiàn) i 從0到99共100次循環(huán)。是不是感覺(jué)有點(diǎn)小震撼。。 11.一些循環(huán)操作: break:跳出循環(huán) continue:跳過(guò)后面的語(yǔ)句,跳回循環(huán)體的頂部 pass:啥都不做 另外:和C相比python中沒(méi)有++,和- - ,else if用elif來(lái)代替,條件語(yǔ)句的()可以省略,條件后需有:。最后邏輯關(guān)系 &&用and,||用or , !用not 表示。 字符串操作 1.capitalize(),使字符串首字母大寫(xiě) 2.find(s,beg,end)beg和end之間首次出現(xiàn)參數(shù)s的索引 3.islower()和isupper() 測(cè)試所有字符是否均小/大寫(xiě) 4.replace(old,new) 將old替換成new 5.split() 將空格分隔的單詞以列表形式返回,同理如果是split(''a''),則會(huì)將字符串進(jìn)行如下處理,每當(dāng)碰到a字符則作為前一個(gè)字符串的結(jié)束,a字符相當(dāng)于空格。 如: >>> colors=''red orange green'' >>> colors.split(a) [''red or'', ''nge green''] 6.strip()是刪除字符串中首尾的空格符 如: >>> a='' hello Kitty '' >>> a.strip() ''hello Kitty'' 列表操作 1. 通過(guò)for i in list1:來(lái)對(duì)list1列表的元素進(jìn)行迭代,賦值給i 2.如果要同時(shí)獲取i的索引可以用enumerate函數(shù) 如:>>> list1=[''Jim'',''Kitty'',"Tom"] >>> for i,j in enumerate(list1): print i,j 0 Jim 1 Kitty 2 Tom 注意 i和j之間本來(lái)是有()的,原型為(i,j),這里省略了括號(hào),所以i和j之間除了有逗號(hào)沒(méi)有空格符 3.列表的一些操作: 切片:咋說(shuō)呢,其實(shí)list和str都可以“切片”,簡(jiǎn)單地說(shuō)str[1:-1]就是去掉字符串的第一個(gè)字母和最后一個(gè)字符。str[1:]就是去掉第一個(gè)字符。切片方式和list是一樣一樣的,都是左閉右開(kāi),支持負(fù)索引,從0開(kāi)始。 list1=[''a'',''b'',''c'',''d'',''e'',''f''] list2=list[0:4] 則list2為[''a'',''b'',''c'',''d''] 區(qū)間是左閉右開(kāi)的,即list2包括了list1[0]到list1[3]的所有元素 另兩種特殊的簡(jiǎn)化形式 list2=list1[:4]等同于list2=list1[0:4] list2=list1[4:]等同于list2=list1[4:6] 此外python的列表還支持負(fù)數(shù)索引, 如>>> list2=list1[-3:-1] >>> list2 [''d'', ''e''] 依舊是左閉右開(kāi) 當(dāng)想表示從倒數(shù)第三個(gè)到結(jié)束則可以用以下兩種方式 >>> list4=list1[-3:6] >>> list4 [''d'', ''e'', ''f''] >>> list5=list1[-3:] >>> list5[''d'', ''e'', ''f''] 其他情況則會(huì)返回空列表 4. 列表具有別名機(jī)制(相當(dāng)于引用) 如:list1=[...] list2=list1 當(dāng)list1更改時(shí),list2也會(huì)更改,而字符串不具有別名機(jī)制,故字符串的別名是很安全的。 5.常見(jiàn)列表方法 append(v):列表后追加v insert(i,v): v插入索引i remove(v): 移除第一次找到的v值 reverse(): 反轉(zhuǎn) sort(): 升序排列(字符串則以字母表順序?yàn)闇?zhǔn)) pop(): 移除最后一個(gè)元素并返回 注意:除了pop外,所有的方法都只會(huì)返回一個(gè)特殊值None,列表只有一個(gè),所有的方法都只會(huì)修改原列表而不會(huì)創(chuàng)建新的列表 如:>>>ted_colors=colors.sort() >>>print sorted_colors None 6.列表中的元素可以是列表 >>>life=[[''Canada'',76.5],[''United States'',75.5]] >>>canada=life[0] >>>canada[1]=80 >>>life [[''Canada'',80],[''United States'',75.5]] 這里的canada是別名,對(duì)其操作會(huì)影響到主列表life 7.上文知道了如何將字符串轉(zhuǎn)化成列表了(別跟我說(shuō)你已經(jīng)忘了。。split 唄~~),那么如何將列表轉(zhuǎn)化成字符串呢?用 join,字面意思就是將列表中的字符連接以來(lái)。那用什么連接呢?你可以用 ’,‘ ’%‘ 或是其他任何你喜歡的字符或字符串都可以。列表放在join后的括號(hào)中,那用于連接的字符或字符串怎么寫(xiě)呢?給個(gè)例子 如:>>> list1=[''2'',''34'',''good'',''Hi''] >>> '',''.join(list1) ''2,34,good,Hi'' 這一點(diǎn)很特殊是用 字符(串).join(列表) 注意點(diǎn): 1.如果要進(jìn)行轉(zhuǎn)換操作,則對(duì)類表的元素有要求,必須全部是 字符(串),否則會(huì)出錯(cuò)。 >>> list3=[2,34,''good'',''Hi''] >>> '',''.join(list3) Traceback (most recent call last): File "<pyshell#6>", line 1, in <module> '',''.join(list3) TypeError: sequence item 0: expected string, int found 2.可以用其他連接的哦,如: >>> list1=[''2'',''34'',''good'',''Hi''] >>> ''fool''.join(list1) ''2fool34foolgoodfoolHi'' 8.特殊的列表:元組 元組是不可以直接更改的列表,其運(yùn)行效率更高,元組用‘()’來(lái)表示 >>>life=([''Canada'',76.5],[''United States'',75.5]) 實(shí)際上元組中的對(duì)象仍舊可以更改如:life[0][1]=80.0,但不可以更改life[0]。 文件操作 1.標(biāo)準(zhǔn)文件輸入格式 如data.txt中的內(nèi)容為: Mercury Venus Earth data=open/file(''data.txt'',''r'') for line in data: print len(line) 為什么會(huì)長(zhǎng)度多1呢?因?yàn)槲募凶x取的每一行末尾都有一個(gè)結(jié)束符,用string.strip(),即可去掉該空白字符。前面字符串的方法已介紹過(guò)該方法。 data=open/file(''data.txt'',''r'') for line in data: line=line.strip() print len(line) data.close() 當(dāng)該表參數(shù)‘r’,改成‘w’是直接寫(xiě)如,而‘a(chǎn)’是追加 2.當(dāng)要打開(kāi)網(wǎng)站上的文件時(shí)需導(dǎo)入urllib模塊,通過(guò)其中的urlopen函數(shù)打開(kāi)目標(biāo)網(wǎng)頁(yè),并返回一個(gè)對(duì)象,就像操作本地文件一樣。 import urllib url=''...'' web_page=urlopen(url) for i in web_page: line=line.strip() print line web_page.close() 集合和字典 1.集合可以使用元組或是列表 set((2,3,5))等價(jià)于set((2,2,3,5,5)),等價(jià)于set([2,3,3,5]),簡(jiǎn)單的說(shuō)集合只有一個(gè)元素,該元素是列表或是元組都可。 2.集合的操作 并(union),交(intersection),添加(add)和移除(remove),注意,只有add,remove和clear是修改當(dāng)前集合,其余都會(huì)創(chuàng)建一個(gè)新的集合。 eg:ten=set(range(10)), lows=set([0,1,2,3,4]), odds=set([1,3,5,7,9]) _____________________________________________________________________________________________________________________________________lows.add(9) None lows.clear() None (由于add并不會(huì)創(chuàng)建一個(gè)新集合,故為None,要想得到預(yù)期的效果,則需>>>lows=set([0,1,2,3,4]) >>>lows.add(9) >>>lows) lows.differece(odds) A lows.intersection(odds) B lows.issubset(ten) True 包含于 lows.issuperset(odds) False 包含 lows.symmetric_difference(odds) A+C 對(duì)稱差 lows.union(odds) A+B+C 并 另一種更簡(jiǎn)單的方法直接用數(shù)學(xué)符號(hào)表示即可 different set1-set2 intersection set1&set2 issubset set1<=set2 issuperset set1>=set2 symmetric_different set1^set2 union set1 |set2 字典 1.用‘{ }’表示字典,{字符串:值,...} 如: >>>birds={‘canada goose’:3,‘northern fulmar’:1} >>>birds[‘canada goose''] 3 2.通過(guò)賦值來(lái)直接對(duì)字典進(jìn)行擴(kuò)展(若原字典中無(wú)該鍵)或修改鍵值(原字典中已有該鍵) >>>birds={} >>>birds[''snow goose'']=3 >>>birds {''snow goose'':3} 3.刪除鍵 del birds[''snow goose''] 4.對(duì)字典的循環(huán),返回的不是鍵值,而是鍵!這一點(diǎn)非常重要 for x in birds: print x,birds[x] -->''snow goose'' 3 5.其他一些常用方法 get(key,value1): 注意,若dict中有key,則返回dict[key],否則返回value1 keys(): 以列表形式返回鍵 items(): 返回(key,value)列表 values(): 以列表形式返回鍵值 update(temp): temp字典對(duì)原字典進(jìn)行更新 上訴方法其實(shí)一看名稱也就明白用途了。。 6.字典的迭代 用iteritems函數(shù) 如:for (key,value) in dictionary.iteritems(): ... Lambda表達(dá)式 這個(gè)特別有意思啊,當(dāng)你寫(xiě)函數(shù)時(shí)經(jīng)常會(huì)遇到,給個(gè)啥名字好呢?你感覺(jué)寫(xiě)一大堆單詞上去總怕表達(dá)不精練什么的,有可能還會(huì)寫(xiě)錯(cuò)單詞字母(啥,你英語(yǔ)水平很好,不可能寫(xiě)錯(cuò)。。好吧,我錯(cuò)了),而且只在局部用到,這時(shí)候用Lambda函數(shù)太棒了。Lambda函數(shù)是匿名函數(shù),沒(méi)有名字。 形式:>>>m=lambda a,b:a+b >>>m(5,4) 9 lambda 參1,參2,...:表達(dá)式 (注意縮進(jìn),否則會(huì)出現(xiàn)unexcepted error) 幾個(gè)特殊的函數(shù) 1.filter(函數(shù),可迭代對(duì)象如列表等),他是個(gè)過(guò)濾器,列表中的符合函數(shù)規(guī)則的元素過(guò)濾出來(lái),以列表形式返回。 如:def mod1 (a): return (a%2==0) list2=filter(mod1,range(1,10)) print list2 --> [2, 4, 6, 8] 2.map(函數(shù),可迭代對(duì)象如列表等),其的作用是對(duì)整個(gè)列表的元素進(jìn)行檢查是否滿足函數(shù),并且以列表形式返回True或False 如 def mod1 (a): return (a%2==0) list3=map(mod1,range(1,10)) print list3 [False, True, False, True, False, True, False, True, False] 3.reduce(函數(shù),可迭代對(duì)象如列表等),其可以實(shí)現(xiàn)連續(xù)處理功能。其作用是先把列表中第一個(gè)值和第二個(gè)值當(dāng)參數(shù)傳給function,再把function的返回值和第三個(gè)值當(dāng)參數(shù)傳給function,然后只返回一個(gè)結(jié)果。 話不多說(shuō),給個(gè)例子吧 計(jì)算1+2+3+...+100 python里就一句話 a=reduce((lambda x, y:x+y),range(1,101)) print a -->5050 (好吧,我錯(cuò)了,寫(xiě)了兩句。。) 首先將range(1,101)即列表(1,2,...,100)的第一個(gè)元素1,和第二個(gè)元素2,拿出來(lái)進(jìn)行+運(yùn)算,再把返回值3和列表中的第三個(gè)元素3相加,然后把返回值6再與列表中第四個(gè)元素4相加。。如此不斷下去,直至全部加完為止。如果用C的話,大概要十行吧。。 將上訴例子的+換成*就可以計(jì)算100!,very easy吧??梢栽囋囉?jì)算10000!來(lái)測(cè)試你的機(jī)器性能啊,我的機(jī)器只能算到1w!了,10w!等幾分鐘都不會(huì)出結(jié)果。。 這里有一個(gè)求素?cái)?shù)的代碼,如果是C/C++的話,起碼二十行吧,這里也是一行 0~100的素?cái)?shù)代碼: print [x for x in range(1,101) if not [y for y in range(2,x/2+1)if x%y==0]] 異常 1.try和except 類似if和else,如果未發(fā)生錯(cuò)誤,先執(zhí)行完try塊中的代碼,并完全跳過(guò)except,若發(fā)生錯(cuò)誤,則跳到except塊開(kāi)始執(zhí)行代碼,稱為“異常被捕獲了”。注意:try代碼塊只執(zhí)行到第一句發(fā)生錯(cuò)誤的代碼 try: ①x=1/0.3 ②print ''reciprocal of 0.3 is'',x ③x=1/0.0 ④print ''receprocal of 0.0 is'',x except: ⑤print ''error: no reciprocal'' ⑥ ... 執(zhí)行順序:①②③⑤⑥ 在try/except后可添加else塊,來(lái)告訴python在無(wú)異常時(shí)發(fā)生的事。 注意:只有try中所有代碼被正確執(zhí)行,才會(huì)執(zhí)行else塊中的代碼。 2.異常對(duì)象 python在引發(fā)一個(gè)異常后,會(huì)創(chuàng)建一個(gè)用于存放錯(cuò)誤信息的對(duì)象,可以在except中指定具體的異常 values=[-1,0,1] for i in range(4): try: r=1.0/values[i] print ''reciprocal of'',values[i],''at'',i,''is'',r except IndexError: print ’Index'',i,''out of range'' except ArithmeticError: print ''unable to calculate reciprocal of'',values[i] 如果要知道具體的異常,可以把異常賦給變量 except IndexError,e: print ''error:'',e 3.自己引發(fā)異常,通過(guò)raise def divide(top,butttom): if buttom==0: raise ValueError(''divisor is zero'') else: return top/bottom for i in range(-1,2): try: print divide(1,i) except ValueError,e: print ''Caught except for'',i 面向?qū)ο缶幊蘋(píng)OP 1.類中的方法至少有一個(gè)參數(shù)self,函數(shù)前都有def,沒(méi)有返回值類型,這一點(diǎn)太棒了,直接在末尾return 任何東西都可以,返回字符串啊,甚至是列表,還可以是一句話。。如果在C/C++中那肯定要跪,你肯定要寫(xiě)很多其他的東西才能實(shí)現(xiàn)該功能。 一些內(nèi)置函數(shù): def __init__(self,a,b,c): self.a=a self.b=b self.c=c 因?yàn)閜ython會(huì)自動(dòng)將對(duì)象本身的引用當(dāng)做參數(shù)傳給方法的第一個(gè)參數(shù),類似的還有 def __str__(self): return ''...'' (此函數(shù)是類中的輸出函數(shù),最好用return把。。) 實(shí)例化直接傳參就可以了 如:time1=Time(10,2,45) 2.運(yùn)算法重載 python中的運(yùn)算符重載比C++中簡(jiǎn)單多了。。直接在類中傳遞一個(gè)self,還有另一個(gè)參數(shù)即可。適用于單目和雙目運(yùn)算符的重載 例如重載實(shí)例: def __add__(self,other): #reload std return "%s : %s : %s" %(self.hour +other.hour,self.minute+other.minute,self.second+other.second) def __lt__(self,other): # "<" pass def __call__(self,index): # __builtin__ "()" reload if (index=="Hour"): print "~~" else: print ".." def __getitem__(self,index): #__builtin__ "[]" reload return index *2 注意重載的運(yùn)算法只能在類的實(shí)例中使用 3.類的繼承 class People: def __init__(self,num,name): #成員變量初始化函數(shù) self.num=num self.name=name ... class Teacher(People): def __init__(self,num,name,colledge): People.__init__(self,num,name) self.college=college 只有在很復(fù)雜的情況下才會(huì)用到私有繼承,默認(rèn)是共有繼承,直接把父類放入括號(hào)中,若有多個(gè)父類,用逗號(hào)隔開(kāi) GUI圖形用戶界面 1. 利用 Tkinter 模塊 from Tkinter import * import Tkinter as tk (這樣寫(xiě)后面的Tkinter就可以用tk替代) import sys (用于導(dǎo)入退出程序的函數(shù)等,如sys.exit()) 一些插件: Button,Canvas,Checkbutton(復(fù)選框),Radiobutton(單選框),Entry(單行文本框),Text(多行文本框) Label(顯示文本的單個(gè)行),Listbox(下拉列表),Menu(下拉菜單),Message(顯示文本多個(gè)行) ======================================================================================================================== Label Label是最簡(jiǎn)單的插件,顯示一小條文本,需置入父插件中 from Tkinter import * window=Tk() label=Label(window,text=''hello'').pack() 首先得先制造處窗口,通過(guò)tk.Tk()即可,然后所有的子插件都嵌套在window中。對(duì)window這個(gè)窗口可以進(jìn)行設(shè)置,通過(guò) window.geometry("300x400+120+100") #windows'' scale and its positionwindow.title("This is just a window...") 注意geometry內(nèi)是字符串,第一個(gè)是length,第二個(gè)是width,之間用x(不是乘號(hào),而是字母x),接下來(lái)第三第四個(gè)是窗口左上角的位置坐標(biāo),用加號(hào)連接。 2.要注意插件的配置一旦確立,若要更改則需用config方法修改插件的很多屬性 這里有一個(gè)動(dòng)態(tài)顯示Label文本的方法 ... import time ... label=Lable(window,text=''Hello'') time.sleep(2) label.config(text=''Kitty'') 3.要讓插件的值發(fā)生變化,可以用可變類型來(lái)實(shí)現(xiàn) 共有四種:IntVar(),StringVar(),BooleanVar(),DoubleVar() 可變類型的值是通過(guò)set和get方法來(lái)設(shè)置和獲取的。 from Tkinter import * window=Tk() data=StringVar() data.set(''Data to display'') #設(shè)置初始值 label=Label(window,textvariable=data).pack() window.mainloop() 4.上面的是把插件直接一股腦的丟進(jìn)window一個(gè)窗口上,為了更好的安排插件的位置,可以利用Frame(框架)來(lái)將一些插件置于frame內(nèi),其實(shí)就是在窗口畫(huà)出一個(gè)框來(lái)。 顯然,將插件置于frame框中只需將window改成frame即可 如:frame=Frame(window).pack() first=Label(frame,text=''first Label'').pack() 有時(shí)候第一個(gè)說(shuō)明父插件的參數(shù)可以省略。默認(rèn)是window 5.可以將frame修改參數(shù)讓其可見(jiàn),修改boardwidth(默認(rèn)為0)值即可。同時(shí)可以更改樣式relief,改成‘ sunken’,‘raised’,‘groove’等,這些屬性在其他的一些插件如Entry,Text中也有。 6.一些其他的樣式處理 eg: label=Label(window,text="hello",bg=''green'',fg=''white'',font=(''Curier'',14,''bold italic'').pack() bg是background,設(shè)置背景顏色,fg是fontground ??設(shè)置字體顏色。bold是粗體,對(duì)應(yīng)的normal是細(xì),italic是斜體,roman是不傾斜的。 7.插件的布局 可以看到所有的插件都會(huì)有.pack(),當(dāng)然window就沒(méi)有了。pack函數(shù)是將子插件置入父插件中,父插件是傳入的第一個(gè)參數(shù),pack內(nèi)可傳入side=‘left’等參數(shù),從而確定該插件的具體安放位置。 另一中方法是grid(row=100,column=100),用于確定具體的網(wǎng)格以便與安放插件。 但兩種方法不可以混用。 8.函數(shù):更好的實(shí)現(xiàn)交互 為了實(shí)現(xiàn)某些插件(如按鈕等)的功能,需要用到函數(shù) .(...,command=函數(shù)名)即可。注意:等號(hào)后面的函數(shù)是不允許帶參數(shù)的,目的是以同一種方式調(diào)用他們。 如: from Tkinter import * window = Tk() counter=IntVar() counter.set(0) #設(shè)置計(jì)數(shù)器初值 def click(var,value): var.set(var.get()+value) frame=Frame(window) frame.pack() button1=Button(frame,text="Up",command=lambda:click(counter,1)).pack() button1=Button(frame,text="Down",command=lambda:click(counter,-1)).pack() label=Label(frame,textvariable=counter).pack() window.mainloop() 上面的代碼功能:通過(guò)點(diǎn)擊“Up”和“Down”兩個(gè)按鈕來(lái)實(shí)現(xiàn)對(duì)計(jì)數(shù)器counter的加1或減1操作,并將counter的值傳給Lable的textvariable,從而在label中顯示。 在 click函數(shù)中,有兩個(gè)參數(shù),其中形參Var會(huì)由實(shí)參IntVar型的counter代替,value則會(huì)被1或-1代替。 在前面說(shuō)過(guò)command后面的函數(shù)是不帶參數(shù)的,故這里用lambda函數(shù),否則你就要寫(xiě)連個(gè)command=clickup,command=clickdown。lambda函數(shù)是沒(méi)有名字的函數(shù),常用于定義動(dòng)作,可以避免全局變量的使用。 9.其他一些插件 ① Text text=Text(frame,heigth=10,width=10).pack() Text插件還有很多其他的方法,這里略去 ②Checkbutton checkbutton=Checkbutto(frame,text=''...'',variable=...).pack() ③ Radiobutton Radiobutton(root, text = j, value = i,variable = food).pack() ④Scale 進(jìn)度條 scale = Scale(root , from_= 1, to = 20 ,resolution = 1 ,orient=''horizontal'',variable = speed) scale.pack(side = "left") 注意:Scale插件中是 from_=下限,to=上限,resolution是精度,orient 來(lái)定義橫放豎放,默認(rèn)是豎放。 ⑤ tkMessageBox 這是彈出一個(gè)新的對(duì)話框,前面需有import tkMessageBox tkMessageBox.askquestion("Who is Naruto?"," A main role in a famous cantoon",icon = "warning") 最后附上自己寫(xiě)的第一個(gè)GUI程序源碼,第一次寫(xiě),雖然很挫,功能很少,有很多界面上的功能都是騙人的。。但還是不加修改的直接拿上來(lái)了,權(quán)當(dāng)紀(jì)念一下我的8天python之旅吧。。 # -*- coding:UTF-8 -*- import Tkinter as tk from Tkinter import * import sys import tkMessageBox root=tk.Tk() root.geometry(''300x440+200+330'') root.title("Your Favorite Person") _nameNum=IntVar() wordsAC = StringVar() points=StringVar() wordsinput=StringVar() def _chooseBox(): tkMessageBox.askquestion(" ","You should click OK not this button...",icon="warning") print _nameNum.get() def _wordAfterChoosing(): tkMessageBox.askquestion("Your choose",''Waw,I like the role too!'',icon="warning") #第一行是標(biāo)簽,第二行是輸出 def authorDisplay(): tkMessageBox.askquestion("Your choose",''Yan Chuan'',icon="warning") def Advice(): tkMessageBox.askquestion("Advice",''Your advice have already sent to the Author Haha, I lied to you!'',icon="warning") def Points(): print points.get() def textBox(): print wordsinput.get() tk.Label(fg=''purple'',text=''Who is your favorite?'').pack() tk.Button(fg=''blue'', text=''please choose yours'',command=_chooseBox).pack() namelist=[''Naruto'',''Sasuke'',''Sakura'',''Haku '',''Tsunade'',''Gaara '',''Itachi '',''Others''] for i ,j in enumerate(namelist): tk.Radiobutton(root,fg=''blue'',text=j,value=i,variable=_nameNum).pack() tk.Button(fg=''red'',text=''OK'',command=_wordAfterChoosing).pack() tk.Button(fg=''red'',text=''Author'',command=authorDisplay).pack(side=''left'') tk.Button(fg=''blue'',text=''Advice'',command=Advice).pack(side=''left'') tk.Label(fg=''red'',text="Please give a point for the software").pack() scale=Scale(root,from_=1,to=5,resolution=1,orient=''horizontal'',variable=points).pack() tk.Entry(relief="sunken",textvariable=wordsinput).pack() Button(fg="blue",text="submit",command=textBox).pack() tk.Button(fg="red",text=''exit'',command=sys.exit).pack() tk.mainloop 最后如果發(fā)現(xiàn)錯(cuò)誤,還請(qǐng)大家提一下,畢竟水平有限。對(duì)了,忘記說(shuō)了,電腦同時(shí)可以安裝python2和python3的。。。你可以兩個(gè)同時(shí)玩。。 |
|