산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> python

Python 튜토리얼의 Yield:Generator &Yield vs Return 예제

파이썬 수익률이란 무엇입니까?

파이썬의 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()

목록은 대괄호 안에 요소가 있는 반복 가능한 개체입니다. 생성기 개체에서 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]

사용:for-in

예제에는 정의된 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() 메서드는 목록, 배열 또는 개체의 다음 항목을 제공합니다. 목록이 비어 있고 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

파이썬에서 Return 대신 Yield를 사용하는 경우

Python3 수율 키워드는 호출자에게 생성기를 반환하고 생성기가 반복될 때만 코드 실행이 시작됩니다.

반환 함수에서 함수 실행의 끝이며 단일 값이 호출자에게 다시 제공됩니다.

다음은 Return 대신 Yield를 사용해야 하는 상황입니다.

수익률 대 수익률

Yield와 Return의 차이점은 다음과 같습니다.

수익률 반환
Yield는 호출자에게 생성기 개체를 반환하고 생성기가 반복될 때만 코드 실행이 시작됩니다. 함수의 반환은 함수 실행의 끝이며 단일 값이 호출자에게 반환됩니다.
함수가 호출될 때 yield 키워드를 만나면 함수 실행이 중지됩니다. 생성자 객체를 호출자에게 다시 반환합니다. 함수 실행은 제너레이터 객체가 실행될 때만 시작됩니다. 함수가 호출되면 실행이 시작되고 return 키워드가 있는 경우 호출자에게 값이 반환됩니다. 함수 내부의 반환은 함수 실행의 끝을 표시합니다.
수율 표현식 반환식
yield 키워드를 사용할 때 메모리가 사용되지 않습니다. 반환된 값에 대해 메모리가 할당됩니다.
메모리를 사용하지 않아 대용량 데이터를 처리해야 하는 경우에 매우 유용합니다. 매우 작은 데이터 크기에 편리합니다.
데이터 크기가 큰 경우 yield 키워드를 사용하면 성능이 더 좋습니다. 데이터 크기가 커서 성능을 저해할 경우 많은 메모리가 사용됩니다.
데이터 크기가 큰 경우 yield의 경우 실행 시간이 더 빠릅니다. 데이터 크기가 큰 경우 데이터 크기가 작은 경우에는 추가 처리가 수행되므로 실행 시간이 더 오래 걸립니다.

요약:


python

  1. Python 익명/람다 함수
  2. 파이썬 생성기
  3. 파이썬 클로저
  4. 파이썬 데코레이터
  5. EXAMPLE이 있는 Python String strip() 함수
  6. 파이썬 문자열 길이 | len() 메서드 예제
  7. 예제가 있는 Python Lambda 함수
  8. 예제가 있는 Python round() 함수
  9. 예제가 있는 Python map() 함수
  10. 예제가 있는 컬렉션의 Python 카운터