Ruby 和 Python 相比有什麼優勢和缺陷?


引用一下孟岩的區分標準

Ruby是一種魔幻語言,而Python是一種簡約語言

具體可以看看http://blog.csdn.net/myan/article/details/2028545

好吧看我的說明,我也是偏魔幻的愛好者

=============================================

5年之後,畢竟形勢比人強,我的今年(2017)最需要學的開發語言變成了python,畢竟Data Science與Machine Learning中python是主要語言,沒有ruby什麼事了


python用的人多,用戶層面小白多,寫手更良莠不齊一點。

ruby,基本用的人都是語法糖愛好者,各種炫技都能看到,真oo無雙嗯。

雖然我python用的多一點,但是當我想去看看腳本語言的好書的時候,我發現大部分時間要去看ruby的書才能有不錯的提高。比如metaprogramming ruby。


Ruby的寫法更加靈活,寫起來更加舒服,但是這也導致不同人的代碼風格差異很大,協作起來需要更多的精力。


剛在G+上寫了篇帖子,貼一下。有些觀點和前面的觀點有所重複,請見諒。

正文如下:

本周的Pycoder"s Weekly不錯,第一個Topic是:

「What are the advantages of Python over Ruby?」

這是Quora上的一個問答,網址在:

http://www.quora.com/What-are-the-advantages-of-Python-over-Ruby

Python和Ruby陣營之間似乎一直在爭論誰更好(貌似Ruby陣營的人們更狂熱些),不信可以試試google一下「Python Ruby」。上面這篇文章我目前還沒看,在看之前先說說我的個人看法:

Python優於Ruby的地方:

a) Python開發人員的背景豐富多彩,陣營規模很大,這直接導致了Python的各種lib比Ruby多很多很多很多

b) 和Ruby相反,Python的哲學是「做一件事情有且只有一種方法」(There should be one-- and preferably only one --obvious way to do it.)。Ruby的信徒會覺得這樣非常boring,但是我覺得這一點減輕了人們在開發時的認知負擔和選擇成本,對於提高開發效率是很有幫助的。同時,這個特點使得不同的人用Python寫出來的代碼不至於相差很大,這對於團隊合作也是很有用的。(這點也導致了Python中是有公認的Best Practice的,但是Ruby中就很難找到一個公認的Best Practice)

c) Python在面向對象上做的並不好,其實是把面向過程和面向對象雜糅起來了。(隨著Python 3的發展相信這點會有所改觀)我個人雖然感覺這樣不太好,但是實際用的時候就會發現,不強調面向對象其實能夠減輕程序員的認知負擔,寫起代碼來會比較隨心所欲,對於c程序員來說也更容易接受。(好吧,如果你覺得這點是Python的缺點,那麼其實你也是對的~)

d) Python開始慢慢走進大學一年紀的教科書,可以預見,未來的Python開發者陣營會繼續不斷壯大。(當然Ruby的陣營也會越來越大)

e) Python解釋器,特別是CPython,目前比現有的Ruby解釋器快很多。這點Ruby的發明人Matz也是很想再重新寫個Ruby的虛擬機,但是苦於要做的事情很多,不知道什麼時候能完成。Ruby的運行效率目前來看實在太慢了些。(當然程序運行效率和代碼是如何寫的也有很大關係,想讓Ruby程序儘可能快的話,除了一般的程序優化方法外,還要注意要多用built-in的東西,因為它們是用c寫的,運行快)

f) Python的語法比較簡單,容易上手。

說了這麼多Python優於Ruby的地方,現在再來說說我覺得Ruby優於Python的地方:

a) 第一個印入我的腦海的優點是:有趣!當你開始慢慢學會使用Ruby後,你就會覺得Python的代碼比較死板。這是因為Ruby從Perl中繼承的一條哲學是和Python完全相反的:「每一件事情總是有多種做法」(Having more than one way to do the same thing)。所以程序員的創造力就完全被激發出來了。當你看到某個問題的一種前所未見又十分優雅的解決方案時,你會有一種混雜著強烈喜悅的驚訝的——寫(優美的)Ruby能夠激發人的靈感。

b) Matz在設計Ruby的時候就想方設法讓Ruby成為一個「人性化」的語言,力求使Ruby程序員感覺到使用Ruby是一件愉悅的事情。你能從Mixin、程序塊、元編程、極具包容性的語法等等當中獲得一種喜悅。

c) 純粹的面向對象,極其強大的元編程功能。Ruby是純粹的面向對象。CSDN的范凱曾經說過:「你學習了Ruby以後,你就會發現,原來Java/C++所謂的面向對象就是TMD的山寨版本的面向對象,原來面向對象還可以這樣玩啊」(http://robbin.iteye.com/blog/969154)。Ruby的元編程能力還有寬鬆的語法使得使用Ruby可以很輕鬆的開發DSL(Domain Specific Language),這一點Python是搞不定的。

d) Ruby on Rails!要不是DHH開發出了RoR不知道現在還會有多少人在用Ruby。毋庸置疑,RoR是快速Web開發的神器。為什麼RoR那麼牛?有一個很重要的原因就是RoR將Ruby的元編程能力發揮到了極致,「甚至到了一種變態的程度」(Matz語,見《松本行弘的程序世界》http://book.douban.com/subject/6756090/ P.S.想要了解Ruby設計思想的話此書一定要讀一讀,起碼是部分章節)

e) Ruby吸收了很多語言(Lisp、Smalltalk等等)的特性,對於程序員來說了解一下Ruby對於開闊思路是很有幫助的,它能幫助你更好的看清你之前一直使用的語言的限制之處在哪。

暫時就想到這麼多,應該還有很多補充的空間。我使用Python和Ruby的時間也很短,所以還是多多參考些Python和Ruby雙料大牛們的意見吧~


Python我在2002年開始學習的。當時它是腳本語言之王,所以同一個時代用ruby不爽,用python爆強。 用了13年後, python已經用到熟了。就象是英語一樣,很「中國」式的熟練。 不過這麼多年經歷中,經常被ruby震動。 無論是WEB, 測試, 運維配置, 工具。 總能看到ruby忽然出來優美的東東出來,遠超過python幾條街。 無語,只能低聲下氣的,用著爛爛的python包,不滿意,自己動手改一下,湊和著用。

最近在用puppet,暈死,又是ruby寫的。ansible果然 還是python的風格,快速來一腳,也不管好不好,歇了。 憋屈。 所以只能支持用puppet。

嘆氣,ruby還是要學啊,perl, java, php一個少不了。 命苦。

不過,大數據方面,人工智慧,圖像處理,GUI等方面,python的積累還是很厚的。很少見ruby的身影。 hbase shell那個東東是ruby的。


雖然是很舊的問題,但高票回答實在不爽

直接上代碼吧

# 語法混亂,很魔幻的ruby
require "sinatra"

get "/" do
"Hello world!"
end

# 據說語法簡潔直接、優雅的python
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"

if __name__ == "__main__":
app.run()

上面是sinatra和flask的hello world,這應該是兩個社區中各自公認簡潔的web框架,多少能體現語言的能力和風格,大家請自己分辨。

關於性能其實大家隨便寫點斐波那契之類的代碼自己跑下就好,反正我試了幾次結果和高票答案不太一致,順便提示下現在的ruby版本是2.1.x,請不要用1.9.3以下甚至1.8的版本來benchmark(很多人喜歡這麼干!)

-------------update--------------

抱歉,關於效率我本來想benchmark下貼結果的,但是終究下不了決定是用py2還是py3...


儘管ruby一直都說解決問題有N種辦法,python只有一種辦法,但還是不能避免

「聽好兒子,要提出目標,但不可盲目追隨它」

「我明白了爸爸,就像Python那樣提出『只採用唯一正確的方法』那樣的目標,實際上卻存在2、3版本的不兼容」

「住口!」

「urllib和urllib2」

「住口!!!」

ruby誕生之初的語法就是為了嵌入式DSL而優化設計的,而python則是作為一種膠水語言,用兩種語言在對方擅長的場景裡面寫一寫,就可以明白了


Ruby的確是比Python更乾淨的OOP,這也不奇怪,Ruby根本就是Smalltalk換了點語法而已。

但這個更乾淨並不是a.length vs. len(a),名詞在前還是動詞在前的問題,否則OOP也未免太膚淺了。

在Python里,對於a.f()可能是調用a所屬的類的方法f,也可能是調用a的屬性f。這個二義性在metaprogramming時帶來很多不一致和麻煩,比如Python對__xxx__ magic method lookup的特殊規定。

Ruby沒有這個問題。事實上另一個有此問題的語言是C++。C++和Python都是設計者對OOP只有感性認識的時候打的基礎...


生產力是檢驗語言優秀能力的唯一標準。


Ruby:Metaprogramming Ruby

Python:寫python metaprogramming的只在部分書章節里有闡述

這是Ruby和python的最大區別。如果你的應用要寫api(code)generator,要設計某種形式的DSL,需要語言的OO模型像一塊橡皮泥,這是用Ruby的好時候。

其他方面,python的語法設計長期對團隊更有利,簡潔統一。


我個人的選擇是是Ruby和Lisp

不要小看編程語言的能力和差異,ruby和python是完全不一樣的語言,就像python和perl,perl和php,只有實際寫過大量代碼做過設計構架的人,才知道一個更優美更適合建築師(而非工程師)的編程語言能帶給自己什麼。

我想說性能,平台部署能力,兼容性,都是工程師關心的。對於建築師來說,唯一關心的,就是語言的表達力(是否簡潔?是否可讀?)和優雅程度(是否足夠抽象?)

當然,函數庫也很重要,但,多,不代表好。

想說的很多,但是有人說的比我更好,好的多,我推薦所有對語言之爭感興趣的人,去閱讀一下Paul Graham的《黑客與畫家》這本書的後面幾章。


ruby的優勢

===========

- ruby不強制縮進

- ruby有著更強大的語法,使用更靈活

- 一件事通常有多種做法,就像茴香豆的茴有多種寫法一樣

- ruby on rails很酷

- ruby更OOP

- ruby更適合geek

python的優勢

============

- python強制縮進

- python有著更簡單的語法,上手更容易

- python更易讀

- 一件事通常只有一種最優的方案

- Python有著更多更成熟的庫

- Python可以預編譯成bytecode

- Python的性能更好

- Python更適合團隊


非常贊同@王騂的回答。

簡單的說

Ruby 文藝,Python 普通


上面好像沒人提到,說個對我個人簡單而重要的理由:

我覺得 Python 的代碼更整潔看起來很漂亮。


我發現一個有趣的現象,多年經驗的c++ 程序員多數都比較喜歡python ;而有多年經驗的java程序員多數都比較喜歡ruby,


我前後想了好幾遍,還是覺得這兩個語言除了語法糖味道不一樣就沒什麼區別了


Python用途比Ruby要廣。

這兩個雖然是宿敵,但是實際上真正能有得一比也就是在Web開發領域了。除開這個,Ruby和Python不是一個體量的。


這兩個我都學了,談談自己的想法:

Ruby拿過來,你就寫吧,每個人每個寫法,同一個問題,可以有n多寫法,無所謂孰優孰劣,達到目的就可以了。

Ruby最大的優勢就是純粹面向對象,例如對於一個string a,獲取長度,在ruby中很乾脆,a.length 或者 a.size;在python中,需要len(a),對於有頑固面向對象思想人來說,python的寫法讓人受不了。

我個人也是業餘愛好,使用的是windows系統,python相對來說對windows更友好,這是我自己實踐感覺出來的,django在windows下apache上的配置很簡單,ror想在windows上配置能把你折騰到死。

python的強制縮進可以讓你養成良好的編程習慣,也便於別人閱讀。同時python對於每一個問題,都有一個推薦做法,相對來說,一個人寫的程序,另外一個人可以輕易讀懂。

python有自己的哲學,python中文用戶組的「大道至簡」也是我個人比較喜歡的哲學。不要把簡單的問題複雜化,「如無必要,勿增實體」。

最後,兩者其實都是腳本語言,差不多,學會了一種,另外一種也很容易就學會了。


你們都說語言了我說點別的吧。

rails比django靈活有趣(別罵我~)

python運行速度快。


Ruby更靈活,更容易被扭曲至你想要的樣子,具體來說就是簡單易用的block、對元編程的強大支持、源代碼編排格式靈活,你可以很輕易的用Ruby實現DSL。Ruby的社區更活躍,有RoR這個殺手級應用,但是貌似在科學應用方面,幾乎為零(我在同濟土木的同學用python)。

Python不怎麼了解,只學過一段時間,後來全忘記了,只記得對源代碼編排格式,強制要求用空格縮進,個人覺得十分蛋疼。


推薦閱讀:

如何配置伺服器自動監控並報警?
Python、Ruby、Go語言哪個更值得學習?
Ruby 更像 Perl 還是 Python?

TAG:編程語言 | Ruby | Python | TIOBE |