如何在 Python 中的 while(expression) 循环中进行变量赋值?

How to do variable assignment inside a while(expression) loop in Python?

提问人:Andreas Karlsson 提问时间:2/13/2009 最后编辑:kenorbAndreas Karlsson 更新时间:10/9/2018 访问量:10677

问:

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

以下是我在 PHP 中的做法:

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

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

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

在 Python 中有什么方法可以做到这一点吗?

Python 语法 while-loop 表达式

评论


答:

9赞 Philip Reynolds 2/13/2009 #1

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

PydocsFredrik 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( ^ ------------------------------------------------------------