我对Python仍然比较新,并且一直在使用如下语句:
flag = False
while flag == False:
# Do something here that might set the flag to True,
flag = True
然而,这可以这样写:
while not flag:
# Do something...
flag = True
while flag is False:
# Do something...
flag = True
使用另一种(首选?)方式编写这种类型的循环:
while True:
# Do something and if wanting wanting to break out of loop,
break
前三种方法更明确,为什么他们(或其中一种)不比第四种方法更受欢迎?写前三种方式之间是否存在差异?#34;而flag == False"?
答案 0 :(得分:0)
我认为不存在偏好。只要指定的布尔表达式保持为True,while循环就会继续执行代码块。
flag == True,不是Flag,i< 6或评估为布尔表达式。如果你只是像你的例子那样说真,那么你只会进入一个无限循环。这会回答你的问题吗?
答案 1 :(得分:0)
所有这些都在技术上有所不同。
示例1
假设您有一个不返回任何有意义的函数调用,如下所示:
def fun(x=None):
return x
现在,对于你的while循环,所有这些都将定义如下:
def while1():
flag = False
while flag == False:
flag = fun(None)
def while2():
flag = False
while flag is False:
flag = fun(None)
def while3():
flag = False
while not flag:
flag = fun(None)
在这种情况下,只有while1
和while2
会终止。由于bool(None)
评估为False
,while3
将无限延续,但自None != False
和None is not False
以来,while1
和while2
都会终止。
现在,通过更复杂的示例,这会变得更有趣。
示例2
def fun(x):
return x
现在,对于我们的每个循环,我们都会将flag = fun()
更改为flag = fun(0)
。
在这种情况下,while1
和while3
会终止,而while2
会无限期地继续。这是因为bool(0) == False
和0 == False
,但0 is not False
。
示例3 - Mutables
现在,对于mutable来说,这会变得更复杂,这就是为什么显式与隐式取决于情况的原因。 Mutables是可以修改的任何对象,包括dicts,lists。不可变对象是任何无法修改的对象,例如元组,整数,浮点数,strs。
说我有以下内容:
a = []
b = []
在这种情况下,bool(a) == False
和a == b
,但a is not b
。简而言之,对于如何检查虚假或真实的价值观,没有简单而坚定的规则。
但是,有一般规则。
一般规则
检查无与其他
如果您接受除None之外的任何值,请选中x is None
。
检查可变对象
永远不要使用x is b
,因为mutable可以有不同的ID,除非您明确要检查具有相同ID(id(x) == id(b)
的对象。
通常,请检查not x
或x == b
>>> a = []
>>> b = []
>>> a is b
False
>>> a == b
True
>>> not a
True
检查strs,浮动和整数
对于strs,浮点数和整数,请务必选中x == b
而不是x is b
。这是因为对于短strs,浮点数,整数,如果x == b
,结果可能为真,但对于更复杂的情况,您的代码将停止工作。
例如:
>>> a = 1
>>> a is 1
True
>>> a = 10000000
>>> a is 10000000
False
检查布尔值
对于布尔值,您可以执行以上任何操作,但not x
优于x == b
或x is b
。
最后......循环时
如果可以,请始终将while循环转换为for循环。这并不总是可行的,但是说你想做一个简单的案例:
x = 0
while x < 10:
print(x)
x -= 1
这可以转换为:
for x in range(10):
print(x)
使用for循环而不是while循环的原因是代码中发生了一些错误,而循环可能导致无限循环并导致程序崩溃,而for循环将始终退出。
答案 2 :(得分:0)
虽然前三个更明确,但最后一个更易读和清晰。我想说这使得它比其他三个更好。不会为循环搜索某些变量的初始化。话虽如此,所有的方法都是完全可以接受的,你应该使用对你来说更舒适的方法。
答案 3 :(得分:0)
我认为while True:
语法适用于简单逻辑。一旦你开始从多个位置突破循环或需要跟踪循环是否成功,那么它就会变得混乱。
此外,如果while条件被正确命名,那么它就是为什么要循环的文档。
while not end_of_file:
..read read read..
避免循环中的break
语句,恕我直言,使代码更具可读性。就像避免函数中的多个return
语句一样。