Python:Decorator +列表理解-TypeError:“ int”对象不可迭代

时间:2019-12-31 04:37:20

标签: python list-comprehension decorator

我正在尝试返回一个除以2的列表,以获取列表中的偶数。 我正在尝试使用装饰器执行此操作,但由于出现TypeError: 'int' object is not iterable

而出现错误

我的代码是

def getEven(fnc): 
    def inner(list_of_val):
        return [ devideBy2(int(value)) for value in list_of_val ]
    return inner

@getEven
def devideBy2(num):
    return int(num)/2

list_of_num = [ 1, 2, 3, 4, 5]

print(devideBy2(list_of_num))

当我遍历list_of_num时,它打印出每个数字,而我的想法是,现在每个数字都将一个参数传递给devideBy2函数,并返回num/2的结果

但是我最后得到的是TypeError: 'int' object is not iterable

请帮助我了解我在哪里做错了。

谢谢。

4 个答案:

答案 0 :(得分:1)

也许您正在寻找类似的东西,

>>> nums = [1,2,3,4,5]
>>> def div_by_two(func):
...   def wrapper(nums):
...     func(nums)
...     return [num // 2 for num in nums]
...   return wrapper
... 
>>>
>>> @div_by_two
... def some_func(nums):
...   print(nums)
...   return nums
... 
>>> 
>>> some_func(nums)
[1, 2, 3, 4, 5]
[0, 1, 1, 2, 2]

答案 1 :(得分:1)

您需要调用在inner函数内部传递的函数,而不是调用正在修饰的函数。另外,您已经在int中将传递的值转换为fnc,而无需在getEven

中再次进行
def getEven(fnc): 
    def inner(list_of_val):

        # Call fnc here instead of devideBy2
        return [ fnc(value) for value in list_of_val ]
    return inner

@getEven
def devideBy2(num):
    return int(num)/2

list_of_num = [ 1, 2, 3, 4, 5]

print(devideBy2(list_of_num))

答案 2 :(得分:0)

HERE :

In [0]: def getEven(fnc):
    ...:     def inner(list_of_val):
    ...:         return [fnc(value) for value in list_of_val]
    ...:     return inner
    ...:
    ...: @getEven
    ...: def devideBy2(num):
    ...:     return num // 2
    ...:
    ...: list_of_num = [ 1, 2, 3, 4, 5]
    ...:
    ...: print(devideBy2(list_of_num))
[0, 1, 1, 2, 2]

答案 3 :(得分:0)

因为列表包含用逗号分隔的整数,并且list在此是可迭代的,但是您正在尝试将那些可迭代的值(多个整数值)转换为单个值,再将其转换为不可迭代的值,但是在Python中不支持交叉转换(逻辑上也是如此),意味着不能将多个值转换为单个值,反之亦然,因此类型不可用,因此会显示类型错误,如果列表是单个值,而您尝试将其转换为整数,则该类型将具有工作。