在带范围的for循环的最后一次迭代中获得余数

时间:2019-12-21 10:52:04

标签: python for-loop

chunk = 100
size = 253
for start in range(0, size, chunk):
      print((start, chunk))

打印输出:

(0, 100)
(100, 100)
(200, 100)

但是我想要的是

(0, 100)
(100, 100)
(200, 53)

我当然可以检查每次迭代是否剩余部分小于块大小,但是也许有更优雅的方法

5 个答案:

答案 0 :(得分:2)

您可以编写自己的生成器函数并使用它代替import asyncio class Reset(Exception): pass async def infinite(): while True: try: print('work') await asyncio.sleep(1) print('more work') except Reset: print('reset') continue except asyncio.CancelledError: print('cancel') break async def main(): infinite_task = asyncio.create_task(infinite()) await asyncio.sleep(0) # Allow infinite_task to enter its work loop. infinite_task.get_coro().throw(Reset()) await infinite_task asyncio.run(main()) ## OUTPUT ## # "work" # "reset" # "work" # hangs forever ... bad :(

range

以您为例:

def chunks(start, end, max_size):
    current = start
    while current < end:
        chunk_size = min(max_size, end - current)
        yield (current, chunk_size)
        current += chunk_size

答案 1 :(得分:1)

假设chunk < size,您可以预期上一次迭代并将其馈入for循环中的else子句:

for start in range(0, size - chunk, chunk):
    print(start, chunk)
else:
    print(start + chunk, size % chunk)

尽管这可能不是最好的设计。

答案 2 :(得分:1)

尝试一下(假设大小大于块):

chunk=100
size=253
for start in range(0,size, chunk):
    print (start,chunk)

if size % chunk:
    print(size, size % chunk)

确保size不是chunk的倍数,那么它将打印最后一个块的剩余部分。

您也可以将else与for循环一起使用,但是如果大小是块的倍数,它将不起作用!然后,您需要再次检查else块,这使其不是最佳解决方案。

编辑:

一旦人们回答了您的问题,就不适合更改您的问题。

考虑查看guidelines

我不完全了解您想要实现的目标。我假设如果大小是块的倍数,那么您要与开始一起打印块,如果不是,则要打印%块。

我正在使用[:-1]进行迭代并保留最后一个元素,然后使用for循环的else部分来决定要打印什么。

chunk=100
size=253
for start in range(0, size, chunk)[:-1]:
    print(start,chunk)
else:
    print(start+chunk, size % chunk if size % chunk else chunk)

如果您要打印zero(如果大小是块的倍数),则将最后一条语句更改为print(start+chunk, size % chunk)

答案 3 :(得分:1)

您必须在打印之前检查尺寸-起始尺寸是否小于块尺寸:

chunk=100
size=253
for start in range(0,size, chunk):
    if size - start < chunk:
        print(start, abs(start - size))
    else:
        print (start,chunk)

答案 4 :(得分:1)

尝试一下:

for start in range(0, size - chunk, chunk): 
    print(start, chunk) 
else: 
    if size % chunk: 
        print(start + chunk, size % chunk)