我很了解鲁比。我相信我现在可能需要学习Python。对于两者都知道的人来说,两者之间有哪些概念相似,又有哪些不同?
我正在寻找一个类似于我为Learning Lua for JavaScripters编写的入门书的列表:一些简单的东西,比如空白意义和循环构造;Python中nil
的名称,以及什么值被认为是“truthy”;使用map
和each
的等价物是不是很习惯,或者说是不是有些地方的理解是正常的?
如果我得到了各种各样的答案,我很乐意将它们聚合到一个社区wiki中。否则你们都可以互相争斗,互相抄袭,试图建立一个真正全面的清单。
编辑:要清楚,我的目标是“正确的”和惯用的Python。如果有一个相当于inject
的Python,但是没有人使用它,因为有一种更好/不同的方法来实现迭代列表和累积结果的通用功能,那么我想知道您是如何做的。也许我会用一系列的共同目标来更新这个问题,比如你如何用Ruby来实现这些目标,然后问Python中的等价物是什么。
在Ruby工作了6年之后,我刚刚花了几个月的时间学习Python。这两种语言实在没有什么可比性,所以我决定自己编一本。现在,它主要关注函数式编程,但是既然你提到了Ruby的
inject
方法,我猜我们的波长是一样的。我希望这有帮助:The 'ugliness' of Python
几点可以让你朝着正确的方向前进:
在Ruby中使用的所有函数式编程优点都是在Python中使用的,而且更加简单。例如,可以完全按照预期映射函数:
Python没有类似于
each
的方法。由于只对副作用使用each
,因此Python中的等效项是for循环:当a)必须一起处理函数和对象集合时,列表理解非常好;b)需要使用多个索引进行迭代时,列表理解非常好。例如,要查找字符串中的所有回文(假设您有一个函数
p()
,该函数返回回文的true),只需要一个列表理解:以下是一些关键的区别:
Ruby有块;Python没有。
Python有函数,而Ruby没有。在Python中,可以接受任何函数或方法并将其传递给另一个函数。在Ruby中,一切都是一个方法,不能直接传递方法。相反,你必须把它们包装在过程中才能通过。
Ruby和Python都支持闭包,但方式不同。在Python中,可以在另一个函数中定义函数。内部函数具有对外部函数变量的读取访问权限,但不具有写入访问权限。在Ruby中,使用块定义闭包。闭包对外部作用域中的变量具有完全的读写访问权限。
Python有列表理解,非常有表现力。例如,如果你有一个数字列表,你可以写
获取大于15的所有值的平方的新列表。在Ruby中,您必须编写以下内容:
Ruby代码没有那么紧凑。它的效率也不高,因为它首先将values数组转换为包含大于15的值的较短的中间数组。然后,取中间数组,生成一个包含中间数组平方的最终数组。然后抛出中间数组。因此,Ruby在计算过程中最终在内存中有3个数组;Python只需要输入列表和结果列表。
Python还提供类似的映射理解。
Python支持元组,而Ruby不支持元组。在Ruby中,必须使用数组来模拟元组。
Ruby支持switch/case语句;Python不支持。
Ruby支持标准的三元运算符;Python不支持。
Ruby只支持单一继承。如果需要模拟多重继承,可以定义模块并使用mix-ins将模块方法拉入类。Python支持多重继承,而不是模块混合。
Python只支持单行lambda函数。Ruby块是一种lambda函数,可以任意大。因此,Ruby代码通常是以比Python代码更实用的风格编写的。例如,要在Ruby中循环一个列表,通常需要
块的工作方式非常类似于传递给
collection.each
的函数。如果要在Python中执行相同的操作,则必须定义一个命名的内部函数,然后将其传递给每个方法的集合(如果list支持此方法):这不是很好的流动。因此,Python通常使用以下非功能性方法:
以安全的方式使用资源在这两种语言中是完全不同的。这里的问题是,您希望分配一些资源(打开文件、获取数据库游标等),对其执行一些任意操作,然后以安全的方式关闭它,即使发生异常。
在Ruby中,由于块非常容易使用(请参见#9),您通常将此模式编码为一个方法,该方法接受一个块,以便对资源执行任意操作。
在Python中,为任意操作传入一个函数要复杂一些,因为必须编写一个命名的内部函数(请参见#9)。相反,Python使用
with
语句来安全地处理资源。有关详细信息,请参见How do I correctly clean up a Python object?。我的建议是:不要试图去了解这些差异。学习如何用Python解决问题。就像每个问题都有一个Ruby方法(这很好地解决了语言的局限性和优势),也有一个Python方法来解决问题。他们都不一样。为了充分利用每种语言,你真的应该学习语言本身,而不仅仅是从一种语言到另一种语言的“翻译”。
现在,这样说,差异将帮助您更快地适应并对Python程序进行1次修改。开始写作就可以了。但试着从其他项目中学习架构和设计决策背后的原因,而不是语言语义背后的原因。。。
相关问题 更多 >
编程相关推荐