将字符串拆分为x个字符

时间:2013-05-06 16:25:03

标签: python function python-3.x

我正在尝试制作一个解密器来解密我制作的加密器中的代码。我运行代码时遇到此类型错误

     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)

1 个答案:

答案 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:]

因为whileif使用的布尔测试时空字符串为'false-y'。

当您的map(Decrypt.get, ...)成立时,如果split_up_into_sixteen_chars()产生 的任何内容作为Dycrypt中的密钥,则会生成Nonedict.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'