在玩python challenge的時候發現一個比較有趣的函數所以記下來。
問題是這樣的
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
#要把這東西按照g->i,f->h這樣格式26個字母轉換一遍才知道它要表達什么。
一開始,博主只能用到自己想到的笨辦法。
#-*- coding:utf-8 -*-import stringalist="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"blist=""for i in alist: if i in string.lowercase: #string.lowercase表示小寫字母 if ord(i)>120: i = chr(ord(i)-24) else: i= chr(ord(i)+2) blist+=iPRint blist#i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url
笨辦法用完之后看到提示,可以同string.maketrans()函數,度娘查了下。發現可以string.maketrans()和translate()配合十分好用,先上改裝后的demo
#-*- coding:utf-8 -*-import stringalist="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"mapping=string.maketrans(string.lowercase,string.lowercase[2:]+string.lowercase[:2])blist = alist.translate(mapping,'')print blist
#i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url
改裝之后十分精簡,nice!
另外附上用到函數的語法。
mapping = string.maketrans('asdf','ASDF')#maketrans函數主要用來創建一一對應關系,這里a->A,s->S,d->D,f->.#再次強調是一一對應如果mapping = string.maketrans('asdf','ASD')則會報錯。"ValueError:maketrans arguments must have same length"#maketrans可以接受ord()值少于256的字符,可以是字母數字或者特殊符號,但是不可以中文#使用str.translate()test_string = "wo shi yi zhi cai niao!"result = test_string.translate(mapping)print result#wo Shi yi zhi cAi niAo! 根據mapping把A大寫了result = test_string.translate(None,'o')print result#如果映射為None則不映射,直接刪除字母'o'result = test_string.translate(mapping,'o')print result#根據mapping映射,并刪除字母oresult = test_string.translate(None)print result#不做任何操作,只是說明映射參數是require的即使是None
另外,博主用的是py2.7。不排除py3有新情況如果能有個中文映射就更好了。
新聞熱點
疑難解答