Engedd be Python bemutató: Generator & Hozam vs hozam példa

Mi Python hozam?

A pythonban a hozam kulcsszó úgy működik, mint egy return az egyetlen

A különbség az, hogy ahelyett, hogy értéket adna vissza, egy generátor objektumot ad vissza a hívónak.

Amikor egy függvényt meghívunk, és a végrehajtási szál egy hozamkulcsszót talál a függvényben, a függvény végrehajtása azon a soron áll meg, és egy generátor objektumot ad vissza a hívónak.

Szintaxis

yield expression

Description

Python A hozam egy generátor objektumot ad vissza. Generators speciális függvények, amelyeket ismételni kell az értékek eléréséhez.

A hozam kulcsszó a megadott kifejezést generátorfüggvénnyel konvertálja, amely egy generátor objektumot ad vissza. Az objektum értékeinek megszerzéséhez iterálni kell a hozamnak adott értékeket.

Példa: Hozammódszer

Íme egy egyszerű példa a hozamra. A testyield() függvénynek van egy hozamkulcsszója a következővel: „Üdvözöljük a Guru99-ben Python oktatóanyagok“. A függvény meghívásakor a kimenet kinyomtatásra kerül, és a tényleges érték helyett egy generátor objektumot ad meg.

def testyield():
  yield "Welcome to Guru99 Python Tutorials"
output = testyield()
print(output)

output:

<generator object testyield at 0x00000028265EB9A8>

A megadott kimenet egy generátor objektum, amelynek értéke az általunk megadott hozam.

De nem azt az üzenetet kapjuk, amelyet át kell adnunk ahhoz, hogy hozzunk eredményt!

A hozamnak adott üzenet kinyomtatásához meg kell ismételni a generátor objektumot az alábbi példában látható módon:

def testyield():
  yield "Welcome to Guru99 Python Tutorials"

output = testyield()
for i in output:
    print(i)

output:

Welcome to Guru99 Python Tutorials

Mik Generators Python?

Generators olyan függvények, amelyek egy iterálható generátor objektumot adnak vissza. A generátor objektum értékeit a rendszer egyenként kéri le a teljes lista helyett, így a tényleges értékekhez használhatja a for-loopot a next() vagy list() metódussal.

<p></p> Generator funkció

Generátorokat generátor függvény és generátor kifejezés használatával hozhat létre.

A generátor függvény olyan, mint egy normál függvény, visszatérési értéke helyett hozamkulcsszóval rendelkezik.

Generátor függvény létrehozásához hozzá kell adnia egy hozamkulcsszót. A következő példák bemutatják, hogyan lehet generátorfüggvényt létrehozni.

def generator():
    yield "H"
    yield "E"
    yield "L"
    yield "L"
    yield "O"

test = generator()
for i in test:
    print(i)

output:

H
E
L
L
O

Különbség a normál funkció v/s között Generator funkciót.

Nézzük meg, miben különbözik egy generátorfüggvény a normál függvénytől.

Két függvény létezik: normal_test() és generator_test().

Mindkét függvény visszaadja a „Hello World” karakterláncot. A normal_test() a return-t, a generator_test() pedig a hozamot használja.

# 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

output:

Hello World
<generator object generator_test at 0x00000012F2F5BA20>

A kimenet azt mutatja, hogy a normal_test() normál függvény meghívásakor a Hello World karakterláncot adja vissza. A hozam kulcsszóval rendelkező generátorfüggvény esetén ez ad vissza és nem a húr.

Ez a fő különbség a generátor funkció és a normál funkció között. Most, hogy megkapjuk az értéket a generátor objektumtól, vagy a for loop belsejében lévő objektumot kell használnunk, vagy a next() metódust, vagy a list()-t kell használnunk.

print(next(generator_test()))  # will output Hello World

Még egy különbség a normál függvény v/s generátor függvényhez az, hogy amikor meghívunk egy normál függvényt, a végrehajtás elindul és leáll, amikor elér visszatérés és az érték visszakerül a hívóhoz. Tehát amikor a végrehajtás elindul, nem állíthatja le a normál függvényt közben, és csak akkor áll le, ha a return kulcsszóval találkozik.

De generátor függvény esetén, ha a végrehajtás elindul, amikor megkapja az első hozamot, leállítja a végrehajtást és visszaadja a generátor objektumot. Használhatja a generátor objektumot az értékek lekéréséhez, valamint a szüneteltetést és a folytatást igény szerint.

Hogyan lehet kiolvasni az értékeket a generátorból?

Az értékeket egy generátor objektumból list(), for-loop és next() metódussal olvashatja ki.

Használata: list()

A lista egy iterálható objektum, amelynek elemei zárójelben vannak. A list() használata egy generátor objektumon megadja az összes értéket, amelyet a generátor tárol.

def even_numbers(n):
    for x in range(n):
       if (x%2==0): 
           yield x       
num = even_numbers(10)
print(list(num))

output:

[0, 2, 4, 6, 8]

Használata: for-in

A példában van egy páros_számok() definiált függvény, amely megadja az összes páros számot a definiált n-hez. A páros_számok() függvény hívása egy generátor objektumot ad vissza, amelyet a for-cikluson belül használnak.

Példa:

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)

output:

0
2
4
6
8

A next() használata

A next() metódus a lista, tömb vagy objektum következő elemét adja meg. Ha a lista üres, és ha a next() meghívásra kerül, akkor stopIteration jelzéssel hibát ad vissza. Ez a next() hiba azt jelzi, hogy nincs több elem a listában.

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))

output:

0
2
4
6
8
Traceback (most recent call last):
  File "main.py", line 11, in <module>
    print(next(num))
StopIteration

Generators egyszeri használatúak

Generátorok esetén csak egyszer használhatók. Ha újra megpróbálja használni őket, üres lesz.

Például:

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))

output:

0
2
4
6
8
Calling the generator again:  []

Abban az esetben, ha a kimenetet újra használni szeretné, újra meg kell hívnia a működést.

Példa: Generators és a Fibonacci-sorozat hozama

A következő példa bemutatja, hogyan kell használni a generátorokat, és hogyan kell hozni Python. A példa létrehozza a Fibonacci sorozatot.

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)

output:

<generator object getFibonnaciSeries at 0x0000007F39C8BA20>
0
1
1
2
3
5
8

Példa: Funkció hívása hozammal

Ebben a példában látni fogjuk, hogyan lehet függvényt hívni hozammal.

Az alábbi példában van egy test() nevű függvény, amely az adott szám négyzetét adja vissza. Van egy másik függvény, a getSquare(), amely a test() függvényt hozamkulcsszóval használja. A kimenet az adott számtartomány négyzetes értékét adja meg.

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)

output:

0
1
4
9
16
25
36
49
64
81

Mikor érdemes a hozamot használni a visszatérés helyett? Python

Python3 Hozam A kulcsszó egy generátort ad vissza a hívónak, és a kód végrehajtása csak a generátor iterációja után indul el.

A visszatérés függvényben a függvény végrehajtásának vége, és egyetlen értéket kap vissza a hívó.

Itt van az a helyzet, amikor a Return helyett a Hozamot kell használnia

  • Használja a hozamot a return helyett, ha nagy az adatméret
  • A hozam a legjobb választás, ha nagyobb adathalmazokon gyorsabb végrehajtásra van szüksége
  • Használja a hozamot, ha nagy értékkészletet szeretne visszaadni a hívó függvénynek
  • A hozam hatékony módja nagy vagy végtelen adatok előállításának.

Hozam kontra hozam

Itt vannak a különbségek a hozam és a megtérülés között

Hozam Visszatérés
A Yield egy generátor objektumot ad vissza a hívónak, és a kód végrehajtása csak a generátor iterációja után indul el. A függvényben a visszatérés a függvény végrehajtásának vége, és egyetlen értéket kap vissza a hívó.
Amikor a függvény meghívódik, és találkozik a hozam kulcsszóval, a függvény végrehajtása leáll. A generátor objektumot visszaküldi a hívónak. A függvény végrehajtása csak a generátor objektum végrehajtásakor indul el. A függvény meghívásakor a végrehajtás elindul, és az értéket visszaadja a hívónak, ha van return kulcsszó. A függvényen belüli visszatérés a függvény végrehajtásának végét jelzi.
hozam kifejezés kifejezést adja vissza
A hozamkulcsszó használatakor nincs memóriahasználat. A visszaadott értékhez a memória le van foglalva.
Nagyon hasznos, ha hatalmas adatmennyiséggel kell megküzdenie, mivel a memória nincs kihasználva. Kényelmes nagyon kis adatmérethez.
A teljesítmény jobb, ha a hozam kulcsszót nagy adatmérethez használja. Sok memóriát használnak, ha az adatok mérete hatalmas, ami akadályozza a teljesítményt.
A végrehajtási idő gyorsabb nagy adatméret esetén hozam esetén. A felhasznált végrehajtási idő több, mivel extra feldolgozás történik arra az esetre, ha az adat mérete nagy, akkor kis adatméret esetén jól működik.

Összegzésként

  • A pythonban a hozam kulcsszó úgy működik, mint egy return, azzal az egyetlen különbséggel, hogy ahelyett, hogy értéket adna vissza, egy generátor függvényt ad vissza a hívónak.
  • A generátor az iterátor egy speciális típusa, amely használat után nem lesz többé elérhető. Az értékek nem tárolódnak a memóriában, és csak híváskor érhetők el.
  • A generátor értékei a for-in, list() és next() metódusokkal olvashatók ki.
  • A fő különbség a hozam és a megtérülés között az, hogy a hozam egy generátor függvényt ad vissza a hívónak, a return pedig egyetlen értéket ad a hívónak.
  • A Yield egyik értéket sem tárolja a memóriában, és az az előnye, hogy nagy adatméret esetén hasznos, mivel egyik érték sem tárolódik a memóriában.
  • A teljesítmény jobb, ha a hozam kulcsszót használja, összehasonlítva a nagy adatmennyiség megtérülésével.