Objek yang Dapat Diiterasi
Dalam Python, iterable adalah objek yang menghasilkan item satu per satu saat diiterasi atau digunakan oleh operasi lain. String, list, tuple, set, dictionary, file, dan generator semuanya iterable meskipun cara menyusun serta menghasilkan itemnya berbeda.
Iterable tidak harus berurutan, memiliki indeks, dapat dipakai ulang, atau berhingga. Syarat utamanya hanya satu. Pemanggilan iter() harus menghasilkan iterator yang mengeluarkan item satu per satu. Iterator yang berhingga akan berhenti ketika habis.
Berbagai Jenis Iterable
Beberapa tipe bawaan Python dapat menghasilkan item satu per satu ketika diulang.
# String sebagai iterable
text = "hello"
print("Karakter dalam string:")
for char in text:
print(char)
# Output:
# Karakter dalam string:
# h
# e
# l
# l
# o
print()
# List sebagai iterable
numbers = [1, 2, 3, 4, 5]
print("Elemen dalam list:")
for num in numbers:
print(num)
# Output:
# Elemen dalam list:
# 1
# 2
# 3
# 4
# 5
print()
# Tuple sebagai iterable
coordinates = (10, 20, 30)
print("Elemen dalam tuple:")
for coord in coordinates:
print(coord)
# Output:
# Elemen dalam tuple:
# 10
# 20
# 30String menghasilkan karakter sesuai urutan teks. List dan tuple menghasilkan elemen tersimpan sesuai urutan posisi. Jenis iterable lain dapat memiliki aturan urutan yang berbeda.
List bisa dibaca ulang, tetapi satu objek generator mengingat kemajuan iterasinya. list(iterator) pertama menghabiskan generator di bawah. Pemanggilan kedua tidak memulai ulang perhitungan, sehingga menghasilkan list kosong.
numbers = [1, 2, 3]
iterator = (number * 2 for number in numbers)
print(list(iterator)) # Output: [2, 4, 6]
print(list(iterator)) # Output: []
print(list(numbers)) # Output: [1, 2, 3]Operator Keanggotaan
Operator in dan not in memeriksa apakah suatu objek memuat nilai tertentu. Cara pemeriksaannya bergantung pada tipe objek tersebut: list menelusuri elemennya, dictionary mencari pada daftar kunci, dan string mencari potongan teks.
Penggunaan Operator in dan not in
List dan tuple membandingkan elemen sampai menemukan kecocokan atau mencapai akhir. String mencari substring, sedangkan set dan dict memakai mekanisme pencarian sendiri. Pada dictionary, in memeriksa kunci, bukan nilai.
# Pengecekan keanggotaan dalam list
fruits = ["apel", "jeruk", "mangga"]
# Menggunakan operator in
if "apel" in fruits:
print("Apel tersedia dalam daftar buah")
# Output: Apel tersedia dalam daftar buah
# Menggunakan operator not in
if "durian" not in fruits:
print("Durian tidak tersedia dalam daftar buah")
# Output: Durian tidak tersedia dalam daftar buah
print()
# Pengecekan keanggotaan dalam string
message = "Python adalah bahasa pemrograman"
# Mencari substring dalam string
if "Python" in message:
print("Kata Python ditemukan dalam pesan")
# Output: Kata Python ditemukan dalam pesan
if "Java" not in message:
print("Kata Java tidak ditemukan dalam pesan")
# Output: Kata Java tidak ditemukan dalam pesanKasus Khusus pada String
Untuk string, operand kiri dapat berupa satu karakter atau substring yang lebih panjang. Pemeriksaannya peka huruf besar-kecil dan mencari satu kemunculan yang berurutan.
# Pengecekan karakter dalam string
text = "programming"
# Mencari karakter tunggal
print("g" in text) # Output: True
print("z" in text) # Output: False
print()
# Mencari substring dalam string
print("gram" in text) # Output: True
print("program" in text) # Output: True
print("java" in text) # Output: False
# Periksa penanda yang dipakai dalam contoh sederhana ini
email = "user@example.com"
if "@" in email and ".com" in email:
print("Memuat penanda dasar email")
# Output: Memuat penanda dasar emailPemeriksaan terakhir hanya menunjukkan dua penanda. Cara itu belum cukup untuk memvalidasi email karena banyak alamat tidak valid memuat @ dan .com, sedangkan banyak alamat valid memakai akhiran domain lain.
Fungsi any dan all
Built-in any() dan all() menerima iterable lalu menguji truthiness setiap item, yaitu apakah Python menganggap item tersebut benar atau salah dalam konteks Boolean. Kedua fungsi berhenti segera setelah return value dapat ditentukan, sehingga ekspresi generator dapat menghindari pembuatan list perantara yang tidak diperlukan.
Fungsi Any
any() mengembalikan True setelah menemukan item pertama yang dianggap benar. Return value menjadi False jika semua item dianggap salah atau iterable tersebut kosong.
# Contoh penggunaan any()
grades = [60, 75, 45, 80]
# Cek apakah ada nilai di atas 70
print("Ada nilai tinggi:", any(grade > 70 for grade in grades))
# Output: Ada nilai tinggi: True
# Contoh dengan boolean langsung
conditions = [False, False, True, False]
print("Ada kondisi yang benar:", any(conditions))
# Output: Ada kondisi yang benar: True
# Contoh dengan list kosong
empty_list = []
print("Any pada list kosong:", any(empty_list))
# Output: Any pada list kosong: False
# Contoh praktis
numbers = [0, 0, 5, 0]
if any(numbers):
print("Ada angka selain nol dalam list")
# Output: Ada angka selain nol dalam listFungsi All
all() mengembalikan False setelah menemukan item pertama yang dianggap salah. Jika iterasi selesai tanpa item tersebut, return value menjadi True. Pada iterable kosong, tidak ada item yang melanggar kondisi sehingga all() juga mengembalikan True.
# Contoh penggunaan all()
scores = [85, 90, 78, 92]
# Cek apakah semua nilai di atas 70
print("Semua nilai lulus:", all(score >= 70 for score in scores))
# Output: Semua nilai lulus: True
# Contoh dengan boolean langsung
conditions = [True, True, True, True]
print("Semua kondisi benar:", all(conditions))
# Output: Semua kondisi benar: True
# Contoh dengan satu kondisi false
mixed_conditions = [True, True, False, True]
print("Semua kondisi benar:", all(mixed_conditions))
# Output: Semua kondisi benar: False
# Contoh praktis
ages = [18, 21, 25, 30]
if all(age >= 18 for age in ages):
print("Semua peserta sudah dewasa")
# Output: Semua peserta sudah dewasa
print(all([])) # Output: TruePositional Unpacking
Dalam pemanggilan fungsi, asterisk di depan iterable (*) mengembangkannya menjadi argumen posisi. Jumlah argumen yang dihasilkan tetap harus sesuai dengan yang diterima fungsi.
Pemanggilan Tanpa Unpacking
Jika coordinates diberikan langsung kepada fungsi, seluruh list diterima sebagai satu argumen. Padahal, math.hypot() mengharapkan setiap koordinat sebagai argumen tersendiri. Mengakses setiap indeks secara manual dapat bekerja untuk jumlah koordinat yang tetap, tetapi pemanggil harus mengulang cara data tersebut disusun.
import math
# Masalah: fungsi math.hypot membutuhkan argumen terpisah
coordinates = [3, 4]
# Cara yang salah - akan menghasilkan error
try:
result = math.hypot(coordinates)
print(result)
except TypeError as e:
print("Error:", e)
# Output: Error: must be real number, not list
# Cara manual yang merepotkan untuk banyak argumen
result = math.hypot(coordinates[0], coordinates[1])
print("Hasil manual:", result)
# Output: Hasil manual: 5.0
# Contoh dengan lebih banyak argumen
points = [1, 1, 1, 1]
# Cara manual menjadi sangat merepotkan
result = math.hypot(points[0], points[1], points[2], points[3])
print("Hasil dengan 4 argumen:", result)
# Output: Hasil dengan 4 argumen: 2.0Unpacking dengan Asterisk
Menempatkan * sebelum iterable di dalam pemanggilan akan meneruskan setiap item yang dihasilkan sebagai argumen posisi tersendiri.
import math
# Solusi dengan unpacking operator
coordinates = [3, 4]
result = math.hypot(*coordinates)
print("Jarak dari origin:", result)
# Output: Jarak dari origin: 5.0
# Contoh dengan tuple
point_3d = (1, 2, 2)
distance = math.hypot(*point_3d)
print("Jarak 3D:", distance)
# Output: Jarak 3D: 3.0
# Contoh dengan banyak argumen
dimensions = [2, 3, 6, 1, 4]
euclidean_distance = math.hypot(*dimensions)
print("Jarak Euclidean:", euclidean_distance)
# Output: Jarak Euclidean: 8.12403840463596
# Contoh praktis lainnya
def calculate_average(a, b, c):
return (a + b + c) / 3
grades = [85, 90, 78]
average = calculate_average(*grades)
print("Rata-rata nilai:", average)
# Output: Rata-rata nilai: 84.33333333333333Pemakaian Unpacking
Sintaks unpacking yang sama dapat dipakai saat memanggil fungsi atau membuat list baru. Gunakan asterisk jika fungsi mengharapkan beberapa argumen terpisah. Berikan iterable secara langsung jika fungsi memang menerima satu iterable.
# Meneruskan isi list ke fungsi print
items = ["apel", "jeruk", "mangga"]
print("Buah-buahan:", *items)
# Output: Buah-buahan: apel jeruk mangga
# Meneruskan tiga argumen ke range()
bounds = [2, 10, 2]
print("Nilai genap:", list(range(*bounds)))
# Output: Nilai genap: [2, 4, 6, 8]
# Menggabungkan dua list
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined = [*list1, *list2]
print("List gabungan:", combined)
# Output: List gabungan: [1, 2, 3, 4, 5, 6]
# Meneruskan nilai ke format string
template = "Nama: {}, Umur: {}, Kota: {}"
data = ["Alice", 25, "Jakarta"]
formatted = template.format(*data)
print(formatted)
# Output: Nama: Alice, Umur: 25, Kota: Jakarta