Python Affecter la valeur à la variable pendant la condition dans while Loop
Une question simple à propos de la syntaxe de Python. Je veux attribuer une valeur à partir d'une fonction à une variable lors de la condition d'une boucle while. Lorsque la valeur retournée par la fonction est fausse, la boucle doit briser. Je sais comment le faire en PHP.
while (($data = fgetcsv($fh, 1000, ",")) !== FALSE)
Cependant, lorsque j'essaie une syntaxe similaire en Python j'obtiens une erreur de syntaxe.
source d'informationauteur Borut Flis
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas utiliser l'affectation dans une expression. Attribution est elle-même une déclaration, et vous ne pouvez pas combiner des instructions Python.
C'est explicite choix fait par le langage du design; c'est trop facile d'utiliser accidentellement un
=
et céder, où que vous vouliez utiliser deux==
et test d'égalité.Déplacer la cession en la boucle, ou de céder avant la boucle, et de leur attribuer de nouvelles valeurs dans la boucle elle-même.
Pour votre exemple, le Python
csv
module vous donne un plus haut niveau de l'API et vous seriez en boucle sur lecsv.reader()
à la place:Je rarementsi jamais, besoin d'affecter dans une boucle de construire. Habituellement, il y a (beaucoup) mieux à même de résoudre le problème à la main.
Vous ne pouvez pas le faire en Python, aucune affectation dans les expressions. Au moins cela signifie que vous ne tapez accidentellement == au lieu de = ou dans l'autre sens et qu'il fonctionne.
Traditionnel Python style est à l'utiliser tout en Vrai et rupture:
Mais aujourd'hui, j'avais mis que dans un générateur:
de sorte que, dans le code qui utilise le fichier, la laideur est caché:
Bien sûr, si c'est réellement le CSV de lecture que vous faites, utilisez le module csv.
J'ai écrit un petit module Python, que j'appelle
let
qui vous permet d'effectuer une affectation de variable partout où une fonction est autorisée.L'installer comme ceci:
Je crois que la suite va accomplir ce que vous cherchez:
Cependant... Duncan commentaire à la question d'origine de dire d'utiliser
iter
est intéressant. Je n'étais pas conscient de la fonction jusqu'à ce qu'il en fait, et je crois qu'il peut être une meilleure solution que la mienne. C'est discutable,iter
nécessite une sentinelle être expressément prévu, alors que le mien n'a pas de soins et attend simplementfgetcsv
pour retourner toutFalse
valeur de y.