从Ruby学习Python;异同

2024-09-28 20:52:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我很了解鲁比。我相信我现在可能需要学习Python。对于两者都知道的人来说,两者之间有哪些概念相似,又有哪些不同?

我正在寻找一个类似于我为Learning Lua for JavaScripters编写的入门书的列表:一些简单的东西,比如空白意义和循环构造;Python中nil的名称,以及什么值被认为是“truthy”;使用mapeach的等价物是不是很习惯,或者说是不是有些地方的理解是正常的?

如果我得到了各种各样的答案,我很乐意将它们聚合到一个社区wiki中。否则你们都可以互相争斗,互相抄袭,试图建立一个真正全面的清单。

编辑:要清楚,我的目标是“正确的”和惯用的Python。如果有一个相当于inject的Python,但是没有人使用它,因为有一种更好/不同的方法来实现迭代列表和累积结果的通用功能,那么我想知道您是如何做的。也许我会用一系列的共同目标来更新这个问题,比如你如何用Ruby来实现这些目标,然后问Python中的等价物是什么。


Tags: 名称概念map目标列表for空白意义
3条回答

在Ruby工作了6年之后,我刚刚花了几个月的时间学习Python。这两种语言实在没有什么可比性,所以我决定自己编一本。现在,它主要关注函数式编程,但是既然你提到了Ruby的inject方法,我猜我们的波长是一样的。

我希望这有帮助:The 'ugliness' of Python

几点可以让你朝着正确的方向前进:

  • 在Ruby中使用的所有函数式编程优点都是在Python中使用的,而且更加简单。例如,可以完全按照预期映射函数:

    def f(x):
        return x + 1
    
    map(f, [1, 2, 3]) # => [2, 3, 4]
    
  • Python没有类似于each的方法。由于只对副作用使用each,因此Python中的等效项是for循环:

    for n in [1, 2, 3]:
        print n
    
  • 当a)必须一起处理函数和对象集合时,列表理解非常好;b)需要使用多个索引进行迭代时,列表理解非常好。例如,要查找字符串中的所有回文(假设您有一个函数p(),该函数返回回文的true),只需要一个列表理解:

    s = 'string-with-palindromes-like-abbalabba'
    l = len(s)
    [s[x:y] for x in range(l) for y in range(x,l+1) if p(s[x:y])]
    

以下是一些关键的区别:

  1. Ruby有块;Python没有。

  2. Python有函数,而Ruby没有。在Python中,可以接受任何函数或方法并将其传递给另一个函数。在Ruby中,一切都是一个方法,不能直接传递方法。相反,你必须把它们包装在过程中才能通过。

  3. Ruby和Python都支持闭包,但方式不同。在Python中,可以在另一个函数中定义函数。内部函数具有对外部函数变量的读取访问权限,但不具有写入访问权限。在Ruby中,使用块定义闭包。闭包对外部作用域中的变量具有完全的读写访问权限。

  4. Python有列表理解,非常有表现力。例如,如果你有一个数字列表,你可以写

    [x*x for x in values if x > 15]
    

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

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

    Ruby代码没有那么紧凑。它的效率也不高,因为它首先将values数组转换为包含大于15的值的较短的中间数组。然后,取中间数组,生成一个包含中间数组平方的最终数组。然后抛出中间数组。因此,Ruby在计算过程中最终在内存中有3个数组;Python只需要输入列表和结果列表。

    Python还提供类似的映射理解。

  5. Python支持元组,而Ruby不支持元组。在Ruby中,必须使用数组来模拟元组。

  6. Ruby支持switch/case语句;Python不支持。

  7. Ruby支持标准的三元运算符;Python不支持。

  8. Ruby只支持单一继承。如果需要模拟多重继承,可以定义模块并使用mix-ins将模块方法拉入类。Python支持多重继承,而不是模块混合。

  9. Python只支持单行lambda函数。Ruby块是一种lambda函数,可以任意大。因此,Ruby代码通常是以比Python代码更实用的风格编写的。例如,要在Ruby中循环一个列表,通常需要

    collection.each do |value|
      ...
    end
    

    块的工作方式非常类似于传递给collection.each的函数。如果要在Python中执行相同的操作,则必须定义一个命名的内部函数,然后将其传递给每个方法的集合(如果list支持此方法):

    def some_operation(value):
      ...
    
    collection.each(some_operation)
    

    这不是很好的流动。因此,Python通常使用以下非功能性方法:

    for value in collection:
      ...
    
  10. 以安全的方式使用资源在这两种语言中是完全不同的。这里的问题是,您希望分配一些资源(打开文件、获取数据库游标等),对其执行一些任意操作,然后以安全的方式关闭它,即使发生异常。

    在Ruby中,由于块非常容易使用(请参见#9),您通常将此模式编码为一个方法,该方法接受一个块,以便对资源执行任意操作。

    在Python中,为任意操作传入一个函数要复杂一些,因为必须编写一个命名的内部函数(请参见#9)。相反,Python使用with语句来安全地处理资源。有关详细信息,请参见How do I correctly clean up a Python object?

我的建议是:不要试图去了解这些差异。学习如何用Python解决问题。就像每个问题都有一个Ruby方法(这很好地解决了语言的局限性和优势),也有一个Python方法来解决问题。他们都不一样。为了充分利用每种语言,你真的应该学习语言本身,而不仅仅是从一种语言到另一种语言的“翻译”。

现在,这样说,差异将帮助您更快地适应并对Python程序进行1次修改。开始写作就可以了。但试着从其他项目中学习架构和设计决策背后的原因,而不是语言语义背后的原因。。。

相关问题 更多 >