打印列表只输出一个resu

2024-05-19 01:37:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段用于python挑战的代码,现在它可以很好地工作,但现在作为输出得到的唯一结果是“I”。你知道吗

我不确定,但我假设由于某种原因,我的代码没有存储我给出的ascii\u列表中的所有值。你知道吗

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))

现在我的问题是,它为什么这样做,我哪里出错了?我使用的是python3.3。你知道吗

(对我放轻松,我已经试着做对了)


Tags: 代码列表asciilistgrwmszwgq
1条回答
网友
1楼 · 发布于 2024-05-19 01:37:12

那是因为你在第一次循环中就回来了。你真的想要一份清单:

return [chr(ord(i)+2) for i in a]
网友
2楼 · 发布于 2024-05-19 01:37:12

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

网友
3楼 · 发布于 2024-05-19 01:37:12

问题在于:

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的结果。你知道吗

但是,如果这太令人困惑了,而且您还没有准备好学习生成器,您还可以建立一个明确的列表:

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

正如乔恩·克莱门茨在评论中指出的那样,这并不是你所要做的事情的正确算法。首先,您需要“翻滚”过字母表的末尾,否则,您将得到{而不是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)

相关问题 更多 >

    热门问题