Jython應(yīng)用的兩個(gè)實(shí)例
Jython應(yīng)用實(shí)例一、回顯,回顯,echo.py!
嘗試一個(gè)增加了一些功能的示例,這是一個(gè)小程序,它允許您回顯(echo)命令行參數(shù)。對(duì)于程序echo,使用以下代碼(這些代碼在echo.py中):
清單1. 回顯命令行參數(shù)的示例程序
- import sys
- count = 1
- for arg in sys.argv[1:]:
- print 'Argument %i=%s' % (count, arg)
- count += 1
同樣,這個(gè)完整的Jython程序揭示了Jython的一些關(guān)鍵特性。要注意的***件事是每一行就是一個(gè)語(yǔ)句——不需要分號(hào)(;)來結(jié)束這些行——并且變量沒有聲明。
您還應(yīng)當(dāng)注意命令行參數(shù)是通過內(nèi)置符號(hào)sys.argv訪問的,它是一系列字符串。sys是一個(gè)標(biāo)準(zhǔn)模塊,它包含有用的值和函數(shù),還有其他許多標(biāo)準(zhǔn)模塊可供使用。***個(gè)argv元素(0)是程序名(即echo.py)。要跳過它,取走argv列表的片段,實(shí)際開始位置為一(1),然后迭代直到列表的***。
循環(huán)是通過for語(yǔ)句組實(shí)現(xiàn)的。for語(yǔ)句正文是for之后縮進(jìn)的那些行。print語(yǔ)句示范了使用Jython的字符串格式編排功能(類似于C/C++的printf和Java 1.5的新的print功能)。
還可以更精確地將上述代碼寫為以下形式:
- from sys import argv
- for i in range(1, len(argv)): print 'Argument %i=%s' % (i, argv[i])
在這個(gè)示例中,使用range以索引sys.argv列表。因?yàn)閍rgv變量是直接導(dǎo)入的,所以不需要限定。注意argv列表的長(zhǎng)度是通過len函數(shù)而不是作為方法獲得的,這是Jython的一種用法,在許多語(yǔ)言中也常見。還有許多其他函數(shù)可用。
Jython應(yīng)用實(shí)例二、利用factorial.py進(jìn)行階乘!
我們用高速緩存階乘計(jì)算器factorial.py作為類定義的練習(xí),如清單2所示。
清單2. 高速緩存階乘計(jì)算器
- class Factorial:
- ''' A factorial calculator '''
- seen = {} # cache of prior calculated values
- def __init__ (self, value):
- self.__value = value
- def compute (self, value=None):
- ''' calculate the result '''
- if value is None: value = self.__value # default
- if value < 0: # bad arg!
- raise ValueError, 'arg < 0'
- elif value < 2: # base case
- return 1L # insure long integers are used
- else: # need to calculate
- if not value in Factorial.seen.keys(): # not done before?
- # calculate this value and cache it
- Factorial.seen[value] = value * \
- Factorial(value - 1).compute()
- return Factorial.seen[value] # get value from the cache
這里可以看到Jython的許多新特性。首先,用明確的(#)標(biāo)識(shí)引入注釋。一個(gè)類或者方法可以有文檔注釋字符串(可以用使用用法類似于JavaDoc的工具進(jìn)行處理)作為其***行。與賦值不同,語(yǔ)句是用關(guān)鍵字引入的。類和方法正文沒有包圍在定界符中,而是由縮進(jìn)的正文來體現(xiàn)。
而且,類是用class語(yǔ)句聲明的。def語(yǔ)句引入方法。類特性是用類中的賦值創(chuàng)建的,而實(shí)例特性是用構(gòu)造函數(shù)方法__init__中的賦值創(chuàng)建的。seen變量是一個(gè)字典。實(shí)例是將類對(duì)象作為函數(shù)調(diào)用而創(chuàng)建的。方法是用點(diǎn)(.)運(yùn)算符調(diào)用的。
您還會(huì)注意到self變量是方法的接收器(就像Java語(yǔ)言中的this),在方法中,所有對(duì)實(shí)例特性或者類的方法的引用都必須用self限定。類變量(像在Java語(yǔ)言中一樣)是用類名限定的。
函數(shù)可以有默認(rèn)參數(shù),如compute函數(shù)的值參數(shù)所示。如果沒有給出參數(shù)值,就使用__value實(shí)例特性。
現(xiàn)在,顯然可以看出Jython支持Java語(yǔ)言的所有功能,但是有時(shí)使用了不同的語(yǔ)法。例如,Jython的raise語(yǔ)句與Java語(yǔ)言的throw語(yǔ)句是相同的。
測(cè)試factorial.py
可以用下面的代碼測(cè)試這個(gè)Factorial類,可以在文件factorial.py中找到這些代碼(請(qǐng)參閱參考資料):
- if __name__ == "__main__":
- from sys import argv
- if len(argv) == 1: vals = range(10)
- elif len(argv) == 2: vals = range(int(argv[1]))
- elif len(argv) == 3: vals = range(int(argv[1]), int(argv[2]))
- else: print " Incorrect range"; vals = ()
- for i in vals:
- print "Factorial(%i)=%i" % (i, Factorial(i).compute())
- print "Cache:", Factorial.seen
在Jython中,可以結(jié)合類定義和測(cè)試用例。上述if __name__……測(cè)試使得只有當(dāng)文件作為命令運(yùn)行時(shí)才運(yùn)行測(cè)試用例代碼。還可以用另一個(gè)文件引入這個(gè)文件,以重復(fù)使用Factorial類但不必運(yùn)行測(cè)試用例。測(cè)試用例包含幾個(gè)簡(jiǎn)單的命令參數(shù)處理,然后是一個(gè)循環(huán),它計(jì)算指定值(如果有的話)的階乘。***,打印出緩存的值。jython factorial.py 5 10命令生成以下輸出:
- Factorial(5)=120
- Factorial(6)=720
- Factorial(7)=5040
- Factorial(8)=40320
- Factorial(9)=362880
- Cache: {9: 362880L, 8: 40320L, 7: 5040L, 6: 720L, 5: 120L, 4: 24L, 3: 6L, 2: 2L}
您可能還注意到上述示例中可以用Jython long(###L)類型計(jì)算不定長(zhǎng)度整數(shù)。
這就是今天介紹的Jython應(yīng)用的兩個(gè)實(shí)例。
【編輯推薦】