web-dev-qa-db-fra.com

Assignation dans la boucle While en Python?

Je viens de tomber sur ce morceau de code

while 1:
    line = data.readline()
    if not line:
        break
    #...

et pensé, il doit être une meilleure façon de le faire, que d'utiliser une boucle infinie avec break.

J'ai donc essayé:

while line = data.readline():
    #...

et, évidemment, a obtenu une erreur.

Existe-t-il un moyen d'éviter d'utiliser un break dans cette situation?

Modifier:

Idéalement, vous voudriez éviter de dire readline deux fois ... À mon humble avis, la répétition est encore pire qu'un simple break, surtout si l'instruction est complexe.

56
Mehrdad

Si vous ne faites rien de plus sophistiqué avec les données, comme lire plus de lignes plus tard, il y a toujours:

for line in data:
    ... do stuff ...
25
Ned Batchelder

Essayez celui-ci, fonctionne pour les fichiers ouverts avec open('filename')

for line in iter(data.readline, b''):
39
Niklas Claesson

Ce n'est pas beaucoup mieux, mais c'est comme ça que je le fais d'habitude. Python ne renvoie pas la valeur lors de l'affectation de variable comme les autres langages (par exemple, Java).

line = data.readline()
while line:
    # ... do stuff ... 
    line = data.readline()
16
dfb

Comme,

for line in data:
    # ...

? Il dépend de la sémantique de la sémantique de ligne de lecture de l'objet data. Si data est un objet file, cela fonctionnera.

6
Kirk Strauser
for line in data:
    ... process line somehow....

Itérera sur chaque ligne du file, plutôt que d'utiliser un while. C'est un idiome beaucoup plus courant pour la tâche de lecture d'un fichier d'après mon expérience (en Python).

En fait, data ne doit pas nécessairement être un fichier mais simplement fournir un itérateur.

4
shelhamer

Si data est un fichier, comme indiqué dans d'autres réponses, en utilisant for line in file fonctionnera bien. Si les données ne sont pas un fichier et un objet de lecture de données aléatoire, vous devez l'implémenter en tant qu'itérateur, implémentant __iter__ et next méthodes.

La méthode next doit à la lecture, vérifier s'il y a plus de données, et sinon, augmenter StopIteration. Si vous procédez ainsi, vous pouvez continuer à utiliser le for line in data idiome.

2
rafalotufo

Selon la FAQ de la documentation de Python, itérer sur l'entrée avec la construction for ou exécuter une infinie while True loop et l'utilisation de l'instruction break pour y mettre fin, sont des modes d'itération préférés et idiomatiques.

2
Mr. Deathless

En démarrant Python 3.8 Et en introduisant expressions d'affectation (PEP 572) (opérateur :=), Il est maintenant possible de capturer la valeur de la condition (data.readline()) de la boucle while en tant que variable (line) afin de la réutiliser dans le corps de la boucle:

while line := data.readline():
  do_smthg(line)
2
Xavier Guihot

Vous pourriez faire:

line = 1
while line:
    line = data.readline()
2
brandon

Si data a une fonction qui retourne un itérateur au lieu de readline (disons data.iterate), vous pouvez simplement faire:

for line in data.iterate():
    #...
1
TorelTwiddler