关于Python语法的简单问题。我想在while循环的条件期间将函数的值赋给变量。当函数返回的值为false时,循环应该中断。我知道如何在PHP中完成它。
while (($data = fgetcsv($fh, 1000, ",")) !== FALSE)
然而,当我在Python中尝试类似的语法时,我遇到语法错误。
答案 0 :(得分:25)
您不能在表达式中使用赋值。赋值本身就是一个语句,你不能组合Python语句。
这是语言设计者的明确选择;很容易意外地使用一个=
并分配,你打算使用两个==
并测试相等。
将赋值移动到循环中,或在循环之前指定,并在循环中指定新值。
对于您的具体示例,Python csv
module为您提供了更高级别的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))]
答案 1 :(得分:17)
你不能在Python中这样做,在表达式中没有赋值。至少这意味着你不会意外地键入==而不是=或反过来并让它工作。
传统的Python风格只是在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模块。
答案 2 :(得分:4)
我编写了一个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值。
答案 3 :(得分:2)