Skip to main content
 首页 » 编程设计

Python:凯撒密码

2025年05月04日61grandyang

大家好,我是 python 的新手,我正在编写一个名为 cipher.py 的程序,它要求用户输入字符串和移位量,然后显示加密后的字符串。我想知道为什么我得到 'function' object is not iterate 错误。我在第 19 行和第 36 行遇到错误,说“函数”对象不是迭代的。

这是我的代码:

def Ciphertext(): 
    print('Please enter a string to be ciphered:', end='') 
    Ciphertext = input() 
    return input() 
 
def Character(): 
    while True: 
        Character = 0 
        print('Please enter a shift amount between 0 and 25:', end='') 
        Character = (input()) 
        Max_Character = 26 
        if (float(Character) <= 26): 
             if (float(Character) > 1): 
              print(Character) 
              break 
 
 
def getShiftedcipher(Ciphertext, Character): 
    for Character in Ciphertext: 
        if Character.isalpha(): 
            var = ord(Character) 
            var += Ciphertext 
        if Character.islower(): 
            if var < ord('a'): 
            var += 26 
        if Character.isupper(): 
            if var < ord('A'): 
            var += 26 
    else: 
         print('Please enter a shift amount between 0 and 25:', end='') 
         return  
 
   print(getShiftedcipher(Ciphertext, Character)) 

这是我的错误:

Traceback (most recent call last): 
File "C:\Users\ALIENWARE\Desktop\cipher.py", line 36, in <module> 
print(getShiftedcipher(Ciphertext, Character)) 
File  
"C:\Users\ALIENWARE\Desktop\cipher.py", line 19, in getShiftedcipher 
for Character in Ciphertext: 
TypeError: 'function' object is not iterable 

请您参考如下方法:

问题出在这里:

print(getShiftedcipher(Ciphertext, Character)) 

getShiftedcipher您编写的函数希望为其第一个参数获取字符串或其他可迭代对象。但是你传递给它一个函数,Ciphertext ,不是字符串。因此,当它尝试将该函数用作字符串时,您会收到错误消息。

您还传递了另一个函数,Character , 对于第二个参数。你逃脱了,因为getShiftedcipher只是忽略它的第二个参数。

大概您想做的是调用 Ciphertext函数,并传递结果,而不是函数本身。像这样:

print(getShiftedcipher(Ciphertext(), Character())) 

除此问题外,您的代码中还有很多其他问题。在我的脑海中:

  • Ciphertext电话 input两次,忽略用户的第一个输入并等待另一个输入,这至少会非常困惑。
  • Character实际上并没有返回值,它只是打印出一个值,然后是 return没什么,所以每当你调用Character() ,你将得到 None .你需要 return float(Character) .
  • 你真的不应该使用 float当你想要一个 0 到 25 之间的整数时;使用 int .
  • 您的提示要求输入 0 到 25 之间的数字,但您的代码检查的是 1 到 26 之间的数字。
  • 在 getShfitedCipher ,你在参数中取一个数字 Character , 但随后您立即通过在 for Character in Ciphertext: 中创建另一个同名变量来隐藏它.使用两个不同的名称。也许调用参数 Shift .
  • 在 getShiftedCipher ,你在做var += Ciphertext .但是Ciphertext不是你可以这样添加的数字,它是一个字符串。你可能想要 var += Shift (假设之前的变化)。
  • 你做了所有的工作来计算 var 中的一个新值对于每个角色......但是你永远不会对它做任何事情。可能你想要 print(chr(var), end='')什么的。
  • 您尝试通过检查新值是否已变为 < 来处理“翻转”信A (或 < 字母 a )。但这永远不会发生,因为你是在加正数,而不是减去。实际问题是新值是否为 >信Z ,在这种情况下,您需要减去 26。
  • 你的 for…else循环 getShiftedCipher没有任何意义。一个else在for每当您在没有 break 的情况下退出循环时,循环就会运行.您不希望它重新打印 Character提示在这里,那么为什么有代码可以做到这一点?
  • 你真的应该为你的名字选择一个一致的风格。它有助于避免这种混淆,并使您的代码更易于阅读。另外,不要添加不必要的括号;就做if float(Character) <= 26: .参见 PEP 8有关这方面的更多信息。