简体   繁体   English

如何重新处理此ROT13功能

[英]How to re-work this ROT13 Function

I know that there are countless ways to ROT13 and that Python even has a in-built function, but I really want to understand how to modify the code that I've written. 我知道ROT13有无数种方法,Python甚至具有内置功能,但我真的很想了解如何修改我编写的代码。 It works fine when I test it in my editor (maintains white space, punctuation and case) but won't work in my web page. 当我在编辑器中对其进行测试(保持空白,标点和大小写)时,它可以正常工作,但在我的网页上将无法正常工作。 I've been told that I'm just printing the characters out and not copying them into the result string. 有人告诉我,我只是打印出字符,而不是将它们复制到结果字符串中。 I've played with it for hours but haven't yet figured out how to manipulate it to incorporate a return statement. 我已经玩了几个小时,但是还没有弄清楚如何处理它以包含return语句。

Sorry if this is a silly question - I am a newbie :) Any help is super appreciated. 抱歉,如果这是一个愚蠢的问题-我是新手:)任何帮助都将受到我们的赞赏。

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

As you wrote yourself, you are printing the result out. 当您编写自己时,您正在打印结果。 Printing to standard out does not work in web applications, since they normally use a protocol (unix socket or the like) for communicating data back to the web server process (or you use a Python-based web server such as Twisted, in which case standard output will go to the console where you started the process). 在Web应用程序中,按标准输出打印不起作用,因为它们通常使用协议(unix套接字等)将数据传递回Web服务器进程(或者使用Twisted等基于Python的Web服务器,在这种情况下标准输出将转到您开始该过程的控制台)。

So, again as you write, you need to modify the function in order to return the value instead of printing it. 因此,再次编写时,您需要修改函数以返回值而不是打印它。 There are countless ways of doing this, the simplest being to just replace the standard output with a StringIO object: 这样做有无数种方法,最简单的方法就是用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()

A more basic way to do it is to store the output in a list: 一种更基本的方法是将输出存储在列表中:

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)

You're just printing out the values, you're not building up rot. 您只是在打印出值,而不是积累烂摊子。 In fact, you're returning the function itself, which isn't right at all. 实际上,您要返回的函数本身是不对的。

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)

Running the script will yield: 运行脚本将产生:

$ ./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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM