锁定老帖子 主题:Ruby和Python的语法差别
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间: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的元素的集合 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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再传出来。 |
|
返回顶楼 | |
发表时间:2006-10-11
确实方法的bound,unbound带来了一些很微妙的东西
python采用了偏向函数的方式来解决这个问题,相对一致一些,但是理解上会带来一些困惑.不过类方法声明中的那个第一个参数self即便没有也可以通过上下文在编译期或运行期推断出来的,但好像为了显式哲学这个self还会流传下去. ruby干脆一拍两散,倒也干净 |
|
返回顶楼 | |
发表时间:2006-10-13
njmzhang 写道 对我来说,Python不爽的地方更多,
没有?:表达式我就觉得不方便,dive-in-python书上用的1 and a or b这个技巧实在难看 2.5里,可以这么写: a if expression else b 如果expression为True则返回a,否则返回b,感觉还是很自然的啊…… |
|
返回顶楼 | |
发表时间: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的上升空间已经相对很小了。 |
|
返回顶楼 | |
发表时间: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之类的. 否则比较的是框架,而不是语言本身. |
|
返回顶楼 | |