打印列表仅输出一个结果

时间:2013-09-11 21:11:01

标签: python python-3.x

我有这个代码用于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 个答案:

答案 0 :(得分: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多次,而不是return一个值。当有人试图循环您的函数结果,或将其传递给listjoin这样的函数时,它将获得所有yield ed结果。

但如果这太令人困惑,而你还没准备好了解发电机,你也可以明确地建立一个清单:

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)

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

除了列表理解之外,您还可以使用map方法:

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

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

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

''.join(map(lambda i: chr(ord(i)+2), a))