2016-05-18 52 views
3

我看到的東西,如:Python:set()中的理解是什麼意思?

set(x for x in [1, 2, 3]) 

我知道x for x in [1, 2, 3]是理解,但我不能找到有效的語法吧,因爲x for x in [1, 2, 3]本身是無效的。

+1

https://docs.python.org/3/reference/expressions。html#generator-expressions – vaultah

回答

2

python3 reference

call ::= primary "(" [argument_list [","] | comprehension] ")" 
comprehension ::= expression comp_for 

檢查:

set(x for x in [1, 2, 3]) 

setprimaryxexpressionfor x in [1, 2, 3]comp_for

4

它是基於理解創建一個集合。例如:

a = set(x for x in [1, 2, 3]) 
print(a) 

其結果將是一組:

a = set([1, 2, 3]) 

在您不:

{1, 2, 3} 

在上述例子中,它碰巧是邏輯可被簡化完全需要理解

4

這是一個發電機表達。它們通常由括號包圍,但如果表達式是唯一的參數傳遞給函數調用的括號可以省略:

>>> generator = (x for x in [1, 2, 3]) 
>>> generator.next() 
1 
>>> set(generator) 
set([2, 3]) 

發生器對象可以被遍歷時,它們產生的值一個接一個。與在這裏使用列表理解相比,優點是不需要創建中間列表對象(如果存在例如100萬個元素而不是3個則更重要)。

文檔:基於理解https://docs.python.org/2/reference/expressions.html#generator-expressions

+0

感謝您真正解釋*爲什麼*可以省略生成器表達式中的括號。 – SiHa

2

Python的集合。例如用於處理字符串

>>> address = set(city for city in ["Paris", "Paris", "London","Berlin","Paris","Paris"]) 

>>> print address 
set(['Paris', 'Berlin', 'London']) 

>>> type(address) 
<type 'set'> 
1

(x for x in [1, 2, 3])列表是一個Generator Expressions

它減少可迭代輸入到一個單一的值。

>>> (x for x in [1, 2, 3]) 
<generator object <genexpr> at 0x7f1b23bea8c0> 
>>> type(x for x in [1,2,3]) 
<type 'generator'> 

它與set類的構造函數匹配。

def __init__(self, seq=()): # known special case of set.__init__ 
     """ 
     set() -> new empty set object 
     set(iterable) -> new set object 

     Build an unordered collection of unique elements. 
     # (copied from class doc) 
     """ 

有在的Python 3一套理解這樣的:

{x for x in [1, 2, 3]} 

所以你不需要再set(x for x in [1, 2, 3])的Python 3