Dans le cours que je suis actuellement pour apprendre les bases de Python
** "Écrivons le problème FizzBuzz de deux ou plusieurs manières!" **
Il y avait un problème.
J'ai été très impressionné lorsque j'apprenais les bases lorsque j'ai vu la réponse donnée par l'instructeur comme l'une des réponses modèles.
Voici un exemple de réponse.
La réponse cool de 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)
Euh, magnifique ... Vous pouvez écrire en seulement 3 lignes. (Plus à dire, deux lignes suffisent)
Mais ** je ne sais pas de quoi vous parlez. ** **
Je suis frustré, j'ai donc décidé de lire cette description. Il était rempli de diverses essences que j'avais vues quelque part auparavant, et quand j'ai pu le lire, j'étais complètement satisfait.
Dans cet article, j'expliquerai dans le but de "comprendre ce que dit ce script". Lisons-le ensemble!
FizzBuzz
Les journaux sont générés de 1 à 100 dans l'ordre. cependant,
・ Lorsque le nombre est un multiple de 3, "Fizz" au lieu du nombre
・ Lorsque le nombre est un multiple de 5, "Buzz" au lieu du nombre
・ Lorsque le nombre est un multiple de 3 et un multiple de 5, "FizzBuzz" est utilisé à la place.
Veuillez sortir comme.
Si vous n'avez jamais rencontré ce problème, essayez d'abord de l'écrire dans un script! Il apparaît dans divers livres d'introduction et livres d'algorithmes.
Cet article est écrit sur l'hypothèse que vous pouvez répondre à cette question pour le moment, alors veuillez lire la suite.
(J'aimerais pouvoir utiliser les instructions for
et ʻif` de manière basique)
Pour le moment, il s'agit d'un exemple orthodoxe de la réponse au problème FizzBuzz. Il existe différentes manières d'écrire, donc ce n'est pas le cas.
Exemple de réponse FizzBuzz
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=' ')
Petite technique apprise:
print ()
avec l'option ʻend, vous pouvez afficher la chaîne de caractères (saut de ligne
\ n, onglet
\ t`, etc.) pour la rendre plus facile à voir.
――J'ai appris qu'il sera plus facile de voir en coupant la ligne toutes les 15 fois que "FizzBuzz" est sorti, alors j'ai essayé de l'utiliser.C'est une bonne réponse que j'ai écrite au début, mais je ne sais pas ce que dit la troisième ligne.
Je ne comprends pas le script de la troisième ligne
print('FizzBuzz'[(4 if i % 3 else 0):(4 if i % 5 else 8)] or i)
Si vous le lisez en le recherchant, cette phrase sera
x si expression conditionnelle sinon y
Cette zone semble être incluse comme un point.
... ... et les connaissances préalables préalables.
Selon les connaissances nécessaires, ** "Valeur numérique / Valeur fausse de la chaîne de caractères" ** sera organisé.
Lorsqu'une valeur numérique est utilisée comme expression conditionnelle, elle est renvoyée sous la forme d'une valeur vrai / faux de True ou False. Et à propos de la vérité,
--Lorsque le nombre est 0 et que la chaîne de caractères est vide => Faux --Autres fois => Vrai
Ce sera. Je veux m'y habituer car le code devient simple en l'utilisant dans l'expression conditionnelle de l'instruction ʻif`.
Décomposons davantage la phrase précédente et partons du point où cela semble facile à comprendre!
'FizzBuzz'[(4 if i % 3 else 0):(4 if i % 5 else 8)]
Dans cette partie, si vous ignorez les détails et n'écrivez que la structure,
'FizzBuzz'[a:b]
Il se présente sous la forme de ** "Slice of string" **.
En appliquant une tranche à la chaîne de caractères FizzBuzz
cette fois,
print('FizzBuzz'[0:8]) #① => FizzBuzz
print('FizzBuzz'[0:4]) #② => Fizz
print('FizzBuzz'[4:8]) #③ => Buzz
print('FizzBuzz'[4:4]) #④ => (Rien ne s'affiche)
Peut être bien exprimé.
Tout d'abord, c'est le premier point.
-ʻelse
La prochaine chose que je veux lire est ʻa,
b quand j'ai écrit
'FizzBuzz' [a: b] `.
(4 if i % 3 else 0)
(4 if i % 5 else 8)
Cette notation.
J'ai entendu l'expression "postfix ʻif`" en quelque sorte, mais il semble l'appeler ** "expression conditionnelle" ** ou ** "opérateur ternaire" **. 6. Expressions - Documentation Python 3.8.3
N'est-il pas préférable de le conserver comme ** si ~ else peut être écrit sur une seule ligne ** pour être utilisé?
référence: Opérateur triangulaire (Python) --Qiita
En appliquant cela, les deux styles d'écriture ci-dessus
(4 if i % 3 else 0)
=> "Si la valeur de i% 3 est True (lorsque la valeur du reste de la division de i par 3 est différente de 0, c'est-à-dire qu'elle n'est pas divisible par 3), elle est de 4, sinon (lorsqu'elle est divisible par 3) est de 0"
(4 if i % 5 else 8)
=> "Si la valeur de i est 5 est Vrai (lorsque la valeur du reste de la division de i par 5 est différente de 0, c'est-à-dire lorsqu'elle n'est pas divisible par 35), elle vaut 4, sinon (lorsqu'elle est divisible par 3) est 8"
C'est une expression qui représente une valeur numérique qui change en fonction des conditions.
(Si 0 est géré dans l'expression conditionnelle, la valeur booléenne sera False
(précondition))
** Je ne sais pas. ** **
...
... Plus précisément, si vous pensez au FizzBuzz
de ce problème, l'histoire semble jusqu'ici être liée d'une manière ou d'une autre.
«I» peut être classé selon qu'il s'agit d'un multiple de 3, d'un multiple de 5 ou d'un multiple de 3 et d'un multiple de 5 (un multiple de 15).
print('FizzBuzz'[0:8]) #①=>FizzBuzz (lorsque i est un multiple de 3 et un multiple de 5)
print('FizzBuzz'[0:4]) #② =>Fizz (lorsque i est un multiple de 3 et non un multiple de 5)
print('FizzBuzz'[4:8]) #③ =>buzz (quand i est un multiple de 5 et non un multiple de 3)
print('FizzBuzz'[4:4]) #④ => (Rien ne s'affiche)(Quand i n'est ni un multiple de 3 ni un multiple de 5)
Le résultat de ces 4 modèles
'FizzBuzz'[(4 if i % 3 else 0):(4 if i % 5 else 8)]
Cela peut être exprimé dans cette seule ligne.
Cependant, avec cela seul, les chaînes de caractères de «Fizz», «Buzz» et «FizzBuzz» peuvent être sorties, mais les nombres ne peuvent pas être affichés.
Alors, voici le point suivant.
Ce sera un autre souffle lorsque vous arriverez ici. Il y avait une autre partie que je n'ai pas vue.
Je ne comprends pas le script de la troisième ligne
print('FizzBuzz'[(4 if i % 3 else 0):(4 if i % 5 else 8)] or i)
Un mystère demeure dans cette dernière expression, «ou i». Donc, si j'omets les détails et n'écris que la structure,
print('FizzBuzz'[a:b] or i)
Il a une structure appelée.
Ce ʻor est ** "opérateur logique" **, mais il semble que l'utilisation et l'apparence de ʻor
soient intuitivement comprises dans cette expression.
Comment utiliser l'opérateur logique général «ou»
Expression conditionnelle ou expression conditionnelle
=> Renvoie Vrai
ou Faux
Exemple) 1 <10 ou 2> 20
=> True
De cette façon, «ou» est une expression conditionnelle, et si l'une d'entre elles est correcte, «True» est renvoyée, et si tout est incorrect, «False» est renvoyé, ce qui est une opération qui renvoie une valeur booléenne. Ceci est intuitivement facile à comprendre.
Cependant, cette expression est
Chaîne de caractères / valeur numérique ou chaîne de caractères / valeur numérique
=> Renvoie une valeur (chaîne de caractères ou valeur numérique)
Exemple) 'FizzBuzz' ou 3
=> FizzBuzz
Exemple) `` 'ou 3` => 3
C'est une opération qui retourne l'une des valeurs alignées dans «ou». Dans l'exemple ci-dessus
"Lorsque la valeur avant ʻou est vraie et la valeur après elle est vraie, la valeur précédente est renvoyée dans son ensemble. "Lorsque la valeur avant ʻou
est fausse et la valeur après elle est vraie, la valeur après elle est renvoyée dans son ensemble."
C'est une regle.
6. Expression - Documentation Python 3.8.3
** Je ne sais pas. ** **
... ... J'apprendrai une grammaire détaillée dans le futur, mais cette fois je donnerai la priorité à la lecture et je dirai "Il y a une telle règle". (La méthode d'évaluation appelée «évaluation des courts-circuits (court-circuit)» est utilisée.)
Plus précisément, lorsqu'ils sont appliqués à ce problème, les quatre modèles considérés dans (2) peuvent être considérés comme suit.
print('FizzBuzz'[0:8] or i) #① =>FizzBuzz (renvoie la valeur précédente lorsque la valeur avant ou est vraie et la valeur après elle est vraie)
print('FizzBuzz'[0:4] or i) #② =>Fizz (comme ci-dessus)
print('FizzBuzz'[4:8] or i) #③ =>buzz (comme ci-dessus)
print('FizzBuzz'[4:4] or i) #④ =>i (renvoie la valeur après ou lorsque la valeur avant elle est fausse et la valeur après elle est vraie)
Les résultats de sortie de ① à ③ sont les mêmes que dans (2), mais les résultats de sortie ne sont différents que dans ④.
'FizzBuzz'[(4 if i % 3 else 0):(4 if i % 5 else 8)] or i
Il est devenu possible de sortir une valeur numérique sur une seule ligne en utilisant simplement et ʻou`.
était amusant. c'est tout.
Si vous lisez jusqu'ici et exécutez à nouveau le script pour la réponse cool FizzBuzz
au début, cela peut sembler un peu différent.
Je me sentais frustré de ne pas pouvoir l'expliquer intuitivement, alors j'ai pensé que je devais me consacrer. Je pense que chacune des grammaires que j'ai vues cette fois est une manière d'écrire assez familière, donc j'aimerais maîtriser ces choses pour pouvoir écrire des scripts simples avec python.
FizzBuzz
C'est intéressant.
Aussi, une fois que j'ai appris un nouveau concept, j'ai pensé que ce serait intéressant comme pratique d'oser faire un FizzBuzz
qui l'utilise.