从Ruby学习Python异同

问题:

我非常了解Ruby。我相信我现在可能需要学习Python。对于那些知道两者的人来说,两者之间的概念是相似的,有什么不同?
我正在寻找类似于我为Learning Lua for JavaScripters写的引文的列表:简单的东西,如空格意义和循环结构; Python中的nil的名称,以及什么值被认为是“真实的”;使用等价于mapeach的惯例,还是mumble somethingaboutlistcomprehensions mumble规范?
如果我得到各种各样的答案,我很乐意将它们聚合成一个社区维基。否则你们都可以相互争斗和共同努力,尝试创造一个真正的综合清单。
 编辑:要清楚,我的目标是“正确”和惯用的Python。如果有一个Python等效的inject,但没有人使用它,因为有更好/不同的方式来实现迭代列表和累积结果的通用功能,我想知道你如何做事情。也许我会用一个常见的目标列表来更新这个问题,你如何在Ruby中实现它们,并且问Python中的等价物。

回答:

这里有一些关键的区别:

  1. Ruby有块Python没有。
  2. Python有功能; Ruby没有。在Python中,您可以使用任何函数或方法并将其传递给另一个函数。在Ruby中,一切都是一种方法,方法不能直接传递。相反,你必须将它们包装在Proc中才能通过它们。
  3. Ruby和Python都支持闭包,但是以不同的方式。在Python中,您可以在另一个函数中定义一个函数。内部函数具有对外部函数的变量的读取访问权限,但不能写入访问权限。在Ruby中,使用块定义闭包。闭包对外部范围的变量具有完全的读写访问权限。
  4. Python有列表推理,这是非常有表现力的。例如,如果你有一个数字列表,你可以写
      [x * x for x in x if x> 15]

    获取所有值大于15的正方形的新列表。在Ruby中,您必须编写以下内容:

      values.select {| v | v> 15} .map {| v | v * v}

    Ruby代码不那么紧凑。它也不是很有效率,因为它首先将值数组转换为包含大于15的值的较短的中间数组。然后,它将使用中间数组并生成包含中间体平方的最终数组。然后中间阵列被抛出。所以,Ruby在计算过程中最终在内存中有3个数组; Python只需要输入列表和结果列表。
    Python也提供类似的地图理解。
  5. Python支持元组; Ruby没有。在Ruby中,必须使用数组来模拟元组。
  6. Ruby支持switch / case语句; Python没有。
  7.  Ruby supports the standard expr ? val1 : val2 ternary operator; Python does not.
  8. Ruby只支持单一继承。如果您需要模仿多个继承,您可以定义模块并使用mix-ins将模块方法拉入类。 Python支持多重继承而不是模块混合。
  9. Python只支持单行lambda函数。 Ruby块是一种/种lambda函数,可以是任意大的。因此,Ruby代码通常以比Python代码更加功能的方式编写。例如,要循环使用Ruby中的列表,您通常会执行此操作
      collection.each do | value |
      ...
    结束

    该块非常像传递给collection.each的函数。如果你在Python中做同样的事情,你必须定义一个命名的内部函数,然后将它传递给每个方法(如果列表支持这个方法):
    def some_operation(value):
      ...

    collection.each(some_operation)

    这不流畅。因此,通常在Python中将使用以下非功能性方法:

     在收藏中的价值:
      ...
  10. 两种语言之间的安全使用资源是完全不同的。在这里,问题是您要分配一些资源(打开文件,获取数据库游标等),对其执行一些任意操作,然后即使出现异常,也可以以安全的方式关闭它。
    在Ruby中,由于块非常容易使用(参见#9),通常会将此模式编码为一种方法,该方法可以为任意操作在资源上执行一个块。
    在Python中,传递一个函数来执行任意动作,因为你必须编写一个命名的内部函数(见#9)。相反,Python使用with语句来安全的资源处理。有关详细信息,请参阅How do I correctly clean up a Python object?

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Learning Python from Ruby; Differences and Similarities

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

34 + = 35