XXX*_*XXX 3 python functional-programming
我试图通过使用itertools.count()压缩zip来将functools.partial与itertools.count一起使用:
g = functools.partial(zip, itertools.count())
Run Code Online (Sandbox Code Playgroud)
当使用诸如“ abc”,“ ABC”之类的输入调用g时,我注意到itertools.count()神秘地“跳跃”。
我以为我应该得到与使用itertools.count()直接使用zip相同的结果?喜欢:
>>> x=itertools.count();
>>> list(zip("abc",x))
[('a', 0), ('b', 1), ('c', 2)]
>>> list(zip("ABC",x))
[('A', 3), ('B', 4), ('C', 5)]
Run Code Online (Sandbox Code Playgroud)
但是,相反,我得到以下内容-注意g的第二次调用的起始索引是4而不是3:
>>> g = functools.partial(zip, itertools.count())
>>> list(g("abc"))
[(0, 'a'), (1, 'b'), (2, 'c')]
>>> list(g("ABC"))
[(4, 'A'), (5, 'B'), (6, 'C')]
Run Code Online (Sandbox Code Playgroud)
请注意,如果原始代码使用与更改后的代码相同顺序的参数,则将获得相同的结果:
>>> x = itertools.count()
>>> list(zip(x, "abc"))
[(0, 'a'), (1, 'b'), (2, 'c')]
>>> list(zip(x, "ABC"))
[(4, 'A'), (5, 'B'), (6, 'C')]
Run Code Online (Sandbox Code Playgroud)
zip()
首先尝试其第一个参数,然后尝试其第二个参数,然后尝试其第三个参数...,并在其中一个参数用尽时停止。
在正上方的拼写,后"abc"
耗尽,它可以追溯到第一个参数,并得到3
从x
。但是它的第二个论点已经筋疲力尽了,所以zip()
停下来了,3
它默默地消失了。
然后移动到第二zip()
,并通过获取开始4
从x
。
partial()
确实与它无关。
如果你封装itertools.count()
在一个函数中,很容易理解为什么:
def count():
c = itertools.count()
while True:
v = next(c)
print('yielding', v)
yield v
g = functools.partial(zip, count())
list(g("abc"))
Run Code Online (Sandbox Code Playgroud)
输出是
yielding 0
yielding 1
yielding 2
yielding 3
[(0, 'a'), (1, 'b'), (2, 'c')]
Run Code Online (Sandbox Code Playgroud)
在它意识到第二个可迭代对象中没有其他任何东西之前,您将看到zip
will 评估下一个参数count()
(因此3
产生了一个额外的值)。
作为练习,颠倒参数,您会看到评估有点不同。