Kursus
Kebutuhan umum dalam program Python adalah memeriksa apakah setidaknya satu elemen dari sebuah struktur data bernilai True.
Meskipun memungkinkan untuk menulis loop guna mengiterasi sebuah iterable dan memeriksa apakah setiap item bernilai True atau False, fungsi any() di Python adalah cara yang lebih efisien dan Pythonic untuk mencapai hasil ini.
Tutorial ini membahas fungsi bawaan any() di Python dan menampilkan beberapa contoh serta use case untuk fungsi ini.
Apa yang Dilakukan Fungsi any() di Python?
Fungsi any() adalah salah satu fungsi bawaan. Fungsi ini menerima sebuah iterable seperti list atau tuple, dan mengembalikan True jika setidaknya satu nilai dalam iterable tersebut bersifat truthy. Nilai truthy akan dievaluasi sebagai True ketika diubah menjadi Boolean menggunakan bool(). Jika semua nilai dalam iterable bersifat falsy, any() mengembalikan False:
print(any([True, False, False, True]))
print(any([False, False, False, False]))
print(any([0, 0, 5, 0]))
True
False
True
Iterable dapat berisi nilai Boolean atau objek lain karena semua objek dievaluasi sebagai True atau False saat diubah menjadi Boolean. Pada contoh ketiga, list berisi empat integer. Integer 0 bersifat falsy, tetapi semua angka non-nol bersifat truthy. Untuk memahami perbedaan antara nilai truthy dan falsy dengan lebih baik, baca blog ini tentang operator logika Python.
Jika iterable kosong, any() mengembalikan False karena tidak ada nilai truthy dalam iterable kosong:
print(any([]))
False
Bagian selanjutnya membahas lebih dalam cara kerja any().
Bagaimana Cara Kerja any()?
Fungsi bawaan any() menerima argumen berupa iterable apa pun. Iterable adalah struktur data apa pun yang dapat di-loop oleh Python.
Pertimbangkan tuple berikut:
an_iterable = ("", 0.0, "DataCamp", False, [])
Tuple ini mencakup beberapa objek dengan tipe yang berbeda. Beberapa objek ini bersifat falsy:
- String kosong
"" - Float
0.0 - Boolean
False - List kosong
[]
Objek-objek ini bersifat falsy karena dievaluasi sebagai False saat diberikan ke bool().
String non-kosong "DataCamp" bersifat truthy.
Cara sederhana untuk memeriksa apakah setidaknya satu elemen bersifat truthy adalah menggunakan loop for:
def check_if_contains_truthy(data):
output = False
for item in data:
if item:
output = True
return output
print(check_if_contains_truthy(an_iterable))
True
Namun, ini tidak efisien karena fungsi hanya perlu memeriksa apakah ada setidaknya satu nilai truthy. Setelah menemukan nilai truthy, fungsi tidak perlu melanjutkan memeriksa item iterable lainnya. Fungsi dapat dimodifikasi untuk langsung mengembalikan nilai segera setelah menemukan nilai truthy pertama:
def check_if_contains_truthy(data):
for item in data:
if item:
return True
return False
print(check_if_contains_truthy(an_iterable))
True
Pernyataan return menghentikan eksekusi fungsi. Oleh karena itu, ketika fungsi menemukan nilai truthy pertama, fungsi mengembalikan True dan tidak melanjutkan iterasi atas iterable. Fungsi mengembalikan False hanya jika loop for mengiterasi semua item dalam iterable dan tidak ada yang bersifat truthy.
Fungsi bawaan any() mengikuti pola serupa dan melakukan short-circuit saat menemukan nilai truthy pertama. Evaluasi malas (lazy evaluation) ini mencegah operasi yang tidak perlu, sehingga meningkatkan kinerja. Fungsi any() di Python merupakan versi yang lebih efisien dari fungsi di atas. Peningkatan efisiensi ini dikonfirmasi menggunakan fungsi timeit() dari modul timeit, yang mengukur waktu yang dibutuhkan Python untuk mengeksekusi sebuah pernyataan:
from timeit import timeit
print("Execution time for 'check_if_contains_truthy()'")
print(
timeit(
"check_if_contains_truthy(an_iterable)",
number=10_000_000,
globals=globals(),
)
)
print("Execution time for 'any()'")
print(
timeit(
"any(an_iterable)",
number=10_000_000,
globals=globals(),
)
)
Execution time for 'check_if_contains_truthy()'
0.6335119580035098
Execution time for 'any()'
0.39488654200249584
Argumen pertama fungsi timeit() adalah string yang berisi pernyataan yang akan dieksekusi. Argumen kedua menentukan seberapa sering pernyataan tersebut dijalankan. Dalam contoh ini, kedua pernyataan dieksekusi 10.000.000 kali untuk mendapatkan waktu yang bermakna. Argumen terakhir meneruskan variabel global ke fungsi timeit().
Fungsi any() di Python lebih cepat daripada check_if_contains_truthy(). Menggunakan any() untuk mengetahui apakah sebuah iterable memiliki setidaknya satu nilai truthy lebih Pythonic dan efisien daripada menggunakan loop for.
Use Case untuk any()
Mari kita lihat beberapa use case untuk any() di Python.
Periksa apakah setidaknya satu masukan pengguna valid
Pertimbangkan serangkaian masukan pengguna yang dikumpulkan dalam sebuah list atau tuple. Sebuah program mungkin perlu memeriksa apakah setidaknya salah satu masukan valid, misalnya jika itu string yang tidak kosong:
user_inputs = ["", "10.99", ""]
if any(user_inputs):
print("At least one valid input present")
# Rest of code...
else:
print("There are no valid inputs")
At least one valid input present
Karena salah satu string tidak kosong, any() mengembalikan True, dan kode pada klausa if dijalankan.
Periksa apakah setidaknya satu file ada
Fungsi bawaan any() dapat digunakan untuk memeriksa apakah setidaknya satu file dalam daftar nama file ada di sebuah direktori:
from pathlib import Path
files = ["article.md", "use_any.py", "scratch.py", "test_file.txt"]
cwd = Path.cwd()
# Create a test file to test code
Path("test_file.txt").write_text("This is a test file")
if any(Path(file).exists() for file in files):
print("At least one of the files exists")
# Rest of code…
else:
print("None of the files exist")
At least one of the files exists
Kode mengambil current working directory menggunakan modul pathlib dan Path.cwd(). Kode ini membuat file bernama test_file.txt di working directory untuk memastikan bahwa kode ini dapat diuji dengan mudah. Fungsi any() di Python digunakan untuk memeriksa apakah setidaknya salah satu nama file ada di current working directory.
Memfilter item dari sebuah iterable
Fungsi bawaan any() juga dapat digunakan dengan generator expression sebagai argumen dan memfilter item dari sebuah iterable. Pada contoh ini, any() mencari setidaknya satu entri dalam daftar dictionary yang merepresentasikan seseorang dengan usia di bawah 18:
records = [
{"name": "Sarah", "age": 23},
{"name": "Jake", "age": 30},
{"name": "Paul", "age": 17},
]
if any(record["age"] < 18 for record in records):
print("There's at least one minor.")
else:
print("All records are adults.")
There's at least one minor.
Generator expression menghasilkan True atau False tergantung pada nilai yang sesuai dengan kunci "age" di setiap dictionary. Generator expression dapat digunakan dalam any() karena bersifat iterable.
Meninjau kembali lazy evaluation pada any() di Python
Contoh sebelumnya juga dapat menunjukkan bahwa any() dievaluasi secara malas (lazily). Pertimbangkan modifikasi berikut pada daftar dictionary:
records = [
{"name": "Sarah", "age": 23},
{"name": "Jake", "age": 30},
{"name": "Paul", "age": 17},
{"name": "Jill"},
]
if any(record["age"] < 18 for record in records):
print("There's at least one minor.")
else:
print("All records are adults.")
There's at least one minor.
Dictionary keempat dalam records tidak berisi item dengan kunci "age". Namun, kode tidak menimbulkan error saat mencoba mengambil nilai untuk "age" pada item ini karena any() menemukan nilai truthy lebih awal dalam proses. Fungsi melakukan short-circuit ketika menemui nilai truthy pertama.
Kode akan menimbulkan KeyError jika dictionary yang tidak memiliki kunci "age" muncul sebelum item mana pun dengan usia di bawah 18:
records = [
{"name": "Jill"},
{"name": "Sarah", "age": 23},
{"name": "Jake", "age": 30},
{"name": "Paul", "age": 17},
]
if any(record["age"] < 18 for record in records):
print("There's at least one minor.")
else:
print("All records are adults.")
Traceback (most recent call last):
...
if any(record["age"] < 18 for record in records):
~~~~~^^^^^^
KeyError: 'age'
Contoh ini dirancang untuk menunjukkan perilaku short-circuit saat menggunakan any() di Python. Ada alternatif jika kode tidak boleh menimbulkan pengecualian untuk item tanpa kunci "age". Kode dapat menggunakan metode dictionary .get() dengan nilai default alih-alih mengakses nilai dictionary menggunakan notasi tanda kurung siku. Pernyataan if dapat diganti dengan versi berikut jika perilaku defaultnya adalah menganggap entri tanpa usia bukan anak di bawah umur:
if any(record.get("age", 18) < 18 for record in records):
# ...
Jika kode harus menganggap entri tanpa usia sebagai anak di bawah umur, nilai defaultnya perlu lebih rendah dari 18.
Python: any() vs. all()
Fungsi any() di Python memiliki pasangan, yaitu all(). Fungsi bawaan ini juga menerima sebuah iterable dan mengembalikan True jika semua item dalam iterable tersebut bersifat truthy.
Pertimbangkan contoh dari bagian awal tutorial ini untuk memvalidasi masukan pengguna. any() berguna jika aplikasi memerlukan setidaknya satu masukan yang valid. Namun, all() dapat digunakan jika semua masukan pengguna harus valid:
user_inputs = ["", "10.99", ""]
if any(user_inputs):
print("At least one valid input present")
# Rest of code...
else:
print("There are no valid inputs")
if all(user_inputs):
print("All inputs are valid")
# Rest of code...
else:
print("Not all inputs are valid")
At least one valid input present
Not all inputs are valid
Namun, jika semua string dalam masukan pengguna tidak kosong, all() mengembalikan True:
user_inputs = ["5.99", "10.99", "19.99"]
# …
At least one valid input present
All inputs are valid
Serupa dengan any(), fungsi bawaan all() juga dievaluasi secara malas. Fungsi akan melakukan short-circuit ketika menemukan nilai falsy pertama.
Kesimpulan
Fungsi any() di Python memeriksa apakah ada item dalam sebuah iterable yang bersifat truthy. Fungsi ini mengembalikan True jika setidaknya satu item dalam iterable bernilai True atau dievaluasi sebagai True saat diubah menjadi Boolean. Meskipun keluaran yang sama dapat dicapai dengan loop, fungsi bawaan ini menawarkan solusi yang lebih mudah dibaca dan lebih efisien.
Saya belajar Fisika dan Matematika pada tingkat sarjana di University of Malta. Kemudian, saya pindah ke London dan meraih gelar PhD dalam bidang Fisika dari Imperial College. Saya meneliti teknik optik baru untuk memindai retina manusia. Sekarang, saya berfokus menulis tentang Python, berkomunikasi tentang Python, dan mengajar Python.

