0

我有一些 python 代码, translate_string 方法返回正确的值nevmban,但是在它打印“None”之后。

def secret_translate(letter):
    code = ord(letter)-ord('a')
    code = (code+13)%26
    newCode = chr(code+ord('a'))
    return newCode

def translate_string(string):

    newMsg = ''
    i = 0
    while i < (len(string)):

        print(secret_translate(string[i]),end='')
        i= i+1 

print(translate_string("arizona"))

程序打印:

nevmbanNone

我希望它打印nevmban“无”来自哪里?

4

4 回答 4

4

您正在打印translate_string函数的结果,即None,因为没有明确的return声明。

于 2012-09-27T05:56:30.570 回答
1

注意,如果你有翻译表,你真的不需要实现翻译机制。你有它们内置string

import string

fromlist="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
tolist = "cdefghijklmnopqrstuvwxyzab"
transtable = string.maketrans(fromlist, tolist)

mycypertext="FCJJM UMPJB"
print string.translate(mycyphertext, transtable) #will print hello world
于 2012-09-27T06:41:06.593 回答
1

当您像这样调用 print 方法时:

print(underground_code(secret[i]),end='')

您在函数中只传递了一个字符,而不是整个字符串。它将继续检查您的 while 循环中的第一个字符:

while i < (len(secret)):

以上while将只运行一次。下一个函数调用你len(secret)将是 1。

*当然,如果这是您想要的,请忽略我所说的。

于 2012-09-27T06:00:03.813 回答
0

您可以随时打印翻译后的单词的字母,我建议您从函数中返回翻译后的单词。您在翻译后的单词后面看到 None 的事实是因为在函数内部您打印单词,而在函数外部您打印函数的结果。该函数没有结果(无return语句),默认为无。打印这会导致 None 被附加到已经在函数内部打印的字符串的末尾。

我会建议这样的重组translate_string

def translate_string(string):
  translated_letters = [secret_translate(letter) for letter in string]
  return("".join(translated_letters))

trans_string = translate_string("arizona")
print(trans_string)
'nevmban'

该解决方案使用列表推导来循环输入字符串的字母,不需要带有计数器的显式循环。列表推导非常好,它们确实需要一些习惯。此外,该函数现在返回字符串,而不是在函数内部打印它。None 消失了,您可以在程序中进一步使用翻译后的字符串,例如作为另一个函数的输入。

于 2012-09-27T06:37:46.850 回答