您已經定義的函數不帶參數:
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 while
和if
布爾測試。
隨着你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'
這工作有點,現在我得到類型錯誤:「NoneType」對象不是可迭代 – 2013-05-06 16:38:29
@ Inhale.Py:更新。 – 2013-05-06 16:42:35
getcrypt =''.join仍然出現類型錯誤(映射(Decrypt.get.split ...說TypeError:序列項0:預期的str實例,發現NoneType – 2013-05-06 16:49:24