因爲你有一個進度條,預計你可以預測你的數據結構的長度。
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
...
包裝列舉iterables:使用enumerate(tqdm(...))
代替 tqdm(enumerate(...))
。這同樣適用於numpy.ndenumerate
。這是 ,因爲enumerate
函數傾向於隱藏可迭代的長度。 tqdm
沒有。
...
上tqdm()
更新使用with
聲明手動控制:
with tqdm(total=100) as pbar:
for i in range(10):
pbar.update(10)
如果可選的總變量(或迭代與len()
)是 提供,顯示預測統計。
with
也是可選的(你可以指定tqdm()
一個變量,但 在這種情況下,不要在最後不忘del
或close()
:
pbar = tqdm(total=100)
for i in range(10):
pbar.update(10)
pbar.close()
感謝這篇文章。它幫助找出一種方法來初始化tqdm,使用「總」關鍵字參數來使它與zip一起工作。 –