为什么这个 .replace 代码不起作用,它可能与 def 函数有关

Why isn't this .replace code working, It may be something with def function

所以,我正在尝试制作一个密码生成器,我正在使用替换功能来更改字母。现在,当我这样写一行时:

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'

你应该开始将结果分配给一个变量,而且,当你定义一个函数(使用 def)时,你应该 return 一些东西。像这样:

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@ 输出。

replace 方法不起作用 in-place。这意味着 调用它不会修改对象。 这是你不能做的事情,因为 string 对象是不可变的。

您需要做 message = message.replace("a", "!") 而不仅仅是 message.replace("a", "!")

另外你的函数需要return message,然后写print(replacer(message))(不是print(replacer.message))就可以看到了。

.replace() 在没有重新分配的情况下不起作用,因为正如其他人所指出的那样,字符串是不可变的。最好将 .replace() 视为 returns 更改后的字符串的函数,然后需要将其捕获到变量中,而不是可用的方法字符串对象。例如:

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

产量:

"Hello there!"

没有替代品。为避免这种情况,您需要重新分配变量,例如:

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

产生预期的结果:

"Fello there!"

接下来,replacer 没有属性 .message,但它是一个需要 输入变量 的参数,它将分配给 [=41] =]局部变量 message(它遮蔽了你的全局变量message,可能会导致你的部分困惑。通常局部和全局命名空间应该不同!)

最后,您的函数没有 return 任何东西。我建议您查看 return statements 以了解此功能。

功能脚本因此看起来像:

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@"