Ruang Belajar Karinoya

Kualifikasi · Lab Lulus Cloud / AI / Python

Tipe dan String Python

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 | Materi utama

Buku apa yang benar sebagai materi utama untuk Ujian Sertifikasi Dasar Engineer Python 3?

  1. 『Pythonチュートリアル』(Python Tutorial) yang diterbitkan oleh O'Reilly Japan
  2. 『あたらしいデータ分析の教科書』(Buku Teks Baru Analisis Data) yang diterbitkan oleh Shoeisha
  3. 『Pythonデータ分析 実践ハンドブック』(Buku Pegangan Praktis Analisis Data Python) yang diterbitkan oleh Impress
  4. 『Python実践レシピ』(Resep Praktis Python) yang diterbitkan oleh Gijutsu-Hyoron
JawabanA. 『Pythonチュートリアル』(Python Tutorial) yang diterbitkan oleh O'Reilly Japan

Materi utama ujian dasar adalah 『Pythonチュートリアル』(Python Tutorial) terbitan O'Reilly Japan, dan halaman resmi menyatakan bahwa sejak 1 September 2021 ujian mengacu pada edisi ke-4. Cakupan soal pun dipublikasikan berdasarkan nomor dan judul bab buku ini, sehingga persiapan dilakukan dengan menguasai isi buku ini sesuai bobot tiap bab. 『Python実践レシピ』terbitan Gijutsu-Hyoron adalah materi utama ujian praktik, 『Pythonによるあたらしいデータ分析の教科書』terbitan Shoeisha adalah materi ujian analisis data, dan 『Pythonデータ分析 実践ハンドブック』terbitan Impress adalah materi utama ujian praktik analisis data; semuanya adalah materi untuk ujian lain yang diselenggarakan oleh asosiasi yang sama. Jika materi tertukar, waktu akan habis mempelajari hal di luar cakupan, sehingga ini perlu dipastikan lebih dulu.

Soal 2 | Bab terbanyak

Dalam cakupan soal ujian dasar, bab mana dari materi utama yang paling banyak soalnya?

  1. Bab 5 「データ構造」(Struktur Data)
  2. Bab 4 「制御構造ツール」(Alat Struktur Kontrol)
  3. Bab 3 「気楽な入門編」(Pengantar Santai)
  4. Bab 8 「エラーと例外」(Error dan Exception)
JawabanB. Bab 4 「制御構造ツール」(Alat Struktur Kontrol)

Yang paling banyak adalah Bab 4 「制御構造ツール」(Alat Struktur Kontrol), dengan 9 dari 40 soal. Berikutnya Bab 5 「データ構造」(Struktur Data) dengan 7 soal, lalu Bab 3 「気楽な入門編」(Pengantar Santai) dengan 6 soal, dan Bab 8 「エラーと例外」(Error dan Exception) dengan 4 soal. Hanya dengan Bab 3, 4, dan 5 saja sudah mencapai 22 soal, lebih dari separuh keseluruhan. Oleh karena itu, masuk akal untuk mengalokasikan waktu belajar lebih banyak pada tiga bab ini, terutama Bab 4 yang membahas pernyataan for dan definisi fungsi; menundanya bisa berakibat fatal.

Soal 3 | Alokasi per bab

Dalam cakupan soal ujian dasar, berapa persen porsi yang ditempati Bab 4 「制御構造ツール」(Alat Struktur Kontrol)?

  1. 17,5%
  2. 10,0%
  3. 22,5%
  4. 15,0%
JawabanC. 22,5%

Bab 4 「制御構造ツール」(Alat Struktur Kontrol) memiliki 9 dari 40 soal, yaitu 22,5 persen. Ini adalah yang terbesar per bab, diikuti oleh Bab 5 「データ構造」(Struktur Data) dengan 7 soal, yaitu 17,5 persen. 15,0 persen setara dengan 6 soal Bab 3 「気楽な入門編」(Pengantar Santai), dan 10,0 persen setara dengan 4 soal, yaitu porsi Bab 8 「エラーと例外」(Error dan Exception) maupun Bab 10 「標準ライブラリめぐり」(Tur Standard Library). Alokasi ini bukan angka operasional, melainkan dipublikasikan sebagai cakupan soal itu sendiri, sehingga bisa dipakai sebagai dasar rencana belajar.

Soal 4 | Alokasi Bab 13

Dalam cakupan soal ujian dasar, berapa jumlah soal yang dialokasikan untuk Bab 13 「次はなに?」(Apa Selanjutnya?)?

  1. 0 soal
  2. 1 soal
  3. 4 soal
  4. 2 soal
JawabanA. 0 soal

Bab 13 「次はなに?」(Apa Selanjutnya?) memiliki 0 soal, satu-satunya bab yang sama sekali tidak keluar dalam cakupan soal. Karena isinya memandu langkah belajar berikutnya, bab ini dikecualikan sebagai objek untuk ujian tata bahasa. Bab yang dialokasikan 1 soal adalah Bab 1, 2, 7, 11, 12, dan 14; yang 2 soal adalah Bab 6 dan 9; dan yang 4 soal adalah Bab 8 「エラーと例外」(Error dan Exception) dan Bab 10 「標準ライブラリめぐり」(Tur Standard Library). Selain Bab 13, semua bab memiliki minimal 1 soal, sehingga bab dengan alokasi sedikit pun tetap perlu dipersiapkan setidaknya dengan meninjau istilahnya.

Soal 5 | sep pada print

Saat program berikut dijalankan, string apa yang ditampilkan di layar?

print('Python', 3, 'exam', sep='/')
  1. Python3exam
  2. Python 3 exam
  3. Python/3/exam/
  4. Python/3/exam
JawabanD. Python/3/exam

print() menghubungkan argumen yang diterima dengan keyword argument sep. Nilai baku sep adalah satu spasi, sehingga jika tidak ditentukan hasilnya Python 3 exam, tetapi di sini sep='/' ditentukan sehingga tersambung dengan garis miring menjadi Python/3/exam. Python3exam adalah output jika sep dikosongkan menjadi string kosong. Memilih Python/3/exam/ yang memiliki pemisah juga di akhir terjadi jika sep dianggap ditambahkan setelah setiap elemen, padahal sebenarnya hanya disisipkan di antara argumen. Yang ditambahkan di akhir adalah end.

Soal 6 | end pada print

Saat 3 baris berikut dijalankan berurutan dari atas, apa yang muncul di layar?

print('A', end='')print('B', end='')print('C')
  1. AB dan C ditampilkan dalam 2 baris
  2. ABC ditampilkan hanya dalam 1 baris
  3. A B C ditampilkan hanya dalam 1 baris
  4. A, B, C ditampilkan dalam 3 baris
JawabanB. ABC ditampilkan hanya dalam 1 baris

print() menambahkan keyword argument end di akhir output. Nilai bakunya adalah karakter baris baru, sehingga jika tidak ditentukan, setiap pemanggilan print() akan pindah baris. Di sini, 2 pemanggilan pertama menggunakan end='' sehingga tidak pindah baris, membuat A dan B tampil berurutan tanpa jeda; pemanggilan print() terakhir menggunakan end baku sehingga pindah baris, dan hasilnya ABC tampil hanya dalam 1 baris. Munculnya spasi seperti A B C terjadi jika 3 argumen diberikan dalam satu pemanggilan print(); terbagi 3 baris terjadi jika end sama sekali tidak ditentukan; dan 2 baris terjadi jika hanya salah satu end='' yang dihilangkan.

Soal 7 | Output unpack

Manakah output dari program berikut yang membentangkan (unpack) sebuah list untuk ditampilkan?

nums = [10, 20, 30]print(*nums, sep=', ')
  1. Ditampilkan 10, 20, 30
  2. Ditampilkan 102030
  3. Ditampilkan [10, 20, 30]
  4. Ditampilkan 10 20 30
JawabanA. Ditampilkan 10, 20, 30

print(*nums) dengan tanda bintang meneruskan setiap elemen list sebagai argumen terpisah ke print(). Karena itu 3 argumen disambungkan dengan sep, dan karena sep=', ' hasilnya menjadi 10, 20, 30. Jika ditulis print(nums) tanpa tanda bintang, list diteruskan sebagai satu argumen sehingga tanda kurung siku ikut tampil apa adanya sebagai [10, 20, 30]. Jika sep tidak ditentukan, hasilnya 10 20 30 dengan spasi baku, dan jika sep='' hasilnya 102030 tanpa jeda.

Soal 8 | Tanda komentar

Manakah penjelasan yang benar mengenai komentar di Python?

  1. Bagian yang dikelilingi /* dan */ diabaikan sebagai komentar
  2. Bagian dari # sampai akhir baris diabaikan sebagai komentar
  3. Bagian dari -- sampai akhir baris diabaikan sebagai komentar
  4. Bagian dari // sampai akhir baris diabaikan sebagai komentar
JawabanB. Bagian dari # sampai akhir baris diabaikan sebagai komentar

Komentar di Python ditulis dengan tanda pagar (#), dan bagian dari situ sampai akhir baris diabaikan. Jika diletakkan di awal baris, seluruh baris menjadi objek; jika di tengah, bagian setelahnya yang menjadi objek. Tidak ada sintaks khusus untuk merangkum beberapa baris sekaligus, sehingga tanda pagar diletakkan per baris. Penulisan yang dikelilingi tanda kutip tiga kadang dipakai sebagai pengganti komentar blok, tetapi secara tata bahasa itu adalah string literal, dan jika diletakkan di awal fungsi atau kelas akan disimpan sebagai docstring saat dieksekusi. Garis miring ganda (//) di Python adalah operator floor division, sedangkan pasangan garis miring-bintang atau dua tanda hubung adalah notasi komentar bahasa lain.

Soal 9 | Indentasi

Apa yang terjadi ketika program berikut disimpan ke file dan dijalankan?

if True:    print('one')        print('two')
  1. Hanya two yang ditampilkan lalu proses selesai
  2. Hanya one yang ditampilkan lalu proses selesai
  3. one dan two ditampilkan dengan urutan ini
  4. Terjadi IndentationError dan berhenti
JawabanD. Terjadi IndentationError dan berhenti

Python menyatakan blok dengan kedalaman indentasi, sehingga pernyataan yang termasuk blok yang sama harus memiliki lebar indentasi yang seragam. Hanya baris ke-3 yang lebih dalam, padahal baris sebelumnya bukan baris yang memulai blok baru (baris yang diakhiri titik dua), sehingga terjadi IndentationError: unexpected indent. Ini terdeteksi pada analisis sintaks sebelum eksekusi, sehingga print pada baris ke-2 pun tidak dijalankan, dan one pun tidak ditampilkan. Jika indentasi tidak dilakukan pada tempat yang seharusnya, muncul expected an indented block, dan jika lebarnya tidak cocok di tengah jalan muncul unindent does not match any outer indentation level, tetapi keduanya tetap merupakan IndentationError.

Soal 10 | Kode karakter

Manakah penjelasan yang benar mengenai encoding karakter berkas sumber Python 3?

  1. Shift_JIS adalah baku, dan dapat diubah dengan deklarasi
  2. UTF-8 adalah baku, dan bahasa Jepang bisa langsung ditulis
  3. EUC-JP adalah baku, dan bahasa Jepang bisa langsung ditulis
  4. ASCII adalah baku, dan untuk menyertakan bahasa Jepang diperlukan deklarasi
JawabanB. UTF-8 adalah baku, dan bahasa Jepang bisa langsung ditulis

Berkas sumber Python 3 secara baku dibaca sebagai UTF-8, sehingga bahasa Jepang bisa langsung ditulis baik di komentar maupun string literal. Pada Python 2, bakunya adalah ASCII, sehingga untuk menyertakan bahasa Jepang perlu menulis deklarasi coding di baris pertama atau kedua berkas, tetapi di Python 3 deklarasi tersebut sudah tidak diperlukan lagi. Deklarasi hanya perlu ditulis jika ingin membaca berkas yang disimpan dengan encoding selain UTF-8. Perlu dicatat, identifier (nama variabel atau fungsi) juga bisa memakai bahasa Jepang, tetapi tidak direkomendasikan dari sudut pandang keterbacaan.

Soal 11 | Tipe hasil pembagian

Program berikut yang menangani pembagian antar bilangan bulat menampilkan nilai di baris 1 dan nama tipe di baris 2. Manakah kombinasinya?

print(9 / 3)print(type(9 / 3).__name__)
  1. Nilai 3.0, tipe int
  2. Nilai 3.0, tipe float
  3. Nilai 3, tipe int
  4. Nilai 3, tipe float
JawabanB. Nilai 3.0, tipe float

Satu garis miring / adalah pembagian sejati (true division), hasilnya selalu float. Bahkan ketika hasil bagi habis pun tidak terkecuali, sehingga 9 / 3 bukan 3 melainkan 3.0, dan tipenya pun float. Jika berpikir bahwa perhitungan antar bilangan bulat akan menghasilkan int, akan salah memilih 3 dan int; jika ingin int perlu menggunakan floor division, yaitu ditulis 9 // 3, yang barulah menghasilkan 3 dan int. Kombinasi di mana tampilan nilai dan tipe tidak cocok seperti 3 dengan float atau 3.0 dengan int tidak muncul dari ekspresi ini.

Soal 12 | Floor division bilangan negatif

Manakah output dari program berikut yang menjajarkan floor division?

print(9 // 4)print(-9 // 4)
  1. Baris 1 adalah 2.0, baris 2 adalah -3.0
  2. Baris 1 adalah 2, baris 2 adalah -3
  3. Baris 1 adalah 2.25, baris 2 adalah -2.25
  4. Baris 1 adalah 2, baris 2 adalah -2
JawabanB. Baris 1 adalah 2, baris 2 adalah -3

Dua garis miring // adalah floor division, membulatkan hasil bagi ke arah bawah, yaitu ke arah yang lebih kecil pada garis bilangan. Karena 9 / 4 adalah 2,25 maka 9 // 4 adalah 2, dan karena -9 / 4 adalah -2,25 maka -9 // 4 bukan -2 melainkan -3. Poin pentingnya adalah arahnya bukan mendekati 0; memilih -2 terjadi jika dianggap dibulatkan ke arah 0 seperti pada bahasa C. 2,25 dan -2,25 adalah nilai jika memakai / bukan //, dan 2,0 serta -3,0 adalah nilai jika salah satu operand dicampur float sehingga ditulis 9.0 // 4; jika kedua sisi int, hasilnya pun int.

Soal 13 | divmod

Nilai apa yang dikembalikan oleh divmod(-11, 3)?

  1. (-4, 1)
  2. (-3, -2)
  3. (-4, -2)
  4. (-3, 2)
JawabanA. (-4, 1)

divmod(a, b) mengembalikan tuple (a // b, a % b). Karena // di Python membulatkan ke arah bawah, -11 // 3 menjadi -4, dan tanda sisa bagi mengikuti tanda ruas kanan, sehingga -11 % 3 menjadi 1. Jadi hasilnya (-4, 1). Jika dipikir dengan cara pembulatan ke arah 0, hasil bagi menjadi -3 dan sisa -2 sehingga terpilih (-3, -2), tetapi Python tidak memakai cara ini. Hasil bagi dan sisa selalu menjaga hubungan pembagi dikali hasil bagi tambah sisa sama dengan nilai asal, sehingga bisa diverifikasi dengan 3 dikali -4 tambah 1 sama dengan -11. Jika diperiksa dengan hubungan ini, baik (-3, 2) maupun (-4, -2) sama-sama tidak kembali ke -11.

Soal 14 | Pembulatan int

Manakah output dari program berikut yang membandingkan arah pembulatan?

print(int(-2.7))print(-2.7 // 1)
  1. Baris 1 adalah -2, baris 2 adalah -2.0
  2. Baris 1 adalah -3, baris 2 adalah -3.0
  3. Baris 1 adalah -2, baris 2 adalah -3.0
  4. Baris 1 adalah -3, baris 2 adalah -2.0
JawabanC. Baris 1 adalah -2, baris 2 adalah -3.0

Fungsi bawaan int() membuang bagian desimal dan membulatkan ke arah mendekati 0, sehingga int(-2.7) bukan -3 melainkan -2. Sebaliknya // membulatkan ke arah bawah, sehingga -2.7 // 1 menjadi sisi -3, dan karena salah satu operand float, hasilnya pun float yaitu -3.0. Pada bilangan positif, baik int(2.7) maupun 2.7 // 1 sama-sama menjadi sisi 2 sehingga perbedaannya tidak terlihat, tetapi pada bilangan negatif arahnya terpecah. Keduanya bukan pembulatan ke nilai terdekat, sehingga jika ingin -2.7 menjadi -3 perlu menggunakan round(-2.7).

Soal 15 | Galat desimal

Manakah output dari program berikut yang menampilkan nilai boolean dalam 2 baris?

print(0.1 + 0.7 == 0.8)print(round(0.1 + 0.7, 2) == 0.8)
  1. Baris 1 adalah False, baris 2 adalah False
  2. Baris 1 adalah True, baris 2 adalah True
  3. Baris 1 adalah True, baris 2 adalah False
  4. Baris 1 adalah False, baris 2 adalah True
JawabanD. Baris 1 adalah False, baris 2 adalah True

Karena float menyimpan desimal dalam biner, angka yang sederhana dalam desimal seperti 0.1 atau 0.7 tidak bisa direpresentasikan secara tepat. Jika 0.1 + 0.7 benar-benar ditampilkan, hasilnya 0.7999999999999999, sedikit berbeda dari 0.8, sehingga baris 1 adalah False. Baris 2 membandingkan setelah dibulatkan ke 2 digit di belakang koma dengan round(), sehingga kedua sisi menjadi 0.8 dan hasilnya True. Ini bukan cacat khas Python, melainkan sifat bilangan floating-point biner IEEE 754, dan alasan yang sama membuat 0.1 + 0.2 menjadi 0.30000000000000004, serta 1.1 + 2.2 menjadi 3.3000000000000003. Hindari perbandingan kesetaraan langsung pada float; bandingkan setelah dibulatkan ke digit yang diperlukan, bandingkan nilai absolut selisih dengan toleransi tertentu, atau gunakan modul decimal untuk kasus seperti nilai uang yang membutuhkan presisi ketat.

Soal 16 | Pembulatan round

Manakah output dari program berikut yang menjajarkan nilai yang dibulatkan dalam 1 baris?

print(round(1.5), round(2.5), round(3.5))
  1. 2 2 4
  2. 2 3 4
  3. 1 3 3
  4. 1 2 3
JawabanA. 2 2 4

round() di Python melakukan pembulatan ke bilangan genap terdekat, yang disebut banker's rounding. Hanya ketika nilainya tepat setengah, dibulatkan ke arah genap terdekat, sehingga 1.5 menjadi 2, 2.5 menjadi 2, dan 3.5 menjadi 4, sehingga outputnya 2 2 4. Jika memakai pembulatan yang diajarkan di sekolah, hasilnya akan 2 3 4, tetapi Python tidak memakai cara itu. 1 2 3 adalah nilai jika bagian desimal dibuang begitu saja, dan 1 3 3 adalah nilai jika dibulatkan ke arah ganjil; keduanya berbeda dari perilaku sebenarnya. Perlu dicatat, round() tanpa argumen kedua mengembalikan int, sedangkan jika jumlah digit ditentukan seperti round(2.5, 0), yang dikembalikan adalah float 2.0.

Soal 17 | bool adalah int

Manakah output dari program berikut yang memperlakukan nilai boolean sebagai angka?

print(True + True)print(isinstance(True, int))
  1. Baris 1 adalah True, baris 2 adalah True
  2. Baris 1 adalah 2, baris 2 adalah False
  3. Baris 1 adalah 2, baris 2 adalah True
  4. Baris 1 adalah True, baris 2 adalah False
JawabanC. Baris 1 adalah 2, baris 2 adalah True

bool adalah tipe turunan dari int, sehingga True dapat langsung dipakai dalam operasi angka sebagai bilangan bulat 1, dan False sebagai 0. True + True menjadi 1 tambah 1 yaitu 2, dan isinstance(True, int) mengembalikan True. Menganggap baris 1 adalah True terjadi jika + disamakan dengan operasi logika or, padahal operasi logika or di Python adalah or, dan True or True akan menghasilkan True. issubclass(bool, int) juga True, dan sum([True, False, True]) menjadi 2 karena alasan yang sama. Sifat ini sering dipakai untuk menghitung jumlah kondisi yang terpenuhi.

Soal 18 | Presisi bilangan bulat

Manakah penjelasan yang benar mengenai tipe int pada Python 3?

  1. Tidak memiliki batas jumlah digit, dan bisa menangani nilai sebesar apa pun selama memori mencukupi
  2. Nilai yang melebihi 32 bit bisa meluap (overflow) dan menjadi nilai negatif
  3. OverflowError akan dilontarkan ketika jumlah digit melebihi batas
  4. Jika melebihi 64 bit, otomatis dikonversi ke float untuk perhitungan
JawabanA. Tidak memiliki batas jumlah digit, dan bisa menangani nilai sebesar apa pun selama memori mencukupi

int pada Python 3 memiliki presisi arbitrer, tidak ada batas jumlah digit. 3 ** 40 dihitung secara tepat menjadi 12157665459056928801, yang sudah melebihi rentang bilangan bulat 64 bit bertanda, tetapi tipenya tetap int. Nilai seperti 2 ** 1000 pun bisa ditangani, dan jika jumlah digitnya dihitung dengan len(str(2 ** 1000)), hasilnya 302 digit. Karena bukan bilangan bulat berukuran tetap seperti pada bahasa C, tidak akan meluap menjadi negatif, dan tidak akan berubah sendiri menjadi float. OverflowError muncul misalnya ketika melebihi rentang yang bisa direpresentasikan float, dan tidak muncul hanya karena jumlah digit int bertambah. Namun, semakin banyak digitnya, waktu komputasi dan memori yang dibutuhkan pun bertambah.

Soal 19 | Indeks pada bytes

Manakah output baris 2 dan baris 3 dari program berikut yang menangani byte string?

b = 'abc'.encode()print(b[0])print(b[0:1])
  1. Baris 1 adalah b'a', baris 2 adalah b'a'
  2. Baris 1 adalah 97, baris 2 adalah b'a'
  3. Baris 1 adalah 97, baris 2 adalah 97
  4. Baris 1 adalah a, baris 2 adalah b'a'
JawabanB. Baris 1 adalah 97, baris 2 adalah b'a'

Mengakses bytes dengan indeks berupa bilangan bulat mengembalikan nilai byte pada posisi tersebut sebagai int. Byte pertama dari b'abc', hasil encode 'abc' dalam UTF-8, adalah code point dari 'a', sehingga hasilnya 97. Sementara itu, jika diambil dengan slicing, dikembalikan bytes dengan panjang 1, sehingga b[0:1] adalah b'a'. Pada str, baik s[0] maupun s[0:1] sama-sama mengembalikan str 'a' yang sama, sehingga inilah titik kontras antara str dan bytes. Tampilan yang menjadi b'a' bukan a disebabkan print() menampilkan bytes dalam bentuk repr; untuk mengembalikan ke string gunakan b.decode().

Soal 20 | Basis bilangan dan karakter

Manakah output dari program berikut yang menjajarkan konversi basis bilangan dan konversi kode karakter?

print(int('1010', 2), bin(10), hex(255), ord('A'))
  1. 10 0b1010 0xff 65
  2. 10 0b1010 0xFF 65
  3. 10 0b1010 0xff 97
  4. 1010 0b1010 0xff 65
JawabanA. 10 0b1010 0xff 65

Argumen kedua int() adalah basis bilangan, sehingga int('1010', 2) membaca string tersebut sebagai bilangan biner dan mengembalikan 10. Menganggapnya tetap tampil 1010 terjadi jika penentuan basis terlewat. bin() mengembalikan string dengan awalan 0b, sehingga hasilnya '0b1010', dan hex() mengembalikan string huruf kecil dengan awalan 0x, sehingga hasilnya '0xff'. Tidak akan menjadi 0xFF dengan huruf besar; jika ingin notasi huruf besar, gunakan format(255, 'X'). ord() mengembalikan code point karakter, dan huruf besar A adalah 65. 97 adalah code point huruf kecil a, dan konversi arah sebaliknya bisa ditulis chr(65) untuk kembali menjadi 'A'.

Soal 21 | Slicing

Manakah output dari program berikut yang menangani slicing string?

s = 'Pythonic'print(s[2:5])print(s[-3:])
  1. Baris 1 adalah tho, baris 2 adalah nic
  2. Baris 1 adalah tho, baris 2 adalah ic
  3. Baris 1 adalah thon, baris 2 adalah nic
  4. Baris 1 adalah yth, baris 2 adalah nic
JawabanA. Baris 1 adalah tho, baris 2 adalah nic

s[2:5] mengambil mulai dari posisi indeks 2 hingga sebelum indeks 5. Indeks 2 dari 'Pythonic' adalah t, sehingga menjadi 3 karakter t, h, o yaitu tho. Karena posisi akhir tidak disertakan, hasilnya bukan thon. Jika indeks dihitung mulai dari 1 dan dibaca sebagai 'mulai dari karakter ke-2', akan terpilih yth yang setara dengan s[1:4]. s[-3:] menggunakan indeks negatif sehingga dihitung dari akhir, mengembalikan mulai dari karakter ke-3 dari akhir yaitu n hingga akhir, sehingga hasilnya nic. Jika -3 dibaca keliru sebagai 'sampai karakter ke-3 dari akhir', akan terpilih ic yang setara dengan s[-2:]. Dengan memahami bahwa indeks dimulai dari 0, dan indeks negatif dihitung dari akhir sebagai -1, tidak akan bingung.

Soal 22 | Di luar jangkauan dan in

Manakah output dari program berikut yang menampilkan 2 hasil pemeriksaan?

s = 'Python'print(s[100:200] == '')print('py' in s)
  1. Baris 1 adalah True, baris 2 adalah False
  2. Baris 1 adalah True, baris 2 adalah True
  3. Baris 1 adalah False, baris 2 adalah True
  4. Baris 1 adalah False, baris 2 adalah False
JawabanA. Baris 1 adalah True, baris 2 adalah False

Slicing tidak akan menimbulkan exception meski rentangnya melebihi panjang string, hanya bagian yang tumpang tindih saja yang dikembalikan. Karena 'Python' hanya 6 karakter, s[100:200] menjadi string kosong, dan perbandingan dengan string kosong menghasilkan True. Ini kontras dengan indeks tunggal s[100] yang akan menimbulkan IndexError. Operator in pada baris 2 memeriksa ada tidaknya substring, tetapi membedakan huruf besar-kecil, sehingga 'py' huruf kecil tidak terkandung dalam 'Python' dan hasilnya False. Jika 'Py' atau 'th', hasilnya akan True.

Soal 23 | String tidak dapat diubah

Apa yang terjadi jika program berikut ditulis ke file lalu dijalankan?

s = 'abc's[0] = 'z'print(s)
  1. Terjadi TypeError, tidak bisa melakukan penugasan
  2. Ditampilkan setelah berubah menjadi zbc
  3. Terjadi IndexError, tidak bisa melakukan penugasan
  4. Ditampilkan tetap sebagai abc tanpa berubah
JawabanA. Terjadi TypeError, tidak bisa melakukan penugasan

str bersifat immutable, artinya isinya tidak bisa diubah setelah dibuat, sehingga tidak bisa menulis ulang sebagian karakter saja menggunakan indeks. s[0] = 'z' akan menimbulkan TypeError: 'str' object does not support item assignment, dan berhenti di situ sehingga print pun tidak dijalankan. IndexError muncul ketika indeks berada di luar jangkauan, tetapi di sini 0 berada dalam rentang yang benar sehingga bukan itu masalahnya. Jika ingin mengubah isinya, buat string baru dan sambungkan kembali seperti s = 'z' + s[1:]. Karena list bersifat mutable, elemen bisa ditulis ulang dengan cara penulisan yang sama.

Soal 24 | Nilai kembalian metode

Manakah output dari program berikut yang memanggil metode string?

s = 'exam's.upper()print(s)print(s.replace('e', 'E'))
  1. Baris 1 adalah EXAM, baris 2 adalah Exam
  2. Baris 1 adalah EXAM, baris 2 adalah EXAM
  3. Baris 1 adalah exam, baris 2 adalah exam
  4. Baris 1 adalah exam, baris 2 adalah Exam
JawabanD. Baris 1 adalah exam, baris 2 adalah Exam

Metode string tidak menulis ulang string asli, melainkan membuat dan mengembalikan string baru. s.upper() pada baris 2 membuat 'EXAM', tetapi karena tidak diberikan ke variabel apa pun, nilainya dibuang begitu saja, dan s tetap 'exam'. Oleh karena itu output print(s) adalah exam. Baris ke-4 menampilkan langsung nilai kembalian dari s.replace('e', 'E'), sehingga muncul Exam, tetapi ini pun tidak mengubah s itu sendiri. Jika ingin menyimpan hasilnya, tugaskan ulang seperti s = s.upper(). Ini kontras dengan metode seperti sort() pada list yang mengurutkan langsung di tempat dan mengembalikan None.

Soal 25 | f-string

Manakah output dari program berikut yang menampilkan dengan format tertentu?

n = 2.71828print(f'{n:.2f}')print(f'{"ok"!r}')
  1. Baris 1 adalah 2.71, baris 2 adalah 'ok'
  2. Baris 1 adalah 2.72, baris 2 adalah ok
  3. Baris 1 adalah 2.718, baris 2 adalah ok
  4. Baris 1 adalah 2.72, baris 2 adalah 'ok'
JawabanD. Baris 1 adalah 2.72, baris 2 adalah 'ok'

Penentu format :.2f pada f-string menampilkan dengan pembulatan ke 2 digit di belakang koma, sehingga 2.71828 menjadi 2.72. Karena bukan pembuangan begitu saja, hasilnya bukan 2.71, dan 2.718 adalah nilai jika ditulis :.3f. !r pada baris 2 adalah penentu konversi yang menampilkan nilai dalam bentuk repr(). Jika dipakai pada string, tanda kutip akan ikut tampil sehingga menjadi 'ok'; tanpa !r hanya tampil ok saja. Karena sintaks penentu format sama dengan str.format(), menulis '{n:.2f}'.format(n=2.71828) juga menghasilkan 2.72 yang sama.

Soal 26 | split

Manakah output dari program berikut yang memisahkan string?

print('a b  c'.split())print('a,b,c'.split(',', 1))
  1. ['a', 'b', 'c'] dan ['a', 'b', 'c']
  2. ['a', 'b', '', 'c'] dan ['a', 'b,c']
  3. ['a', 'b', 'c'] dan ['a', 'b,c']
  4. ['a', 'b', '', 'c'] dan ['a', 'b', 'c']
JawabanC. ['a', 'b', 'c'] dan ['a', 'b,c']

Jika split() dipanggil tanpa argumen, spasi berurutan diperlakukan sebagai satu pemisah dan tidak menghasilkan elemen kosong. Oleh karena itu 'a b c'.split() menjadi ['a', 'b', 'c'] dengan 3 elemen. Jika karakter pemisah ditentukan secara eksplisit seperti 'a b c'.split(' '), pemotongan dilakukan per satu spasi, sehingga tersisa string kosong dan menjadi 4 elemen ['a', 'b', '', 'c']. Argumen kedua adalah maxsplit yang menyatakan batas jumlah pemotongan; jika diberi 1, hanya dipotong sekali di awal sehingga menjadi ['a', 'b,c'], dan sisanya tetap menjadi satu elemen tanpa dipotong. Jika dikosongkan, semua akan dipotong menjadi ['a', 'b', 'c'].

Soal 27 | strip

Manakah output dari program berikut yang memangkas karakter di kedua ujung?

print('xxabxx'.strip('x'))print('xxabxx'.lstrip('x'))
  1. Baris 1 adalah abxx, baris 2 adalah ab
  2. Baris 1 adalah ab, baris 2 adalah abxx
  3. Baris 1 adalah xabx, baris 2 adalah abxx
  4. Baris 1 adalah ab, baris 2 adalah xxab
JawabanB. Baris 1 adalah ab, baris 2 adalah abxx

Argumen strip() adalah 'kumpulan karakter yang akan dihapus', dan akan terus memangkas dari kedua ujung selama karakternya termasuk dalam kumpulan tersebut. Karena bukan sekadar menghapus satu substring 'x', 'xxabxx'.strip('x') akan membuang semua x di kedua ujung sehingga menjadi ab. Jika dianggap hanya menghapus satu karakter saja, akan terpilih xabx. lstrip() hanya menyasar ujung kiri sehingga menjadi abxx, dan rstrip() hanya ujung kanan sehingga menjadi xxab. Jika argumen dikosongkan, yang dihapus adalah karakter spasi. Karena diperlakukan sebagai kumpulan, jika ditulis 'xxabxx'.strip('xa'), xx di kiri dan a pun ikut terpangkas sehingga hanya tersisa b.

Soal 28 | join dan perkalian

Manakah output dari program berikut yang menyambungkan string?

print('-'.join('abc'))print('ab' * 3)
  1. Baris 1 adalah -a-b-c-, baris 2 adalah ababab
  2. Baris 1 adalah abc, baris 2 adalah ababab
  3. Baris 1 adalah a-b-c, baris 2 adalah ab ab ab
  4. Baris 1 adalah a-b-c, baris 2 adalah ababab
JawabanD. Baris 1 adalah a-b-c, baris 2 adalah ababab

join() menyambungkan setiap elemen dari objek iterable yang diberikan, dengan string pemanggil sebagai pemisah. String juga merupakan objek iterable yang bisa diambil per karakter, sehingga '-'.join('abc') menyambungkan 'a', 'b', 'c' dengan tanda hubung menjadi a-b-c. Karena pemisah hanya disisipkan di antara elemen, tidak akan muncul di awal atau akhir, sehingga tidak menjadi -a-b-c-. Hasil abc tanpa pemisah terjadi jika ditulis ''.join('abc'). Operator * mengulang string sebanyak jumlah yang ditentukan, sehingga 'ab' * 3 menjadi ababab tanpa spasi di antaranya. Jika menginginkan ab ab ab, tulis ' '.join(['ab'] * 3).

Soal 29 | find dan index

Manakah output dari program berikut yang mencari substring?

print('banana'.find('z'))print('banana'.index('n'))
  1. Baris 1 adalah -1, baris 2 adalah 2
  2. Baris 1 adalah -1, baris 2 adalah 3
  3. Baris 1 adalah -1, baris 2 adalah 4
  4. Baris 1 adalah 0, baris 2 adalah 2
JawabanA. Baris 1 adalah -1, baris 2 adalah 2

find() mengembalikan -1 ketika substring tidak ditemukan, dan tidak menimbulkan exception. Karena 'z' tidak ada dalam 'banana', hasilnya -1. Karena 0 adalah nilai ketika ditemukan di posisi awal, jangan sampai tertukar dengan kasus tidak ditemukan. index() sama dengan find() dalam hal mengembalikan posisi yang ditemukan; kemunculan pertama 'n' dalam 'banana' berada di indeks 2, sehingga hasilnya 2. Nilai 3 muncul jika indeks dihitung mulai dari 1 dan dibaca sebagai 'karakter ke-3', dan 4 adalah posisi kemunculan terakhir, yang bisa diperoleh dengan rfind() atau rindex(). Perbedaan keduanya hanya muncul ketika tidak ditemukan: index() akan melontarkan ValueError: substring not found dan menghentikan proses.

Soal 30 | String raw

Manakah output dari program berikut yang menghitung jumlah karakter?

print(len(r'a\nb'), len('a\nb'))
  1. 3 4
  2. 4 4
  3. 3 3
  4. 4 3
JawabanD. 4 3

Pada string raw yang diawali r, backslash tidak diinterpretasikan sebagai awal escape sequence. r'a\nb' terdiri dari 4 karakter yaitu a, backslash, n, b, sehingga len-nya 4. Sebaliknya pada string biasa 'a\nb', \n digantikan oleh satu karakter baris baru, sehingga menjadi 3 karakter a, baris baru, b, dan len-nya 3. Jika keduanya dihitung sebagai escape akan menjadi 3 3, dan jika keduanya dihitung sebagai karakter mentah akan menjadi 4 4, tetapi poin pentingnya adalah perlakuan berubah tergantung ada tidaknya r. Meski diberi r, tipenya tetap str biasa, bukan menjadi tipe khusus. Perlu dicatat, len('\\') adalah 1, karena backslash ditulis dua kali untuk merepresentasikan satu karakter backslash.

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