【问题标题】:Assignment Condition in Python While LoopPython While 循环中的赋值条件
【发布时间】: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

标签: python loops while-loop conditional-statements


【解决方案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() 方法时不带任何参数;如果返回的值等于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')
      

      虽然我不会推荐它。

      【讨论】:

        猜你喜欢
        • 2010-11-11
        • 2013-11-15
        • 2013-09-25
        • 2015-03-22
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-04
        相关资源
        最近更新 更多