python
파이썬의 yield 키워드는 유일한 반환처럼 작동합니다.
차이점은 값을 반환하는 대신 호출자에게 생성기 개체를 반환한다는 것입니다.
함수가 호출되고 실행 스레드가 함수에서 yield 키워드를 찾으면 함수 실행이 해당 줄 자체에서 중지되고 생성자 개체를 호출자에게 다시 반환합니다.
이 Python 자습서에서는 다음을 배우게 됩니다.
yield expression
Python yield는 생성기 객체를 반환합니다. 제너레이터는 값을 얻기 위해 반복되어야 하는 특수 함수입니다.
yield 키워드는 주어진 표현식을 생성기 객체를 되돌려주는 생성기 함수로 변환합니다. 객체의 값을 얻으려면 yield에 주어진 값을 읽기 위해 반복되어야 합니다.
다음은 yield의 간단한 예입니다. testyield() 함수에는 "Guru99 Python 자습서에 오신 것을 환영합니다"라는 문자열이 있는 yield 키워드가 있습니다. 함수가 호출되면 출력이 출력되고 실제 값 대신 제너레이터 객체를 제공합니다.
def testyield(): yield "Welcome to Guru99 Python Tutorials" output = testyield() print(output)
출력:
<generator object testyield at 0x00000028265EB9A8>
주어진 출력은 우리가 yield에 지정한 값을 가진 생성기 객체입니다.
그러나 우리는 산출물을 산출하기 위해 제공해야 하는 메시지를 받지 못하고 있습니다!
yield 에 주어진 메시지를 인쇄하려면 아래 예제와 같이 생성기 개체를 반복해야 합니다.
def testyield(): yield "Welcome to Guru99 Python Tutorials" output = testyield() for i in output: print(i)
출력
Welcome to Guru99 Python Tutorials
제너레이터는 반복 가능한 제너레이터 객체를 반환하는 함수입니다. 생성기 객체의 값은 전체 목록 대신 한 번에 하나씩 가져오므로 실제 값을 얻으려면 next() 또는 list() 메서드를 사용하여 for 루프를 사용할 수 있습니다.
제너레이터 함수와 제너레이터 표현식을 사용하여 제너레이터를 생성할 수 있습니다.
제너레이터 함수는 반환 값 대신 yield 키워드가 있는 일반 함수와 같습니다.
생성기 함수를 생성하려면 yield 키워드를 추가해야 합니다. 다음 예제에서는 생성기 함수를 만드는 방법을 보여줍니다.
def generator(): yield "H" yield "E" yield "L" yield "L" yield "O" test = generator() for i in test: print(i)
출력:
H E L L O
제너레이터 함수가 일반 함수와 어떻게 다른지 이해합시다.
normal_test()와 generator_test()의 2가지 함수가 있습니다.
두 함수 모두 "Hello World" 문자열을 반환한다고 가정합니다. normal_test()는 return을 사용하고 generator_test()는 yield를 사용하고 있습니다.
# Normal function def normal_test(): return "Hello World" #Generator function def generator_test(): yield "Hello World" print(normal_test()) #call to normal function print(generator_test()) # call to generator function
출력:
Hello World <generator object generator_test at 0x00000012F2F5BA20>
출력은 일반 함수 normal_test()를 호출할 때 Hello World 문자열을 반환함을 보여줍니다. yield 키워드가 있는 생성기 함수의 경우 문자열이 아닌
이것이 제너레이터 기능과 일반 기능의 주요 차이점입니다. 이제 생성기 객체에서 값을 가져오려면 for 루프 내부의 객체를 사용하거나 next() 메서드를 사용하거나 list()를 사용해야 합니다.
print(next(generator_test())) # will output Hello World
일반 함수 v/s 생성기 함수에 추가할 또 다른 차이점은 일반 함수를 호출할 때 반환에 도달하면 실행이 시작되고 중지된다는 것입니다. 값이 호출자에게 반환됩니다. 따라서 실행이 시작되면 그 사이에 일반 기능을 중지할 수 없으며 return 키워드를 만날 때만 중지됩니다.
그러나 제너레이터 함수의 경우 실행이 시작되면 첫 번째 수율을 얻을 때 실행을 중지하고 제너레이터 객체를 반환합니다. 생성기 개체를 사용하여 값을 가져오고 요구 사항에 따라 일시 중지했다가 다시 시작할 수 있습니다.
list(), for-loop 및 next() 메서드를 사용하여 생성기 객체에서 값을 읽을 수 있습니다.
목록은 대괄호 안에 요소가 있는 반복 가능한 개체입니다. 생성기 개체에서 list()를 사용하면 생성기가 보유한 모든 값을 얻을 수 있습니다.
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) print(list(num))
출력:
[0, 2, 4, 6, 8]
예제에는 정의된 n에 대해 모든 짝수를 제공하는 even_numbers() 함수가 정의되어 있습니다. even_numbers() 함수에 대한 호출은 for 루프 내부에서 사용되는 생성기 객체를 반환합니다.
예:
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) for i in num: print(i)
출력:
0 2 4 6 8
next() 메서드는 목록, 배열 또는 개체의 다음 항목을 제공합니다. 목록이 비어 있고 next()가 호출되면 stopIteration 신호와 함께 오류가 반환됩니다. next()의 이 오류는 목록에 더 이상 항목이 없음을 나타냅니다.
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) print(next(num)) print(next(num)) print(next(num)) print(next(num)) print(next(num)) print(next(num))
출력:
0 2 4 6 8 Traceback (most recent call last): File "main.py", line 11, in <module> print(next(num)) StopIteration
발전기의 경우 한 번만 사용할 수 있습니다. 다시 사용하려고 하면 비어 있게 됩니다.
예:
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) for i in num: print(i) print("\n") print("Calling the generator again: ", list(num))
출력:
0 2 4 6 8 Calling the generator again: []
출력을 다시 사용하려면 함수를 다시 호출해야 합니다.
다음 예제는 Python에서 생성기와 yield를 사용하는 방법을 보여줍니다. 예제는 피보나치 수열을 생성합니다.
def getFibonnaciSeries(num): c1, c2 = 0, 1 count = 0 while count < num: yield c1 c3 = c1 + c2 c1 = c2 c2 = c3 count += 1 fin = getFibonnaciSeries(7) print(fin) for i in fin: print(i)
출력:
<generator object getFibonnaciSeries at 0x0000007F39C8BA20> 0 1 1 2 3 5 8
이 예에서는 yield로 함수를 호출하는 방법을 볼 것입니다.
아래 예제에는 주어진 숫자의 제곱을 반환하는 test()라는 함수가 있습니다. yield 키워드와 함께 test()를 사용하는 getSquare()라는 또 다른 함수가 있습니다. 출력은 주어진 숫자 범위에 대한 제곱 값을 제공합니다.
def test(n): return n*n def getSquare(n): for i in range(n): yield test(i) sq = getSquare(10) for i in sq: print(i)
출력:
0 1 4 9 16 25 36 49 64 81
Python3 수율 키워드는 호출자에게 생성기를 반환하고 생성기가 반복될 때만 코드 실행이 시작됩니다.
반환 함수에서 함수 실행의 끝이며 단일 값이 호출자에게 다시 제공됩니다.
다음은 Return 대신 Yield를 사용해야 하는 상황입니다.
Yield와 Return의 차이점은 다음과 같습니다.
수익률 | 반환 |
---|---|
Yield는 호출자에게 생성기 개체를 반환하고 생성기가 반복될 때만 코드 실행이 시작됩니다. | 함수의 반환은 함수 실행의 끝이며 단일 값이 호출자에게 반환됩니다. |
함수가 호출될 때 yield 키워드를 만나면 함수 실행이 중지됩니다. 생성자 객체를 호출자에게 다시 반환합니다. 함수 실행은 제너레이터 객체가 실행될 때만 시작됩니다. | 함수가 호출되면 실행이 시작되고 return 키워드가 있는 경우 호출자에게 값이 반환됩니다. 함수 내부의 반환은 함수 실행의 끝을 표시합니다. |
수율 표현식 | 반환식 |
yield 키워드를 사용할 때 메모리가 사용되지 않습니다. | 반환된 값에 대해 메모리가 할당됩니다. |
메모리를 사용하지 않아 대용량 데이터를 처리해야 하는 경우에 매우 유용합니다. | 매우 작은 데이터 크기에 편리합니다. |
데이터 크기가 큰 경우 yield 키워드를 사용하면 성능이 더 좋습니다. | 데이터 크기가 커서 성능을 저해할 경우 많은 메모리가 사용됩니다. |
데이터 크기가 큰 경우 yield의 경우 실행 시간이 더 빠릅니다. | 데이터 크기가 큰 경우 데이터 크기가 작은 경우에는 추가 처리가 수행되므로 실행 시간이 더 오래 걸립니다. |
python
XML이란 무엇입니까? XML은 eXtensible Markup Language의 약자입니다. 중소량의 데이터를 저장 및 전송하도록 설계되었으며 구조화된 정보를 공유하는 데 널리 사용됩니다. Python을 사용하면 XML 문서를 구문 분석하고 수정할 수 있습니다. XML 문서를 구문 분석하려면 전체 XML 문서가 메모리에 있어야 합니다. 이 튜토리얼에서는 Python에서 XML minidom 클래스를 사용하여 XML 파일을 로드하고 구문 분석하는 방법을 살펴봅니다. 이 튜토리얼에서 배울 것입니다- minidom을 사용하여 X
Python을 사용하면 한 번에 여러 값을 반환할 수 있습니다. 분명히 Python의 대부분의 함수는 단일 값을 반환하며 일반적으로 해당 함수가 수행한 작업의 결과입니다. 이 기사에서는 Python에서도 여러 값을 반환할 수 있으며 이를 위해 사전, 목록 또는 데이터 클래스가 필요하지 않음을 배웁니다. 목차 튜플로 여러 값 반환 Python에서 여러 값을 반환하는 다른 방법 계속 학습 튜플이 있는 여러 값 반환 return 문 뒤에 값을 쉼표로 구분하여 나열하기만 하면 됩니다. 다음은 여러 값을 반환하는 방법과 한 번에 여