Вот рабочая версия того, что, я думаю, ваш код пытается сделать:
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 и соединить его все вместе в одном кадре. :)