为什么我不能在itertool.product中获得长度?Python 3.6



我读了另一篇文章以获取itertool.product()的长度,但是OP的问题永远不会回答。我不明白为什么会发生这种LEN()错误。这是代码:

from PIL import Image
import itertools
def function():
    rgb1 = [r,g,b]
    return itertools.product(rgb1, repeat=3)    #I added this
img = Image.open("anyImage.jpg")
r, g, b = img.split()
cartesianList = itertools.product([r,g,b], repeat=3)
for set in cartesianList:
    new_img = Image.merge("RGB", cartesianList)
    new_img.show()

输出是:

Traceback (most recent call last):
  File "C:/Users/Trevor/PycharmProjects/Pillow Test/test3.py", line 14, in <module>
    new_img = Image.merge("RGB", cartesianList)
  File "C:UsersTrevorAppDataRoamingPythonPython36site-packagesPILImage.py", line 2608, in merge
    if getmodebands(mode) != len(bands) or "*" in mode:
TypeError: object of type 'itertools.product' has no len()
for set in cartesianList:
    new_img = Image.merge("RGB", cartesianList)

可以肯定的是,您的意思是Image.merge("RGB", set)


为了未来的访客,更长的答案:

Q:为什么我不能获得itertools.product的长度?
a:大多数迭代函数返回发电机,它们没有长度,因为它们是懒惰的(可能是无限的)。

Q:为什么我将cartesianProduct传递到Image.merge时? A: PIL检查指定Image.merge("RGB", [foo])时给它提供了3个频道,因此它调用len(foo)。虽然这适用于cartesianList中的每个set,但显然它不适用于cartesianList

最新更新