15

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

这是我在 PHP 中的做法:

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

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

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

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

4

6 回答 6

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']
于 2009-02-13T02:58:59.960 回答
13

您可以将其包装raw_input()成生成器:

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

names = wrapper('Name:')

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

于 2009-02-12T16:49:06.230 回答
9

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

PydocsFredrik Lundh 的博客中。

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

已经提出了许多替代方案。大多数是节省一些打字但使用任意或神秘的语法或关键字的技巧,并且不符合语言更改建议的简单标准:它应该直观地向尚未被引入该结构的人类读者提出正确的含义。

一个有趣的现象是,大多数有经验的 Python 程序员都认识这个while True习语,并且似乎并没有过多地错过表达式构造中的赋值。只有新来者表示强烈希望将其添加到语言中。

有另一种拼写方式,看起来很有吸引力:

line = f.readline() while line:
    ... # do something with line...
    line = f.readline()
于 2009-02-12T16:48:34.577 回答
1

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

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

print names
于 2013-05-15T22:23:29.413 回答
1
names = []
for name in iter(lambda: raw_input("Name: "), ''):
    names.append(name)
于 2015-04-13T11:45:03.303 回答
0

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

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

引用 PEP 的语法和语义部分以获得更多示例:

# 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]
于 2018-10-09T14:08:51.213 回答