Python >> Tutoriel Python >  >> Python

Python One Line Quine

La plupart des informaticiens, programmeurs et hackers ne connaissent même pas la signification du mot "Quine" dans le contexte de la programmation. Donc, tout d'abord :

Qu'est-ce qu'un Quiné ?

En gros, un quine est un programme auto-reproducteur :si vous l'exécutez, il se génère.

Voici une excellente définition :

 :quin :/kwi:n/ /n./ [du nom du logicien Willard van Orman Quine, via Douglas Hofstadter] Un programme qui génère une copie de son propre texte source comme sortie complète. Concevoir la quine la plus courte possible dans un langage de programmation donné est un amusement hackish courant. (source)

La quine la plus courte possible est le programme vide suivant :

 

Le programme s'auto-reproduit car la sortie du programme est le programme lui-même. Allez-y et exécutez-le dans votre propre shell ! 😉

Plongeons-nous dans une collection de Python Quines pour montrer comment ils fonctionnent !

Python One-Liner Quine 1

Voici une courte ligne Quine, que j'ai trouvée sur cette ressource :

s='s=%r;print(s%%s,sep="")';print(s%s,sep="")
  • Vous voudrez peut-être améliorer vos compétences en formatage de chaînes pour vraiment comprendre cette phrase.
  • L'argument séparateur de la fonction d'impression évite d'imprimer un caractère de nouvelle ligne à la fin.
  • Le %r le spécificateur de format fournit automatiquement des guillemets simples.

Voici le code dans un shell interactif pour que vous puissiez jouer avec ce Quine dans votre navigateur :

Exercice :Exécutez le code. Quelle est la sortie ? Pouvez-vous expliquer pourquoi ?

Python One-Liner Quine 2

Le Quine suivant est également intéressant. Je l'ai trouvé ici en recherchant cet article. La source originale l'a citée comme "la Quine la plus courte possible" - ce qui n'est pas exact ! Vous en avez déjà vu un plus court comme premier exemple dans cet article. Cependant, le one-liner est néanmoins intéressant :

_='_=%r;print (_%%_)';print (_%_)

Encore une fois, voici le shell de code interactif qui vous permet de tester s'il s'agit vraiment d'un Quine !

Encore une fois, vous utilisez le formatage de chaîne Python pour définir d'abord une variable nommée _ . Le trait de soulignement unique est un nom de variable parfaitement valide

Deuxièmement, vous attribuez le code '_=%r;print _%%_' à la variable de soulignement nouvellement créée.

Troisièmement, vous imprimez l'expression _%_ qui se compose de la variable de soulignement _ avec _ comme entrée pour le formatage de chaîne (comment méta !).

Ainsi, l'expression de formatage de chaîne %r en _ obtient la valeur de _ .

Notez que le double % en '_=%r;print _%%_' échappe le symbole de pourcentage.

Python One-Liner Quine 3

Certains diront que le code suivant correspond également à la définition du Quine. Le code lit son propre fichier et affiche le résultat sur le shell :

print(open(__file__).read())

La sortie est le code lui-même - ceci est trivialement rempli car le code lit le fichier dans lequel il est stocké et il imprime le résultat. Cependant, certains considéreraient cela comme de la "tricherie" car les Quines sont censés se créer en interne en utilisant uniquement du code et non des méta mécanismes tels que la lecture de fichiers.

Voici le shell interactif :

Exercice :modifiez le code et ajoutez une ligne supplémentaire. Est-ce toujours un Quine ?

Python One Liner Quine 4

Le Quine suivant vient d'une réponse SO et c'est l'un de mes favoris :

print((lambda x:f"{x}{x,})")('print((lambda x:f"{x}{x,})")',))

Essayez-le vous-même dans le shell de code interactif :

Exercice :Essayez de changer au moins un personnage et gardez-le toujours un Quine !

Le Quine crée une fonction lambda anonyme et l'appelle immédiatement en passant une valeur de chaîne. La façon dont la fonction lambda modifie la valeur de chaîne garantit que la sortie du code est égale au code lui-même.