R- und Python-Schreibvergleich (euklidische Methode der gegenseitigen Teilung)

Einführung

"R oder Python, was soll ich tun?" Es gibt viele solche Artikel auf der Welt. Sie werden eine Kontroverse sehen, die nicht an dem Tag endet, an dem Sie nach "R Python" suchen. Im Allgemeinen wird "R häufig in der Datenanalyse-Spezialisierung und im akademischen Bereich verwendet." Es wird gesagt, dass "Python ein allgemeiner Zweck ist und häufig auf der Geschäftsseite verwendet wird".

Wenn ich jedoch diese Artikel lese Beim eigentlichen Codieren weiß ich nicht, was anders ist. Schließlich scheint es, dass Sie beide versuchen müssen, um den Unterschied zu erkennen ... Vor diesem Hintergrund habe ich beschlossen, ein einfaches Programm in beiden Sprachen zu schreiben.

Übrigens ist der Autor seit 1 Jahr in R und spielt normalerweise mit data.frame mit Tidyverse. Ich schreibe selten eine Steuerungssyntax wie diese. Python hat gerade die Erstellung der Umgebung abgeschlossen, daher dient dieser Artikel auch zum Üben. Wenn es einen Fehler oder einen Kommentar gibt, dass es einen besseren Code gibt, zögern Sie bitte nicht.

Euklidische Methode der gegenseitigen Teilung

Ich werde die euklidische Methode der gegenseitigen Teilung erläutern, die dieses Mal implementiert werden soll. (Ich vermisse High School Mathematik)

Die euklidische gegenseitige Teilung ist ein Algorithmus, der das ** maximale Versprechen ** zweier natürlicher Zahlen findet. Dafür verwenden wir die folgenden Eigenschaften

$ A und b sind natürliche Zahlen $ $ Gleichung: Für a = bq + r gilt gcd (a, b) = gcd (b, r) $

Diese Eigenschaft nutzen "Teilen von $ a $ durch $ b $, um den Rest $ r_1 $ zu berechnen" → "Teilen von $ b $ durch $ r_1 $, um den Rest $ r_2 $ zu berechnen" →… → "Teilen durch Teilen von $ r_ {n-1} $ durch $ r_n " →gcd(r_{n-1}, r_n) = gcd(r_{n-2}, n_{n-1})= ...=gcd(b, r_1) = gcd(a, b) = r_n$ Finden Sie das maximale Versprechen in Form von.

Implementieren Sie die Funktion in R.

#Euklidische Methode der gegenseitigen Teilung
gcd <- function(a, b){
  if (!(a %% 1 == 0 & b %% 1 == 0 & a > 0 & b > 0)) {
    cat('Die Eingabe ist keine natürliche Zahl. Beginnen Sie also von vorne')
    } 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

In Python implementiert

#Euklidische Methode der gegenseitigen Teilung
def gcd(a, b):
  if not (a % 1 == 0 and b % 1 == 0 and a > 0 and b > 0):
    print('Die Eingabe ist keine natürliche Zahl. Beginnen Sie also von vorne')
  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

Vergleich beider Sprachen

Werfen wir einen Blick auf die Codierungseigenschaften von beiden. (Beachten Sie, dass dies eine subjektive Beurteilung ist, die auf den Attributen des Autors basiert!)

1. Ein kurzer Blick

Es ist fast das erste Mal, dass ich Python schreibe. Ich war besorgt: "Dies ist nicht geschlossen, aber es funktioniert richtig ...?" Aber es funktioniert perfekt. Ist es der Punkt, an dem die Bequemlichkeit dieses Bereichs unterstützt wird?

R gibt den Beginn und das Ende des Prozesses an, indem es in Klammern eingeschlossen wird und Python die Einrückungen ausrichtet. Die Verwendung von Einrückungen ist möglicherweise besser in Bezug auf "Verarbeitung + für den Benutzer leichter zu sehen". (Ich habe ein Gerücht gehört, dass die entsprechenden Klammern mit der neuen Funktion von Rstudio eingefärbt werden, also erwarte ich es)

2. Steuerungssyntax

Bewegung R Python
Funktionsdefinition name <- function(Streit){wird bearbeitet} def name(Streit):wird bearbeitet
Bedingter Zweig 1 if(Bedingter Ausdruck){wird bearbeitet} if Bedingter Ausdruck:wird bearbeitet
Bedingter Zweig 2 else if(Bedingter Ausdruck){wird bearbeitet} elif Bedingter Ausdruck:wird bearbeitet
Wiederholung while(Bedingter Ausdruck){wird bearbeitet} while Bedingter Ausdruck:wird bearbeitet

Das ist ungefähr das gleiche. Zwangsweise ist der Unterschied zwischen else if und el if.

3. Betreiber usw.

Bewegung R Python
Ganzzahliger Quotient %/% //
Überschuss %% %
Logisches UND & and
Logische Summe | or
Verweigerung ! not

In R erhalten Operatoren konsistent Symbole, während In Python werden Alphabete für die Teile verwendet, die sich auf die bedingte Verzweigung beziehen.

Es wird zwar angenommen, dass R logische Operatoren häufig bei der Filterverarbeitung usw. verwendet werden. Soll Python ausschließlich für die bedingte Verzweigung verwendet werden? (Wenn nicht ~ ist natürlich leicht zu lesen, aber filter (a == 1 und b <= 3 und ~) scheint lang und schwer zu lesen zu sein)

abschließend

Das Obige ist ein grober Vergleich, aber ich denke, dass die Vor- und Nachteile beider Sprachen offensichtlich geworden sind. Persönlich war ich überrascht, wie einfach es ist, Python-Steuerungssyntax zu schreiben.

Dieses Mal habe ich die Basis der Sprache verglichen, die als Steuerungssyntax bezeichnet wird (= der Teil, in dem die Idee stark ausgedrückt wird). Wenn ich es mir leisten kann, möchte ich die Datenrahmenverarbeitung usw. vergleichen.

Nachtrag

Überprüfung des Kontrollflusses

Ich hatte das Gefühl, dass der Code viel Verschwendung enthält, also habe ich ihn neu geschrieben, während ich mich auf verschiedene Dinge bezog.

R

gcd <- function(a, b){
  if (!(a %% 1 == 0 & b %% 1 == 0 & a > 0 & b > 0)) {
    cat('Die Eingabe ist keine natürliche Zahl. Beginnen Sie also von vorne')
  } 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('Die Eingabe ist keine natürliche Zahl. Beginnen Sie also von vorne')
  else:
    if a < b:
      a, b = b, a
    while b != 0:
      a, b = b, a % b
    else:
      return b

Implementierung mit rekursiven Funktionen

In den Kommentaren wurde mir über die rekursive Funktion berichtet, also habe ich sie implementiert. Wenn Sie bis b == 0 wiederholen, verstößt das Argument als Bedingung gegen die Bedingung, dass es sich um eine natürliche Zahl handelt. Sie müssen sie daher so umschreiben, dass sie sich bis zu einem Zeitpunkt zuvor wiederholt ( a% b == 0). Gibt es.

def gcd(a,b):
  if not (a % 1 == 0 and b % 1 == 0 and a > 0 and b > 0):
    print('Die Eingabe ist keine natürliche Zahl. Beginnen Sie also von vorne')
  else:
    if a < b:
      a, b = b, a
    if not a % b == 0:
      return gcd(b, a % b)
    else:
      return b

Es gibt auch eine Funktion namens "Recall" zum Aufrufen rekursiver Funktionen

gcd <- function(a, b){
  if (!(a %% 1 == 0 & b %% 1 == 0 & a > 0 & b > 0)) {
    cat('Die Eingabe ist keine natürliche Zahl. Beginnen Sie also von vorne')
  } else {
      if(a < b){
        tmp <- a; a <- b; b <- tmp
      }
      if(a %% b != 0){
        return(Recall(b, a %% b) #Oder gcd(b, a %% b)
      } else{
        return(b)
      }
  }
}


Recommended Posts

R- und Python-Schreibvergleich (euklidische Methode der gegenseitigen Teilung)
Euklidische Methode der gegenseitigen Teilung und erweiterte Methode der euklidischen gegenseitigen Teilung
Beispiel für das Lesen und Schreiben von CSV mit Python
Vergleich von Python und Ruby (Environment / Grammar / Literal Edition)
Ein schneller Vergleich der Testbibliotheken von Python und node.js.
Vergleichstabelle häufig verwendeter Prozesse von Python und Clojure
Vergleich von CoffeeScript mit JavaScript-, Python- und Ruby-Grammatik
Vergleich von 4 Arten von Python-Webframeworks
Python 3 Sortier- und Vergleichsfunktionen
Vergleich von Apex und Lamvery
Quellinstallation und Installation von Python
Funktioniert mit Python und R.
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
Vergleich der Datenrahmenbehandlung in Python (Pandas), R, Pig
Umgebungskonstruktion von Python und OpenCV
Die Geschichte von Python und die Geschichte von NaN
Vergleich der grundlegenden Grammatik zwischen Java und Python
Erklärung und Implementierung des ESIM-Algorithmus
Installation von SciPy und matplotlib (Python)
Sortieralgorithmus und Implementierung in Python
Dies und das von Python-Eigenschaften
Lesen und Schreiben von Python CSV-Dateien
Hashing von Daten in R und Python
Lesen und Schreiben von NetCDF mit Python
Lesen und Schreiben von CSV mit Python
Implementierung der Dyxtra-Methode durch Python
Geschwindigkeitsvergleich der Python-XML-Perspektive
Lesen und Schreiben von Text in Python
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Zusammenfassung der Python-Indizes und -Slices
Reputation von Python-Büchern und Nachschlagewerken
Empfohlene Bücher und Quellen für die Datenanalyseprogrammierung (Python oder R)
Geschwindigkeitsvergleich der Volltextverarbeitung von Wiktionary mit F # und Python
Automatische Erfassung von Genexpressionsdaten durch Python und R.
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
Berechnen Sie die kürzeste Route eines Diagramms mit der Dyxtra-Methode und Python
Vergleich japanischer Konvertierungsmodule in Python3
Extraktion von tweet.js (json.loads und eval) (Python)
Vergleich von Edelstein, Bündler und Pip, Venv
Python-Algorithmus
Verbinde viel Python oder und und
Python-String-Vergleich / benutze 'Liste' und 'In' anstelle von '==' und 'oder'
Lesen und Schreiben von JSON-Dateien mit Python
Vergleich von Klassenvererbung und Konstruktorbeschreibung
Erklärung und Implementierung des Decomposable Attention-Algorithmus
Vergleich von Python Serverless Frameworks-Zappa mit Chalice
Vergleich von L1-Regularisierung und Leaky Relu
Einfache Einführung in die Python3-Serie und OpenCV3
[Python] Verschiedene Kombinationen von Zeichenketten und Werten
Gleiche Automatisierung des Python- und PyPI-Setups
Vollständiges Verständnis von Python-Threading und Multiprocessing
Vergleich der Matrixtranspositionsgeschwindigkeit durch Python
Projekt Euler # 1 "Vielfaches von 3 und 5" in Python
Geschwindigkeitsvergleich von murmurhash3, md5 und sha1
[Basic Information Engineer Examination] Ich habe den Algorithmus der euklidischen Methode der gegenseitigen Teilung in Python geschrieben.