2016-04-21 82 views
3

我已經開始學習F#了,我遇到的一件事是我不知道用什麼方式來表達Python中range函數的等價物。我知道[1..12]等於範圍(1,13)。但我想要做的是range(3, 20, 2)(我知道哈斯克爾有[3,5..19])。我如何表達這一點?F#等效於Python的範圍

+0

(谷歌)(https://開頭www.google.com/search?q=f%23+range+with+step )似乎[指示](https://msdn.microsoft.com/en-us/library/dd233227.aspx)它是'3..2..20'。我不是F#的人,所以我不確定。 – user2357112

+0

@GuyCoder'range'在Python 2.x中返回一個列表;在Python 3中它返回一個'range'對象, – chepner

回答

3

雖然F#sequence expressionseq { 3 .. 2 .. 20 }在功能上媲美如果你曾經轉換的Python到F#,你會發現,

  • 的Python 2 range方法返回一個Python list這是可變的。
  • Python 3 range方法返回一個Python range type,它表示一個不可變的數字序列。
  • F#序列表達式返回一個不可變的IEnumerable<T>

解釋與F#有關的Python範圍的更好方法是看看它是如何經常使用的。正如Python 2的文檔狀態

它最常用於for循環。

和Python 3的文檔指出

通常用於在for循環循環的特定次數。

和Python的2 for

for x in range(0, 3): 
    print "We're on time %d" % (x) 

和Python 3的for

for i in range(5): 
...  print(i) 

最接近的F#是for in

for i in 10 .. -1 .. 1 do 
    printf "%d " i 
+0

範圍在Python 3中是不可變的。 –

+0

@JaredGoguen謝謝。我更新了我的答案。 –

+0

作爲第二個提示,在Python 2中,'xrange'是首選的高效'範圍'對象,它具有相同的不變性質。事實上,它是首選,但並不明顯,可能是推動Python 3.X實施的一個動力。還有很多其他類似的變化,'map'函數返回一個'map'對象就是一個很好的例子。此外,'reduce'被移回到'functools'標準庫包。 –