복붙노트

[PYTHON] 생성기 (파이썬에서)에서 단 하나의 항목을 선택하는 방법?

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)
  ...

해결법

  1. ==============================

    1.다음을 사용하여 생성기 생성

    다음을 사용하여 생성기 생성

    g = myfunct()
    

    매번 아이템을 원할 때마다

    next(g)
    

    (또는 파이썬 2.5 이하에서는 g.next ()).

    생성기가 종료되면 StopIteration이 발생합니다. 필요한 경우이 예외를 catch하거나 next ()에 기본 인수를 사용할 수 있습니다.

    next(g, default_value)
    
  2. ==============================

    2.생성자의 한 요소 만 선택하면 for 문에서 break를 사용하거나 list (itertools.islice (gen, 1))에서 break를 사용합니다.

    생성자의 한 요소 만 선택하면 for 문에서 break를 사용하거나 list (itertools.islice (gen, 1))에서 break를 사용합니다.

    당신의 예에 따르면 (literalally) 다음과 같이 할 수 있습니다 :

    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 of : for 문 섹션은 생성자 끝의 경우 특별한 작업을 원할 경우에만 필요합니다.

    Python3에서 .next () 메소드의 이름이 __ next __ ()로 바뀌 었습니다. 그 이유는 낮은 레벨로 간주되기 때문입니다 (PEP 3114). 파이썬 2.6 이전에는 내장 함수 next ()가 존재하지 않았다. 그리고 그것은 희소 한 요구와 내장 된 이름의 의심스러운 인플레이션으로 인해 다음 ()을 운영자 모듈 (현명했을 것입니다)로 옮기기까지 논의되었습니다.

    default를 사용하지 않고 next ()를 사용하는 것은 매우 낮은 수준의 연습입니다. 일반 응용 프로그램 코드에서 파란색으로 볼트와 같은 숨겨진 StopIteration을 공개적으로 던집니다. 그리고 builtin에서 직접 next ()를위한 유일한 옵션 인 기본 센티널과 함께 next ()를 사용하는 것은 제한적이며 때로는 비 python 적 논리 / readablity에 대한 이유를 제공합니다.

    결론 : 연산자 모듈의 함수 사용과 마찬가지로 next ()를 사용하는 것은 매우 드물다. iterator, islice, list (iterator) 및 iterator를 원활하게 수락하는 다른 함수에서 x를 사용하면 응용 프로그램 수준에서 반복자를 사용하는 자연스러운 방법이며 언제나 가능합니다. next ()는 저수준이고, 여분의 개념이며,이 스레드의 질문처럼 잘 보이지 않습니다. 예를 들면. break in for을 사용하는 것은 일반적입니다.

  3. ==============================

    3.생성기에서 임의의 값을 검색하는 편리한 방법이 있다고 생각하지 않습니다. 생성기는 next () 메서드를 제공하여 자체를 트래버스하지만 메모리를 절약하기 위해 전체 시퀀스가 ​​즉시 생성되지 않습니다. 이것이 발전기와 목록 간의 기능적 차이입니다.

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

  4. ==============================

    4.

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

    마지막 요소를 취한 후에 던져진 예외를 잡아라.

  5. ==============================

    5.유일한 방법은 iterator에서 목록을 가져 와서 그 목록에서 원하는 요소를 얻는 것입니다.

    유일한 방법은 iterator에서 목록을 가져 와서 그 목록에서 원하는 요소를 얻는 것입니다.

    l = list(myfunct())
    l[4]
    
  6. from https://stackoverflow.com/questions/4741243/how-to-pick-just-one-item-from-a-generator-in-python by cc-by-sa and MIT license