python 생 성기 협정 연산 실례

1.yield 실행 방식
우 리 는 다음 과 같은 생 성 기 를 정의 합 니 다.

def put_on(name):
 print("Hi {},     ,      !".format(name))
 while True:
  goods = yield
  print("  [%s]   %s     。"%(goods,name))
 
p = put_on("bigberg")
 
#  
G:\python\install\python.exe G:/python/untitled/study4/test/double.py
 
Process finished with exit code 0
우리 가 함 수 를 yield 를 통 해 생 성기 로 바 꾸 면 함 수 를 직접 실행 하면 결과 가 돌아 오지 않 습 니 다.이 때 함 수 는 이미 생 성기 이기 때문에,우 리 는 next()를 통 해 값 을 얻 고,yield 를 만 났 을 때 다시 함 수 를 꺼 내야 합 니 다.

print(type(p))
 
#  
<class 'generator'>
next()방법 을 추가 합 니 다:

def put_on(name):
 print("Hi {},     ,      !".format(name))
 while True:
  goods = yield  #  yield  
  print("  [%s]   %s     。"%(goods,name)) #       
 
p = put_on("bigberg")
p.__next__()
 
#  
Hi bigberg,     ,      !
이때 함수 가 goods=yield 에 중단 되 었 습 니 다.우리 가 next()함 수 를 다시 호출 할 때 함 수 는 중단 후의 내용,즉 상례 의 yield 아래 부분 만 실 행 됩 니 다.
next()를 하나 더 추가 합 니 다.

def put_on(name):
 print("Hi {},     ,      !".format(name))
 while True:
  goods = yield
  print("  [%s]   %s     。"%(goods,name))
 
p = put_on("bigberg")
p.__next__()
p.__next__()
 
#  
Hi bigberg,     ,      !
  [None]   bigberg     。
우리 가 두 번 째 next()에서 운행 할 수 있 는 것 은 yield 아래 의 일부 내용 이지 만 goods 에 값 을 전달 하지 않 았 기 때문에 화물 은 None 입 니 다.
소결:
yield 를 통 해 함 수 를 생 성기 로 변환 하려 면 next()방법 을 사용 해 야 실행 할 수 있 습 니 다.
yield 는 함수 의 인 터 럽 트 상태 만 유지 하고 next()를 다시 호출 하면 yield 뒤의 부분 을 실행 합 니 다.
yield 반환 값 이 없 으 면 None 빈 값 을 되 돌려 줍 니 다.
2.send()전송 값

def put_on(name):
 print("Hi {},     ,      !".format(name))
 while True:
  goods = yield
  print("  [%s]   %s     。"%(goods,name))
 
p = put_on("bigberg")
p.__next__()
p.send("  ")
 
#  
Hi bigberg,     ,      !
  [  ]   bigberg     。
소결:
__next__()이 yield 만 호출 하면 yield 를 깨 우 는 것 이 라 고 할 수 있 지만 yield 에 게 값 을 전달 하지 않 습 니 다.
send()방법 은 yield 를 호출 합 니 다.
send()함 수 를 사용 하기 전에next__(),먼저 중단 해 야 하기 때문에 두 번 째 호출 시 값 을 전달 할 수 있 습 니 다.

def put_on(name):
 print("Hi {},     ,      !".format(name))
 while True:
  goods = yield
  print("  [%s]   %s     。"%(goods,name))
 
p = put_on("bigberg")
p.__next__()
p.send("  ")
p.send("  ")
p.send("  ")
p.send("  ")
 
#    send()
Hi bigberg,     ,      !
  [  ]   bigberg     。
  [  ]   bigberg     。
  [  ]   bigberg     。
  [  ]   bigberg     。
3.단일 스 레 드 병행 효과 실현(협 정)

import time
 
 
def put_on(name):
 print("Hi {},     ,      !".format(name))
 while True:
  goods = yield
  print("  [%s]   %s     。"%(goods,name))
 
 
def transfer(name):
 p = put_on('A')
 p2 = put_on('B')
 p.__next__()
 p2.__next__()
 print("%s      !"%name)
 for i in range(5):
  time.sleep(1)
  print("%s       "%name)
  p.send("  ")
  p2.send("  ")
 
transfer("bigberg")
 
#  
Hi A,     ,      !
Hi B,     ,      !
bigberg      !
bigberg       
  [  ]   A     。
  [  ]   B     。
bigberg       
  [  ]   A     。
  [  ]   B     。
bigberg       
  [  ]   A     。
  [  ]   B     。
bigberg       
  [  ]   A     。
  [  ]   B     。
bigberg       
  [  ]   A     。
  [  ]   B     。
이상 의 python 생 성기 협 정 연산 인 스 턴 스 는 바로 소 편 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 되 고 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기