Generator Python dan Penjelasan Hasil: Menghemat Memori Dengan Contoh Nyata
Generator menghasilkan nilai satu per satu alih-alih membuat seluruh daftar di memori. Perhatikan dengan tepat bagaimana hasil menjeda suatu fungsi, lihat perbedaan memori yang kami ukur, dan buat pipeline data kecil.
- Fungsi yang berisi
yieldmengembalikan generator, dan isi fungsi tersebut tidak akan berjalan hingga Anda meminta nilai. yieldmenjeda fungsi dan mempertahankan status lokalnya hingga permintaan berikutnya.- Generator menggunakan sejumlah kecil memori tetap, berapapun banyaknya nilai yang dihasilkannya.
- Sebuah generator hanya dapat dikonsumsi satu kali, yang merupakan jebakan paling umum.
Bayangkan memuat file log 10 GB ke dalam daftar hanya untuk menemukan kesalahannya. Program Anda mungkin kehabisan memori sebelum dapat menemukannya. Generator Python menyelesaikan masalah tersebut dengan menghasilkan nilai sesuai permintaan, satu per satu, sehingga Anda dapat mengerjakan data yang sangat besar atau bahkan tanpa akhir dengan hampir tanpa memori.
Panduan ini menunjukkan apa yang sebenarnya terjadi ketika generator bekerja, langkah demi langkah. Kami menjalankan setiap contoh di Python 3.13, dan output berasal dari proses tersebut. Akan sangat membantu jika Anda sudah terbiasa dengan fungsi dan loop, yang dibahas dalam tutorial Python untuk pemula kami.
Apa itu generator?
Generator adalah jenis iterator khusus yang Anda buat dengan menulis fungsi menggunakan yield. Fungsi apa pun dengan yield di dalamnya secara otomatis menjadi fungsi generator, dan memanggilnya memberi Anda objek generator daripada menjalankan kode.
def count_up(limit):
print("starting")
n = 1
while n <= limit:
yield n
n += 1
print("finished")
gen = count_up(2)
print(gen)
# <generator object count_up at 0x...>
Perhatikan bahwa “mulai” tidak dicetak. Memanggil fungsi tersebut hanya membuat generator. Belum ada apa pun di dalam yang berjalan.
Cara kerja hasil, langkah demi langkah
Setiap panggilan ke next() menjalankan fungsi hingga mencapai yield, mengembalikan nilai tersebut, dan berhenti di tempatnya. Panggilan berikutnya dilanjutkan tepat setelah baris itu, dengan setiap variabel lokal tetap utuh.
print(next(gen))
# starting
# 1
print(next(gen))
# 2
next(gen)
# finished
# StopIteration
Ikuti hasilnya dengan cermat. “mulai” hanya muncul pada next() pertama. Pada putaran kedua, eksekusi dilanjutkan dari titik berhentinya, sehingga n masih tersedia dan menjadi 2. Pada putaran ketiga, perulangan berakhir, cetakan “selesai”, fungsi tersebut hilang, dan Python memunculkan StopIteration untuk menandakan bahwa tidak ada lagi yang tersisa.
Anda jarang menelepon next() diri Anda sendiri. Perulangan for melakukannya untuk Anda dan menangani StopIteration dengan tenang, begitu pula list(), sum() dan fungsi serupa:
print(list(count_up(3)))
# starting
# finished
# [1, 2, 3]
hasil vs pengembalian
| Aspek | kembali |
menghasilkan |
|---|---|---|
| Apa fungsinya | Mengakhiri fungsinya | Menjeda fungsi tersebut |
| Nilai-nilai yang dihasilkan | Satu hasil | Serangkaian, satu demi satu |
| negara bagian setempat | Dibuang | Diawetkan di antara nilai-nilai |
| Saat kode berjalan | Segera ketika dipanggil | Hanya ketika suatu nilai diminta |
| Memori untuk banyak nilai | Harus menahan semuanya | Memegang satu per satu |
Penundaan ini dikenal sebagai evaluasi malas: nilai dihitung hanya jika diperlukan. Sebuah return biasa di dalam generator mengakhirinya, yang memicu StopIteration.
Perbedaan memori, diukur
Kami membandingkan daftar satu juta kotak dengan generator yang setara, menggunakan sys.getsizeof:
import sys
squares_list = [n * n for n in range(1_000_000)]
squares_gen = (n * n for n in range(1_000_000))
print(sys.getsizeof(squares_list), sys.getsizeof(squares_gen))
# 8448728 200
Struktur daftarnya sendiri memakan waktu sekitar 8,4 MB, sedangkan generatornya hanya membutuhkan 200 byte di sistem kami. Kesenjangan sebenarnya bahkan lebih besar, karena getsizeof tidak menghitung objek bilangan bulat di dalam daftar. Ukuran generator juga tetap sama untuk satu miliar item, karena generator hanya menyimpan keadaan saat ini dan bukan hasilnya.
Namun ada trade-off. Daftar dapat digunakan kembali, diindeks, dan diukur dengan len(). Generator tidak menawarkan semua ini. Jika Anda memerlukan akses acak, atau Anda akan mengulang beberapa kali pada sejumlah kecil data, daftarnya lebih sederhana. Lihat panduan kami untuk Daftar Python vs Tuple vs Set untuk mengetahui lebih lanjut tentang jenis-jenis tersebut.
Ekspresi pembangkit
Untuk kasus sederhana, Anda tidak memerlukan suatu fungsi. Ekspresi generator terlihat seperti pemahaman daftar dengan tanda kurung bulat sebagai ganti tanda kurung siku:
squares = [n * n for n in range(5)] # builds a list now
squares = (n * n for n in range(5)) # produces values on demand
print(sum(n * n for n in range(5)))
# 30
Ketika ekspresi generator adalah satu-satunya argumen untuk suatu fungsi, seperti pada sum(), Anda dapat mengabaikan tanda kurung tambahan. Ini adalah kebiasaan yang rapi untuk menjumlahkan data yang besar, karena tidak ada daftar sementara yang dibuat.
Bangun saluran data
Di sinilah generator benar-benar bersinar. Generator kecil dapat dirangkai sehingga setiap item mengalir melalui setiap langkah, satu per satu:
def read_lines(lines):
for line in lines:
yield line.strip()
def only_errors(lines):
for line in lines:
if line.startswith("ERROR"):
yield line
def messages(lines):
for line in lines:
yield line.split(" ", 1)[1]
log = ["INFO started\n", "ERROR db down\n",
"ERROR disk full\n", "INFO stopped\n"]
print(list(messages(only_errors(read_lines(log)))))
# ['db down', 'disk full']
Setiap langkah melakukan satu pekerjaan kecil dan dapat diuji sendiri. Dalam penggunaan nyata, tukar daftar sampel dengan file yang terbuka, karena objek file dapat dibaca baris demi baris, seperti yang ditunjukkan oleh panduan kami untuk penanganan file Python. Bahkan log multi-gigabyte akan melewatinya dengan memori yang sangat sedikit.
Kiat: Sebuah pipeline tidak akan berfungsi sampai ada sesuatu yang menggunakannya. Membangun rantai itu instan. Pemrosesan terjadi hanya ketika Anda mengulang generator terakhir atau membungkusnya dalam panggilan seperti list().
Urutan tak terbatas
Daftar tidak boleh tak terbatas, namun generator bisa, karena ia hanya menghitung nilai berikutnya. Gunakan itertools.islice untuk mengambil sebanyak yang Anda perlukan:
import itertools
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
print(list(itertools.islice(fibonacci(), 8)))
# [0, 1, 1, 2, 3, 5, 8, 13]
Namun berhati-hatilah: pemanggilan list(fibonacci()) tanpa batas akan dijalankan hingga memori Anda hilang. Pola yang sama sesuai dengan generator ID, loop polling, dan hasil API yang diberi nomor halaman, di mana Anda mengambil halaman berikutnya hanya ketika halaman saat ini habis.
hasil dari dan batch
yield from beralih ke iterable lain, sehingga menghemat loop bersarang:
def chain_all(*groups):
for group in groups:
yield from group
print(list(chain_all([1, 2], (3, 4))))
# [1, 2, 3, 4]
Pola yang sangat praktis adalah membagi data menjadi kumpulan berukuran tetap, misalnya memasukkan ribuan baris ke dalam database sekaligus:
def batches(items, size):
batch = []
for item in items:
batch.append(item)
if len(batch) == size:
yield batch
batch = []
if batch:
yield batch
print(list(batches(range(7), 3)))
# [[0, 1, 2], [3, 4, 5], [6]]
if batch terakhir memastikan bahwa kelompok sisa yang lebih kecil tidak hilang. Python 3.12 dan yang lebih baru juga menyertakan itertools.batched, yang melakukan pekerjaan serupa.
kirim, tutup, dan bersihkan
Generator juga dapat menerima nilai. send() melanjutkan generator, dan nilainya menjadi hasil dari ekspresi yield. Anda harus menelepon next() terlebih dahulu untuk mencapai yield pertama:
def running_total():
total = 0
while True:
value = yield total
total += value
t = running_total()
next(t)
print(t.send(10), t.send(5))
# 10 15
Kebanyakan orang jarang membutuhkan ini. Kekhawatiran yang lebih umum adalah pembersihan. Jika Anda berhenti lebih awal, blok finally masih berjalan ketika generator ditutup:
def tracked():
try:
yield 1
yield 2
finally:
print("cleanup ran")
tr = tracked()
next(tr)
tr.close()
# cleanup ran
Pytest menggunakan ide ini: perlengkapan dengan yield menjalankan pembersihannya setelahnya, seperti yang ditunjukkan oleh tutorial pytest kami. Demikian pula, dekorator contextmanager perpustakaan standar mengubah generator menjadi blok with.
Generator di kelas
Menulis metode __iter__ sebagai generator adalah cara termudah untuk membuat kelas sendiri Anda dapat diubah. Bonusnya adalah setiap perulangan mendapat generator baru, sehingga objek dapat diulang berulang kali:
class Countdown:
def __init__(self, start):
self.start = start
def __iter__(self):
n = self.start
while n > 0:
yield n
n -= 1
c = Countdown(3)
print(list(c), list(c))
# [3, 2, 1] [3, 2, 1]
Kapan menggunakan generator
| Gunakan generator kapan | Gunakan daftar kapan |
|---|---|
| Data berukuran besar atau ukurannya tidak diketahui | Data berukuran kecil dan muat di memori |
| Anda memproses item satu kali, secara berurutan | Anda mengulang beberapa kali |
| Anda mungkin berhenti lebih awal | Anda memerlukan len(), mengindeks atau mengiris |
| Anda sedang membaca aliran atau file | Anda perlu mengurutkan atau membalikkan data |
| Anda sedang membangun saluran pipa | Kesederhanaan lebih penting daripada ingatan |
Generator secara keseluruhan tidak selalu lebih cepat. Jika Anda akhirnya menggunakan setiap nilai, total pekerjaannya akan serupa, dan pemahaman daftar bahkan bisa lebih cepat untuk data kecil karena overhead per itemnya lebih sedikit. Manfaat utamanya adalah penggunaan memori, dan mendapatkan hasil pertama lebih cepat.
Kesalahan umum
Menggunakan kembali generator yang sudah habis
Ini menangkap hampir semua orang pada suatu saat. Generator mengingat bahwa ia telah selesai:
g = count_up(2)
print(list(g), list(g))
# [1, 2] []
Panggilan kedua mendapat daftar kosong tanpa kesalahan sama sekali. Panggil kembali fungsi tersebut untuk mendapatkan generator baru, atau gunakan pendekatan kelas yang ditunjukkan di atas.
Mengharapkan kode untuk segera dijalankan
def noisy():
print("body runs")
yield 1
n = noisy() # nothing is printed
print(next(n)) # body runs, then 1
Pemeriksaan argumen di bagian atas generator tidak berjalan hingga next() pertama, sehingga kesalahan dapat muncul jauh dari panggilan yang menyebabkannya.
Perangkap lainnya
- Memanggil
len()atau mengindeks. Generator tidak mendukung keduanya, dan menaikkanTypeError. - Menutup file terlalu cepat. Mengembalikan generator dari dalam blok
withdapat berarti file ditutup sebelum baris apa pun dibaca. Letakkanyielddi dalam blokwith. - Menggabungkan semuanya ke dalam
list(). Hal ini membuang manfaat memori. - Menggunakan satu untuk data kecil. Daftar biasa seringkali lebih jelas.
Penutup
Generator adalah fungsi yang dapat menjeda. Ide yang satu itu memberi Anda penggunaan memori yang rendah, urutan tanpa akhir, dan saluran pipa yang bersih. Untuk mempraktikkannya, temukan tempat dalam kode Anda yang membuat daftar besar hanya untuk mengulanginya satu kali, dan mengubahnya menjadi generator. Kemudian coba gabungkan dua generator kecil menjadi satu pada file log asli.
Pertanyaan yang sering diajukan
Apa yang dilakukan hasil dengan Python?
hasil menghasilkan nilai dan menjeda fungsi, mempertahankan variabel lokalnya. Fungsi ini dilanjutkan dari titik yang sama ketika nilai berikutnya diminta.
Apa perbedaan antara generator dan daftar?
Daftar menyimpan semua nilainya dalam memori sekaligus. Generator menghitung setiap nilai sesuai permintaan, menggunakan sedikit memori dan biasanya hanya dapat digunakan sekali.
Apa perbedaan antara iterator dan generator?
Setiap generator adalah iterator. Generator hanyalah cara termudah untuk menulisnya, karena Python membuat metode __iter__ dan __next__ untuk Anda.
Bisakah Anda mengulang generator dua kali?
Tidak. Setelah habis, ia tidak menghasilkan apa-apa lagi, tanpa menimbulkan kesalahan. Buat generator baru dengan memanggil fungsi itu lagi, atau simpan hasilnya dalam daftar.
Apakah generator lebih cepat daripada daftar?
Tidak selalu. Mereka menggunakan lebih sedikit memori dan memberikan hasil pertama lebih cepat, namun pemahaman daftar bisa sedikit lebih cepat ketika Anda menggunakan sejumlah kecil data secara keseluruhan.
Teruslah belajar
Butuh bantuan dengan pengujian, WordPress atau SEO?
Kami membantu tim mengirimkan perangkat lunak yang lebih baik dan mengembangkan situs mereka. Beritahu kami apa yang sedang Anda kerjakan dan kami akan menyarankan langkah selanjutnya yang jelas.
Panduan lebih lanjut tentang pengujian, AI & pengembangan modern
Menikmati artikel ini? Pilih topik dan langsung masuk ke tutorial terbaru kami.
Penjelasan Halusinasi AI: Mengapa Model Bahasa Memperbaiki Masalah dan Cara Menguranginya
Halusinasi AI menjelaskan: apa itu, mengapa model bahasa memproduksinya, tipe umum, cara menguranginya dengan landasan dan petunjuk, dan pemeriksaan…
Baca artikel →DevOpsPenjelasan Variabel Lingkungan: File .env, Rahasia, dan Konfigurasi Dilakukan dengan Benar
Variabel lingkungan dijelaskan dengan contoh Python yang kami jalankan: membaca dan mengaturnya, mengapa setiap nilai berupa string, file .env, pewa…
Baca artikel →Pengembangan perangkat lunakPenjelasan Pembatasan Kecepatan API: Algoritma, Header, dan Penanganan 429 Kesalahan
Pembatasan laju API dijelaskan dengan simulasi yang kami jalankan: keranjang token, jendela tetap, jendela geser, respons 429, header batas laju, pe…
Baca artikel →Otomatisasi pengujianMengejek dengan Python: unittest.mock, patch dan Kesalahan yang Membuat Tes Berbohong
Mengejek dengan Python dengan unittest.mock, menguji: Mock dan return_value, side_effect, menambal di mana nama digunakan, spesifikasi dan autospec,…
Baca artikel →Pengujian perangkat lunakPenjelasan Cakupan Kode: Cakupan Jalur vs Cabang dan Apa Arti 100% Sebenarnya
Cakupan kode dijelaskan dengan coverage.py yang sebenarnya dijalankan: cakupan garis, cabang dan kondisi, membaca laporan, mengapa cakupan 100% masi…
Baca artikel →Basis data & SQLDELETE vs TRUNCATE vs DROP dalam SQL: Perbedaan, Rollback dan Kapan Menggunakan Masing-Masing
DELETE vs TRUNCATE vs DROP dijelaskan dengan SQL yang diuji: apa yang dihapus, rollback, pemicu, reset identitas, kecepatan, dan perbedaan PostgreSQ…
Baca artikel →Basis data & SQLPenjelasan Tampilan SQL: Membuat, Menggunakan, dan Menghindari Kesalahan, Dengan Contoh
Tampilan SQL dijelaskan dengan kueri yang kami jalankan: membuat tampilan, hasil langsung, menyembunyikan kolom, kinerja, tampilan yang dapat diperb…
Baca artikel →Pengembangan perangkat lunakAntarmuka TypeScript vs Tipe: Perbedaan Nyata, Diuji Dengan Kompiler
Antarmuka TypeScript vs tipe, diperiksa dengan kompiler sebenarnya: apa yang bisa dilakukan keduanya, apa yang hanya bisa dilakukan satu orang, peng…
Baca artikel →Pengembangan perangkat lunakPenjelasan Python *args dan **kwargs: Fungsi Fleksibel Dengan Contoh Jelas
Python *args dan **kwargs dijelaskan dengan kode yang kami jalankan: pengepakan dan pembongkaran, urutan parameter, argumen hanya kata kunci dan pos…
Baca artikel →Pengembangan perangkat lunakFungsi Python Lambda: Sintaks, Kegunaan Sebenarnya, dan Kapan Tidak Digunakan
Fungsi python lambda dijelaskan dengan kode yang kami jalankan: sintaksis, pengurutan dengan kunci, peta dan filter, penutupan, jebakan pengikatan a…
Baca artikel →Kecerdasan buatanApa Itu Agen AI? Cara Kerjanya, Dengan Agent Loop Sederhana yang Dapat Anda Jalankan
Apa itu agen AI? Panduan sederhana tentang loop agen, alat, memori, dan pagar pembatas, dengan loop Python kecil yang kami jalankan, risiko nyata da…
Baca artikel →DevOpsPemantauan vs Observabilitas: Perbedaan Nyata, Dengan Log, Metrik, dan Jejak
Penjelasan pemantauan vs observabilitas: kegagalan yang diketahui dan tidak diketahui, log, metrik dan jejak, penelusuran insiden checkout, sinyal e…
Baca artikel →DevOpsVolume Docker vs Bind Mounts: Pertahankan Data Kontainer dengan Cara yang Benar
Volume Docker vs pengikatan pengikat dijelaskan: mengapa data kontainer menghilang, volume yang diberi nama, pengikatan pengikatan, tmpfs, contoh Tu…
Baca artikel →Otomatisasi pengujianTDD vs BDD: Perbedaan Utama, Satu Fitur Dibangun dengan Dua Cara dan Kapan Menggunakan Masing-masing
TDD vs BDD dijelaskan dengan satu fitur diskon yang dibuat dengan dua cara: refactor merah-hijau dengan kode yang kami jalankan, skenario Mengingat-…
Baca artikel →Pengujian perangkat lunakUser Acceptance Testing (UAT): Proses, Checklist dan Contoh Nyata
Pengujian penerimaan pengguna menjelaskan: siapa yang menjalankannya, perbedaannya dengan QA, proses tujuh langkah, templat kasus uji UAT, daftar pe…
Baca artikel →Basis data & SQLPenjelasan Nilai NULL SQL: IS NULL, COALESCE, NULLIF dan Jebakan yang Harus Dihindari
Nilai SQL NULL dijelaskan dengan kueri yang kami jalankan: logika tiga nilai, IS NULL, COALESCE, NULLIF, cara agregat, penggabungan, dan pengurutan …
Baca artikel →Basis data & SQLPernyataan SQL CASE WHEN: Sintaks, Contoh Nyata dan Kesalahan Umum
SQL CASE KETIKA dijelaskan dengan kueri yang kami jalankan: formulir sederhana dan dicari, urutan kondisi, pivot dengan SUM, trik COUNT, pengurutan …
Baca artikel →Pengembangan perangkat lunakApa itu JWT? Token Web JSON Dijelaskan Dengan Contoh Kerja
Apa itu JWT? JSON Web Tokens menjelaskan: tiga bagian, token yang dibuat dan dirusak dalam kode yang kami jalankan, sesi JWT vs, penyimpanan, token …
Baca artikel →Pengembangan perangkat lunakPenjelasan Loop Acara JavaScript: Call Stack, Microtasks, dan Timer Dengan Contoh
Perulangan peristiwa JavaScript dijelaskan dengan kode yang kami jalankan: tumpukan panggilan, antrian tugas dan tugas mikro, mengapa setTimeout 0 t…
Baca artikel →Pengembangan perangkat lunakGenerator Python dan Penjelasan Hasil: Menghemat Memori Dengan Contoh Nyata
Generator dan hasil Python dijelaskan dengan kode yang kami jalankan: bagaimana mereka menjeda dan melanjutkan, mengukur penghematan memori, saluran…
Baca artikel →Kecerdasan buatanApa itu Embedding? Kesamaan Vektor dan Kosinus Dijelaskan Secara Sederhana
Apa itu embeddings? Panduan bahasa sederhana tentang vektor, kesamaan kosinus, dan penelusuran semantik, dengan contoh kecil yang kami jalankan, pen…
Baca artikel →DevOpsPenerapan Biru-Hijau vs Canary: Perbedaan, Kompromi, dan Cara Memilih
Penjelasan penerapan blue-green vs canary: cara kerja masing-masing, biaya, risiko dan rollback, pengelompokan pengguna stabil yang kami uji, migras…
Baca artikel →Otomatisasi pengujianTes Tidak Stabil: Apa Penyebabnya dan Cara Memperbaikinya untuk Kebaikan
Pengujian yang tidak stabil dijelaskan dengan demo yang kami jalankan: penyebab utama, cara mengonfirmasi dan mendiagnosisnya, perbaikan waktu yang …
Baca artikel →Pengujian perangkat lunakLoad Testing vs Stress Testing: Perbedaan, Metrik dan Contoh k6
Penjelasan pengujian beban vs pengujian stres: apa yang dibuktikan masing-masing, pengujian lonjakan dan rendam, metrik yang penting, mengapa rata-r…
Baca artikel →Pengujian perangkat lunakKasus Uji vs Skenario Uji: Perbedaan Utama, Contoh, dan Kapan Menggunakan Masing-masing
Penjelasan kasus uji vs skenario pengujian: definisi yang jelas, tabel berdampingan, satu fitur pengaturan ulang kata sandi yang diambil dari skenar…
Baca artikel →Basis data & SQLOptimasi Kueri SQL: Baca Rencana Eksekusi dan Perbaiki Kueri Lambat, Dengan Pengaturan Waktu
Pengoptimalan kueri SQL diuji pada sejuta baris: membaca rencana eksekusi, menambahkan indeks yang tepat, memperbaiki filter yang tidak dapat disarg…
Baca artikel →Basis data & SQLSQL UNION vs UNION ALL: Perbedaan, Contoh dan Kinerja Diuji
SQL UNION vs UNION ALL dijelaskan dengan kueri yang kami jalankan: duplikat, aturan yang diikuti keduanya, bug data nyata, kinerja terukur, INTERSEC…
Baca artikel →Pengembangan perangkat lunakTutorial API Pengambilan JavaScript: GET, POST, Penanganan Kesalahan, dan Batas Waktu
Tutorial JavaScript Fetch API diuji pada server lokal: GET dan POST, mengapa 404 tidak muncul, bantuan yang dapat digunakan kembali, string kueri, b…
Baca artikel →Pengembangan perangkat lunakPenanganan File Python: Baca, Tulis, CSV, JSON dan pathlib Dengan Contoh
Penanganan file Python dijelaskan dengan kode yang kami jalankan: mode terbuka, dengan, membaca file besar, CSV, JSON, pathlib, file biner, penulisa…
Baca artikel →Pengembangan perangkat lunakKelas dan Objek Python: Tutorial OOP Dengan Contoh Nyata
Kelas dan objek Python dijelaskan dengan kode yang kami jalankan: __init__, metode, atribut kelas vs instance, warisan, properti, metode dunder, kel…
Baca artikel →Kecerdasan buatanApa Itu Model Bahasa Besar? Bagaimana LLM Bekerja, Dijelaskan Tanpa Hype
Apa yang dimaksud dengan model bahasa besar? LLM dijelaskan dalam bahasa sederhana: token, penyematan, perhatian, pelatihan, jendela suhu dan kontek…
Baca artikel →DevOpsPerintah Linux untuk Pemula: Panduan Terminal Penting Dengan Contoh
Perintah Linux untuk pemula, dikelompokkan berdasarkan tugas: navigasi, file, melihat log, grep, pipa, izin, proses dan arsip, dengan contoh analisi…
Baca artikel →Otomatisasi pengujianSelenium vs Penulis Drama: Perbedaan Utama, Perbandingan Kode, dan Mana yang Harus Dipilih
Selenium vs Playwright dibandingkan: arsitektur, menunggu, dukungan browser dan bahasa, debugging, pengujian yang sama di kedua alat, saran migrasi …
Baca artikel →Pengujian perangkat lunakPartisi Ekivalensi: Teknik Desain Tes Dijelaskan Dengan Contoh yang Dikerjakan
Penjelasan partisi ekivalensi: cara menemukan partisi yang valid dan tidak valid, contoh yang berfungsi untuk usia, kata sandi dan kupon, pengujian …
Baca artikel →Pengujian perangkat lunakSeverity vs Priority dalam Pengujian Perangkat Lunak: Perbedaan, Matriks dan Contoh Nyata
Keparahan vs prioritas dalam pengujian perangkat lunak dijelaskan: definisi yang jelas, matriks empat arah dengan contoh, skala level, siapa yang me…
Baca artikel →Basis data & SQLTutorial Subkueri SQL: Jenis, Subkueri yang Berkorelasi, dan ADA Dengan Contoh
Tutorial subkueri SQL dengan kueri yang kami jalankan: subkueri skalar, IN, FROM dan SELECT, subkueri yang berkorelasi, EXISTS, jebakan NOT IN NULL …
Baca artikel →Basis data & SQLPenjelasan Transaksi SQL dan ACID: COMMIT, ROLLBACK dan Tingkat Isolasi
Transaksi SQL dan ACID dijelaskan dengan transfer bank yang kami jalankan: COMMIT, ROLLBACK, savepoint, kunci, tingkat isolasi, pembacaan kotor, keb…
Baca artikel →Pengembangan perangkat lunakGit merge vs rebase: perbedaan, contoh, dan kapan memakai masing-masing
Git merge vs rebase dijelaskan dengan keluaran log nyata, tabel perbandingan, aturan emas rebase, dan alur kerja tim yang aman.
Baca artikel →Pengembangan perangkat lunakList Comprehension Python: Sintaks, Contoh, dan Kapan Harus Dihindari
List comprehension Python dijelaskan: sintaks, filter, if-else, perulangan bersarang, waktu yang diukur, dan kapan perulangan for biasa lebih baik.
Baca artikel →Basis data & SQLPenjelasan SQL JOIN dengan Contoh (Inner, Left, Right, Full)
Pahami SQL JOIN langkah demi langkah dengan tabel dan query contoh: INNER, LEFT, RIGHT, FULL, CROSS, dan SELF, plus kesalahan umum dan tips performa.
Baca artikel →