Python While 循环中的赋值条件

Posted

技术标签:

【中文标题】Python While 循环中的赋值条件【英文标题】:Assignment Condition in Python While Loop 【发布时间】:2011-12-08 12:31:38 【问题描述】:

在 C 中,可以做到

while( (i=a) != b )  

但在 Python 中,似乎不能。

while (i = sys.stdin.read(1)) != "\n":

生成

    while (i = sys.stdin.read(1)) != "\n":
         ^
SyntaxError: invalid syntax

^ 应该在= 上)

有解决办法吗?

【问题讨论】:

哦,这很尴尬...readline()raw_input() 相比如何? @tekknolagi 他可能没有收到您的评论。通过在评论文本中添加 @name 来 ping 一个人是个好主意。 @JochenRitzel 看到我的评论了吗?对不起:) 这在 Python 中不起作用的原因是赋值是 statements 而不是 expressions - 这仅仅是由于语法产生规则. 查看 Python 常见问题以获取解释:Why can’t I use an assignment in an expression?。它提倡迭代器或while True 【参考方案1】:

使用中断:

while True:
    i = sys.stdin.read(1)
    if i == "\n":
       break
    # etc...

【讨论】:

@FalconMomot 这对我来说似乎是一个完全合理的模式。循环中断的地方有什么关系?终止条件要么会发生,要么不会。如果i == "\n" 没有发生在循环内部(导致中断),那么它也不会发生在 while 循环的条件参数中。【参考方案2】:

Python 3.8 开始,并引入assignment expressions (PEP 572)(:= 运算符),现在可以将表达式值(此处为sys.stdin.read(1))捕获为变量,以便在@987654325 的主体中使用它@:

while (i := sys.stdin.read(1)) != '\n':
  do_smthg(i)

这个:

sys.stdin.read(1) 分配给变量ii\n 进行比较 如果条件得到验证,则进入while 正文,其中i 可以使用

【讨论】:

好的,谢谢!最佳答案在这里。【参考方案3】:

您可以使用内置函数iter() 使用双参数调用方法来完成此操作:

import functools
for i in iter(fuctools.partial(sys.stdin.read, 1), '\n'):
    ...

相关文档:

iter(o[, sentinel]) ... 如果给定第二个参数 sentinel,则 o 必须是可调用对象。在这种情况下创建的迭代器将调用 o,每次调用其next() 方法时不带任何参数;如果返回的值等于sentinelStopIteration 将被提升,否则该值将被返回。

iter() 的第二种形式的一个有用应用是读取文件的行,直到到达特定行。以下示例读取一个文件,直到readline() 方法返回一个空字符串:

with open('mydata.txt') as fp:
    for line in iter(fp.readline, ''):
        process_line(line)

【讨论】:

【参考方案4】:

没有functools的版本:

for i in iter(lambda: sys.stdin.read(1), '\n'):

【讨论】:

【参考方案5】:

我个人喜欢使用 break 的 imm 和 Marks 答案,但您也可以这样做:

a = None
def set_a(x):
    global a
    a = x
    return a

while set_a(sys.stdin.read(1)) != '\n':
    print('yo')

虽然我不会推荐它。

【讨论】:

以上是关于Python While 循环中的赋值条件的主要内容,如果未能解决你的问题,请参考以下文章

while 循环中的赋值 - Javascript

Python之while循环

浅谈python中的while循环

为啥我的 while 循环中的条件在 python 中不起作用?

shelll脚本 for while until 循环

python基础:循环语句