Es gibt viele Diskussionen zwischen Python und Ruby, und ich finde sie alle völlig wenig hilfreich, weil sie sich alle umdrehen, warum Feature X die Sprache Y nervt oder die Behauptung, dass die Sprache Y kein X hat, obwohl dies tatsächlich der Fall ist. Ich weiß auch genau, warum ich Python bevorzuge, aber das ist auch subjektiv und würde niemandem bei der Auswahl helfen, da sie möglicherweise nicht den gleichen Geschmack in der Entwicklung haben wie ich.
Es wäre daher interessant, die Unterschiede objektiv aufzulisten. Also kein "Pythons Lambdas saugt". Erklären Sie stattdessen, was Rubys Lambdas können, was Pythons nicht kann. Keine Subjektivität. Beispielcode ist gut!
Bitte haben Sie nicht mehrere Unterschiede in einer Antwort. Und stimmen Sie diejenigen ab, von denen Sie wissen, dass sie richtig sind, und diejenigen, von denen Sie wissen, dass sie falsch (oder subjektiv) sind. Auch Unterschiede in der Syntax sind nicht interessant. Wir wissen, dass Python mit Einrückungen macht, was Ruby mit Klammern und Enden macht, und dass @ in Python selbst heißt.
UPDATE: Dies ist jetzt ein Community-Wiki, daher können wir hier die großen Unterschiede hinzufügen.
Ruby hat eine Klassenreferenz im Klassenkörper
In Ruby haben Sie einen Verweis auf die Klasse (self), die sich bereits im Klassenkörper befindet. In Python haben Sie erst nach Abschluss der Klassenkonstruktion einen Verweis auf die Klasse.
Ein Beispiel:
class Kaka
puts self
end
Selbst in diesem Fall ist die Klasse, und dieser Code würde "Kaka" ausdrucken. Es gibt keine Möglichkeit, den Klassennamen auszudrucken oder auf andere Weise über den Klassendefinitionskörper in Python (außerhalb von Methodendefinitionen) auf die Klasse zuzugreifen.
Alle Klassen sind in Ruby veränderbar
Auf diese Weise können Sie Erweiterungen für Kernklassen entwickeln. Hier ist ein Beispiel für eine Schienenverlängerung:
class String
def starts_with?(other)
head = self[0, other.length]
head == other
end
end
Python (stellen Sie sich vor, es gäbe keine ''.startswith
Methode):
def starts_with(s, prefix):
return s[:len(prefix)] == prefix
Sie können es für jede Sequenz verwenden (nicht nur für Zeichenfolgen). Um es zu verwenden, sollten Sie es explizit importieren, z from some_module import starts_with
.
Ruby verfügt über Perl-ähnliche Skriptfunktionen
Ruby verfügt über erstklassige Regexps, $ -Variablen, die zeilenweise awk / perl-Eingabeschleife und andere Funktionen, die es besser geeignet machen, kleine Shell-Skripte zu schreiben, die Textdateien mischen oder als Klebercode für andere Programme dienen.
Ruby hat erstklassige Fortsetzungen
Dank der callcc-Anweisung. In Python können Sie Fortsetzungen mit verschiedenen Techniken erstellen, die Sprache ist jedoch nicht unterstützt.
Ruby hat Blöcke
Mit der Anweisung "do" können Sie in Ruby eine mehrzeilige anonyme Funktion erstellen, die als Argument an die Methode vor do übergeben und von dort aufgerufen wird. In Python würden Sie dies stattdessen entweder durch Übergeben einer Methode oder mit Generatoren tun.
Rubin:
amethod { |here|
many=lines+of+code
goes(here)
}
Python (Ruby-Blöcke entsprechen verschiedenen Konstrukten in Python):
with amethod() as here: # `amethod() is a context manager
many=lines+of+code
goes(here)
Oder
for here in amethod(): # `amethod()` is an iterable
many=lines+of+code
goes(here)
Oder
def function(here):
many=lines+of+code
goes(here)
amethod(function) # `function` is a callback
Interessanterweise heißt die Convenience-Anweisung in Ruby zum Aufrufen eines Blocks "Yield", wodurch in Python ein Generator erstellt wird.
Rubin:
def themethod
yield 5
end
themethod do |foo|
puts foo
end
Python:
def themethod():
yield 5
for foo in themethod():
print foo
Obwohl die Prinzipien unterschiedlich sind, ist das Ergebnis auffallend ähnlich.
Ruby unterstützt die funktionale (Pipe-ähnliche) Programmierung einfacher
myList.map(&:description).reject(&:empty?).join("\n")
Python:
descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions))
Python verfügt über integrierte Generatoren (die wie oben erwähnt wie Ruby-Blöcke verwendet werden).
Python unterstützt Generatoren in der Sprache. In Ruby 1.8 können Sie das Generatormodul verwenden, das Fortsetzungen verwendet, um einen Generator aus einem Block zu erstellen. Oder Sie könnten einfach einen Block / proc / lambda verwenden! Darüber hinaus sind und können in Ruby 1.9 Fasern als Generatoren verwendet werden, und die Enumerator-Klasse ist ein integrierter Generator 4
docs.python.org hat dieses Generatorbeispiel:
def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
Vergleichen Sie dies mit den obigen Blockbeispielen.
Python verfügt über eine flexible Behandlung von Namensräumen
Wenn Sie in Ruby eine Datei mit importieren require
, werden alle in dieser Datei definierten Elemente in Ihrem globalen Namespace gespeichert. Dies führt zu einer Verschmutzung des Namespace. Die Lösung dafür sind Rubys-Module. Wenn Sie jedoch einen Namespace mit einem Modul erstellen, müssen Sie diesen Namespace verwenden, um auf die enthaltenen Klassen zuzugreifen.
In Python ist die Datei ein Modul, und Sie können die darin enthaltenen Namen mit importieren from themodule import *
, wodurch der Namespace verschmutzt wird, wenn Sie möchten. Sie können aber auch nur ausgewählte Namen mit importieren from themodule import aname, another
oder einfach import themodule
und dann auf die Namen mit zugreifen themodule.aname
. Wenn Sie mehr Ebenen in Ihrem Namespace wünschen, können Sie Pakete haben, die Verzeichnisse mit Modulen und einer __init__.py
Datei sind.
Python hat Docstrings
Docstrings sind Strings, die an Module, Funktionen und Methoden angehängt sind und zur Laufzeit überprüft werden können. Dies hilft beim Erstellen von Dingen wie dem Hilfebefehl und der automatischen Dokumentation.
def frobnicate(bar):
"""frobnicate takes a bar and frobnicates it
>>> bar = Bar()
>>> bar.is_frobnicated()
False
>>> frobnicate(bar)
>>> bar.is_frobnicated()
True
"""
Rubys Äquivalent ähnelt Javadocs und befindet sich über der Methode anstatt innerhalb dieser. Sie können zur Laufzeit aus den Dateien abgerufen werden, indem das Beispiel für die Methode # source_location von 1.9 verwendet wird
Python hat mehrere Vererbungen
Ruby nicht ("absichtlich" - siehe Rubys Website, hier erfahren Sie, wie es in Ruby gemacht wird ). Das Modulkonzept wird als eine Art abstrakter Klassen wiederverwendet.
Python hat Listen- / Dikt-Verständnis
Python:
res = [x*x for x in range(1, 10)]
Rubin:
res = (0..9).map { |x| x * x }
Python:
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7c1ccd4>
>>> list(_)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Rubin:
p = proc { |x| x * x }
(0..9).map(&p)
Python 2.7+ :
>>> {x:str(y*y) for x,y in {1:2, 3:4}.items()}
{1: '4', 3: '16'}
Rubin:
>> Hash[{1=>2, 3=>4}.map{|x,y| [x,(y*y).to_s]}]
=> {1=>"4", 3=>"16"}
Python hat Dekorateure
Dinge, die Dekorateuren ähnlich sind, können auch in Ruby erstellt werden, und es kann auch argumentiert werden, dass sie nicht so notwendig sind wie in Python.
Syntaxunterschiede
Ruby benötigt "end" oder "}", um alle Bereiche zu schließen, während Python nur Leerzeichen verwendet. In Ruby wurden kürzlich Versuche unternommen, nur Leerzeichen einzurücken. Http://github.com/michaeledgar/seamless
Antworten:
Ruby hat die Konzepte von Blöcken , die im Wesentlichen syntaktischen Zucker um einen Codeabschnitt sind. Sie sind eine Möglichkeit, Abschlüsse zu erstellen und an eine andere Methode zu übergeben, die den Block verwenden kann oder nicht. Ein Block kann später über eine
yield
Anweisung aufgerufen werden .Eine einfache Definition einer
each
Methode fürArray
könnte beispielsweise so aussehen:Dann können Sie dies folgendermaßen aufrufen:
Python hat anonyme Funktionen / Verschlüsse / Lambdas, aber keine Blöcke, da ein Teil des nützlichen syntaktischen Zuckers fehlt. Es gibt jedoch mindestens einen Weg, um es ad-hoc zu bekommen. Siehe zum Beispiel hier .
quelle
Python-Beispiel
Funktionen sind erstklassige Variablen in Python. Sie können eine Funktion deklarieren, als Objekt weitergeben und überschreiben:
Dies ist ein grundlegendes Merkmal moderner Skriptsprachen. JavaScript und Lua machen das auch. Ruby behandelt Funktionen nicht so. Das Benennen einer Funktion ruft sie auf.
Natürlich gibt es in Ruby Möglichkeiten, diese Dinge zu tun, aber es handelt sich nicht um erstklassige Operationen. Sie können beispielsweise eine Funktion mit Proc.new umschließen, um sie als Variable zu behandeln. Dann ist sie jedoch keine Funktion mehr. Es ist ein Objekt mit einer "Aufruf" -Methode.
Rubys Funktionen sind keine erstklassigen Objekte
Ruby-Funktionen sind keine erstklassigen Objekte. Funktionen müssen in ein Objekt eingewickelt werden, um sie weiterzugeben. Das resultierende Objekt kann nicht wie eine Funktion behandelt werden. Funktionen können nicht erstklassig zugewiesen werden. Stattdessen muss eine Funktion in ihrem Containerobjekt aufgerufen werden, um sie zu ändern.
quelle
x = y
nicht durch Aufrufself.class.send(:define_method, :func, method(:func2))
. Ihr "Gegenbeispiel" zeigt, dass Rubys Funktionen nicht erstklassig sind. Wenn Sie nicht einverstanden sind, können Sie gerne Ihre eigene Antwort posten. Steck deine Verwirrung nicht in meine.def ... end
in Ruby definiert sind, sind keine Funktionen. Es sind Methoden (wie Sie sie definiert habenKernel
). Methoden können ungebunden sein (unter Verwendung der#method
Methode), die dann Objekte sind. Das, was Ruby den Funktionen am nächsten kommt, sindProc
Instanzen, die auch Objekte sind und herumgereicht oder aufgerufen werden können. Es hat auch eine spezielle Syntax zum Übergeben eines einzelnen RückrufsProc
an eine Methode, wie John Feminella in seiner Antwort erläutert .UnboundMethod
eines PITA sein kann.Letztendlich werden alle Antworten auf einer bestimmten Ebene subjektiv sein, und die bisher veröffentlichten Antworten beweisen ziemlich genau, dass Sie nicht auf eine Funktion verweisen können, die in der anderen Sprache nicht auf eine ebenso nette (wenn nicht ähnliche) Weise möglich ist , da beide Sprachen sehr prägnant und ausdrucksstark sind.
Ich mag Pythons Syntax. Sie müssen jedoch etwas tiefer als die Syntax graben, um die wahre Schönheit von Ruby zu finden. In Rubys Konsistenz liegt zenartige Schönheit. Obwohl kein triviales Beispiel dies vollständig erklären kann, werde ich versuchen, hier eines zu finden, um zu erklären, was ich meine.
Kehren Sie die Wörter in dieser Zeichenfolge um:
Wenn Sie darüber nachdenken, wie Sie es tun würden, würden Sie Folgendes tun:
In Ruby würden Sie Folgendes tun:
Genau so, wie Sie darüber nachdenken, wird in derselben Reihenfolge eine Methode nach der anderen aufgerufen.
In Python würde es eher so aussehen:
Es ist nicht schwer zu verstehen, aber es hat nicht ganz den gleichen Fluss. Das Thema (Satz) ist in der Mitte begraben. Die Operationen sind eine Mischung aus Funktionen und Objektmethoden. Dies ist ein triviales Beispiel, aber man entdeckt viele verschiedene Beispiele, wenn man wirklich mit Ruby arbeitet und es versteht, insbesondere bei nicht trivialen Aufgaben.
quelle
Python hat die Mentalität "Wir sind alle Erwachsene hier". Sie werden also feststellen, dass Ruby Dinge wie Konstanten hat, während Python dies nicht tut (obwohl Rubys Konstanten nur eine Warnung auslösen). Die Python-Denkweise ist, dass Sie, wenn Sie etwas konstant machen möchten, die Variablennamen in Großbuchstaben setzen und nicht ändern sollten.
Zum Beispiel Ruby:
Python:
quelle
Sie können in Python nur bestimmte Funktionen aus einem Modul importieren. In Ruby importieren Sie die gesamte Liste der Methoden. Sie könnten sie in Ruby "importieren", aber es geht nicht darum.
BEARBEITEN:
Nehmen wir dieses Ruby-Modul:
wenn Sie es in Ihren Code aufnehmen:
Sie werden sehen, dass sowohl Methode1 als auch Methode2 zu Ihrem Namespace hinzugefügt wurden. Sie können nicht nur method1 importieren . Sie importieren sie entweder beide oder Sie importieren sie überhaupt nicht. In Python können Sie nur die Methoden Ihrer Wahl importieren. Wenn dies einen Namen hätte, würde es vielleicht als selektiver Import bezeichnet werden?
quelle
import bla; bla.foo()
in Ruby?module
eigentlich eine Fehlbezeichnung. Die Module sind grundsätzlich Klassen sans dienew
,allocate
Methoden. Sie eignen sich am besten als Methode zum Freigeben von Code pro Klasse / Objekt, nicht als Mechanismus zum Partitionieren von Bibliotheken oder zum Teilen von Code zwischen Programmen.Von Rubys Website :
Ähnlichkeiten Wie bei Python in Ruby, ...
Unterschiede Im Gegensatz zu Python ...
quelle
Was Ruby gegenüber Python hat, sind seine Skriptsprachenfunktionen. Skriptsprache in diesem Kontext, die für "Klebercode" in Shell-Skripten und allgemeine Textmanipulation verwendet werden soll.
Diese werden meistens mit Perl geteilt. Erstklassige integrierte reguläre Ausdrücke, $ -Variablen, nützliche Befehlszeilenoptionen wie Perl (-a, -e) usw.
Zusammen mit seiner knappen und dennoch ausdrucksstarken Syntax eignet es sich perfekt für diese Art von Aufgaben.
Python ist für mich eher eine dynamisch typisierte Geschäftssprache, die sehr einfach zu erlernen ist und eine ordentliche Syntax hat. Nicht so "cool" wie Ruby, aber ordentlich. Was Python für mich über Ruby hat, ist die große Anzahl von Bindungen für andere Bibliotheken. Bindungen an Qt und andere GUI-Bibliotheken, viele Spielunterstützungsbibliotheken und und und. Ruby hat viel weniger. Während häufig verwendete Bindungen, z. B. an Datenbanken, von guter Qualität sind, habe ich festgestellt, dass Nischenbibliotheken in Python besser unterstützt werden, selbst wenn für dieselbe Bibliothek auch eine Ruby-Bindung vorhanden ist.
Ich würde also sagen, dass beide Sprachen ihre Verwendung haben und es die Aufgabe ist, die definiert, welche verwendet werden soll. Beide sind leicht zu lernen. Ich benutze sie nebeneinander. Ruby für Skripte und Python für eigenständige Apps.
quelle
Ich denke nicht, dass "Ruby hat X und Python nicht, während Python Y hat und Ruby nicht" die nützlichste Art ist, es zu betrachten. Sie sind ziemlich ähnliche Sprachen mit vielen gemeinsamen Fähigkeiten.
Der Unterschied besteht zu einem großen Teil darin, was die Sprache elegant und lesbar macht. Um ein Beispiel zu verwenden, das Sie angesprochen haben, haben beide theoretisch Lambdas, aber Python-Programmierer neigen dazu, sie zu vermeiden, und Konstrukte, die mit ihnen erstellt wurden, sehen nicht annähernd so lesbar oder idiomatisch aus wie in Ruby. So in Python, wird ein guter Programmierer einen anderen Weg zur Lösung des Problems als würde er in Ruby nehmen will, nur weil es tatsächlich ist der bessere Weg , es zu tun.
quelle
for format in respond_to()
. Dierespond_to
Methode gibt nichts Sinnvolles zurück - sie antwortet einfach auf die aktuelle HTTP-Anfrage. Dasdo
Inrespond_to do
ist der Anfang eines Blocks. In diesem Block sprechen wir mit einem temporären Objekt (format
in diesem Beispiel gekennzeichnet), das ein sehr einfaches DSL implementiert, um auf eine HTTP-Anfrage zu antworten.Ich möchte eine Variante der ursprünglichen Frage vorschlagen: "Was hat Ruby, was Python nicht hat, und umgekehrt?" was die enttäuschende Antwort zulässt: "Nun, was können Sie mit Ruby oder Python tun, was in Intercal nicht möglich ist?" Nichts auf dieser Ebene, denn Python und Ruby sind beide Teil der riesigen königlichen Familie, die auf dem Thron der Turing-Annäherung sitzt.
Aber was ist damit:
Was kann in Python anmutig und gut gemacht werden, was in Ruby nicht mit so viel Schönheit und guter Technik gemacht werden kann, oder umgekehrt?
Das ist vielleicht viel interessanter als nur ein Funktionsvergleich.
quelle
Python verfügt über eine explizite, integrierte Syntax für Listenerfassungen und Generatoren, während Sie in Ruby Map- und Codeblöcke verwenden würden.
Vergleichen Sie
zu
quelle
res=map(2 .__rpow__, range(1,10))
"Variablen, die mit einem Großbuchstaben beginnen, werden zu Konstanten und können nicht geändert werden."
Falsch. Sie können.
Sie erhalten nur dann eine Warnung, wenn Sie dies tun.
quelle
Etwas mehr auf der Infrastrukturseite:
Python lässt sich viel besser in C ++ integrieren (über Boost.Python , SIP und Py ++ ) als Ruby, wobei die Optionen entweder direkt in die Ruby-Interpreter-API geschrieben werden (was Sie natürlich auch mit Python tun können). In beiden Fällen ist dies jedoch auf niedrigem Niveau, langwierig und fehleranfällig) oder Sie verwenden SWIG (was zwar funktioniert und auf jeden Fall großartig ist, wenn Sie viele Sprachen unterstützen möchten, aber bei weitem nicht so gut ist wie Boost.Python oder SIP, wenn Sie möchten speziell C ++ binden).
Python hat eine Reihe von Webanwendungsumgebungen (Django, Pylons / Turbogears, web.py, wahrscheinlich mindestens ein halbes Dutzend andere), während Ruby (effektiv) eine hat: Rails. (Andere Ruby-Webframeworks existieren zwar, haben aber anscheinend Schwierigkeiten, sich gegen Rails durchzusetzen). Ist dieser Aspekt gut oder schlecht? Schwer zu sagen und wahrscheinlich ziemlich subjektiv; Ich kann mir leicht Argumente vorstellen, dass die Python-Situation besser und die Ruby-Situation besser ist.
Kulturell gesehen scheinen die Python- und Ruby-Communitys etwas anders zu sein, aber ich kann nur darauf hinweisen, da ich nicht so viel Erfahrung mit der Ruby-Community habe. Ich füge dies hauptsächlich in der Hoffnung hinzu, dass jemand, der viel Erfahrung mit beiden hat, diese Aussage verstärken (oder ablehnen) kann.
quelle
Schamlos kopieren / einfügen von: Alex Martelli antwortet auf den Thread " Was ist besser an Ruby als Python ? " Aus der Mailingliste comp.lang.python .
quelle
Einige andere aus:
http://www.ruby-lang.org/de/documentation/ruby-from-other-languages/to-ruby-from-python/
(Wenn ich etwas falsch interpretiert habe oder sich eines dieser Elemente auf der Ruby-Seite geändert hat, seit diese Seite aktualisiert wurde, kann jemand es bearbeiten ...)
Zeichenfolgen können in Ruby geändert werden, nicht in Python (wo neue Zeichenfolgen durch "Änderungen" erstellt werden).
Ruby hat einige erzwungene Fallkonventionen, Python nicht.
Python hat sowohl Listen als auch Tupel (unveränderliche Listen). Ruby hat Arrays, die Python-Listen entsprechen, aber keine unveränderliche Variante davon.
In Python können Sie direkt auf Objektattribute zugreifen. In Ruby erfolgt dies immer über Methoden.
In Ruby sind Klammern für Methodenaufrufe normalerweise optional, in Python jedoch nicht.
Ruby ist öffentlich, privat und geschützt, um den Zugriff zu erzwingen, anstatt Pythons Konvention, Unterstriche und Namensverknüpfungen zu verwenden.
Python hat mehrere Vererbungen. Ruby hat "Mixins".
Und noch ein sehr relevanter Link:
http://c2.com/cgi/wiki?PythonVsRuby
Was insbesondere auf einen anderen guten von Alex Martelli verweist , der auch hier auf SO eine Menge großartiger Sachen gepostet hat:
http://groups.google.com/group/comp.lang.python/msg/028422d707512283
quelle
Ich bin mir nicht sicher, also füge ich es zuerst als Antwort hinzu.
Python behandelt ungebundene Methoden als Funktionen
Das heißt, Sie können eine Methode entweder wie
theobject.themethod()
oder von aufrufenTheClass.themethod(anobject)
.Bearbeiten: Obwohl der Unterschied zwischen Methoden und Funktionen in Python gering und in Python 3 nicht vorhanden ist, ist er auch in Ruby nicht vorhanden, einfach weil Ruby keine Funktionen hat. Wenn Sie Funktionen definieren, definieren Sie tatsächlich Methoden für Object.
Sie können die Methode einer Klasse jedoch immer noch nicht als Funktion aufrufen. Sie müssten sie erneut an das Objekt binden, das Sie aufrufen möchten, was viel schwieriger ist.
quelle
TheClass.instance_method(:themethod).bind(anobject).call
wäre der entsprechende Rubin.Object
.Ich möchte die Python-Deskriptor-API erwähnen, mit der man die "Kommunikation" zwischen Objekt und Attribut anpassen kann. Es ist auch bemerkenswert, dass es in Python frei ist, ein alternatives Protokoll zu implementieren, indem der durch die Standardimplementierung der
__getattribute__
Methode vorgegebene Standard überschrieben wird. Lassen Sie mich näher auf die oben genannten Punkte eingehen. Deskriptoren sind regelmäßige Klassen mit__get__
,__set__
und / oder__delete__
Methoden. Wenn der Dolmetscher auf so etwas stößtanObj.anAttr
, wird Folgendes ausgeführt:__getattribute__
Methode vonanObj
wird aufgerufen__getattribute__
Ruft ein Attr-Objekt aus dem Klassendikt ab__get__
,__set__
oder__delete__
aufrufbare ObjekteWie bereits erwähnt, ist dies das Standardverhalten. Es steht einem frei, das Protokoll durch erneute Implementierung zu ändern
__getattribute__
.Diese Technik ist viel leistungsfähiger als Dekorateure.
quelle
Ruby verfügt über eine integrierte Unterstützung für die Fortsetzung
callcc
.Daher können Sie coole Dinge wie den Amb-Operator implementieren
quelle
Zu diesem Zeitpunkt bietet Python noch eine bessere Unicode-Unterstützung
quelle
Python hat Docstrings und Ruby nicht ... Oder wenn nicht, sind sie nicht so einfach zugänglich wie in Python.
Ps. Wenn ich falsch liege, bitte hinterlassen Sie ein Beispiel. Ich habe eine Problemumgehung, die ich ganz einfach in Klassen einordnen könnte, aber ich hätte gerne eine Art Docstring-Funktion auf "native Weise".
quelle
Ruby hat eine zeilenweise Schleife über Eingabedateien (das '-n'-Flag) über die Befehlszeile, sodass es wie AWK verwendet werden kann. Dieser Ruby Einzeiler:
zählt Linien wie der AWK Einzeiler:
Ruby erhält dieses Feature durch Perl, das es von AWK übernommen hat, um Sysadmins mit Perl an Bord zu bringen, ohne die Art und Weise ändern zu müssen, wie sie Dinge tun.
quelle
python -c "import sys; print len(list(sys.stdin))"
Ruby hat Siegel und Zweige, Python nicht.
Edit : Und eine sehr wichtige Sache, die ich vergessen habe (schließlich war die vorherige nur ein wenig zu flammen :-p):
Python hat einen JIT-Compiler ( Psyco ), eine deutlich niedrigere Sprache zum Schreiben von schnellerem Code ( Pyrex ) und die Möglichkeit, Inline-C ++ - Code ( Weave ) hinzuzufügen .
quelle
Meine Python ist rostig, daher sind einige davon möglicherweise in Python und ich erinnere mich einfach nicht / habe sie überhaupt nicht gelernt, aber hier sind die ersten, an die ich gedacht habe:
Leerzeichen
Ruby behandelt Whitespace völlig anders. Für den Anfang müssen Sie nichts einrücken (was bedeutet, dass es keine Rolle spielt, ob Sie 4 Leerzeichen oder 1 Tabulator verwenden). Es wird auch eine Smart Line-Fortsetzung durchgeführt, sodass Folgendes gültig ist:
Wenn Sie mit einem Operator enden, wird im Grunde herausgefunden, was los ist.
Mixins
Ruby hat Mixins, die Instanzen anstelle vollständiger Klassen erweitern können:
Aufzählungen
Ich bin mir nicht sicher, ob dies dasselbe ist wie bei Generatoren, aber ab Ruby 1.9 Ruby als Aufzählung
Referenz: http://blog.nuclearsquid.com/writings/ruby-1-9-what-s-new-what-s-changed
"Schlüsselwortargumente"
Beide dort aufgelisteten Elemente werden in Ruby unterstützt, obwohl Sie solche Standardwerte nicht überspringen können. Sie können entweder in der richtigen Reihenfolge gehen
Beachten Sie, dass c = 5 der Variablen c im aufrufenden Bereich tatsächlich den Wert 5 zuweist und den Parameter b den Wert 5 setzt.
oder Sie können es mit Hashes tun, die das zweite Problem beheben
Referenz: Der Pragmatic Progammer's Guide to Ruby
quelle
(
,[
oder{
Sie können Code in der Klassendefinition sowohl in Ruby als auch in Python haben. In Ruby haben Sie jedoch einen Verweis auf die Klasse (self). In Python haben Sie keinen Verweis auf die Klasse, da die Klasse noch nicht definiert ist.
Ein Beispiel:
Selbst in diesem Fall ist die Klasse, und dieser Code würde "Kaka" ausdrucken. Es gibt keine Möglichkeit, den Klassennamen auszudrucken oder auf andere Weise über den Klassendefinitionskörper in Python auf die Klasse zuzugreifen.
quelle
class
Anweisung ausgeführt wird.Syntax ist keine Kleinigkeit, sie hat direkten Einfluss darauf, wie wir denken. Dies wirkt sich auch direkt auf die Regeln aus, die wir für die von uns verwendeten Systeme erstellen. Als Beispiel haben wir die Reihenfolge der Operationen aufgrund der Art und Weise, wie wir mathematische Gleichungen oder Sätze schreiben. Die Standardnotation für Mathematik ermöglicht es den Menschen, sie auf mehrere Arten zu lesen und mit derselben Gleichung zu unterschiedlichen Antworten zu gelangen. Wenn wir die Präfix- oder Postfix-Notation verwendet hätten, hätten wir Regeln erstellt, um zu unterscheiden, welche Zahlen manipuliert werden sollen, anstatt nur Regeln für die Reihenfolge zu haben, in der Werte berechnet werden sollen.
Die Standardnotation macht deutlich, um welche Zahlen es sich handelt, während die Reihenfolge, in der sie berechnet werden sollen, nicht eindeutig ist. Die Präfix- und Postfix-Notation machen die Reihenfolge der Berechnung einfach, während die Zahlen mehrdeutig sind. Python hätte bereits mehrzeilige Lambdas, wenn es nicht die Schwierigkeiten gäbe, die durch das syntaktische Leerzeichen verursacht werden. (Es gibt Vorschläge, diese Art von Dingen durchzuziehen, ohne unbedingt explizite Blocktrennzeichen hinzuzufügen.)
Ich finde es einfacher, Bedingungen zu schreiben, bei denen ich möchte, dass etwas passiert, wenn eine Bedingung falsch ist, viel einfacher mit der if-Anweisung in Ruby zu schreiben als beispielsweise mit der semantisch äquivalenten "if-not" -Konstruktion in Ruby oder anderen Sprachen. Wenn die meisten Sprachen, die heutzutage verwendet werden, gleich leistungsfähig sind, wie kann die Syntax jeder Sprache als trivial angesehen werden? Nach bestimmten Merkmalen wie Blöcken und Vererbungsmechanismen usw. ist die Syntax der wichtigste Teil einer Sprache, kaum eine oberflächliche Sache.
Oberflächlich sind die ästhetischen Qualitäten der Schönheit, die wir der Syntax zuschreiben. Ästhetik hat nichts damit zu tun, wie unsere Erkenntnis funktioniert, Syntax.
quelle
Überrascht zu sehen, dass nichts von Rubys "Methode fehlt" -Mechanismus erwähnt wird. Ich würde Beispiele für die find_by _... -Methoden in Rails als Beispiel für die Leistungsfähigkeit dieser Sprachfunktion geben. Ich vermute, dass etwas Ähnliches in Python implementiert werden könnte, aber meines Wissens ist es nicht nativ vorhanden.
quelle
method_missing
kann in einigen Fällen in Python emuliert werden :class M(): def __getattr__(self, n): return lambda: "Missing! " + n; M().hi()
. Es gibt jedoch geringfügige Unterschiede und ich bezweifle, dass es in Python idiomatisch ist :-)Ein weiterer Unterschied bei Lambdas zwischen Python und Ruby zeigt das Problem des Akkumulatorgenerators von Paul Graham . Hier abgedruckt:
In Ruby können Sie Folgendes tun:
In Python würden Sie ein Objekt erstellen, das den Status von n enthält:
Einige Leute bevorzugen möglicherweise den expliziten Python-Ansatz, da er konzeptionell klarer ist, auch wenn er etwas ausführlicher ist. Sie speichern den Status wie für alles andere. Sie müssen sich nur um die Idee von aufrufbaren Objekten kümmern. Unabhängig davon, welchen Ansatz man ästhetisch bevorzugt, zeigt er einen Respekt, in dem Ruby Lambdas mächtigere Konstrukte sind als Pythons.
quelle
def foo(n): def f(i): return n + i return f
.def foo(n): L=[n] def f(i): L[0] += i return L[0] return f
. In Python3 können Sie einnonlocal
Schlüsselwort verwenden.Python hat optionale Argumente benannt
AFAIK Ruby hat nur Argumente positioniert, da b = 2 in der Funktionsdeklaration eine Beeinflussung ist, die immer angehängt wird.
quelle
def my_method(param1, optional = false)
funktioniert in Ruby 1.8.6, 1.8.7 und vermutlich 1.9!b
Parameter imfunc
Aufruf überspringen und er behält seine Standardeinstellung bei. Das heißt, esb
ist das zweite Argument in der Signatur, aber er kann es überspringen, indem er dem zweiten Parameter das Präfix vorstelltc=
. Ruby verwendet Hashes, um dies zu simulieren, aber es ist nicht genau dasselbe.Ruby hat Dokumentation eingebettet:
quelle
http://c2.com/cgi/wiki?PythonVsRuby
http://c2.com/cgi/wiki?SwitchedFromPythonToRuby
http://c2.com/cgi/wiki?SwitchedFromRubyToPython
http://c2.com/cgi/wiki Verwenden von PythonDontNeedRuby
http://c2.com/cgi/wiki?UsingRubyDontNeedPython
quelle
Mit Cargo können Sie " Bibliotheken benötigen, ohne Ihren Namespace zu überladen ".
quelle