제너레이터 이해는 정확히 어떻게 작동합니까?
제너레이터 이해는 무엇을 합니까?어떻게 작동합니까?저는 그것에 대한 튜토리얼을 찾을 수 없었습니다.
당신은 목록 이해력이 있습니까?그렇다면 생성기 식은 목록 이해와 같지만 관심 있는 모든 항목을 찾아 목록으로 채우는 대신 기다렸다가 각 항목을 하나씩 식에서 추출합니다.
>>> my_list = [1, 3, 5, 9, 2, 6]
>>> filtered_list = [item for item in my_list if item > 3]
>>> print(filtered_list)
[5, 9, 6]
>>> len(filtered_list)
3
>>> # compare to generator expression
...
>>> filtered_gen = (item for item in my_list if item > 3)
>>> print(filtered_gen) # notice it's a generator object
<generator object <genexpr> at 0x7f2ad75f89e0>
>>> len(filtered_gen) # So technically, it has no length
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'generator' has no len()
>>> # We extract each item out individually. We'll do it manually first.
...
>>> next(filtered_gen)
5
>>> next(filtered_gen)
9
>>> next(filtered_gen)
6
>>> next(filtered_gen) # Should be all out of items and give an error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> # Yup, the generator is spent. No values for you!
...
>>> # Let's prove it gives the same results as our list comprehension
...
>>> filtered_gen = (item for item in my_list if item > 3)
>>> gen_to_list = list(filtered_gen)
>>> print(gen_to_list)
[5, 9, 6]
>>> filtered_list == gen_to_list
True
>>>
생성기 식은 한 번에 하나의 항목만 생성하면 되므로 메모리 사용량이 크게 절약될 수 있습니다.생성기 식은 한 번에 하나의 항목을 가져와 해당 항목을 기반으로 많은 계산을 수행한 다음 다음 항목으로 이동해야 하는 시나리오에서 가장 적합합니다.두 개 이상의 값이 필요한 경우 생성기 식을 사용하여 한 번에 몇 개씩 가져올 수도 있습니다.프로그램을 진행하기 전에 모든 값이 필요한 경우 목록 이해를 대신 사용합니다.
생성자 이해는 목록 이해의 게으른 버전입니다.
이는 목록 대신 다음 요소를 생성하는 다음() 메서드가 있는 개체를 반환한다는 점을 제외하고는 목록 이해와 같습니다.
목록 이해에 익숙하지 않은 경우 여기를 참조하십시오. 생성자는 여기를 참조하십시오.
목록/제너레이터 이해는 기존 목록/제너레이터에서 새 목록/제너레이터를 만드는 데 사용할 수 있는 구성입니다.
1부터 10까지의 각 숫자의 제곱 리스트를 생성하려고 합니다.Python에서 이 작업을 수행할 수 있습니다.
>>> [x**2 for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
여기서,range(1,11)합니다.[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 러나그나range함수는 Python 3.0 이전의 생성기가 아니기 때문에 제가 사용한 구조는 목록 이해입니다.
동일한 작업을 수행하는 제너레이터를 생성하려면 다음과 같이 수행할 수 있습니다.
>>> (x**2 for x in xrange(1,11))
<generator object at 0x7f0a79273488>
에서는 파이썬 3을 사용됩니다.range는 생성기이므로 결과는 사용하는 구문(괄호 또는 원형 대괄호)에만 따라 달라집니다.
제너레이터 이해는 특정 구조의 제너레이터를 생성하는 쉬운 방법입니다.예를 들어, 당신이 원하는 것은generator에 있는 모든 짝수를 하나씩 출력합니다.your_list함수 스타일을 사용하여 작성하는 경우 다음과 같습니다.
def allEvens( L ):
for number in L:
if number % 2 is 0:
yield number
evens = allEvens( yourList )
다음과 같은 제너레이터 이해 표현을 사용하여 동일한 결과를 얻을 수 있습니다.
evens = ( number for number in your_list if number % 2 == 0 )
두 경우 모두, 당신이 전화할 때next(evens)당신은 다음 짝수를 얻습니다.your_list.
제너레이터 이해는 리소스에서 이동하는 커서와 같은 반복 가능한 항목을 만드는 접근 방식입니다.mysql 커서 또는 mongodb 커서를 알고 있는 경우 전체 실제 데이터가 한 번에 하나씩 메모리에 로드되지 않는다는 것을 알고 있을 수 있습니다.커서가 앞뒤로 이동하지만 메모리에는 항상 하나의 행/목록 요소가 있습니다.
간단히 말해서, 생성자 이해를 사용하면 파이썬에서 커서를 쉽게 만들 수 있습니다.
제너레이터 이해의 또 다른 예:
print 'Generator comprehensions'
def sq_num(n):
for num in (x**2 for x in range(n)):
yield num
for x in sq_num(10):
print x
생성기는 목록과 동일하지만, 사소한 차이는 목록에서 필요한 모든 번호 또는 목록 항목을 한 번에 얻을 수 있지만 생성기에서는 필요한 번호가 한 번에 하나씩 산출된다는 것입니다.그래서 우리는 필요한 아이템을 얻기 위해 for 루프를 사용하여 필요한 아이템을 모두 얻어야 합니다.
#to get all the even numbers in given range
def allevens(n):
for x in range(2,n):
if x%2==0:
yield x
for x in allevens(10)
print(x)
#output
2
4
6
8
우리는 이것을 목록 이해의 생성자 버전으로 이해할 수 있습니다.리스트 이해의 경우, 우리는 한 줄 또는 짧은 코드를 사용하여 만들고, 생성기 이해의 경우, 우리는 한 줄 코드 또는 생성자 이해의 경우, 우리는 한 줄 코드 또는 작은 코드를 사용합니다.이러한 구문은 [](괄호)를 ()괄호로 대체하는 것과 같습니다.
generator_composition_object = (num**3 for num in range(5))
print(generator_composition_object)
유형 생성기의 개체 주소를 제공합니다.다음()과 같은 기능을 사용할 수도 있습니다.
언급URL : https://stackoverflow.com/questions/364802/how-exactly-does-a-generator-comprehension-work
'codememo' 카테고리의 다른 글
| 예외영구 저장소에서 세션 로드 (0) | 2023.07.27 |
|---|---|
| 오라클: 블롭이 있는 테이블을 다시 가져올 수 있는 .sql 파일로 내보냅니다. (0) | 2023.07.27 |
| 봄에 조건부 자동 배선을 어떻게 하나요? (0) | 2023.07.27 |
| 설치_실패_USER_Restricted : redmi 4 기기를 사용하는 안드로이드 스튜디오 (0) | 2023.07.27 |
| 충돌하는 모듈입니다.LoggerFactory가 Logback LoggerContext가 아니지만 Logback이 클래스 경로에 있습니다. (0) | 2023.07.22 |