首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

groovy、python中的闭包特征

2012-08-27 
groovy、python中的闭包特性什么是groovy,以下摘自《groovy in action》(官网有下载):?????groovy 是在 java

groovy、python中的闭包特性

什么是groovy,以下摘自《groovy in action》(官网有下载):

?

????"groovy 是在 java平台上的、具有象 Python,Ruby 和 Smalltalk 语言特性的灵活动态语言,groovy 保证了这些特性象 java 语法一样被 java 开发者使用"
????“groovy 代码被编译成 java 字节码,然后能集成到 java 应用程序中或者 web 应用程序,整个应用程序都可以是 groovy 编写的——groovy 是非常灵活的。”

????“虽然你在 groovy 中做的每一件事情通过 java 也可以做,但是用 java 代码实现 groovy 的魔术工作是会让人发狂的,groovy在后台做了许多工作来完成敏捷性和动态性。”

??? “groovy 运行在 java 虚拟机,java 的类库也可以继续使用,Groovy 仅仅是创建 java 类的一种新的途径——通过在运行时创建,groovy 是使用了额外 jar 文件为依赖的 java。”

一个简单的示例:

#!/usr/bin/groovy//hello worldprint "hello world\n"println "hello world,你好"println 'hello world'//Declare a class class Book {private String titleBook (String theTitle) {title = theTitle}String getTitle(){return title}}ds = new Book("Data Structure")println ''+ds.getTitle()//numberprintln ''+(12+3)//listdef ml=["hello","world"]println mlprintln ml.size()//mapdef http = [100 : 'CONTINUE',200 : 'OK',400 : 'BAD REQUEST' ]println http//rangesdef mr=1..10println mr//forfor(i in 1..10){println i}

?chmod +x <this file>,运行结果为:

hello worldhello world,你好hello worldData Structure15[hello, world]2[100:CONTINUE, 200:OK, 400:BAD REQUEST][1, 2, 3, 4, 5, 6, 7, 8, 9, 10]12345678910

?

?

什么是闭包?

以下是一个groovy中的闭包示例:

#!/usr/bin/groovy[1,2,3].each{item -> println item}

该段代码是对列表[1,2,3]从左到右依次遍历每一个元素,将元素值送入参数item,并执行打印操作。

运行结果是:

123

?

????“通俗的说,一个闭包是一个用花括号围起来的语句块,像别的任何代码块,为了传递参数给闭包,闭包有一组可选的参数列表,通过“->”表示列表的结束。”

例如:

#!/usr/bin/groovy//计算1+2+...+100def sum=0def max=1001.upto(max){item -> sum = sum + item}println sum
?
#!/usr/bin/groovy//读取文件内容new File("02.groovy").eachLine{print it}   //it是默认的参数名称

?file 的 eachLine 方法负责处理文件输入流的打开和关闭,这样避免你偶然的错误处理形成资源泄漏。

??? 以上只是一些简单的示例,在groovy中闭包的使用方法很丰富,例如给一个闭包定义名称。

?

????“闭包是一个逻辑块,可以直接把闭包作为参数到处传递,从方法调用返回闭包,或者存储起来,在后面再使用。

闭包促进集中的资源处理,这样使你的代码更可靠,这不需要任何花费,事实上,代码库从结构重复方面得到了减轻,增强了表达性和维护性。”

?

python中的闭包

例如:

#!/usr/bin/pythonfor line in open("foo.txt"):    print line

?很简洁,但是并不符合闭包中的一些特性(个人认为)。

以下是使用闭包实现的一个计数器:

#!/usr/bin/python3#-*-coding:utf-8-*-''''''def countdown(counter):    n = counter    def next(): ? ? ? #here        nonlocal n        r = n        n -= 1        return r    return next#mynext = countdown(10)while True:    v = mynext()    print (v)    if not v:        break

?这里闭包将代码和执行环境打包在了一起,在这里闭包用于保存内部计数器的值n。

执行结果为:

109876543210
?

?

?

?

?

?

?

热点排行