Python在while循环中的条件期间为变量赋值

Bor*_*lis 20 python variable-assignment while-loop

关于Python语法的一个简单问题.我想在while循环的条件期间将函数的值赋给变量.当函数返回的值为false时,循环应该中断.我知道如何在PHP中完成它.

while (($data = fgetcsv($fh, 1000, ",")) !== FALSE) 
Run Code Online (Sandbox Code Playgroud)

但是,当我在Python中尝试类似的语法时,我得到一个语法错误.

Mar*_*ers 29

您不能在表达式中使用赋值.赋值本身就是一个语句,你不能组合Python语句.

这是语言设计者的明确选择; 很容易意外地使用一个=并分配,你打算使用两个==并测试相等性.

将赋值移动循环中,或循环之前分配,并在循环本身中分配新值.

对于您的具体示例,Python csv模块为您提供了更高级别的API,而您将循环使用它csv.reader():

with open(csvfilename, 'rb') as csvfh:
    reader = csv.reader(csvfh)
    for row in reader:
Run Code Online (Sandbox Code Playgroud)

如果有的话,我很少需要在循环结构中进行分配.通常有一种(更好)解决手头问题的方法.

  • @opncow:实际上,Python 3.8将具有一个赋值表达式。参见[PEP 572](https://www.python.org/dev/peps/pep-0572/)。 (3认同)

Rem*_*ich 18

你不能在Python中做到这一点,在表达式中没有赋值.至少这意味着你不会意外地键入==而不是=或反过来并让它工作.

传统的Python风格只是在True和break时使用:

while True:
    data = fgetcsv(fh, 1000, ",")
    if not data:
        break
    # Use data here
Run Code Online (Sandbox Code Playgroud)

但是现在我把它放在一台发电机里:

def data_parts(fh):
    while True:
        data = fgetcsv(fh, 1000, ",")
        if not data:
            break
        yield data
Run Code Online (Sandbox Code Playgroud)

所以在使用该文件的代码中,丑陋隐藏起来:

for data in data_parts(fh):
    # Use data here
Run Code Online (Sandbox Code Playgroud)

当然,如果它实际上是您正在进行的CSV读取,请使用csv模块.

  • @RemcoGerlich一个简单的生成器而不是while循环的很好的例子. (3认同)

Pra*_*rni 5

Python 3.8 pep-0572现在使用新的符号来解决这种情况:=。看一看 :)

例如:

while chunk := file.read(8192):
   process(chunk)
Run Code Online (Sandbox Code Playgroud)