python에서 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의 용법 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보시기 바랍니다. 앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.