因为你有一个进度条,你可以预测你的数据结构的长度。
range
实现了钩子方法 __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()
编辑:
是的,就是这样。看文档
...
包装枚举的可迭代对象:使用enumerate(tqdm(...))
而不是
tqdm(enumerate(...))
. 这同样适用于numpy.ndenumerate
。这是因为enumerate
函数倾向于隐藏可迭代对象的长度。tqdm
才不是。
...
tqdm()
使用with
语句手动控制更新:
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()