2017-07-26 53 views
0
eval("".join(token.lstrip('0') for token in s.split())) 

其中s是类似于'02 + 00030 - 76'这段代码对于剥离前导零是什么意思?

我所知道的是,它将0200030前面的零去掉,以便它可以评估它为2+30-76。但是,我不明白它是如何做到的。有人能解释一下这个功能组合吗?
非常感谢。

回答

2

让我们从里面的表达式开始分解它。

token.lstrip('0') for token in s.split() 

在Python中,这是一个生成器表达式。与其评估语句并从表达式创建列表并存储在内存中,生成器表达式将一次一个地创建每个元素,这样您就可以在非常大的(甚至是无限的)序列中实际使用它,而不会牺牲性能。

s.split()通过将字符串按其空格分割来返回列表。因此,该行表示,“为字符串中的每个令牌,去掉所有的0的字符串的开头。

"".join(//result of inner expression) 

这是通过使用列表中创建一个字符串的Python中的性能方法。这基本上串接列表中的每个元素为空字符串。

eval 

此评估参数作为Python表达式。

+1

从技术上讲,它是一个生成器表达式,而不是列表理解。 – perigon

+0

是的,我更新了我的解释:) –

0

s.split()创建由s的空格分隔部分形成的字符串列表。

(... for token in s.split())遍历该列表中的每个字符串。

token.lstrip('0')从每个字符串中删除前导零。

"".join将所有零去除的令牌粘在一起,因此"".join(token.lstrip('0') for token in s.split())现在是一个看起来像算术表达式的字符串。

eval("".join(token.lstrip('0') for token in s.split()))告诉Python将字符串视为Python代码,因此它返回int而不是str。 BTW,使用eval通常是bad idea

最终结果是原始字符串,删除了空格,并将其评估为数字。

2
for token in s.split() 

s.split()评估为['02', '+', '00030', '-', '76']

然后你做token.strip('0')该列表转换为 - 通过从每个令牌移除前导零['2', '+', '30', '-', '76']

最后"".join([..])将它们加回到'2+30-76'

eval评估此表达式得到一个整数。

PS:在未经处理的用户输入文本上使用eval是一个非常糟糕的主意。想象一下,如果用户输入一些恶意代码,会发生什么。