Vergleich von Python und Ruby (Environment / Grammar / Literal Edition)

Einführung

Hallo. Mein Name ist @ sho-hata und ich begann von zu Hause aus zu arbeiten, sobald ich in die Firma eintrat. Während die Arbeit von zu Hause aus den schönen Punkt hat, keine Pendelzeit zu haben, ist es schwierig, sie ein- und auszuschalten. Übrigens habe ich bis jetzt nur Python berührt, aber jetzt, wo ich Ruby on Rails bei der Arbeit berühre, verbringe ich meine Tage damit, jeden Tag zu lernen. Dieses Mal, da es die erste Woche war, in der ich anfing, Ruby zu berühren, fand ich ["Von Python zu Ruby"](https: // www) im Abschnitt "Einführung in Ruby aus mehreren Sprachen" im offiziellen Ruby-Dokument ** Beim Lesen von .ruby-lang.org / ja / Dokumentation / Ruby-aus-anderen-Sprachen / zu-Ruby-aus-Python /) mache ich mir oft Sorgen um Ruby und Python ** Ähnlichkeiten / Unterschiede ** Ich habe kurz nachgeforscht und zusammengefasst. Der Inhalt wird entsprechend hinzugefügt. Alle folgenden basieren auf Ruby.

Ähnlichkeiten mit Python

Haben Sie eine interaktive Ausführungsumgebung

Es ist wirklich praktisch, nicht wahr? Wenn Sie den Code schnell ausprobieren möchten, fühlt es sich wie die wahre Kraft einer interpretierten Sprache an. Ruby interaktive Ausführungsumgebung

Ruby


irb
irb(main):001:0>

Interaktive Python-Ausführungsumgebung

Python


python
>>>

Eine kleine reichhaltige interaktive Python-Ausführungsumgebung

Python


ipython
In [1]:

Das Array (Liste) ist ein Array variabler Länge

Der integrierte Listencontainer ist ein Array mit variabler Länge. Wenn Sie also Elemente hinzufügen, erhöht sich die Anzahl der Elemente ohne Erlaubnis!

Ruby


array1 = [1, 2, 3] # => [1, 2, 3]
array1[3] = 4 # => 4
array1
# => [1, 2, 3, 4]

Unterschiede zu Python

Variable Zeichenfolge

In Python sind String-Literale unveränderlich. Wenn sie denselben Wert haben, beziehen sie sich daher auf dieselbe Adresse im Speicher.

Python


str1, str2 = "hoge", "hoge"
str1 is str2 # -> True
id(str1) # -> 140682191246064
id(str2) # -> 140682191246064

** * (4/18) Nachschrift **

Wenn es sich bei einer Zeichenfolge um dasselbe Zeichenfolgenliteral handelt, wird dasselbe Objekt gemeinsam genutzt. Wenn jedoch eine Zeichenfolge durch Berechnung usw. erstellt wird, verweist sie auf eine andere Speicheradresse, auch wenn sie denselben Wert hat.

Herr @ Shiracamus wies darauf hin. Wie unten gezeigt, bezieht sich ein Wert, der einer Variablen neu zugewiesen wird, auf eine andere Speicheradresse, selbst wenn er denselben Wert hat. Dies liegt daran, dass bei der Neuzuweisung ein neues Objekt erstellt wird und seine Referenz in der Variablen str2 gespeichert wird.

Python


str1 = "hoge"
str2 = "ho"
str2 += "ge"
str1 == str2 # -> True
str1 is str2 # -> False
id(str1) # -> 140239943766896
id(str2) # -> 140239943767152

Wenn eine Zeichenfolge durch Verketten von Zeichenfolgenliteralen durch Berechnung beim Deklarieren einer Variablen erstellt wird und die Werte gleich sind, wird auf dieselbe Adresse im Speicher verwiesen.

Python


str1 = "hoge"
str2 = "ho" + "ge"
str1 is str2 # -> True
str1 == str2 # -> True

Wenn jedoch beim Deklarieren der Variablen und bei der Neuzuweisung eine leere Zeichenfolge generiert wird, entspricht die Objekt-ID der Variablen nach der Neuzuweisung der ID der Variablen mit demselben Wert. Sprache ist schwierig. .. ..

Python


str1 = "hoge"
str2 = ""
id(str1) # -> 140239943766896
id(str2) # -> 140240212059056
str2 += "hoge"
str1 is str2 # -> True
id(str2) # -> 140239943766896

In Ruby sind String-Literale jedoch ** veränderbar **. Jeder zeigt auf eine andere Adresse im Speicher.

Ruby


str1, str2 = "hoge", "hoge"
p str1.equal?(str2) # => false
p str1.object_id # => 70220509475900
p str2.object_id # => 70220643515600

Ruby verfügt jedoch über ** Symbole ** -Literale, die als Alternative zu Zeichenfolgenliteralen verwendet werden, die wie Zeichenfolgen in der Quelle aussehen und intern als Ganzzahlen behandelt werden. Symbole sind unveränderlich und verbrauchen weniger Speicher, daher werden sie häufig verwendet. ~~ Ich weiß nichts über das Symbol ... ~~

Sie können Konstanten erstellen (Variablen, die nicht erwarten, dass sich ihre Werte ändern).

In Ruby werden Bezeichner, die mit einem Großbuchstaben beginnen, als Konstanten behandelt. Hier, ** Konstanten in der Programmiersprache = Nach der Initialisierung kann der Inhalt nicht mehr geändert werden ** Ich denke das ist die Anerkennung. ** Aber ** In Ruby ist es möglich, eine initialisierte Konstante neu zuzuweisen. (Es scheint, dass es nicht empfohlen wird, weil es eine Warnung gibt) Daher tritt beim Neuzuweisen kein Fehler auf.

Ruby


LANG = "Ruby" # => "Ruby"
LANG = "Python"
warning: already initialized constant LANG
warning: previous definition of LANG was here
# => Ruby

Für mich zeigt die Konstante in Ruby = auf dieselbe Objekt-ID Ist es die Idee? Es ist die Anerkennung. Konstanten werden übrigens in Python nicht unterstützt, aber wenn es sich um Variablen (= feste Werte) handelt, die als Konstanten behandelt werden, ist es am besten, sie mit allen Großbuchstaben und Unterstrichen (_) zu konfigurieren. Es ist üblich **.

Python


PREFIX = 'Ist Prost auf gute Arbeit'
MAX_COUNT = 255

Referenz: PEP 8 - Style Guide für Python-Code | Python.org

Kein Taple

In Python gibt es ein Objekt namens Taple, dessen Elemente nicht geändert werden können. Es wird verwendet, wenn Sie einen kompakten Listencontainer mit festen Elementen erstellen möchten oder wenn Sie mehrere Elemente packen und entpacken möchten.

Python


tuple1 = (1, 2, 3)
tuple2 = 1, 2, 3
type(tuple1) # -> <class 'tuple'>
type(tuple2) # -> <class 'tuple'>

Ruby implementiert jedoch keine Tupel als integrierte Objekte. Es scheint jedoch, dass Sie so etwas wie Tapple machen können, je nachdem, wie Sie es schreiben.

Ruby


rb_tuple = [1, 2, 3].map(&:freeze).freeze
rb_tuple[2] = 3
# => FrozenError (can't modify frozen Array)

(Referenz: Ruby-Ingenieur hat Python studiert, um Python zu dissen)

Verwenden Sie elsif anstelle von elif

In Ruby wird ** else if ** geschrieben, um ** else if ** auszudrücken. In Python wird es als ** elif ** geschrieben, aber die Aussprache hat sich als Abkürzung für ** else if ** geändert. Wenn man sich ansieht, was Mats, der Schöpfer von Ruby, gesagt hat, scheint es, dass die kürzeste Anzahl von Zeichen und das Gleichgewicht der Aussprache ausgeglichen sind. https://twitter.com/yukihiro_matz/status/1161556434728808448

Am Ende

Selbst mit derselben dynamischen Aufräumsprache wurden einige für Python / Ruby einzigartige Teile ausgeblendet und ausgeblendet. ** Es ist eine wahre Freude, eine neue Sprache zu lernen, um darüber nachzudenken, "welche Art von Gedanken haben die Sprachdesigner die Sprache geschaffen?" **! Viel Spaß!

Recommended Posts

Vergleich von Python und Ruby (Environment / Grammar / Literal Edition)
Vergleich von CoffeeScript mit JavaScript-, Python- und Ruby-Grammatik
Umgebungskonstruktion von Python und OpenCV
Vergleich der grundlegenden Grammatik zwischen Java und Python
Zusammenfassung der Korrespondenz zwischen Ruby- und Python-Array-Operationen
Sofortige Methodengrammatik für Python und Ruby (Lernen)
Vereinheitlichung der Python-Umgebung
Angeben des Bereichs von Ruby- und Python-Arrays
Ruby, Python und Map
Python und Ruby teilen sich
Python-Entwicklungsumgebung - Verwendung von Pyenv und Virtualenv-
Über flache und tiefe Kopien von Python / Ruby
[Ruby vs Python] Benchmark-Vergleich zwischen Rails und Flask
Unterschied zwischen Ruby und Python in Bezug auf Variablen
Ein schneller Vergleich der Testbibliotheken von Python und node.js.
Vergleichstabelle häufig verwendeter Prozesse von Python und Clojure
[Python] Kapitel 01-02 Über Python (Ausführung und Installation der Entwicklungsumgebung)
Versionsverwaltung von Node, Ruby und Python mit anyenv
Python auf Ruby und wütend Ruby auf Python
Python und Ruby Slice Memo
Python-Installation und grundlegende Grammatik
Python-Umgebungskonstruktion und TensorFlow
Vergleich von 4 Arten von Python-Webframeworks
Ruby- und Python-Syntax ~ branch ~
Python 3 Sortier- und Vergleichsfunktionen
Quellinstallation und Installation von Python
Umgebungskonstruktion von Python2 & 3 (OSX)
Python (Python 3.7.7) Installation und grundlegende Grammatik
Grundlegender Grammatikvergleich in fünf Sprachen (C #, Java, Python, Ruby, Kotlin)
Zusammenfassung der Unterstützung von Hash-Operationen (Dictionary) für Ruby und Python
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
Unterschied zwischen Ruby und Python Split
Die Geschichte von Python und die Geschichte von NaN
Installation von SciPy und matplotlib (Python)
Scraping mit Node, Ruby und Python
Dies und das von Python-Eigenschaften
Erstellen einer Umgebung für Python3.8 auf einem Mac
Grundlegende Grammatik des Python3-Systems (Wörterbuch)
Geschwindigkeitsvergleich der Python-XML-Perspektive
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Zusammenfassung der Python-Indizes und -Slices
Reputation von Python-Büchern und Nachschlagewerken
Ich habe die Geschwindigkeit von Hash mit Topaz, Ruby und Python verglichen
Geschwindigkeitsvergleich der Volltextverarbeitung von Wiktionary mit F # und Python
Erstellen und testen Sie eine CI-Umgebung für mehrere Versionen von Python
Zusammenfassung der Unterschiede zwischen Python und PHP (Vergleichstabelle der Hauptelemente)
[Python] Grundlegendes Muster und Verwendung der if-Anweisung (Vergleichsoperator und Boolescher Operator)
Installation von Visual Studio Code und Installation von Python
Unterschiede zwischen Ruby und Python im Umfang
Erstellen Sie Python 3 und OpenCV unter Ubuntu 18.04
Virtuelle Python-Umgebung und Pakete unter Ubuntu
Vergleich japanischer Konvertierungsmodule in Python3
Vergleichstabelle für Python-Umgebungstools für Rubyist
Extraktion von tweet.js (json.loads und eval) (Python)
Informationen zur virtuellen Umgebung von Python Version 3.7
Ein leicht verständlicher Vergleich der grundlegenden Grammatik von Python und Go
Vergleich von Edelstein, Bündler und Pip, Venv
Verbinde viel Python oder und und
Python-String-Vergleich / benutze 'Liste' und 'In' anstelle von '==' und 'oder'