当我运行它时,我得到TypeError:'str'对象不可调用..为什么会这样?

时间:2013-11-07 19:42:44

标签: python

def ceasarEncipher(pt,key):
    for i in range(0,len(pt)):
        ct=""
        currentChar=pt(i)
        numericChar=ord(currentChar)-ord('a')
        numericNewChar=(numericChar+key)% 26
        numbericNewChar=numericChar + ord('a')
        newChar=chr(numericNewChar)
        ct= ct + newChar
    return ct

这就是我要归来的

ceasarEncipher('abcdef',1)

还有一个问题我希望问题返回'bcdefg'但它返回'\ x01 \ x02 \ x03 \ x04 \ x05 \ x06'我非常困惑请帮忙 - 谢谢

3 个答案:

答案 0 :(得分:4)

这是因为pt是一个字符串,在这里:

currentChar=pt(i)

您尝试将其称为函数,并传入参数i。请记住,在Python中的对象之后添加(...)会调用该对象。

我认为您真正想做的是 index pt i。为此,您需要使用方括号:

currentChar=pt[i]

然而,几乎从不的理由:

for i in range(len(collection)):
    var = collection[i]

因为您使用enumerate更有效地完成了相同的任务:

def ceasarEncipher(pt,key):
    for idx,_ in enumerate(pt):
        ct=""
        numericChar=ord(idx)-ord('a')
        numericNewChar=(numericChar+key)% 26
        numbericNewChar=numericChar + ord('a')
        newChar=chr(numericNewChar)
        # This is the same as `ct = ct + newChar`
        ct += newChar
    return ct

在上面的代码中,对于for循环的每次迭代,idx将是当前索引。

答案 1 :(得分:2)

下面

currentChar = pt(i) #It is considering this as a function call. 

应该是

currentChar = pt[i] #access the index i of string pt

演示:

>>> def ceasarEncipher(pt,key):
...     for i in range(0,len(pt)):
...         ct=""
...         currentChar=pt[i]
...         numericChar=ord(currentChar)-ord('a')
...         numericNewChar=(numericChar+key)% 26
...         numbericNewChar=numericChar + ord('a')
...         newChar=chr(numericNewChar)
...         ct= ct + newChar
...     return ct
... 
>>> ceasarEncipher('abcdef',1)
'\x06'
>>> 

答案 2 :(得分:1)

Python使用方括号来索引字符串[]

currentChar = pt[i]