Comment faire une assignation de variables dans une boucle while(expression) en Python?

j'ai l'affectation de variable afin de retourner la valeur assignée et de la comparer à une chaîne vide, directement dans la boucle while.

Voici comment je le fais en PHP:

while((name = raw_input("Name: ")) != ''):
    names.append(name)

ce que j'essaie de faire est identique à ceci dans la fonctionnalité:

names = []
while(True):
    name = raw_input("Name: ")
    if (name == ''):
        break
    names.append(name)

y a-t-il un moyen de faire cela en Python?

14
demandé sur kenorb 2009-02-12 19:44:14

6 réponses

from functools import partial

for name in iter(partial(raw_input, 'Name:'), ''):
    do_something_with(name)

ou si vous voulez une liste:

>>> names = list(iter(partial(raw_input, 'Name: '), ''))
Name: nosklo
Name: Andreas
Name: Aaron
Name: Phil
Name: 
>>> names
['nosklo', 'Andreas', 'Aaron', 'Phil']
15
répondu nosklo 2009-02-13 02:58:59

vous pouvez envelopper raw_input() pour en faire un générateur:

def wrapper(s):
    while True:
        result = raw_input(s)
        if result = '': break
        yield result

names = wrapper('Name:')

ce qui signifie que nous sommes de retour à la case départ mais avec un code plus complexe. Donc, si vous avez besoin d'envelopper une méthode existante, vous devez utiliser l'approche nosklo .

12
répondu Aaron Digulla 2017-05-23 12:14:46

non, désolé. C'est une FAQ, bien expliqué ici:

Dans Pydocs , et Fredrik Lundh blog .

la raison pour ne pas autoriser l'affectation dans les expressions Python est un bogue commun, difficile à trouver dans ces autres langues.

de nombreuses alternatives ont été proposées. La plupart sont des hacks qui sauvent quelques typages mais utilisent la syntaxe arbitraire ou cryptique ou des mots-clés, et échouent le simple critère pour les propositions de changement de langage: il devrait intuitivement suggérer le sens approprié à un lecteur humain qui n'a pas encore été introduit à la construction.

un phénomène intéressant est que la plupart des programmeurs Python expérimentés reconnaissent l'idiome while True et ne semblent pas manquer la tâche dans expression construct much; ce ne sont que les nouveaux venus qui expriment un fort désir d'ajouter cela au langage.

il y a un autre façon d'épeler ce qui semble attrayant:

line = f.readline() while line:
    ... # do something with line...
    line = f.readline()
9
répondu Philip Reynolds 2015-05-23 19:24:56

Je n'ai que 7 ans de retard, mais il y a une autre solution. Ce n'est pas la meilleure solution je pense, mais il met en évidence une utilisation intéressante de l'exception StopIteration. Vous pouvez faire une boucle similaire pour lire des fichiers/sockets de morceaux et gérer les temps morts et ainsi de suite.

names=[]
try:
    while True:
        f = raw_input()
        if not f:
            raise StopIteration
        else:
            names.append(f)
except StopIteration:
    pass

print names
1
répondu synthesizerpatel 2013-05-15 22:23:29
names = []
for name in iter(lambda: raw_input("Name: "), ''):
    names.append(name)
1
répondu Armali 2015-04-13 11:45:03

PEP 572 propose Affectation des Expressions et a déjà été accepté. À partir de Python 3.8, vous pourrez écrire:

while name := input("Name: "):
    names.append(name)

citant la syntaxe et la sémantique" 151990920 partie du PEP pour plus d'exemples:

# Handle a matched regex
if (match := pattern.search(data)) is not None:
    # Do something with match

# A loop that can't be trivially rewritten using 2-arg iter()
while chunk := file.read(8192):
   process(chunk)

# Reuse a value that's expensive to compute
[y := f(x), y**2, y**3]

# Share a subexpression between a comprehension filter clause and its output
filtered_data = [y for x in data if (y := f(x)) is not None]
0
répondu timgeb 2018-10-09 14:08:51