代码之家  ›  专栏  ›  技术社区  ›  Wes

python基本while循环

  •  1
  • Wes  · 技术社区  · 14 年前

    我还有一个新来的python问题。我有以下一段代码,我觉得这段代码并不像应该写的那样是蟒蛇式的:

        rowindex = 0
        while params.getfirst('myfield'+rowindex):
            myid = params.getfirst('myfield'+rowindex)
            # do stuff with myid
            rowindex+=1
    

    此脚本的输入是一个HTML页面,可以有任意数量的名为“myfield”的输入字段,其中从0开始并按顺序递增。在Perl中,我会做类似的事情:

        rowindex = 0
        while myid =  params.getfirst('myfield'+rowindex):
            #do stuff with myid
            rowindex+=1
    

    但在Python中,这不是有效的语法。我知道我有什么可以用,但有更好的方法吗?谢谢您。

    4 回复  |  直到 14 年前
        1
  •  5
  •   S.Lott    14 年前

    简单计数器的“无限”性质具有一定的吸引力。然而,这也是一个机会,某人试图通过欺骗一个拥有数十亿字段的表单来进行拒绝服务攻击。当您试图处理这些数十亿个字段时,通过字段计数可能会使Web服务器停止运行。

    由于python自动转换为long,所以通常的20亿整数溢出不适用。有人真的可以用10亿个字段来惩罚你的站点。

    for i in range(1024): # some sensible upper limit, beyond which the input is suspicious
        myid= params.getfirst("myfield%d" % i)
        if not myid: break
            # do stuff with myid
    
        2
  •  2
  •   Alex Martelli    14 年前

    我想我会制作一个小生成器来完全封装循环逻辑:

    import itertools
    
    def genit(params):
      for rowindex in itertools.count():
        theid = params.getfirst('myfield%s' % rowindex)
        if not theid: break
        yield theid
    

    这样,应用程序(“业务”)逻辑可以更清晰地显示在主流程中:

    for myid in genit(params):
        dosomething_with(myid)
    

    特别是如果 dosomething_with 是内联的。生成器实际上是“猫的睡衣”,可以将丰富/复杂的循环逻辑与应用程序/业务逻辑清晰地分离开来。

    如果出于某种特殊的原因,我希望在这种特殊的情况下保持它们的合并,我仍然会避免低抽象度 rowindex = 0 / while / rowindex += 1 代码有利于 for rowindex in itertools.count(): 我认为它更清晰,更锐利,也更简洁。这个整体框架也使得在限制循环和有一个无边界循环之间切换更容易,就像在接受的答案中一样,如果你决定这样做,当你决定这样做的时候,如果你有一个无边界循环,就像在最初的问题中一样——只是改变 itertools.count() 向/来自 xrange(N) .

        3
  •  1
  •   ghostdog74    14 年前

    你可以这样做。我认为这更“灵活”,因为我可以在while循环中提供任何我想要的条件,尽可能多。但是,还有人会说它是个人品味。

    rowindex = 0
    while 1:
        myid = params.getfirst('myfield'+rowindex)
        if not myid:  #or check for length of 0 , etc, then break
           break
        rowindex+=1
    
        4
  •  -1
  •   sourD    14 年前

    试着这么做

    While 1:
    
        codehere