[Python] Versuchen Sie, die coole Antwort auf das FizzBuzz-Problem zu lesen

Einführung

In der Klasse lerne ich gerade die Grundlagen von Python

** "Schreiben wir das FizzBuzz-Problem auf zwei oder mehr Arten!" **

Es gab ein Problem.

Ich war sehr beeindruckt, als ich die Grundlagen lernte, als ich die Antwort des Lehrers als eine der Modellantworten sah.

Hier ist ein Beispiel für die Antwort.

Die coole Antwort von FizzBuzz


end = 100
for i in range(1, end + 1):
    print('FizzBuzz'[(4 if i % 3 else 0):(4 if i % 5 else 8)] or i)

Äh, schön ... Sie können in nur 3 Zeilen schreiben. (Mehr zu sagen, zwei Zeilen sind genug)

Aber ** ich weiß nicht wovon du sprichst. ** ** **

Ich bin frustriert und habe mich entschlossen, diese Beschreibung zu lesen. Es war voller verschiedener Essenzen, die ich irgendwo zuvor gesehen hatte, und als ich es las, war ich vollkommen zufrieden.

In diesem Artikel werde ich mit dem Ziel erklären, "zu verstehen, was dieses Skript sagt". Lass es uns gemeinsam lesen!

FizzBuzz Problem

FizzBuzz


Protokolle werden der Reihe nach von 1 bis 100 ausgegeben. Jedoch,
・ Wenn die Zahl ein Vielfaches von 3 ist, wird "Fizz" anstelle der Zahl verwendet
・ Wenn die Zahl ein Vielfaches von 5 ist, wird "Buzz" anstelle der Zahl verwendet
・ Wenn die Zahl ein Vielfaches von 3 und ein Vielfaches von 5 ist, wird stattdessen "FizzBuzz" verwendet.

Bitte ausgeben als.

Wenn Sie dieses Problem noch nicht gelöst haben, schreiben Sie es zuerst in ein Skript! Es erscheint in verschiedenen Einführungsbüchern und Algorithmusbüchern.

Dieser Artikel basiert auf der Annahme, dass Sie diese Frage vorerst beantworten können. Bitte lesen Sie weiter. (Ich wünschte, ich könnte die Anweisungen "for" und "if" auf einfache Weise verwenden.)

Orthodoxes Antwortbeispiel

Derzeit ist dies ein orthodoxes Beispiel für die Antwort auf das FizzBuzz-Problem. Es gibt verschiedene Schreibweisen, daher ist dies nicht der Fall.

FizzBuzz Antwortbeispiel


end = 100
for i in range(1, end + 1):
    if i % 3 == 0 and i % 5 == 0:
        print('FizzBuzz', end='\n')
    elif i % 3 == 0:
        print('Fizz', end=' ')
    elif i % 5 == 0:
        print('Buzz', end=' ')
    else:
        print(i, end=' ')

Petit-Technik gelernt:

Lesen Sie über diese coole Antwort

Es ist eine coole Antwort, die ich am Anfang geschrieben habe, aber ich weiß nicht, was die dritte Zeile sagt.

Ich verstehe das Skript in der dritten Zeile nicht


print('FizzBuzz'[(4 if i % 3 else 0):(4 if i % 5 else 8)] or i)

Wenn Sie es lesen, während Sie es nachschlagen, wird dieser Satz

Dieser Bereich scheint als Punkt enthalten zu sein.

... ... und das vorausgesetzte Wissen davor.

(0) Voraussetzungen: Boolescher Wert des numerischen Werts / der Zeichenfolge

Bei Bedarf wird ** "Numerischer Wert / Falscher Wert der Zeichenkette" ** organisiert.

Wenn ein numerischer Wert als bedingter Ausdruck verwendet wird, wird er als wahr / falsch-Wert von wahr oder falsch zurückgegeben. Und über die Wahrheit,

--Wenn die Zahl 0 ist und die Zeichenfolge leer ist => False

Es wird sein. Ich möchte mich daran gewöhnen, weil der Code einfach wird, indem er im bedingten Ausdruck der if-Anweisung verwendet wird.

(1) Zeichenfolge

Lassen Sie uns den vorherigen Satz weiter aufschlüsseln und an dem Punkt beginnen, an dem es leicht zu verstehen scheint!

'FizzBuzz'[(4 if i % 3 else 0):(4 if i % 5 else 8)] 

Wenn Sie in diesem Teil die Details ignorieren und nur die Struktur schreiben,

'FizzBuzz'[a:b]

Es ist in Form von ** "Slice of String" **.

Indem Sie diesmal ein Slice auf die Zeichenkette "FizzBuzz" anwenden,

print('FizzBuzz'[0:8]) #① => FizzBuzz
print('FizzBuzz'[0:4]) #② => Fizz 
print('FizzBuzz'[4:8]) #③ => Buzz
print('FizzBuzz'[4:4]) #④ => (Es wird nichts angezeigt)

Kann gut ausgedrückt werden.

Dies ist zunächst der erste Punkt.

(2) Bedingter Ausdruck (ternärer Operator) if-else

Das nächste, was ich lesen möchte, ist "a", "b", als ich "FizzBuzz" [a: b] "schrieb.

(4 if i % 3 else 0)
(4 if i % 5 else 8)

Diese Notation.

Ich habe den Ausdruck "postfix if" irgendwie gehört, aber er scheint ihn ** "bedingten Ausdruck" ** oder ** "ternären Operator" ** zu nennen. 6. Ausdrücke - Python 3.8.3-Dokumentation

Ist es nicht besser, es als ** zu behalten, wenn ~ else zur Verwendung in einer Zeile ** geschrieben werden kann?

Referenz: Dreiecksoperator (Python) - Qiita

Wenden Sie dies an, die beiden oben genannten Schreibstile

(4 if i % 3 else 0) => "Wenn der Wert von i% 3 wahr ist (wenn der Wert des Restes der Division von i durch 3 nicht 0 ist, dh nicht durch 3 teilbar ist), ist er 4, andernfalls (wenn er durch 3 teilbar ist) ist er 0"

(4 if i % 5 else 8) => "Wenn der Wert von i 5 ist, ist True (wenn der Wert des Restes der Division von i durch 5 nicht 0 ist, dh nicht durch 35 teilbar ist), ist er 4, andernfalls ist er 8".

Es ist ein Ausdruck, der einen numerischen Wert darstellt, der sich abhängig von den Bedingungen ändert. (Wenn 0 im bedingten Ausdruck behandelt wird, ist der boolesche Wert "False" (Vorbedingung))

** Ich weiß es nicht. ** ** **

... ... Insbesondere wenn Sie über das FizzBuzz dieses Problems nachdenken, scheint die Geschichte bisher irgendwie miteinander verbunden zu sein.

Fälle können danach unterteilt werden, ob "i" ein Vielfaches von 3, ein Vielfaches von 5, ein Vielfaches von 3 und ein Vielfaches von 5 (ein Vielfaches von 15) ist.

print('FizzBuzz'[0:8]) #①=>FizzBuzz (wenn ich ein Vielfaches von 3 und ein Vielfaches von 5 bin)
print('FizzBuzz'[0:4]) #② =>Fizz (wenn ich ein Vielfaches von 3 und kein Vielfaches von 5 bin)
print('FizzBuzz'[4:8]) #③ =>Buzz (wenn ich ein Vielfaches von 5 und kein Vielfaches von 3 ist)
print('FizzBuzz'[4:4]) #④ => (Es wird nichts angezeigt)(Wenn i weder ein Vielfaches von 3 noch ein Vielfaches von 5 ist)

Das Ergebnis dieser 4 Muster

'FizzBuzz'[(4 if i % 3 else 0):(4 if i % 5 else 8)]

Es kann in dieser einen Zeile ausgedrückt werden.

Allein damit können die Zeichenketten von "Fizz", "Buzz" und "FizzBuzz" ausgegeben werden, aber die Zahlen können nicht ausgegeben werden.

Hier ist der nächste Punkt.

(3) Logische Berechnung von Zahlenwerten und Zeichenketten

Es wird ein weiterer Atemzug sein, wenn Sie hier ankommen. Es gab noch einen anderen Teil, den ich nicht gesehen habe.

Ich verstehe das Skript in der dritten Zeile nicht


print('FizzBuzz'[(4 if i % 3 else 0):(4 if i % 5 else 8)] or i)

Ein Geheimnis bleibt in diesem letzten Ausdruck, "oder ich". Wenn ich also die Details weglasse und nur die Struktur schreibe,

print('FizzBuzz'[a:b] or i)

Es hat eine Struktur namens.

Dieses "oder" ist ** "logischer Operator" **, aber es scheint, dass die Verwendung und das Erscheinungsbild von "oder", die in diesem Ausdruck intuitiv verstanden werden können, unterschiedlich sind.

Verwendung des allgemeinen logischen Operators "oder"

Bedingter Ausdruck oder bedingter Ausdruck => Gibt True oder False zurück Beispiel) 1 <10 oder 2> 20 => True

Auf diese Weise ist es ein bedingter Ausdruck, der mit "oder" ausgerichtet ist, und es ist eine Operation, die einen booleschen Wert zurückgibt, so dass "True" zurückgegeben wird, wenn auch nur einer korrekt ist, und "False" zurückgegeben wird, wenn alle falsch sind. Dies ist intuitiv leicht zu verstehen.

Dieser Ausdruck ist jedoch

Zeichenfolge / numerischer Wert oder Zeichenfolge / numerischer Wert => Gibt entweder einen Wert zurück (Zeichenfolge oder numerischer Wert) Beispiel) 'FizzBuzz' oder 3 => FizzBuzz Beispiel) '' oder 3 => 3

Es ist eine Operation, die einen der in "oder" aufgereihten Werte zurückgibt. Im obigen Beispiel "Wenn der Wert vor" oder "wahr und der Wert nach" wahr "ist, wird der vorherige Wert als Ganzes zurückgegeben." "Wenn der Wert vor" oder "falsch und der Wert nach" wahr "ist, wird der Wert nach" als Ganzes "zurückgegeben." Es ist eine Regel. 6. Expression - Python 3.8.3-Dokumentation

Referenz: Python ♪ Verwendung logischer Operatoren (und oder nicht) und logischer Operationen für Zahlen und Zeichenfolgen \ | Snow Tree im Juni

** Ich weiß es nicht. ** ** **

... ... Ich werde in Zukunft detaillierte Grammatik lernen, aber dieses Mal werde ich dem Lesen Vorrang einräumen und sagen "Es gibt eine solche Regel". (Die Bewertungsmethode "Kurzschlussbewertung (Kurzschluss)" wird verwendet.)

Insbesondere können bei Anwendung auf dieses Problem die vier in (2) betrachteten Muster wie folgt weiter betrachtet werden.

print('FizzBuzz'[0:8] or i) #① =>FizzBuzz (gibt den vorherigen Wert zurück, wenn der Wert vor oder wahr ist, und den Wert danach, wenn er wahr ist)
print('FizzBuzz'[0:4] or i) #② =>Fizz (wie oben)
print('FizzBuzz'[4:8] or i) #③ =>Buzz (wie oben)
print('FizzBuzz'[4:4] or i) #④ =>i (gibt den Wert nach oder zurück, wenn der Wert davor falsch und der Wert danach wahr ist)

Die Ausgabeergebnisse von ① bis ③ sind die gleichen wie in (2), aber die Ausgabeergebnisse unterscheiden sich nur in ④.

'FizzBuzz'[(4 if i % 3 else 0):(4 if i % 5 else 8)] or i

Nur mit und oder wurde es möglich, einen numerischen Wert in einer Zeile auszugeben.

abschließend

war Spaß. das ist alles. Wenn Sie so weit gelesen haben und das Skript für die coole "FizzBuzz" -Antwort am Anfang erneut ausführen, sieht es möglicherweise etwas anders aus.

Ich war frustriert, dass ich es nicht intuitiv erklären konnte, also dachte ich, ich sollte mich widmen. Ich denke, dass jede der Grammatiken, die ich dieses Mal gesehen habe, eine ziemlich vertraute Schreibweise ist, deshalb möchte ich diese Dinge beherrschen, damit ich einfache Skripte mit Python schreiben kann.

FizzBuzz Es ist interessant. Nachdem ich ein neues Konzept gelernt hatte, dachte ich, es wäre als Übung interessant, es zu wagen, ein "FizzBuzz" zu erstellen, das davon Gebrauch macht.

Recommended Posts

[Python] Versuchen Sie, die coole Antwort auf das FizzBuzz-Problem zu lesen
Versuchen Sie, das Fizzbuzz-Problem mit Keras zu lösen
Versuchen Sie, das Problem der Python-Klassenvererbung zu lösen
Versuchen Sie, das Problem der Zuweisung von Schulungsärzten mit Python zu lösen
Python Amateur versucht die Liste zusammenzufassen ①
Mein Freund scheint Python zu machen, also denke über das Problem nach ~ fizzbuzz ~
Berechnen wir das statistische Problem mit Python
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus (Python-Code) zu lösen.
Versuchen Sie, das Programmier-Herausforderungsbuch mit Python3 zu lösen
Vorlage des Python-Skripts zum Lesen des Inhalts der Datei
Lesen Sie die XML-Datei anhand des Python-Tutorials
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Versuchen Sie, Python selbst zu verstehen
Versuchen Sie, die Funktionsliste des Python> os-Pakets abzurufen
So wechseln Sie die Konfigurationsdatei, die von Python gelesen werden soll
[Python] Ich habe versucht, LINE BOT die Wettervorhersage beantworten zu lassen
Versuchen Sie, den Betrieb von Netzwerkgeräten mit Python zu automatisieren
Versuchen Sie, die verstümmelten Zeichen im angehängten Dateinamen mit Python zu entschlüsseln
[Python] Lösen des Importproblems aufgrund der unterschiedlichen Einstiegspunkte
Probieren Sie das Python LINE Pay SDK aus
Versuchen Sie, Facebook mit Python zu betreiben
Das 15. Offline-Echtzeit-Schreiben eines Referenzproblems in Python
Erste Python ② Versuchen Sie, Code zu schreiben, während Sie die Funktionen von Python untersuchen
Versuchen Sie, das N Queen-Problem mit SA von PyQUBO zu lösen
Im Python-Befehl zeigt Python auf Python3.8
Lesen des SNLI-Datensatzes
So erhalten Sie die Python-Version
Versuchen Sie, das Thema Pelican vorzustellen
Versuchen Sie, Trace in Python zu berechnen
Lassen Sie Python die Befehlsausgabe lesen
Versuchen Sie, die cloudmonkey-CLI in python3 -1 zu konvertieren
Versuchen Sie, das Python-Beispielproblem mit grundlegenden Informationen nur mit einem Browser auszuführen
Überprüfung der Grundlagen von Python (FizzBuzz)
Lesen Sie das alte Gakushin DC-Antragsformular Word-Datei (.doc) von Python und versuchen Sie, es zu bedienen
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
Teil 1 Ich habe die Antwort auf das Referenzproblem geschrieben, wie man in Python in Echtzeit offline schreibt
Versuchen Sie es mit dem Python Cmd-Modul
Probieren Sie Cython in kürzester Zeit aus
Das 14. Referenzproblem beim Schreiben in Echtzeit in Python
Der Versuch, Segmentbäume Schritt für Schritt zu implementieren und zu verstehen (Python)
[Python] Lesen Sie den Flask-Quellcode
Der schnellste Weg, EfficientNet auszuprobieren
Versuchen Sie, den kürzesten Weg mit Python + NetworkX + Social Data zu lösen
Das 18. Offline-Echtzeit-Schreiben eines Referenzproblems in Python
Der einfachste Weg, PyQtGraph auszuprobieren
[Python] Ändere das Alphabet in eine Zahl
Versuchen Sie, das Problem der Funktionsminimierung mithilfe der Partikelgruppenoptimierung zu lösen
Setzen Sie Cabocha 0.68 in Windows ein und versuchen Sie, die Abhängigkeit mit Python zu analysieren
17. In Python implementiertes Referenzproblem für das Offline-Schreiben in Echtzeit
Das 16. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Versuchen Sie, die Höhendaten des National Land Research Institute mit Python abzubilden
Versuchen Sie es mit Pythons Webframework Django (1) - Von der Installation bis zum Serverstart
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus zu lösen (Theorie)
Das 19. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Das 15. Offline-Problem beim Schreiben in Echtzeit wurde mit Python gelöst