【问题标题】:Python: is there a C-like for loop available?Python:是否有类似 C 的 for 循环可用?
【发布时间】:2010-07-28 15:13:44
【问题描述】:

我可以在 Python 中做这样的事情吗?

for (i = 0; i < 10; i++):
  if someCondition:
     i+=1
  print i

我需要能够根据条件跳过一些值

编辑:到目前为止,所有解决方案都建议根据已知条件以一种或另一种方式修剪初始范围。这对我没有用,所以让我解释一下我想要做什么。

我想手动(即没有 getopt)解析一些命令行参数,其中每个“关键字”都有一定数量的参数,如下所示:

for i in range(0,len(argv)):
    arg = argv[i]
    if arg == '--flag1':
       opt1 = argv[i+1]
       i+=1
       continue
    if arg == '--anotherFlag':
       optX = argv[i+1]
       optY = argv[i+2]
       optZ = argv[i+3]
       i+=3
       continue

    ...

【问题讨论】:

  • 你真正想要做什么?
  • 更新了更多信息的问题...
  • 总有while给你。

标签: python for-loop


【解决方案1】:

是的,我就是这样做的

>>> for i in xrange(0, 10):
...     if i == 4:
...         continue
...     print i,
...
0 1 2 3 5 6 7 8 9

编辑
根据您对原始问题的更新...我建议您查看optparse

【讨论】:

  • +1 表示optparse。完全没有必要手动解析命令行参数。
  • 显然 optparse 在 2.7 中已过时,新的风格称为 argparse。他们似乎都能做我需要的事情,但我想知道这是否值得学习曲线。无论如何,+1 指出这个模块。
【解决方案2】:
for (i = 0; i < 10; i++)
   if someCondition:
      i+=1
print i

在python中会写成

i = 0
while i < 10
   if someCondition
      i += 1
   print i
   i += 1

你去吧,这就是如何在 python 中编写一个 c for 循环。

【讨论】:

  • @Cristi 是的,但那是在问题的原始示例代码中,所以我认为这就是他想要的。
【解决方案3】:

您可以做两件事来解决您的问题:

  • 需要逗号分隔的参数,这些参数将被分组到以下选项值中,您可以使用 getopt 或任何其他模块。
  • 或者自己做更脆弱的处理:

    sys.argv.pop()
    cmd = {}
    while sys.argv:
        arg = sys.argv.pop(0)
        if arg == '--arg1':
            cmd[arg] = sys.argv.pop(0), sys.argv.pop(0)
        elif:
            pass
    print(cmd)
    

【讨论】:

  • 将 argv 用作堆栈的想法非常适合我的需求,它消除了对列表的基于索引的访问。
  • 我喜欢人们提出除了问题答案之外的所有建议 ?
【解决方案4】:

奇怪的方式:

for x in (x for x in xrange(10) if someCondition):
    print str(x)

【讨论】:

    【解决方案5】:

    在 C 和 Python 中,您都应该使用 continue 跳过一个值。

    for i in range(10):
      if someCondition:
         continue
      print(i)
    

    【讨论】:

      【解决方案6】:

      您可能实际上并不需要索引,您可能需要实际的项目。更好的解决方案可能是这样的:

      sequence = 'whatever'
      for item in sequence:
          if some_condition:
              continue
          do_stuff_with(item)
      

      【讨论】:

      • 我会在一天中的任何时候都在 for 循环上使用迭代器,但是我想不出在我的情况下使用迭代的方法 - 请参阅更新的问题
      【解决方案7】:

      你可以先把 argv 列表变成一个生成器:

      def g(my_list):
          for item in my_list:
              yield item
      

      然后您可以单步执行这些项目,根据需要调用生成器:

      my_gen = g(sys.argv[1:]):
      while True:
         try:
            arg = my_gen.next()
            if arg == "--flag1":
               optX = my_gen.next()
               opyY = my_gen.next()
               --do something
            elif arg == "--flag2":
               optX = my_gen.next()
               optY = my_gen.next()
               optZ = my_gen.next()
               --do something else
            ...
          except StopIteration:
             break
      

      【讨论】:

      • 这与遍历列表有何不同?只是更麻烦。
      • 这个想法很好,但为什么要将sys.argv[1:] 转换为生成器实例而不是迭代器呢?例如。 my_gen = iter(sys.argv[1:]) 将获得与函数 g 相同的结果。
      • 另外,使用 for 循环代替 whiletry: except StopIteration: 将实现相同的目的。简单地说:for arg in my_gen。你仍然可以在循环中使用my_gen.next()
      【解决方案8】:

      您可以确保索引在try...finally 块内递增。这解决了想要continue 到下一个索引而不必在任何地方复制/过去i += 1 的常见问题。这是类 C 的 for 循环提供的主要优势之一。

      使用try...finally 的主要缺点是必须再次缩进您的代码。但是,如果您有一个带有许多 continue 条件的 while 循环,那么它可能是值得的。

      示例

      这个例子展示了i 仍然在finally 块中增加,即使continue 被调用。如果i 不递增,它的值将永远保持不变,while 循环将变为无限。

      i = 0
      while i < 10:
          try:
              print(i)
      
              if i % 2 == 0:
                  continue
      
          finally:
              i += 1
      

      如果没有它,您将不得不在调用 continue 之前增加 i

      i = 0
      while i < 10:
          print(i)
      
          if i % 2 == 0:
              i += 1 # duplicate code
              continue
      
          i += 1
      

      【讨论】:

        【解决方案9】:
         for i in xrange(0, 10):
            if i % 3 == 0
                continue
            print i
        

        只有不能被 3 整除的值。

        【讨论】:

          【解决方案10】:

          如果你需要迭代某些东西,并且需要一个索引,使用enumerate()

          for i, arg in enumerate(argv):
              ...
          

          和提问者的一样

          for i in range(0,len(argv)):
              arg = argv[i]
          

          【讨论】:

            【解决方案11】:

            您的问题似乎是您应该循环的不是原始参数,而是解析的参数。我建议你考虑改变你不使用标准模块的决定(像其他模块一样)。

            【讨论】:

              【解决方案12】:
              increament = 4                 #say
              for i in range(n):
                  #write your code here
                  n=n+increment
              

              如果您只想通过跳过 4 个成员来遍历数组,这可能是解决问题的简单方法

              【讨论】:

                猜你喜欢
                • 2012-01-30
                • 2021-10-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-09-01
                • 1970-01-01
                相关资源
                最近更新 更多