提问人:Andreas Karlsson 提问时间:2/13/2009 最后编辑:kenorbAndreas Karlsson 更新时间:10/9/2018 访问量:10677
如何在 Python 中的 while(expression) 循环中进行变量赋值?
How to do variable assignment inside a while(expression) loop in Python?
问:
我有变量赋值,以便返回赋值并将其与空字符串进行比较,直接在 while 循环中。
以下是我在 PHP 中的做法:
while((name = raw_input("Name: ")) != ''):
names.append(name)
我正在尝试做的在功能上与此相同:
names = []
while(True):
name = raw_input("Name: ")
if (name == ''):
break
names.append(name)
在 Python 中有什么方法可以做到这一点吗?
答:
9赞
Philip Reynolds
2/13/2009
#1
不,对不起。这是一个常见问题解答,在这里解释得很好:
在 Pydocs 和 Fredrik Lundh 的博客中。
不允许在 Python 表达式中赋值的原因是其他语言中常见的、难以找到的错误。
已经提出了许多替代方案。大多数是 hack,它们节省了一些打字,但使用任意或隐晦的语法或关键字,并且不符合语言更改建议的简单标准:它应该直观地向尚未被引入该结构的人类读者建议正确的含义。
一个有趣的现象是,大多数有经验的 Python 程序员都认识这个习语,并且似乎并没有在表达式构造中遗漏太多赋值;只有新来者才会表达出将其添加到语言中的强烈愿望。
while True
还有另一种拼写方式似乎很有吸引力:
line = f.readline() while line: ... # do something with line... line = f.readline()
评论
0赞
Mark Heath
11/9/2010
此链接似乎已断开
13赞
Aaron Digulla
2/13/2009
#2
你可以换行把它变成一个生成器:raw_input()
def wrapper(s):
while True:
result = raw_input(s)
if result = '': break
yield result
names = wrapper('Name:')
这意味着我们又回到了原点,但代码更复杂。因此,如果你需要包装一个现有的方法,你需要使用nosklo的方法。
评论
0赞
S.Lott
2/13/2009
+1:秒数击败我。不过,请在您的答案中添加“raw_input作为生成器”的定义。
0赞
Andreas Karlsson
2/13/2009
很酷,谢谢!顺便说一句,第一次使用堆栈溢出,从来不知道它这么棒,几分钟内就得到了完美的答案:)
0赞
physicsmichael
2/13/2009
你能详细说明一下如何以一种非常蟒蛇的方式“将raw_input变成一个生成器”吗?
0赞
hasen
2/13/2009
你是把它变成发电机还是把它当作发电机?顺便说一句,很好的答案,你不知道raw_input可以这样使用吗:)
1赞
recursive
2/13/2009
此解决方案将在第一个响应中将字符列表分配给名称。这是不正确的。
15赞
nosklo
2/13/2009
#3
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']
评论
0赞
Kaz
4/6/2017
不是答案;我仍然不知道:您是否在 Python 中绑定变量?while
1赞
synthesizerpatel
5/16/2013
#4
我只迟到了 7 年,但还有另一种解决方案。这不是我能想到的最佳解决方案,但它突出了 StopIteration 异常的有趣用法。您可以对块读取文件/套接字进行类似的循环,并很好地处理超时等。
names=[]
try:
while True:
f = raw_input()
if not f:
raise StopIteration
else:
names.append(f)
except StopIteration:
pass
print names
1赞
Armali
4/13/2015
#5
names = []
for name in iter(lambda: raw_input("Name: "), ''):
names.append(name)
1赞
timgeb
10/9/2018
#6
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]
评论
0赞
FifthAxiom
6/13/2022
我一直在使用它,并通过反复试验偶然发现了这一点。虽然这适用于 Python,但 Cython 无法识别这一点并抛出错误。Error compiling Cython file: ------------------------------------------------------------ ... while my_var := "".join( ^ ------------------------------------------------------------
评论