您已经定义的函数不带参数:
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