0

我有这段代码用于 python 挑战,现在它可以完美地工作,但现在我得到的唯一结果是'i'。

我不确定,但我假设我的代码由于某种原因没有存储我给 ascii_list 的所有值。

a = """g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.""" 
def ascii_list(a):
    for i in a: return chr(ord(i)+2)

alist = ascii_list(a)

print ("".join(alist))

现在我的问题是,为什么要这样做,我哪里出错了?我正在使用 Python 3.3。

(对我放轻松,我已经尽力做到这一点)

4

4 回答 4

4

问题在这里:

def ascii_list(a):
    for i in a: return chr(ord(i)+2)

第一次通过循环,你return. 在第一个值上结束函数和循环。

您可以将其更改为生成器函数:

def ascii_list(a):
    for i in a: yield chr(ord(i)+2)

直观地说,这很简单。您可以yield根据需要多次,而不是returning 一个值。当有人试图循环你的函数的结果,或者将它传递给一个类似listor的函数join时,它会得到所有的yielded 结果。

但是如果这太混乱了,而且你还没有准备好学习生成器,你也可以明确地建立一个列表:

def ascii_list(a):
    return [chr(ord(i)+2) for i in a]

… 或者:

def ascii_list(a):
    result = []
    for i in a: result.append(chr(ord(i)+2))
    return result

正如 Jon Clements 在评论中指出的那样,对于您正在尝试做的事情,这并不是一个正确的算法。首先,您需要“翻过”字母表的末尾——否则,您将得到{代替a|代替b. 如果您了解%(模数/余数)运算符,则可以一步完成;如果没有,您可以使用if/ else。其次,您不想翻译诸如空格之类的非字母,或者根本不想翻译.;为此,您可能想要和if/ else。详细地写出来:

def ascii_list(a):
    for i in a:
        if not i.isalpha():
            rot = 0
        else if i.lower() > 'x':
            rot = 2 - 26
        else:
            rot = 2
        yield chr(ord(i) + rot)
于 2013-09-11T21:12:49.843 回答
2

那是因为您在循环的第一遍返回。你真的想要一个列表理解:

return [chr(ord(i)+2) for i in a]
于 2013-09-11T21:13:16.683 回答
0

您开始迭代字符串,到达字符 'g',然后返回 chr(ord('g') + 2)。这将返回 'i' 并终止循环。

于 2013-09-11T21:14:01.877 回答
0

除了列表推导之外,您还可以将 amap与您的方法一起使用:

def get_code(i):
    return chr(ord(i)+2)

''.join(map(get_code, a))

或者更紧凑的版本,带有 lambda:

''.join(map(lambda i: chr(ord(i)+2), a))
于 2013-09-11T21:34:49.643 回答