Saat kode berikut dijalankan, manakah baris yang ditampilkan berurutan dari atas?
def calc(a, b): try: print("try") r = a / b except ZeroDivisionError: print("except") else: print("else") finally: print("finally")calc(9, 3)
try, else, dan except
try, else, dan finally
try, except, dan else
try, except, dan finally
JawabanB. try, else, dan finally
9 / 3 tidak melontarkan exception, sehingga tidak masuk ke except. Yang dijalankan hanya ketika tidak terjadi exception adalah klausa else, sehingga setelah try dijalankan else. Klausa finally selalu dijalankan tanpa memandang ada tidaknya exception, sehingga berjalan terakhir. Oleh karena itu menjadi 3 baris try, else, finally. Pilihan yang menyertakan except adalah urutan jika keliru menganggap terjadi exception, padahal pemanggilan ini tidak menimbulkan ZeroDivisionError. Pilihan yang tidak menyertakan finally adalah urutan jika finally disalahpahami sebagai 'pembersihan ketika terjadi exception'.
Soal 2 | Klausa else
Manakah syarat yang benar agar klausa else pada pernyataan try dijalankan?
Selalu dijalankan terakhir tanpa memandang ada tidaknya exception
Hanya dijalankan ketika klausa try melontarkan exception
Dijalankan ketika tidak cocok dengan klausa except mana pun
Hanya dijalankan ketika klausa try tidak melontarkan exception
JawabanD. Hanya dijalankan ketika klausa try tidak melontarkan exception
Klausa else pada pernyataan try hanya dijalankan ketika klausa try berakhir sampai selesai tanpa melontarkan exception. Berbeda dengan else pada pernyataan if yang berarti 'ketika kondisi salah', else pada pernyataan try berada di sisi 'ketika berhasil', sehingga sebaiknya diingat bahwa arahnya berlawanan. Yang dijalankan ketika terjadi exception adalah klausa except. Yang selalu dijalankan tanpa memandang ada tidaknya exception adalah klausa finally. Jika tidak cocok dengan except mana pun, prosesnya bukan jatuh ke else, melainkan exception tersebut diteruskan ke pemanggil.
f() menyiapkan nilai yang akan dikembalikan, lalu sebelum benar-benar dikembalikan, menjalankan klausa finally. Oleh karena itu F ditampilkan lebih dulu, dan nilai kembaliannya tetap T. g() memiliki return di dalam klausa finally, dan ini menimpa return pada klausa try, sehingga nilai kembaliannya menjadi N. Karena print mengevaluasi f() dan g() lalu menampilkannya dalam 1 baris, urutannya menjadi baris F lebih dulu, baris T N kemudian. Pilihan yang menjadi T T adalah jawaban jika dianggap return pada finally diabaikan, dan pilihan yang F datang belakangan adalah jawaban jika dianggap finally berjalan setelah return.
Soal 4 | Exception yang tidak tertangkap
Exception apa yang tidak bisa ditangkap oleh klausa except yang ditulis except Exception?
FileNotFoundError
ZeroDivisionError
KeyboardInterrupt
ModuleNotFoundError
JawabanC. KeyboardInterrupt
KeyboardInterrupt berada langsung di bawah BaseException, tidak mewarisi Exception. issubclass(KeyboardInterrupt, Exception) bernilai False. Karena ini muncul ketika pengguna mencoba menghentikan program dengan Ctrl-C, hierarkinya dipisahkan agar tidak sengaja tertelan oleh except Exception yang ditulis secara luas. SystemExit juga berada di posisi yang sama. Ketiga pilihan lainnya semuanya adalah keturunan Exception: ZeroDivisionError berada di bawah ArithmeticError, FileNotFoundError di bawah OSError, dan ModuleNotFoundError di bawah ImportError, sehingga semuanya bisa ditangkap oleh except Exception.
Soal 5 | Induk exception
Manakah kelas induk terdekat yang sama-sama dimiliki oleh IndexError dan KeyError?
ReferenceError
ArithmeticError
AttributeError
LookupError
JawabanD. LookupError
Baik IndexError maupun KeyError sama-sama memiliki sifat 'mencari dengan indeks atau key tetapi tidak ditemukan', sehingga ditempatkan di bawah induk yang sama bernama LookupError. Dengan menulis except LookupError, bisa menangani sekaligus akses di luar jangkauan list maupun key yang tidak ada di dictionary. ArithmeticError adalah induk dari ZeroDivisionError dan semacamnya, untuk situasi ketika perhitungan itu sendiri tidak dapat dilakukan. AttributeError adalah exception ketika atribut tidak ditemukan, dan ReferenceError ketika objek yang dirujuk oleh weak reference sudah hilang; keduanya berada langsung di bawah Exception dan merupakan rangkaian yang berbeda dari LookupError.
Soal 6 | Urutan except
Manakah output yang benar ketika kode berikut dijalankan?
try: x = 8 / 0except ArithmeticError: print("A")except ZeroDivisionError: print("Z")
Tidak ada yang ditampilkan, berhenti
Hanya Z yang ditampilkan
A dan Z ditampilkan
Hanya A yang ditampilkan
JawabanD. Hanya A yang ditampilkan
8 / 0 melontarkan ZeroDivisionError, tetapi ZeroDivisionError adalah kelas turunan dari ArithmeticError. Klausa except dicocokkan berurutan dari atas, dan berhenti pada kecocokan pertama, sehingga except ArithmeticError yang ditulis lebih dulu yang menangkapnya, dan hanya A yang ditampilkan. except ZeroDivisionError di belakangnya tidak kebagian giliran. Karena hanya 1 except yang cocok yang dijalankan, tidak akan muncul A dan Z sekaligus. Prinsipnya adalah meletakkan yang sempit (kelas turunan) lebih dulu, dan yang luas (kelas induk) belakangan; kode pada soal ini membalik urutan tersebut.
Soal 7 | Beberapa exception
Manakah 1 baris yang ditampilkan ketika kode berikut dijalankan?
Jika di belakang except ditulis tuple yang dikelilingi tanda kurung, akan dijalankan jika cocok dengan salah satunya. conv("21") karena int("21") menjadi 21, sehingga mengembalikan 42. conv("abc") bisa diberikan sebagai string, tetapi tidak bisa diinterpretasikan sebagai angka, sehingga menjadi ValueError. conv(None) bukan tipe yang bisa diberikan ke int(), sehingga menjadi TypeError. Pembedaannya adalah: jika tipenya benar tetapi nilainya tidak sesuai maka ValueError, dan jika tipenya sendiri tidak cocok maka TypeError; urutan ini langsung menjadi jawabannya.
Soal 8 | Melempar ulang
Manakah output dari kode berikut yang memakai exception buatan sendiri dan raise tanpa argumen?
class LoadError(Exception): passdef load(): try: raise LoadError("bad") except LoadError: print("inner") raisetry: load()except Exception as e: print("outer", type(e).__name__)
Hanya inner, outer tidak ditampilkan
2 baris inner dan outer Exception
2 baris inner dan outer LoadError
inner ditampilkan lalu berhenti dengan LoadError
JawabanC. 2 baris inner dan outer LoadError
Jika di dalam except hanya ditulis raise tanpa argumen, exception yang sedang diproses saat itu dilempar ulang apa adanya ke pemanggil. Oleh karena itu, setelah menampilkan inner, LoadError diteruskan ke luar load(), dan ditangkap oleh except Exception di luarnya. Karena LoadError mewarisi Exception, bisa ditangkap oleh except Exception, dan tidak berhenti. type(e).__name__ mengembalikan nama kelas exception yang benar-benar dilontarkan, sehingga yang ditampilkan bukan nama tipe sisi penangkap Exception, melainkan LoadError. Hanya inner saja yang ditampilkan terjadi jika exception ditelan begitu saja di tempat tanpa dilempar ulang.
JawabanA. Ditampilkan 2 lalu berhenti dengan KeyError
Pemanggilan pertama menggunakan indeks list 1, sehingga mengembalikan 2. Pemanggilan kedua mengambil key yang tidak ada di dictionary, sehingga melontarkan KeyError, tetapi yang ditulis pada except hanya IndexError. IndexError dan KeyError sama-sama anak dari LookupError, tetapi bukan hubungan induk-anak satu sama lain, sehingga except untuk IndexError tidak bisa menangkap KeyError. Exception yang tidak tertangkap diteruskan ke pemanggil, dan karena tidak ada yang menampungnya, program berhenti. Jika ingin menerima keduanya, tulis except LookupError, atau jajarkan keduanya dalam tuple.
Soal 10 | assert
Manakah penjelasan yang benar mengenai pernyataan assert?
Melontarkan AssertionError jika kondisi salah, dan dinonaktifkan pada python3 -O
Melontarkan AssertionError jika kondisi salah, dan tetap selalu dijalankan pada python3 -O
Melontarkan AssertionError jika kondisi benar, dan dinonaktifkan pada python3 -O
Melontarkan ValueError jika kondisi salah, dan tetap selalu dijalankan pada python3 -O
JawabanA. Melontarkan AssertionError jika kondisi salah, dan dinonaktifkan pada python3 -O
assert kondisi, pesan melontarkan AssertionError ketika kondisi bernilai salah. Ketika kondisi benar, tidak terjadi apa-apa. Yang penting adalah, jika dijalankan dalam mode optimasi seperti python3 -O, pernyataan assert dihilangkan sepenuhnya, sehingga tidak ada satu baris pun yang dijalankan. Oleh karena itu, assert tidak boleh dipakai untuk tujuan memeriksa input pengguna; untuk keperluan itu gunakan if untuk memeriksa kondisi lalu melontarkan raise ValueError(...). Sebaiknya assert diingat sebagai alat untuk mencatat asumsi internal selama pengembangan, dengan peran yang terpisah.
Soal 11 | self
Manakah penjelasan yang benar mengenai parameter pertama self pada metode?
Nama tercadang untuk merujuk atribut kelas induk
Argumen yang secara otomatis diberikan instance pemanggil itu sendiri
Argumen untuk membuat instance dan mengembalikannya ke pemanggil
Nama tercadang yang secara otomatis diberikan kelas itu sendiri
JawabanB. Argumen yang secara otomatis diberikan instance pemanggil itu sendiri
Jika ditulis d.speak(), Python membacanya ulang menjadi pemanggilan Dog.speak(d). Yang masuk ke posisi argumen pertama saat itu adalah instance pemanggil itu sendiri. Ejaan self hanyalah kebiasaan, bukan nama yang dicadangkan oleh bahasa. Yang menjadi spesifikasi hanyalah posisi argumen pertama yang menerima dirinya sendiri, sehingga jika ditulis sendiri sebagai Dog.speak(d) pun bekerja dengan cara yang sama. Membuat instance dan mengembalikannya adalah peran __new__ dan mekanisme pemanggilan kelas, sedangkan __init__ hanya menginisialisasi instance yang sudah dibuat. Untuk merujuk kelas induk digunakan super().
Soal 12 | Variabel kelas
Manakah output dari kode berikut yang mengubah variabel kelas?
kind adalah variabel kelas yang ditulis langsung di bawah class, dan dibagikan bersama oleh semua instance yang dibuat dari kelas itu. Karena baik a maupun b tidak memiliki kind di __dict__ miliknya sendiri, saat membaca atribut akan ditelusuri sampai ke sisi kelas dan melihat nilai yang sama. Penugasan ke Dog.kind mengubah satu nilai yang dibagikan bersama itu, sehingga baik a maupun b yang sudah dibuat sebelumnya sama-sama terlihat sebagai wolf. Karena nilai tidak disalin pada saat pembuatan instance, tidak akan menjadi pilihan yang menyisakan canine.
Soal 13 | Bayangan atribut
Manakah output dari kode berikut yang menugaskan pada sisi instance?
JawabanB. husky canine canine dan ['kind', 'name']
Penugasan ke a.kind tidak mengubah variabel kelas, melainkan membuat entri baru bernama kind di dictionary instance milik a. Sejak saat itu, membaca a.kind akan menemukan entri baru ini lebih dulu, sehingga membentuk bayangan yang menutupi variabel kelas. b dan Dog.kind tetap canine seperti semula. Oleh karena itu __dict__ milik a berisi kind selain name yang dimasukkan oleh __init__, dan jika di-sorted menjadi ['kind', 'name']. Pilihan yang semuanya menjadi husky adalah jawaban jika keliru menganggap penugasan ke instance mengubah variabel kelas, dan pilihan yang hanya ['name'] adalah jawaban jika dianggap tidak terbentuk bayangan.
Soal 14 | Dibagikan bersama
Manakah output dari kode berikut yang menjadikan list sebagai variabel kelas?
JawabanC. p.items adalah [1, 2], q.items adalah [1, 2]
self.items.append(x) bukan penugasan ke self.items, melainkan hanya memanggil objek yang dicapai lewat self.items. Karena baik p maupun q tidak memiliki items miliknya sendiri, keduanya sama-sama sampai pada satu list yang sama milik variabel kelas. Akibatnya, baik 1 yang ditambahkan dari p maupun 2 yang ditambahkan dari q masuk ke list yang sama, sehingga dilihat dari mana pun hasilnya [1, 2]. Jika ingin wadah yang terpisah untuk tiap instance, buat dengan menugaskan self.items = [] di dalam __init__. Dengan begitu akan terbagi menjadi [1] dan [2].
Soal 15 | super()
Manakah output dari kode berikut yang memakai pewarisan dan super()?
__init__ milik Cat memanggil super().__init__(name), sehingga Animal sebagai induk yang mengatur self.name. Setelah itu self.color diisi black, sehingga kedua atribut lengkap. Karena cry didefinisikan ulang di anak, implementasi induk tertimpa, sehingga meow yang dipanggil. isinstance(c, Animal) menjadi True karena Cat mewarisi Animal. Jika lupa menulis super(), name tidak akan diatur dan akan terjadi AttributeError, sehingga tidak akan menjadi kegagalan diam-diam seperti pada pilihan yang menghasilkan None.
Soal 16 | MRO
Manakah output dari kode berikut yang memakai pewarisan berganda?
class A: def who(self): return "A"class B(A): def who(self): return "B"class C(A): def who(self): return "C"class D(B, C): passprint(D().who())print([k.__name__ for k in D.__mro__])
B dan ['D', 'B', 'C', 'A', 'object']
C dan ['D', 'C', 'B', 'A', 'object']
B dan ['D', 'B', 'A', 'C', 'object']
A dan ['D', 'B', 'C', 'A', 'object']
JawabanA. B dan ['D', 'B', 'C', 'A', 'object']
Urutan resolusi metode (MRO) ditentukan oleh aturan yang disebut linearisasi C3, bukan sekadar depth-first sederhana. Induk bersama A ditempatkan di belakang semua anak yang mewarisi A, sehingga urutannya menjadi D, B, C, A, object. Jika depth-first yang langsung masuk ke B lalu ke A, akan menjadi D, B, A, C, object, tetapi itu bukan hasilnya, dan ini poin yang perlu diperhatikan. who() dicari mulai dari depan MRO dan yang pertama ditemukan yang dipakai, sehingga B yang dikembalikan. Jika ditulis class E(C, B), akan menjadi E, C, B, A, object, dan yang ditulis lebih dulu yang diutamakan.
Soal 17 | Kontradiksi MRO
Ketika class B(A) sudah didefinisikan, apa yang terjadi jika ditulis class F(A, B): pass?
Definisi berhasil, dan F().who() memanggil milik A
Definisi berhasil, dan __mro__ menjadi F, A, B, object
Definisi berhasil, dan F().who() memanggil milik B
Terjadi TypeError pada saat definisi kelas
JawabanD. Terjadi TypeError pada saat definisi kelas
Linearisasi C3 memiliki 2 aturan: menjaga urutan penjajaran kelas dasar, dan meletakkan induk di belakang anak. F(A, B) menentukan agar A diletakkan sebelum B, tetapi karena B adalah anak dari A, induk A harus berada di belakang anak B. Kedua hal ini tidak bisa dipenuhi sekaligus, sehingga dianggap tidak bisa membentuk MRO yang konsisten, dan terjadi TypeError pada saat pernyataan class dievaluasi. Bukan baru diketahui setelah dijalankan, melainkan gagal begitu pernyataan class dilewati. Cara yang benar adalah menulis class F(B, A), yaitu meletakkan anak lebih dulu.
Soal 18 | Name mangling
Manakah output dari kode berikut yang memiliki atribut diawali garis bawah?
_one yang diawali 1 garis bawah hanyalah kebiasaan untuk menandakan penggunaan internal, namanya tidak berubah dan tetap bisa dibaca biasa dari luar. __two yang diawali 2 garis bawah mengalami name mangling, sehingga nama atribut sebenarnya diubah menjadi _P__two, yaitu _NamaKelas__nama. Oleh karena itu, jika ditulis p.__two akan menjadi AttributeError, tetapi jika ditulis p._P__two bisa dibaca. Yang tercantum di __dict__ pun nama setelah mangling, sehingga jika di-sorted menjadi ['_P__two', '_one']. Yang mengalami mangling hanya yang diawali 2 garis bawah; _one tidak termasuk objeknya.
Soal 19 | Metode khusus
Manakah output dari kode berikut yang mendefinisikan metode khusus?
JawabanB. V(1, 2) dan [Vec(x=1, y=2)] dan 2 V(4, 6)
print(v) dan str(v) memakai __str__, sehingga menjadi V(1, 2). Sebaliknya, jika ditampilkan di dalam wadah seperti list atau dictionary, setiap elemen memakai __repr__, sehingga menjadi [Vec(x=1, y=2)]. Pembedaan pemakaian inilah inti soal ini. len(v) adalah nilai yang dikembalikan __len__ yaitu 2, dan v + Vec(3, 4) adalah Vec baru yang dikembalikan __add__; jika itu diberikan ke print, __str__ dipakai lagi sehingga ditampilkan V(4, 6). Pada kelas yang tidak mendefinisikan __str__, __repr__ dipakai sebagai gantinya, tetapi sebaliknya __str__ tidak pernah dipakai sebagai pengganti __repr__.
Soal 20 | __eq__
Manakah output dari kode berikut yang hanya mendefinisikan __eq__?
class Point: def __init__(self, x): self.x = x def __eq__(self, other): return self.x == other.xp = Point(1)q = Point(1)print(p == q, p is q)print(Point.__hash__ is None)try: print(len({p, q}))except TypeError: print("TypeError")
True False dan False dan 2
True False dan True dan TypeError
True False dan False dan 1
True True dan True dan TypeError
JawabanB. True False dan True dan TypeError
Karena __eq__ didefinisikan, p == q membandingkan atribut x sehingga True, tetapi karena p dan q adalah objek yang dibuat secara terpisah, p is q tetap False. Yang penting di sini adalah kelas yang mendefinisikan __eq__ akan otomatis membuat __hash__ menjadi None, sehingga Point.__hash__ is None bernilai True. Objek yang tidak memiliki hash tidak bisa dipakai sebagai elemen set atau key dictionary, sehingga mencoba membuat {p, q} akan menjadi TypeError. Jika ingin tetap bisa dimasukkan ke set, perlu mendefinisikan sendiri __hash__ yang mengembalikan nilai sama ketika objeknya dianggap sama.
Soal 21 | math
Manakah output dari kode berikut yang memakai modul math?
math.sqrt selalu mengembalikan float bahkan ketika hasilnya bisa dibagi habis, sehingga akar dari 16 ditampilkan bukan 4 melainkan 4.0. math.floor membulatkan ke arah bawah pada garis bilangan, sehingga -1.5 menjadi -2, sedangkan math.ceil membulatkan ke arah atas sehingga -1.5 menjadi -1. Pada bilangan negatif, perlu diperhatikan bahwa int(-1.5) yang membulatkan ke arah 0 menjadi -1, berbeda dari hasil floor. Jika floor dan ceil tertukar akan menjadi urutan -1 -2, dan jika tipe kembalian sqrt dikira int akan menjadi 4.
Soal 22 | os.path
Manakah kombinasi nilai yang dikembalikan os.path.splitext('/tmp/z.txt') dan os.path.basename('/tmp/z.txt')?
('/tmp/z', '.txt') dan 'z.txt'
('/tmp', 'z.txt') dan '/tmp'
('/tmp/z', 'txt') dan 'z.txt'
('/tmp/z.txt', '') dan 'z.txt'
JawabanA. ('/tmp/z', '.txt') dan 'z.txt'
os.path.splitext hanya memisahkan ekstensi, dan mengembalikan tuple 2 elemen dengan titik tetap menempel pada sisi ekstensi. Oleh karena itu menjadi ('/tmp/z', '.txt'). Titiknya tidak akan hilang menjadi 'txt'. os.path.basename mengembalikan nama di ujung path, sehingga 'z.txt'. Yang mengembalikan sisi direktori '/tmp' adalah os.path.dirname, dan jika ingin tuple yang merangkum keduanya sekaligus gunakan os.path.split. Sebaiknya diingat bahwa splitext memotong berdasarkan ekstensi, bukan berdasarkan pemisah direktori.
Soal 23 | Pencocokan re
Manakah output dari kode berikut yang memakai modul re?
re.match hanya mencocokkan mulai dari awal string, sehingga karena awal 'abc' adalah 'a', tidak cocok dengan 'b' dan mengembalikan None. re.search mencari juga di tengah, sehingga cocok dengan 'b', dan dengan .group() bisa diambil string yang cocok yaitu b. Perbedaan inilah yang paling sering ditanyakan pada re. re.findall mengembalikan list berisi semua bagian yang cocok dengan pola, dan karena \d+ adalah angka berurutan, hasilnya ['1', '22', '333']. Karakter pemisah tidak akan ikut tersertakan. Jika tidak ada yang cocok, dikembalikan list kosong.
Soal 24 | datetime
Manakah output dari kode berikut yang memakai datetime?
JawabanB. 2026-08-22 dan 2026/08/22 dan 2026-09-01
Jika objek date langsung di-print, ditampilkan dalam format ISO dengan pemisah tanda hubung yaitu 2026-08-22. strftime dipakai ketika ingin mengubah format, dan jika diberikan '%Y/%m/%d' akan mengembalikan string dengan pemisah garis miring yaitu 2026/08/22. Jika date ditambah timedelta(days=10), yang dikembalikan bukan timedelta melainkan date baru yang menunjuk 10 hari kemudian, sehingga jika di-print ditampilkan 2026-09-01. Perhitungan yang melewati batas bulan ditangani oleh sisi datetime, sehingga tidak akan menjadi tanggal yang tidak ada seperti 2026-08-32 hasil sekadar menambahkan angka 10 ke tanggal. Jika dianggap print(d) memakai format yang sama dengan strftime, akan berjajar dengan pemisah garis miring, tetapi tampilan bakunya memakai pemisah tanda hubung. Jika 2 tanggal dikurangkan, yang dikembalikan bukan date melainkan timedelta, dan tampilannya berbentuk seperti 10 days, 0:00:00.
Soal 25 | Counter
Manakah output dari kode berikut yang memakai collections.Counter?
from collections import Counterc = Counter("abracadabra")print(c.most_common(2))print(c["a"], c["z"])
[('a', 5), ('b', 2)] dan 5 dan KeyError
[('a', 5), ('r', 2)] dan 5 0
[('a', 5), ('b', 2)] dan 5 0
[('a', 5), ('b', 2), ('r', 2)] dan 5 0
JawabanC. [('a', 5), ('b', 2)] dan 5 0
'abracadabra' mengandung a sebanyak 5, b dan r masing-masing 2, serta c dan d masing-masing 1. most_common(2) mengembalikan hanya 2 entri terbanyak dalam bentuk list berisi tuple (elemen, jumlah), sehingga menjadi [('a', 5), ('b', 2)]. b dan r yang jumlahnya sama diurutkan berdasarkan yang muncul lebih dulu, sehingga b yang terpilih. Counter adalah salah satu jenis dictionary, tetapi berbeda dari dictionary biasa karena mengambil elemen yang tidak ada tidak akan menjadi KeyError, melainkan mengembalikan 0. Ini adalah rancangan agar tidak perlu memeriksa keberadaan terlebih dahulu sebelum menghitung.
Soal 26 | namedtuple
Manakah output dari kode berikut yang memakai tipe hasil buatan namedtuple?
Tipe yang dibuat namedtuple, jika ditampilkan, berbentuk Pt(x=1, y=2) yang menyertakan nama tipe dan nama field. Nilai bisa dibaca baik dengan nama maupun indeks, sehingga p.x dan p[0] sama-sama 1. Dan karena namedtuple adalah tipe turunan tuple, isinstance(p, tuple) menjadi True. Artinya ini termasuk salah satu jenis tuple, sehingga elemennya tidak bisa ditulis ulang belakangan. Jika ingin memiliki nilai yang bisa diganti, gunakan _replace yang membuat instance baru dengan nilai yang digantikan, atau definisikan kelas biasa.
Soal 27 | Sekali pakai
Manakah output dari kode berikut yang melewatkan objek map yang sama ke list() dua kali?
m = map(str, [1, 2, 3])print(list(m))print(list(m))
Baris 1 adalah ['1', '2', '3'], baris 2 adalah None
Baris 1 adalah ['1', '2', '3'], baris 2 adalah []
Baris 1 adalah [1, 2, 3], baris 2 adalah []
Baris 1 dan baris 2 sama-sama ['1', '2', '3']
JawabanB. Baris 1 adalah ['1', '2', '3'], baris 2 adalah []
Yang dikembalikan map bukan list melainkan iterator, memberikan satu nilai berikutnya setiap kali next() dipanggil, dan setelah habis tidak ada lagi yang tersisa. Karena list() pertama sudah mengambil semua 3 nilai, list() kedua menjadi list kosong tanpa sisa apa pun. Tidak menjadi error maupun None, melainkan diam-diam menjadi kosong, sehingga mudah tidak disadari. Karena map(str, ...) mengubah tiap elemen menjadi string, isi baris pertama bukan angka melainkan ['1', '2', '3']. Hal yang sama terjadi pada filter, zip, enumerate, dan generator, sehingga jika ingin diiterasi berkali-kali, bekukan dengan list() segera setelah diterima.
Soal 28 | filter dan all
Manakah output dari kode berikut yang memakai filter, all, dan any?
Jika None diberikan sebagai argumen pertama filter, akan disaring berdasarkan nilai benar-salah elemen itu sendiri. 0, string kosong, dan None dievaluasi salah sehingga gugur, dan yang tersisa adalah [1, 2, 'a']. Bukan yang gugur yang tersisa. all memiliki spesifikasi mengembalikan True jika tidak ada satu pun elemen yang salah, sehingga pada list kosong tanpa elemen sama sekali pun menjadi True. any mengembalikan True jika ada minimal 1 elemen benar, sehingga jika kosong menjadi False. Poin yang sering ditanyakan adalah kedua fungsi ini memberikan jawaban berlawanan ketika diberikan urutan kosong.
Soal 29 | Generator
Kode berikut memanggil fungsi yang mengandung yield. Manakah urutan baris yang ditampilkan?
Meski fungsi yang mengandung yield dipanggil, badannya tidak dijalankan satu baris pun. Yang dikembalikan hanya objek generator, sehingga created ditampilkan lebih dulu. Baru dengan next(g) pertama, eksekusi mulai bergerak dari awal, menampilkan start lalu berhenti di yield 1 dan mengembalikan 1. next(g) berikutnya melanjutkan dari titik berhenti, menampilkan mid, lalu berhenti di yield 2 dan mengembalikan 2. Eksekusi tertunda semacam ini adalah perbedaan mendasar dari fungsi biasa, dan jika next(g) dipanggil lagi, fungsi akan berakhir dan terjadi StopIteration.
Soal 30 | is dan ==
Manakah output dari kode berikut yang menjajarkan operator is dan operator ==?
a = [1, 2]b = [1, 2]c = aprint(a == b, a is b)print(a == c, a is c)
True False dan True False
True True dan True True
False False dan True True
True False dan True True
JawabanD. True False dan True True
== adalah operator yang menanyakan apakah nilainya sama, sehingga a dan b yang isinya sama menghasilkan True. is adalah operator yang menanyakan apakah objeknya sama, dan karena a dan b adalah 2 list yang dibuat secara terpisah, hasilnya False. Sebaliknya c = a tidak membuat list baru, hanya memberi nama alias untuk objek yang sama, sehingga a is c menjadi True. Artinya, jika list diubah lewat c, perubahannya juga terlihat dari a. Karena None adalah objek khusus yang hanya ada satu, kebiasaan yang benar adalah menulis x is None, tetapi jika ingin membandingkan nilai selalu gunakan ==.
Latihan: kerjakan soal di halaman ini
Ini adalah alat latihan dengan soal acak (berfungsi jika JavaScript aktif). Semua soal dan penjelasan di atas tetap dapat dibaca tanpa alat ini.
* Pembahasan ini merupakan informasi untuk keperluan belajar. Cakupan dan sistem ujian dapat berubah setiap tahun, jadi selalu periksa pengumuman resmi dari lembaga penyelenggara ujian.
Halaman ini adalah terjemahan dari teks asli berbahasa Jepang. Jika terdapat perbedaan antara terjemahan dan teks asli, versi bahasa Jepang yang berlaku. Lihat teks asli bahasa Jepang