Ruang Belajar Karinoya

Kualifikasi · Lab Lulus Cloud / AI / Python

Struktur Kontrol dan Struktur Data

Soal dan pembahasan dapat dibaca dalam Bahasa Indonesia. Materi kuliah (artikel penjelasan) hanya tersedia dalam bahasa Jepang.

Lihat versi bahasa Jepang (dengan materi kuliah) →

Soal 1 | for/else

Saat kode berikut yang menambahkan klausa else pada pernyataan for dijalankan, apa isi yang ditampilkan?

for n in range(4):    if n == 9:        breakelse:    print("done")print(n)
  1. Hanya 3 yang ditampilkan, done tidak muncul
  2. Hanya done yang ditampilkan, 3 tidak muncul
  3. 3 dan done ditampilkan dengan urutan ini
  4. done dan 3 ditampilkan dengan urutan ini
JawabanD. done dan 3 ditampilkan dengan urutan ini

Klausa else yang ditambahkan pada for dijalankan ketika loop selesai tanpa di-break. Karena tidak ada 9 dalam range(4), break tidak pernah terjadi, sehingga loop berjalan sampai selesai lalu print pada else dijalankan dan done muncul. print(n) sesudahnya menampilkan nilai terakhir yang tersisa pada n saat keluar dari loop, yaitu 3. Jika urutan output tertukar, 3 akan muncul lebih dulu, dan jika else disalahpahami sebagai selalu dilewati saat loop berakhir, akan menjadi bentuk tanpa done. Jika terlewat bahwa n tetap tersisa setelah keluar dari loop, akan menjadi bentuk tanpa 3.

Soal 2 | break dan else

Memastikan bagaimana klausa else diperlakukan ketika loop di-break. Manakah output dari kode berikut?

for c in "abc":    if c == "b":        break    print(c)else:    print("no break")
  1. a b c dan no break semuanya ditampilkan
  2. a dan no break ditampilkan dengan urutan ini
  3. a dan b ditampilkan dengan urutan ini
  4. a ditampilkan, no break tidak ditampilkan
JawabanD. a ditampilkan, no break tidak ditampilkan

Pada putaran pertama, c adalah a, sehingga print(c) berjalan dan a muncul. Pada putaran kedua, c menjadi b dan loop dihentikan dengan break. Aturan klausa else pada for adalah hanya dijalankan jika loop selesai tanpa di-break, sehingga di sini dilewati dan no break tidak muncul. Jika else dianggap selalu berjalan saat loop berakhir, akan muncul juga no break, dan jika salah membaca posisi print(c) sebelum break, akan muncul juga b. Jika break itu sendiri terlewat, akan muncul semua a b c.

Soal 3 | else meski kosong

Menanyakan apa yang terjadi pada klausa else dari for ketika objek iterasi kosong. Manakah hasil eksekusi kode berikut?

items = []for it in items:    print(it)else:    print("finished")
  1. Klausa else diabaikan dan terjadi TypeError
  2. Karena iterasi 0 kali, terjadi StopIteration
  3. Tidak ada yang ditampilkan sama sekali dan loop selesai
  4. finished ditampilkan hanya sekali
JawabanD. finished ditampilkan hanya sekali

Syarat klausa else pada for dijalankan adalah 'loop selesai tanpa di-break', bukan 'telah melakukan iterasi minimal sekali'. Karena items kosong, badan loop tidak pernah berjalan, tetapi karena tidak ada break, else tetap dijalankan dan finished muncul. Jika dianggap else juga dilewati saat kosong, akan menjadi tidak ada yang ditampilkan sama sekali. Memberikan list kosong ke for sendiri adalah penulisan yang benar, sehingga tidak menimbulkan exception, dan TypeError atau StopIteration pun tidak akan dilontarkan.

Soal 4 | while/else

Menambahkan klausa else pada pernyataan while dan mempertimbangkan kasus di-break di tengah jalan. Manakah output dari kode berikut?

n = 5while n > 0:    n -= 1    if n == 2:        breakelse:    print("loop ended")print(n)
  1. 0 ditampilkan, loop ended tidak ditampilkan
  2. 2 ditampilkan, loop ended tidak ditampilkan
  3. loop ended dan 2 ditampilkan dengan urutan ini
  4. loop ended dan 0 ditampilkan dengan urutan ini
JawabanB. 2 ditampilkan, loop ended tidak ditampilkan

n berkurang 1 dari 5, berlanjut ke 4 dan 3, lalu ketika menjadi 2 dilakukan break. Klausa else pada while, sama seperti for, hanya dijalankan jika loop selesai tanpa di-break, sehingga di sini dilewati dan loop ended tidak muncul. Yang tersisa hanyalah 2 dari print(n). Jika dianggap else selalu berjalan, akan muncul juga loop ended, dan jika break terlewat serta dianggap loop berputar hingga kondisi menjadi salah, akan salah membaca n menjadi 0.

Soal 5 | continue

Saat kode berikut yang mencampur continue dan break dalam satu loop dijalankan, list apa yang ditampilkan pada akhirnya?

out = []for i in range(6):    if i == 3:        continue    if i == 5:        break    out.append(i)print(out)
  1. [0, 1, 2, 4, 5]
  2. [0, 1, 2, 3]
  3. [0, 1, 2, 4]
  4. [0, 1, 2, 3, 4]
JawabanC. [0, 1, 2, 4]

Ketika i adalah 0, 1, 2, kedua pernyataan if dilewati dan append dijalankan. Ketika i adalah 3, continue bekerja sehingga sisa iterasi tersebut, yaitu append, dilewati. Ketika i adalah 4, append dijalankan lagi, dan ketika i adalah 5, loop dihentikan dengan break sehingga append tidak dijalankan. Oleh karena itu hasilnya [0, 1, 2, 4]. Jika dianggap iterasi break pun ikut ditambahkan, akan terpilih bentuk yang berlanjut hingga 5, dan jika continue diperlakukan seperti pass, akan terpilih bentuk yang menyisakan 3.

Soal 6 | Urutan mundur range

Menanyakan urutan yang dihasilkan ketika step negatif diberikan ke range. Manakah output dari kode berikut?

print(list(range(10, 0, -3)))
  1. [9, 6, 3, 0]
  2. [7, 4, 1, -2]
  3. [10, 7, 4, 1, 0]
  4. [10, 7, 4, 1]
JawabanD. [10, 7, 4, 1]

range(start, stop, step) dimulai dari start, bergerak sebesar step, dan berhenti sebelum mencapai stop. Di sini dimulai dari 10 dan dikurangi 3 berulang, sehingga bergerak 10, 7, 4, 1, dan nilai berikutnya -2 tidak diambil karena sudah 0 atau kurang. Karena stop yaitu 0 tidak disertakan, tidak akan menjadi bentuk yang di ujungnya ada 0. Jika keliru mengira start tidak disertakan, akan menjadi bentuk yang dimulai dari 7, dan jika mulai dihitung dari satu langkah sebelum start, akan menjadi bentuk yang dimulai dari 9. Bahwa stop tidak disertakan berlaku sama seperti pada step positif.

Soal 7 | Tipe range

Manakah penjelasan yang tepat mengenai objek yang diperoleh dengan memanggil fungsi bawaan range?

  1. Objek bertipe generator, akan menjadi kosong setelah diiterasi sekali
  2. Objek bertipe range, akan menjadi list jika diberikan ke list()
  3. Objek bertipe tuple, elemennya tidak dapat diganti
  4. Objek bertipe list, langsung ditampilkan dengan tanda kurung siku
JawabanB. Objek bertipe range, akan menjadi list jika diberikan ke list()

Yang dikembalikan range adalah objek bertipe range, yang menghitung bilangan bulat yang diperlukan setiap kali dibutuhkan. Karena tidak menyimpan seluruh elemen terlebih dahulu seperti list, tidak memakan banyak memori meski rentangnya besar. Jika ingin memastikan isinya dengan menjajarkannya, lewatkan ke list(). type(range(3)) adalah range, bukan list maupun tuple, dan jika ditampilkan langsung pun bukan berupa urutan elemen melainkan tampil sebagai range(0, 3). Selain itu, karena bisa diiterasi berkali-kali dan bukan sekali pakai, ini juga bukan generator. Perlu dicatat, sifat bisa dibaca dengan indeks dan elemennya tidak bisa diganti sama seperti tuple, sehingga sifat itu saja tidak cukup untuk membedakannya dari tuple.

Soal 8 | Evaluasi hubung singkat

Memastikan apa yang dikembalikan operator logika or dan and. Manakah output dari kode berikut?

print([] or 0 or "z")print(1 and 0 and 2)
  1. True dan False ditampilkan dengan urutan ini
  2. False dan 0 ditampilkan dengan urutan ini
  3. z dan 0 ditampilkan dengan urutan ini
  4. z dan 2 ditampilkan dengan urutan ini
JawabanC. z dan 0 ditampilkan dengan urutan ini

or mengevaluasi dari kiri dan langsung mengembalikan nilai pertama yang bernilai benar. Karena list kosong dan 0 sama-sama bernilai salah, yang dikembalikan adalah "z" di posisi terakhir. and sebaliknya mengembalikan nilai pertama yang bernilai salah, sehingga 1 bernilai benar, lalu pada 0 berikutnya kesalahan sudah dipastikan sehingga 0 yang dikembalikan, dan 2 di ujung kanan tidak dievaluasi. Karena yang dikembalikan bukan nilai boolean melainkan nilai pada titik evaluasi dihentikan, True atau False tidak akan muncul. and mengembalikan 2 di ujung kanan hanya jika semua nilai di tengah bernilai benar.

Soal 9 | Perbandingan berantai

Saat kode berikut yang menggabungkan perbandingan berantai dan operator ternary dijalankan, isi apa yang ditampilkan?

x = 3print(1 < x < 5)print("yes" if x % 2 else "no")
  1. True dan yes ditampilkan dengan urutan ini
  2. True dan no ditampilkan dengan urutan ini
  3. False dan no ditampilkan dengan urutan ini
  4. False dan yes ditampilkan dengan urutan ini
JawabanA. True dan yes ditampilkan dengan urutan ini

1 < x < 5 memiliki makna yang sama dengan (1 < x) and (x < 5), dan jika x adalah 3, keduanya terpenuhi sehingga menjadi True. Operator ternary berbentuk nilai jika benar if kondisi else nilai jika salah, dan kondisinya adalah x % 2, yaitu 1. Di Python, bilangan bulat selain 0 diperlakukan sebagai benar, sehingga yes yang dipilih. Jika perbandingan berantai dibaca terikat dari belakang seperti 1 < (x < 5), maka x < 5 menjadi True yaitu 1, sehingga 1 < 1 menjadi jawaban salah yaitu False. Selain itu, jika 1 dianggap salah, akan terpilih no.

Soal 10 | Peran pass

Manakah penjelasan yang tepat mengenai pernyataan pass di Python?

  1. Menunjukkan menghentikan loop itu sendiri dan keluar ke luar
  2. Menunjukkan tidak melakukan apa pun di tempat yang secara sintaksis memerlukan blok
  3. Menunjukkan melompati sisa iterasi loop dan melanjutkan ke iterasi berikutnya
  4. Menunjukkan mengakhiri eksekusi fungsi dan mengembalikan nilai ke pemanggil
JawabanB. Menunjukkan tidak melakukan apa pun di tempat yang secara sintaksis memerlukan blok

Karena Python menyatakan blok dengan indentasi, blok kosong tidak dapat ditulis begitu saja. pass dipakai untuk mengisi tempat tersebut, misalnya ketika bermaksud menulis isi kelas atau fungsi belakangan, atau ketika sengaja tidak melakukan apa pun saat kondisi terpenuhi. Ini tidak memiliki fungsi untuk mengubah alur proses. Melanjutkan ke iterasi berikutnya adalah continue, menghentikan loop adalah break, dan mengembalikan nilai ke pemanggil adalah return; semuanya memiliki peran berbeda dari pass.

Soal 11 | enumerate

Saat kode berikut yang memberikan argumen kedua ke enumerate dijalankan, apa yang muncul di layar?

for i, name in enumerate(["gu", "choki", "pa"], 1):    print(i, name)
  1. 3 baris 1 gu / 2 choki / 3 pa ditampilkan
  2. 3 baris 0 gu / 1 choki / 2 pa ditampilkan
  3. 3 baris gu 1 / choki 2 / pa 3 ditampilkan
  4. Hanya 2 baris 1 gu / 2 choki yang ditampilkan
JawabanA. 3 baris 1 gu / 2 choki / 3 pa ditampilkan

enumerate mengembalikan tuple (nomor, elemen) secara berurutan, dan argumen kedua start bisa dipakai untuk menentukan nilai awal penghitungan. Di sini diberikan 1, sehingga nomornya menjadi 1, 2, 3. Jika tertukar dengan nilai baku 0 ketika start dikosongkan, akan menjadi bentuk yang dimulai dari 0. Karena tuple yang dikembalikan memiliki nomor di depan dan elemen di belakang, urutan pada print(i, name) pun mengikuti urutan itu, sehingga nama tidak akan muncul lebih dulu. Ketiga elemen semuanya diambil, sehingga tidak akan berhenti hanya di 2 baris.

Soal 12 | Panjang zip

Dua list dengan panjang berbeda diberikan ke zip. Manakah hasil eksekusi kode berikut?

print(list(zip([1, 2, 3], [10, 20])))
  1. [(1, 10), (2, 20)]
  2. [(1, 10), (2, 20), (3,)]
  3. [(1, 10), (2, 20), (3, 0)]
  4. [(10, 1), (20, 2)]
JawabanA. [(1, 10), (2, 20)]

zip mengambil satu per satu dari objek iterable yang diberikan lalu membuat pasangan, dan berhenti begitu yang paling pendek habis. Di sini list kedua hanya memiliki 2 elemen, sehingga hanya 2 pasangan yang dibuat, dan sisa 3 dibuang begitu saja tanpa peringatan. Tidak akan menimbulkan error, tidak akan diisi 0 untuk sisanya, dan tidak akan dibuat tuple yang hanya berisi salah satu pihak. Isi pasangan mengikuti urutan yang diberikan, sehingga tidak akan tertukar seperti 10 dan 1.

Soal 13 | Memecah dengan zip

Data yang telah dipasangkan diberikan kembali ke zip dengan tanda bintang. Manakah output dari kode berikut?

pairs = [(1, 'a'), (2, 'b'), (3, 'c')]nums, chars = zip(*pairs)print(nums)print(chars)
  1. [1, 2, 3] ditampilkan diikuti ['a', 'b', 'c']
  2. (1, 2, 3) ditampilkan diikuti ('a', 'b', 'c')
  3. ((1, 'a'),) ditampilkan diikuti ((2, 'b'),)
  4. (1, 'a') ditampilkan diikuti (2, 'b')
JawabanB. (1, 2, 3) ditampilkan diikuti ('a', 'b', 'c')

Dengan tanda bintang, setiap pasangan di dalam list diteruskan sebagai argumen terpisah ke zip. Artinya sama dengan memanggil zip((1, 'a'), (2, 'b'), (3, 'c')), sehingga elemen pertama dari tiap pasangan dan elemen kedua dari tiap pasangan masing-masing dikumpulkan, terpecah menjadi 2 bagian yaitu (1, 2, 3) dan ('a', 'b', 'c'). Ini adalah teknik baku untuk mengembalikan data yang telah dipasangkan menjadi 2 bagian semula, dan jika zip dilewatkan dua kali akan kembali ke bentuk semula. Karena yang dikembalikan adalah tuple bukan list, tidak akan berbentuk tanda kurung siku. Jika lupa memberi tanda bintang dan menulis zip(pairs), pasangan itu sendiri diteruskan sebagai satu argumen, sehingga menjadi bentuk tuple berisi 1 elemen seperti ((1, 'a'),).

Soal 14 | dict dan zip

Menyusun dictionary dari urutan key dan urutan value. Manakah hasil eksekusi kode berikut?

keys = ["a", "b", "c"]vals = [10, 20, 30]print(dict(zip(keys, vals)))
  1. [('a', 10), ('b', 20), ('c', 30)]
  2. {10: 'a', 20: 'b', 30: 'c'}
  3. {'a', 'b', 'c', 10, 20, 30}
  4. {'a': 10, 'b': 20, 'c': 30}
JawabanD. {'a': 10, 'b': 20, 'c': 30}

zip(keys, vals) mengembalikan tuple (key, value) secara berurutan, dan dict() menerima urutan pasangan tersebut untuk membuat dictionary. Karena elemen pertama pasangan menjadi key dan elemen kedua menjadi value, tidak akan menjadi bentuk di mana angka menjadi key. Karena dilewatkan ke dict(), juga tidak akan tetap berupa list berisi tuple. Meski sama-sama ditampilkan dengan kurung kurawal, yang berpasangan dengan titik dua adalah dictionary, sedangkan yang hanya berupa deretan nilai adalah set.

Soal 15 | List comprehension

Saat kode berikut yang menggunakan list comprehension dijalankan, list apa yang ditampilkan?

print([n * n for n in range(1, 5)])
  1. [0, 1, 4, 9]
  2. [2, 4, 6, 8]
  3. [1, 4, 9, 16]
  4. [1, 4, 9, 16, 25]
JawabanC. [1, 4, 9, 16]

range(1, 5) mengembalikan 1, 2, 3, 4; angka 5 yang ditentukan sebagai stop tidak disertakan. Jika masing-masing dikuadratkan, menjadi 1, 4, 9, 16. Jika dianggap range dimulai dari 0, akan menjadi bentuk yang dimulai dari 0, dan jika keliru mengira stop disertakan, akan menjadi bentuk yang berlanjut hingga 25. Jika n * n dibaca keliru sebagai n * 2, akan menjadi bentuk yang bertambah 2 setiap kali. Perlu dibiasakan membaca comprehension sebagai mengevaluasi ekspresi di sebelah kiri untuk setiap elemen, lalu membuat list baru berisi hasilnya.

Soal 16 | Dict comprehension

Menjalankan comprehension dengan titik dua di dalam kurung kurawal. Manakah output dari kode berikut?

words = ["sun", "moon"]print({w: len(w) for w in words})
  1. {'sun': 3, 'moon': 4}
  2. [('sun', 3), ('moon', 4)]
  3. {3: 'sun', 4: 'moon'}
  4. {'sun', 'moon', 3, 4}
JawabanA. {'sun': 3, 'moon': 4}

Comprehension dengan titik dua di dalam kurung kurawal adalah dict comprehension; sisi kiri titik dua menjadi key, sisi kanan menjadi value. Di sini terbentuk dictionary dengan kata sebagai key dan jumlah karakternya sebagai value. Jika key dan value dibaca terbalik, akan menjadi bentuk di mana jumlah karakter menjadi key. Jika dibungkus tanda kurung siku akan menjadi list berisi tuple, tetapi di sini menggunakan kurung kurawal sehingga tidak menjadi bentuk itu. Jika tidak ada titik dua, akan menjadi set comprehension yang hanya menampilkan deretan value, tetapi karena ada titik dua, yang terbentuk pasti dictionary.

Soal 17 | Tipe dari tanda kurung

Sebuah ekspresi mirip comprehension dibungkus dengan tanda kurung biasa. Tipe apa yang ditampilkan ketika kode berikut dijalankan?

g = (n for n in range(3))print(type(g))
  1. <class 'range'>
  2. <class 'list'>
  3. <class 'generator'>
  4. <class 'tuple'>
JawabanC. <class 'generator'>

Di Python tidak ada penulisan yang disebut tuple comprehension, sehingga bentuk yang dibungkus tanda kurung biasa ini menjadi generator expression. Tipenya adalah generator, yang tidak membuat semua nilai terlebih dahulu melainkan menghitung satu per satu saat dibutuhkan, sehingga hemat memori, tetapi karena merupakan iterator, akan habis setelah dipakai sekali. Jika ingin tuple, bungkus dengan tuple(). Jika ditulis dengan tanda kurung siku akan menjadi list comprehension dengan tipe list, dan jika range(3) langsung ditugaskan akan menjadi range. tuple tidak diperoleh dengan penulisan ini.

Soal 18 | Set comprehension

Menghitung jumlah elemen wadah yang dibuat dengan set comprehension. Manakah output dari kode berikut?

print(len({n % 4 for n in range(10)}))
  1. Ditampilkan 3
  2. Ditampilkan 0
  3. Ditampilkan 10
  4. Ditampilkan 4
JawabanD. Ditampilkan 4

Sisa bagi setiap nilai dalam range(10) dibagi 4 adalah 0, 1, 2, 3, 0, 1, 2, 3, 0, 1. Comprehension dengan kurung kurawal tanpa titik dua adalah set comprehension, sehingga nilai yang duplikat dirangkum menjadi satu, dan yang tersisa hanya 4 jenis yaitu 0, 1, 2, 3. Jika terlewat bahwa duplikat hilang dan jumlah nilai dihitung apa adanya, akan menjadi 10. Jika terlewat bahwa 0 termasuk di antara sisa bagi dan dihitung hanya 1, 2, 3 sebagai 3 jenis, akan menjadi 3. Nilai 0 adalah nilai jika keliru dianggap comprehension tidak membuat apa pun, tetapi selama mengelilingi range(10), isinya tidak akan pernah kosong. Karena urutan tampilan set tidak ditentukan, cara paling pasti adalah memastikan lewat jumlah elemennya.

Soal 19 | Comprehension ganda

Menanyakan urutan hasil comprehension yang menjajarkan 2 buah for. Manakah hasil eksekusi kode berikut?

print([(x, y) for x in [1, 2] for y in "ab"])
  1. [(1, 'a'), (2, 'b'), (1, 'b'), (2, 'a')]
  2. [('a', 1), ('b', 1), ('a', 2), ('b', 2)]
  3. [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
  4. [(1, 'a'), (2, 'a'), (1, 'b'), (2, 'b')]
JawabanC. [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]

Ketika 2 for dijajarkan dalam comprehension, for yang ditulis di sebelah kiri menjadi loop terluar. Urutannya persis sama dengan jika ditulis sebagai pernyataan for bersarang biasa: x ditetapkan 1 sambil y berputar a, b, lalu x menjadi 2 dan hal yang sama diulang. Jika dibaca dengan for di sebelah kanan sebagai loop terluar, akan menjadi urutan di mana x berputar lebih dulu. Isi pasangan mengikuti urutan (x, y) yang ditulis pada ekspresi, sehingga huruf tidak akan muncul lebih dulu.

Soal 20 | Argumen start

Manakah penjelasan yang tepat mengenai argumen kedua start pada fungsi bawaan enumerate?

  1. Menentukan nomor berapa penghitungan dimulai. Jika dikosongkan, dihitung mulai dari 0
  2. Menentukan mulai dari elemen yang mana untuk diambil. Jika dikosongkan, diambil mulai dari awal
  3. Menentukan berapa elemen yang dilompati setiap kali. Jika dikosongkan, maju satu per satu
  4. Menentukan sampai elemen ke berapa dihitung. Jika dikosongkan, dihitung sampai akhir
JawabanA. Menentukan nomor berapa penghitungan dimulai. Jika dikosongkan, dihitung mulai dari 0

Argumen kedua start pada enumerate hanya menentukan mulai dari angka berapa nomor yang diberikan. Bakunya adalah 0, sehingga jika diberikan 1, akan menjadi nomor urut yang lebih alami bagi manusia. Yang penting dipahami adalah hanya cara penomoran yang berubah, sedangkan rentang atau jumlah elemen yang diambil tidak berubah. Tidak memiliki fungsi untuk membatasi jumlah atau melompati elemen, dan juga bukan untuk menggeser posisi awal pengambilan. Semua itu adalah penjelasan untuk alat lain seperti slicing.

Soal 21 | Nilai kembalian sort

Nilai kembalian metode sort pada list diterima dengan variabel. Manakah output dari kode berikut?

nums = [5, 3, 9]result = nums.sort()print(result)print(nums)
  1. [3, 5, 9] dan [3, 5, 9] ditampilkan dengan urutan ini
  2. None dan [5, 3, 9] ditampilkan dengan urutan ini
  3. [3, 5, 9] dan [5, 3, 9] ditampilkan dengan urutan ini
  4. None dan [3, 5, 9] ditampilkan dengan urutan ini
JawabanD. None dan [3, 5, 9] ditampilkan dengan urutan ini

sort adalah metode yang mengurutkan list di tempat (in place), dan nilai kembaliannya adalah None. Oleh karena itu, result akan berisi None, dan hasil pengurutan tetap berada pada nums. Jika dianggap list baru yang sudah diurutkan dikembalikan, akan terpilih bentuk di mana result berisi list. Jika terlewat bahwa sort mengubah list aslinya, akan terpilih bentuk di mana nums tetap dalam urutan semula. Jika menginginkan list yang sudah diurutkan sambil tetap menyimpan yang asli, gunakan fungsi bawaan sorted.

Soal 22 | Perbedaan sorted

Manakah perbedaan yang tepat antara metode sort pada list dan fungsi bawaan sorted?

  1. sort mengembalikan list baru, sorted mengurutkan di tempat dan mengembalikan None
  2. sort mengurutkan di tempat dan mengembalikan None, sorted mengembalikan list baru
  3. Keduanya sama-sama mengembalikan list baru, dan list aslinya sama-sama tidak berubah
  4. Keduanya sama-sama mengurutkan di tempat lalu mengembalikan list yang sudah diurutkan
JawabanB. sort mengurutkan di tempat dan mengembalikan None, sorted mengembalikan list baru

sort adalah metode list, mengurutkan list itu sendiri, dan mengembalikan None sebagai nilai kembalian. sorted adalah fungsi bawaan, tidak mengubah urutan asli sama sekali, dan mengembalikan list baru yang sudah diurutkan. Pemilihan tergantung apakah ingin menyimpan yang asli atau tidak. Jika peran keduanya tertukar, akan menjadi penjelasan bahwa sort mengembalikan list baru. Jika sifat destruktif disamaratakan ke salah satu, akan menjadi penjelasan bahwa keduanya sama-sama mengurutkan di tempat atau keduanya sama-sama tidak mengubah aslinya. Perlu dicatat, sorted juga bisa menerima objek iterable selain list, dan hasilnya selalu berupa list.

Soal 23 | Perbedaan append

Membandingkan 2 cara menambahkan list lain ke sebuah list. Manakah output dari kode berikut?

a = [1, 2]a.append([3, 4])b = [1, 2]b.extend([3, 4])print(a, b)
  1. [1, 2, [3, 4]] [1, 2, [3, 4]]
  2. [1, 2, 3, 4] [1, 2, [3, 4]]
  3. [1, 2, 3, 4] [1, 2, 3, 4]
  4. [1, 2, [3, 4]] [1, 2, 3, 4]
JawabanD. [1, 2, [3, 4]] [1, 2, 3, 4]

append menambahkan argumen secara utuh sebagai satu elemen di akhir, sehingga jika diberikan list akan menjadi bersarang dan panjangnya bertambah 1. extend mengambil nilai dari argumen dengan mengiterasinya lalu menambahkan satu per satu, sehingga isinya terurai dan panjangnya bertambah 2. Jika kedua peran tertukar, hasil a dan b akan terbalik. Jika keduanya dianggap sama fungsinya, akan menjadi bentuk keduanya bersarang atau keduanya rata. Perlu diingat juga bahwa kedua metode ini sama-sama mengembalikan None, sehingga hasilnya tidak boleh diterima dengan variabel.

Soal 24 | Salinan dangkal

List bersarang digandakan dengan slicing, lalu bagian dalamnya diubah. Manakah hasil eksekusi kode berikut?

orig = [[1, 2], [3, 4]]copy1 = orig[:]copy1[0].append(9)print(orig)
  1. [[1, 2, 9], [3, 4, 9]]
  2. [[1, 2, 9], [3, 4]]
  3. [[1, 2], [3, 4]]
  4. [[1, 2], [3, 4], 9]
JawabanB. [[1, 2, 9], [3, 4]]

Penggandaan dengan slicing adalah salinan dangkal (shallow copy): list luar dibuat baru, tetapi elemen di dalamnya berbagi objek yang sama dengan aslinya. copy1[0] dan orig[0] menunjuk pada list yang sama, sehingga append ke sana juga terlihat pada sisi aslinya. Jika dianggap bisa sepenuhnya terpisah, akan menjadi bentuk yang aslinya tidak berubah. Karena yang diubah hanya list bagian dalam yang pertama, tidak akan merambat ke elemen di belakangnya, dan karena tidak ditambahkan ke luar, 9 juga tidak akan berjajar di list luar. Untuk memisahkan hingga ke bagian dalam, gunakan copy.deepcopy.

Soal 25 | Salinan dalam

Membandingkan deep copy dan shallow copy dalam satu kode. Bagaimana keadaan base setelah dijalankan?

import copybase = [[1, 2], [3, 4]]d = copy.deepcopy(base)s = base[:]d[0].append(8)s[1].append(7)print(base)
  1. [[1, 2], [3, 4]]
  2. [[1, 2, 8], [3, 4, 7]]
  3. [[1, 2, 8], [3, 4]]
  4. [[1, 2], [3, 4, 7]]
JawabanD. [[1, 2], [3, 4, 7]]

copy.deepcopy menggandakan hingga ke isi yang bersarang, sehingga d[0] menjadi list yang berbeda dari base[0], dan append ke sana tidak sampai ke base. Sebaliknya s adalah shallow copy, sehingga s[1] dan base[1] adalah list yang sama, dan append ke sana pun terlihat pada base. Oleh karena itu, hanya elemen belakang yang bertambah. Jika dianggap keduanya sampai ke base, kedua elemen dalam akan sama-sama bertambah, dan jika dianggap keduanya tidak sampai, akan tetap seperti semula. Jika deep copy dan shallow copy tertukar, hanya elemen depan yang akan bertambah.

Soal 26 | Jebakan perkalian

Mencoba membuat tabel dua dimensi dengan perkalian list. Manakah hasil eksekusi kode berikut?

grid = [[0] * 3] * 2grid[0][1] = 5print(grid)
  1. [[0, 0, 0], [0, 5, 0]]
  2. [[5, 0, 0], [5, 0, 0]]
  3. [[0, 5, 0], [0, 0, 0]]
  4. [[0, 5, 0], [0, 5, 0]]
JawabanD. [[0, 5, 0], [0, 5, 0]]

Perkalian di sisi luar tidak membuat baris baru, melainkan hanya menjajarkan 2 referensi ke satu list yang sama. grid[0] dan grid[1] adalah entitas yang sama, sehingga mengubah posisi indeks 1 pada salah satunya akan terlihat berubah juga pada posisi yang sama di sisi lainnya. Jika dianggap tiap baris independen, akan menjadi bentuk di mana hanya salah satu baris yang berubah. Karena yang diubah adalah posisi indeks 1, tidak akan menjadi bentuk di mana posisi awal menjadi 5. Untuk membuat tiap baris independen, tulis [[0] * 3 for _ in range(2)].

Soal 27 | Tuple satu elemen

Membandingkan tipe dari nilai yang hanya dikelilingi tanda kurung biasa, dengan nilai yang diberi koma di akhir. Manakah output dari kode berikut?

x = (7)y = (7,)print(type(x).__name__, type(y).__name__)
  1. int dan int ditampilkan dengan urutan ini
  2. tuple dan tuple ditampilkan dengan urutan ini
  3. tuple dan int ditampilkan dengan urutan ini
  4. int dan tuple ditampilkan dengan urutan ini
JawabanD. int dan tuple ditampilkan dengan urutan ini

Yang menentukan tuple bukanlah tanda kurung, melainkan koma. (7) hanyalah bilangan bulat yang dikelilingi tanda kurung untuk menunjukkan prioritas operasi, sehingga tipenya int; baru dengan menambahkan koma di akhir seperti (7,) menjadi tuple berisi 1 elemen. Jika dianggap mengelilingi dengan tanda kurung sudah cukup membuat tuple, akan terpilih bentuk keduanya tuple. Jika kedua hal ini tertukar, akan menjadi bentuk urutan terbalik atau keduanya int. Perlu dicatat, tuple kosong adalah pengecualian, ditulis sebagai () tanpa koma.

Soal 28 | Isi tuple

Mencoba menambahkan elemen ke list yang dimasukkan ke dalam tuple. Manakah hasil eksekusi kode berikut?

t = (1, [2, 3], 4)t[1].append(5)print(t)
  1. TypeError dilontarkan
  2. (1, [2, 3], 4, 5)
  3. (1, [2, 3, 5], 4)
  4. (1, [2, 3], 4)
JawabanC. (1, [2, 3, 5], 4)

Yang dibekukan oleh tuple adalah keterkaitan menunjuk ke elemen mana, bukan isi dari apa yang ditunjuk. t[1] adalah list, dan list itu sendiri bersifat mutable sehingga bisa di-append. Penulisan seperti t[1] = [] yang menugaskan langsung ke elemen tuple akan menimbulkan TypeError, tetapi di sini bukan itu yang dilakukan, elemen tidak diganti. Karena yang ditambahkan berada di dalam list, panjang tuple tidak akan bertambah, dan juga tidak akan tetap sama sekali tidak berubah.

Soal 29 | Penugasan slice

Menugaskan list dengan panjang berbeda ke slice sebuah list. Manakah output dari kode berikut?

x = [1, 2, 3, 4, 5]x[1:3] = [9]print(x)
  1. [1, 9, 4, 5]
  2. [1, 9, 3, 4, 5]
  3. [1, 9, 9, 4, 5]
  4. [1, 2, 9, 4, 5]
JawabanA. [1, 9, 4, 5]

Penugasan ke slice adalah operasi yang mengganti seluruh rentang yang ditentukan dengan isi ruas kanan. x[1:3] menunjuk pada 2 elemen yaitu 2 dan 3, dan itu digantikan oleh 1 elemen yaitu 9, sehingga panjang keseluruhan berkurang dari 5 menjadi 4. Jika dianggap hanya 1 elemen yang digantikan, akan menjadi bentuk dengan panjang tetap 5, dan jika dianggap ruas kanan diregangkan menyesuaikan lebar, akan menjadi bentuk 2 buah 9 berjajar. Jika awal rentang dibaca bergeser 1, akan menjadi bentuk yang menyisakan 2. Ciri khas penugasan slice adalah lebar ruas kiri dan panjang ruas kanan boleh berbeda.

Soal 30 | Penyisipan dan penghapusan

Melakukan penugasan ke slice berlebar 0 lalu del secara berurutan. Manakah hasil eksekusi kode berikut?

y = [1, 2, 3]y[1:1] = [7, 8]del y[0]print(y)
  1. [7, 8, 3]
  2. [1, 7, 8, 3]
  3. [7, 8, 2, 3]
  4. [2, 3, 7, 8]
JawabanC. [7, 8, 2, 3]

y[1:1] adalah rentang berlebar 0, sehingga penugasan ke sana menjadi penyisipan tanpa disertai penghapusan, dan list menjadi [1, 7, 8, 2, 3]. del y[0] berikutnya menghapus 1 di posisi awal, sehingga tersisa [7, 8, 2, 3]. Jika dibaca seolah 1 elemen asli ikut terhapus saat penyisipan, akan menjadi bentuk 7 8 3, dan jika dianggap del menghapus posisi lain, akan menjadi bentuk yang menyisakan 1 di depan. Jika salah baca seolah ditambahkan di akhir, akan menjadi bentuk 2 dan 3 datang lebih dulu. Perlu diingat juga bahwa del adalah pernyataan sehingga tidak memiliki nilai kembalian, dan menghapus tanpa mengambil nilainya.

Soal 31 | Nilai baku get

Mengambil key yang tidak ada di dictionary dengan get. Manakah isi yang ditampilkan ketika kode berikut dijalankan?

d = {"a": 1, "b": 2}print(d.get("z"), d.get("z", 0))
  1. None dan 0 ditampilkan dengan urutan ini
  2. Yang pertama melontarkan KeyError
  3. None dan None ditampilkan dengan urutan ini
  4. 0 dan 0 ditampilkan dengan urutan ini
JawabanA. None dan 0 ditampilkan dengan urutan ini

get tidak melontarkan exception ketika key tidak ada; jika argumen kedua dikosongkan akan mengembalikan None, dan jika diberikan akan mengembalikan nilai tersebut. Oleh karena itu yang pertama menjadi None, yang kedua menjadi 0. Jika dianggap 0 juga dikembalikan saat argumen kedua kosong, keduanya akan menjadi 0, dan jika dianggap argumen kedua diabaikan, keduanya akan menjadi None. Jika ditulis dengan tanda kurung siku d["z"], akan menjadi KeyError, dan get adalah alat untuk menghindari hal itu.

Soal 32 | setdefault

Memanggil setdefault untuk key yang sudah ada dan yang belum ada. Manakah output dari kode berikut?

d = {"a": 1}print(d.setdefault("a", 99))print(d.setdefault("b", 99))print(d)
  1. 99 dan 99, lalu {'a': 99, 'b': 99} ditampilkan
  2. 1 dan 99, lalu {'a': 1, 'b': 99} ditampilkan
  3. 1 dan None, lalu {'a': 1, 'b': None} ditampilkan
  4. 1 dan 99, lalu {'a': 1} ditampilkan
JawabanB. 1 dan 99, lalu {'a': 1, 'b': 99} ditampilkan

setdefault, jika key sudah ada, hanya mengembalikan nilai yang sudah ada tanpa mengubah dictionary. Jika key belum ada, menyisipkan argumen kedua sebagai nilai lalu mengembalikan nilai tersebut. Oleh karena itu panggilan pertama mengembalikan nilai lama 1 dan dictionary tetap sama, panggilan kedua menyisipkan 99 dan mengembalikan 99. Jika dianggap nilai yang sudah ada pun ikut ditimpa, keduanya akan menjadi 99, dan jika dianggap tidak terjadi penyisipan, dictionary tidak akan bertambah. Jika argumen kedua dikosongkan, nilai yang disisipkan menjadi None, sehingga bentuk yang berisi None adalah hasil ketika argumen kedua tidak ditulis.

Soal 33 | Yang diperiksa in

Memastikan apa yang diperiksa operator in pada dictionary. Manakah output dari kode berikut?

d = {"x": 1, "y": 2}print("x" in d, 1 in d, 1 in d.values())
  1. True False True ditampilkan dengan urutan ini
  2. True True True ditampilkan dengan urutan ini
  3. True False False ditampilkan dengan urutan ini
  4. False True True ditampilkan dengan urutan ini
JawabanA. True False True ditampilkan dengan urutan ini

Operator in pada dictionary hanya memeriksa key. "x" ada sebagai key sehingga True, sedangkan 1 ada sebagai value tetapi tidak ada sebagai key sehingga False. Jika ingin memeriksa value, gunakan d.values() sebagai objeknya, yang akan menjadi True. Jika dianggap in juga melihat value, semuanya akan menjadi True, dan jika dianggap values() pun tidak memeriksa value, hasil terakhir akan menjadi False. Jika peran key dan value tertukar, hasil pertama akan menjadi False. Memeriksa ada tidaknya key terlebih dahulu sebelum mengambil dengan tanda kurung siku adalah pola pemakaian yang umum.

Soal 34 | Duplikasi key

Menulis key yang sama dua kali di dalam literal dictionary. Manakah hasil eksekusi kode berikut?

d = {"a": 1, "b": 2, "a": 3}print(d)
  1. {'a': 3, 'b': 2}
  2. {'a': 1, 'b': 2}
  3. {'b': 2, 'a': 3}
  4. {'a': 3, 'b': 3}
JawabanA. {'a': 3, 'b': 2}

Literal dictionary membuat entri secara berurutan dari kiri, sehingga jika key yang sama muncul dua kali, nilai belakangan menimpa nilai sebelumnya. Ini tidak menjadi error maupun peringatan. Jika dianggap yang ditulis lebih dulu yang bertahan, nilai a akan tetap 1. Selain itu, dictionary mempertahankan urutan penyisipan, dan penimpaan tidak menggeser posisi, sehingga a tetap berada di urutan depan. Oleh karena itu, urutan key tidak akan tertukar, dan nilai b pun tidak akan ikut berubah.

Soal 35 | Cara membuat dictionary

Membandingkan dictionary yang dibuat dari keyword argument dengan yang dibuat dari urutan pasangan. Manakah output dari kode berikut?

d1 = dict(x=1, y=2)d2 = dict([("x", 1), ("y", 2)])print(d1 == d2)print(d1)
  1. False lalu {'x': 1, 'y': 2} ditampilkan
  2. True lalu {1: 'x', 2: 'y'} ditampilkan
  3. True lalu {'x': 1, 'y': 2} ditampilkan
  4. True lalu [('x', 1), ('y', 2)] ditampilkan
JawabanC. True lalu {'x': 1, 'y': 2} ditampilkan

dict bisa membuat dictionary baik dari keyword argument maupun dari urutan pasangan (key, value). Dengan penulisan mana pun terbentuk dictionary dengan isi yang sama, sehingga perbandingannya True. Jika dianggap cara pembuatan yang berbeda menghasilkan objek yang berbeda, perbandingan akan menjadi False. Karena nama keyword argument langsung menjadi string key, key dan value tidak akan tertukar. Karena sudah dilewatkan ke dict, hasilnya pun tidak akan tetap berupa urutan pasangan.

Soal 36 | Kurung kurawal kosong

Membandingkan tipe dari kurung kurawal kosong dengan set(). Manakah 2 nama tipe yang ditampilkan saat kode berikut dijalankan?

a = {}b = set()print(type(a).__name__, type(b).__name__)
  1. dict dan dict ditampilkan dengan urutan ini
  2. set dan set ditampilkan dengan urutan ini
  3. dict dan set ditampilkan dengan urutan ini
  4. set dan dict ditampilkan dengan urutan ini
JawabanC. dict dan set ditampilkan dengan urutan ini

{1, 2} yang berisi elemen menjadi set, tetapi jika isinya kosong, tidak bisa ditentukan apakah itu dictionary atau set. Python memperlakukan kasus ini sebagai dictionary, sehingga {} adalah dictionary kosong. Jika ingin set kosong, harus ditulis set(). Jika dianggap kurung kurawal selalu berarti set, keduanya akan menjadi set, dan jika keduanya tertukar, urutannya akan terbalik. Jika dianggap set() pun menjadi dictionary, keduanya akan menjadi dict. Karena set dan dictionary sama-sama menggunakan kurung kurawal, pembedaan ini mudah tertukar.

Soal 37 | Operasi set

Melakukan operasi irisan dan selisih simetris pada 2 buah set. Manakah output dari kode berikut?

s1 = {1, 2, 3, 4}s2 = {3, 4, 5}print(sorted(s1 & s2), sorted(s1 ^ s2))
  1. [3, 4] dan [1, 2, 3, 4, 5] ditampilkan dengan urutan ini
  2. [1, 2, 5] dan [3, 4] ditampilkan dengan urutan ini
  3. [3, 4] dan [1, 2] ditampilkan dengan urutan ini
  4. [3, 4] dan [1, 2, 5] ditampilkan dengan urutan ini
JawabanD. [3, 4] dan [1, 2, 5] ditampilkan dengan urutan ini

Tanda ampersand adalah irisan (intersection), sehingga 3 dan 4 yang ada di keduanya tersisa. Tanda topi (^) adalah selisih simetris, mengumpulkan elemen yang hanya ada di salah satu pihak, sehingga 1 dan 2 yang hanya ada di s1, serta 5 yang hanya ada di s2, tersisa, sementara 3 dan 4 yang sama-sama dimiliki gugur. Jika selisih simetris tertukar dengan selisih (difference), akan menjadi bentuk tanpa 5. Jika kedua operasi tertukar, urutan output akan terbalik. Jika selisih simetris tertukar dengan gabungan (union), akan menjadi bentuk yang juga menyertakan 3 dan 4. Karena urutan tampilan set tidak ditentukan, di sini dipastikan dengan menjajarkannya lewat sorted.

Soal 38 | Penghapusan duplikat

Melewatkan list yang mengandung duplikat ke set. Manakah output ketika kode berikut dijalankan?

data = [3, 1, 3, 2, 1, 1]print(len(set(data)), sorted(set(data)))
  1. 6 dan [3, 1, 3, 2, 1, 1] ditampilkan dengan urutan ini
  2. 6 dan [1, 2, 3] ditampilkan dengan urutan ini
  3. 3 dan [3, 1, 2] ditampilkan dengan urutan ini
  4. 3 dan [1, 2, 3] ditampilkan dengan urutan ini
JawabanD. 3 dan [1, 2, 3] ditampilkan dengan urutan ini

Jika list dilewatkan ke set, duplikat dihilangkan sehingga tersisa 3 jenis nilai yaitu 1, 2, 3, dan panjangnya adalah 3. Jika set dilewatkan ke sorted, dikembalikan list baru yang diurutkan menaik. Jika dianggap duplikat tetap tersisa, jumlahnya akan menjadi 6. Karena sorted mengurutkan berdasarkan besar-kecil bukan urutan kemunculan asli, hasilnya pun tidak akan berurutan sesuai kemunculan pertama. Karena urutan tampilan set itu sendiri tidak memiliki makna, jika ingin dijajarkan gunakan sorted.

Soal 39 | Syarat elemen

Mencoba menambahkan tuple lalu list secara berurutan ke sebuah set. Apa yang terjadi ketika kode berikut dijalankan?

s = set()s.add((1, 2))s.add([3, 4])print(len(s))
  1. Ditampilkan 1, list dikonversi menjadi tuple
  2. Terjadi TypeError karena list tidak bisa dimasukkan ke set
  3. Terjadi ValueError karena tipe elemen tidak boleh campur
  4. Ditampilkan 2, kedua elemen sama-sama masuk ke set
JawabanB. Terjadi TypeError karena list tidak bisa dimasukkan ke set

Elemen set dan key dictionary harus bersifat hashable. Tuple tidak bisa diubah isinya sehingga hashable dan bisa ditambahkan, tetapi list bisa berubah isinya di kemudian hari sehingga tidak hashable, dan akan menjadi TypeError dengan pesan unhashable type. Jika dianggap keduanya bisa masuk, akan ditampilkan 2, dan jika dianggap list dikonversi diam-diam menjadi tuple, akan ditampilkan 1. Karena tipe yang bercampur itu sendiri bukan masalah, alasan yang menyebut ValueError pun keliru.

Soal 40 | Tiga cara pengambilan

Manakah kombinasi yang tepat mengenai apa yang dikembalikan metode dictionary keys, values, dan items masing-masing?

  1. keys mengembalikan pasangan value, values mengembalikan pasangan key, items mengembalikan jumlah item
  2. keys mengembalikan pasangan key dan value, values mengembalikan key, items mengembalikan value
  3. keys mengembalikan value, values mengembalikan key, items mengembalikan pasangan antar value
  4. keys mengembalikan key, values mengembalikan value, items mengembalikan pasangan key dan value
JawabanD. keys mengembalikan key, values mengembalikan value, items mengembalikan pasangan key dan value

keys mengembalikan hanya key, values mengembalikan hanya value, dan items mengembalikan tuple (key, value) secara berurutan. Ketika menelusuri dictionary, pola bakunya adalah menerima dengan 2 variabel seperti for k, v in d.items(). Jika ketiga peran ini tertukar dalam ingatan, akan menjadi penjelasan bahwa keys mengembalikan value. Yang dikembalikan items adalah urutan item, bukan jumlahnya, sehingga penjelasan bahwa items mengembalikan jumlah item juga keliru; jika ingin tahu jumlahnya gunakan len. Perlu dicatat, jika dictionary langsung dilewatkan ke for, yang diambil adalah key.

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