Почему этот код .replace не работает, это может быть что-то с функцией def - PullRequest
0 голосов
/ 14 мая 2019

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

x = 'example'
print(x.replace('e', 'f'))

, который работает нормально, но я не хочу печатать несколько строк (я делаю весь алфавит), например:

x = 'example'
print(x.replace('e', 'f'))
print(x.replace('x', 'e'))

вот так. Я не хочу иметь несколько строк, я хочу, чтобы это было сделано в одной.

Я пытался использовать функцию def, чтобы понять это, но я запутался и совершенно застрял. Вот что у меня есть:

> message = 'abc'

> def replacer(message):
>>    message.replace("a", "!")
>>    message.replace("b", '1')
>>    message.replace('c', '@')
>>    message.replace('d', '2')

> print(replacer.message)

Я хочу, чтобы он вывел abc как! 1 @, но все, что я получаю, это ошибка, вот она

Traceback (most recent call last):
  File "main.py", line 8, in <module>
    print(replacer.message)
AttributeError: 'function' object has no attribute 'message'

Ответы [ 3 ]

2 голосов
/ 14 мая 2019

Вы должны начать присваивать результат переменной, а также, когда вы определяете функцию (с def), вы должны что-то возвращать.Вот так:

message = 'abc'

def replacer(message):
  message = message.replace("a", "!")
  message = message.replace("b", '1')
  message = message.replace('c', '@')
  message = message.replace('d', '2')
  return message

print(replacer(message))

Будет напечатан желаемый результат вывода !1@.

1 голос
/ 14 мая 2019

.replace() не работает без переназначения, потому что, как отмечали другие, строки неизменяемы.Лучше всего думать о .replace() как о функции, которая возвращает измененную строку, которая затем должна быть записана в переменную вместо метода, доступного для строковых объектов.Например:

message = "Hello there!"
message.replace("H", "F")
print(message)

Выход:

«Привет!»

Без замены.Чтобы избежать этого, вам нужно переназначить переменную, такую ​​как:

message = "Hello there!"
message = message.replace("H", "F") # reassign variable
print(message)

Получив ожидаемое:

"Fello there!"

Далее,replacer не имеет атрибута .message, но это аргумент, который ожидает входную переменную , которую он назначит локальной переменной message (которая скрывает вашу глобальную переменную message, что, вероятно, приводит к некоторой путанице. Обычно локальные и глобальные пространства имен должны различаться!)

Наконец, ваша функция ничего не делает return.Я предлагаю вам ознакомиться с return операторами , чтобы узнать об этой функции.

Функциональный сценарий будет выглядеть следующим образом:

message = 'abc'

def replacer(input_message): # different namespace for local variable
    input_message = input_message.replace("a", "!") #reassign output
    input_message = input_message.replace("b", '1') #reassign output
    input_message = input_message.replace('c', '@') #reassign output
    input_message = input_message.replace('d', '2') #reassign output
    return input_message # make the function give you something useful back

print(replacer(message)) # give the function an input instead of trying to access a method/attribute of it

Запуск этого обновленного сценария дает болеесоответствующий:

"! 1 @"

1 голос
/ 14 мая 2019

Метод replace не работает на месте.Это означает, что вызов его не изменит объект. Это то, что вы не можете сделать, потому что string объекты неизменны.

Вам нужно сделать message = message.replace("a", "!"), а не простоmessage.replace("a", "!").

Также вашей функции нужно return message, и тогда вы можете увидеть это, написав print(replacer(message)) (не print(replacer.message)).

...