[Python] Essayez de lire la bonne réponse au problème FizzBuzz

introduction

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!

Problème FizzBuzz

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)

Exemple de réponse orthodoxe

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:

Lisez à propos de cette réponse cool

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

Cette zone semble être incluse comme un point.

... ... et les connaissances préalables préalables.

(0) Connaissances préalables: valeur booléenne de la valeur numérique / chaîne de caractères

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`.

(1) Tranche de chaîne de caractères

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.

(2) Expression conditionnelle (opérateur ternaire) ʻif-ʻ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.

(3) Calcul logique des valeurs numériques et des chaînes de caractères

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

référence: Python ♪ Comment utiliser les opérateurs logiques (et, ou, non) et les opérations logiques sur les nombres et les chaînes \ | Snow Tree en juin

** 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`.

en conclusion

é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.

Recommended Posts

[Python] Essayez de lire la bonne réponse au problème FizzBuzz
Essayez de résoudre le problème du fizzbuzz avec Keras
Essayez de résoudre le problème de l'héritage de classe Python
Essayez de résoudre le problème d'affectation du médecin de formation avec Python
Python amateur tente de résumer la liste ①
Mon ami semble faire du python, alors pensez au problème ~ fizzbuzz ~
Calculons en fait le problème statistique avec Python
Essayez de résoudre le diagramme homme-machine avec Python
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (code Python)
Essayez de résoudre le livre des défis de programmation avec python3
Modèle de script python pour lire le contenu du fichier
Lisez le fichier xml en vous référant au didacticiel Python
J'ai essayé de résoudre le problème avec Python Vol.1
Essayez de comprendre Python soi
Essayez d'obtenir la liste des fonctions du paquet Python> os
Comment changer le fichier de configuration pour qu'il soit lu par Python
[Python] J'ai essayé de laisser LINE BOT répondre aux prévisions météo
Essayez d'automatiser le fonctionnement des périphériques réseau avec Python
Essayez de déchiffrer les caractères déformés dans le nom du fichier joint avec Python
[Python] Résolution du problème d'importation dû à la différence des points d'entrée
Essayez le SDK Python LINE Pay
Essayez d'exploiter Facebook avec Python
Le 15e comment écrire un problème de référence en temps réel hors ligne en Python
Premier python ② Essayez d'écrire du code tout en examinant les fonctionnalités de python
Essayez de résoudre le problème N Queen avec SA de PyQUBO
Dans la commande python, python pointe vers python3.8
Comment lire l'ensemble de données SNLI
Comment obtenir la version Python
Essayez d'introduire le thème sur Pelican
Essayez de calculer Trace en Python
Demandez à python de lire la sortie de la commande
Essayez de convertir la CLI cloudmonkey en python3 -1
Essayez d'exécuter l'exemple de problème Python d'informations de base uniquement avec un navigateur
Revue des bases de Python (FizzBuzz)
Lisez l'ancien fichier Word du formulaire d'application Gakushin DC (.doc) à partir de Python et essayez de le faire fonctionner
Je voulais résoudre le problème ABC164 A ~ D avec Python
Partie 1 J'ai écrit la réponse au problème de référence de l'écriture hors ligne en temps réel en Python
Essayez d'utiliser le module Python Cmd
Essayez Cython dans les plus brefs délais
Le 14ème problème de référence d'écriture en temps réel hors ligne en python
Essayer d'implémenter et de comprendre les arborescences de segments étape par étape (python)
[Python] Lire le code source de Flask
Le moyen le plus rapide d'essayer EfficientNet
Essayez de résoudre l'itinéraire le plus court avec les données sociales Python + NetworkX +
Le 18ème comment écrire un problème de référence en temps réel hors ligne en Python
La façon la plus simple d'essayer PyQtGraph
[Python] Changer l'alphabet en nombre
Essayez de résoudre le problème de minimisation des fonctions en utilisant l'optimisation des groupes de particules
Mettez Cabocha 0.68 dans Windows et essayez d'analyser la dépendance avec Python
17ème problème de référence d'écriture en temps réel hors ligne implémenté en Python
Le 16ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Essayez d'imaginer les données d'élévation du National Land Research Institute avec Python
Essayez d'utiliser le framework web de Python Django (1) - De l'installation au démarrage du serveur
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (théorie)
Le 19ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Le 15e problème d'écriture en temps réel hors ligne a été résolu avec python