TypeError:’generator’ 类型的对象在 Python 中没有 len()

目录

TypeError: object of type ‘generator’ has no len() in Python

  1. TypeError:’generator’ 类型的对象在 Python 中没有 len()
  2. TypeError:’filter’ 类型的对象在 Python 中没有 len()
  3. TypeError:’map’ 类型的对象在 Python 中没有 len()
  4. 类型错误:’zip’ 类型的对象在 Python 中没有 len()

类型错误:’generator’ 类型的对象在 Python 中没有 len()

当我们将生成器对象传递给函数时,会出现 Python “TypeError: object of type ‘generator’ has no len()” len()

要解决该错误,请在将生成器传递给函数之前将其转换为列表
len()

类型生成器的类型错误对象没有 len

下面是错误如何发生的示例。

主程序
def g(): yield 1 yield 2 yield 3 gen = g() print(type(gen)) # 👉️ <class 'generator'> # ⛔️ TypeError: object of type 'generator' has no len() print(len(gen))

我们将生成器对象传递给len()导致错误的函数。

将生成器对象转换为列表

解决错误的一种方法是将生成器对象转换为list.

主程序
def g(): yield 1 yield 2 yield 3 # 👇️ convert to list my_list = list(g()) print(my_list) # 👉️ [1, 2, 3] print(len(my_list)) # 👉️ 3

我们将生成器对象传递给list()类以将其转换为列表。

请注意,一旦生成器转换为列表,它就会被耗尽。

主程序
def g(): yield 1 yield 2 yield 3 # 👇️ convert to list gen = g() print(list(gen)) # 👉️ [1, 2, 3] print(list(gen)) # 👉️ []

这就是为什么您必须将生成器转换为列表并将结果存储在变量中的原因。

for使用循环遍历生成器

您可以使用简单的for 循环遍历生成器

主程序
def g(): yield 1 yield 2 yield 3 gen = g() for i in gen: print(i) # 👉️ 1, 2, 3

使用next()函数从生成器中获取下一项

或者,您可以将 传递generatornext()函数以检索下一项。

主程序
def g(): yield 1 yield 2 yield 3 gen = g() print(next(gen)) # 👉️ 1 print(next(gen)) # 👉️ 2 print(next(gen)) # 👉️ 3

len ()函数返回对象的长度(项目数)。

主程序
my_list = ['apple', 'banana', 'kiwi'] result = len(my_list) print(result) # 👉️ 3
该函数采用的参数可以是序列(字符串、元组、列表、范围或字节)或集合(字典、集合或冻结集合)。

len()请注意,不能使用生成器调用该函数。

如果您不希望变量存储生成器对象,则必须更正分配。

如果不确定变量存储的类型,请使用内置type()类。

主程序
import types def g(): yield 1 yield 2 yield 3 # 👇️ convert to list gen = g() print(type(gen)) # 👉️ <class 'generator'> # 👇️ True print(isinstance(gen, types.GeneratorType))

类型

返回对象的类型。

如果传入的对象是传入类的实例或子类,则isinstance函数返回
True

目录

  1. TypeError:’filter’ 类型的对象在 Python 中没有 len()
  2. TypeError:’map’ 类型的对象在 Python 中没有 len()
  3. 类型错误:’zip’ 类型的对象在 Python 中没有 len()

类型错误:’filter’ 类型的对象在 Python 中没有 len()

filter当我们将对象传递给函数时,会出现 Python “TypeError: object of type ‘filter’ has no len()” len()

要解决该错误,请在使用该函数之前将过滤器对象转换为列表len

filter 类型的 typeerror 对象没有 len

下面是错误如何发生的示例。

主程序
my_list = [2, 4, 6, 8] result = filter(lambda num: num > 4, my_list) # ⛔️ TypeError: object of type 'filter' has no len() print(len(result))

在使用之前将对象转换filter为列表len()

我们不能将filter对象传递给len()函数,但我们可以将其转换为 alist并获取列表的长度。

主程序
my_list = [2, 4, 6, 8] # 👇️ convert to list result = list(filter(lambda num: num > 4, my_list)) print(result) # 👉️ [6, 8] print(len(result)) # 👉️ 2

列表接受一个可迭代对象并返回一个列表对象。

改用列表理解

或者,您可以
使用列表理解

主程序
my_list = [2, 4, 6, 8] # 👇️ using list comprehension instead result = [num for num in my_list if num > 4] print(result) # 👉️ [6, 8] print(len(result)) # 👉️ 2

请注意,将filter对象传递给list类会耗尽迭代器。

主程序
my_list = [2, 4, 6, 8] result = filter(lambda num: num > 4, my_list) l1 = list(result) print(l1) # 👉️ [6, 8] l2 = list(result) print(l2) # 👉️ []

因此,如果您将过滤器对象转换为列表,请直接进行而不是在多个地方进行。

filter函数接受一个函数和一个可迭代对象作为参数并从可迭代对象的元素构造一个迭代器,函数返回一个真值。

如果您传递None函数参数,则 iterable 的所有虚假元素都将被删除。

当我们将一个对象传递给
len()函数时,该对象的
_ _ len _ _ ()
方法就会被调用。

您可以使用该dir()函数打印对象的属性并查找__len__属性。

主程序
my_list = [2, 4, 6, 8] result = filter(lambda num: num > 4, my_list) # 👇️ ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', # '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', # '__iter__', '__le__', '__lt__', ...] print(dir(result))

或者您可以使用
try/except 语句进行检查。

主程序
my_list = [2, 4, 6, 8] result = filter(lambda num: num > 4, my_list) try: print(result.__len__) except AttributeError: # 👇️ this runs print('object has no attribute __len__')

__len__我们尝试在块中访问对象的属性try,如果
AttributeError引发 an ,我们知道该对象没有属性__len__
并且无法传递给函数
len()

len ()函数返回对象的长度(项目数)。

主程序
my_list = ['apple', 'banana', 'kiwi'] result = len(my_list) print(result) # 👉️ 3

该函数采用的参数可以是序列(字符串、元组、列表、范围或字节)或集合(字典、集合或冻结集合)。

如果不确定变量存储的类型,请使用内置type()类。

主程序
my_list = [2, 4, 6, 8] print(type(my_list)) # 👉️ <class 'list'> print(isinstance(my_list, list)) # 👉️ True result = filter(lambda num: num > 4, my_list) print(type(result)) # 👉️ <class 'filter'> print(isinstance(result, filter)) # 👉️ True

类型

返回对象的类型。

如果传入的对象是传入类的实例或子类,则isinstance函数返回
True

目录

  1. TypeError:’map’ 类型的对象在 Python 中没有 len()
  2. 类型错误:’zip’ 类型的对象在 Python 中没有 len()

TypeError: ‘map’ 类型的对象在 Python 中没有 len()

map当我们将对象传递给函数时,会出现 Python “TypeError: object of type ‘map’ has no len()” len()

要解决该错误,请先将map对象转换为列表,然后再将其传递给
len.

类型映射的类型错误对象没有 len

下面是错误如何发生的示例。

主程序
my_list = ['1', '2', '3'] my_map = map(int, my_list) # ⛔️ TypeError: object of type 'map' has no len() print(len(my_map))

在使用之前将对象转换map为列表len()

我们不能将map对象传递给len()函数,但我们可以将其转换为 a
list并获取列表的长度。

主程序
my_list = ['1', '2', '3'] # ✅ convert to list my_new_list = list(map(int, my_list)) print(len(my_new_list)) # 👉️ 3

列表接受一个可迭代对象并返回一个列表对象。

将对象传递map给列表会耗尽迭代器

请注意,将map对象传递给list类会耗尽迭代器。

主程序
my_list = ['1', '2', '3'] my_map = map(int, my_list) print(list(my_map)) # 👉️ [1, 2, 3] print(list(my_map)) # 👉️ []

所以如果你将地图对象转换为列表,直接做,不要在多个地方做。

map ()函数将一个函数和一个可迭代对象作为参数,并使用可迭代对象的每个项目调用该函数。

当我们将一个对象传递给
len()函数时,该对象的
_ _ len _ _ ()
方法就会被调用。

您可以使用该dir()函数打印对象的属性并查找__len__属性。

主程序
my_list = ['1', '2', '3'] my_map = map(int, my_list) print(dir(my_map))

或者您可以使用try/except语句进行检查。

主程序
my_list = ['1', '2', '3'] my_map = map(int, my_list) try: print(my_map.__len__) except AttributeError: # 👇️ this runs print('object has no attribute __len__')

__len__我们尝试在块中访问对象的属性try,如果
AttributeError引发 an ,我们知道该对象没有属性__len__
并且无法传递给函数
len()

len ()函数返回对象的长度(项目数)。

主程序
my_list = ['apple', 'banana', 'kiwi'] result = len(my_list) print(result) # 👉️ 3
该函数采用的参数可以是序列(字符串、元组、列表、范围或字节)或集合(字典、集合或冻结集合)。

如果不确定变量存储的类型,请使用内置type()类。

主程序
my_list = ['1', '2', '3'] print(type(my_list)) # 👉️ <class 'list'> print(isinstance(my_list, list)) # 👉️ True my_map = map(int, my_list) print(type(my_map)) # 👉️ <class 'map'> print(isinstance(my_map, map)) # 👉️ True

类型

返回对象的类型。

如果传入的对象是传入类的实例或子类,则isinstance函数返回
True

类型错误:’zip’ 类型的对象在 Python 中没有 len()

zip当我们将对象传递给函数时,会出现 Python “TypeError: object of type ‘zip’ has no len()” len()

要解决该错误,请zip在获取其长度之前将对象转换为列表。

zip 类型的类型错误对象没有 len

下面是错误如何发生的示例。

主程序
list_1 = [1, 2, 3] list_2 = ['a', 'b', 'c'] my_zip = zip(list_1, list_2) # ⛔️ TypeError: object of type 'zip' has no len() print(len(my_zip))

在使用之前将对象转换zip为列表len()

我们不能将zip对象传递给len()函数,但我们可以将其转换为 a
list并获取列表的长度。

主程序
list_1 = [1, 2, 3] list_2 = ['a', 'b', 'c'] # ✅ convert to list my_zip = list(zip(list_1, list_2)) print(len(my_zip)) # 👉️ 3

列表接受一个可迭代对象并返回一个列表对象。

将对象传递ziplist()类耗尽迭代器

请注意,将zip对象传递给list类会耗尽迭代器。

主程序
list_1 = [1, 2, 3] list_2 = ['a', 'b', 'c'] my_zip = zip(list_1, list_2) # 👇️ [(1, 'a'), (2, 'b'), (3, 'c')] print(list(my_zip)) # 👇️ [] print(list(my_zip))

因此,如果您将 zip 对象转换为列表,请直接执行而不是在多个位置执行。

zip函数并行迭代多个可迭代对象,并生成元组,其中每个可迭代对象都有一个项目。

zip函数返回元组的迭代器。

主程序
list_1 = [1, 2, 3] list_2 = ['a', 'b', 'c'] my_zip = list(zip(list_1, list_2)) # 👇️ [(1, 'a'), (2, 'b'), (3, 'c')] print(my_zip)

当我们将一个对象传递给
len()函数时,该对象的
_ _ len _ _ ()
方法就会被调用。

您可以使用该dir()函数打印对象的属性并查找__len__属性。

主程序
list_1 = [1, 2, 3] list_2 = ['a', 'b', 'c'] my_zip = zip(list_1, list_2) print(dir(my_zip))

或者您可以使用try/except语句进行检查。

主程序
list_1 = [1, 2, 3] list_2 = ['a', 'b', 'c'] my_zip = zip(list_1, list_2) try: print(my_zip.__len__) except AttributeError: # 👇️ this runs print('object has no attribute __len__')

__len__我们尝试在块中访问对象的属性try,如果
AttributeError引发 an ,我们知道该对象没有属性__len__
并且无法传递给函数
len()

len ()函数返回对象的长度(项目数)。

主程序
my_list = ['apple', 'banana', 'kiwi'] result = len(my_list) print(result) # 👉️ 3
该函数采用的参数可以是序列(字符串、元组、列表、范围或字节)或集合(字典、集合或冻结集合)。

如果不确定变量存储的类型,请使用内置type()类。

主程序
list_1 = [1, 2, 3] list_2 = ['a', 'b', 'c'] print(type(list_1)) # 👉️ <class 'list'> print(isinstance(list_1, list)) # 👉️ True my_zip = zip(list_1, list_2) print(type(my_zip)) # 👉️ <class 'zip'> print(isinstance(my_zip, zip)) # 👉️ True

类型

返回对象的类型。

如果传入的对象是传入类的实例或子类,则isinstance函数返回
True

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: