2

我正在尝试制作一个解密器,它可以从我制作的加密器中解密代码。我在运行代码时遇到了这种类型的错误

     getcrypt = ''.join(map(Decrypt.get,split_up_into_sixteen_chars(x_str)))
TypeError: split_up_into_sixteen_cjars() takes 0 positional arguments but 1 was given

我对编程很陌生,不确定是什么原因造成的。这是我的代码

Decrypt = {'1s25FF5ML10IF7aC' : 'A', 1s2afF5ML10I7ac' : 'a'} #I obviously have more than this but I'm trying to make it as simplified as possible
def split_up_into_sixteen_chars():
    while len(x_str)>0:
        v = x_str[:16]
        print(v)
x_str = (input())
getcrypt = ''.join(map(Decrypt.get,split_up_into_sixteen_chars(x_str)))
print(getcrypt)
4

1 回答 1

3

您已经定义了一个不带参数的函数:

def split_up_into_sixteen_chars():

但是您正在传递它:

split_up_into_sixteen_chars(x_str)

您需要告诉 Python 该函数在此处接受一个参数,并将其命名为:

def split_up_into_sixteen_chars(x_str):

使用的名称不必与您为函数调用传入的名称匹配,但它必须与您在函数中使用的名称匹配。以下功能也可以使用;我所做的只是重命名参数:

def split_up_into_sixteen_chars(some_string):
    while len(some_string) > 0:
        v = some_string[:16]
        print(v)

这是有效的,因为参数some_string变成了本地名称,对于函数来说是本地的。它只存在于函数内部,一旦函数完成就消失了。

请注意,您的函数会创建一个无限循环;的长度some_string要么总是 0,要么总是长于 0。循环体中的长度不会改变。

以下会更好:

def split_up_into_sixteen_chars(some_string):
    while len(some_string) > 0:
        v = some_string[:16]
        print(v)
        some_string = some_string[16:]

因为我们some_string每次都用一个较短的版本替换它。

您的下一个问题是该函数不返回任何内容。然后 Python 采用默认返回值None. 打印完全是另一回事,print()将数据写入您的控制台或 IDE,但函数的调用者无法读取该信息。

在这种情况下,你真的想要一个生成器函数,并使用yield. 生成器函数以块的形式返回信息;您可以一个一个地向生成器询问下一个块,这正是map()要做的。将函数更改为:

def split_up_into_sixteen_chars(some_string):
    while len(some_string) > 0:
        v = some_string[:16]
        yield v
        some_string = some_string[16:]

甚至:

def split_up_into_sixteen_chars(some_string):
    while some_string:
        yield some_string[:16]
        some_string = some_string[16:]

因为当涉及到whileand使用的布尔测试时,空字符串是 'false-y' if

就你的map(Decrypt.get, ...)立场而言,如果split_up_into_sixteen_chars()产生任何作为 in 的键存在的东西,则会产生Dycrypta (如果键不存在None的默认值),并且不会喜欢这样。后一种方法只能处理字符串。dict.get()''.join()

一种选择是返回一个字符串默认值:

''.join(map(lambda chunk: Decrypt.get(chunk, ''), split_up_into_sixteen_chars(x_str)))

现在'',为 中不存在的块返回空字符串Decrypt。这使得整个脚本适用于您拥有的任何字符串输入:

>>> x_str='Hello world!'
>>> ''.join(map(lambda chunk: Decrypt.get(chunk, ''), split_up_into_sixteen_chars(x_str)))
''
>>> x_str = '1s25FF5ML10IF7aC'
>>> ''.join(map(lambda chunk: Decrypt.get(chunk, ''), split_up_into_sixteen_chars(x_str)))
'A'
于 2013-05-06T16:27:31.457 回答