问题描述
在C语言以及Java等语言中,赋值运算会返回赋值后的值。但是,这一点在Python中不成立,Python赋值语句只是语句,不是表达式!
Python严格区分以下概念:
表达式:比如 3 + 2 就是一个表达式,如果你在交互式环境下输入,会有回显 >>> 5,这就意味着,上面返回的值是5,顶层环境为我们自动打印表达式结果并显示,还有字符串格式化表达式等等
语 句:比如del L[0], 在Python2.6中print X,但是在Python3中print变成了一个内置函数,pass 空操作语句等等
错误示例
while ((x = next()) != NULL) {... process x ...}
上面书写的循环条件,是C语言中的常见写法,但是Python下会出错,不支持,因为x = next()赋值运算语句,不会返回赋值之后的x的值,从而想利用赋值之后的结果进行比较就无从谈起了!
解决方案
Python中至少存在以下三种常见的解决方案,都实现了不用在循环测试中嵌入赋值语句
- 方法一:循环测试条件采用傻瓜式的True,再配合使用break语句
while True:
x = next()
if not x: break
...process x...
- 方法二:以x为循环测试条件,但是在进入循环之前将x赋值为True,而且不需使用break语句
x = True
while x:
x = next()
if x:
...process x...
- 方法三:把赋值语句移到循环外,同样以x作为循环测试条件,同样不需要break语句了
x = next()
while x:
...process x...
x = next()
自我总结
经过上述的简短分析,我想大家肯定都明白了,其实注意到并且记住这个易混淆的点并不难,难在我们怎么能熟练记住并掌握上述三个常用的解决方案,要做到提笔就会,方才合格。
因为第一种方案,采用傻瓜式的True作为循环测试条件,所以循环体中必定需要有if测试兼break语句,用以跳出循环!记住这一点,想必第一种方案定能熟稔于心~
第二种以及第三种方案皆采用x作为循环测试条件,但是二者在实现上仍有细微差别。第二种仍然可谓是简单粗暴,首先毫不客气的将 x 置为True,再以while x作为循环测试条件,赋值语句(x = next())放在循环内部,所以x为假时自然能退出循环,所以我们需要在处理x之前判断x是否为真,以确保对x的处理流程发生在x为真的条件下!
第三种其实算是大家最容易想到的了,既然Python不支持赋值语句返回赋值之后的值的这个feature,那好我就先在循环之前获取一次x的值(x = next()),所以进入循环之后,便开始 x 的处理流程,因为既然能进入循环,那么x必定为真!处理完之后,更新测试条件x的值,如此往复