Hasilkan Python Tutorial: Generator & Contoh Hasil vs Pengembalian

Apa itu Python menghasilkan?

Kata kunci hasil di python berfungsi seperti pengembalian dengan satu-satunya

perbedaannya adalah alih-alih mengembalikan nilai, ia memberikan kembali objek generator ke pemanggil.

Ketika suatu fungsi dipanggil dan rangkaian eksekusi menemukan kata kunci yield dalam fungsi tersebut, eksekusi fungsi berhenti pada baris tersebut dan mengembalikan objek generator kembali ke pemanggil.

Sintaksis

yield expression

Description

Python yield mengembalikan objek generator. Generators adalah fungsi khusus yang harus diulang untuk mendapatkan nilainya.

Kata kunci yield mengubah ekspresi yang diberikan menjadi fungsi generator yang menghasilkan objek generator. Untuk mendapatkan nilai objek, objek tersebut harus diulang untuk membaca nilai yang diberikan ke yield.

Contoh: Metode Hasil

Berikut adalah contoh sederhana hasil. Fungsi testyield() memiliki kata kunci hasil dengan string “Selamat datang di Guru99 Python Tutorial“. Saat fungsi tersebut dipanggil, output akan dicetak dan memberikan objek generator, bukan nilai sebenarnya.

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

Keluaran:

<generator object testyield at 0x00000028265EB9A8>

Output yang diberikan adalah objek generator, yang memiliki nilai yang telah kita berikan untuk dihasilkan.

Tapi kita tidak mendapatkan pesan yang harus kita berikan untuk menghasilkan output!

Untuk mencetak pesan yang diberikan kepada yield harus mengulangi objek generator seperti yang ditunjukkan pada contoh di bawah ini:

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

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

Keluaran:

Welcome to Guru99 Python Tutorials

Apa Generators di Python?

Generators adalah fungsi yang mengembalikan objek generator yang dapat diulang. Nilai dari objek generator diambil satu per satu, bukan seluruh daftar sekaligus, sehingga untuk mendapatkan nilai sebenarnya, Anda dapat menggunakan for-loop, menggunakan metode next() atau list().

Menggunakan Generator fungsi

Anda dapat membuat generator menggunakan fungsi generator dan menggunakan ekspresi generator.

Fungsi generator seperti fungsi normal, hanya saja fungsi tersebut tidak memiliki nilai balik, tetapi memiliki kata kunci yield.

Untuk membuat fungsi generator, Anda harus menambahkan kata kunci yield. Contoh berikut menunjukkan cara membuat fungsi generator.

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

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

Keluaran:

H
E
L
L
O

Perbedaan antara fungsi Normal v/s Generator fungsi.

Mari kita pahami bagaimana fungsi generator berbeda dari fungsi normal.

Ada 2 fungsi normal_test() dan generator_test().

Kedua fungsi tersebut seharusnya mengembalikan string “Hello World”. Normal_test() menggunakan return dan generator_test() menggunakan 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

Keluaran:

Hello World
<generator object generator_test at 0x00000012F2F5BA20>

Output menunjukkan bahwa ketika Anda memanggil fungsi normal normal_test(), ia mengembalikan string Hello World. Untuk fungsi generator dengan kata kunci yield, ia mengembalikan dan bukan senarnya.

Inilah perbedaan utama antara fungsi generator dan fungsi normal. Sekarang, untuk mendapatkan nilai dari objek generator, kita perlu menggunakan objek di dalam for loop atau menggunakan metode next() atau menggunakan list().

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

Satu lagi perbedaan yang ditambahkan ke fungsi normal v/s fungsi generator adalah ketika Anda memanggil fungsi normal, eksekusi akan dimulai dan berhenti ketika sampai di kembali dan nilainya dikembalikan ke pemanggil. Jadi ketika eksekusi dimulai, Anda tidak dapat menghentikan fungsi normal di antaranya dan hanya akan berhenti ketika menemukan kata kunci return.

Namun dalam kasus fungsi generator, setelah eksekusi dimulai saat memperoleh yield pertama, eksekusi akan berhenti dan mengembalikan objek generator. Anda dapat menggunakan objek generator untuk memperoleh nilai dan juga, menjeda dan melanjutkan kembali sesuai kebutuhan Anda.

Bagaimana cara membaca nilai dari generator?

Anda dapat membaca nilai dari objek generator menggunakan list(), for-loop dan menggunakan metode next().

Menggunakan : daftar()

Daftar adalah objek yang dapat diulang yang elemen-elemennya berada di dalam tanda kurung. Menggunakan list() pada objek generator akan memberikan semua nilai yang dimiliki generator.

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

Keluaran:

[0, 2, 4, 6, 8]

Menggunakan : untuk-dalam

Dalam contoh, terdapat fungsi yang didefinisikan even_numbers() yang akan memberikan Anda semua angka genap untuk n yang didefinisikan. Panggilan ke fungsi even_numbers() akan mengembalikan objek generator, yang digunakan di dalam for-loop.

Contoh:

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)

Keluaran:

0
2
4
6
8

Menggunakan selanjutnya()

Metode next() akan memberi Anda item berikutnya dalam daftar, array, atau objek. Setelah daftar kosong, dan jika next() dipanggil, ia akan mengembalikan kesalahan dengan sinyal stopIteration. Kesalahan ini, dari next() menunjukkan bahwa tidak ada lagi item dalam daftar.

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

Keluaran:

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

Generators adalah Penggunaan satu kali

Jika menggunakan generator, generator tersebut hanya dapat digunakan satu kali. Jika Anda mencoba menggunakannya lagi, generator tersebut akan kosong.

Sebagai contoh:

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

Keluaran:

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

Jika Anda ingin keluarannya digunakan kembali, Anda harus membuat panggilan agar berfungsi kembali.

Contoh: Generators dan hasil untuk Deret Fibonacci

Contoh berikut menunjukkan cara menggunakan generator dan yield di Python. Contohnya akan menghasilkan deret Fibonacci.

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)

Keluaran:

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

Contoh: Memanggil Fungsi dengan Yield

Dalam contoh ini akan melihat cara memanggil fungsi dengan hasil.

Contoh di bawah ini memiliki fungsi bernama test() yang mengembalikan kuadrat dari angka yang diberikan. Ada fungsi lain yang disebut getSquare() yang menggunakan test() dengan kata kunci hasil. Outputnya memberikan nilai kuadrat untuk rentang angka tertentu.

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)

Keluaran:

0
1
4
9
16
25
36
49
64
81

Kapan menggunakan Hasil Daripada Pengembalian Python

Python3 Hasil kata kunci mengembalikan generator ke pemanggil dan eksekusi kode dimulai hanya ketika generator diulang.

A kembali dalam suatu fungsi adalah akhir dari eksekusi fungsi, dan satu nilai diberikan kembali kepada pemanggil.

Di sini, adalah situasi ketika Anda harus menggunakan Yield daripada Return

  • Gunakan hasil daripada pengembalian ketika ukuran datanya besar
  • Hasil adalah pilihan terbaik saat Anda ingin eksekusi lebih cepat pada kumpulan data besar
  • Gunakan hasil ketika Anda ingin mengembalikan sejumlah besar nilai ke fungsi pemanggil
  • Hasil adalah cara efisien untuk menghasilkan data yang besar atau tidak terbatas.

Hasil vs. Pengembalian

Berikut perbedaan Yield dan Return

Menghasilkan Pengembalian
Yield mengembalikan objek generator ke pemanggil, dan eksekusi kode dimulai hanya ketika generator diulang. Pengembalian suatu fungsi adalah akhir dari eksekusi fungsi, dan satu nilai diberikan kembali kepada pemanggil.
Ketika fungsi dipanggil dan menemukan kata kunci yield, eksekusi fungsi berhenti. Fungsi mengembalikan objek generator ke pemanggil. Eksekusi fungsi akan dimulai hanya ketika objek generator dieksekusi. Saat fungsi dipanggil, eksekusi dimulai dan nilainya diberikan kembali ke pemanggil jika ada kata kunci return. Pengembalian di dalam fungsi menandai akhir dari eksekusi fungsi.
ekspresi hasil ekspresi kembali
Tidak ada memori yang digunakan ketika kata kunci hasil digunakan. Memori dialokasikan untuk nilai yang dikembalikan.
Sangat berguna jika Anda harus berurusan dengan ukuran data yang besar karena memori tidak terpakai. Nyaman untuk ukuran data yang sangat kecil.
Performanya akan lebih baik jika kata kunci hasil digunakan untuk ukuran data yang besar. Banyak memori yang terpakai jika ukuran datanya besar sehingga akan menghambat kinerja.
Waktu eksekusi lebih cepat jika menghasilkan ukuran data yang besar. Waktu eksekusi yang digunakan lebih lama karena ada pemrosesan ekstra yang dilakukan jika ukuran data Anda besar, maka akan berfungsi dengan baik untuk ukuran data yang kecil.

Kesimpulan

  • Kata kunci yield dalam python berfungsi seperti return, dengan satu-satunya perbedaan adalah, alih-alih mengembalikan nilai, ia memberikan kembali fungsi generator ke pemanggil.
  • Generator adalah jenis iterator khusus yang, setelah digunakan, tidak akan tersedia lagi. Nilainya tidak disimpan dalam memori dan hanya tersedia saat dipanggil.
  • Nilai dari generator dapat dibaca menggunakan metode for-in, list() dan next().
  • Perbedaan utama antara yield dan return adalah bahwa yield mengembalikan fungsi generator ke pemanggil dan return memberikan nilai tunggal ke pemanggil.
  • Yield tidak menyimpan nilai apa pun di memori, dan keuntungannya adalah berguna ketika ukuran datanya besar, karena tidak ada nilai yang disimpan di memori.
  • Performanya lebih baik jika menggunakan kata kunci hasil dibandingkan return untuk ukuran data yang besar.