Teslim ol Python Öğretici: Generator & Getiri ve Getiri Örneği

Nedir? Python teslim olmak?

Python'daki verim anahtar sözcüğü yalnızca bir dönüş gibi çalışır.

farkı, bir değer döndürmek yerine, çağırana bir üreteç nesnesi vermesidir.

Bir fonksiyon çağrıldığında ve yürütme iş parçacığı fonksiyonda bir yield anahtar sözcüğü bulduğunda, fonksiyon yürütmesi o satırda durur ve çağırana bir üreteç nesnesi döndürür.

Sözdizimi

yield expression

Açıklama

Python yield bir üreteç nesnesi döndürür. Generatordeğerleri elde etmek için yinelenmesi gereken özel işlevlerdir.

yield anahtar sözcüğü verilen ifadeyi bir üreteç nesnesi veren bir üreteç fonksiyonuna dönüştürür. Nesnenin değerlerini almak için, yield'e verilen değerleri okumak için yineleme yapılması gerekir.

Örnek: Getiri Yöntemi

İşte verimin basit bir örneği. testyield() işlevi, "Guru99'a Hoş Geldiniz" dizesini içeren bir verim anahtar sözcüğüne sahiptir. Python Öğreticiler“. Fonksiyon çağrıldığında çıktı yazdırılır ve gerçek değer yerine bir üreteç nesnesi verir.

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

Çıktı:

<generator object testyield at 0x00000028265EB9A8>

Verilen çıktı, yield'e verdiğimiz değeri taşıyan bir üreteç nesnesidir.

Ancak çıktı almak için vermemiz gereken mesajı alamıyoruz!

Verime verilen mesajı yazdırmak için aşağıdaki örnekte gösterildiği gibi generator nesnesini yinelemek gerekecektir:

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

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

Çıktı:

Welcome to Guru99 Python Tutorials

All ON XNUMX İmplant Tedavisi Nasıl Uygulanır? Generators Python?

Generators, yinelemeli bir üreteç nesnesi döndüren işlevlerdir. Üreteç nesnesindeki değerler, tam listeyi bir arada almak yerine birer birer alınır ve bu nedenle gerçek değerleri almak için next() veya list() yöntemini kullanarak bir for döngüsü kullanabilirsiniz.

kullanma Generator işlev

Jeneratör fonksiyonunu ve jeneratör ifadesini kullanarak jeneratörler oluşturabilirsiniz.

Bir üreteç fonksiyonu normal bir fonksiyon gibidir, geri dönüş değeri yerine yield anahtar kelimesine sahip olacaktır.

Bir jeneratör fonksiyonu oluşturmak için bir yield anahtar sözcüğü eklemeniz gerekecektir. Aşağıdaki örnekler bir jeneratör fonksiyonunun nasıl oluşturulacağını göstermektedir.

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

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

Çıktı:

H
E
L
L
O

Normal fonksiyon v/s arasındaki fark Generator fonksiyonu.

Bir jeneratör fonksiyonunun normal bir fonksiyondan nasıl farklı olduğunu anlamaya çalışalım.

normal_test() ve generator_test() olmak üzere 2 adet fonksiyon bulunmaktadır.

Her iki fonksiyonun da "Merhaba Dünya" dizesini geri döndürmesi gerekiyor. normal_test() return'ü kullanıyor ve generator_test() yield'i kullanıyor.

# 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

Çıktı:

Hello World
<generator object generator_test at 0x00000012F2F5BA20>

Çıktı, normal_test() normal fonksiyonunu çağırdığınızda Hello World dizesini döndürdüğünü gösterir. yield anahtar sözcüğüne sahip bir üreteç fonksiyonu için şunu döndürür: ve ip değil.

Bu, bir üreteç fonksiyonu ile normal bir fonksiyon arasındaki temel farktır. Şimdi üreteç nesnesinden değeri almak için ya for döngüsü içindeki nesneyi kullanmamız ya da next() metodunu kullanmamız ya da list()'i kullanmamız gerekir.

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

Normal fonksiyona v/s jeneratör fonksiyonuna eklenecek bir diğer fark, normal bir fonksiyonu çağırdığınızda yürütmenin başlaması ve bittiği zaman durmasıdır. dönüş ve değer arayan kişiye döndürülür. Yani yürütme başladığında aradaki normal işlevi durduramazsınız ve yalnızca return anahtar sözcüğüyle karşılaştığında duracaktır.

Ancak jeneratör fonksiyonu durumunda, yürütme başladığında ilk verimi aldığında yürütmeyi durdurur ve jeneratör nesnesini geri verir. Jeneratör nesnesini değerleri almak ve ayrıca gereksinimlerinize göre duraklatmak ve geri almak için kullanabilirsiniz.

Jeneratörden değerler nasıl okunur?

Bir generator nesnesinden değerleri list(), for döngüsü ve next() metodunu kullanarak okuyabilirsiniz.

Kullanımı: list()

Liste, elemanları parantez içinde bulunan yinelebilir bir nesnedir. Bir üreteç nesnesinde list() kullanmak, üretecin tuttuğu tüm değerleri verecektir.

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

Çıktı:

[0, 2, 4, 6, 8]

Kullanımı: içeri için

Örnekte, tanımlanan n için tüm çift sayıları verecek even_numbers() fonksiyonu tanımlanmıştır. even_numbers() fonksiyonuna yapılan çağrı, for döngüsü içinde kullanılan bir üreteç nesnesi döndürecektir.

Örnek:

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)

Çıktı:

0
2
4
6
8

next()'i kullanma

next() yöntemi size listedeki, dizideki veya nesnedeki bir sonraki öğeyi verecektir. Liste boşaldığında next() çağrılırsa stopIteration sinyaliyle bir hata verecektir. next() öğesindeki bu hata, listede başka öğe olmadığını gösterir.

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

Çıktı:

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

Generatortek kullanımlıktır

Jeneratörler için sadece bir kez kullanılabilirler. Tekrar kullanmayı denerseniz boş olacaktır.

Örneğin:

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

Çıktı:

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

Çıktının tekrar kullanılmasını istemeniz durumunda, işlev çağrısını tekrar yapmanız gerekecektir.

Örnek: GeneratorFibonacci Serisi için s ve getiri

Aşağıdaki örnek, jeneratörlerin ve verimin nasıl kullanılacağını göstermektedir Python. Örnek Fibonacci serisini oluşturacaktır.

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)

Çıktı:

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

Örnek: Verim ile Fonksiyonun Çağrılması

Bu örnekte bir işlevin verimle nasıl çağrılacağını göreceğiz.

Aşağıdaki örnekte, verilen sayının karesini döndüren test() adı verilen bir işlev bulunmaktadır. getSquare() adında, verim anahtar sözcüğüyle birlikte test() işlevini kullanan başka bir işlev daha vardır. Çıktı, verilen sayı aralığı için kare değerini verir.

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)

Çıktı:

0
1
4
9
16
25
36
49
64
81

Getiri Yerine Getiri ne zaman kullanılmalı? Python

Python3 Verim Anahtar sözcüğü çağırana bir üreteç döndürür ve kodun yürütülmesi yalnızca üreteç yinelendiğinde başlar.

A dönüş Bir fonksiyonda, fonksiyonun yürütülmesinin sonudur ve çağırana tek bir değer geri verilir.

İşte Return yerine Yield kullanmanız gereken durum

  • Veri boyutu büyük olduğunda getiri yerine getiriyi kullanın
  • Verim, büyük veri kümelerinde yürütmenizin daha hızlı olmasını istediğinizde en iyi seçimdir
  • Çağıran işleve büyük bir değer kümesi döndürmek istediğinizde verimi kullanın
  • Verim, büyük veya sonsuz veri üretmenin etkili bir yoludur.

Getiri ve Getiri

İşte Verim ve Getiri arasındaki farklar

Yol ver Dönüş
Yield, çağırana bir üreteç nesnesi döndürür ve kodun yürütülmesi yalnızca üreteç yinelendiğinde başlar. Bir fonksiyondaki geri dönüş, fonksiyonun yürütülmesinin sonudur ve çağırana tek bir değer geri verilir.
Fonksiyon çağrıldığında ve yield anahtar sözcüğüyle karşılaştığında, fonksiyon yürütmesi durur. Jeneratör nesnesini çağırana geri döndürür. Fonksiyon yürütmesi yalnızca jeneratör nesnesi yürütüldüğünde başlayacaktır. Fonksiyon çağrıldığında yürütme başlar ve eğer return anahtar sözcüğü varsa değer çağırana geri verilir. Fonksiyonun içindeki dönüş, fonksiyonun yürütülmesinin sonunu işaret eder.
verim ifadesi dönüş ifadesi
Getiri anahtar sözcüğü kullanıldığında bellek kullanılmaz. Bellek, döndürülen değer için ayrılır.
Bellek kullanılmadığından büyük veri boyutlarıyla uğraşmanız gerekiyorsa çok kullanışlıdır. Çok küçük veri boyutları için uygundur.
Büyük veri boyutu için verim anahtar kelimesi kullanılırsa performans daha iyi olur. Veri boyutu performansı engelleyecek kadar büyükse, çok fazla bellek kullanılır.
Büyük veri boyutu elde edilmesi durumunda yürütme süresi daha hızlıdır. Veri boyutunuz çok büyükse, küçük veri boyutu için iyi çalışacaktır, çünkü kullanılan yürütme süresi daha fazladır.

ÖZET

  • Python'daki yield anahtar kelimesi return gibi çalışır, tek farkı bir değer döndürmek yerine çağırana bir üreteç fonksiyonu geri vermesidir.
  • Bir jeneratör, bir kez kullanıldığında tekrar kullanılamayacak özel bir yineleyici türüdür. Değerler bellekte saklanmaz ve yalnızca çağrıldığında kullanılabilir.
  • Jeneratörden gelen değerler for-in, list() ve next() metodları kullanılarak okunabilir.
  • yield ile return arasındaki temel fark, yield'in çağırana bir üreteç fonksiyonu döndürmesi, return'ün ise çağırana tek bir değer vermesidir.
  • Verim, değerlerin hiçbirini hafızada saklamaz ve avantajı, veri boyutu büyük olduğunda, değerlerin hiçbiri hafızada saklanmadığı için yararlı olmasıdır.
  • Büyük veri boyutuna ilişkin getiriyle karşılaştırıldığında verim anahtar sözcüğünün kullanılması durumunda performans daha iyidir.