[python] 발전기에서 하나의 항목 만 선택하는 방법은 무엇입니까?

다음과 같은 생성기 기능이 있습니다.

def myfunct():
  ...
  yield result

이 함수를 호출하는 일반적인 방법은 다음과 같습니다.

for r in myfunct():
  dostuff(r)

내 질문, 내가 좋아할 때마다 발전기에서 하나의 요소를 얻는 방법이 있습니까? 예를 들어 다음과 같은 작업을 수행하고 싶습니다.

while True:
  ...
  if something:
      my_element = pick_just_one_element(myfunct())
      dostuff(my_element)
  ...



답변

를 사용하여 생성기 생성

g = myfunct()

아이템을 원할 때마다

next(g)

(또는 g.next()Python 2.5 이하).

생성기가 종료되면을 발생 StopIteration시킵니다. 필요한 경우이 예외를 포착하거나 default인수를 사용하여 다음을 수행 할 수 있습니다 next().

next(g, default_value)


답변

명령문 break에서 생성기 사용 요소 중 하나만 선택 for하거나list(itertools.islice(gen, 1))

귀하의 예에 따르면 (문자 그대로) 다음과 같은 작업을 수행 할 수 있습니다.

while True:
  ...
  if something:
      for my_element in myfunct():
          dostuff(my_element)
          break
      else:
          do_generator_empty()

내가 원할 때마다 ” 한 번 생성 된] 생성기 에서 하나의 요소 만 얻으려면 “(원래 의도와 가장 일반적인 의도는 50 %라고 가정)

gen = myfunct()
while True:
  ...
  if something:
      for my_element in gen:
          dostuff(my_element)
          break
      else:
          do_generator_empty()

이런 식으로 명시적인 사용을 generator.next()피할 수 있으며 입력 끝 처리에는 (암호화)가 필요하지 않습니다StopIteration 예외적 인 처리 또는 추가 기본값 비교가 .

그만큼 else:for 당신이 끝 발전기의 경우에는 뭔가 특별한 작업을 수행하려면 문 섹션에만 필요합니다.

에 참고 next()/.next() :

Python3에서이 .next()방법의 이름은 .__next__()낮은 수준 (PEP 3114)으로 변경되었습니다. 파이썬 2.6 이전에는 내장 함수 next()가 존재하지 않았습니다. 그리고 심지어 움직이기로 논의되었습니다next()operator 드문 필요와 내장 이름의 의심스러운 인플레이션으로 인해 모듈로 현명 되었습니다.

next()기본값없이 사용하는 것은 여전히 ​​낮은 수준의 연습 StopIteration입니다. 일반 응용 프로그램 코드에서 파란색으로 볼트와 같은 암호를 공개적으로 공개하십시오. next()기본 센티넬과 함께 사용 하는 것이 가장 좋습니다.next() .builtins – .

결론 : next ()를 사용하는 것은 operator모듈의 함수를 사용하는 것과 같이 매우 드 should니다 . 사용 for x in iterator, islice, list(iterator)아주 항상 가능하고 – 그리고 다른 기능이 원활 반복자를 받아들이는 것은 응용 프로그램 수준에 반복자를 사용하는 자연적인 방법입니다. next()이 스레드의 질문에서 알 수 있듯이 저수준의 추가 개념은 명백합니다. 예를 들어 breakin을 사용 하는 for것이 일반적입니다.


답변

발전기에서 임의의 값을 검색하는 편리한 방법이 없다고 생각합니다. 생성기는 자체를 통과하는 next () 메소드를 제공하지만 메모리를 절약하기 위해 전체 시퀀스가 ​​즉시 생성되지는 않습니다. 그것은 생성기와리스트의 기능적 차이입니다.


답변

Python3에 대한 완전한 작업 예제를 위해이 답변을 스캔하는 사람들은 여기에 있습니다.

def numgen():
    x = 1000
    while True:
        x += 1
        yield x

nums = numgen() # because it must be the _same_ generator

for n in range(3):
    numnext = next(nums)
    print(numnext)

출력 :

1001
1002
1003


답변

제너레이터는 이터레이터를 생성하는 함수입니다. 따라서 반복자 인스턴스가 있으면 next () 를 사용 하여 반복자에서 다음 항목을 가져옵니다. 예를 들어 next () 함수를 사용하여 첫 번째 항목을 가져오고 나중에 사용 for in하여 나머지 항목을 처리하십시오.

# create new instance of iterator by calling a generator function
items = generator_function()

# fetch and print first item
first = next(items)
print('first item:', first)

# process remaining items:
for item in items:
    print('next item:', item)


답변

generator = myfunct()
while True:
   my_element = generator.next()

마지막 요소를 가져온 후에 발생하는 예외를 잡아라


답변

유일한 방법은 반복자에서 목록을 얻은 다음 해당 목록에서 원하는 요소를 얻는 것입니다.

l = list(myfunct())
l[4]