在 Python 中减少 for 循环是不可能的?

Posted

技术标签:

【中文标题】在 Python 中减少 for 循环是不可能的?【英文标题】:Decreasing for loops in Python impossible? 【发布时间】: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,接受的答案解释得很清楚。 【参考方案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.3 和 2.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)

【讨论】:

以上是关于在 Python 中减少 for 循环是不可能的?的主要内容,如果未能解决你的问题,请参考以下文章

如何减少运行(for循环),Python

for 循环是不是只在 python 类中运行一次?

C++ 中是不是有与“for ... else”Python 循环等效的方法?

python循环分类问题,一个数可以同时分为好几类,如何减少计算量

减少计数值以重复循环循环不起作用。 python中的for循环有一个异常处理程序,它有一个continue语句

减少我在 for 循环中递增的变量