Я продолжаю получать AttributeError - PullRequest
0 голосов
/ 16 апреля 2020

Вот мой код.

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'

Как я могу это исправить?

1 Ответ

0 голосов
/ 16 апреля 2020

Вот рабочая версия того, что, я думаю, ваш код пытается сделать:

def square_digits(num: int) -> int:
    return int("".join(str(int(d)**2) for d in str(num)))

Использование аннотаций типов, как я делал выше, может помочь вам найти ошибки перед запуском вашего кода. Если я добавлю аннотации к вашей исходной функции:

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() не работает, потому что num является int, и вы не можете split int. split:

def square_digits(num: int) -> int:
    for i in str(num).split():
        int(i)
        pow(i, 2)
        str(i)
    int("".join(map(str, num)))
    return num

Давайте посмотрим, какие ошибки остались:

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

Хорошо, одна ошибка осталась до go, то есть эта ошибка map. Мы пытаемся отобразить функцию str на один int, который является нашим оригинальным num. Это не имеет смысла; вместо этого мы хотим отобразить его по последовательности int с, предположительно, той же самой, которую мы вычислили за нашу l oop всего за секунду go. Давайте создадим список с именем 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)))

Это примерно то же самое, что версия, которую я дал в верхней части этого ответа; Я просто использовал более сжатое выражение генератора, чтобы выполнить l oop и соединить его все вместе в одном кадре. :)

...