[英]How to re-work this ROT13 Function
我知道ROT13有无数种方法,Python甚至具有内置功能,但我真的很想了解如何修改我编写的代码。 当我在编辑器中对其进行测试(保持空白,标点和大小写)时,它可以正常工作,但在我的网页上将无法正常工作。 有人告诉我,我只是打印出字符,而不是将它们复制到结果字符串中。 我已经玩了几个小时,但是还没有弄清楚如何处理它以包含return语句。
抱歉,如果这是一个愚蠢的问题-我是新手:)任何帮助都将受到我们的赞赏。
dictionary = {'a':'n', 'b':'o', 'c':'p',
'd':'q', 'e':'r', 'f':'s',
'g':'t','h':'u','i':'v',
'j':'w', 'k':'x','l':'y',
'm':'z','n':'a','o':'b',
'p':'c','q':'d','r':'e',
's':'f','t':'g','u':'h',
'v':'i', 'w':'j','x':'k',
'y':'l','z':'m'}
def rot(xy):
for c in xy:
if c.islower():
print dictionary.get(c),
if c.isupper():
c = c.lower()
result = dictionary.get(c)
print result.capitalize(),
if c not in dictionary:
print c,
return rot
当您编写自己时,您正在打印结果。 在Web应用程序中,按标准输出打印不起作用,因为它们通常使用协议(unix套接字等)将数据传递回Web服务器进程(或者使用Twisted等基于Python的Web服务器,在这种情况下标准输出将转到您开始该过程的控制台)。
因此,再次编写时,您需要修改函数以返回值而不是打印它。 这样做有无数种方法,最简单的方法就是用StringIO
对象替换标准输出:
from StringIO import StringIO
def rot(xy):
rot = StringIO()
for c in xy:
if c.islower():
print >>rot, dictionary.get(c),
if c.isupper():
c = c.lower()
result = dictionary.get(c)
print >>rot, result.capitalize(),
if c not in dictionary:
print >>rot, c,
return rot.getvalue()
一种更基本的方法是将输出存储在列表中:
def rot(xy):
rot = []
for c in xy:
if c.islower():
rot.append(dictionary.get(c))
if c.isupper():
c = c.lower()
result = dictionary.get(c)
rot.append(result.capitalize())
if c not in dictionary:
rot.append(c)
return ''.join(rot)
您只是在打印出值,而不是积累烂摊子。 实际上,您要返回的函数本身是不对的。
dictionary = {'a':'n', 'b':'o', 'c':'p',
'd':'q', 'e':'r', 'f':'s',
'g':'t','h':'u','i':'v',
'j':'w', 'k':'x','l':'y',
'm':'z','n':'a','o':'b',
'p':'c','q':'d','r':'e',
's':'f','t':'g','u':'h',
'v':'i', 'w':'j','x':'k',
'y':'l','z':'m'}
def rot(xy):
rot13 = ''
for c in xy:
if c.islower():
rot13 += dictionary.get(c)
if c.isupper():
c = c.lower()
rot13 += dictionary.get(c).capitalize()
if c not in dictionary:
rot13 += c
print "ROTTED: ", rot13
return rot13
#!/usr/bin/env python
import string
# Create alpha using 'string.ascii_uppercase' and 'string.ascii_lowercase' methods.
# Create rotated 13 using list/array positioning
# Create translation table using string.maketrans()
# Use translation table using string.translate()
# Get the alpha
alphaUpper=string.ascii_uppercase
rotatedUpper=alphaUpper[-13:] + alphaUpper[:-13]
alphaLower=string.ascii_lowercase
rotatedLower=alphaLower[-13:] + alphaLower[:-13]
combinedOriginal=alphaLower + alphaUpper
combinedRotated=rotatedLower + rotatedUpper
print combinedOriginal
print combinedRotated
translation_table = string.maketrans( combinedOriginal, combinedRotated )
message="This is the original message."
print message.translate(translation_table)
print message.translate(translation_table).translate(translation_table)
运行脚本将产生:
$ ./rot.py
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM
Guvf vf gur bevtvany zrffntr.
This is the original message.
alphabets = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
c_alphabets = []
for i in alphabets:
c_alphabets.append(i.capitalize())
def rot13(s):
out_string=''
for i in s:
if i in alphabets:
j = alphabets[(alphabets.index(i) + 13) % 26]
out_string += j
elif i in c_alphabets:
j = c_alphabets[(c_alphabets.index(i) + 13) % 26]
out_string += j
else:
out_string += i
return out_string
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.