Python 생 성기 generator 용법 예시

본 논문 의 사례 는 Python 생 성기 generator 의 용법 을 분석 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
생 성기 generator 는 본질 적 으로 함수 입 니 다.지난번 함수 체 에 있 었 던 위 치 를 기억 합 니 다.생 성기 함수 다음 호출 에 서 는 자동 으로 이 위 치 를 찾 을 수 있 습 니 다.부분 변 수 는 변 하지 않 습 니 다.

l = [x * 2 for x in range(10)] #      
g = (x * 2 for x in range(10))
print(l,g) # l        ,g    generator     

generator 의 모든 요 소 를 한꺼번에 인쇄 하여 가 져 옵 니 다:

for index in g:
  print(index)

generator 의 요 소 를 점차적으로 가 져 옵 니 다:

print(g.__next__())   # 0
print(g.__next__())   # 2
print(g.__next__())   # 4
print(g.__next__())   # 6
print(g.__next__())   # 8

yield 키워드
보통 우리 가 0-50 의 수 를 인쇄 할 때 함 수 를 정의 합 니 다.이 함수 만 호출 하면 0-50 의 수 를 스스로 인쇄 합 니 다.

def fib(num):
  n = 0
  while n < num:
    print(n)
    n+=1
fib(50)

사실 우 리 는 그렇게 잃 어 버 리 기만 하면 위의 그 함 수 를 generator 로 바 꿀 수 있다.

def fib(num):
  n = 0
  while n < num:
    yield n   #    yield    ,           n
    n+=1
g = fib(50)   #    g   generator

generator 원리:특정한 알고리즘 을 통 해 특정한 조건 에서 계속 아래로 추산 하여 후속 요 소 를 얻 을 수 있 습 니 다.generator 는 list 를 만 들 필요 가 없 기 때문에 메모리 공간 을 크게 절약 할 수 있 습 니 다.밤 을 들다

def fib():
  print("step 1")
  yield 1
  print("step 2")
  yield 2
  print("step 3")
  yield 3
g = fib()
g.__next__()  #   :step 1
g.__next__()  #   :step 2
g.__next__()  #   :step 3

결과 에 따 르 면 집행next()할 때마다 한 문장 씩 인쇄 하 다가yield부 딪 히 면 바로 뛰 어 내 려 위 치 를 기록 하고 다시 집행next()할 때 기 록 된 그 위치 부터 아래로 집행 하 다가 다시 만 났 을 때 뛰 어 나 오 는 것 으로 나 타 났 다.
이때 우 리 는 우리 가 끊임없이 호출yield한다 면 이미 끝 났 는 지,경 계 를 넘 으 면 잘못 보고 할 수 있 는 지 를 어떻게 판단 해 야 할 지 생각 하지 않 을 것 이다.

# -* coding:utf-8 -*-
#! python3
'''
Created on 2018 8 10 

@author: Administrator
'''
def fib(num):
  n = 0
  while n < num :
    yield n
    n+=1
g = fib(10)
while True:
  print(g.__next__())

실행 결과:

옮 겨 다 니 는 것 이 끝 난 후에 이 호출next()이 잘못 되 었 음 을 알 수 있 습 니 다.우 리 는 옮 겨 다 니 는 아래 표 시 를 얻 을 수 없습니다.그러면 우 리 는 어떻게 이 잘못 을 피해 야 합 니까?포 이상 처리

def fib(num):
  n = 0
  while n < num :
    yield n
    n+=1
g = fib(10)
while True:
  try:
    print(g.__next__())
  except StopIteration:
    print("    ")
    break

이 때 오류 가 발생 하지 않 습 니 다.경 계 를 넘 을 때 시스템 은 이 이상 을 자동 으로 포착 하고 출력 하고 자 하 는 정 보 를 인쇄 합 니 다.
send 방법
단일 스 레 드 에서 간단 한 병행 효 과 를 실현 하 다.

# -*- coding:utf-8 -*-
#! python3
'''
Created on 2018 8 10 

@author: Administrator
'''
import time
def startEat(name):
  print("%s        "%name)
  while True:
    b = yield
    print("%s %s  "%(b,name))
def startMake():
  laowang = startEat("laowang")
  laowang.__next__()
  for index in range(10):
    time.sleep(1)
    print("       %d "%index)
    laowang.send("  %d "%index)
startMake()
실행 결과:

더 많은 파 이 썬 관련 내용 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.
본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기