Hızlı cevap:
list()Bir üreteç ifadesinin etrafında yapmak , (neredeyse) tam olarak []etrafında köşeli parantezlerin olmasına eşdeğerdir . Yani evet yapabilirsin
>>> list((x for x in string.letters if x in (y for y in "BigMan on campus")))
Ama sen de yapabilirsin
>>> [x for x in string.letters if x in (y for y in "BigMan on campus")]
Evet, bu jeneratör ifadesini bir liste anlayışına dönüştürecektir. Aynı şey ve üzerinde arama listesi (). Bu nedenle, bir üreteç ifadesini bir listeye yapmanın yolu, etrafına parantez koymaktır.
Detaylı açıklama:
Oluşturucu ifade "çıplak" bir forifadedir. Şöyle:
x*x for x in range(10)
Şimdi, bunu tek başına bir satıra yapıştıramazsınız, sözdizimi hatası alırsınız. Ancak etrafına parantez koyabilirsiniz.
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7485464>
Bu bazen bir üreteç anlayışı olarak adlandırılır, ancak resmi ismin hala üreteç ifadesi olduğunu düşünüyorum, gerçekten bir fark yok, parantezler sadece sözdizimini geçerli kılmak için var. Bir işleve tek parametre olarak aktarıyorsanız bunlara ihtiyacınız yoktur, örneğin:
>>> sorted(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Temelde Python 3 ve Python 2.7'de bulunan diğer tüm anlayışlar, bir üreteç ifadesinin etrafındaki sözdizimsel şekerdir. Anlayışları ayarlayın:
>>> {x*x for x in range(10)}
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
>>> set(x*x for x in range(10))
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
Dikte anlayışları:
>>> dict((x, x*x) for x in range(10))
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
>>> {x: x*x for x in range(10)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
Python 3 altında anlamaları listeleyin:
>>> list(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [x*x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Python 2'ye göre, liste anlayışları sadece sözdizimsel şeker değildir. Ancak tek fark, x'in Python 2 altında ad alanına sızmasıdır.
>>> x
9
Python 3 altındayken
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
Bu, Python'da oluşturucu ifadenizin içeriğinin güzel bir çıktısını almanın en iyi yolunun, bir liste kavrayışı yapmak olduğu anlamına gelir! Ancak, zaten bir jeneratör nesneniz varsa, bu kesinlikle işe yaramayacaktır. Bunu yapmak sadece bir jeneratörün bir listesini yapacaktır:
>>> foo = (x*x for x in range(10))
>>> [foo]
[<generator object <genexpr> at 0xb7559504>]
Bu durumda aramanız gerekecek list():
>>> list(foo)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Bu işe yarasa da, ama biraz aptalca:
>>> [x for x in foo]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]