论坛首页 编程语言技术论坛

Ruby和Python的语法差别

浏览 43290 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-10-11  
ajoo 写道
cookoo 写道

1. well...python还没block呢

lambda不就是block?为什么说没有?


python里面的lambda比block弱一些,只能是表达式
python2.5里面有一个类似的with语句,同样秉承python的显式处理哲学,所以使用起来比block有限制,同时也罗嗦一点点.
其实简单得block,在python里面直接用list comprehension就能搞定,可读性显然大于用block的办法
如:
cy = [ x for x in cx if x > 5 ]

表示cy是cx序列中所有>5的元素的集合
0 请登录后投票
   发表时间:2006-10-11  
njmzhang 写道
[b,a][?]不是shortcut的


是啊。所以这个也会出现非常有意思的问题,如:
c = a != 0 and b/a or MAX_INT

就不能转换成
[0,b/a][a != 0]


python在这里确实很不爽。不同的idiom方法只能用于不同的场景,极端情况下还是需要用if/else搞定
不过2.5以后就可以直接用
c = b / a if a !=0 else MAX_INT 

0 请登录后投票
   发表时间:2006-10-11  
charon 写道

这个用上__slots__就可以了。
但是说到这类打字错误,python和ruby都是难兄难弟,ruby不比python强一点,也不会弱。都需要靠单元测试来确定这类错误,属于50步 vs 50步.


确实如此,哈哈刚发现你原来的代码里就有个typo: 最后那个reporducer
def simple_reproducer_factory(): 
    def reproducer(seeds,gametes):
        ......
        return children
    reproducer.times_of_length = 1
    return reporducer

引用

还是有重要差别的,首先那个simple_reproducer_factory是一个顶级的函数,不在任何class里面,其次这个reproducer也是一个函数,这两个家伙都不是方法. 但是对于函数对象,还可以往上添加属性.
前面说的不够OO主要是指这个意思,使我不必再纠缠在class的世界里面。


ruby和python一样,也是有top level函数的,不用空造个类包装一下。函数也能直接当参数传来传去,所谓first class对象。但是差别确实是有的:ruby的method默认会绑定到对象上去,所以即使是top level声明的method, 实际已经隐式地绑定到self上去了。相反,python的method默认不邦定,所以当作为实例方法的时候需要显式地传self进去绑定。

正因为这样ruby提供了不需要绑定的proc:
p = proc {|x| puts x}
p.better_accessor :test => 1
p.test #=> 1

而method无论是否top level,不能直接这么用,需要‘去绑定’之后获得单独的Method对象才能用:
def foo(n)  puts n; end
foo.better_accessor :bar => 1 # ArgumentError: wrong number of arguments (0 for 1)    
f = self.method :foo # =>  #<Method: Object#foo>  
f.better_accessor :bar => 1

所以更正一下前面我自己说的:像你python代码那样直接内建一个method再传出来在ruby里要绕弯路,改成内建一个proc再传出来。
0 请登录后投票
   发表时间:2006-10-11  
确实方法的bound,unbound带来了一些很微妙的东西
python采用了偏向函数的方式来解决这个问题,相对一致一些,但是理解上会带来一些困惑.不过类方法声明中的那个第一个参数self即便没有也可以通过上下文在编译期或运行期推断出来的,但好像为了显式哲学这个self还会流传下去.
ruby干脆一拍两散,倒也干净
0 请登录后投票
   发表时间:2006-10-13  
njmzhang 写道
对我来说,Python不爽的地方更多,
没有?:表达式我就觉得不方便,dive-in-python书上用的1 and a or b这个技巧实在难看


2.5里,可以这么写:
a if expression else b


如果expression为True则返回a,否则返回b,感觉还是很自然的啊……
0 请登录后投票
   发表时间:2007-01-29  
Ruby很多地方要比Python高明,毕竟matz在写Ruby的时候,是站在Python的肩膀上的。

性能方面,Python比Ruby要好,但两者都是动态语言,都好不到哪里去,所以打平。非要追求很高的性能的话,两者都不能用。

语法和思想方面,Ruby优于Python,Python的self,不去写一个大一点的程序是不知道的,初始化的函数里面每一行几乎都要self下,用的时候再self下,我记得当初放弃Python很大的一个原因,就是因为某些语法的不可容忍。

成熟度方面,Python优于Ruby,Python发展的时间比Ruby长,所以社区比较成熟,有很多成熟的应用,比如豆瓣这样的,或许这就是我们争论的很大一个原因,Ruby比Python发展的时间少很多,这是大家比较的时候忽略的一点。但再看看google trends里面吧,其实Ruby已经超越了Python,当然比较的时候,请记得加上rails,django等,这样就比较明显了。Ruby在Windows上很不成熟,这说明什么?这说明Ruby还有很大的上升空间,因为并不是Ruby做不到,而是还欠火候,而Python的上升空间已经相对很小了。

0 请登录后投票
   发表时间:2007-01-29  
imagex 写道

性能方面,Python比Ruby要好,但两者都是动态语言,都好不到哪里去,所以打平。非要追求很高的性能的话,两者都不能用。

虽然都是动态语言,但是性能上还是有差异的。ruby比python慢个3-5倍,在没优化时如此,优化(当然不是优化算法,而是使用psyco或yarv之类的)之后还是差不多。
所以并不是打平,有个哥们就是因为这个原因从rails转向到django. http://reddit.com/user/jesusphreak/

引用

语法和思想方面,Ruby优于Python,Python的self,不去写一个大一点的程序是不知道的,初始化的函数里面每一行几乎都要self下,用的时候再self下,我记得当初放弃Python很大的一个原因,就是因为某些语法的不可容忍。

hehe.这个就不知道了。
我当初选择python,也就是因为它严格/显式的语法.比如self,当初写C++/java程序时,只有在引起混淆的时候才写this,属于可选项,发生问题时最后也不知道到底是漏写了还是怎么着另有深意.现在强制如此,代码读起来爽多了.

引用

但再看看google trends里面吧,其实Ruby已经超越了Python,当然比较的时候,请记得加上rails,django等,这样就比较明显了。

这句话,不客气地说就是扯淡.
客气的说,应该改成: rails已经超越了django. 但说句实话,rails一直在django之前,所以是句废话.
至于python和ruby,真实趋势如何不了解,但是google上的,很容易查:
http://www.google.com/trends?q=python+programming%2Cruby+programming
不需要加什么rails,django之类的. 否则比较的是框架,而不是语言本身.
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics