Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么可以添加到自身的类可以';不能总结吗?(a和a工作,总和([a,a])失败)_Python - Fatal编程技术网

Python 为什么可以添加到自身的类可以';不能总结吗?(a和a工作,总和([a,a])失败)

Python 为什么可以添加到自身的类可以';不能总结吗?(a和a工作,总和([a,a])失败),python,Python,在下面的代码段中,我创建了一个计数器对象,并尝试使用三种方法将其添加到自身中。使用“+”、从列表中减少(内部操作与前面相同)和从列表中使用函数sum()的标准加法 前两个函数运行并返回预期结果,但第三个函数引发TypeError异常 从这里我有两个问题: 如果加法有效,sum()失败的原因是什么 当我使用+添加到对象时,将使用类的_uuu添加uu_u)方法。调用sum()时使用什么方法(如果有) 计数器只是一个例子,我感兴趣的是一般情况,而不是在创建新类时的特殊情况 from collectio

在下面的代码段中,我创建了一个计数器对象,并尝试使用三种方法将其添加到自身中。使用“+”、从列表中减少(内部操作与前面相同)和从列表中使用函数sum()的标准加法

前两个函数运行并返回预期结果,但第三个函数引发TypeError异常

从这里我有两个问题:

  • 如果加法有效,sum()失败的原因是什么
  • 当我使用+添加到对象时,将使用类的_uuu添加uu_u)方法。调用sum()时使用什么方法(如果有)
  • 计数器只是一个例子,我感兴趣的是一般情况,而不是在创建新类时的特殊情况

    from collections import Counter
    from functools import reduce
    a = Counter([1,1,1,1])
    
    print(a+a+a)
    print(reduce(lambda x, y: x + y, [a,a, a]))
    sum([a, a, a])
    
    印刷品:

    Counter({1: 12})
    Counter({1: 12})
    Traceback (most recent call last):
      File "/home/user/.PyCharmCE2019.3/config/scratches/scratch.py", line 20, in <module>
        print(sum([a, a,]))
    TypeError: unsupported operand type(s) for +: 'int' and 'Counter'
    
    计数器({1:12})
    计数器({1:12})
    回溯(最近一次呼叫最后一次):
    文件“/home/user/.PyCharmCE2019.3/config/scratches/scratch.py”,第20行,在
    打印(总和([a,a,]))
    TypeError:不支持+:“int”和“Counter”的操作数类型
    
    这是因为
    sum([a,a])
    没有做
    a+a
    ;它实际上是在做
    0+a+a
    计数器
    类实例可以添加到
    计数器
    的实例中,但不能添加到整数
    0

    想想你自己是如何编写
    sum
    函数的:

    def总和(lst):
    总数=0
    对于lst中的x:
    总数+=x
    返回总数
    
    原则上,您可以初始化
    total=lst[0]
    ,然后迭代
    lst[1:][/code>以添加剩余值。问题是,你不能得到一个空序列的和。因此Python的实际
    sum
    函数与上面的代码类似,除了可以指定起始值(),所以实际上更像这样:

    def总和(lst,开始=0):
    总计=开始
    对于lst中的x:
    总数+=x
    返回总数
    
    这意味着对于您想要的行为,您可以执行
    sum([a,a],Counter())
    ,因为“空”的
    计数器的作用与
    0
    用于添加数字的作用相同


    在一般情况下,您的类需要一个值作为
    sum
    的起始值;如果“identity”没有合适的值,您应该使用
    reduce

    答案很好!文档还提供了一些细节:谢谢,非常好的解释!在文档中,我看到了“开始默认为0”位,但我的大脑不理解这到底意味着什么。