2009-02-12 87 views
12

我有变量赋值,以便返回指定的值,并将其与直接在while循环中的空字符串进行比较。如何在Python中的while(expression)循环中做变量赋值?

这里是我如何在PHP这样做:

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

我试图做的是相同的这功能:

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

有没有办法做到这一点在Python中?

回答

14
from functools import partial 

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

,或者如果你想有一个清单:

>>> names = list(iter(partial(raw_input, 'Name: '), '')) 
Name: nosklo 
Name: Andreas 
Name: Aaron 
Name: Phil 
Name: 
>>> names 
['nosklo', 'Andreas', 'Aaron', 'Phil'] 
9

不,对不起。这是一个常见问题,在这里解释:

PydocsFredrik Lundh's blog

不允许在Python表达式中赋值的原因是在其他语言中常见的,难以发现的错误。

已经提出了许多替代方案。大多数黑客可以节省一些打字量,但使用任意或隐含的语法或关键词,并且不符合语言改变建议的简单标准:它应直观地向尚未被引入构造的人类读者建议适当的含义。

一个有趣的现象是,大多数有经验的Python程序员认识到while True习语,似乎并没有错过表达式构造中的赋值;只有新人表达强烈的愿望,才能将其添加到语言中。

有似乎有吸引力的拼写此的另一种方式:

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

这个链接似乎被打破 – 2010-11-08 16:37:41

+0

新增更新链接。谢谢! – 2010-11-09 14:34:26

+0

链接已死亡。 – Makkes 2012-09-27 07:56:59

12

你可以用raw_input()把它变成一台发电机:

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

names = wrapper('Name:') 

这意味着我们又回到了起点一个但代码更复杂。所以如果你需要包装现有的方法,你需要使用nosklo的方法。

1

我只有7旬,但还有另一种解决方案。这不是我能想到的最佳解决方案,但它强调了StopIteration异常的一个有趣用法。你可以做一个类似的循环来读取文件/套接字和处理超时以及什么都不好。

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

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