Python 與 Perl的優缺點

來源:互聯網
上載者:User

標籤: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的優缺點

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.