[PYTHON] 파이썬 : 생성자 표현식을 출력 하시겠습니까?
PYTHON파이썬 : 생성자 표현식을 출력 하시겠습니까?
파이썬 셸에서 다음과 같은 목록 이해력을 입력하면 :
>>> [x for x in string.letters if x in [y for y in "BigMan on campus"]]
멋지게 인쇄 된 결과가 나옵니다.
['a', 'c', 'g', 'i', 'm', 'n', 'o', 'p', 's', 'u', 'B', 'M']
사전 독해와 동일합니다.
>>> {x:x*2 for x in range(1,10)}
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}
내가 발전기 표현식을 입력하면, 나는 그런 친절한 반응을 얻지 못한다.
>>> (x for x in string.letters if x in (y for y in "BigMan on campus"))
<generator object <genexpr> at 0x1004a0be0>
나는 내가 이것을 할 수 있다는 것을 안다.
>>> for i in _: print i,
a c g i m n o p s u B M
다른 것 (또는 도우미 함수 작성)을 사용하면 대화식 셸에서 해당 생성기 개체를 쉽게 평가하고 인쇄 할 수 있습니까?
해결법
-
==============================
1.빠른 답변 :
빠른 답변 :
generator 표현식 주위에 list ()를 쓰는 것은 그것의 주위에 대괄호를 쓰는 것과 거의 똑같습니다. 그래, 네가 할 수있어.
>>> list((x for x in string.letters if x in (y for y in "BigMan on campus")))
하지만 당신은 할 수 있습니다.
>>> [x for x in string.letters if x in (y for y in "BigMan on campus")]
네, 발전기 표현을 목록으로 이해하게 할 것입니다. 그것도 똑같은 것입니다. 생성기 표현식을리스트로 만드는 방법은 대괄호를 사용하는 것입니다.
상해:
생성자 표현식은 표현을위한 "알몸"입니다. 이렇게 :
x*x for x in range(10)
자, 당신은 그 자체로 한 줄에 그것을 붙들 수 없습니다, 당신은 구문 오류를 얻을 것이다. 하지만 그 주위에 괄호를 넣을 수 있습니다.
>>> (x*x for x in range(10)) <generator object <genexpr> at 0xb7485464>
이것은 공식 이름이 여전히 생성자 표현이라고 생각하지만 실제로는 어떤 차이도없는 것으로 생각되지만 생성자 이해라고도합니다. 괄호는 유효 구문 만 유효하게합니다. 함수에 유일한 매개 변수로 전달하는 경우에는 필요하지 않습니다.
>>> sorted(x*x for x in range(10)) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
기본적으로 파이썬 3과 파이썬 2.7에서 사용할 수있는 다른 모든 이해력은 생성기 표현을 둘러싼 구문 론적 설탕입니다. 이해력 설정 :
>>> {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}
공룡 독해력 :
>>> 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}
그리고 파이썬 3에서리스트 comprehensions :
>>> 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]
파이썬 2에서,리스트 내포는 구문 론적 설탕이 아닙니다. 그러나 유일한 차이점은 Python 2에서 x가 네임 스페이스에 누출된다는 것입니다.
>>> x 9
파이썬 3에서는
>>> x Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'x' is not defined
이것은 파이썬에서 생성자 표현식의 내용을 멋지게 출력하는 가장 좋은 방법은 목록 이해력을 만드는 것입니다. 그러나 이미 생성기 개체가있는 경우이 작업은 분명히 작동하지 않습니다. 그러면 발전기 목록을 만들 수 있습니다.
>>> foo = (x*x for x in range(10)) >>> [foo] [<generator object <genexpr> at 0xb7559504>]
이 경우 list ()를 호출해야합니다.
>>> list(foo) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
이것은 작동하지만 다소 어리 석습니다.
>>> [x for x in foo] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
-
==============================
2.list에 대한 호출에서 표현식을 래핑 할 수 있습니다.
list에 대한 호출에서 표현식을 래핑 할 수 있습니다.
>>> list(x for x in string.letters if x in (y for y in "BigMan on campus")) ['a', 'c', 'g', 'i', 'm', 'n', 'o', 'p', 's', 'u', 'B', 'M']
-
==============================
3.목록이나 사전과 달리 생성기는 무한 할 수 있습니다. 이렇게하면 작동하지 않습니다.
목록이나 사전과 달리 생성기는 무한 할 수 있습니다. 이렇게하면 작동하지 않습니다.
def gen(): x = 0 while True: yield x x += 1 g1 = gen() list(g1) # never ends
또한 발전기를 읽으면 변경되므로 완벽하게 볼 방법이 없습니다. 발전기의 출력 샘플을 보려면 다음과 같이하십시오.
g1 = gen() [g1.next() for i in range(10)]
-
==============================
4.또는 중간 목록을 작성할 필요없이 항상 반복기를 통해 매핑 할 수 있습니다.
또는 중간 목록을 작성할 필요없이 항상 반복기를 통해 매핑 할 수 있습니다.
>>> _ = map(sys.stdout.write, (x for x in string.letters if x in (y for y in "BigMan on campus"))) acgimnopsuBM
-
==============================
5.
>>> list(x for x in string.letters if x in (y for y in "BigMan on campus")) ['a', 'c', 'g', 'i', 'm', 'n', 'o', 'p', 's', 'u', 'B', 'M']
from https://stackoverflow.com/questions/5164642/python-print-a-generator-expression by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서 문자열에서 부울로 변환 하시겠습니까? (0) | 2018.10.05 |
---|---|
[PYTHON] 문자열과 바이트 문자열의 차이점은 무엇입니까? (0) | 2018.10.05 |
[PYTHON] 파이썬에서 open ()이 존재하지 않으면 파일을 생성하지 않습니다. (0) | 2018.10.05 |
[PYTHON] super ()가 "TypeError : 새 스타일 클래스의 경우 classobj가 아닌 유형이어야 함"을 발생시킵니다. (0) | 2018.10.05 |
[PYTHON] 파이썬 디버거 시작하기, pdb [닫힘] (0) | 2018.10.05 |