繁体   English   中英

如何使用装饰仅对列表中的数字求和?

[英]How to sum only digits from a list using decorate?

我试图将列表传递给 function somme(计算列表中数字的总和)
但我得到unsupported operand type(s) for +=: 'int' and 'str'
我决定创建nettoyage function 来过滤列表并且不返回任何数字!
这就是我到目前为止所尝试的?

def nettoyage(func):
    def inner(*args):
        digits = []
        for i in args:
            if(str(i).isdigit()):
                digits.append(i)
        t=tuple(digits)
        return func(*t)
    return inner

@nettoyage
def somme(l):
    s=0
    for i in l:
        s+=i
    return s #or just sum(l)

print(somme([1,2,3,4,5,'a','b'])) # -> [1,2,3,4,5] 

类型错误:somme() 缺少 1 个必需的位置参数:'l'

PS:我知道我可以使用过滤器 function 或只是循环列表并仅累积数字 function 但是
我想了解更多关于装饰的信息。

argsfunc function 的所有 arguments 表示为一个列表,因此要获得第一个,值列表执行args[0] 然后不需要构建一个tuple并在单个参数处传递列表digits ,调用func(*t)调用func(1, 2, 3, 4, 5) ,这不是somme定义

def nettoyage(func):
    def inner(*args):
        digits = []
        for i in args[0]:
            if str(i).isdigit():
                digits.append(i)
        return func(digits)
    return inner

可以在list-comprehension中转换

def nettoyage(func):
    def inner(*args):
        return func([i for i in args[0] if str(i).isdigit()])
    return inner

15不是[1,2,3,4,5]

print(somme([1, 2, 3, 4, 5, 'a', 'b']))  # -> 15

自己注意:

您可以通过一些打印( argsl )来解决所有这些问题。 当某些东西不适用于变量时:打印它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM