如何在python中向后循环?

sna*_*ile 160 python iteration range

我在谈论做类似的事情:

for(i=n; i>=1; --i) {
   //do something with i
}
Run Code Online (Sandbox Code Playgroud)

我可以想一些在python中这样做的方法(创建一个列表range(1,n+1)并反转它,使用while--i,...)但是我想知道是否有更优雅的方法来做到这一点.在那儿?

编辑:有人建议我使用xrange()而不是range(),因为range返回一个列表,而xrange返回一个迭代器.但是在Python 3(我碰巧使用)中,range()返回一个迭代器而xrange不存在.

Chi*_*chi 252

range()xrange()采用指定步骤的第三个参数.所以你可以做到以下几点.

range(10, 0, -1)
Run Code Online (Sandbox Code Playgroud)

这使

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 
Run Code Online (Sandbox Code Playgroud)

但是对于迭代,你应该真正使用xrange.所以,

xrange(10, 0, -1)
Run Code Online (Sandbox Code Playgroud)

注意Python 3的用户:没有单独rangexrange在Python 3功能外,还有就是range,它遵循的Python 2的设计xrange.

  • @mzz - 仅在Python 2.x中 (9认同)
  • 由于这个问题是关于迭代的,请使用xrange而不是range(对于小范围并不重要,但对于大范围而言开始重要). (8认同)
  • 我认为你应该使用范围(10,-1,-1)而不是范围(10,0,-1).因为范围(10,0,-1)将在索引0处停止,因此,索引0值将不会打印. (8认同)
  • @Chinmay,为什么不用你的答案作为向OP展示最佳实践的方式?没有理由*不*建议使用`xrange`. (4认同)
  • 我之所以使用`range`只是因为OP确实如此.`xrange` vs`range`只对_really_大范围很重要,比如几百兆.此外,在Python 3.x中,这种区别已经消失. (3认同)
  • 实际上你应该使用范围(n-1,-1,-1),这将提供零和n-1之间的值.这个答案和一些评论都有一个一个问题. (3认同)
  • 原来xrange在python 3中不存在...... (2认同)

hab*_*bit 122

for x in reversed(whatever):
    do_something()
Run Code Online (Sandbox Code Playgroud)

这基本上适用于具有已定义顺序的所有内容,包括xrange对象和列表.

  • @Odomontois,不,它没有.它返回一个迭代器. (13认同)
  • 我认为这应该是公认的答案 (5认同)
  • @Odomontois:呵呵,那是错误的:`print reversed([1,2,3])`返回一个<listreverseiterator对象位于0xb77f1bec>。 (2认同)

Mic*_*Qin 8

def reverse(text):
    reversed = ''
    for i in range(len(text)-1, -1, -1):
        reversed += text[i]
    return reversed

print("reverse({}): {}".format("abcd", reverse("abcd")))
Run Code Online (Sandbox Code Playgroud)


小智 6

如果输入是一个字符串,则所有这三个解决方案都会给出相同的结果:

1.

def reverse(text):
    result = ""
    for i in range(len(text),0,-1):
        result += text[i-1]
    return (result)
Run Code Online (Sandbox Code Playgroud)

2.

text[::-1]
Run Code Online (Sandbox Code Playgroud)

3.

"".join(reversed(text))
Run Code Online (Sandbox Code Playgroud)