Il ne fait aucun doute que la fonction print
est la fonction la plus couramment utilisée dans notre vie quotidienne. Qu'il s'agisse de formater la sortie ou d'imprimer des variables intermédiaires pour le débogage, il n'y a presque pas de travail. que print
ne peut pas gérer.
Mais A-chan a failli être trompé par print
la dernière fois.
À l'origine, je voulais ajouter une fonction d'affichage de la progression à l'un de mes gadgets en ligne de commande, j'ai donc utilisé le module threading
pour implémenter le multi-threading. Un thread est utilisé pour La logique réelle est exécutée et un autre thread est utilisé pour imprimer la progression actuelle.
Basé sur nos
années d'utilisation en utilisant la commande Par expérience, généralement la progression de l'impression est imprimée dans la ligne, tandis que print
de Python imprimera par défaut un caractère de nouvelle ligne à la fin, ce qui est très disgracieux.
Heureusement, print
fournit également une interface pour changer le dernier caractère de l'impression En spécifiant le paramètre print
de end
, vous pouvez modifier le résultat de l'impression de print
.
J'ai donc commencé à travailler dessus et j'ai changé l'print("#")
appel de progression de l'impression en print("#", end="")
.
Quelque chose comme ceci :
Qu'est-ce que Je pensais que ce changement posait un gros problème : la progression ne pouvait pas être imprimée en temps réel.
En d'autres termes, lors de l'exécution du programme, Le #
les nombres imprimés un par un ne sont plus les nombres #
obéissants et mignons, mais sont affichés sur la console immédiatement après l'exécution de l'ensemble du programme.
Il a grandi, il est aussi devenu laid.
Alors pourquoi ai-je besoin de vous ?
Au début, Ajiang pensait qu'il y avait un problème avec le multi-threading, alors elle a bêtement cherché des informations partout pour "étayer" ses diverses spéculations - en y repensant après, c'était tellement stupide qu'elle rit encore en parlant à ce sujet maintenant.
La leçon de cet incident est : Dix millions Ne soyez pas suffisant, mais résolvez les problèmes de manière terre-à-terre et traitez chaque détail avec un esprit ouvert.
En fait, la raison pour laquelle nous ne pouvons pas voir la sortie en temps réel est que nous avons modifié le caractère de fin de print
.
Afin de minimiser les opérations d'E/S, Python dispose d'un mécanisme qui met en cache les caractères de sortie autant que possible lorsqu'il rencontre la fin de la chaîne, un caractère de nouvelle ligne ou un rafraîchissement forcé du tampon. Le tampon sera mis en cache en une seule fois. Le contenu de la zone est affiché dans le flux correspondant.
——Ce que nous avons modifié est de supprimer le caractère de nouvelle ligne par défaut de print
, donc à l'origine chaque print
déclencherait une actualisation du tampon, mais maintenant le tampon ne peut pas être déclenché, déclenché une fois jusqu'à la fin. du programme.
D'accord, maintenant que nous savons quel est le problème, nous avons à nouveau cherché des informations. Nous avons entendu dire que sys.stdout.flush
pouvait déclencher de force l'actualisation du tampon de sortie standard, nous l'avons donc ajouté immédiatement après print
<.> . sys.stdout.flush()
Vérifions la documentation officielle de print
, son prototype est :
Selon la description ci-dessous, en Python print
Que ce soit la sortie de est mise en mémoire tampon dépend de deux paramètres : file
et flush
. Certains types de
file
nécessitent une mise en mémoire tampon, comme sys.stdout
, tandis que d'autres ne nécessitent pas de mise en mémoire tampon, comme sys.stderr
;
Pour le paramètre flush
, lorsque sa valeur est False
(par défaut), la mise en mémoire tampon dépend de file
lorsque sa valeur est True
, le tampon sera forcé d'être vidé.
Modifions l'appel print
dans l'exemple d'appel :
pour obtenir également une impression en temps réel de la progression.
De plus, il existe un moyen d'ajouter une option -u
lors de l'appel du programme, qui peut également réaliser un rafraîchissement en temps réel du tampon :
Bien sûr, cette méthode n'est pas recommandée, après tout, elle ne peut créer aucun préréglage pour les utilisateurs du programme.
Cet article est un compte rendu des pièges d'Ajiang, enregistrant un étrange problème en Python que peu de gens rencontreront.
De manière générale, si vous voulez devenir un vrai programmeur Python, il ne suffit pas de simplement maîtriser la syntaxe de base et quelques astuces. Il faut encore avoir une certaine compréhension de Python lui-même.
Après tout, comment un épéiste peut-il naviguer dans le monde s'il n'est pas familier avec sa propre épée ?
Recommandations d'apprentissage gratuites associées : Tutoriel vidéo Python
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!