【问题标题】:Python : Text to ASCII & ASCII to text converter programPython:文本到 ASCII 和 ASCII 到文本转换器程序
【发布时间】:2011-03-31 03:40:00
【问题描述】:

我是 python 2.7 的新手,试图创建一个简单的程序,该程序从用户那里获取输入字符串,将所有字符转换为其 ascii 值,将所有 ascii 值加 2,然后将新值转换为文本。例如,如果用户输入是“test”,那么输出应该是“vguv”。

这是我目前写的代码:

message = input("enter message to encode")

for ch in message:
     message2 = ord(ch) + 2
     print "\n\n"
     encodedmessage = ""
     for item in message2.split():
            encodedmessage += chr(int(item))

print ("encoded msg in text : "), encodedmessage

它似乎没有正常工作,任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 总是花一点时间来消化解释器向你抛出的错误。此代码将返回AttributeError: 'int' object has no attribute 'split',并向您显示无效的行。它直接说message2'int' object,您可能没有想到。如果您无法弄清楚(某些错误可能相当模糊),请发布错误,而不是仅仅说“它不起作用”。
  • 顺便说一句:Nick T 的建议非常中肯:从解释器那里取出错误,看看它是什么意思。它还应该给你一个行号和一些上下文,所以你知道在哪里看。确保每个变量都持有您认为的持有量。

标签: python ascii


【解决方案1】:

message2 = ord(ch) + 2 使message2 成为一个整数,所以你当然不能在它上面调用split ——它是一个代表单个字符的单个int,你为什么要拆分 吗?!另外,您每次通过循环都将encodedmessage 重置为空字符串,所以一旦您修复了split 的怪异(通过简单地删除它!),您当然只会看到最后一个字符;将 encodedmessage = '' 移动到 before 循环。

【讨论】:

  • 一般来说,在字符串上使用 += 运算符是不好的做法,不是吗?每次调用它时,您都会创建一个新字符串。也许最好保留一个字符列表然后做''.join(whateverlist)
  • Alex:确实如此,我也考虑过这一点。但我认为这会使 OP 感到困惑,所以在这种情况下可以原谅。
  • @Alex Bliskovsky:虽然它经常重复 ''.join() 比字符串连接快,但我认为对于 Python 的现代版本,这不一定是正确的。事实上,在这个微测试中,paste.ubuntu.com/479529python -mtimeit -s'import test' 'test.add_strings(1000) 需要 201us,而python -mtimeit -s'import test' 'test.join_strings(1000) 每个循环需要 250us。我很想知道@Alex Martelli 是否会对此发表意见。
  • 啊,看来@Alex Martelli 已经在这里回答了这个问题:stackoverflow.com/questions/1349311/…
  • @Alex,是的,但我同意 @rbp 的观点——这里显然存在更深层次的问题,首先解决它们似乎更可取。
【解决方案2】:

您正在混淆字符和字符串。当您循环遍历一个字符串(例如“消息”)时,每次迭代都会得到一个字符。此外,ord(ch) 是一个整数,一个数字,所以你不能“拆分”它。

另外,不要使用“input”,而是使用“raw_input”。

你想要的大概是这样的:

message = raw_input("enter message to encode: ")
encoded_message = ""
for ch in message:
     encoded_ord = ord(ch) + 2

这里你还没有新消息,因为循环一次只给你一个字符,所以我将变量重命名为“encoded_ord”,这样可以更好地描述它所包含的内容。

现在,你可以把这个“编码的ord”变成一个编码的字符,并将它添加到编码的消息中:

     encoded_ch = chr(encoded_ord)
     encoded_message += chr(encoded_ch)

print "encoded msg in text:", encodedmessage

【讨论】:

    【解决方案3】:

    你是否尝试做一个rot-13(或广义的“rot-x”)类型的函数?

    from string import ascii_uppercase, ascii_lowercase
    
    def rotx(data,rotby):
        total = []
        for char in data:
            if char in ascii_uppercase:
                index = (ascii_uppercase.find(char) + rotby) % 26
                total.append(ascii_uppercase[index])
            elif char in ascii_lowercase:
                index = (ascii_lowercase.find(char) + rotby) % 26
                total.append(ascii_lowercase[index])
            else:
                total.append(char)
        return "".join(total)
    

    跑步:

    >>> import rotx
    >>> rotx.rotx("test",2)
    'vguv'
    >>> rotx.rotx("IBM-9000",-1)
    'HAL-9000'
    

    如果你在 ASCII 字符上加 2 个字符,} 将变为不可打印,~ 会根据你的字符编码变为某种东西

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 2012-04-20
      • 2012-03-18
      相关资源
      最近更新 更多