set.union()抱怨它在传入生成器时没有参数

时间:2013-02-06 02:05:56

标签: python ipython generator

这是来自Wes Mckinney的Python for Data Analysis的第204页

genre_iter = (set(x.split('|')) for x in movies.genres)
genres = sorted(set.union(*genre_iter))

在IPython中使用%paste方法时,此代码非常有效。在Python shell中运行时,代码也可以正常运行。但是,当我直接在IPython中键入第二行时,没有%paste方法

genres = sorted(set.union(*genre_iter))

我收到以下错误

TypeError: descriptor 'union' of 'set' object needs an argument

这似乎是一个错误,除非有一个我仍然不知道的IPython功能。

1 个答案:

答案 0 :(得分:8)

你已经耗尽了发电机。在再次使用它之前重新定义它:

genre_iter = (set(x.split('|')) for x in movies.genres)
genres = sorted(set.union(*genre_iter))

在python中,一旦循环遍历迭代器的所有元素,就不能再遍历迭代器(它现在是空的)。

因为genre_iter迭代器是空的,所以你没有将任何参数传递给set.union(),因此抱怨:

>>> set.union()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: descriptor 'union' of 'set' object needs an argument

只是要明确:你没有在ipython中找到错误。您可以在常规python提示符中重现相同的问题。