Comparaison d'écriture R et Python (méthode de division mutuelle euclidienne)

introduction

"R ou Python, lequel faire?" Il existe de nombreux articles comme celui-ci dans le monde. Vous verrez une controverse qui ne se termine pas le jour où vous recherchez «R Python». En général, «R est souvent utilisé dans la spécialisation en analyse de données et dans le milieu universitaire». On dit que "Python est un usage général et est fréquemment utilisé du côté des entreprises".

Cependant, quand je lis ces articles Lors du codage, je ne sais pas ce qui est différent. Après tout, il semble que vous deviez essayer les deux pour connaître la différence ... Dans cet esprit, j'ai décidé d'écrire un programme simple dans les deux langues.

À propos, l'auteur est dans R depuis 1 an et joue généralement avec data.frame avec Tidyverse. J'écris rarement une syntaxe de contrôle comme celle-ci. Python vient de terminer la création de l'environnement, cet article est donc également destiné à la pratique. Si vous avez des erreurs ou des commentaires indiquant qu'il existe un meilleur code, n'hésitez pas à nous contacter.

Méthode de division mutuelle euclidienne

J'expliquerai la méthode euclidienne de division mutuelle à mettre en œuvre cette fois. (Les mathématiques du lycée me manquent)

La division mutuelle euclidienne est un algorithme qui trouve la ** promesse maximale ** de deux nombres naturels. Pour cela, nous utilisons les propriétés suivantes

$ A et b sont des nombres naturels $ $ Équation: Pour a = bq + r, gcd (a, b) = gcd (b, r) contient $

Profiter de cette propriété "Diviser $ a $ par $ b $ pour calculer le reste $ r_1 $" → "Diviser $ b $ par $ r_1 $ pour calculer le reste $ r_2 $" →… → "Divisé en divisant $ r_ {n-1} $ par $ r_n " →gcd(r_{n-1}, r_n) = gcd(r_{n-2}, n_{n-1})= ...=gcd(b, r_1) = gcd(a, b) = r_n$ Trouvez l'engagement maximal sous la forme de.

Implémenter la fonction dans R

#Méthode de division mutuelle euclidienne
gcd <- function(a, b){
  if (!(a %% 1 == 0 & b %% 1 == 0 & a > 0 & b > 0)) {
    cat('L'entrée n'est pas un nombre naturel, alors recommencez')
    } else if (a < b) {
      w <- a
      a <- b
      b <- w
      
      while (b != 0) {
        r <- a %% b
        a <- b
        b <- r
        }
      return(a)      
      } else {
        while (b != 0) {
          r <- a %% b
          a <- b
          b <- r
          }
        return(a)
      }
  }
> gcd(50856, 96007)
[1] 163

Implémenté en Python

#Méthode de division mutuelle euclidienne
def gcd(a, b):
  if not (a % 1 == 0 and b % 1 == 0 and a > 0 and b > 0):
    print('L'entrée n'est pas un nombre naturel, alors recommencez')
  elif a < b:
    w = a
    a = b
    b = w
    
    while not b == 0:
      r = a % b
      a = b
      b = r
    else:
      return(a)
  else:
    while not b == 0:
      r = a % b
      a = b
      b = r
    else:
      return(a)
>>> gcd(50856, 96007)
163

Comparaison des deux langues

Jetons un coup d'œil aux caractéristiques de codage des deux. (Notez qu'il s'agit d'un jugement subjectif basé sur les attributs de l'auteur!)

1. Un aperçu

C'est presque la première fois que j'écris Python, J'étais inquiet, "Ce n'est pas fermé, mais ça marche correctement ...?" Mais cela fonctionne parfaitement. Est-ce le point où la commodité de ce domaine est prise en charge?

R indique le début et la fin du processus en le mettant entre parenthèses et Python alignant les retraits. L'utilisation de retraits peut être meilleure en termes de "traitement + plus facile à voir pour l'utilisateur". (J'ai entendu une rumeur selon laquelle les parenthèses correspondantes seraient colorées avec la nouvelle fonction de Rstudio, donc je m'y attend)

2. Syntaxe de contrôle

mouvement R Python
Définition des fonctions name <- function(argument){En traitement} def name(argument):En traitement
Branche conditionnelle 1 if(Expression conditionnelle){En traitement} if Expression conditionnelle:En traitement
Branche conditionnelle 2 else if(Expression conditionnelle){En traitement} elif Expression conditionnelle:En traitement
répétition while(Expression conditionnelle){En traitement} while Expression conditionnelle:En traitement

C'est à peu près la même chose. De force, la différence entre else if et el if.

3. Opérateurs, etc.

mouvement R Python
Quotient entier %/% //
Surplus %% %
ET logique & and
Somme logique | or
le déni ! not

Dans R, les opérateurs reçoivent systématiquement des symboles, tandis que En Python, les alphabets sont utilisés pour les parties liées au branchement conditionnel.

Alors que l'on imagine que les opérateurs logiques R sont souvent utilisés dans le traitement des filtres, etc. Python est-il censé être utilisé exclusivement pour le branchement conditionnel? (ʻSi non ~ ʻest naturellement facile à lire, maisfilter (a == 1 et b <= 3 et ~)semble être long et difficile à lire)

en conclusion

Ce qui précède est une comparaison approximative, mais je pense que les avantages et les inconvénients des deux langues sont devenus évidents. Personnellement, j'ai été surpris de voir à quel point il est facile d'écrire la syntaxe de contrôle Python.

Cette fois, j'ai comparé la base du langage appelé syntaxe de contrôle (= la partie où l'idée est fortement exprimée). Si je peux me le permettre, j'aimerais comparer le traitement des trames de données et ainsi de suite.

Postscript

Examen du flux de contrôle

J'ai senti qu'il y avait beaucoup de gaspillage dans le code, alors je l'ai réécrit en faisant référence à diverses choses.

R

gcd <- function(a, b){
  if (!(a %% 1 == 0 & b %% 1 == 0 & a > 0 & b > 0)) {
    cat('L'entrée n'est pas un nombre naturel, alors recommencez')
  } else {
    if(a < b){
      tmp <- a; a <- b; b <- tmp
    }
    while(b != 0){
      r <- a %% b; a <- b; b <- r 
    }
    return(a)
  }
}

Python

def gcd(a, b):
  if not (a % 1 == 0 and b % 1 == 0 and a > 0 and b > 0):
    print('L'entrée n'est pas un nombre naturel, alors recommencez')
  else:
    if a < b:
      a, b = b, a
    while b != 0:
      a, b = b, a % b
    else:
      return b

Implémentation à l'aide de fonctions récursives

On m'a parlé de la fonction récursive dans les commentaires, alors je l'ai implémentée. En guise de mise en garde, si vous répétez jusqu'à b == 0, l'argument viole la condition qu'il s'agit d'un nombre naturel, vous devez donc le réécrire pour qu'il se répète jusqu'à une fois avant (ʻa% b == 0`). y a-t-il.

def gcd(a,b):
  if not (a % 1 == 0 and b % 1 == 0 and a > 0 and b > 0):
    print('L'entrée n'est pas un nombre naturel, alors recommencez')
  else:
    if a < b:
      a, b = b, a
    if not a % b == 0:
      return gcd(b, a % b)
    else:
      return b

Il existe également une fonction appelée Recall pour appeler des fonctions récursives

gcd <- function(a, b){
  if (!(a %% 1 == 0 & b %% 1 == 0 & a > 0 & b > 0)) {
    cat('L'entrée n'est pas un nombre naturel, alors recommencez')
  } else {
      if(a < b){
        tmp <- a; a <- b; b <- tmp
      }
      if(a %% b != 0){
        return(Recall(b, a %% b) #Ou pgcd(b, a %% b)
      } else{
        return(b)
      }
  }
}


Recommended Posts

Comparaison d'écriture R et Python (méthode de division mutuelle euclidienne)
Méthode de division mutuelle euclidienne et méthode de division mutuelle euclidienne étendue
Exemple de lecture et d'écriture de CSV avec Python
Comparaison de Python et Ruby (Environment / Grammar / Literal Edition)
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
Comparaison de CoffeeScript avec la grammaire JavaScript, Python et Ruby
Comparaison de 4 types de frameworks Web Python
Fonctions de tri et de comparaison Python 3
Comparaison d'Apex et de Lamvery
Installation source et installation de Python
Fonctionne avec Python et R
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Comparaison de la gestion des trames de données en Python (pandas), R, Pig
Construction d'environnement de python et opencv
L'histoire de Python et l'histoire de NaN
Comparaison de la grammaire de base entre Java et Python
Explication et implémentation de l'algorithme ESIM
Installer SciPy et matplotlib (Python)
Algorithme de tri et implémentation en Python
Ceci et cela des propriétés python
Lecture et écriture de fichiers CSV Python
Hashing de données en R et Python
Lire et écrire NetCDF avec Python
Lire et écrire du CSV avec Python
Implémentation de la méthode Dyxtra par python
Comparaison de la vitesse de la perspective XML Python
Lire et écrire du texte en 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
Livres et sources recommandés de programmation d'analyse de données (Python ou R)
Comparaison de vitesse du traitement de texte intégral de Wiktionary avec F # et Python
Acquisition automatique des données de niveau d'expression génique par python et R
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
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Comparaison des modules de conversion japonais en Python3
Extraction de tweet.js (json.loads et eval) (Python)
Comparaison de gem, bundler et pip, venv
Algorithme Python
Connectez beaucoup de Python ou et et
comparaison de chaînes python / utiliser 'list' et 'in' au lieu de '==' et 'ou'
Lire et écrire des fichiers JSON avec Python
Comparaison de l'héritage de classe et de la description du constructeur
Explication et implémentation de l'algorithme Decomposable Attention
Comparaison des frameworks sans serveur Python-Zappa vs Chalice
Comparaison de la régularisation L1 et Leaky Relu
Introduction facile de la série python3 et d'OpenCV3
[Python] Diverses combinaisons de chaînes de caractères et de valeurs
Automatisation égale de l'installation de Python et PyPI
Compréhension complète du threading Python et du multitraitement
Comparaison de la vitesse de transposition de la matrice par Python
Projet Euler # 1 "Multiple de 3 et 5" en Python
Comparaison de vitesse de murmurhash3, md5 et sha1
[Examen d'ingénieur d'information de base] J'ai écrit l'algorithme de la méthode de division mutuelle euclidienne en Python.