你使用的是python3。在python3中next()
方法被替换为__next__
。
这些方法做not接受任何论点(即a.__next__(1)
是一个错误)。
他们通过以下方式推进迭代器one。要通过更多元素来推进它,请调用next
反复。
如果您想将迭代器推进一次,我建议使用next
内置函数:
>>> L = (x for x in range(10))
>>> next(L)
0
>>> next(L)
1
注:next
我相信python2.6中添加了内置函数,因此即使在python2中也可以安全使用。
However,在您的代码中调用没有意义next
根本不。你想用它实现什么目标?
Doing:
for root, dirs, files in next(os.walk(dir)):
会引发错误,因为next
返回第一个元素os.walk
,这是一个三元素元组,包含字符串列表。但是for
循环将迭代tuple,尝试将单个列表解压缩为root, dirs, files
。
如果任何目录的文件/子目录多于或少于 3 个,则代码将失败。
If您只想跳过必须调用的第一个目录next
分别地:
iterable = os.walk(directory)
next(iterable) # throw away first iteration
for root, dirs, files in iterable:
#...
If正如 Martijn 推测的那样,您只想在目录上进行迭代,那么您无需执行任何特定操作。根本不使用root
and files
循环中的变量。在这种情况下,我建议将它们重命名为_
,它经常被用来表示我们所需要的变量must分配,但根本不使用:
for _, dirs, _ in os.walk(directory):
# Work only on "dirs". Don't care for "_"s
If你想先吃掉n
可迭代的元素,您可以使用itertools.islice
and collections.deque
快速完成且不消耗内存:
from itertools import islice
from collections import deque
def drop_n_elements(n, iterable):
deque(islice(iterable, n), maxlen=0)
然后将其用作:
iterable = os.walk(directory)
drop_n_elements(N, iterable) # throw away first N iterations
for root, dirs, files in iterable:
# ...
我突然想到有一种更快、更简单的方法来删除可迭代对象的前 n 个元素:
def drop_n_elements(n, iterable):
next(islice(iterable, n, n), None)
它比使用稍微快一些deque(..., maxlen=0)
因为它只调用一次next
的方法islice
.