我想知道,我是否可以使这段代码在行保存方面更高效,或者任何其他方式:
def missingDoor(trapdoor,roomwidth,roomheight,step):
safezone = []
hazardflr = givenSteps(roomwidth,step,True)
safetiles = []
for i,m in enumerate(hazardflr):
safetiles.append((m,step))
while i < len(safetiles):
nextSafe = safetiles[i]
ns0 = nextSafe[0]
if knownSafe(roomwidth, roomheight, ns0, nextSafe[1]):
if trapdoor[ns0/roomwidth][ns0 % roomwidth] is "0":
if ns0 not in safezone:
safezone.append(ns0)
for e in givenSteps(roomwidth,ns0,True):
if knownSafe(roomwidth, roomheight, e, ns0):
if trapdoor[e/roomwidth][e%roomwidth] is "0" and (e, ns0) not in safetiles:
safetiles.append((e, ns0))
i += 1
return sorted(safezone)一位社区成员建议这样修改这个代码:
def missingDoor(trapdoor, roomwidth, roomheight, step):
safezone, safetiles = [], []
check = lambda a, b, c, l: knownSafe(roomwidth, roomheight, a, b) and trapdoor[a/roomwidth][a%roomwidth] == '0' and c not in l
for i, m in enumerate(givenSteps(roomwidth, step, True)):
safetiles.append((m, step))
for _ in range(i, len(safetiles)):
nextSafe = safetiles[i]
ns0 = nextSafe[0]
if check(ns0, nextSafe[1], ns0, safezone):
safezone.append(ns0)
safetiles.extend([ (e, ns0) for e in givenSteps(roomwidth,ns0,True) if check(e, ns0, (e, ns0), safetiles) ])
return sorted(safezone)不过,我遇到的唯一问题是,当我运行代码时,它现在会遇到以下情况:
TypeError: givenSteps() takes exactly 4 arguments (3 given)如何使这段代码更有效率?我最初开始使用while循环,当给定一个已知的列表时,我发现for循环更好。我一直在尝试各种各样的东西,因为我对编程还不熟悉。
发布于 2014-07-11 15:38:54
第一件事是,不要再关心台词的数量了。除非您正在尝试编写一个代码高尔夫竞赛条目,否则您最不希望优化的是最小化行数。这段代码很难阅读和跟踪,因为它是深嵌套的,并且几乎没有上下文来描述每一行所做的事情。这段代码应该分解成封装工作部分的子函数。
比较这一行
if knownSafe(roomwidth, roomheight, e, ns0):到这条线
if trapdoor[ns0/roomwidth][ns0 % roomwidth] is "0":在不了解代码的情况下,我知道如果给定的参数描述已知的安全位置,则执行if块。同时,我不知道为什么要在这个嵌套的列表结构中索引,也不知道"0"代表什么。
is进行身份比较。==做一个等价的比较。两个只包含字符0的字符串可能并不总是由同一个对象表示。事实上,它们是您当前使用的Python解释器的实现细节。当您检查两个值是否代表同一件事时,不要使用is。
for i,m in enumerate(hazardflr):
safetiles.append((m,step))这是无效的Python。发布这个问题很可能是个问题,但到目前为止,问题中的代码还没有编译。
使用Python变量名称约定。目前,你有一个混合的所有小写和骆驼的情况。Python的约定是underscore_spaced。
单个字母很少是好的变量名称。i是索引的一种常见惯例。然而,我不知道m of e代表什么。您还可以使用ns0。从这段代码中,我可以看到它是nextSafe列表中的第一个元素。然而,这并没有告诉我任何事情。为什么nextSafe[0]和nextSafe[1]不同?如果在遍历所有位置时,它只是当前的安全位置,那么将变量名为curr_safe_location。
您需要选择更好的数据类型来表示您的状态。列表和字符串是伟大的,但它们并不是最好的方式来表示所有的东西。很大一部分问题是描述您的代码是如何构造的,以及什么值代表什么。这表明代码很难阅读,而且可以编写得更好。即使它不是必需的,有时创建一个类也非常有用,因为它会给出值清晰的描述性名称。
如果像"X"和"0"这样的字符串要具有特殊的含义,那么至少应该将它们定义为常量。这将为您的代码提供更多的上下文。然后,如果表示发生了变化,您就不必查找"0"的所有实例,并希望每次发生都意味着相同的事情。
https://codereview.stackexchange.com/questions/56762
复制相似问题