我编写了一个试图计算和映射列表的函数,为此它可以很好地工作。但是,当我尝试使用过滤器过滤出映射结果中小于5的所有整数值并返回列表时,它给我一个错误“ TypeError:'NoneType'对象不可迭代”,有人可以帮我解决这个问题?
def compute(value):
if type(value) == int or type(value) == float:
return value ** 2
elif type(value) == str:
return value[::-1]
def map_compute(my_list):
print(list(map(compute, my_list)))
它可以正常工作,直到此处为过滤器选项为止
def filter_compute(my_list):
number_list = map_compute(my_list)
new_list = list(filter(lambda x: x > 5, number_list))
print(new_list)
filter_compute(['cup', '321', 2, ['x'], 4])
我想要的是:
示例:函数调用:
filter_compute(['cup', '321', 2, ['x'], 4])
预期的返回输出:
['puc', '123', None, 16]
另一个问题是还有其他方法吗,例如仅使用lambda来完成上述所有功能?
答案 0 :(得分:0)
更改
def map_compute(my_list):
print(list(map(compute, my_list)))
到
def map_compute(my_list):
return list(map(compute, my_list))
使用print
函数将从map_compute
返回None对象,这导致number_list
var为None
,并且将引起由{{ 1}}函数,该函数希望获得可迭代的项,但将得到filter
答案 1 :(得分:0)
首先,有一件重要的事情要解决:为什么要检查类型?应该尽可能避免这种情况,尤其是在这种情况下。您的程序纯粹是出于教育目的吗?
您问:另一个问题是还有其他方法吗,例如仅使用lambda来完成上述所有功能?答案是肯定的,还有其他方法,不, lambda
不好。
让我们看看您的代码。
def compute(value):
if type(value) == int or type(value) == float:
return value ** 2
elif type(value) == str:
return value[::-1]
如上所述,应避免类型检查。该函数的名称及其参数需要改进,它们是通用的,没有描述性,没有提供有用的信息。
def map_compute(my_list):
print(list(map(compute, my_list)))
print()
将一个值打印到stdout,您可能希望使用return
。我也强烈建议不要使用map()
。但是,这甚至都没有关系,因为您可以完全摆脱此功能。
def filter_compute(my_list):
number_list = map_compute(my_list)
new_list = list(filter(lambda x: x > 5, number_list))
print(new_list)
再次print()
-> return
。 filter()
与地图很像,是单项的。尽管这取决于其预期的目的,但该功能似乎也不必要。实际上,该代码将崩溃,因为您正在将int
(5)与字符串和一个list
进行比较。
现在,这是我重写程序的方式:
def comp_value(val_in):
if isinstance(val_in, int) or isinstance(val_in, float):
return val_in ** 2
elif isinstance(val_in, str):
return val_in[::-1]
else:
return None
list_1 = ['cup', '321', 2, ['x'], 4]
list_2 = [comp_value(item) for item in list_1]
list_3 = [item for item in list_2 if item > 5]
print(list_3)
这两个多余的功能被简单的列表理解所取代。该代码仍然没有多大意义,并且会崩溃,当然,重要的部分是如何编写。
答案 2 :(得分:-2)
以下(使用内联条件和列表理解)。
它可以工作,但是可读性不高,我认为您应该避免使用这种代码。
lst = ['cup', '321', 2, ['x'], 4]
new_lst = [x ** 2 if isinstance(x, (int, float)) else x[::-1] if isinstance(x, str) else None for x in lst]
print(new_lst)
输出
['puc', '123', 4, None, 16]