(一)我(非初學者)學Python的方法
在正文開始之前,我先說說自己學Python的方法。接觸了不少語言了,但我寫的代碼90%都是C,加上一些計算機的基礎知識,所以我這個家伙也就勉強算是個非初學者吧。我這里說的,就是針對非初學者學習Python的方法,或者說也可以推廣為非初學者學習一門新語言的方法了,嘿嘿,咱寫程序的,抽象能力得好是不?閑話不多說。首先,得找一本python入門的經典書,在網上搜搜,我讀書,只讀經典。我選的是《Beginning Python From Novice to Professional 2nd Edition》。然后,看書,先看前言,要先知道本書的針對人群以及一些版塊的功能,還可能有一些學習方法,擴展資料等。一本書的前言很容易被人忽略,但有時候前言中會包括一些很重要的信息,有點像磁盤的分區表,路由器的轉發表之類的。
接着,就是閱讀正文了(這里感謝一下博客園團隊教我的用兩個全角空格排版的方法,非常的實用)。入門級的書籍一般都是針對沒有基礎的初學者設計,既然我們不是初學,有很多理論已經明白,比如變量啊,數據類型什么的,這些東西就沒必要細看了。我們所關注的應該是:語法,常用數據結構,還有一些Python語言比較特殊的地方。我的方法就是,直接略過文字,看例子程序,如果能夠看懂,就在機器上對例子程序進行變幻,試試結果,沒問題就繼續看,如果例子程序沒看懂或者程序結果和我想的不一樣,再停下來看文中的描述。這樣通看全書例子我覺得有幾個好處:1.不漏掉一些雖然簡單但是很重要的語言細節。比如 1,2 是聲明一個元組,但print 1,2卻會打印出1 2.以前我就吃過這樣的虧,花了5分鍾看完了shell的語法,然后就去看小的project,結果在很多地方卡住,到處找資料,結果卻發現很多問題都是基本的語法問題,在書中的例子中都體現的很清楚。雖然通看全書會多花不少時間,但這絕對是厚積薄發的前提。2.通過大量代碼示例感受這種語言的代碼風格。3.花費很小的代價了解很多基本函數。這也就省去了一些查函數文檔的時間。基於這3個原因,所以我最喜歡那種代碼與文字描述並重的書。
看完例子,就可以看project了,實戰很重要!很高興《Beginning Python From Novice to Professional 2nd Edition》這本書中就有很多小的project,所以也就又省下很多時間了。磨刀不誤砍柴功,可以開始暢游python了。
(二)Python簡介
Python很自由,語法簡單,函數庫多,我最喜歡Python的就是它的縮進,哈哈,全都要靠縮進來解釋。對於我這種只愛讀清晰代碼的人來說簡直太棒了。
先把一些需要注意的基礎給列出來:
1.'/'除號與c不同,單個'/'是浮點除,兩個除號'//'才是整除,而且整除也適用於浮點數,比如3.5//2.2,結果是1.0。
2.乘方的符號是**,兩個乘號,太好玩了。
3.Python直接就支持大整數運算,我還用C寫過大整數的運算算法,好長的。
4.輸入用input,輸出用print ,這兩個東西都非常靈活,也很好玩。
5.模塊,有點類似於頭文件,from math import sqrt,這樣就可以直接用sqrt函數了。我記得我一哥們讀中學的時候,做解方程的題,一個大題下有10個小題,老師要求每個題都寫個"解:原式=",然后,那哥們直接就打個大括號,在括號外面寫了個很大的"解:原式="。現在想想,真實有異曲同工之妙啊!這里的math就是那個"解:原式="。
6.string可以用單引號括起來,也可以用雙引號,沒什么區別。當然不能單引號,雙引號混用,會有syntax error,這是我試過的,我記得我學shell時也試過,哈哈,天性啊!前段時間用C寫了個簡易的shell,我只想到用宏替換來實現單引號和雙引號的混用,但這樣會有問題,比如python中' "happy every day" yes '就會出現混亂的情況。但我現在還沒想到更好的辦法。三個引號用於一個string分成多行來寫。
(三)常用數據結構----list(列表)
list是一種線性的結構,類似於C中的數組,但方法比數組更多。通過對list的一些方法的調用可以實現棧,隊列等常見的線性數據結構,可見list是非常靈活的。以下是我總結的list的基礎知識點以及一些值得注意的地方:
1.list可以被修改,包括添加,刪除,段添加,段刪除等,方法很多,運用很靈活。至於具體的函數到處都可以查到,我就不贅述了。
2.list中的元素,類型可以不一樣。比如 list1=['neilhappy',123]。這一點就與c中的數組,c++中的容器有區別了,這兩者在聲明過后,容器中的數據類型都是相同的。
3.list可以通過下標來訪問。比如:list1=['a','b','c'],那么list1[0]='a'。還可以訪問一段元素,比如list1[0:2],是一個半開半閉的區間,左閉右開,所以結果是['a','b']。還可以加一個參數表示遞增的數目:list1[0:2:2],跟matlab很類似。還有一點令我很驚喜,list還可以用負數下標來訪問。list1[-1]代表最后一個元素,即'c'。這下strlen,sizeof等函數都可以略微休息下了。
4.string與list的區別。當然,string可以作為list的元素,更重要的是,string可以直接相連:"neil""happy"。但是list必須要有個+號:['neil']+['happy'],結果是['neil','happy']。這一點需要注意一下。
5.list的乘法。這又是我很喜歡的一個特性。以往聲明c的數組時:int a[100]={1,2,3,4,5,5,5,5,5,5},好幾個5,數的眼花,這下好了,在python中:a=[1,2,3,4]+[5]*6。哇,世界清靜了。
(四)常見數據結構----tuple(元組)
tuple與list非常類似,但tuple就像一個被嚴重限制的list,不准動(被更改),不准變強大(有很多methods),聲明方法是tuple1=(1,2,3)或者tuple1=1,2。訪問方法與list類似,不再贅述。
(五)常見數據結構----dictionary(字典)
dictionary,實際上就是一組mapping,一種散列的思想。需要注意的知識點:
1.形式。dict1={'name':'neil'}。這里的'name'就是key,'neil'就是value。dictionary就是一些key-value鍵值對的集合。
2.淺copy與deepcopy。與c++基本類似,淺copy就相當於copy指針,而deepcopy就是在copy指針的同時還要分配相應的內存空間。
3.訪問方法:dict1['name']的結果就是'neil'。注意,在dictionary中沒有order的概念,所以就不能像list一樣用數字下標去訪問,得用key去訪問。
(六)三種數據結構的區別與聯系
python中的容器可以隨意的互相包含,這三種數據結構也是如此。list,dictionary可以進行修改,而tuple,string都不能修改,但dictionary的key又必須是不可修改的,即tuple,string。想像一下如果字典的索引都在隨意修改會發生什么?
三種數據結構的聲明一定要注意,括號不同,數據結構就不同。list:list1=['neil','happy'],這里是方括號。tuple:tuple1=('neil','happy'),這里是圓括號。dictionary:dict1={'name':'happy'},這里是大括號。這里很容易就寫錯,有可能會造成比較難找的bug.
(七)常見數據類型----string
我記得Peter Weinberger說過:"所有的C程序都做同一件事,觀察一個字符,然后啥也不干"。可見string的重要性。也跟上面一樣,直接寫出我的總結和需要注意的地方。
1.string的訪問方法與list,tuple基本一樣,string也和tuple一樣,不允許修改,但string的方法比tuple強大的多。函數太多,不一一敘述了。
2.用%來進行string的格式化輸出。其實與C也沒什么太大的區別。
>>> str1="%s %s every day" >>> name=('neil','happy') >>> print str1 % name neil happy every day
(八)基本語句
沒什么其他說的,直接寫吧:
1.print 1,2,3。這個很好玩,打印出1 2 3 。注意有空格。
2.print a or b.這個語句就相當於if(a!=0){print a};else{print b};極盡簡化,太美妙了。
3.unpack機制:很美妙的機制,在我學C的時候我就想,能否一個函數返回多個值,哈哈,python幫我實現了。
>>> tuple1=(3,2,1) >>> x,y,z=tuple1 >>> x,y,z (3, 2, 1)
4.縮進來斷句,我覺得這是python的精華啊。
5.控制語句:if,elif,else,for,while,break,continue,基本與shell類似,只是要多個冒號,少個括號,多了縮進。簡單介紹一下就可以了。
if statement1: print something1 elif statement2: print something2 else: print something3
6.x is y.判斷x,y是否為同一個對象。舉個例子,一目了然。x==y判斷x,y是否相等,但相等的兩個對象不一定是同一個對象。
>>> x=[1,2,3] >>> y=[1,2,3] >>> x==y True >>> x is y False
7.x in y.判斷x是否在y中。很簡單,但很實用。
8.循環中的else語句。當我們想判斷一個序列中沒有一個數時,用循環常常需要添加一個標志變量來做到,比如:
values=[1,2,3,4,5] flag=1 for x in values: if x==6: flag=0 break if flag==1: print "No!"
如果改成這樣for中的else:
values=[1,2,3,4,5] flag=1 for x in values: if x==6: flag=0 break else: print "No!"
我感覺很是奇妙。
9.list中用for:
>>> [x*x*x for x in range(1,5)] [1, 8, 27, 64]
(九)學習過程中的一些筆記和注意事項(英文來自《Beginning Python From Novice to Professional 2nd Edition》)
最后是一些我學習中的筆記和注意事項,比較散,但我覺得比較有用。
1.空值有多種表現形式:False,0,None,"",{},[],()。
2.Remember the Python motto of learning: use the source (which basically means read all the code you can get your hands on) .多看源代碼。
3.Blocks are indicated through indentation, and only through indentation in python.
4.縮進斷句使得代碼風格比較固定。
5.Make sure your comments say significant things and don’t simply restate what is already obvious from the code.寫注釋,絕對不寫廢話,絕對不簡單重復代碼所表達的意思。
6.any object can contain other objects
7.If a function call returns a sequence, you can index it directly.
8.要注意list的方法是否修改了list本身,是否具有返回值。這個只有多用才能有較深的印象。
9.python的強類型與java,c等強類型的比較。python,str1=1,還可以str1="aaa"。但是在c中,int a=1.1會直接截斷小數部分。
10.
>>> 'ad c d'.translate(table,'c') 'cd d' 注意這里刪除'c'是先刪除'c',然后再進行替換
11.print u'ærnæringslære' 前面加個u是使用unicode編碼
12.在dictionaries 中,in操作符只能用於key而不能用於value.
13.Checking for key membership in a dictionary is much more efficient than checking for membership in a list. The difference is greater the larger the data structures are. 但我不明白這是為什么
14.在python中,交換兩個數是如此的簡單,x, y = y, x 而三個數的交換本質上還是要用兩個數的交換去完成.
15.變量都需要先賦值才能使用。這也是python強類型的一個標志?
(十)小結
以上是小弟我對python的一些基礎知識的總結,由於小弟我水平有限,如果有錯誤,請您指出來,非常感謝。
參考資料:《Beginning Python From Novice to Professional 2nd Edition》