for循环,同时在PYTHON中循环效率

时间:2014-07-11 13:51:44

标签: python python-2.7 if-statement for-loop while-loop

我是编程的初学者,并开始使用Python作为学习它的手段。我目前正在研究一组用于循环()和while循环()的行。 目前我有这个:

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]
            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)

然后在社区成员的帮助下,我能够更有效地将公共变量nextSafe [0]设置为ns并从顶部调用它:

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)

这些都取代了价值效率,但还有其他方法可以提高效率并节省线路吗? knownSafe(),givenSteps()函数来自另一个与此代码一起使用的代码,用于查找可能的安全区和知识步骤。但我的问题是如何使这个代码更有效,因为最初我开始使用while循环()并发现在给定已知列表时for循环更好。考虑到我是编程新手,我一直在尝试各种各样的事情。

提前谢谢!!

1 个答案:

答案 0 :(得分:1)

所以..你想要Code Review吗? Here ..

无论如何,我会尽力帮助你..

代码

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)

解释

  

第1行:功能定义
  第2行:声明变量,这种在一条线上声明多个变量的压缩方式与效率无关,它只是一个风格问题   第3行:这是一个重要的方法,因为它显示了功能编程 (python支持的编程范例之一)如何有助于代码清晰度(同样,没有内存效率,只是代码效率,从长远来看会有所帮助)..简而言之,lambda只是一个只包含一行代码的压缩函数,并将其返回,因此这里不需要return语句实际上,lambda还有更多,但这基本上就是为什么你想在这样的情况下实现一个......这个具体的目标就是检查使用重复检查的变量你每隔几行运行我无法帮助但是注意它有多乱!所以这个函数只是简单地组织起来..第一个和第二个参数是不言自明的,第三个参数是在第四个参数中检查它的存在的一个参数(我想这是一个列表)。

  第5行:循环开始,没有什么奇怪的,除了我将函数的返回值直接用于循环,因为我认为将它存储为变量并且只使用它一次就会浪费RAM ..
  第6行:不变..
  第7行:我将while循环更改为for循环,因为我注意到你使用while循环而不是for循环的唯一原因是每次外循环运行时 i 的值都会改变,那么,为什么不提供范围?这样可以提高代码和内存效率   第8,9行:未改变..
  第11行:我们使用lambda,tadaaa!同样的召唤就像一个功能..
  第12行:不变..
  第13行:这里的技术被称为列表理解,它有点先进,但是,简而言之,它创建了一个列表,只是每次都附加最左边的值循环内部运行,右边的任何其他条件都在循环运行时执行,如果返回true,则返回最左边的值,否则循环继续结束..从所有这些返回的列表,被添加到safetiles中列表,请注意:列表的extend方法只是将参数列表中的所有元素附加到调用者列表中,在这种情况下:作为列表推导的结果返回的列表中的每个元素,只是附加到safetiles ..这看起来并不是一种矫枉过正,因为它实际上澄清了代码,并且使用的内存更少..
  第14行:返回安全事件列表.. 任务完成!

希望这有帮助;) 请注意,使用&#34;&#39; 0&#39;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#39; =&#39; 0&#39;&#34是不好的做法;