eval("".join(token.lstrip('0') for token in s.split()))
其中s
类似于'02 + 00030 - 76'
。
我所知道的是它会删除02
和00030
前面的零,以便它可以将其评估为2+30-76
。但是,我不明白它是如何做到的。有人可以向我解释这种功能组合吗?
非常感谢。
答案 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。
最终结果是原始字符串,删除了空格,评估为数字。