Caesar-cypher:ord() 函数接收一个字符串,表示它接收一个整数

Posted

技术标签:

【中文标题】Caesar-cypher:ord() 函数接收一个字符串,表示它接收一个整数【英文标题】:Caesar-cypher: ord() function receives a string, says it receives an integer 【发布时间】:2017-06-17 15:25:16 【问题描述】:

我应该创建一个凯撒密码函数。建议我使用内置的 ord() 和 chr() 函数来帮助我做到这一点(来自我的课程使用的教科书)。这可能是也可能不是最好的方法(绝对不是我查到的),但这是他们希望你做的。

我的问题是,在 for 循环中,当我将占位符变量发送到 ord() 函数时,我收到一个错误,它需要一个长度为 1 的字符串,但接收到一个整数。我在它前面放了一个打印函数来确认变量 c 在这种情况下的值是 'i' 但无论如何它似乎都失败了。

这是我创建的函数:

def rotate_word(word, num):
    count = 0
    newWord = ''
    while count < len(word):
        for c in word:
            print(c)
            newWord += chr(((ord(c)) - (ord(num) -1)))
            count += 1
    print(newWord)

这是我收到的错误:

rotate_word('ibm', -1)
i
Traceback (most recent call last):
  File "<pyshell#95>", line 1, in <module>
    rotate_word('ibm', -1)
  File "<pyshell#94>", line 7, in rotate_word
    newWord += chr(((ord(c)) - (ord(num) -1)))
TypeError: ord() expected string of length 1, but int found

除 -1 以外的整数也会出现此错误。公平地说,我不能完全确定代码本身是否符合我的要求(我一直试图弄清楚这部分,如果这部分没有,我看不出确保其余部分正常工作的意义)。

【问题讨论】:

不要使用ord(num),只使用num :) 【参考方案1】:

ordstring为参数,返回int

给定一个表示一个 Unicode 字符的字符串,返回一个表示该字符的 Unicode 代码点的整数。例如,ord('a') 返回整数 97,ord('€')(欧元符号)返回 8364。这是 chr() 的倒数。

在您的代码中,您传递的是int,而不是给您在命令行上看到的错误。您无需将num 转换为任何内容。只需将字符转换为数字,添加旋转量并使用chr 再次将结果转换回字符:

def rotate_word(word, num):
    count = 0
    newWord = ''
    while count < len(word):
        for c in word:
            newWord += chr(ord(c) + num)
            count += 1
    print(newWord)

rotate_word('ibm', -1)  # 'hal'

请注意,上面不处理'a' 向左旋转或'z' 向右旋转的溢出/下溢情况。

【讨论】:

感谢您的回答和尾注。我在第二次调用 ord 时意识到了 int 问题,但没有考虑过流/下流。谢谢。

以上是关于Caesar-cypher:ord() 函数接收一个字符串,表示它接收一个整数的主要内容,如果未能解决你的问题,请参考以下文章

Python二级考试基础知识(ord,chr函数详解)

Python有用的内置函数divmod,id,sorted,enumerate,input,oct,eval,exec,isinstance,ord,chr,filter,vars,zip

ord函数-php

python的内置函数ord()chr()str()

Python ord() 函数

python中ord()函数和chr()函数用法