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)
分配给变量i
将i
与\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()
方法时不带任何参数;如果返回的值等于sentinel,StopIteration
将被提升,否则该值将被返回。
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 循环中的赋值条件的主要内容,如果未能解决你的问题,请参考以下文章