Return vs Yield

Posted on November 10th, 2024
Intermediate
...

Dalam Python, terdapat dua jenis cara pengembalian nilai dari sebuah function, yaitu Return dan Yield. Perbedaan dari kedua syntax tersebut adalah Return akan mengembalikan nilai dari sebuah function dan menghentikan jalannya function tersebut, sedangkan Yield akan mengembalikan nilai dari sebuah function dan menjeda function tersebut untuk berhenti.

Perhatikan contoh code berikut

def absen():
   return "Diana"
   return "Kristine"
   
a = absen()
print(a)

Ketika kode dijalankan, function akan menghasilkan nilai "Diana" dan menghentikan jalannya function.

Sekarang perhatikan contoh code berikut

def absen():
   yield "Diana"
   yield "Kristine"
   
a = absen()
print(a)

Ketika kode dijalankan, function akan menghasilkan class Generator yang dapat kita lakukan iterasi. Cobalah kode berikut ini

def absen():
   yield "Diana"
   yield "Kristine"
   
a = absen()
print(next(a))
print(next(a))

Kode diatas akan mengembalikan nilai “Diana” dan “Kristine”. Sama halnya apabila kita lakukan iterasi dengan for loop

def absen():
   yield "Diana"
   yield "Kristine"
   
a = absen()
for name in a:
   print(name)

Generator as Lazy Iterator

Penggunaan Yield atau biasa disebut function generator dapat menghasilkan memory eficiency dalam pemrograman. Andaikan kita mempunyai list dengan jumlah data yang besar dan kita tidak selalu membutuhkan keseluruhan data tersebut, maka Generator memiliki peran yang sangat bagus. Lihatlah perbandingan kode berikut

import sys

regular_list = [i ** 2 for i in range (1000000)]
print(sys.getsizeof(regular_list))

generator = (i ** 2 for i in range (1000000))
print(sys.getsizeof(generator))

Kode sys.getsizeof() mengembalikan jumlah memory yang dipakai oleh object. Terlihat bahwa object generator menghasilkan memory yang lebih kecil dibandingkan regular_list. 

Generator juga dapat di asumsikan sebagai lazy iterator, dimana Generator bekerja ketika dilakukan proses iterasi dibandingkan menghasilkan data besar secara keseluruhan. Perhatikan contoh kode berikut

def read_large_file(file_path):
   with open(file_path, 'r') as file:
       lines = file.readlines()
   return lines
   
lines = read_large_file('large_file.txt')
for line in lines:
   print(line.strip())

Kode diatas akan membaca file txt yang besar secara keseluruhan dan memberatkan memory yang digunakan. Cobalah kode berikut untuk melakukan perbaikan

def read_large_file(file_path):
    with open(file_path, 'r') as file:
        for line in file:
            yield line

file_gen = read_large_file('large_file.txt')
for line in file_gen:
    print(line.strip())

Kode diatas akan membaca file txt yang besar secara berurutan (tidak keseluruhan) dan meringankan memory yang digunakan.