我对Python 2.7很陌生,所以我对使用for循环的循环有几个问题。
例如:我正在写这个定义
def missingDoor(trapdoor,roomwidth,roomheight,step):
safezone = []
hazardflr = givenSteps(roomwidth,step,True)
safetiles = []
for m in hazardflr:
safetiles.append((m,step))
i = 0
while i < len(safetiles):
nextSafe = safetiles[i]
if knownSafe(roomwidth, roomheight, nextSafe[0], nextSafe[1]):
if trapdoor[nextSafe[0]/roomwidth][nextSafe[0]%roomwidth] is "0":
if nextSafe[0] not in safezone:
safezone.append(nextSafe[0])
for e in givenSteps(roomwidth,nextSafe[0],True):
if knownSafe(roomwidth, roomheight, e, nextSafe[0]):
if trapdoor[e/roomwidth][e%roomwidth] is "0" and (e,nextSafe[0]) not in safetiles:
safetiles.append((e,nextSafe[0]))
i += 1
return sorted(safezone)
我正在尝试将所有for循环转换为while循环,所以这是我目前所写的内容。我实际上不知道我们是否说过&#34;当我在&#34;在代码中间附近工作。但是使用while循环规则,此代码是否与for循环规则相同?
safezone = []
hazardflr = givenSteps(roomwidth,step,True)
safetiles = []
m=0
while m < hazardflr:
safetiles.append((m,step))
i = 0
while i < len(safetiles):
nextSafe = safetiles[i]
if knownSafe(roomwidth, roomheight, nextSafe[0], nextSafe[1]):
if trapdoor[nextSafe[0]/roomwidth][nextSafe[0]%roomwidth] is "0":
if nextSafe[0] not in safezone:
safezone.append(nextSafe[0])
e=0
while e in givenSteps(roomwidth,nextSafe[0],True):
if knownSafe(roomwidth, roomheight, e, nextSafe[0]):
if trapdoor[e/roomwidth][e%roomwidth] is "0" and (e,nextSafe[0]) not in safetiles:
safetiles.append((e,nextSafe[0]))
e+=1
i += 1
m+=1
return sorted(safezone)
感谢您的任何建议或帮助!
答案 0 :(得分:1)
虽然它们看起来很相似,但for item in list
和while item in list
会做完全不同的事情。
for item in list
是对列表中每个项目说法的一种语法方式 - 用is做点什么。while item in list
不同 - 只要条件为真,while
循环就会迭代。在这种情况下的条件是item in list
。它不会在每次迭代时更新项目,如果您从未更改item
或list
的内容,则它可能永远不会终止。此外,如果任何给定项目不在列表中,它可能会提前终止。 如果您要遍历列表并保持计数,使用while
是错误的方法。请改用enumerate()
功能。
enumerate()
获取一个列表,并返回一个元组列表,列表中的每个项目按其索引顺序排列,如下所示:
for i,m in enumerate(hazardflr):
safetiles.append((m,step))
这一小改动意味着您不再需要手动跟踪索引。
如果您正在迭代Python中列表中的每个项目 - 使用for
这就是它的目的。
答案 1 :(得分:0)
这取决于givenSteps
返回的确切内容,但总的来说,不是。 for x in foo
评估foo
一次,然后依次将x
指定为foo
的每个元素。另一方面,while x in foo: ... x += 1
在每次迭代时评估foo
,如果foo
不是连续序列,则会提前结束。例如,如果foo = [0, 1, 2, 5, 6]
,for
将使用foo
的每个值,但while
将在2之后结束,因为3不在foo
中。如果while
包含任何非整数值或低于起始值的值,则for
也会与foo
不同。
答案 2 :(得分:-1)
while aList:
m= hazardflr.pop()
# ...
应该大致相当于你的其他循环