2012-12-20 58 views
1

爲什麼下面的減號被認爲是無效的令牌?這裏肯定有一些我不明白的地方。爲什麼「1e-i」不能用於列表解析?

>>> [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] 

回答

7

1e-01等都是數字字面值。在腳本運行之前,它們被看到並標記。而這樣一個數字的規則幾乎可以肯定地說:「一個可選的('E'或'e',後跟一個可選的'+'或' - ',後跟數字)」。在該定義中沒有提供變量,並且更改定義會使得數字文字在運行時不能被解析,這將變得非常多毛。

+0

感謝所有的答案,用#votes接受。謝謝大家! –

1

您不能在float文字中有變量。 1e-3是好的,1e-i直到運行時才能被評估,因此是無效的文字。就像爲3時,預計x.14評估爲3.14。與列表解析無關。

解決方案如您所見。

1

1e-i是無效的Python語法。指數形式是一種文字,因此不是動態的。詞法分析器說:invalid token,因爲它不知道1e-i是什麼意思。

2

floating-point literals檢查Python文檔:

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

訣竅是,數字文字不包括符號;像-1這樣的短語實際上是由一元運算符 - 和文字1構成的表達式。因此,ix - i表達式中被視爲變量,儘管x是一個帶指數的數字。並且它沒有指數部分:1e,其離開x。這是一個無效的Python令牌。

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] 
+0

沒有冒犯,但從一個整數創建的字符串創建一個浮點數只是愚蠢的。 –

+0

我並不反對,但我當時想不到更好的黑客攻擊 – inspectorG4dget

相關問題