为什么“1e-i”不能在列表推导中工作?

时间:2012-12-20 06:39:45

标签: python python-2.7 list-comprehension

为什么下面的减号被视为无效令牌?这里肯定有一些我不理解的东西。

>>> [1e-i for i in range(-10,10)]
SyntaxError: invalid token

通常情况下,这些事情会像母亲一样评估:

>>> 1e-10
1e-10

我只是好奇;我用

解决了我的问题
>>> [10**i for i in range(-10,10)]
[1e-10, 1e-09, 1e-08, 1e-07, 1e-06, 1e-05, 0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000]

5 个答案:

答案 0 :(得分:7)

1e-01等是数字文字。在脚本运行之前,它们被看到并被标记化。这个数字的规则几乎肯定会说“可选('E'或'e',后跟可选的'+'或' - ',后跟数字)”。在该定义中没有提供变量,并且更改定义会使得数字文字无法解析直到运行时,这将变得非常毛茸茸。

答案 1 :(得分:2)

查看floating-point literals的Python文档:

floatnumber   ::=  pointfloat | exponentfloat
...
exponentfloat ::=  (intpart | pointfloat) exponent
...
exponent      ::=  ("e" | "E") ["+" | "-"] digit+

诀窍是数字文字不包含符号;像-1这样的短语实际上是由一元运算符和文字1组成的表达式。 因此,i此处被视为x - i表达式中的变量,即使x是带指数的数字。它会使x没有指数部分:1e。哪个是无效的Python令牌。

答案 2 :(得分:1)

您不能在float字面值中包含变量。 1e-3很好,1e-i直到运行时才能被评估,因此是无效的文字。当x.143.14时,期望x评估为3。与列表推导无关。

解决方案正如您所发现的那样。

答案 3 :(得分:1)

1e-i不是有效的Python语法。指数形式是文字,因此不是动态的。词法分析员说:invalid token,如同,它不知道1e-i的含义。

答案 4 :(得分:0)

正如其他人所说,1e-i无效。

您可以通过执行float("1e-%d" %i)

来解决此问题
In [114]: [float("1e%d" %i) for i in range(-10,10)]
Out[114]: 
[1e-10,
 1e-09,
 1e-08,
 1e-07,
 1e-06,
 1e-05,
 0.0001,
 0.001,
 0.01,
 0.1,
 1.0,
 10.0,
 100.0,
 1000.0,
 10000.0,
 100000.0,
 1000000.0,
 10000000.0,
 100000000.0,
 1000000000.0]