Python >> Tutoriel Python >  >> Python

Python une ligne FizzBuzz

Le problème FizzBuzz est un exercice courant posé dans les entretiens de code pour tester votre maîtrise de l'écriture de code Python simple.

Problème :Affiche tous les nombres de 1 à 100 dans le shell avec trois exceptions :

  • Pour chaque nombre divisible par trois vous écrivez "Fizz" ,
  • Pour chaque nombre divisible par cinq, vous écrivez "Buzz" , et
  • Pour chaque nombre divisible par trois et cinq vous écrivez "FizzBuzz" .

Exemple :Les 15 premiers chiffres de la séquence FizzBuzz sont les suivants.

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
...

Comment écrire un one-liner Python qui résout ce problème ?

Voici un aperçu interactif :

Exercice :Les deux one-liners produisent-ils les mêmes résultats ? Exécutez le code pour vérifier !

Plongeons-nous dans ces lignes pour mieux comprendre et améliorer vos compétences en Python !

FizzBuzz One-Liner 1 :Expression du générateur + concaténation de chaînes + court-circuit

Le one-liner suivant résout le problème de manière élégante en utilisant une compréhension fine des fonctionnalités Python plus avancées (source).

print('\n'.join('Fizz' * (i%3==0) + 'Buzz' * (i%5==0) or str(i) for i in range(1,101)))

Le one-liner crée une chaîne en utilisant le join fonction avec le caractère de nouvelle ligne comme délimiteur. Voici une brève explication de la fonction :

Le string.join(iterable) la méthode concatène tous les éléments de chaîne dans le iterable (comme une liste, une chaîne ou un tuple) et renvoie le résultat sous la forme d'une nouvelle chaîne. Le string sur lequel vous l'appelez est la chaîne de délimitation et elle sépare les éléments individuels. Par exemple, '-'.join(['hello', 'world']) renvoie la chaîne jointe 'hello-world' .

Alors, quel est l'itérable, vous passez dans le join() fonction? C'est une expression génératrice de la forme :expression for variable in context . Vous parcourez toutes les valeurs entières dans le contexte de 1 à 100 en utilisant le range() fonction. Ainsi, vous obtenez les expression for i in range(1, 101) restants . Quelle est la partie expression ?

Il se compose de trois éléments :

  • 'Fizz' * (i%3==0) — L'expression modulo i%3==0 renvoie True uniquement si l'entier i est divisible par 3, sinon il renvoie False . Donc, vous multipliez la chaîne 'Fizz' soit avec True (=1) ou avec False (=0). En conséquence, vous obtenez la chaîne vide '' dans tous les cas sauf si l'entier i est divisible par 3, auquel cas vous obtenez la chaîne 'Fizz' .
  • 'Buzz' * (i%5==0) — L'expression modulo i%5==0 renvoie True uniquement si l'entier i est divisible par 5, sinon il renvoie False . Donc, vous multipliez la chaîne 'Buzz' soit avec True (=1) ou avec False (=0). En conséquence, vous obtenez la chaîne vide '' dans tous les cas sauf si l'entier i est divisible par 5, auquel cas vous obtenez la chaîne 'Buzz' .
  • Vous utilisez la concaténation de chaînes pour coller ensemble les chaînes précédemment obtenues. Dans la plupart des cas, ce sera la chaîne vide. Si i est divisible par 3, vous obtenez la chaîne 'Fizz' . Si i est divisible par 5, vous obtenez la chaîne 'Buzz' . Et si i est divisible par 3 et 5, vous obtenez la chaîne 'FizzBuzz' .
  • or str(i) — Dans le cas où vous avez obtenu une chaîne non vide dans {'Fizz', 'Buzz', 'FizzBuzz'} à l'étape précédente, le or opération renvoie simplement cette chaîne. C'est ce qu'on appelle le court-circuit - et il est utilisé dans de nombreux langages de programmation tels que Python pour améliorer l'efficacité des opérations logiques.
  • Mais si la chaîne est vide, elle est interprétée comme un False logique . Ainsi, Python renvoie le deuxième opérande du or opération. Le deuxième opérande est simplement la représentation sous forme de chaîne de l'entier i .

Une implémentation très intéressante du problème FizzBuzz en effet !

FizzBuzz One-Liner 2 :trancher

Une alternative est donnée dans le joli one-liner suivant (source):

for i in range(1, 101): print('FizzBuzz'[i*i%3*4:8--i**4%5] or i)

Wow, quelle solution courte et concise en une seule ligne ! Mais comment ça marche ?

  • Vous parcourez toutes les valeurs de i=1 à i=100 et imprimer une chaîne. Jusqu'ici tout va bien.
  • Vous utilisez le or opération et découpage pour déterminer la chaîne 'FizzBuzz'[start:end] or i génère la sortie.
  • Vous utilisez la propriété de court-circuit en Python :Si 'FizzBuzz'[start:end] est vide, l'entier i est renvoyé, sinon, la chaîne non vide est renvoyée.
  • Vous découpez une sous-chaîne de 'FizzBuzz' en utilisant le découpage comme suit.

Le découpage est un concept pour découper une sous-chaîne à partir d'une chaîne donnée. Utiliser la notation de découpage s[start:stop:step] pour accéder à chaque step -ième élément à partir de l'index start (inclus) et se terminant par l'index stop (exclu). Les trois arguments sont facultatifs, vous pouvez donc les ignorer pour utiliser les valeurs par défaut (start=0 , stop=len(lst) , step=1 ). Par exemple, l'expression s[2:4] à partir de la chaîne 'hello' taille la tranche 'll' et l'expression s[:3:2] taille la tranche 'hl' .

Dans l'exemple, vous avez l'opération de découpage 'FizzBuzz'[i*i%3*4:8--i**4%5] .

  • start = i*i%3*4 — Notez que la multiplication * et fonctionnement modulo % ont la même priorité, elles sont donc évaluées de gauche à droite. Si entier i est divisible par 3, i*i est également divisible par 3, et l'indice de départ est 0. Dans tous les autres cas, l'indice de départ est 4. Ainsi, la tranche commence soit par 'Fizz' ou 'Buzz' .
  • stop = 8--i**4%5 — C'est 4 dans tous les cas sauf si le nombre i est divisible par 5, auquel cas c'est 8.

Donc, il y a quatre cas :

  • Le nombre est divisible uniquement par 3 :start=0 , stop=4 –> 'Fizz'
  • Le nombre est divisible uniquement par 5 :start=4 , stop=8 –> 'Buzz'
  • Le nombre est divisible à la fois par 3 et 5 :start=0 , stop=8 –> 'FizzBuzz'
  • Le nombre n'est divisible ni par 3 ni par 5 :start = 4 , stop=4 –> ''

Phew! C'était une noix difficile à casser, n'est-ce pas ?

Python One-Liner 3 :Carte + Lambda

Vous pouvez trouver des tutoriels détaillés sur la carte et les fonctions lambda ici :

  • Maîtriser la fonction Python Map
  • Fonctions Lambda en Python

Ces deux fonctions peuvent être utilisées pour résoudre le problème FizzBuzz (source) :

print(list(map(lambda i: "Fizz"*(i%3==0)+"Buzz"*(i%5==0) or str(i), range(1,101))))

C'est similaire à la méthode 1 et maintenant vous êtes capable de le comprendre. Pensez aux différentes valeurs de l'entier i peut prendre.

Livre Python One-Liners :maîtrisez d'abord la ligne unique !

Les programmeurs Python amélioreront leurs compétences en informatique avec ces lignes utiles.

Python One-Liners vous apprendra à lire et à écrire des « lignes simples » :des déclarations concises de fonctionnalités utiles regroupées dans une seule ligne de code. Vous apprendrez à décompresser et à comprendre systématiquement n'importe quelle ligne de code Python, et à écrire du Python éloquent et puissamment compressé comme un expert.

Les cinq chapitres du livre couvrent (1) les trucs et astuces, (2) les expressions régulières, (3) l'apprentissage automatique, (4) les principaux sujets de science des données et (5) les algorithmes utiles.

Des explications détaillées des one-liners introduisent les concepts clés de l'informatique etdéveloppez vos compétences en matière de codage et d'analyse . Vous découvrirez les fonctionnalités Python avancées telles que la compréhension de liste , tranchage , fonctions lambda , expressions régulières , carte et réduire fonctions et affectations de tranches .

Vous apprendrez également à :

  • Exploiter les structures de données pour résoudre des problèmes réels , comme utiliser l'indexation booléenne pour trouver des villes avec une pollution supérieure à la moyenne
  • Utiliser les bases de NumPy comme tableau , forme , axe , tapez , diffusion , indexation avancée , tranchage , tri , recherche , agrégation , et statistiques
  • Calculer des statistiques de base de tableaux de données multidimensionnels et les algorithmes K-Means pour l'apprentissage non supervisé
  • Créer davantage d'expressions régulières avancées en utilisant le regroupement et groupes nommés , anticipations négatives , caractères échappés , espaces blancs, jeux de caractères (et jeux de caractères négatifs ) et opérateurs gourmands/non gourmands
  • Comprendre un large éventail de sujets informatiques , y compris les anagrammes , palindromes , surensembles , permutations , factorielles , nombres premiers , Fibonacci chiffres, obscurcissement , recherche , et tri algorithmique

À la fin du livre, vous saurez comment écrire Python dans sa forme la plus raffinée , et créez de belles pièces concises d'"art Python" en une seule ligne.

Obtenez vos Python One-Liners sur Amazon !!