簡體   English   中英

打印列表僅輸出一個結果

[英]Printing list only outputs one result

我有用於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。

(請放心,我嘗試過正確的操作)

問題在這里:

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

正如喬恩·克萊門茨(Jon Clements)在評論中指出的那樣,這並不是您要嘗試執行的正確算法。 首先,您需要“翻轉”字母的末尾,否則,您將得到{而不是a| 代替b 如果您了解% (模數/余數)運算符,則可以一步完成。 如果不是,則可以使用if / else 其次,您不希望翻譯非字母,例如space或. 根本 為此,您可能需要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)

那是因為您要在循環的第一遍中返回。 您確實想要列表理解:

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

您開始迭代字符串,到達字符“ g”,然后返回chr(ord('g')+ 2)。 返回“ i”並終止循環。

除了列表理解之外,您還可以將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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM