Maison  >  Article  >  développement back-end  >  Combien d’embûches les gens ont-ils rencontrés lorsqu’ils utilisaient Python ? Évitez les dangers !

Combien d’embûches les gens ont-ils rencontrés lorsqu’ils utilisaient Python ? Évitez les dangers !

coldplay.xixi
coldplay.xixiavant
2020-09-29 18:01:221992parcourir

Combien d’embûches les gens ont-ils rencontrés lorsqu’ils utilisaient Python ? Évitez les dangers !

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.

D'où vient la fosse ?

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

Combien d’embûches les gens ont-ils rencontrés lorsqu’ils utilisaient Python ? Évitez les dangers !
Cliquez et faites glisser pour déplacer

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 :

Combien d’embûches les gens ont-ils rencontrés lorsqu’ils utilisaient Python ? Évitez les dangers !
Cliquez et faites glisser pour déplacer

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.

Combien d’embûches les gens ont-ils rencontrés lorsqu’ils utilisaient Python ? Évitez les dangers !
Cliquez et faites glisser pour vous déplacer

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.

Combien d’embûches les gens ont-ils rencontrés lorsqu’ils utilisaient Python ? Évitez les dangers !
Cliquez et faites glisser pour déplacer

Alors pourquoi ai-je besoin de vous ?

Combien d’embûches les gens ont-ils rencontrés lorsqu’ils utilisaient Python ? Évitez les dangers !
Cliquez et faites glisser pour vous déplacer

Quel est le problème ?

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.

Combien d’embûches les gens ont-ils rencontrés lorsqu’ils utilisaient Python ? Évitez les dangers !
Cliquez et faites glisser pour vous déplacer

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()

Hein ? Est-ce vraiment bon ?

Combien d’embûches les gens ont-ils rencontrés lorsqu’ils utilisaient Python ? Évitez les dangers !
Cliquez et faites glisser pour vous déplacer
Ce sont tous des points de connaissance, notez-les rapidement Descendez , tu dois passer l'examen

Combien d’embûches les gens ont-ils rencontrés lorsqu’ils utilisaient Python ? Évitez les dangers !
Cliquez et faites glisser pour vous déplacer

Vérifions la documentation officielle de print, son prototype est :

Combien d’embûches les gens ont-ils rencontrés lorsqu’ils utilisaient Python ? Évitez les dangers !
Cliquez et faites glisser pour vous déplacer

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 :

Combien d’embûches les gens ont-ils rencontrés lorsqu’ils utilisaient Python ? Évitez les dangers !
Cliquez et faites glisser pour déplacer
Combien d’embûches les gens ont-ils rencontrés lorsqu’ils utilisaient Python ? Évitez les dangers !
Cliquez et faites glisser pour déplacer

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 :

Combien d’embûches les gens ont-ils rencontrés lorsqu’ils utilisaient Python ? Évitez les dangers !
Cliquez et faites glisser pour déplacer
Combien d’embûches les gens ont-ils rencontrés lorsqu’ils utilisaient Python ? Évitez les dangers !
Cliquez et faites glisser pour déplacer

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.

Résumé

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer