首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >房间和陷阱.对环和边环的效率

房间和陷阱.对环和边环的效率
EN

Code Review用户
提问于 2014-07-11 14:53:54
回答 1查看 88关注 0票数 1

我想知道,我是否可以使这段代码在行保存方面更高效,或者任何其他方式:

代码语言:javascript
复制
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)

一位社区成员建议这样修改这个代码:

代码语言:javascript
复制
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)

不过,我遇到的唯一问题是,当我运行代码时,它现在会遇到以下情况:

代码语言:javascript
复制
TypeError: givenSteps() takes exactly 4 arguments (3 given)

如何使这段代码更有效率?我最初开始使用while循环,当给定一个已知的列表时,我发现for循环更好。我一直在尝试各种各样的东西,因为我对编程还不熟悉。

EN

回答 1

Code Review用户

发布于 2014-07-11 15:38:54

第一件事是,不要再关心台词的数量了。除非您正在尝试编写一个代码高尔夫竞赛条目,否则您最不希望优化的是最小化行数。这段代码很难阅读和跟踪,因为它是深嵌套的,并且几乎没有上下文来描述每一行所做的事情。这段代码应该分解成封装工作部分的子函数。

比较这一行

代码语言:javascript
复制
if knownSafe(roomwidth, roomheight, e, ns0):

到这条线

代码语言:javascript
复制
if trapdoor[ns0/roomwidth][ns0 % roomwidth] is "0":

在不了解代码的情况下,我知道如果给定的参数描述已知的安全位置,则执行if块。同时,我不知道为什么要在这个嵌套的列表结构中索引,也不知道"0"代表什么。

is进行身份比较。==做一个等价的比较。两个只包含字符0的字符串可能并不总是由同一个对象表示。事实上,它们是您当前使用的Python解释器的实现细节。当您检查两个值是否代表同一件事时,不要使用is

代码语言:javascript
复制
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"的所有实例,并希望每次发生都意味着相同的事情。

票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/56762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档