Функции с AttributeError: объект ‘NoneType’ не имеет атрибута ‘replace’

#python #python-3.x

#python #python-3.x

Вопрос:

Моя мини-программа берет строку из пользовательского ввода и добавляет точки между каждой буквой, а затем удаляет эти точки.

Функция add_dots принимает строку и добавляет точки. У меня есть отдельная вызываемая функция remove_dots , которая затем удаляет их.

Вот код ниже:

 def add_dots(str):
  str = ".".join(str)
  print(str)

def remove_dots(str):
  str.replace(".", "")
  print(str)

word = input("Enter a word: ")
 

Когда я вызываю две функции по отдельности с

 add_dots(word)
remove_dots(word)
 

Я получаю ожидаемый вывод консоли

 Enter a word: hello
h.e.l.l.o
hello
 

Однако, когда я пытаюсь вызвать

 remove_dots(add_dots(word))
 

Я получаю сообщение об ошибке AttributeError: 'NoneType' object has no attribute 'replace'

Я понимаю, что это означает str , что переменная имеет значение None , но я не уверен, почему? Может кто-нибудь посоветовать. Спасибо

Комментарии:

1. Потому что у вас add_dots ничего нет return , или, точнее, return ing None .

2. «add_dots» ничего не return делает, он только печатает.

3. «Я понимаю, что это означает, что переменная str имеет значение None, но я не уверен, почему?» Как вы думаете, какое значение оно должно иметь? Почему он должен иметь это значение? Как вы ожидаете, что программа вызовет это?

Ответ №1:

Это вызвано тем, что ваши add_dots remove_dots функции and на самом деле ничего не возвращают, они просто печатают значения. Таким образом, передача выходных add_dots данных remove_dots в приводит к None передаче значения.

Также обратите внимание, что использование str в качестве имени переменной, как правило, является плохой идеей; использование string или более описательного имени — лучшая практика.

Измените свой код, чтобы возвращать измененные строки, например:

 def add_dots(string):
  string = ".".join(string)
  return string

def remove_dots(string):
  string = string.replace(".", "")
  return string

word = input("Enter a word: ")
 

И распечатайте выходные данные следующим образом:

 print(add_dots(word))
print(remove_dots(word))
print(remove_dots(add_dots(word)))
 

Ответ №2:

Ваши функции ничего не возвращают. Кроме того, выходные str.replace(".", "") данные не сохраняются. Это должно сработать.

 def add_dots(str):
  return ".".join(str)

def remove_dots(str):
  return str.replace(".", "")
 

Ответ №3:

 def add_dots(str):
    str = ".".join(str)
    print(str)
    return str

def remove_dots(str):
    str = str.replace(".", "")
    print(str)
    return str
 

это должно исправить ваш код.

Смотрите Комментарии @Chris и @Michael Butscher к вашему сообщению

Комментарии:

1. remove_dots() вернет входную строку в вашем ответе.

2. Строки никогда не изменяются на месте, поэтому в вашем ответе его необходимо переназначить.