<p>你用的是Python3。在python3中,<code>next()</code>方法被<code>__next__</code>取代。
这些方法不接受任何参数(即<code>a.__next__(1)</code>是一个错误)。
他们使迭代器前进一步。要使其前进更多元素,请反复调用<code>next</code>。在</p>
<p>如果您想让迭代器提前一次使用,我建议使用<code>next</code>内置函数:</p>
<pre><code>>>> L = (x for x in range(10))
>>> next(L)
0
>>> next(L)
1
</code></pre>
<p>注意:我相信<code>next</code>内置函数是在python2.6中添加的,因此即使在python2中也可以安全使用。在</p>
<p><strong>但是</strong>在代码中,调用<code>next</code>根本没有意义。你想用它达到什么目的?在</p>
<p>正在做:</p>
^{pr2}$
<p>将引发错误,因为<code>next</code>返回<code>os.walk</code>的第一个元素,它是一个三元素元组,包含字符串列表。但是<code>for</code>循环将迭代<em>元组</em>,试图将单个列表解压到<code>root, dirs, files</code>。
如果任何目录包含多于或少于3个文件/子目录,则代码将失败。在</p>
<p><em>如果只想跳过第一个目录,则必须分别调用<code>next</code>:</p>
<pre><code>iterable = os.walk(directory)
next(iterable) # throw away first iteration
for root, dirs, files in iterable:
#...
</code></pre>
<p><em>如果</em>像Martijn推测的那样,您只想在目录上迭代,那么您不必做任何特别的事情。只需在循环中不要使用<code>root</code>和<code>files</code>变量。在这种情况下,我建议将它们重命名为<code>_</code>,这通常用于表示我们<em>必须</em>分配但根本没有使用的变量:</p>
<pre><code>for _, dirs, _ in os.walk(directory):
# Work only on "dirs". Don't care for "_"s
</code></pre>
<hr/>
<p><em>如果</em>您想使用iterable的第一个<code>n</code>元素,可以使用<code>itertools.islice</code>和<code>collections.deque</code>来快速且不消耗内存:</p>
<pre><code>from itertools import islice
from collections import deque
def drop_n_elements(n, iterable):
deque(islice(iterable, n), maxlen=0)
</code></pre>
<p>然后将其用作:</p>
<pre><code>iterable = os.walk(directory)
drop_n_elements(N, iterable) # throw away first N iterations
for root, dirs, files in iterable:
# ...
</code></pre>
<hr/>
<p>我突然想到,有一种更快更简单的方法来删除iterable的前n个元素:</p>
<pre><code>def drop_n_elements(n, iterable):
next(islice(iterable, n, n), None)
</code></pre>
<p>它比使用<code>deque(..., maxlen=0)</code>稍微快一些,因为它只对<code>islice</code>的<code>next</code>方法进行一次调用。在</p>