Python Eğitiminde Verim: Oluşturucu ve Getiri - Getiri Örneği

İçindekiler:

Anonim

Python verimi nedir?

Python'daki getiri anahtar kelimesi, yalnızca

aradaki fark, bir değer döndürmek yerine, arayana bir jeneratör nesnesi geri vermesidir.

Bir işlev çağrıldığında ve yürütme iş parçacığı işlevde bir getiri anahtar sözcüğü bulduğunda, işlev yürütme o satırın kendisinde durur ve arayana bir jeneratör nesnesi döndürür.

Bu Python eğitiminde şunları öğreneceksiniz:

  • Python verimi nedir?
  • Sözdizimi
  • Python'daki Jeneratörler nedir?
  • Normal işlev v / s Jeneratör işlevi arasındaki fark.
  • Jeneratörden değerler nasıl okunur?
  • Jeneratörler tek seferlik kullanımdır
  • Örnek: Fibonacci Serisi için üreteçler ve verim
  • Örnek: Getiri ile İşlevi Çağırma
  • Python'da Geri Dönüş Yerine Getiri Ne Zaman Kullanılır?
  • Getiri vs Getiri

Sözdizimi

yield expression

Açıklama

Python verimi bir jeneratör nesnesi döndürür. Üreteçler, değerleri almak için yinelenmesi gereken özel işlevlerdir.

Verim anahtar sözcüğü, verilen ifadeyi bir üretici nesnesini geri veren bir üretici işlevine dönüştürür. Nesnenin değerlerini elde etmek için, verime verilen değerleri okumak için yinelenmesi gerekir.

Örnek: Verim Yöntemi

İşte basit bir verim örneği. Testyield () işlevi, "Guru99 Python Öğreticilerine Hoş Geldiniz" dizesini içeren bir verim anahtar kelimesine sahiptir. İşlev çağrıldığında, çıktı yazdırılır ve gerçek değer yerine bir üretici nesnesi verir.

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

Çıktı:

Verilen çıktı, vermek için verdiğimiz değere sahip bir jeneratör nesnesidir.

Ama çıktıyı vermek için vermemiz gereken mesajı alamıyoruz!

Verime verilen mesajı yazdırmak için, aşağıdaki örnekte gösterildiği gibi jeneratör nesnesini yinelemeniz gerekecektir:

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

Çıktı

Welcome to Guru99 Python Tutorials

Python'daki Jeneratörler nedir?

Üreteçler, yinelenebilir bir üreteç nesnesi döndüren işlevlerdir. Oluşturucu nesnesinden gelen değerler, tam liste yerine teker teker getirilir ve bu nedenle gerçek değerleri elde etmek için next () veya list () yöntemini kullanarak bir for-loop kullanabilirsiniz.

Jeneratör işlevini kullanma

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

Bir üreteç işlevi normal bir işleve benzer, bir dönüş değerine sahip olmak yerine bir getiri anahtar sözcüğüne sahip olacaktır.

Bir üretici işlevi oluşturmak için bir getiri anahtar sözcüğü eklemeniz gerekir. Aşağıdaki örnekler, bir jeneratör işlevinin nasıl oluşturulacağını gösterir.

def generator():yield "H"yield "E"yield "L"yield "L"yield "O"test = generator()for i in test:print(i)

Çıktı:

HELLO

Normal işlev v / s Jeneratör işlevi arasındaki fark.

Bir jeneratör işlevinin normal bir işlevden ne kadar farklı olduğunu anlayalım.

Normal_test () ve generator_test () olmak üzere 2 işlev vardır.

Her iki işlevin de "Merhaba Dünya" dizesini geri döndürmesi beklenir. Normal_test () return kullanıyor ve generator_test () verim kullanıyor.

# Normal functiondef normal_test():return "Hello World"#Generator functiondef generator_test():yield "Hello World"print(normal_test()) #call to normal functionprint(generator_test()) # call to generator function

Çıktı:

Hello World

Çıktı, normal işlevi normal_test () çağırdığınızda Hello World dizgesini döndürdüğünü gösterir. Verim anahtar kelimeli bir üretici işlevi için, dizeyi değil, döndürür.

Bu, bir jeneratör işlevi ile normal bir işlev arasındaki temel farktır. Şimdi, jeneratör nesnesinden değeri elde etmek için ya döngü içindeki nesneyi ya da next () yöntemini ya da list () yöntemini kullanmalıyız.

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

Normal işlev v / s üreteci işlevine eklenecek bir başka fark, normal bir işlevi çağırdığınızda yürütmenin başlayıp geri döndüğünde ve değerin arayan kişiye geri döndüğünde durmasıdır. Dolayısıyla, çalıştırma başladığında normal işlevi arada durduramazsınız ve yalnızca return anahtar sözcüğüyle karşılaştığında durur.

Ancak, jeneratör işlevi durumunda, yürütme ilk verimi aldığında başladığında yürütmeyi durdurur ve jeneratör nesnesini geri verir. Değerleri almak için jeneratör nesnesini kullanabilir ve ayrıca ihtiyacınıza göre duraklatabilir ve devam ettirebilirsiniz.

Jeneratörden değerler nasıl okunur?

Bir list (), for-loop ve next () yöntemini kullanarak bir jeneratör nesnesinden değerleri okuyabilirsiniz.

Kullanarak: list ()

Bir liste, elemanları parantez içinde olan yinelenebilir bir nesnedir. List () bir jeneratör nesnesinde kullanılması, oluşturucunun tuttuğu tüm değerleri verir.

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

Çıktı:

[0, 2, 4, 6, 8]

Kullanma: for-in

Örnekte, tanımlı n için size tüm çift sayıları verecek çift_sayılar () tanımlı bir işlev vardır. Even_numbers () işlevine yapılan çağrı, for-loop içinde kullanılan bir jeneratör nesnesi döndürür.

Misal:

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

Çıktı:

02468

Next () kullanarak

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

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

Çıktı:

02468Traceback (most recent call last):File "main.py", line 11, in print(next(num))StopIteration

Jeneratörler tek seferlik kullanımdır

Jeneratörler söz konusu olduğunda 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 xnum = even_numbers(10)for i in num:print(i)print("\n")print("Calling the generator again: ", list(num))

Çıktı:

02468Calling the generator again: []

Çıkışın tekrar kullanılmasını istemeniz durumunda, tekrar çalışması için çağrıyı yapmanız gerekecektir.

Örnek: Fibonacci Serisi için üreteçler ve verim

Aşağıdaki örnek, Python'da oluşturucular ve verimin nasıl kullanılacağını gösterir. Örnek, Fibonacci serisini oluşturacaktır.

def getFibonnaciSeries(num):c1, c2 = 0, 1count = 0while count < num:yield c1c3 = c1 + c2c1 = c2c2 = c3count += 1fin = getFibonnaciSeries(7)print(fin)for i in fin:print(i)

Çıktı:

0112358

Örnek: Getiri ile İşlevi Çağırma

Bu örnekte, verim ile bir fonksiyonun nasıl çağrılacağını göreceğiz.

Aşağıdaki örnek, verilen sayının karesini döndüren test () adında bir işleve sahiptir. GetSquare () adında test () ile verim anahtar sözcüğünü kullanan başka bir işlev daha vardır. Çıktı, verilen sayı aralığı için kare değeri verir.

def test(n):return n*ndef getSquare(n):for i in range(n):yield test(i)sq = getSquare(10)for i in sq:print(i)

Çıktı:

0149162536496481

Python'da Geri Dönüş Yerine Getiri Ne Zaman Kullanılır?

Python3 Yield anahtar sözcüğü, arayana bir jeneratör döndürür ve kodun yürütülmesi yalnızca jeneratör yinelendiğinde başlar.

Bir işlevdeki bir dönüş , işlevin yürütülmesinin sonudur ve arayan kişiye tek bir değer geri verilir.

İşte Getiri yerine Getiri kullanmanız gereken durum

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

Getiri vs Getiri

Getiri ve Getiri arasındaki farklar şunlardır

Yol ver Dönüş
Verim, arayana bir jeneratör nesnesi döndürür ve kodun yürütülmesi yalnızca jeneratör yinelendiğinde başlar. Bir işlevdeki bir dönüş, işlevin yürütülmesinin sonudur ve arayan kişiye tek bir değer geri verilir.
İşlev çağrıldığında ve getiri anahtar sözcüğüyle karşılaştığında, işlevin yürütülmesi durur. Jeneratör nesnesini arayana geri döndürür. İşlevin yürütülmesi yalnızca jeneratör nesnesi yürütüldüğünde başlayacaktır. İşlev çağrıldığında, yürütme başlar ve return anahtar sözcüğü varsa, değeri arayan kişiye geri verilir. İşlevin içindeki dönüş, işlevin yürütülmesinin sonunu gösterir.
verim ifadesi dönüş ifadesi
Verim 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 çok büyük veri boyutuyla uğraşmanız gerekiyorsa çok kullanışlıdır. Çok küçük veri boyutu için uygun.
Verim anahtar kelimesi büyük veri boyutu için kullanılırsa performans daha iyidir. Veri boyutu performansı engelleyecek kadar büyükse çok fazla bellek kullanılır.
Büyük veri boyutu için verim olması durumunda yürütme süresi daha hızlıdır. Kullanılan yürütme süresi daha fazladır, çünkü veri boyutunuz çok büyükse, küçük veri boyutu için daha iyi çalışacaktır.

Özet:

  • Python'daki getiri anahtar sözcüğü bir dönüş gibi çalışır, tek farkı bir değer döndürmek yerine arayana bir üreteç işlevi vermesidir.
  • Bir jeneratör, bir kez kullanıldığında tekrar kullanılamayacak özel bir yineleyici türüdür. Değerler hafızaya kaydedilmez ve yalnızca arandığında kullanılabilir.
  • Üreticiden gelen değerler for-in, list () ve next () yöntemi kullanılarak okunabilir.
  • Getiri ve getiri arasındaki temel fark, verimin, arayana bir jeneratör işlevini geri döndürmesi ve dönüşün, arayan kişiye tek bir değer vermesidir.
  • Verim, hiçbir değeri bellekte saklamaz ve avantajı, veri boyutu büyük olduğunda, değerlerin hiçbiri bellekte saklanmadığından yararlı olmasıdır.
  • Verim anahtar sözcüğü, büyük veri boyutu döndürmeye kıyasla kullanılırsa performans daha iyidir.