我有变量赋值,以便返回指定的值,并将其直接与while循环中的空字符串进行比较。
以下是我在PHP中的表现:
while((name = raw_input("Name: ")) != ''):
names.append(name)
我正在尝试做的与功能相同:
names = []
while(True):
name = raw_input("Name: ")
if (name == ''):
break
names.append(name)
有没有办法在Python中执行此操作?
答案 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,在这里解释得很好:
不允许在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]