您已经定义了一个不带参数的函数:
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
and使用的布尔测试时,空字符串是 'false-y' if
。
就你的map(Decrypt.get, ...)
立场而言,如果split_up_into_sixteen_chars()
产生任何不作为 in 的键存在的东西,则会产生Dycrypt
a (如果键不存在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'