標籤:python與perl python學習技巧
一:Python 與 Perl對比
(1)設計一個語言的初始目的決定了該語言將會內建什麼功能:
perl初始是Larry為了格式化處理文本而建立的,所以內建了正則 ;python內建一個複數型別,猜測Guido最初一定是為了數值計算而建立了python。因此perl擅長文文書處理,python擅長數值處理。
(2)應用領域和需求不一樣:
Perl 設 計之初就是為了方便編寫複雜高效的系統指令碼,它也是應該最為廣泛的指令碼程式設計語言。它在編程方面相當於瑞士軍刀,對字元、文字檔處理能力很強,以前要求 shell+sed+awk+C才能完成的任務,只需perl指令碼就可以完成了。而且應用領域一直在拓寬,支援物件導向程式設計。
Python 物件導向的動態公用語言,適於指令碼編程和快速開發,它最顯著的特點是作為編譯語言(如C)和指令碼語言(如perl)之間的橋接語言,它具有的強大功能,可擴充性及物件導向的特徵使其成為大規模應用程式開發工具。
(3) 關於強型別
Perl語言中,資料的類型,取決於資料所處的上下文。
Python語言中,資料類型,是資料自身確定的。Python因此一般被認為是強型別語言,而Perl則不是。
(4)關於 內建基礎類型
Perl的基礎類型叫做scalar,這是為了和後面的array和hash做區別。scalar可以是數字,也可以是字串。基本上說,scalar非此即彼;換句話說,scalar既是數字,又是字串。scalar到底是字串,還是數字,完全取決於使用scalar的上下文,如果是一個處理字串的函數,那麼它是字串;如果是一個處理數位函數,那麼它是數字。Perl會盡一切努力完成它們之間的轉化,無論在你看來有多麼荒誕。 Perl中,所有scalar都以$開頭,所有以$開頭的都scalar。
Python的基礎類型,同樣,不是數字,就是字串。但是,不可能既是數字,又是字串。Python會判斷變數到底是數字,還是字串,以此來選擇怎麼解釋函數;如果它找不到一個合適的解釋,那麼Python會拋出異常。一般來說,這種策略能夠取悅一部分程式員,同時讓另外一部分人感覺很不爽。
(5)關於複合類型
Perl有兩種複合類型:array和hash。Python有三種複合類型:tuple, list, dict。 Python中的tuple+list,完全對應於Perl中的array;因此不存在誰提供的類型更豐富這樣的問題。
(6)關於做為整體的list
Perl中,用@開頭的名字表示整個array,據說是因為@是array的字頭。但是,又根據Perl的原則,@foo這樣的array也可以被使用到一個需要scalar的環境中去,Perl會儘力把@foo轉換成一個scalar,一般來說,這個scalar就是@foo的長度。 Python中,直接使用變數名,就能獲得整個list(或者tuple)。
二:Python初探
(1)下面讓我們一步一步的走進Python的世界
(2)技巧簡介
1 ---python 指令碼運行,下面用的是在cmd下啟動並執行
2--- python控制台上的輸入輸出
3 – 萬惡的“:”代替了{ } 太牛逼了,語句的組織依賴於縮排而不是begin/end塊;所以縮排一定要控制好;
4-- 不需要變數或參數聲明,拿來就用
5-- Python可以寫出很緊湊和可讀性很強的程式。用Python寫的程式通常比同樣的C或C++程式要短得多
6-- 主提示符來執行,主提示符通常標識為三個大於符號(“>>> ”);繼續的部分被稱為從屬提示符,由三個點標識(“...”)。連續兩個斷行符號就可以結束從屬提示符,變為通常標示符>>>
7-- Python指令碼可以像Shell指令碼那樣直接執行,只要在指令檔開頭寫一行命令,指定檔案和模式:
#! /usr/bin/env python
(將使用者路徑通知解譯器) “#!”必須是檔案的前兩個字元,在某些平台上,第一行必須以Unix風格的行結束符(“\n”)結束,不能用Mac(“\r”)或Windows(“\r\n”)的結束符。注意,“#”是Python中是行注釋的起始符。
8--
Python的源檔案可以通過編碼使用 ASCII 以外的字元集。 最好的做法是在 #! 行後面用一個特殊的注釋行來定 義字元集。
# -*- coding: iso-8859-1 -*-
根據這個聲明,Python會將檔案中的字元儘可能的從指定的編碼轉為Unicode,在本例中,這個字元集是iso-8859-1。在 Python庫參考手冊中可以找到可用的編碼列表(根據我的實驗,中文似乎只能用cp-936或utf-8,不直接支援GB,GBK,GB-18030或ISO-10646--譯者注)。
9-- pass語句什麼也不做。 if exp: elif exp: else:
它用於那些文法上必須要有什麼語句,但程式上什麼也不要做的場合,例如:
>>> while True:
... pass # Busy-wait for keyboardinterrupt
...
if n > 0:
sum = 1;
elif n == 0:
sum = 0
else:
sum = -1;
10 -- 定義函數
關鍵字def 引入了一個函數定義。在其後必須跟有函數名和包括形式參數的圓括弧。函數體語句從下一行開始,必須是縮排的。函數體的第一行可以是一個字串值,這個字串是該函數的 文檔字串,也可稱作docstring。
有些文檔字串工具可以線上處理或列印文檔,或讓使用者互動的瀏覽代碼;在你的代碼中加入文檔字串是一 個好的作法,應該養成習慣。
11--通過lambda關鍵字,可以創 建很小的匿名函數
通過lambda關鍵字,可以創 建很小的匿名函數。這裡有一個函數返回它的兩個參數的和:“lambdaa, b: a+b”。Lambda形式可以用於任何 需要的函數對象。出於文法限制,它們只能有一個單獨的運算式。語義上講,它們只是普通函數定義中的一個 文法技巧。
12 --
del語句
有一個方法可從鏈表中刪除指定索引的元素:del語句。這個方法也可以從鏈表中刪除切片(之前我們是把一個空鏈表賦給切片)。例如:
>>> a = [-1, 1, 66.6, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.6, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.6, 1234.5]
del 也可以用於刪除整個變數:
>>>del a
三:實戰篇
#coding=utf-8#!/usr/bin/pythonimport xml.sax# 繼承文法 class 衍生類別名(基類名)://... 基類名寫作括弧裡,基本類是在類定義的時候,在元組之中指明的。 class MovieHandler( xml.sax.ContentHandler ): def __init__(self): self.CurrentData = "" self.type = "" self.format = "" self.year = "" self.rating = "" self.stars = "" self.description = "" # 元素開始事件處理 def startElement(self, tag, attributes): self.CurrentData = tag if tag == "movie": print "*****Movie*****" title = attributes["title"] print "Title:", title # 元素結束事件處理 def endElement(self, tag): if self.CurrentData == "type": print "Type:", self.type elif self.CurrentData == "format": print "Format:", self.format elif self.CurrentData == "year": print "Year:", self.year elif self.CurrentData == "rating": print "Rating:", self.rating elif self.CurrentData == "stars": print "Stars:", self.stars elif self.CurrentData == "description": print "Description:", self.description self.CurrentData = "" # 內容事件處理 def characters(self, content): if self.CurrentData == "type": self.type = content elif self.CurrentData == "format": self.format = content elif self.CurrentData == "year": self.year = content elif self.CurrentData == "rating": self.rating = content elif self.CurrentData == "stars": self.stars = content elif self.CurrentData == "description": self.description = content if ( __name__ == "__main__"): # 建立一個 XMLReader parser = xml.sax.make_parser() # turn off namepsaces parser.setFeature(xml.sax.handler.feature_namespaces, 0) # 重寫 ContextHandler Handler = MovieHandler() parser.setContentHandler( Handler ) parser.parse("movies.xml") def foo(bar=[]): # bar是選擇性參數,如果沒有指明的話,預設值是[]bar.append("MKY"); # 但是這行可是有問題的,走著瞧…return bar;print foo()print foo()odd = lambda x : bool(x % 2)nums = [n for n in range(10)]nums[:] = [n for n in nums if not odd(n)] # 啊,這多優美print nums
本例子主要是針對 SAX_XML讀取,以及函數的定義參數預設值 和 lambda匿名函數的應用
Python 與 Perl的優缺點