目录
TypeError: object of type ‘generator’ has no len() in Python
- TypeError:’generator’ 类型的对象在 Python 中没有 len()
- TypeError:’filter’ 类型的对象在 Python 中没有 len()
- TypeError:’map’ 类型的对象在 Python 中没有 len()
- 类型错误:’zip’ 类型的对象在 Python 中没有 len()
类型错误:’generator’ 类型的对象在 Python 中没有 len()
当我们将生成器对象传递给函数时,会出现 Python “TypeError: object of type ‘generator’ has no 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()
函数从生成器中获取下一项
或者,您可以将 传递generator
给next()
函数以检索下一项。
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
目录
- TypeError:’filter’ 类型的对象在 Python 中没有 len()
- TypeError:’map’ 类型的对象在 Python 中没有 len()
- 类型错误:’zip’ 类型的对象在 Python 中没有 len()
类型错误:’filter’ 类型的对象在 Python 中没有 len()
filter
当我们将对象传递给函数时,会出现 Python “TypeError: object of type ‘filter’ has no len()” len()
。
要解决该错误,请在使用该函数之前将过滤器对象转换为列表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
目录
TypeError: ‘map’ 类型的对象在 Python 中没有 len()
map
当我们将对象传递给函数时,会出现 Python “TypeError: object of type ‘map’ has no len()” len()
。
要解决该错误,请先将map
对象转换为列表,然后再将其传递给
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
在获取其长度之前将对象转换为列表。
下面是错误如何发生的示例。
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
列表类接受一个可迭代对象并返回一个列表对象。
将对象传递zip
给list()
类耗尽迭代器
请注意,将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
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: