Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免python中的循环_Python_Loops - Fatal编程技术网

避免python中的循环

避免python中的循环,python,loops,Python,Loops,我知道循环在python中是个坏主意,我应该避免它们 嗯,我有几个我想避免的 我有一张名为Lipide的物品清单: class bead: x = 0 y = 0 z = 0 LID = 0 t = 0 class lipid: h = bead() b = bead() t = bead() LID = 0 我正在做以下工作(代码如下): 初始化覆盖所有类脂和 确定它们是否计为U或向下 将值添加到相应的h 至少,我如何

我知道循环在python中是个坏主意,我应该避免它们

嗯,我有几个我想避免的

我有一张名为Lipide的物品清单:

class bead:
    x = 0
    y = 0
    z = 0
    LID = 0
    t = 0

class lipid:
    h = bead()
    b = bead()
    t = bead()
    LID = 0
我正在做以下工作(代码如下):

  • 初始化覆盖所有类脂和
  • 确定它们是否计为
    U
    或向下
  • 将值添加到相应的
    h
  • 至少,我如何避免第一个循环

    1:

    class h:
        cU = 0
        cD = 0
        hU = 0
        hD = 0
        h = 0
    
      for i in range(0,8):
            hs.append([])
            for j in range(0,8):
                index = (i,j)
                hn = h()
                hs[i].append(hn)
    
     for LID in lipids:
            l = lipids[LID]
            up = l.h.z > l.t.z
            X = (int)(l.b.x*8/L)
            Y = (int)(l.b.y*8/L)
            Z = (l.b.z)*0.5
            if up:
                hs[X][Y].hU += Z
                hs[X][Y].cU += 1
            else:
                hs[X][Y].hD += Z
                hs[X][Y].cD += 1
    
    2和3:

    class h:
        cU = 0
        cD = 0
        hU = 0
        hD = 0
        h = 0
    
      for i in range(0,8):
            hs.append([])
            for j in range(0,8):
                index = (i,j)
                hn = h()
                hs[i].append(hn)
    
     for LID in lipids:
            l = lipids[LID]
            up = l.h.z > l.t.z
            X = (int)(l.b.x*8/L)
            Y = (int)(l.b.y*8/L)
            Z = (l.b.z)*0.5
            if up:
                hs[X][Y].hU += Z
                hs[X][Y].cU += 1
            else:
                hs[X][Y].hD += Z
                hs[X][Y].cD += 1
    

    循环是个不错的主意。只是循环密集型代码可能很慢。但这并不是特定于循环的,只是Python总体上不如其他一些语言快。如果循环是算法中最自然的表达式,我建议您不要避免循环。如果您的代码比您期望或需要的慢,那么寻找优化它的方法(首先是评测)


    Wikipedia中的算法分析可能会对您有所帮助。

    下面是一个使用列表理解创建2d数组的示例:

    hs = [[h() for i in range(8)] for j in range(8)]
    
    然而,正如评论中所指出的,这与为循环编写代码没有什么不同,因为列表理解是语法上的糖分。如果在可读性和维护方面更方便,就使用它


    注意:正如一条评论所指出的,列表理解的另一个好处是,对于循环和
    映射
    函数,它们通常比
    提供更好的性能。

    谁告诉过你循环是坏的?
    我知道循环在python中是个坏主意,我应该避免它们。
    --wat?你从哪里得到这个主意的?鼓励迭代而不是递归。现在,许多简单的
    for
    循环可以用语法糖代替(用更好的源代码做同样的事情的一种方法)。但这些只是编写循环的更好方法,即使是“循环密集型代码可能很慢”也没有多大意义。如果您的算法是O(n),那么无论循环是否隐式,它都将是O(n)。很多很多问题都需要一些O(n)算法。如果你把一个循环推到优化的C代码中,常数因子会稍微低一点,但它仍然是一个循环(尽管如果你那么绝望,这是一个有效的优化)。+1到你的注释@delnan。我正在相应地编辑我的答案。这和写循环没有什么不同,因为列表理解是语法上的糖分。-事实并非如此,列表理解比for循环快,因为循环是在C级别实现的,而不是在Python级别实现的。它们也比map()函数快。@Lattyware感谢您的评论。我已经对此进行了研究,虽然您在大多数情况下完全正确,但似乎仍有一些情况下,
    map
    比前面解释的列表理解更快。