2017-02-21 19 views
0
a = (x for x in range(5)) 
print(type(a)) # prints "<class 'generator'>" 

但是這引起了SyntaxError(預期):構造函數類的括號內的隱式生成器?

a = x for x in range(5) 

如果我想從一個發電機定義與元素的元組,這兩個工作:

tup1 = tuple(x for x in range(5)) 
tup2 = tuple((x for x in range(5))) 

tup1中,括號是tuple類的構造函數的一部分。但是它爲什麼起作用?

+1

因爲它是這樣定義的。並且不要與'for'循環的語法 – JBernardo

+0

@JBernardo發生衝突但是傳遞給tuple類構造函數的是什麼?第一種方法是否正確? –

+0

括號中有2個函數(包裝生成器和函數調用)在'tup1'示例中。如果在函數中只有一個參數,這是正確的方法。 – JBernardo

回答

1

在您的例子:

  • 第一a1 = (x for x in range(5))是發電機
  • 第二a2 = x for x in range(5)無效
  • 第三tup1 = tuple(x for x in range(5))
  • 和第四tup2 = tuple((x for x in range(5)))發電機轉換成一個元組。比較寫作tuple(a1)

第三種方法是首選,因爲它更清晰,噪音更小,如果你想結束一個元組。第一種方法只是一個生成器,如果你實際上並不需要實例本身,那麼這將是首選,但例如,想循環它。

+1

沒有這樣的作爲「元組理解」的東西。這是一個稍後轉換爲元組的生成器。兩種表格都是完全相同的操作 – JBernardo

+1

@JBernardo的說法。 Python中的所有迭代類型都應該能夠用一個可迭代的參數實例化,它可以是一個生成器:'set(x for x ...)','tuple(x for x ...)'等。[x for x ...]'只是'list(x for x ...)'的語法糖。 – schwobaseggl

+0

謝謝,改變了它。 – Roelant