大家好,我是 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有关这方面的更多信息。
