在尝试reduce()
从模块实现方法时functools
,我遇到了对迭代器工作原理的误解。使用该方法时iter()
,我们接收列表的迭代器seq
并将其分配给一个变量seqIter
,然后该方法next()
将列表的第一个元素传递给该变量value
。
然而,当执行循环时,我们使用可迭代对象的for
迭代器,而可迭代对象又是列表的迭代器。问题是,在循环的每一圈上它等于什么?x
seqIter
x
在这段代码中,我们看到了reduce
在列表中添加数字的方法的实现:
def reduce(func, seq):
seqIter = iter(seq)
value = next(seqIter)
for x in seqIter:
value = func(value, x)
return value
list = [1,2,3]
print("Sum seq is:", reduce(lambda x,y: x+y, list))
结果:
python .\reduceImplemention.py
Sum seq is: 6
在尝试缩短代码时,出现以下结果:
def reduce(func, seq):
value = next(iter(seq))
for x in iter(seq):
value = func(value, x)
return value
list = [1,2,3]
print("Sum seq is:", reduce(lambda x,y: x+y, list))
根据字符串的解释以括号开头(如数学中一样)的规则,应该先执行表达式iter(seq)
,然后执行字符串的其余部分。我们还使用 方法将列表迭代器传递iter()
到循环中。然而,结果变成:for
seq
python .\reduceImplemention.py
Sum seq is: 7
问题可能出在循环中for
,因此我们创建一个变量seqIter
并为其赋值iter(seq)
,并在循环中将其更改为for x in seqIter
。结果还是一样:
python .\reduceImplemention.py
Sum seq is: 7
因此,问题是:为什么该方法next
没有在方法代码块的最开始处应用reduce
?还是循环条件?