파 이 썬 은 어떻게 포 함 된 서열 을 전개 합 니까?

문제.
여러 겹 으로 포 함 된 시퀀스 를 단일 목록 으로 펼 치 려 고 합 니 다.
해결 방안
이 문 제 를 쉽게 해결 하기 위해 yield from 문 구 를 포함 하 는 재 귀 생 성 기 를 쓸 수 있 습 니 다.예 를 들 면:

from collections import Iterable

def flatten(items, ignore_types=(str, bytes)):
  for x in items:
    if isinstance(x, Iterable) and not isinstance(x, ignore_types):
      yield from flatten(x)
    else:
      yield x

items = [1, 2, [3, 4, [5, 6], 7], 8]
# Produces 1 2 3 4 5 6 7 8
for x in flatten(items):
  print(x)
위의 코드 에서isinstance(x, Iterable)어떤 요소 가 교체 가능 한 지 확인 합 니 다.그렇다면yield from 모든 하위 루틴 의 값 을 되 돌려 줍 니 다.결국 결 과 를 되 돌려 주 는 것 은 끼 워 넣 지 않 은 간단 한 서열 이다.
추가 매개 변수ignore_types 와 검 측 문isinstance(x, ignore_types)은 문자열 과 바 이 트 를 교체 가능 한 대상 에서 제외 하고 하나의 문자 로 펼 치지 않도록 합 니 다.이렇게 되면 문자열 배열 은 결국 우리 가 원 하 는 결 과 를 되 돌 릴 수 있 습 니 다.예 를 들 면:

>>> items = ['Dave', 'Paula', ['Thomas', 'Lewis']]
>>> for x in flatten(items):
...   print(x)
...
Dave
Paula
Thomas
Lewis
>>>
토론 하 다.
문장yield from 은 생 성기 에서 다른 생 성 기 를 하위 루틴 으로 호출 하려 고 할 때 매우 유용 하 다.만약 네가 그것 을 사용 하지 않 는 다 면,반드시 추가for순환 을 써 야 한다.예 를 들 면:

def flatten(items, ignore_types=(str, bytes)):
  for x in items:
    if isinstance(x, Iterable) and not isinstance(x, ignore_types):
      for i in flatten(x):
        yield i
    else:
      yield x
조금 만 고 쳤 지만yield from 문 구 는 더 좋아 보이 고 코드 를 더욱 간결 하고 상쾌 하 게 만 들 었 다.
이전에 언급 한 문자열 과 바이트 에 대한 추가 검 사 는 그것들 을 다시 하나의 문자 로 전개 하 는 것 을 방지 하기 위 한 것 이다.펼 치고 싶 지 않 은 다른 유형 이 있다 면 인자ignore_types를 수정 하면 됩 니 다.
마지막 으로 주의해 야 할 것 은yield from 협 정과 생 성 기 를 바탕 으로 하 는 병행 프로 그래 밍 에서 더욱 중요 한 역할 을 하고 있다 는 것 이다.
이상 은 파 이 썬 이 끼 워 넣 은 서열 을 어떻게 전개 하 는 지 에 대한 상세 한 내용 입 니 다.파 이 썬 이 끼 워 넣 은 서열 을 전개 하 는 데 관 한 자 료 는 다른 관련 글 에 주목 하 십시오!

좋은 웹페이지 즐겨찾기