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


93

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

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

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


出于好奇,您是否正在使用此工具?需要此功能并不常见!
卡特里尔

@katrielalex我用它从右到左遍历一个矩阵。您建议我采用其他方式吗?
Gal

您可以尝试,for i in reversed(mat):尽管那可能会慢一些
Katriel 2010年

请查看以反向顺序打印范围的列表,它提供了一些其他有用的信息。
RF

1
请看一下以范围反向打印列表,可接受的答案对其进行了非常清楚的说明。
RF

Answers:


214
for n in range(6,0,-1):
    print n
# prints [6, 5, 4, 3, 2, 1]

20
Betcha OP实际上想要range(5,-1,-1)。尽管他可能可以通过反复试验弄清楚这一点。
2013年

42

这很晚了,但是我想补充一点,还有一种更优雅的方法:使用 reversed

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

给出:

4
3
2
1
0

1
那有什么高雅的?您花费时间来反转列表,而不是按照所需的方式生成列表。
Alexis 2012年

5
@alexis它不花任何钱。您可以reversed(range)免费获得,因为range_reverseCPython内置了不错的优化功能。我做了一些快速的基准测试,在Python 2.7和3.3 之间step=-1以及reversed()两者之间都没有发现明显的成本差异。还请注意,在成堆的代码中使用了这个习惯用法
2013年

谢谢@kojiro,这很有趣。但是除非您xrange在Python 2.7测试中使用过,reverse否则它将在普通的,已经生成的列表上操作,而不是在range对象上;那么您是说可以有效地反转任何列表,还是只是range/xrange对象?(您链接到的heapq代码涉及一个Python 3范围对象)。
Alexis

@alexis我不会这么大胆地建议任何列表都可以有效地颠倒–对于我来说,这是一个毫无限制的陈述,无论如何我都无法回答。不过,这说明堆代码从python 2.32.4之间更改step=-1reversed()
kojiro 2013年

1
reversed(range(10))无法4通过输出0。也许你的意思是range(5)
Abhijit Sarkar

12
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




2

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

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

1

聚会晚了,但是对于任何需要创建自己的任务或想看看如何工作的人,此功能具有额外的好处,可以根据所需的增量重新排列开始-停止值:

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!'

0

对于python3,其中-1指示在每个步骤中要减小的值 for n in range(6,0,-1): print(n)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.