Jython应用的两个实例

开发 后端
本文介绍了Jython应用的两个实例。

Jython应用实例一、回显,回显,echo.py!

尝试一个增加了一些功能的示例,这是一个小程序,它允许您回显(echo)命令行参数。对于程序echo,使用以下代码(这些代码在echo.py中):

清单1. 回显命令行参数的示例程序

  1. import sys  
  2. count = 1 
  3. for arg in sys.argv[1:]:  
  4.     print 'Argument %i=%s' % (count, arg)  
  5.     count += 1 

同样,这个完整的Jython程序揭示了Jython的一些关键特性。要注意的***件事是每一行就是一个语句——不需要分号(;)来结束这些行——并且变量没有声明。

您还应当注意命令行参数是通过内置符号sys.argv访问的,它是一系列字符串。sys是一个标准模块,它包含有用的值和函数,还有其他许多标准模块可供使用。***个argv元素(0)是程序名(即echo.py)。要跳过它,取走argv列表的片段,实际开始位置为一(1),然后迭代直到列表的***。

循环是通过for语句组实现的。for语句正文是for之后缩进的那些行。print语句示范了使用Jython的字符串格式编排功能(类似于C/C++的printf和Java 1.5的新的print功能)。

还可以更精确地将上述代码写为以下形式:

  1. from sys import argv  
  2. for i in range(1, len(argv)): print 'Argument %i=%s' % (i, argv[i]) 

在这个示例中,使用range以索引sys.argv列表。因为argv变量是直接导入的,所以不需要限定。注意argv列表的长度是通过len函数而不是作为方法获得的,这是Jython的一种用法,在许多语言中也常见。还有许多其他函数可用。

Jython应用实例二、利用factorial.py进行阶乘!

我们用高速缓存阶乘计算器factorial.py作为类定义的练习,如清单2所示。

清单2. 高速缓存阶乘计算器

  1. class Factorial:  
  2.     ''' A factorial calculator '''  
  3.     seen = {} # cache of prior calculated values      
  4.     def __init__ (self, value):  
  5.         self.__value = value  
  6.     def compute (self, value=None):          
  7.         ''' calculate the result '''  
  8.         if value is None: value = self.__value   # default  
  9.         if   value < 0:          # bad arg!  
  10.             raise ValueError, 'arg < 0'  
  11.         elif value < 2:          # base case  
  12.             return 1L            # insure long integers are used  
  13.         else:                    # need to calculate  
  14.             if not value in Factorial.seen.keys():    # not done before?  
  15.                 # calculate this value and cache it  
  16.                 Factorial.seen[value] = value * \  
  17.                      Factorial(value - 1).compute()  
  18.             return Factorial.seen[value]  # get value from the cache 

这里可以看到Jython的许多新特性。首先,用明确的(#)标识引入注释。一个类或者方法可以有文档注释字符串(可以用使用用法类似于JavaDoc的工具进行处理)作为其***行。与赋值不同,语句是用关键字引入的。类和方法正文没有包围在定界符中,而是由缩进的正文来体现。

而且,类是用class语句声明的。def语句引入方法。类特性是用类中的赋值创建的,而实例特性是用构造函数方法__init__中的赋值创建的。seen变量是一个字典。实例是将类对象作为函数调用而创建的。方法是用点(.)运算符调用的。

您还会注意到self变量是方法的接收器(就像Java语言中的this),在方法中,所有对实例特性或者类的方法的引用都必须用self限定。类变量(像在Java语言中一样)是用类名限定的。

函数可以有默认参数,如compute函数的值参数所示。如果没有给出参数值,就使用__value实例特性。

现在,显然可以看出Jython支持Java语言的所有功能,但是有时使用了不同的语法。例如,Jython的raise语句与Java语言的throw语句是相同的。

测试factorial.py

可以用下面的代码测试这个Factorial类,可以在文件factorial.py中找到这些代码(请参阅参考资料):

  1. if __name__ == "__main__":  
  2.     from sys import argv  
  3.     if   len(argv) == 1: vals = range(10)  
  4.     elif len(argv) == 2: vals = range(int(argv[1]))  
  5.     elif len(argv) == 3: vals = range(int(argv[1]), int(argv[2]))  
  6.     else: print " Incorrect range"; vals = ()  
  7.     for i in vals:  
  8.         print "Factorial(%i)=%i" % (i, Factorial(i).compute())  
  9.     print "Cache:", Factorial.seen 

在Jython中,可以结合类定义和测试用例。上述if __name__……测试使得只有当文件作为命令运行时才运行测试用例代码。还可以用另一个文件引入这个文件,以重复使用Factorial类但不必运行测试用例。测试用例包含几个简单的命令参数处理,然后是一个循环,它计算指定值(如果有的话)的阶乘。***,打印出缓存的值。jython factorial.py 5 10命令生成以下输出:

  1. Factorial(5)=120  
  2. Factorial(6)=720  
  3. Factorial(7)=5040  
  4. Factorial(8)=40320  
  5. Factorial(9)=362880  
  6. Cache: {9: 362880L, 8: 40320L, 7: 5040L, 6: 720L, 5: 120L, 4: 24L, 3: 6L, 2: 2L} 

您可能还注意到上述示例中可以用Jython long(###L)类型计算不定长度整数。

这就是今天介绍的Jython应用的两个实例。

【编辑推荐】

  1. Jython开发的JUnit测试包
  2. 创建Jython类的过程探讨
  3. 如何在代码应用中学习Jython
  4. Jython功能——与Java语言相比的独特功能
  5. 如何进行Jython数据库插入(JDBC)
责任编辑:雪峰 来源: IBM中国
相关推荐

2010-09-17 09:51:37

SIP路由

2010-04-20 15:09:05

负载均衡

2013-06-20 09:35:18

Instagramvine短视频应用

2019-10-31 08:22:39

shell脚本Linux

2009-07-14 18:34:22

Jython操作符重载

2010-02-25 16:45:13

WCF应用技巧

2009-11-03 17:24:01

VB.NET特殊形状窗

2011-09-07 16:43:38

Qt Widget

2012-05-26 23:31:25

Facebook

2010-08-19 11:22:19

marginpadding

2011-04-15 09:47:38

IntentActivityAndroid

2022-06-17 09:46:51

Chrome 102Chrome浏览器

2010-07-02 12:26:51

LEACH协议

2009-07-16 13:09:46

Jython安装

2015-05-06 10:28:32

移动应用谷歌

2012-05-24 09:18:34

ibmdw

2019-05-29 10:10:23

ICMP网络故障网络协议

2020-03-02 11:47:27

区块链存储应用程序

2020-11-13 07:16:09

线程互斥锁死循环

2013-05-30 22:47:40

阿里巴巴阿里云昆塔盒子总动员
点赞
收藏

51CTO技术栈公众号