eval("".join(token.lstrip('0') for token in s.split()))
其中s
是类似于'02 + 00030 - 76'
。这段代码对于剥离前导零是什么意思?
我所知道的是,它将02
和00030
前面的零去掉,以便它可以评估它为2+30-76
。但是,我不明白它是如何做到的。有人能解释一下这个功能组合吗?
非常感谢。
eval("".join(token.lstrip('0') for token in s.split()))
其中s
是类似于'02 + 00030 - 76'
。这段代码对于剥离前导零是什么意思?
我所知道的是,它将02
和00030
前面的零去掉,以便它可以评估它为2+30-76
。但是,我不明白它是如何做到的。有人能解释一下这个功能组合吗?
非常感谢。
让我们从里面的表达式开始分解它。
token.lstrip('0') for token in s.split()
在Python中,这是一个生成器表达式。与其评估语句并从表达式创建列表并存储在内存中,生成器表达式将一次一个地创建每个元素,这样您就可以在非常大的(甚至是无限的)序列中实际使用它,而不会牺牲性能。
s.split()通过将字符串按其空格分割来返回列表。因此,该行表示,“为字符串中的每个令牌,去掉所有的0的字符串的开头。
"".join(//result of inner expression)
这是通过使用列表中创建一个字符串的Python中的性能方法。这基本上串接列表中的每个元素为空字符串。
eval
此评估参数作为Python表达式。
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。
最终结果是原始字符串,删除了空格,并将其评估为数字。
for token in s.split()
s.split()
评估为['02', '+', '00030', '-', '76']
然后你做token.strip('0')
该列表转换为 - 通过从每个令牌移除前导零['2', '+', '30', '-', '76']
。
最后"".join([..])
将它们加回到'2+30-76'
。
eval
评估此表达式得到一个整数。
PS:在未经处理的用户输入文本上使用eval
是一个非常糟糕的主意。想象一下,如果用户输入一些恶意代码,会发生什么。
从技术上讲,它是一个生成器表达式,而不是列表理解。 – perigon
是的,我更新了我的解释:) –