乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Perl 與 Python 之間的一些異同

       閱文書(shū)苑 2014-09-30

      關(guān)于 Perl 與 Python 的起源和特點(diǎn)

      Perl 是 Practical Extraction and Report Language 的簡(jiǎn)稱,由 1987 年 Larry Wall 創(chuàng)建,最初的目的是為了在 UNIX 上方便處理報(bào)表,經(jīng)過(guò)長(zhǎng)期的發(fā)展已經(jīng)成為一種全功能的程序設(shè)計(jì)語(yǔ)言,當(dāng)前最新的版本為 Perl5.14.1,Perl 作為一種自由而強(qiáng)大的編程語(yǔ)言,其中心思想是: There's More Than One Way To Do It。(不只一種方法來(lái)做這件事 ),即「 Tim Toady 」。作為一種“膠水型”語(yǔ)言,它具有強(qiáng)大的正則表達(dá)式和模式匹配功能以及靈活的數(shù)據(jù)結(jié)構(gòu),如動(dòng)態(tài)數(shù)組、Hash 等,在語(yǔ)法規(guī)則上借鑒了 C/C++、Basic、Pascal 等語(yǔ)言,其不足之處在于存在一些冗余語(yǔ)法,代碼的可讀性較差。

      Python 是一種基于面向?qū)ο蟮慕馕鲂越换ナ降拈_(kāi)源編程語(yǔ)言,它起源于 1989 年末由 CWI(阿姆斯特丹國(guó)家數(shù)學(xué)和計(jì)算機(jī)科學(xué)研究所)的研究員 Guido van Rossum 創(chuàng)立,1991 年初公開(kāi)發(fā)行,其開(kāi)源式的發(fā)行方式促進(jìn)了 Python 的較快發(fā)展,目前已經(jīng)形成了一個(gè)強(qiáng)大的社區(qū)力量。Python 開(kāi)發(fā)者的哲學(xué)是“用一種方法,最好是只有一種方法來(lái)做一件事”。Python 具有簡(jiǎn)單易學(xué)、代碼規(guī)范、語(yǔ)法簡(jiǎn)單、可移植性強(qiáng)、支持多平臺(tái)、類庫(kù)豐富等優(yōu)點(diǎn)。
      Perl 和 Python 都是開(kāi)源的,但其哲學(xué)理念卻剛好相反,因此常被人們將這兩種語(yǔ)言放在一起進(jìn)行比較。下面的篇章將從基本數(shù)據(jù)類型、控制流、函數(shù)、面向?qū)ο?、文本處理等方面?duì)這兩種語(yǔ)言進(jìn)行簡(jiǎn)單的比較和鑒別。

      回頁(yè)首

      Perl 與 Python 的基本數(shù)據(jù)類型

      腳本語(yǔ)言支持多種數(shù)據(jù)類型,變量無(wú)需事先申明,類型根據(jù)值來(lái)動(dòng)態(tài)確定,一個(gè)變量在程序中可以根據(jù)上下文環(huán)境的不同存儲(chǔ)不同類型的值。

      Perl 支持的基本數(shù)據(jù)類型包括:標(biāo)量、數(shù)組、哈希。在定義的時(shí)分別用 $、@、% 表示。

      1. 標(biāo)量 (scalar):標(biāo)量是 Perl 中最簡(jiǎn)單的數(shù)據(jù)類型,大多數(shù)標(biāo)量由數(shù)字或字符串組成。其中數(shù)字類型如整數(shù)、浮點(diǎn)數(shù)等,字符串有單引號(hào)和雙引號(hào)內(nèi)兩種形式,對(duì)長(zhǎng)度沒(méi)有限制。兩者的區(qū)別在于在單引號(hào)內(nèi) \n 不代表?yè)Q行,而代表反斜線和 n 這兩個(gè)字符,雙引號(hào)內(nèi)字符串則可以通過(guò)反斜線進(jìn)行轉(zhuǎn)義。字符串的操作符有 . 拼接操作符和 x 重復(fù)操作符等。
      2. 數(shù)組 (Arrays):數(shù)組用 @ 定義,如 my @array=("a","b","c","d"); 訪問(wèn)數(shù)組的元素用 $array[1]。在 perl 中,數(shù)組也可以當(dāng)做堆棧來(lái)處理,支持的操作符包括 pop 和 push,shft 和 unshift。兩組操作的區(qū)別在于前者對(duì)數(shù)組的尾部進(jìn)行處理,而 shift 和 unshift 則針對(duì)數(shù)組的頭部進(jìn)行處理。pop 得到的是數(shù)組的最后一個(gè)元素,如 pop(@array)= d,如果數(shù)組為空,則返回 undef。而 shift(@array)=a。
      3. 哈希:也稱作關(guān)聯(lián)數(shù)組,是根據(jù)關(guān)鍵碼值 (Key value) 而直接進(jìn)行訪問(wèn)的數(shù)據(jù)結(jié)構(gòu)。用 % 定義,如 %my_hash=(“key1”=>”23”,”name”=>”zhang”,”age”=>”24”),其中鍵以字符串表示,Hash 可以是任意大小。
        與 hash 相關(guān)的函數(shù)有:
        keys:返回 hash 的鍵列表 my @keylist = keys %hash
        value:返回值列表 my @valuelist = values %hash
        each:用兩個(gè)元素的列表返回鍵值對(duì)。
        while(($key,$value)= each %hash)
        {
        print “$key =>$value\n”;
        }

      Python 支持五種基本數(shù)據(jù)類型:數(shù)字 (Numbers)、字符串 (String)、列表 (List)、元組 (Tuple) 和字典 (Dictionary)。其中數(shù)字和字符串和 perl 中的標(biāo)量對(duì)應(yīng),列表和數(shù)組對(duì)應(yīng),元組可以看做是不可變的列表,字典和 hash 對(duì)應(yīng)。

      1. 數(shù)字 (Numbers):Python 支持五種基本數(shù)字類型,分別為 int( 有符號(hào)整數(shù) ) 、long( 長(zhǎng)整數(shù) ) 、bool( 布爾值 ) 、float( 浮點(diǎn)數(shù) ) 、complex( 復(fù)數(shù) )。
      2. 字符串 (String):Python 與 Perl 一樣也支持單引號(hào)和雙引號(hào)字符串,但與 Perl 不同,轉(zhuǎn)義字符在單引號(hào)中也會(huì)起作用。同時(shí) python 還支持三引號(hào)字符串,它允許一個(gè)字符串跨多行,字符串中可以包含換行符,制表符以及其他特殊字符。三引號(hào)字符串常用于注釋或者形成文檔。字符串支持成員操作符 in,not in,連接操作符 + 以及重復(fù)操作符 *。Python 字符串可以當(dāng)做 list,支持切片操作符 [],[:] 和反向索引。如下:
        如 aString=”abcd”;則 aString[0] 的值為 a,aString[1:3]=bc,反向索引 aString[-1]=d
      3. 列表 (List):Pyhon 中的列表與 Perl 中的數(shù)組相對(duì)應(yīng)。列表的定義使用 []. 如 li = ["a", "b", "mpilgrim", "z", "example"] ,支持動(dòng)態(tài)增加和刪除元素以及切片操作。
        增加元素可以使用 li.append(“test”),li.insert(2,”new”) 以及 li.extend([“f”,”ggf”])
        刪除元素使用 li.remove(“f”) 和 li.pop() 。但需要注意的是 remove 僅刪除首次出現(xiàn)的,而 pop 會(huì)刪除 list 最后的一個(gè)元素,然后返回刪除的元素的值。
      4. 元組 (Tuple):元組和列表非常相似,但用()表示,并且元組是不可變的。
      5. 字典 (Dictionary)字典跟 Perl 中的 hash 一樣,定義了鍵值對(duì)之間一對(duì)一的關(guān)系,變量可以任意取名,Python 會(huì)在內(nèi)部記錄其數(shù)據(jù)類型。定義一個(gè)字典:D={“name”:”Jon”,”Family”:”SH”}, 字典中的 key 是不能重復(fù)的,并且大小寫(xiě)敏感,同時(shí)字典中的元素是無(wú)序的。字典也支持增刪操作,往字典中添加元素 D[“age”]=23, 刪除元素 del D['name'],如果需要?jiǎng)h除所有元素可以使用 D.clear(), 或者 del D 刪除整個(gè)字典。

      回頁(yè)首

      Perl 與 Python 的控制結(jié)構(gòu)

      在控制結(jié)果方面,Perl 較 Python 豐富,除了支持傳統(tǒng)的 if 、while 、for 控制結(jié)構(gòu),還支持 until 、unless 、foreach 等,Python 的控制結(jié)構(gòu)相對(duì)要少一些,但已經(jīng)能夠滿足語(yǔ)言的要求。本節(jié)對(duì)這些控制結(jié)構(gòu)進(jìn)行詳細(xì)比較。

      If 控制結(jié)構(gòu):

      Perl 與 Python 都支持 if 、if-else 、if-else if- else 三種結(jié)構(gòu),兩者在語(yǔ)法上基本類似,但與 Python 不同的是 Perl 中沒(méi)有 boolean 類型,零和空表示 False,其余表示 True,而 Python 中除了''、""、0、()、[]、{}、None 為 False 之外,其他的都是 True。同時(shí) Python 直接用縮進(jìn)表示 block 塊。

      表 1. if 控制結(jié)構(gòu)
      PerlPython
      if if (expression) {
      true_statement;
      }
      if expression:
      if_suite
      if-else if (expression) {
      true_statement;
      }
      if expression:
      if_suite
      else:
      else_suite
      If-else if-else if (expression_A) {
      A_true_statement;
      } elseif (expression_B) {
      B_true_statement;
      } else {
      false_statement;
      }
      if expression1:
      if_suite
      elif expression2:
      elif_suite
      else:
      else_suite

      Perl 中還支持 unless 條件控制語(yǔ)句,基本語(yǔ)法如下:

      unless (expression) {
      stmt_1; }

      unless 和 if 不同之處在于當(dāng)條件表達(dá)式的值為假的時(shí)候才執(zhí)行,同時(shí) unless 后面還能跟 else 語(yǔ)句。如:

       unless($mon =~/^Feb/){ 
       print “This month has at least thirty days.\n”; 
       }else{ 
       print “Do you see what's going on here?\n”; 
       }

      循環(huán)控制結(jié)構(gòu):

      1. For 循環(huán):

      Perl 中的 for 循環(huán)除了支持傳統(tǒng)的 for 循環(huán),即 for ( 表達(dá)式 1; 表達(dá)式 2; 表達(dá)式 3) ,還支持 foreach 語(yǔ)句,基本語(yǔ)法為:

      	 foreach $i (@aList) { 
       		 stmt_1; 
      		 }

      python 不支持傳統(tǒng)的 for 循環(huán),但是提供了強(qiáng)大的循環(huán)結(jié)構(gòu)可以遍歷序列成員,同時(shí) for 循環(huán)后面也可以接 else 語(yǔ)句,基本語(yǔ)法如下:

       for inter_var in iterable: 
      		 suite_to_repeat 
       else: 
      	       else_statement
      1. while 循環(huán)

      Perl 循環(huán)控制結(jié)果還支持 while 和 do-while 以及 until 形式,until 與 while 結(jié)構(gòu)相似,區(qū)別在于 unitl 會(huì)在條件為假的時(shí)候重復(fù)執(zhí)行。until 語(yǔ)法如下:

       until(expression) 
       { 
          statement; 
       }

      而 python 只支持 while 形式,但 python 可以在 while 后面接 else 語(yǔ)句。語(yǔ)法如下:

       While condition: 
      		 statements 
       else: 
      		 statements

      循環(huán)控制符

      Perl 有三個(gè)循環(huán)控制操作符,分別為 Last 、next 、redo。

      1. last:立即終止循環(huán),類似于 c 中的 break。在多層循環(huán)中,只對(duì) last 所在的當(dāng)前循環(huán)塊有效;
      2. next:立刻結(jié)束當(dāng)前這次迭代;
      3. redo:將控制返回本循環(huán)的頂端,不經(jīng)過(guò)條件測(cè)試也不會(huì)進(jìn)去下一次迭代循環(huán),而是重新執(zhí)行本循環(huán)塊。它與 next 最大的區(qū)別在于 next 會(huì)正常繼續(xù)下一次迭代,而 redo 會(huì)重新執(zhí)行本次迭代。

      Python 也有三個(gè)循環(huán)控制操作符,分別為 break 、continue 、pass 語(yǔ)句。

      1. break:與 C 中的 break 類似;
      2. continue:continue 語(yǔ)句并不會(huì)退出循環(huán)結(jié)構(gòu),而是立即結(jié)束本次循環(huán),重新開(kāi)始下一輪循環(huán),也就是說(shuō),跳過(guò)循環(huán)體中在 continue 語(yǔ)句之后的所有語(yǔ)句,繼續(xù)下一輪循環(huán);
      3. pass:一般作為占位符或者創(chuàng)建占位程序,pass 語(yǔ)句不會(huì)執(zhí)行任何操作。

      回頁(yè)首

      Perl 與 Python 的函數(shù)

      Perl 和 Python 都支持函數(shù),可以傳遞參數(shù)以及在程序中對(duì)函數(shù)進(jìn)行調(diào)用等。下面從函數(shù)的定義,調(diào)用,返回值以及參數(shù)傳遞等方面對(duì)這兩者進(jìn)行比較。
      表 2. Perl 與 Python 函數(shù)比較

      PerlPython
      定義
      1.  基本語(yǔ)法:
      sub functionName{
             statement;
      [return value]
           }
      1. 基本語(yǔ)法:
        def functionName(arg1,arg2,[...]):
        statement
        [return value]
      2. 內(nèi)嵌函數(shù):
        Python 支持內(nèi)嵌函數(shù) , 其方法是在外部函數(shù)的定義體內(nèi)定義函數(shù) , 但整個(gè)函數(shù)體都在外部函數(shù)的作用域之內(nèi) .
        def outfun():
        def innerfun():
        Print “inner fun test”
        print “out fun test”
      返回值 使用 return 語(yǔ)句顯示返回;如果沒(méi)有 return,默認(rèn)返回最后一次運(yùn)算的結(jié)果 使用 return 語(yǔ)句顯示返回,沒(méi)有 return 語(yǔ)句,默認(rèn)返回為 None。如果函數(shù)返回多個(gè)對(duì)象,python 把他們聚集起來(lái)并以一個(gè)元組返回。
      調(diào)用 & 函數(shù)名(參數(shù) 1,參數(shù) 2,...),如果聲明在前,可以省略 &。如果用戶所定義的子過(guò)程與內(nèi)置函數(shù)重名,則不能省略 &。
      如下例必須使用 &chomp 調(diào)用:
      sub chomp{
      print “it is my chomp\n”;
      }
      1. 直接采用 函數(shù)名(參數(shù) 1,參數(shù) 2.....)
      2. 函數(shù)名(參數(shù)名 1= 值,參數(shù)名 2= 值 .......)
      函數(shù)參數(shù)
      1. 在子程序調(diào)用的后面加上被括號(hào)圈引的列表表達(dá)式即可,所有的參數(shù)都會(huì)自動(dòng)存儲(chǔ)為 @_ 中,其中第一個(gè)參數(shù)為 $_[0], 第二個(gè)參數(shù)存儲(chǔ) $_[1]。
      2. 傳遞引用,在參數(shù)前加入 \ 表示為引用
      1. 按照參數(shù)聲明的關(guān)鍵字順序直接傳遞;
      2. 通過(guò)關(guān)鍵字參數(shù) testFun(par1=“2”,par2=“45”)
      3. 默認(rèn)參數(shù):
        > Python 在傳遞參數(shù)的時(shí)候支持默認(rèn)參數(shù),規(guī)則是所有的位置參數(shù)必須出現(xiàn)在任何一個(gè)默認(rèn)參數(shù)之前,如
        def fun(arg1,defarg1=”var1”,defarg2=”12”), 如果在調(diào)用的時(shí)候沒(méi)有給出參數(shù)值,則會(huì)使用默認(rèn)值
      4. 變長(zhǎng)參數(shù):
        一種方法是利用非關(guān)鍵字可變長(zhǎng)參數(shù) , 可變長(zhǎng)的參數(shù)元組必須在位置和默認(rèn)參數(shù)之后 , 帶元組的函數(shù)語(yǔ)法如下:
        def function_name([formal_args,]*vargs_tuple):
        function_body
        其中 * 之后的形參將作為元組傳遞給函數(shù)。

        另外一種方法是利用關(guān)鍵字變量參數(shù),區(qū)別是在函數(shù)的參數(shù)變量里使用 **。
        def dicVarArgs(arg1,arg2=”default”,**theRest):
        print 'formal arg1:', arg1
        print 'formal arg2:', arg2
        for eachXtrArg in theRest.keys():
        print 'Xtra arg %s: %s' % \(eachXtrArg, str(theRest[eachXtrArg]))

      回頁(yè)首

      Perl 與 Python 的包與模塊

      Perl 程序把變量和子程序的名稱存貯到符號(hào)表中,Perl 的符號(hào)表中名字的集合就稱為 Perl 包 (package)。定義語(yǔ)法為:package mypack;每個(gè)符號(hào)表有其自己的一組變量、子程序名,各組名字是不相關(guān)的,因此可以在不同的 Perl 包中使用相同的變量名,而代表的是不同的變量。Perl 模塊有兩種來(lái)源,一種是隨 Perl 發(fā)行版本一同打包的,另外就是用 CPAN 中下載的。Perl 模塊和包的概念并不清晰,兩者有時(shí)可以混用。在程序中使用模塊的操作稱為導(dǎo)入模塊;導(dǎo)入模塊關(guān)鍵字 use;如:use ModuleName;模塊被導(dǎo)入后,其中的子程序和變量就可以直接使用了;要取消一個(gè)已經(jīng)導(dǎo)入了的模塊,可以使用關(guān)鍵字 no;如:no ModuleName。

      一個(gè) .py 文件就是一個(gè) python 模塊。把一堆相關(guān)的 python 模塊放在一個(gè)目錄下,再加上一個(gè) __init__.py 文件就構(gòu)成了一個(gè) python 包。在 Python 另一個(gè)程序中導(dǎo)入模塊用 import module 或者 from module import *,兩者的區(qū)別在于:import module 會(huì)導(dǎo)入 module 這個(gè)模塊里的所有標(biāo)識(shí),但是這些標(biāo)識(shí)現(xiàn)在都在 module 名字空間下。from module import * 也會(huì)導(dǎo)入 module 中所有標(biāo)識(shí),但是標(biāo)識(shí)放到在當(dāng)前名字空間里。

      導(dǎo)入模塊或包按下面順序進(jìn)行路徑查找:
      1. 當(dāng)前目錄
      2. 環(huán)境變量 PYTHONPATH 所指的目錄列表 3.python 解釋器的安裝目錄

      回頁(yè)首

      Perl 與 Python 中的 OOP

      在 Perl 中,類是 Perl 包,含有提供對(duì)象方法的類,而方法是 Perl 的子程序,類名是其第一個(gè)參數(shù),對(duì)象是對(duì)類中數(shù)據(jù)項(xiàng)的引用。在 Perl 中創(chuàng)建一個(gè)新類,首先要?jiǎng)?chuàng)建一個(gè)包,擴(kuò)展名為 .pm, 在創(chuàng)建 perl 包的時(shí)候程序的最后一個(gè)必須為"1;";否則該包不會(huì)被 Perl 處理。

      清單 1. 創(chuàng)建 perl 的類和對(duì)象
       package person; 
       use strict; 
       sub new { 
               my $class = shift(); 
               print("CLASS = $class\n"); 
               my $self = {}; 
               $self->{"name"} = shift(); 
               $self->{"sex"} = shift(); 
               bless $self, $class; 
               return $self; 
       } 
       1;

      其中 new() 方法是對(duì)象的構(gòu)造函數(shù),是創(chuàng)建該類的對(duì)象實(shí)例必須被調(diào)用的,它返回該對(duì)象的引用。將類名與引用相結(jié)合稱為”bless”一個(gè)對(duì)象,其語(yǔ)法為:bless YeReference [,classname]

      YeReference 是對(duì)被”祝?!钡膶?duì)象的引用,classname 是可選項(xiàng),指定對(duì)象獲取方法的包名,其缺省值為當(dāng)前包名。也可以通過(guò)函數(shù) bless 來(lái)聲明一個(gè)構(gòu)造函數(shù)。

       sub new 
       { 
          my $class = shift; 
          my $self = {}; 
          bless $self, $class; 
          return $self; 
       }

      創(chuàng)建一個(gè)對(duì)象可以直接使用 new 關(guān)鍵字。$object = new Person( "mohand", "sam", 345);

      Perl 類中的方法就 Perl 的子函數(shù),規(guī)定第一個(gè)參數(shù)為對(duì)象或者被引用的包,分為靜態(tài)方法和虛方法。 虛方法通常首先把第一個(gè)參數(shù) shift 到變量 self 或 this 中,然后將該值作普通的引用使用。一是通過(guò)該對(duì)象的引用 ( 虛方法 ),一是直接使用類名 ( 靜態(tài)方法 )。如上例中如果類 Person 中有 getContactList 則可以直接使用 $object->getContactList() 來(lái)調(diào)用該方法。

      Perl 支持重載,當(dāng)兩個(gè)不同的類中含有相同的方法名稱的時(shí)候,可以用 :: 操作符指定使用哪個(gè)類中的方法。
      $mess = Qava::grind("whole","lotta","bags");
      Qava::grind($mess, "whole","lotta","bags");

      由于 Perl 采用了簡(jiǎn)單的、基于引用的垃圾回收系統(tǒng)。Perl 跟蹤對(duì)象的鏈接數(shù)目,當(dāng)某對(duì)象的最后一個(gè)應(yīng)用釋放到內(nèi)存池時(shí),該對(duì)象就自動(dòng)銷毀。因此一般不需要定義類的析構(gòu)函數(shù)。

      Perl 通過(guò)數(shù)組 @ISA 支持繼承。

       package Employee; 
       use Person; 
       use strict; 
       our @ISA = qw(Person);    # inherits from Person

      當(dāng)子類繼承父類的時(shí)候,繼承了父類的所有方法,但子類也可以覆蓋父類的方法。如加入 Employee 想覆蓋父類的 getFirstName:

       #!/usr/bin/perl 
      
       package Employee; 
       use Person; 
       use strict; 
       our @ISA = qw(Person);    # inherits from Person 
      
       # Override helper function 
       sub getFirstName { 
          my( $self ) = @_; 
          # This is child class function. 
          print "This is child class helper function\n"; 
          return $self->{_firstName}; 
       } 
      
       1;

      調(diào)用直接使用 $firstName = $object->getFirstName(); 如果要調(diào)用父類的 getFirstName,則可以使用 $object->Person::getFirstName();

      在 Python 中創(chuàng)建一個(gè)類的基本語(yǔ)法為 :

       class className(bases): 
      		 classBody

      參數(shù) base 可以是一個(gè)單繼承或者多繼承的父類,object 是所有類的父類,位于類繼承結(jié)構(gòu)的最上層。類的構(gòu)造函數(shù)為 __init__(),其中構(gòu)造函數(shù)中 self 會(huì)作為第一個(gè)默認(rèn)的參數(shù)。而類的析構(gòu)函數(shù)則是 __del__(),訪問(wèn)類的方法和屬性可以直接使用 . 訪問(wèn)符。

      Python 不支持純虛函數(shù)或抽象方法,并且聲明和定義沒(méi)有本質(zhì)區(qū)別。一般或者 Python 類的屬性可以通過(guò) __dict__ 或者 dict()訪問(wèn)。常見(jiàn)屬性有 __name__ ,__doc__,__base__,__dict__。Python 中創(chuàng)建一個(gè)類的實(shí)例,不需要關(guān)鍵之 new,直接使用類名 () 即可。如 c=myclass()。

      Python 不僅僅支持單繼承和多繼承,同時(shí)還支持方法的覆蓋 .

       class P(object): 
       def foo(self): 
       print 'Hi, I am P-foo()'
       >>> p = P() 
       >>> p.foo() 
       Hi, I am P-foo()

      現(xiàn)在創(chuàng)建 C 類 , 繼承于 P

       class C(P): 
       def foo(self): 
       print 'Hi, I am C-foo()'
       >>> c = C() 
       >>> c.foo() 
       Hi, I am C-foo()

      當(dāng)從一個(gè)帶構(gòu)造器 __init()_ 的類派生,如果在子類中覆蓋了 __init__(),當(dāng)子類被實(shí)例化時(shí),基類的 __init__() 方法不會(huì)被自動(dòng)調(diào)用。如果必須調(diào)用基類的構(gòu)造方法,可以使用父類名 .__init__(self) 方法或者 super( 子類名,self).__init__()。 如

       def __init__(self): 
       super(C, self).__init__() 
       print "calling C's constructor"

      Python 類和實(shí)例支持一些內(nèi)建函數(shù),如

      Issubclass(sub,sup):判斷一個(gè)類是另一個(gè)類的子類或子孫類;

      isinstance(obj1,obj2):判定一個(gè)對(duì)象是否是另一個(gè)給定類的實(shí)例;

      回頁(yè)首

      Perl 與 Python 的正則表達(dá)式

      正則表達(dá)式是 perl 比較突出的一大特色,perl 中正則表達(dá)式有三種形式:
      匹配:m/<regexp>/ (還可以簡(jiǎn)寫(xiě)為 /<regexp>;/ ,略去 m) 替換:s/<pattern>/<replacement>/ ,為了語(yǔ)法的簡(jiǎn)化用 /<pattern>/<replacement>/ 表示,略去 s

      轉(zhuǎn)換:tr/<charClass>/<substituteClass>/ 這種形式包含一系列的字符— /<charClass> —同時(shí)把它們替換為 <substituteClass>。

      表 3. Perl 常用匹配模式
      語(yǔ)法說(shuō)明示例
      . 匹配除換行符以外的所有字符 b.c 匹配 bac
      x? 匹配 0 次或一次 x 字符串 b?c 匹配 c 或者 bc
      x* 匹配 0 次或多次 x 字符串,但匹配可能的最少次數(shù) b*c 匹配 c 或者 bbc
      x+ 匹配 1 次或多次 x 字符串,但匹配可能的最少次數(shù) b+c 匹配 bc 或者 bbc
      .* 匹配 0 次或一次的任何字符 b.*c 匹配 bgdc 等
      .+ 匹配 1 次或多次的任何字符 b.+c 匹配 bgc 等
      {m} 匹配剛好是 m 個(gè) 的指定字符串 b{5}c 匹配 bbbbbc
      {m,n} 匹配在 m 個(gè) 以上 n 個(gè) 以下 的指定字符串 b{1,2} 匹配 b 或者 bb
      {m,} 匹配 m 個(gè) 以上 的指定字符串 b{2,} 匹配 bb 或者 bbb 等
      [] 匹配符合 [] 內(nèi)的字符 b[d]c 匹配 bdc
      [^] 匹配不符合 [] 內(nèi)的字符 b[^d]c 匹配 bAc
      [0-9] 匹配所有數(shù)字字符 b[0-9]c 匹配 b1c
      [a-z] 匹配所有小寫(xiě)字母字符 b[a-z]c 匹配 bac
      ^ 匹配字符開(kāi)頭的字符 ^perl 匹配以 perl 開(kāi)頭的字符
      $ 匹配字符結(jié)尾的字符 perl$ 匹配以 perl 結(jié)尾的字符
      \d 匹配一個(gè)數(shù)字的字符,和 [0-9] 語(yǔ)法一樣 b\dc 匹配 b1c
      \D 非數(shù)字,其他同 \d b\Dc 匹配 bAc
      \w 英文字母或數(shù)字的字符串,和 [a-zA-Z0-9] 語(yǔ)法一樣 b\wc 匹配 b1c 等
      \W 非英文字母或數(shù)字的字符串,和 [^a-zA-Z0-9] 語(yǔ)法一樣 b\Wc 匹配 b c
      \s 空格,和 [\n\t\r\f] 語(yǔ)法一樣 b\sc 匹配 b c
      \S 非空格,和 [^\n\t\r\f] 語(yǔ)法一樣 b\Sc 匹配 bac 等
      \b 匹配以英文字母 , 數(shù)字為邊界的字符串 \bbc\b 匹配 bc 但不匹配 bca
      \B 匹配不以英文字母 , 數(shù)值為邊界的字符串 sa\B 將匹配 sand 和 Sally 等字符串,而不能匹配 Melissa.
      a|b|c 匹配符合 a 字符 或是 b 字符 或是 c 字符 的字符串
      abc 匹配含有 abc 的字符串
      匹配 a 或者 b 或者 c 等
      (pattern) () 這個(gè)符號(hào)會(huì)記住所找尋到的字符串,是一個(gè)很實(shí)用的語(yǔ)法。第一個(gè) () 內(nèi)所找到的字符串變成 $1 這個(gè)變量或是 \1 變量,第二個(gè) () 內(nèi)所找到的字符串變成 $2 這個(gè)變量或是 \2 變量,以此類推下去。 b(\d)c 表示匹配的任何數(shù)字將存放與 $1 變量中


      Python 語(yǔ)言本身不支持正則表達(dá)式,依賴 re 模塊(python1.5 版本被引入)支持正則表達(dá)式。有搜索和匹配兩種方法完成匹配模式。re 模塊常用的函數(shù)和方法有 complie、match、search、find 與 findall 等。在利用 re 進(jìn)行匹配之前,模式必須被編譯成 regex 對(duì)象。

      表 4. Python 常用匹配模式
      語(yǔ)法說(shuō)明示例
      . 匹配除換行符 \n 以外的任意字符 b.c 匹配 bac,bdc
      * 匹配前一個(gè)字符 0 次或多次 b*c 匹配 c,或者 bbbc
      + 匹配前一個(gè)字符 1 次或多次 b+c 匹配 bc 或者 bbbc
      ? 匹配前一個(gè)字符 0 或 1 次 b?c 匹配 c 或者 bc
      {m} 匹配前一個(gè)字符 m 次 b{2}c 匹配 bbc
      {m,n} 匹配前一個(gè)字符 m 至 n 次 b{2,5}c 匹配 bbc 或者 bbbbc
      [abc] 匹配 [] 內(nèi)的任意字符 [bc] 匹配 b 或者 c
      \d 匹配數(shù)字 [0-9] b\dc 匹配 b1c 等
      \D 匹配非數(shù)字,等價(jià)于 [^\d] b\Dc 匹配 bAc
      \s 匹配空白字符 b\sc 匹配 b c
      \S 匹配非空白字符 [\^s] b\Sc 匹配 bac
      \w 匹配 [A-Za-z0-9_] b\wc 匹配 bAc 等
      \W 等價(jià)于 [^\w] b\Wc 匹配 b c
      \ 轉(zhuǎn)義字符, b\\c 匹配 b\c
      ^ 匹配字符串開(kāi)頭 ^bc 匹配句首的 bc
      $ 匹配字符串末尾 bc$ 匹配以 bc 結(jié)尾的字符串
      \A 僅匹配字符串開(kāi)頭 \Abc 匹配字符串開(kāi)頭的 bc
      \Z 僅僅匹配字符串末尾 bc\Z 匹配字符串末尾的 bc
      | 匹配左右表達(dá)式任意一個(gè) b|c 匹配 b 或者 c

      回頁(yè)首

      Perl 與 Python 中的線程

      線程是一個(gè)單一的執(zhí)行流程,它是所有程序執(zhí)行過(guò)程中最小的控制單位,即能被 CPU 所調(diào)度的最小任務(wù)單元。在 Perl 中一個(gè)線程的生命周期包括創(chuàng)建,運(yùn)行與退出這三個(gè)階段。線程的運(yùn)行過(guò)程與普通函數(shù)的執(zhí)行類似,但新建線程的執(zhí)行與當(dāng)前線程的執(zhí)行是并行的。

      在 Perl 中創(chuàng)建線程有兩種方法:

      清單 2. 使用 threads 包的 create() 方法
      	 use threads; 
      	 sub say_hello 
      	 { 
      	    printf("Hello thread! @_.\n"); 
      	    return( rand(10) ); 
      	 } 
      	 my $t1 = threads->create( \&say_hello, "param1", "param2" );
      清單 3. 使用 async{} 塊創(chuàng)建線程
      	 #!/usr/bin/perl 
      	 use threads; 
      	 my $t4 = async{ 
      	 		 printf("Hello thread!\n"); 
      	         	 };

      對(duì)于線程的執(zhí)行控制,有兩種方式,一種是 join(),一種是 detach()。所謂 join() 就是在主線程中等待子線程的執(zhí)行返回值,然后再繼續(xù)執(zhí)行后續(xù)代碼,而在調(diào)用線程的 join() 方法之前,子線程與主線程的執(zhí)行是分開(kāi)的。而 detach() 則是告訴解釋器主線程不關(guān)心子線程的執(zhí)行結(jié)果,所以該子線程在完成任務(wù)之后就是自動(dòng)退出,同時(shí)釋放自己所占有的資源,而不用主線程再操心。

      Perl 默認(rèn)任何數(shù)據(jù)結(jié)構(gòu)都不是共享的,任何新創(chuàng)建的線程都有當(dāng)前數(shù)據(jù)的私有拷貝。如果要共享數(shù)據(jù),必須使用 threads::shard 進(jìn)行顯示聲明。

      如:

      	 my $var   :shared  = 0;       	 # use :share tag to define 
      	 my @array :shared = (); 		 # use :share tag to define 
      	 my %hash = (); 
      	 share(%hash);                  	 # use share() funtion to define

      同時(shí) Perl 線程還支持鎖機(jī)制,可以使用 lock 方法實(shí)現(xiàn)線程間共享數(shù)據(jù)的鎖機(jī)制。Perl 中的 Thread::Semaphore 包為線程提供了信號(hào)量的支持,Thread::Queue 包為線程提供了線程安全的隊(duì)列支持。更多使用讀者可以自行查閱相關(guān)文檔。

      Python 提供了幾個(gè)用于多線程編程的模塊,包括 thread, threading 和 Queue 等。thread 和 threading 模塊允許程序員創(chuàng)建和管理線程。thread 模塊提供了基本的線程和鎖的支持,而 threading 提供了更高級(jí)別,功能更強(qiáng)的線程管理的功能。Queue 模塊允許用戶創(chuàng)建一個(gè)可以用于多個(gè)線程之間共享數(shù)據(jù)的隊(duì)列數(shù)據(jù)結(jié)構(gòu)。

      Python 的線程創(chuàng)建也有兩種方式,一是利用 thread 模塊的 start_new_thread() 函數(shù)來(lái)產(chǎn)生新線程。

      	 import time 
      	 import thread 
      	 def timer(no, interval): 
      	    cnt = 0 
      	    while cnt<10: 
      	        print 'Thread:(%d) Time:%s/n'%(no, time.ctime()) 
      	        time.sleep(interval) 
      	        cnt+=1 
      	    thread.exit_thread() 
      	 def test(): 	 #Use thread.start_new_thread() to create 2 new threads 
      	    thread.start_new_thread(timer, (1,1)) 
      	    thread.start_new_thread(timer, (2,2)) 
      	 
      	 if __name__=='__main__': 
      	    test()

      另一種是創(chuàng)建 threading.Thread 的子類來(lái)包裝一個(gè)線程對(duì)象。

       class timer(threading.Thread): # derived from the class threading.Thread 
          def __init__(self, num, interval): 
              threading.Thread.__init__(self) 
              self.thread_num = num 
              self.interval = interval 
              self.thread_stop = False 
           def run(self): #Overwrite run() method, put what you want the thread do here 
              while not self.thread_stop: 
                  print 'Thread Object(%d), Time:%s/n' %(self.thread_num, time.ctime()) 
                  time.sleep(self.interval) 
            def stop(self): 
              self.thread_stop = True

      Python 線程中也提供同步機(jī)制,可以利用 thrading 模塊的 threading.RLock 和 hreading.Condition 可以分別實(shí)現(xiàn)鎖機(jī)制和條件變量。

      其中 acquire() 和 release() 方法分別獲取和釋放鎖。

      	 def run(self): 
      	        global x 
      	        lock.acquire() 
      	        for i in range(3): 
      	            x = x + 1 
      	        time.sleep(2) 
      	        print x 
      	        lock.release()

      更多關(guān)于線程的內(nèi)容,讀者可查閱相關(guān)文檔。

      回頁(yè)首

      總結(jié)

      本文從 Perl 和 Python 的起源,基本數(shù)據(jù)類型、控制結(jié)構(gòu)、函數(shù)、包與模塊、面向?qū)ο?、正則表達(dá)式以及線程等方面進(jìn)行了比較,從而給需要同時(shí)掌握這兩種腳本語(yǔ)言的開(kāi)發(fā)人員一定參考,以便更好的理解與應(yīng)用。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多