python에서 yield의 용법 상세 설명

먼저 나는 프로그램을 보는 과정에서 Yield라는 키워드를 만났다. 그리고 바이두를 할 때 간단하게 나에게 알릴 수 있는 것이 하나도 없었다. 말하자면 정말 머리가 옳고 매개 변수가 무엇인지, 전달된 것이 무엇인지, 그리고 자신의 강좌가 가장 간단하고 간단명료하며 이해하기 쉽다는 것을 발견했다. 나는 독자의 느낌을 고려한 적이 있는지 묻고 싶다.
다음은 본론입니다.
우선, 만약에 당신이 아직 yield에 대해 초보적인 인식을 가지지 않았다면, 당신은 먼저 yield를'return'으로 간주해야 합니다. 이것은 직관적인 것입니다. 이것은 우선return입니다. 일반적인return은 무슨 뜻입니까? 프로그램에서 어떤 값을 되돌려 주는 것입니다. 되돌려 받은 후에 프로그램은 더 이상 아래로 운행하지 않습니다.리턴을 보고 생성기(generator)의 일부분(yield를 가진 함수야말로 진정한 교체기)으로 간주하세요. 자, 만약 당신이 이것에 대해 잘 모른다면 먼저 yield를 리턴으로 보고 다음 프로그램을 직접 보면 yield의 모든 뜻을 알 수 있습니다.

def foo():
 print("starting...")
 while True:
  res = yield 4
  print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(next(g))
이렇게 간단한 몇 줄의 코드는 당신에게 yield가 무엇인지 알게 해 줍니다. 코드의 출력은 이것입니다.
starting...

********************
res: None

코드 실행 순서를 직접 설명합니다. 코드 단일 디버깅과 같습니다.
1. 프로그램이 실행되기 시작한 후,foo 함수에 yield 키워드가 있기 때문에foo 함수는 실제로 실행되지 않고 생성기 g(한 대상에 해당)를 먼저 얻는다
2. 넥스트 방법을 호출할 때까지foo 함수가 정식으로 실행되기 시작하고foo 함수의print 방법을 실행한 다음while 순환에 들어간다
3. 프로그램이 yield 키워드를 만났을 때 yield를 return으로 생각하고 return이 4가 된 후에 프로그램이 멈추고 값을 부여하여res 작업을 실행하지 않았습니다. 이때 next(g) 문장이 실행되었습니다. 그래서 출력의 두 줄(첫 번째는while 위의 print 결과이고, 두 번째는return에서 나온 결과)은 print(next(g)를 실행한 결과입니다.
4. 프로그램은 print("*"*20)를 실행하고 20개를 출력합니다*
5. 다음 print(next(g))를 실행하기 시작합니다. 이때는 위의 것과 차이가 많지 않습니다. 그러나 다른 것은 이때는 아까 그 next 프로그램이 멈춘 곳에서부터 실행됩니다. 즉res의 값 부여 작업을 실행해야 합니다. 이때 주의해야 할 것은 이 시간 값 부여 작업의 오른쪽은 값이 없기 때문입니다. (아까 그것은 Return이 나갔기 때문에 값 부여 작업의 왼쪽 매개 변수가 없습니다.)그래서 이때res부치는 None입니다. 그래서 다음 출력은res:None입니다.
6. 프로그램은while에서 계속 실행됩니다. 다시 yield를 만났습니다. 이때 똑같이 Return에서 4를 내고 프로그램이 멈춥니다. print 함수 출력의 4는 이번 Return에서 나온 4입니다.
여기까지 오면yield와return의 관계와 차이를 알 수 있습니다. yield를 가진 함수는 하나의 생성기입니다. 하나의 함수가 아니라 하나의 함수입니다. 이 생성기는 하나의 함수가next 함수입니다. next는'다음'이 어떤 수를 생성하는지에 해당합니다. 이번 next가 시작된 곳은 지난번 next가 멈춘 곳에서 실행되기 때문에next를 호출할 때 생성기는foo 함수로부터 실행되지 않습니다.단지 지난번에 멈춘 곳에서 시작하고 yield를 만나면 리턴이 생성할 수를 내면 이 단계는 끝납니다.
****************************************************************************************************************************************

def foo():
 print("starting...")
 while True:
  res = yield 4
  print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(g.send(7))
이 생성기의send 함수의 예를 다시 보면 이 예는 위의 그 예의 마지막 줄을 바꾸어 결과를 출력합니다.
starting...

********************
res: 7

먼저send함수의 개념을 대체적으로 말하자면: 이때 당신은 위의 보라색 글자, 그리고 위의 그res값이 왜 None인지, 이것이 7로 변했는지 알아야 한다. 도대체 왜, 이것은send가 매개 변수를 보내서res에게 보내는 것이다. 왜냐하면 위에서 말했듯이return할 때 4값을 res에게 주지 않았기 때문이다. 다음에 실행할 때 부치 조작을 계속할 수밖에 없기 때문에 부치가 None일 수밖에 없다. 만약send를 사용한다면,실행을 시작할 때, 먼저 지난번(return 4 이후)에 이어서 실행하고, 먼저 7개의 값을res에게 준 다음,next의 역할을 실행하고, 다음 yield를 만나고,return이 결과를 낸 후에 끝냅니다.
5. 프로그램이 g.send(7)를 실행하면 프로그램이 yield 키워드 줄에서 계속 아래로 실행되고,send는 7이 값을res 변수에 부여합니다
6. send 방법에next () 방법이 포함되어 있기 때문에 프로그램은 print 방법을 계속 아래로 실행하고 while 순환에 들어간다
7. 프로그램 실행이 다시 yield 키워드를 만났을 때 yield는 뒤에 있는 값을 되돌려주고 프로그램은next 방법이나send 방법을 다시 호출할 때까지 다시 정지합니다.
이게 끝이야. 왜 이 생성기를 썼는지 말해봐. List를 쓰면 더 큰 공간을 차지하기 때문이야. 예를 들면 0, 1, 2, 3, 4, 5, 6.......천
이 가능하다, ~할 수 있다,...

for n in range(1000):
 a=n
이때range(1000)는 기본적으로 1000개의 수를 포함하는list를 생성하기 때문에 메모리를 차지합니다.
이럴 때 너는 아까의 yield로 생성기를 조합하여 실현할 수도 있고, xrange(1000)라는 생성기로 실현할 수도 있다
yield 조합:

def foo(num):
 print("starting...")
 while num<10:
  num=num+1
  yield num
for n in foo(0):
 print(n)
출력:
starting...










 xrange(1000):

for n in xrange(1000):
 a=n
그 중에서 주의해야 할 것은python3에 xrange () 가 없어졌다는 것이다.python3에서 range () 는 xrange () 이다. 당신은python3에서 range () 의 유형을 볼 수 있다. 이것은 이미'class'range'>이지list가 아니다. 이것은 최적화가 필요하기 때문이다. 
이python에서 yield의 용법에 대한 상세한 설명은 여기까지입니다. 더 많은 관련python에서 yield의 용법 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보시기 바랍니다. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기