2016-03-09 43 views
0

我理解這段代碼是如何工作的蟒蛇2轉移字符,直到通過2.探索蟒蛇挑戰部分2

import string 

text = "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`." 

table = string.maketrans(string.ascii_lowercase,string.ascii_lowercase[2:]+string.ascii_lowercase[:2]) 
print text.translate(table) 

現在我明白了在Python 3的該字符串改爲strbytesbytesarray 我有解決它,但用一種看起來很長的方式,簡單的maketrans沒有引用。

該代碼將如何轉換爲python 3.試圖保留maketrans方法或不將您的預渲染表像'abcde'放到'cdefg'。

但是,如果沒有自己創建一個,python 3會如何實現。 或只是將字符向上移動2的最簡單的方法。(或者如果重新/按位可以做到這一點)

我真的很喜歡這個,我會採取任何輸入,你可以給,我會澄清如果我不清楚。

我的Python 3代碼:

def decypher(cypher): 
    dec="" 
    for letter in cypher: 
     if ord(letter)>=97 and ord(letter)<=122: 
      dec+=chr((ord(letter)+2-97)%26+97) 
     else: 
      dec+=letter 
    return dec 

text="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." 

print(decypher(text)) 
+1

「我已經解決了它,但有一種似乎更長的方式」 - >你也應該發佈這個,所以可以指出具體的錯誤或問題。 – Carpetsmoker

+0

你應該[編輯]問題並把它放在那裏。確保將其格式化爲代碼,方法是選擇它並按工具欄上的按鈕或按下Control + K。 – Carpetsmoker

+0

對不起,這個評論事情失控了我x)謝謝。但你看我必須做一個整體循環,只是爲了做同樣的簡單maketrans做。 – TeachMeEverything

回答

1

似乎在Python 3 maketrans()得到移到str對象和translate()得到去除,但由於str.translate()已經這樣做了,我們不需要它一樣。

你的Python 2代碼將通過簡單地改變string.maketrans方法調用工作:

table = str.maketrans(
    string.ascii_lowercase, 
    string.ascii_lowercase[2:] + string.ascii_lowercase[:2]) 

text = 'foo' 
print(text.translate(table)) 

這是那些使得移植到Python 3更難一點比它需要的是有點武斷的變化之一: -/

如果你希望你的代碼能夠同時與Python 2和3兼容,你可以使用:

import string 

maketrans = getattr(str, 'maketrans', getattr(string, 'maketrans', None)) 
table = maketrans(
    string.ascii_lowercase, 
    string.ascii_lowercase[2:] + string.ascii_lowercase[:2]) 

print(text.translate(table)) 

P.S.

你可以做同樣的沒有在兩行使用translatemaketrans(或者甚至是一個很長的線,但是這是醜陋的)。我不會告訴你代碼,但我鼓勵你嘗試把它看作一個學習練習!提示:我用了一本字典。如果你不能弄明白,給我一個線,我會給你另一個提示;-)

+0

是的,我試圖避免數量的一些答案,並使用有吸引力的羅嗦方法。感謝您抽出寶貴的時間,這正是我一直在尋找的。我看了這個挑戰的答案,並找到了一個非常有用的答案代碼: for x in text: print(chr(ord(x)if ord(x)+2 <97 else ord(x)+2 if ord(x)+2 <122 else ord(x)-24),end =「」) – TeachMeEverything