我读了另一篇文章以获取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