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)
我当然可以检查每次迭代是否剩余部分小于块大小,但是也许有更优雅的方法
答案 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)