set.union() 在传入生成器时抱怨没有参数
这段内容来自Wes Mckinney的《Python数据分析》第204页
genre_iter = (set(x.split('|')) for x in movies.genres)
genres = sorted(set.union(*genre_iter))
这段代码在使用IPython的%paste
方法时运行得非常好。在Python命令行中运行时也没有问题。不过,当我直接在IPython中输入第二行代码,而不使用%paste
方法时
genres = sorted(set.union(*genre_iter))
我就会遇到以下错误
TypeError: descriptor 'union' of 'set' object needs an argument
这看起来像是个bug,除非IPython还有我不知道的某个功能。
1 个回答
14
你已经用完了这个生成器。在再次使用之前,需要重新定义它:
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中发现bug。你在普通的Python命令行中也会遇到同样的问题。