2013-05-06 37 views
2

我正在试图制作一个解密器,用于解密来自我制作的加密器的代码。当我运行虽然将字符串拆分为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) 

回答

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

因为一个空字符串为“假-Y”,当涉及到13759 whileif布尔测试。

随着你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' 
+0

这工作有点,现在我得到类型错误:“NoneType”对象不是可迭代 – 2013-05-06 16:38:29

+0

@ Inhale.Py:更新。 – 2013-05-06 16:42:35

+0

getcrypt =''.join仍然出现类型错误(映射(Decrypt.get.split ...说TypeError:序列项0:预期的str实例,发现NoneType – 2013-05-06 16:49:24