Comment effectuer une affectation variable à l'intérieur d'un certain temps (expression) boucle en Python?

StackOverflow https://stackoverflow.com/questions/542212

Question

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

Voici comment je le fais en PHP:

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

Ce que je suis en train de faire est identique à celle de la fonctionnalité:

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

Est-il possible de le faire en Python?

Était-ce utile?

La solution

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']

Autres conseils

Vous pouvez envelopper raw_input() pour la transformer en 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 le code plus complexe. Donc, si vous avez besoin d'envelopper une méthode existante, vous devez utiliser nosklo approche de .

Non, désolé. Il est une FAQ, bien expliqué ici:

Dans le titre Pydocs et blog de Fredrik Lundh .

  

La raison de ne pas autoriser l'affectation dans les expressions Python est une commune, difficile à trouver bogue dans les autres langues.

     

De nombreuses alternatives ont été proposées. La plupart des hacks qui permettent d'économiser de la frappe, mais utilisent une syntaxe arbitraire ou cryptique ou des mots-clés, et ne satisfont pas au critère simple des propositions de changement de langue. Il devrait suggérer intuitivement le sens propre à un lecteur humain qui n'a pas encore été mis en place à 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 cession en construction d'expression beaucoup; ce ne sont que les nouveaux arrivants qui expriment un fort désir d'ajouter ceci à la langue.

     

Il y a une autre façon d'orthographe ce qui semble attrayante:

line = f.readline() while line:
    ... # do something with line...
    line = f.readline()

Je suis seulement 7 ans de retard, mais il y a une autre solution. Ce n'est pas la meilleure solution que je peux penser, mais il met en évidence une utilisation intéressante de l'exception StopIteration. Vous pouvez faire une boucle similaire pour la lecture de fichiers / morceau prises et la poignée et ainsi de suite Timeouts bien.

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

print names
names = []
for name in iter(lambda: raw_input("Name: "), ''):
    names.append(name)
scroll top