将角色向上移动2.探索python挑战第2部分

时间:2016-03-09 11:32:47

标签: python string python-3.x

我理解这段代码在python 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的最简单方法。(或者如果re / bitwise可以这样做)

我真的很开心,我会接受你提供的任何意见,我会澄清我是否不清楚。

我的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 个答案:

答案 0 :(得分:1)

似乎在Python 3中maketrans()已移至str对象而translate()已被删除,但由于str.translate()已执行相同操作,因此我们不会需要它。

只需更改string.maketrans方法调用

,您的Python 2代码即可运行
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(或者甚至是一条非常长的行,但这很难看)使用而不是。我不会告诉你代码,但我鼓励你试着把它想象成一个学习练习!提示:我用过字典。如果你无法弄清楚,请给我一行,我会给你另一个提示; - )