因为你有一个进度条,你可以预测你的数据结构的长度。
range 实现了hook method __len__,所以你可以发现内置len 的长度
>>> dir(range(10))
[ '__le__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index', 'start', 'step', 'stop']
>>> len(range(10))
10
但是,zip 没有提供猜测包裹结构长度的方法,所以这可能是因为tqdm 无法显示进度条。
dir(zip(range(10))) # no __len__ here
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>> len(zip(range(10)))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'zip' has no len()
编辑:
是的,就是这样。看docs
...
包装枚举迭代:使用enumerate(tqdm(...)) 而不是
tqdm(enumerate(...))。这同样适用于numpy.ndenumerate。这是
因为enumerate 函数倾向于隐藏可迭代的长度。 tqdm
没有。
...
使用with 语句手动控制tqdm() 更新:
with tqdm(total=100) as pbar:
for i in range(10):
pbar.update(10)
如果可选变量 total(或带有 len() 的迭代)是
提供,显示预测统计数据。
with 也是可选的(您可以将tqdm() 分配给一个变量,但是
在这种情况下,不要忘记在末尾添加del 或close():
pbar = tqdm(total=100)
for i in range(10):
pbar.update(10)
pbar.close()