2013-05-06 35 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