我正在尝试制作一个解密器来解密我制作的加密器中的代码。我运行代码时遇到此类型错误
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)
答案 0 :(得分: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:]
因为while
和if
使用的布尔测试时空字符串为'false-y'。
当您的map(Decrypt.get, ...)
成立时,如果split_up_into_sixteen_chars()
产生 的任何内容作为Dycrypt
中的密钥,则会生成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'