繁体   English   中英

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

[英]Python Assign value to variable during condition in while Loop

关于 Python 语法的一个简单问题。 我想在 while 循环的条件期间将一个函数的值分配给一个变量。 当函数返回的值为 false 时,循环应该中断。 我知道如何在 PHP 中做到这一点。

while (($data = fgetcsv($fh, 1000, ",")) !== FALSE) 

但是,当我在 Python 中尝试类似的语法时,出现语法错误。

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

这是语言设计者做出的明确选择; 很容易不小心使用一个=并赋值,而您打算使用两个==并测试相等性。

将赋值移到循环中,或循环之前赋值,并在循环本身中赋值新值。

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

with open(csvfilename, 'rb') as csvfh:
    reader = csv.reader(csvfh)
    for row in reader:

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

也就是说,从 Python 3.8 开始,该语言实际上将具有赋值表达式,使用:=作为赋值运算符。 参见PEP 572 赋值表达式在列表推导中实际上很有用,例如,当您需要在正在构建的列表中包含一个方法返回值并且需要能够在测试中使用该值时。

现在,您必须使用生成器表达式:

absolute = (os.path.abspath(p) for p in files)
filtered = [abs for abs in absolute if included(abs)]

但是使用赋值表达式,您可以内联os.path.abspath()调用:

filtered = [abs for p in files if included(abs := os.path.abspath(p))]

2020 答案:

从 Python 3.8 开始, “海象运算符” :=存在,它完全符合您的要求:

while data := fgetcsv(fh, 1000, ",") != False:
    pass

(如果存在 fgetcsv 函数)

2013 年答案:您不能在 Python 中做到这一点,表达式中没有赋值。 至少这意味着您不会意外地键入 == 而不是 = 或相反地使其工作。

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

while True:
    data = fgetcsv(fh, 1000, ",")
    if not data:
        break
    # Use data here

但现在我把它放在一个发电机中:

def data_parts(fh):
    while True:
        data = fgetcsv(fh, 1000, ",")
        if not data:
            break
        yield data

这样在使用该文件的代码中,丑陋就被隐藏了:

for data in data_parts(fh):
    # Use data here

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

我写了一个小的 Python 模块,我称之为let ,它允许你在允许函数的任何地方执行变量赋值。

像这样安装它:

pip install let

我相信以下将完成您正在寻找的内容:

from let import let

while let(data = fgetcsv(fh, 1000, ',')):
    # Do whatever you'd like with data here

但是...... Duncan 的评论说使用iter的原始问题很有趣。 直到他提出这个功能我才意识到它,现在我相信它可能是比我更好的解决方案。 这是有争议的 - iter需要明确提供一个哨兵,而我的不在乎,只是等待fgetcsv返回任何False y 值。

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

例如:

while chunk := file.read(8192):
   process(chunk)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM