생성자 식을 인쇄하는 방법은 무엇입니까?
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
그 외에 (또는 도우미 함수 작성) 대화형 셸에서 생성기 개체를 쉽게 평가하고 인쇄할 수 있습니까?
빠른 답변:
하고있다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")]
예, 그러면 생성기 식이 목록 이해로 바뀝니다.그것은 같은 것이고 전화번호부()입니다.생성자 식을 목록으로 만드는 방법은 괄호로 묶는 것입니다.
자세한 설명:
생성기 식이 "벌거벗은"입니다.for
표현.이와 같은 경우:
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]
기본적으로 Python 3 및 Python 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}
그리고 Python 3 아래에 이해를 나열합니다.
>>> 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에서 목록 이해는 단순히 구문적인 설탕이 아닙니다.그러나 유일한 차이점은 Python 2에서 x가 네임스페이스로 유출된다는 것입니다.
>>> x
9
Python 3에서는 다음과 같은 이점을 얻을 수 있습니다.
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
즉, Python에서 생성기 표현식의 내용을 멋지게 출력하는 가장 좋은 방법은 목록 이해를 하는 것입니다!그러나 이미 생성기 개체가 있는 경우에는 이 기능이 작동하지 않습니다.이렇게 하면 생성기 목록이 하나만 만들어집니다.
>>> 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]
아니면 언제든지map
중간 목록을 작성할 필요 없이 반복기를 통해 다음 작업을 수행할 수 있습니다.
>>> _ = map(sys.stdout.write, (x for x in string.letters if x in (y for y in "BigMan on campus")))
acgimnopsuBM
목록이나 사전과 달리 생성기는 무한할 수 있습니다.이렇게 하면 효과가 없습니다.
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)]
다음 통화에서 식을 마무리할 수 있습니다.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']
생성기 개체는 실제 데이터를 저장하지 않으며 기본적으로 식일 뿐입니다.프로그램에서 식을 계산하지 않고는 식의 값을 인쇄할 수 없습니다.생성기 개체(생성기 식)는 임의의 반복 가능한 데이터 유형으로 유형 캐스팅하여 평가할 수 있습니다.
예를 들면
list(genexpr)
dict(genexpr)
set(genexpr)
for data in genexpr:
추가의
생성자 식을 생성한 다음 유형 캐스팅은 필요한 데이터 유형 개체를 직접 생성하는 것보다 20% 느립니다.따라서 전체 데이터가 필요한 경우에는 사용하는 것이 좋습니다.
data=[x for x in range(0,10)]
사용하는 것보다
genexpr=(x for x in range(0,10))
data=list(genexpr)
>>> 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']
다음과 같은 작업을 수행할 수도 있습니다.
gen = (i for i in 'abcde')
print( *gen ) # => a b c d e
print(i for i in range(9))
이를 실행하면 다음과 같이 출력됩니다. - <0x000001F01A153E40의 제너레이터 객체>
제너레이터를 인쇄하는 간단한 방법 중 하나는 목록으로 변환하는 것입니다.그래서 단순히 우리가 코드를 수정한다면.print(*[i for i in range(9)])
그래서 우리는 출력을 0 1 2 3 4 5 6 7 8로 받을 것입니다.
언급URL : https://stackoverflow.com/questions/5164642/how-to-print-a-generator-expression
'it-source' 카테고리의 다른 글
Python의 *in* 연산자의 복잡성 (0) | 2023.07.20 |
---|---|
웹 드라이버 클릭() 대 자바스크립트 클릭() (0) | 2023.07.20 |
판다 데이터 프레임에 열 추가 (0) | 2023.07.20 |
Oracle SQL의 숫자 형식 (0) | 2023.07.20 |
플라스크에서 자바스크립트로 데이터를 템플릿으로 전달하려면 어떻게 해야 합니까? (0) | 2023.07.20 |