免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4641 | 回复: 8
打印 上一主题 下一主题

这两位口水战升级了,旁观者清 Python与Ruby各有千秋 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-26 09:33 |只看该作者 |倒序浏览
本帖最后由 中关村村草 于 2010-11-26 09:35 编辑

旁观者清 Python与Ruby各有千秋


关于Ruby和Python之间的对比在网上有太多的口水,但我却没有发现真正有用的讨论,因为大家总是围绕双方的功能差异进行争辩,这样下去显得毫无意义,其实该有的双方都会有,要不然有一方肯定早已被另一方消灭。

虽然我个人更喜欢Python,但并不代表Python就比Ruby功能要多,要比Ruby强大,也无法教唆其他人也跟我一样选择Python,因为每个人的口味都不一样。因此,客观地列出双方的不同点能够有效地避免大量的口水之争,注意我们不谈语法上的差异,那完全没有意思,另外,如果你觉得本文列出的项目有带有主观色彩的,你也可以谈谈你的看法。

Ruby在类主体中有类引用

在Ruby中,你可以引用类主体中的类(self),在Python中就不行。Ruby代码示例:

  1. class Kaka   
  2. puts self  
  3. end
复制代码
这里的self是一个类,上面这串代码将会输出“KaKa”,在Python中,没有办法输出类名或从类定义主体中访问类。

Ruby中的所有类都是可变的

它允许你为核心类开发扩展,下面是一个rails扩展示例:
  1. class String   
  2. def starts_with?(other)      
  3. head = self[0, other.length]      
  4. head == other   
  5. end  
  6. end
复制代码
Python(假设没有’’.startwith方法):
  1. def starts_with(s, prefix):      
  2. return s[:len(prefix)] == prefix
复制代码
你可以在任何序列(不只是字符串)上使用它,但必须明确地导入它,如:
  1. from some_module import starts_with
复制代码
Ruby有类似Perl的脚本功能

Ruby有一个regexps类,$-变量,awk/perl逐行输入循环和其它功能使它更适合编写小型shell脚本。

Ruby有类延续

Ruby有这个特性都是得益于callcc语句。在Python中,你可以用多种不同的技术创建延续,但语音本身并没有内置支持这项特性。

Ruby有块

使用do语句,你可以在Ruby中创建多行匿名函数,它将会作为一个参数传递给do前面的方法。在Python中,你可以传递一个方法或使用发生器实现同样的目的。

Ruby:
  1. amethod { |here|      
  2. many=lines+of+code     
  3. goes(here)
  4. }
复制代码
Python(Ruby块与Python中不同的构造对应):
  1. with amethod() as here: # `amethod() is a context manager      
  2. many=lines+of+code      
  3. goes(here)
复制代码
  1. for here in amethod(): # `amethod()` is an iterable      
  2. many=lines+of+code      
  3. goes(here)
复制代码
  1. def function(here):      
  2. many=lines+of+code      
  3. goes(here)   
  4. amethod(function)  # `function` is a callback
复制代码
有趣的是,Ruby中调用块的语句叫做“yield”,在Python中它将创建一个发生器。

Ruby:
  1. def themethod      
  2. yield 5  end   themethod do |foo|      
  3. puts foo  
  4. end
复制代码
Python:
  1. def themethod():      
  2. yield 5   
  3. for foo in themethod():      
  4. print foo
复制代码
虽然原理不一样,但结果非常类似的。

Ruby支持更容易的功能性编程(管道式)
  1. myList.map(&:description).reject(&:empty?).join("\n")  
复制代码
Python:
  1. descriptions = (f.description() for f in mylist)  "\n".join(filter(len, descriptions))
复制代码
Python内置有发生器(和Ruby中的块用法类似)

Python支持发生器,在Ruby中,你也可以使用发生器模块,但要使用延续从一个块创建一个发生器,或者使用块/proc/lambda,此外,Ruby 1.9中的纤程(Fibers)也可以作为发生器使用。docs.python.org提供了发生器示例:
  1. def reverse(data):      
  2. for index in range(len(data)-1, -1, -1):         
  3. yield data[index]
复制代码
请与上面的块示例代码对比。

Python有灵活的命名空间处理方法

在Ruby中,当你使用require导入一个文件时,文件中定义的所有项目将会在你的全局命名空间中结束,这会导致命名空间污染,解决办法是Ruby模块,但如果你使用模块创建了一个命名空间,你必须使用该命名空间访问包含的类。

在Python中,文件也是一个模块,你可以使用“from themodule import *”导入它包含的名字,虽然这样也会污染命名空间,但可以使用“from themodule import aname, another”或简单地“import themodule”导入选择的名字,然后使用“themodule.aname”访问名字。

Python有文档字符串(docstrings)

文档字符串是附加到模块、函数和方法的字符串,它有助于创建帮助命令和自动化文档。
  1. def frobnicate(bar):      
  2. """frobnicate takes a bar and frobnicates it         
  3. >>> bar = Bar()         
  4. >>> bar.is_frobnicated()         
  5. False         
  6. >>> frobnicate(bar)         
  7. >>> bar.is_frobnicated()         
  8. True      """  
复制代码
Ruby的与Javadocs类似,它们可以在运行时使用1.9的“方法#源位置”从文件检索。

Python有更多的库

Python有大量的模块和绑定的库。

Python有多重继承

Ruby没有多重继承。它作为抽象类类型重复使用模块。

Python有列表/字典理解能力

Python:
  1. res = [x*x for x in range(1, 10)]
复制代码
Ruby :
  1. res = (0..9).map { |x| x * x }
复制代码
Python:
  1. >>> (x*x for x in range(10))  
  2. <generator object <genexpr> at 0xb7c1ccd4>
  3. >>> list(_)  
  4. [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
复制代码
Ruby:
  1. p = proc { |x| x * x }  (0..9).map(&p) Python 2.7+:

  2. >>> {x:str(y*y) for x,y in {1:2, 3:4}.items()}  
  3. {1: '4', 3: '16'}
复制代码
Ruby:
  1. >> Hash[{1=>2, 3=>4}.map{|x,y| [x,(y*y).to_s]}]  => {1=>"4", 3=>"16"}
复制代码
Python有装饰器

与Ruby中创建的装饰器类似,但Ruby中的装饰器不像Python中那样重要,它是非必需的。

原文作者:Lennart Regebro

原文名:What does Ruby have that Python doesn’t, and vice versa?

原文地址:http://stackoverflow.com/questio ... esnt-and-vice-versa

论坛徽章:
0
2 [报告]
发表于 2010-11-27 11:20 |只看该作者
萝卜青菜各有所爱。

论坛徽章:
0
3 [报告]
发表于 2010-11-29 12:26 |只看该作者
回复 2# 2gua


    说的也是哈

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2010-12-06 14:30 |只看该作者
python必须用tab缩进,我觉得就抵消了它的一切好处。

论坛徽章:
0
5 [报告]
发表于 2010-12-06 15:06 |只看该作者
本帖最后由 2gua 于 2010-12-06 15:07 编辑

回复 4# truekbcl


    但很多人是喜欢Python的缩进的,另外,Python提倡用空格缩进,不提倡用Tab缩进。

论坛徽章:
0
6 [报告]
发表于 2010-12-10 14:12 |只看该作者
也有人觉得Python的缩进风格抵过了其他语言的一切好处 - -#
这不是本人观点,仅仅吐个小槽~

论坛徽章:
0
7 [报告]
发表于 2010-12-14 16:53 |只看该作者
也有人觉得Python的缩进风格抵过了其他语言的一切好处 - -#
这不是本人观点,仅仅吐个小槽~
ixuh 发表于 2010-12-10 14:12



    有自己的观点!总比没观点好!

论坛徽章:
0
8 [报告]
发表于 2010-12-16 02:06 |只看该作者
有趣有趣

论坛徽章:
0
9 [报告]
发表于 2010-12-21 13:10 |只看该作者
有趣有趣
cinanine 发表于 2010-12-16 02:06



    有何见解?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP