Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.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 我总是收到一个属性错误_Python_Type Conversion_Attributeerror - Fatal编程技术网

Python 我总是收到一个属性错误

Python 我总是收到一个属性错误,python,type-conversion,attributeerror,Python,Type Conversion,Attributeerror,这是我的密码 def square_digits(num): str(num) num.split() for i in num: int(i) pow(i, 2) str(i) int("".join(map(str, num))) return num 这里是错误 AttributeError: 'int' object has no attribute 'split' 如何修复此问题?以下是

这是我的密码

def square_digits(num):
    str(num)
    num.split()
    for i in num:
        int(i)
        pow(i, 2)
        str(i)
    int("".join(map(str, num)))
    return num
这里是错误

    AttributeError: 'int' object has no attribute 'split'

如何修复此问题?

以下是我认为您的代码正在尝试执行的工作版本:

def square_digits(num: int) -> int:
    return int("".join(str(int(d)**2) for d in str(num)))
像上面那样使用类型注释可以帮助您在运行代码之前找到bug。如果我向原始函数添加注释:

def square_digits(num: int) -> int:
    str(num)
    num.split()
    for i in num:
        int(i)
        pow(i, 2)
        str(i)
    int("".join(map(str, num)))
    return num
然后,当我在它上运行
mypy
时,会出现一系列错误,显示出一些问题:

square.py:3: error: "int" has no attribute "split"
square.py:4: error: "int" has no attribute "__iter__"; maybe "__str__", "__int__", or "__invert__"? (not iterable)
square.py:8: error: No overload variant of "map" matches argument types "Type[str]", "int"
第一个错误就是你遇到的错误
num.split()

让我们看看还有哪些错误:

4: error: No overload variant of "pow" matches argument types "str", "int"
6: error: No overload variant of "map" matches argument types "Type[str]", "int"
第一个错误是因为
i
str
,而
pow
需要
int
。让我们在
int(i)
上调用它:

def square_digits(num: int) -> int:
    for i in str(num).split():
        pow(int(i), 2)
        str(i)
    int("".join(map(str, num)))
    return num
好的,还有一个错误,那就是
map
错误。我们试图将
str
函数映射到单个
int
,这是我们最初的
num
。这没有道理;我们想把它映射到一个
int
s序列上,大概与我们在一秒钟前的循环中计算的序列相同。让我们创建一个名为
digits
的列表,我们可以将这些整数放入其中:

from typing import List


def square_digits(num: int) -> int:
    digits: List[int] = []
    for i in str(num).split():
        digits.append(pow(int(i), 2))
    int("".join(map(str, digits)))
    return num
现在不再有
mypy
错误,但无论何时调用函数,它都只返回我们传入的相同数字!这并不奇怪;函数的最后一行是
return num
,它是原始值。让我们改变一下,这样我们就可以返回新的值,我们花了这么多精力来计算:

from typing import List


def square_digits(num: int) -> int:
    digits: List[int] = []
    for i in str(num).split():
        digits.append(pow(int(i), 2))
    return int("".join(map(str, digits)))

这与我在答案顶部给出的版本大致相同;我只是使用了一个更简洁的生成器表达式来执行循环,并将其重新连接在一起,所有这些都是一次性完成的。:)

str(num)
什么都不做。字符串和整数都是不可变的:没有就地操作。我建议阅读Python入门教程。您的问题示例缺少对
square\u digits(num)
的调用-您可以将
str(num)
替换为
num=str(num)
,按原样修复;但是,您有更多无意义的强制转换:
int(i)
str(i)
-您需要将函数结果分配给某些内容。@Grismar。对我的终端更新缓慢。这只是错误消息的一部分。Python也打印了失败的行。你需要在问题中包括这一点。在这种情况下,您还应该添加使此代码运行所需的两行额外代码。为什么要让我们难受?
from typing import List


def square_digits(num: int) -> int:
    digits: List[int] = []
    for i in str(num).split():
        digits.append(pow(int(i), 2))
    return int("".join(map(str, digits)))