如何在Python中的while(表达式)循环内进行变量赋值?

时间:2009-02-12 16:44:15

标签: python syntax while-loop expression

我有变量赋值,以便返回指定的值,并将其直接与while循环中的空字符串进行比较。

以下是我在PHP中的表现:

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

我正在尝试做的与功能相同:

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

有没有办法在Python中执行此操作?

6 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:13)

您可以将raw_input()换成将其变为生成器:

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

names = wrapper('Name:')

这意味着我们回到原点,但代码更复杂。因此,如果您需要包装现有方法,则需要使用nosklo的方法。

答案 2 :(得分:9)

不,抱歉。这是一个FAQ,在这里解释得很好:

PydocsFredrik Lundh's blog

  

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

     

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

     

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

     

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

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

答案 3 :(得分:1)

我只晚了7年,但还有另一种解决方案。这不是我能想到的最佳解决方案,但它突出了StopIteration异常的有趣用法。您可以为块读取文件/套接字执行类似的循环,并处理超时等等。

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

print names

答案 4 :(得分:1)

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

答案 5 :(得分:0)

PEP 572提出了分配表达式,并且已经被接受。从Python 3.8开始,您将能够编写:

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

引用PEP的Syntax and semantics部分以获取更多示例:

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