剥离前导零的代码意味着什么?

时间:2017-07-26 06:01:49

标签: python

eval("".join(token.lstrip('0') for token in s.split()))

其中s类似于'02 + 00030 - 76'

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

3 个答案:

答案 0 :(得分:2)

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

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

在Python中,这是一个生成器表达式。生成器表达式不是评估语句并从表达式创建列表并存储在内存中,而是创建每个元素,一次一个,这样您就可以在不牺牲性能的情况下将它用于非常大(甚至无限!)的序列。 / p>

s.split()通过用空格分割字符串来返回一个列表。因此,这一行意味着,对于字符串中的每个标记,删除字符串开头的所有0。

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

这是Python中使用列表创建字符串的高效方法。这基本上将列表中的每个元素与空字符串连接起来。

eval

这会将参数计算为Python表达式。

答案 1 :(得分:2)

for token in s.split()

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

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

最后"".join([..])将他们加入'2+30-76'

eval计算此表达式以获取整数。

PS:对未经过简化的用户输入文本使用eval是一个非常糟糕的主意。想象一下,如果用户输入一些恶意代码作为输入将会发生什么。

答案 2 :(得分: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。顺便说一句,使用eval通常是bad idea

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