天天看點

Python學習總結(一)

 (一)我(非初學者)學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也沒什麼太大的差別。

?

 (八)基本語句

  沒什麼其他說的,直接寫吧:

  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幫我實作了。

  4.縮進來斷句,我覺得這是python的精華啊。

  5.控制語句:if,elif,else,for,while,break,continue,基本與shell類似,隻是要多個冒号,少個括号,多了縮進。簡單介紹一下就可以了。

  6.x is y.判斷x,y是否為同一個對象。舉個例子,一目了然。x==y判斷x,y是否相等,但相等的兩個對象不一定是同一個對象。

  7.x in y.判斷x是否在y中。很簡單,但很實用。

  8.循環中的else語句。當我們想判斷一個序列中沒有一個數時,用循環常常需要添加一個标志變量來做到,比如:

  如果改成這樣for中的else:

  我感覺很是奇妙。

  9.list中用for:

(九)學習過程中的一些筆記和注意事項(英文來自《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.

  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》