Ruby hat Blöcke; Python nicht.
Python hat Funktionen; Ruby nicht. In Python können Sie jede Funktion oder Methode übernehmen und an eine andere Funktion übergeben. In Ruby ist alles eine Methode, und Methoden können nicht direkt übergeben werden. Stattdessen müssen Sie sie in Procs einwickeln, um sie zu übergeben.
Ruby und Python unterstützen beide Schließungen, jedoch auf unterschiedliche Weise. In Python können Sie eine Funktion in einer anderen Funktion definieren. Die innere Funktion hat Lesezugriff auf Variablen von der äußeren Funktion, jedoch keinen Schreibzugriff. In Ruby definieren Sie Verschlüsse mithilfe von Blöcken. Die Abschlüsse haben vollen Lese- und Schreibzugriff auf Variablen aus dem äußeren Bereich.
Python hat Listenverständnisse, die ziemlich ausdrucksstark sind. Wenn Sie beispielsweise eine Liste mit Zahlen haben, können Sie schreiben
[x*x for x in values if x > 15]
Um eine neue Liste der Quadrate aller Werte größer als 15 zu erhalten, müssten Sie in Ruby Folgendes schreiben:
values.select {|v| v > 15}.map {|v| v * v}
Der Ruby-Code fühlt sich nicht so kompakt an. Es ist auch nicht so effizient, da es zuerst das Wertearray in ein kürzeres Zwischenarray mit Werten über 15 konvertiert. Dann nimmt es das Zwischenarray und generiert ein endgültiges Array, das die Quadrate der Zwischenprodukte enthält. Das Zwischenarray wird dann verworfen. Ruby hat also während der Berechnung 3 Arrays im Speicher. Python benötigt nur die Eingabeliste und die resultierende Liste.
Python bietet auch ähnliche Kartenverständnisse.
Python unterstützt Tupel. Ruby nicht. In Ruby müssen Sie Arrays verwenden, um Tupel zu simulieren.
Ruby unterstützt switch / case-Anweisungen. Python nicht.
Ruby unterstützt den expr ? val1 : val2
ternären Standardoperator . Python nicht.
Ruby unterstützt nur eine einzelne Vererbung. Wenn Sie die Mehrfachvererbung nachahmen müssen, können Sie Module definieren und Mix-Ins verwenden, um die Modulmethoden in Klassen zu ziehen. Python unterstützt Mehrfachvererbung anstelle von Modul-Mix-Ins.
Python unterstützt nur einzeilige Lambda-Funktionen. Ruby-Blöcke, die eine Art Lambda-Funktion sind, können beliebig groß sein. Aus diesem Grund wird Ruby-Code normalerweise funktionaler geschrieben als Python-Code. Um beispielsweise eine Liste in Ruby zu durchlaufen, tun Sie dies normalerweise
collection.each do |value|
...
end
Der Block funktioniert sehr ähnlich wie eine Funktion, an die übergeben wird collection.each
. Wenn Sie dasselbe in Python tun würden, müssten Sie eine benannte innere Funktion definieren und diese dann jeder Methode an die Sammlung übergeben (wenn list diese Methode unterstützt):
def some_operation(value):
...
collection.each(some_operation)
Das fließt nicht sehr gut. Daher wird in Python normalerweise der folgende nicht funktionale Ansatz verwendet:
for value in collection:
...
Der sichere Umgang mit Ressourcen unterscheidet sich zwischen den beiden Sprachen erheblich. Hier besteht das Problem darin, dass Sie eine Ressource zuweisen möchten (eine Datei öffnen, einen Datenbankcursor erhalten usw.), eine beliebige Operation ausführen und sie dann auf sichere Weise schließen möchten, selbst wenn eine Ausnahme auftritt.
In Ruby codieren Sie dieses Muster normalerweise als Methode, die einen Block benötigt, damit die beliebige Operation für die Ressource ausgeführt werden kann, da Blöcke so einfach zu verwenden sind (siehe Nr. 9).
In Python ist die Übergabe einer Funktion für die beliebige Aktion etwas umständlicher, da Sie eine benannte innere Funktion schreiben müssen (siehe Nr. 9). Stattdessen verwendet Python eine with
Anweisung zur sicheren Handhabung von Ressourcen. Siehe Wie bereinige ich ein Python-Objekt korrekt? für mehr Details.