在 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=-1
和 reversed()
之间的显着成本差异。另请注意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 循环是不可能的?的主要内容,如果未能解决你的问题,请参考以下文章
C++ 中是不是有与“for ... else”Python 循环等效的方法?
python循环分类问题,一个数可以同时分为好几类,如何减少计算量