Comparaison de Python et Ruby (Environment / Grammar / Literal Edition)

introduction

Bonjour. Je m'appelle @ sho-hata et j'ai commencé à travailler à domicile dès que j'ai rejoint l'entreprise. Si le travail à domicile a l'avantage de ne pas avoir de temps de trajet, il est difficile de l'allumer et de l'éteindre. Au fait, je n'ai touché que Python jusqu'à présent, mais maintenant que je touche Ruby on Rails au travail, je passe mes journées à étudier tous les jours. Cette fois, comme c'était la première semaine pour moi de commencer à toucher Ruby, j'ai trouvé ["De python à Ruby"](https: // www) dans la section "Introduction à Ruby de multilingue" du ** document officiel de Ruby **. En lisant .ruby-lang.org / ja / documentation / ruby-from-other-languages / to-ruby-from-python /), je m'inquiète souvent pour Ruby et python ** Similitudes / Différences ** J'ai brièvement étudié et résumé. Le contenu sera ajouté le cas échéant. Tous les éléments suivants sont basés sur Ruby.

Similitudes avec Python

Avoir un environnement d'exécution interactif

C'est vraiment pratique, n'est-ce pas? Lorsque vous voulez essayer le code rapidement, cela ressemble à la vraie puissance d'un langage interprété. Environnement d'exécution interactif Ruby

Ruby


irb
irb(main):001:0>

Environnement d'exécution interactif Python

Python


python
>>>

Un petit environnement d'exécution interactif Python riche

Python


ipython
In [1]:

Le tableau (liste) est un tableau de longueur variable

Le conteneur de liste intégré est un tableau de longueur variable. Donc, si vous ajoutez des éléments, le nombre d'éléments augmentera sans autorisation!

Ruby


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

Différences avec Python

Chaîne variable

En Python, les littéraux de chaîne sont immuables. Par conséquent, s'ils ont la même valeur, ils font référence à la même adresse en mémoire.

Python


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

** * (4/18) post-scriptum **

Dans le cas d'une chaîne de caractères, le même objet est partagé s'il s'agit du même littéral de chaîne de caractères, mais lorsqu'une chaîne de caractères est créée par calcul etc., il fait référence à une adresse mémoire différente même si elle a la même valeur.

A souligné M. @shiracamus. Comme indiqué ci-dessous, lors de la réaffectation d'une valeur à une variable, elle fait référence à une adresse mémoire différente même si elle a la même valeur. En effet, un nouvel objet est créé lors de la réaffectation et sa référence est stockée dans la variable str2.

Python


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

Lorsqu'une chaîne de caractères est créée en concaténant des chaînes de caractères littérales par calcul lors de la déclaration d'une variable, si les valeurs sont identiques, la même adresse en mémoire est référencée.

Python


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

Cependant, si une chaîne de caractères vide est générée lorsque la variable est déclarée et que la réaffectation est effectuée, l'identifiant d'objet de la variable après la réaffectation sera le même que l'identifiant de la variable avec la même valeur. La langue est difficile. .. ..

Python


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

Cependant, dans Ruby, les littéraux de chaîne sont ** mutables **. Chacun pointe vers une adresse différente en mémoire.

Ruby


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

Cependant, Ruby a des ** symboles ** littéraux qui sont utilisés comme alternative aux littéraux de chaîne, qui ressemblent à des chaînes sur la source et sont traités en interne comme des entiers. Il semble que les symboles soient souvent utilisés car ils sont immuables et consomment moins de mémoire. ~~ Je ne sais rien du symbole ... ~~

Vous pouvez créer des constantes (variables qui ne s'attendent pas à ce que leurs valeurs changent)

Dans Ruby, les identificateurs commençant par une lettre majuscule sont traités comme des constantes. ici, ** Constantes en langage de programmation = Une fois initialisé, son contenu ne peut pas être modifié ** Je pense que c'est la reconnaissance. ** Mais ** Dans Ruby, il est possible de réaffecter à une constante initialisée. (Il semble que ce n'est pas recommandé car cela donne un avertissement) Par conséquent, aucune erreur ne se produit lors de la réaffectation.

Ruby


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

Pour moi, constante dans Ruby = pointe vers le même identifiant d'objet Est-ce l'idée? C'est la reconnaissance. À propos, les constantes ne sont ** pas prises en charge dans Python **, mais lorsqu'il s'agit de variables (= valeurs fixes) ** qui sont traitées comme des constantes, il est préférable de les configurer avec toutes les lettres majuscules et traits de soulignement (_) **. C'est la coutume **.

Python


PREFIX = 'C'est bravo pour le bon travail'
MAX_COUNT = 255

Référence: PEP 8 - Style Guide for Python Code | Python.org

Pas de taple

En Python, il existe un objet appelé taple dont les éléments ne peuvent pas être modifiés. Il est utilisé lorsque vous souhaitez créer un conteneur de liste léger avec des éléments fixes ou lorsque vous souhaitez emballer et décompresser plusieurs éléments.

Python


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

Cependant, Ruby n'implémente pas les tuples en tant qu'objets intégrés. Cependant, il semble que vous puissiez faire quelque chose comme tapple en fonction de la façon dont vous l'écrivez.

Ruby


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

(Référence: L'ingénieur Ruby a étudié Python pour dissiper Python)

Utilisez elsif au lieu d'elif

Dans Ruby, ** else if ** est écrit comme un moyen d'exprimer ** else if **. En Python, il s'écrit ** elif **, mais la prononciation a changé en tant qu'abréviation pour ** else if **. En regardant les remarques de Mats, le créateur de Ruby, il semble que le plus petit nombre de caractères et l'équilibre de la prononciation soient équilibrés. https://twitter.com/yukihiro_matz/status/1161556434728808448

À la fin

Même avec le même langage de rangement dynamique, certaines parties uniques à Python / Ruby étaient cachées et cachées. ** C'est le vrai plaisir d'étudier une nouvelle langue pour réfléchir à "quel genre de pensée les concepteurs de langage ont-ils créé la langue?" **! Très amusant!

Recommended Posts

Comparaison de Python et Ruby (Environment / Grammar / Literal Edition)
Comparaison de CoffeeScript avec la grammaire JavaScript, Python et Ruby
Construction d'environnement de python et opencv
Comparaison de la grammaire de base entre Java et Python
Résumé de la correspondance entre les opérations de tableau ruby et python
Grammaire de méthode instantanée pour Python et Ruby (étude)
Unification de l'environnement Python
Spécification de la plage des tableaux ruby et python
Ruby, Python et carte
Python et Ruby se séparent
environnement de développement python -utilisation de pyenv et virtualenv-
À propos des copies superficielles et profondes de Python / Ruby
[Ruby vs Python] Comparaison de référence entre Rails et Flask
Différence entre Ruby et Python en termes de variables
Une comparaison rapide des bibliothèques de test Python et node.js
Tableau de comparaison des processus fréquemment utilisés de Python et Clojure
[Python] Chapitre 01-02 À propos de Python (Exécution et installation de l'environnement de développement)
Gestion des versions de Node, Ruby et Python avec anyenv
Python sur Ruby et Ruby en colère sur Python
Mémo tranche python et rubis
Installation de Python et grammaire de base
Construction d'environnement Python et TensorFlow
Comparaison de 4 types de frameworks Web Python
Syntaxe Ruby et Python ~ branch ~
Fonctions de tri et de comparaison Python 3
Installation source et installation de Python
Construction de l'environnement de python2 & 3 (OSX)
Installation de Python (Python 3.7.7) et grammaire de base
Comparaison grammaticale de base en cinq langues (C #, Java, Python, Ruby, Kotlin)
Résumé de la prise en charge des opérations de hachage (dictionnaire) pour Ruby et Python
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Différence entre Ruby et Python Split
L'histoire de Python et l'histoire de NaN
Installer SciPy et matplotlib (Python)
Scraping avec Node, Ruby et Python
Ceci et cela des propriétés python
Construire un environnement pour python3.8 sur Mac
Grammaire de base du système Python3 (dictionnaire)
Comparaison de la vitesse de la perspective XML Python
Coexistence de Python2 et 3 avec CircleCI (1.0)
Résumé des index et des tranches Python
Réputation des livres Python et des livres de référence
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
Comparaison de vitesse du traitement de texte intégral de Wiktionary avec F # et Python
Créer et tester un environnement CI pour plusieurs versions de Python
Résumé des différences entre Python et PHP (tableau de comparaison des principaux éléments)
[Python] Modèle de base et utilisation de l'instruction if (opérateur de comparaison et opérateur booléen)
Installation du code Visual Studio et installation de python
Différences entre Ruby et Python dans la portée
Créer un environnement Python 3 et OpenCV sur Ubuntu 18.04
Environnement virtuel Python et packages sur Ubuntu
Comparaison des modules de conversion japonais en Python3
Tableau de comparaison des outils d'environnement Python pour Rubyist
Extraction de tweet.js (json.loads et eval) (Python)
À propos de l'environnement virtuel de Python version 3.7
Comparer la grammaire de base de Python et Go d'une manière facile à comprendre
Comparaison de gem, bundler et pip, venv
Connectez beaucoup de Python ou et et
comparaison de chaînes python / utiliser 'list' et 'in' au lieu de '==' et 'ou'