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
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.)
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:
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.
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.
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.
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.
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
** 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.
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.