【问题标题】:Decreasing for loops in Python impossible?在 Python 中减少 for 循环是不可能的?
【发布时间】:2011-05-16 16:43:46
【问题描述】:

我可能是错的(只要让我知道,我会删除问题)但似乎 python 不会响应

for n in range(6,0):
    print n

我尝试使用 xrange,但它也不起作用。我该如何实现呢?

【问题讨论】:

  • 出于好奇,您是否将其用于任何用途?很少需要这个功能!
  • @katrielalex 我用它从右到左迭代矩阵。你有什么不同的建议我应该这样做吗?
  • 你可以试试for i in reversed(mat):,虽然这可能会更慢
  • 请查看Print a list in reverse order with range,它提供了一些其他有用的信息。
  • 请看Print a list in reverse order with range,接受的答案解释得很清楚。

标签: python loops for-loop


【解决方案1】:
for n in range(6,0,-1):
    print n
# prints [6, 5, 4, 3, 2, 1]

【讨论】:

  • Betcha OP 实际上想要range(5,-1,-1)。尽管他可能会通过反复试验来弄清楚这一点。
【解决方案2】:

这已经很晚了,但我只是想补充一下,还有一种更优雅的方式:使用reversed

for i in reversed(range(10)):
    print i

给予:

4
3
2
1
0

【讨论】:

  • 这有什么优雅之处?您花时间反转列表,而不是按照您想要的方式生成它。
  • @alexis 它不需要任何费用。由于 CPython 内置了不错的 range_reverse 优化,您可以免费获得 reversed(range)。我做了一些快速基准测试,在 Python 2.7 和 3.3 中都找不到 step=-1reversed() 之间的显着成本差异。另请注意this idiom is used in heapq.
  • 谢谢@kojiro,这很有趣。但是除非您在 Python 2.7 测试中使用 xrange,否则 reverse 将在一个普通的、已经生成的列表上运行,而不是在范围对象上运行;那么您是说 any 列表可以有效地反转,还是只是 range/xrange 对象? (您链接到的 heapq 代码涉及 Python 3 范围对象)。
  • @alexis 我不会那么大胆地​​建议任何列表都可以有效地反转——这对我来说太不合格了,无论如何我都无法回答。不过,这说明 heapify 代码在 Python 2.32.4 之间从 step=-1 更改为 reversed()
  • reversed(range(10)) 不可能通过0 输出4。也许你的意思是range(5)
【解决方案3】:
for n in range(6,0,-1)

这会给你6,5,4,3,2,1

至于

for n in reversed(range(0,6))

会给你5,4,3,2,1,0

【讨论】:

    【解决方案4】:
    for n in range(6,0,-1):
        print n
    

    【讨论】:

      【解决方案5】:
      >>> range(6, 0, -1)
      [6, 5, 4, 3, 2, 1]
      

      【讨论】:

        【解决方案6】:

        0 为条件值,当此条件为真时,循环将继续执行。10 为初始值。 1 是修饰符,可以是简单的递减。

        for number in reversed(range(0,10,1)):
        print number;
        

        【讨论】:

          【解决方案7】:

          派对迟到了,但对于任何负责创建自己的任务或想看看它是如何工作的人来说,这里的功能还有一个额外的好处,即根据所需的增量重新排列起止值:

          def RANGE(start, stop=None, increment=1):
              if stop is None:
                  stop = start
                  start = 1
          
              value_list = sorted([start, stop])
          
              if increment == 0:
                  print('Error! Please enter nonzero increment value!')
              else:
                  value_list = sorted([start, stop])
                  if increment < 0:
                      start = value_list[1]
                      stop = value_list[0]
                      while start >= stop:
                          worker = start
                          start += increment
                          yield worker
                  else:
                      start = value_list[0]
                      stop = value_list[1]
                      while start < stop:
                          worker = start
                          start += increment
                          yield worker
          

          负增量:

          for i in RANGE(1, 10, -1):
              print(i)
          

          或者,颠倒起停:

          for i in RANGE(10, 1, -1):
              print(i)
          

          输出:

          10
          9
          8
          7
          6
          5
          4
          3
          2
          1
          

          定期递增:

          for i in RANGE(1, 10):
              print(i)
          

          输出:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          

          零增量:

          for i in RANGE(1, 10, 0):
              print(i)
          

          输出:

          'Error! Please enter nonzero increment value!'
          

          【讨论】:

            【解决方案8】:

            对于python3,其中-1表示每一步要递减的值 for n in range(6,0,-1): print(n)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-02-18
              • 2019-01-26
              • 1970-01-01
              • 2022-12-04
              • 1970-01-01
              • 2013-10-21
              • 2017-07-22
              相关资源
              最近更新 更多