2007年8月26日 星期日

初識 Python

昨天早上 Survey 了一下 Python ,發覺 Python 和 Perl 的哲學比較起來,是兩種對比。

Python 設計的很簡潔,怎麼說呢? Python 把分號拿掉了,並且嚴格限制縮排,此外 {,} 也拿掉了,所以語法很清晰,不用花精力在調整括號的排版,也不會有差異太大的 Coding Style。除此之外,物件導向方面設計的比較完善,譬如說

"String1".startswith("Str")

同樣的語法在 Perl 裡頭就無法做到了。

Python 相較於 Perl ,Perl 強調的是自由度,甚至自由到能夠改變剖析的語法,另外 perl 走的哲學就是 『條條大路通羅馬』一種目的可以用多種方式達到,可以很寫的很髒 - 可寫不可讀,或者寫的很精緻。 Perl 也提供很多的方便性,譬如樣式比對可由自己想要的字元取代雙引號,如此一來可以避免過多的跳脫的反斜線,像是 rx{ls},qq/String/,q-String- ;呼叫函數可以加上圓括號或是不加也可等等,透徹的利用很多特殊符號來達到簡略迅速的寫法。

目前的 Perl 最大的一個缺點就是在物件導向方面不大自然,要透過 bless 函數利用 reference 的方式達到物件導向的目的,所以語法上比較不是這麼的簡潔,如下範例 ( 取自 WWW-Mechanize-1.30-jFIVC5 的 Image.pm :
package WWW::Mechanize::Image;

...略

sub new {
my $class = shift ;
my $parms = shift || {} ;

my $self = {};

for my $parm ( qw( url base tag height width alt name ) ) {
$self->{$parm} = $parms->{$parm} if defined $parms->{$parm};
}

return bless $self, $class;
}
你可以發現要透過 shift class , 接著要實作一個雜湊參照,接著利用 bless 使他成為物件,最後傳回。

Perl 在傳遞參數方面也是有些累贅,得利用 shift 或是 @_ 來取得參數。不過以上問題在 Perl 6 都會有革命性的改進,想更進一步瞭解可以參考 Perl 6 Synopses

Python 在這方面顯得精簡許多,如下範例 ( 取自 Simple Sample of Python )
class PrinterFormatter:
def __init__(self, filename, page_len=58):
# Save the time of creation for inclusion in the header
import time
self.now=time.asctime(time.localtime(time.time()))

.... 略

def write_header(self):
# If the header for this page has just been written, don't
# write another one.

.... 略
由於省略了大括號,只利用冒號代表接續的敘述,強迫縮排,參數傳遞的寫法也比較乾淨。簡單的說, Python 在語法的限制比較高,不過也因為如此而能夠將程式碼的可讀性提高。

另外發覺 Python 與 Application 的 binding 也都不錯,而 Perl 的模組量多非常豐富、範圍較廣。所以各有其優缺點。

以上,初步認識 Python 之感想。如有錯誤煩請指正,小弟懂的不多,請多多指教,謝謝。 :-)