【问题标题】:Type error: unsupported operand类型错误:不支持的操作数
【发布时间】:2018-05-04 13:45:32
【问题描述】:

我正在尝试编写一个代码,该代码接受一个数字并将数字的总和返回到其相应位置的幂。 示例:>>>534 返回 5^1 + 3^2 + 4^3。

7

我的代码适用于 100 以下的数字范围。对于 3 位数字,它会失败并显示错误消息:TypeError: Unsupported operand type(s) for +: 'int' and 'NoneType'

我的代码如下。我提前为结构不佳的代码道歉。我只是一个初学者。谢谢。

def sum_dig_pow(a, b):
    dict1 = {}
    for k in range(a,b+1):
        if k < 10:
            dict1[k] = k**1

        else:
            num_len = int(len(str(k))) + 1

            def dig_pow(k):
                nonlocal num_len
                num_len -= 1
                if k < 10:
                    return k
                else:
                    var = (k%10)**num_len + dig_pow(k//10)
                    dict1[k] = var

            dig_pow(k)
    return dict1
print(sum_dig_pow(98, 100))

【问题讨论】:

  • dig_powelse 的情况下没有明确返回任何内容,这意味着返回默认为无。你想在那里退回什么?
  • 5 + 9 + 64 等于 78,而不是 7
  • @Carcigenicate,我希望 dig_pow 函数将其结果附加到字典(dict1)......该程序适用于单个和两位数,但对于上述任何内容都失败。我认为问题出在递归调用上。
  • 再一次,在 else 情况下你不会返回任何东西:... else: var = (k%10)**num_len + dig_pow(k//10); dict1[k] = var。那里没有return。每条路径都需要以返回结束。如果要使用递归,则不能将其与附加到可变对象并仅在部分时间依赖返回值混合使用。您要么使用所有突变,要么使用返回值。
  • 好的,有出路吗?我如何返回?

标签: python-3.x


【解决方案1】:

效率稍低,但我认为将输入数字视为字符串,然后对其进行迭代更容易理解,然后在数学上分离数字。

def dig_pow(n):
    return sum(int(digit)**position for position, digit in enumerate(str(n), start=1))

dig_pow(534)
# 78

【讨论】:

  • 这是一个聪明的解决方案,但你能帮忙指出为什么我的程序在 2 位以上的数字上失败
  • @Tpenny 当你运行dig_pow(100) 时,0+dig_pow(10) 在某些时候会运行。由于dig_pow(10) 不返回任何内容,因此它隐式返回None。然后你尝试做0+None,这是一个TypeError。只需在dict1[k] = var 之后执行return var
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 2020-07-27
  • 1970-01-01
  • 2014-06-15
  • 2012-11-01
相关资源
最近更新 更多