print(5 + 2)
print(5 - 2)
print(5 * 2)
print(5 / 2)
print(5 ** 2)
print(5 % 2)
print(5 // 2)
7
3
10
2.5
25
1
2
Kembali ke Metode Numerik
Selamat datang di praktikum Metode Numerik!
Pada praktikum ini, kalian akan diajarkan esensial-esensial yang dibutuhkan dan algoritma dasar untuk metode-metode pada Metnum.
Semua modul telah diuji menggunakan Jupyter Notebook dengan Python 3.11, serta Google Colaboratory yang menggunakan Python 3.9. Semua kode pada modul masih bisa digunakan untuk semua Python versi 3.6 ke atas.
Kalian juga bisa menggunakan aplikasi/IDE (Integrated Development Environment) lainnya seperti PyCharm, Spyder, atau bahkan IDLE (IDLE adalah IDE bawaan Python yang diinstal dari python.org), namun kalian disarankan menggunakan Jupyter Notebook atau Google Colaboratory karena file tugas menggunakan file format .ipynb.
Berikut topik-topik yang akan dibahas pada Modul 1 ini:
Di Python, kita bisa melakukan beberapa operasi aritmetika, menggunakan simbol sebagai berikut:
(+) untuk penjumlahan
(-) untuk pengurangan
(*) untuk perkalian
(/) untuk pembagian
(**) untuk pangkat
(%) untuk operasi mod atau modulo (sisa pembagian)
(//) untuk operasi div (hasil bagi tanpa sisa)
7
3
10
2.5
25
1
2
Seandainya kita tidak menggunakan print untuk menampilkan hasil perhitungan,
maka hanya hasil dari baris terakhir yang akan ditampilkan. Oleh karena itu, sangat disarankan untuk SELALU menuliskan print, termasuk untuk baris terakhir, agar modifikasi program menjadi lebih mudah dan cepat, apalagi ketika ingin menambah baris baru.
Perhatikan bahwa tanda % sudah dikhususkan untuk modulo, sehingga artinya BUKAN PERSEN, ya! Persen dalam Python bisa dituliskan sebagai pembagian dengan 100 (sesuai definisi persen), misalnya untuk 50% atau 21%:
Kita bisa menyimpan nilai (termasuk hasil perhitungan) ke suatu tempat penyimpanan yang disebut variabel. Tiap variabel memiliki nama tersendiri, yang kita definisikan sendiri. Proses penyimpanan nilai ke suatu variabel disebut proses assignment, yang memiliki syntax (cara penulisan) sebagai berikut:
contoh_variabel = 23
di mana 23 adalah contoh nilai yang ingin dipasang ke contoh variabel yang kita beri nama “contoh_variabel”. Untuk assignment, tanda = cukup ditulis sekali saja, ya!
Kemudian, kita bisa menggunakan print untuk menampilkan isi variabel tersebut.
Jangan sampai salah ketik, ya! Penggunaan huruf besar/kecil perlu diperhatikan, jangan sampai tertukar.
Kita mendapat error “name ‘contoh_Variabel’ is not defined”, artinya ‘contoh_Variabel’ itu tidak didefinisikan, karena Python menganggap itu berbeda dengan contoh_variabel
yang memang sudah kita definisikan. Tentu kita tetap bisa mendefinisikannya:
Ada beberapa hal yang dilarang dalam penamaan variabel.
Contoh penamaan yang valid (boleh, bisa diterima):
Karena valid, variabel berhasil tersimpan dengan baik, sehingga bisa dilihat isinya:
Contoh penamaan yang dilarang (akan menghasilkan error):
Selain keterangan spesifik seperti “invalid decimal literal”, kita juga bisa mendapatkan keterangan error yang lebih umum yaitu “invalid syntax” atau “syntax tidak valid”. Karena terjadi error, proses assignment tidak berhasil, sehingga kita tidak bisa melihat isinya karena variabel tersebut memang gagal didefinisikan:
Kita juga bisa menggunakan variabel, seperti mengoperasikan variabel untuk menghasilkan nilai baru:
Bahkan, kita bisa memasang hasil operasi tersebut ke variabel lain:
Perhatikan potongan kode berikut.
Pada baris 4, kita menukar nilai pada variabel a
dan b
. Python bisa meng-assign lebih dari 1 variabel dalam 1 baris, cukup dengan memisahkan tiap variabel dan nilai dengan , (tanda koma).
Walaupun cara tersebut berlaku untuk sebanyak-banyaknya variabel, pada umumnya lebih baik melakukan assignment satu variabel per baris saja agar kode tetap mudah dibaca, apalagi fitur tersebut hanya ada di bahasa pemrograman Python.
Penukaran variabel tetap bisa dilakukan sesuai cara yang dipelajari di mata kuliah Algortma dan Pemrograman, yaitu dengan bantuan variabel yang bisa dinamakan temp
atau semacamnya (variabel dummy yang “tidak penting” dan hanya digunakan untuk bantuan sementara saja):
atau sama saja,
Terkadang, program yang kita buat bisa menjadi rumit, sehingga kita perlu menambahkan semacam penjelasan atau catatan supaya orang lain bisa lebih memahami kode kita. Di Python, kita bisa menambahkan comment atau semacam catatan di samping kanan tiap baris (atau pada baris tersendiri), dimulai dengan tanda #
print("Selamat pagi") # buat apa? gapapa iseng aja
# print("Selamat siang")
print("Selamat sore") # wah dari pagi langsung sore
Selamat pagi
Selamat sore
Python tidak memperhatikan comment sama sekali. Adanya fitur comment hanyalah untuk membantu kita sebagai programmer.
Di Python, selain tipe data numerik/angka, ada juga yang dinamakan “string”, yaitu kumpulan huruf/karakter/kata, yang bisa diawali dan diakhiri dengan tanda petik ’ atau tanda kutip ”
mata_kuliah = "Metode Numerik"
departemen = 'matematika'
gelar = 'S1'
print(mata_kuliah)
print(departemen)
print(gelar)
Metode Numerik
matematika
S1
Penggunaan tanda petik ataupun tanda kutip itu sama-sama valid, yang penting konsisten.
Suatu string bisa dicek “panjang”nya, atau jumlah karakter di dalam string (termasuk spasi, koma, dan sebagainya), dengan len
(artinya length):
panjang1 = len(mata_kuliah)
panjang2 = len(departemen)
panjang3 = len(gelar)
print(panjang1)
print(panjang2)
print(panjang3)
14
10
2
String juga bisa digabung dengan semacam “penjumlahan” atau penggabungan (juga disebut string concatenation):
nama_depan = "Johan"
nama_tengah = "Frederik"
nama_belakang = "Steffensen"
print(nama_depan + nama_belakang)
print(nama_depan + nama_tengah + nama_belakang)
JohanSteffensen
JohanFrederikSteffensen
Perhatikan bahwa, pada ketiga string yang kita definisikan, tidak ada spasi, sehingga dalam penggabungannya itu juga tidak ada spasi.
Penggabungan string tidak harus antar variabel, bisa juga antar nilai, atau bahkan antara variabel dengan nilai.
Kita telah menggabungkan string “Halo! Nama saya” dengan variabel nama_depan
(perhatikan bahwa string tersebut diakhiri satu spasi).
Di sini, kita telah menggabungkan variabel nama_belakang
dengan suatu string yang tediri dari dua karakter (yaitu koma dan spasi), yang kemudian digabungkan dengan variabel nama_depan
, kemudian suatu string yang terdiri dari spasi saja, dan akhirnya dengan variabel nama_tengah
.
Penjumlahan yang dilakukan secara berulang kali adalah perkalian. Begitu juga untuk string:
Kita juga bisa mengubah atau mengkonversi nilai selain string (seperti angka) agar menjadi string dan bisa digabungkan juga, menggunakan str
. Contohnya,
nilai_semester = 2
string_semester = str(nilai_semester)
print("Saya masih semester " + string_semester)
Saya masih semester 2
Seandainya kita tidak mengkonversi nilai tersebut, akan terjadi error:
TypeError: can only concatenate str (not "int") to str
Python hanya paham cara menggabungkan string dengan string, bukan string dengan selain string, sehingga kita harus mengkonversi nilai tersebut menjadi string terlebih dahulu.
Sebaliknya, kita juga bisa “menghilangkan tanda petik/kutip” dari suatu string (misalnya untuk mengkonversi kembali menjadi angka), dengan eval
.
angka_semester = eval(string_semester)
semester_atas = 2 + angka_semester
string_atas = str(semester_atas)
print("Dia sudah semester " + string_atas)
Dia sudah semester 4
Seandainya tidak digunakan eval,
Lagi-lagi, Python tidak paham penjumlahan antara bilangan dengan string.
Ada cara lain untuk memadukan nilai string dengan variabel yang berisi string, yaitu dengan yang namanya string formatting. Sejak Python 3.6, ada yang namanya f-strings, yang diawali dengan huruf “f” tepat sebelum penulisan string. Pada suatu f-string, kita bisa menggunakan kurung kurawal yaitu { dan } untuk menggantikan isi string dengan suatu variabel, yang nama variabelnya kita masukkan ke dalam kurung kurawal tersebut.
Misalnya, kita bisa memasukkan nilai variabel mata_kuliah
di dalam suatu f-string, seperti berikut:
Saya sedang mengikuti praktikum Metode Numerik.
Tentu, kita bisa menyisipkan lebih dari satu variabel.
Saya sedang mengikuti praktikum Metode Numerik untuk mendapatkan gelar S1.
Selain menggunakan f-string, kita juga bisa menggunakan .format()
pada akhir string (fitur ini sudah ada sejak Python 3.0), dengan syntax sebagai berikut:
Saya sedang mengikuti praktikum Metode Numerik untuk mendapatkan gelar S1
Agar kode lebih mudah dibaca,
kalimat = "Saya sedang mengikuti praktikum {0} untuk mendapatkan gelar {1}".format(mata_kuliah, gelar)
print(kalimat)
Saya sedang mengikuti praktikum Metode Numerik untuk mendapatkan gelar S1
Perhatikan bahwa, dengan cara .format()
, kita harus mengisi tempat penyisipan dengan {0}, {1}, {2}, dan seterusnya tergantung banyaknya penyisipan, kemudian variabel-variabel yang ingin disisipkan itu baru ditempel di akhir, yaitu di dalam kurung .format()
.
Lagi-lagi, kedua cara sama-sama valid, yang penting konsisten. Ketika hendak menggunakan f-string, jangan tiba-tiba mengetik .format()
pada akhir f-string.
Sebagai tambahan, kita bisa menyisipkan angka, dan kita juga bisa mempersingkat penulisannya menjadi beberapa angka di belakang koma, misalnya cukup 7 angka di belakang koma:
akar_dua = 2**(1/2)
print("Akar dua bernilai kurang lebih {0:.7f}".format(akar_dua))
print("atau lebih tepatnya {0}".format(akar_dua))
Akar dua bernilai kurang lebih 1.4142136
atau lebih tepatnya 1.4142135623730951
Beberapa link (pengayaan, tidak wajib) untuk mempelajari string formatting lebih lanjut:
Selain mengeluarkan output atau menampilkan nilai, Python juga bisa menerima nilai (yang kemudian dipasangkan ke variabel), menggunakan input(pesan)
, di mana pesan yang ada di dalam kurung itu bisa berisi pertanyaan yang ingin ditanyakan, atau keterangan yang diminta:
Masukkan angkatan: 2022
Anda angkatan 2022
Perhatikan bahwa input telah masuk dalam bentuk string, sehingga bisa langsung digabungkan dengan string lainnya. Karena masih berbentuk string, operasi aritmetika tidak sesuai harapan:
angka = input("Masukkan angka: ")
dobel = angka / 2
print("Setelah dibagi dua, angka tersebut menjadi " + str(dobel))
Masukkan angka: 24
TypeError: unsupported operand type(s) for /: 'str' and 'int'
Terjadi error karena operasi pembagian tidak bisa dilakukan pada string. Oleh karena itu, kita juga perlu eval
agar nilai yang masuk itu dihilangkan tanda petik/kutipnya agar tidak lagi berbentuk string.
angka = eval(input("Masukkan angka: "))
dobel = angka / 2
print("Setelah dibagi dua, angka tersebut menjadi " + str(dobel))
Masukkan angka: 24
Setelah dibagi dua, angka tersebut menjadi 12.0
Kombinasi eval(input(pesan))
akan sering digunakan selama praktikum Metode Numerik.
Suatu list bisa menyimpan beberapa nilai sekaligus, yang masing-masing disebut elemen dari list tersebut. Pendefinisiannya menggunakan kurung siku, di mana tiap elemen dituliskan di dalamnya, saling dipisahkan dengan koma:
Tiap elemen memiliki posisi atau indeks (index). Di Python, indeks dimulai dari 0 (nol). Kita bisa memeriksa elemen pada indeks ke-sekian di list, dengan menuliskan nama list tersebut, diikuti dengan kurung siku yang berisi indeks ke berapa yang ingin dilihat nilainya.
Suatu list bisa berisi beragam tipe data, tidak hanya string tetapi juga angka, atau bahkan keduanya sekaligus.
data_diri = ["Guido van Rossum", 1956, "Belanda", "Pembuat bahasa pemrograman Python"]
print("Nama: " + data_diri[0])
print("Tahun kelahiran: " + str(data_diri[1]))
print("Kewarganegaraan: " + data_diri[2])
print("Dikenal sebagai: " + data_diri[3])
Nama: Guido van Rossum
Tahun kelahiran: 1956
Kewarganegaraan: Belanda
Dikenal sebagai: Pembuat bahasa pemrograman Python
Kita dapat menambahkan elemen baru pada akhir list menggunakan .append()
Seringkali kita dihadapi oleh beberapa kondisi. Misalkan pada metode Bisection, kalian perlu mengecek apakah nilai fungsi di ujung-ujung intervalnya berbeda tanda atau tidak. Jika tidak, metode tidak bisa berjalan. Maka, kita perlu menggunakan pernyataan kondisional.
Terdapat tiga pernyataan kondisional: * If…else berguna jika hanya ada satu kondisi yang perlu dicek, dan perlu ada aksi yang dijalankan jika kondisi tidak terpenuhi. * If…elif berguna jika ada lebih dari satu kondisi yang perlu dicek, dan tidak ada aksi yang dijalankan apabila semua kondisi tidak terpenuhi. * If…elif…else berguna jika ada lebih dari satu kondisi yang perlu dicek, dan perlu ada aksi yang dijalankan jika kondisi tidak terpenuhi.
Advanced note: Ada pernyataan kondisional lain, yaitu try…except, naum akan dijelaskan pada bagian selanjutnya
Kebanyakan metode pada Metnum bersifat iteratif, artinya algoritmanya dijalankan berulang hingga tercapai batas tertentu (biasanya terdapat nilai toleransi antara aproksimasi dengan nilai eksaknya). Looping pada Python biasanya menggunakan for loop dan while loop.
for loop digunakan ketika kita mengetahui berapa kali kita harus mengulang perintah. Beberapa cara untuk for loop:
Advanced note: range() sejatinya adalah fungsi yang mengoutput list angka dengan aturan seperti di atas.
print('FOR LOOP EXAMPLE 1')
for i in range(3):
print('Print 3 kali')
print('FOR LOOP EXAMPLE 2')
for i in range(1, 4):
print(2 * i)
print('FOR LOOP EXAMPLE 3')
for i in range(1, 10, 3):
print('Angka sekarang:', i)
print('FOR LOOP EXAMPLE 4')
for i in [1, 4, 8, 2]:
print(i)
print('FOR LOOP EXAMPLE 5')
for i in 'mondstad':
if i == 'd':
print(i)
print('WHILE LOOP EXAMPLE')
i = 0
while i <= 5:
print('Hati-hati while')
i += 1
print('While iteration DONE')
FOR LOOP EXAMPLE 1
Print 3 kali
Print 3 kali
Print 3 kali
FOR LOOP EXAMPLE 2
2
4
6
FOR LOOP EXAMPLE 3
Angka sekarang: 1
Angka sekarang: 4
Angka sekarang: 7
FOR LOOP EXAMPLE 4
1
4
8
2
FOR LOOP EXAMPLE 5
d
d
WHILE LOOP EXAMPLE
Hati-hati while
Hati-hati while
Hati-hati while
Hati-hati while
Hati-hati while
Hati-hati while
While iteration DONE
Misalkan kalian membuat program tentang menghitung kebalikan dari suatu bilangan bulat. Tentu bilangan selain nol memiliki kebalikan. Namun, apa yang terjadi jika kalian memasukkan 0 sebagai input? Pasti error.
Error pada program mengakibatkan program terhenti di tengah-tengah, sehingga belum semua baris dieksekusi. Mungkin tidak berpengaruh banyak jika programnya digunakan untuk sendiri, namun seandainya kalian membuat program yang digunakan untuk mengatur server perusahaan, entah apa jadinya kalau programnya error.
Untuk itu, terdapat cara untuk mengatasi error tersebut. Di Python, kalian dapat menggunakan try…except . Ini adalah penyataan kondisional serupa dengan if…else , namun pengecekan dilakukan pada bagian try . Jika pada bagian tersebut tidak ada masalah yang menyebabkab error, maka bagian except tidak dijalankan. Sebaliknya, jika error, maka bagian except akan dijalankan. Ada beberapa macam error di Python:
Advanced note: Kalian dapat mengecek tipe data pada python dengan fungsi type() .
NumPy adalah package Python yng sangat multifungsi. Kita akan menggunakan NumPy untuk membuat array yang elemennya hanya mempunyai satu tipe data. NumPy juga mempunyai fungsi fungsi seperti sin, cos, log, dll.
Mula-mula, kita perlu meng-import package NumPy.
Jika pada langkah ini kalian menemukan error, kemungkinan besar kalian belum mempunyai package NumPy terinstal. Jika kalian menggunakan Jupyter Notebook atau Spyder melalui Anaconda, kalian bisa mencoba mengikuti langkah ini:
Alternatif yang lebih mudah adalah langsung mengetik pip install numpy
(atau !pip install numpy
dengan tanda seru) pada Jupyter Notebook (bisa juga pada Google Colaboratory), kemudian menutup dan membuka kembali Jupyter Notebook:
Requirement already satisfied: numpy in /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages (1.24.2)
Note: you may need to restart the kernel to use updated packages.
Requirement already satisfied: numpy in /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages (1.24.2)
Numpy Array
Seperti yang sudah dikatakan sebelumnya, list bukan array karena dapat diisi dengan berbagai tipe data. Kalau begitu, bagaimana array yang benar? Di NumPy, ada fungsi bernama array yang berfungsi mengubah list menjadi array.
numpy.ndarray
Terlihat tipe data dari A bukan list, melainkan numpy.ndarray. Perhatikan juga bahwa kita mengisi list yang akan dijadikan array A dan B dengan beragam tipe data…
…maka tipe datanya akan berubah menjadi sama. Karena NumPy array hanya bisa menyimpan satu tipe data, maka jika tipenya berbeda akan berubah. Urutan pengecekannya adalah string , float , integer , boolean (tipe data boolean menyimpan nilai 1 jika True dan 0 jika False ).
Kita juga dapat membuat array 2 dimensi seperti matriks, dan jika di-print, maka outputnya juga seperti matriks.
Di sini kalian juga bisa melakukan indexing dan slicing seperti halnya pada liat.
print(A[0])
print(B[-1])
print(P[0])
print(Q[0,1])
print()
print(A[2:])
print(R[1:])
print(R[1, 2:])
print(R[:, 1])
True
6.2
[1 2]
-1
['7.5' 'Jean']
[[-1 -8 9 11]
[ 3 -2 -4 6]]
[ 9 11]
[ 2 -8 -2]
Operasi aritmatika juga dapat diterapkan pada NumPy array. Operasi aritmatika antar dua NumPy array akan dilakukan secara element- wise, artinya operasinya dilakukan tiap elemen (bukan seperti dot product pada aljabar linear).
A = np.array([1, 4, 7, 10])
B = np.array([1, 2, 3, 4])
#operasi pada array
print(A + B)
print(A - B)
print(A * B)
print(A / B)
print(A % B)
print(A // B)
print(A ** B)
[ 2 6 10 14]
[0 2 4 6]
[ 1 8 21 40]
[1. 2. 2.33333333 2.5 ]
[0 0 1 2]
[1 2 2 2]
[ 1 16 343 10000]
Selain itu, operasi aritmatika juga bisa dilakukan dengan skalar. Operasi aritmatika antara NumPy array dengan suatu skalar akan dilakukan seolah-olah skalar tersebut adalah NumPy array berukuran sama yang isinya skalar tersebut. Istilahnya biasanya disebut Broadcasting
Untuk menyajikan hasil iterasi, tabel sering digunakan karena akan mudah membacanya. Di Python, terdapat package untuk membuat tabel dengan cara sederhana. Package tersebut bernama tabulate.
Seperti package umumnya, pertama kita import terlebih dahulu.
Seperti pada kasus NumPy, apabila terjadi error (karena tabulate belum terinstall), kalian bisa mengetik pip install tabulate
Requirement already satisfied: tabulate in /Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages (0.9.0)
Note: you may need to restart the kernel to use updated packages.
dan seperti biasa, setelah instalasi selesai, mungkin kalian perlu menutup kemudian membuka kembali Jupyter Notebook sebelum bisa menggunakan tabulate.
Sekarang, buat konten tabel. Konten tabel disimpan dalam list/array 2-D dimana setiap array di dalamnya adalah baris.
Headers dari tabel dapat kita buat sendiri. Jumlah dari headers harus sama dengan jumlah elemen pada setiap array.
‘tablefmt’ adalah format bentuk tabel. Bentuk yang biasa digunakan adalah “orgtbl”, dan ada macam-macam bentuk tabel yang bisa kalian cari sendiri di Google.
table = [["Jeruk", 1], ["Nanas", 2]]
print(tabulate(table, headers = ["Buah", "Kuantitas"], tablefmt = "orgtbl"))
| Buah | Kuantitas |
|--------+-------------|
| Jeruk | 1 |
| Nanas | 2 |
Dalam membuat konten tabel, panjang dari setiap list harus sama dengan banyak headers. Apabila ada baris yang banyak elemennya melebihi banyak headers, maka elemen yang diambil adalah elemen sebanyak headers yang pertama. Kolom paling kiri diisi terlebih dahulu.
Perhatikan contoh berikut.
table = [["Jeruk", 1, 4], ["Nanas", 2, 3, 5], ["Mangga", 3]]
print(tabulate(table, headers = ["Buah", "Kuantitas", "Harga"], tablefmt = "orgtbl"))
| Buah | Kuantitas | Harga |
|--------+-------------+---------|
| Jeruk | 1 | 4 |
| Nanas | 2 | 3 |
| Mangga | 3 | |
Apabila baris pertama digunakan sebagai header, banyak kolom akan sama dengan banyak elemen yang paling banyak di antara semua baris tabel. Penamaan kolom dimulai dari kanan.
Perhatikan contoh berikut.
table = [["Saya", 1, 4], ["Tampan", 2, 3, 5], ["Banget", 3, 5]]
print(tabulate(table, headers = "firstrow", tablefmt = "orgtbl"))
| | Saya | 1 | 4 |
|--------+--------+-----+-----|
| Tampan | 2 | 3 | 5 |
| Banget | 3 | 5 | |
Tabulate sangat berguna untuk membentuk tabel secara “otomatis” atau secara pemrograman. Misalnya, kita bisa memanfaatkan looping dan pernyataan kondisional untuk membuat beberapa baris yang mengikuti pola dan syarat tertentu.
Sebagai contoh, misalnya kita punya function yang menghitung bilangan kuadrat ke-i
Kita bisa membuat tabel, misalnya, yang menjabarkan bilangan kuadrat ke-1 sampai ke-5. Perhatikan struktur tabel apabila dibuat secara manual:
tabel_kuadrat = [
[1, 1],
[2, 4],
[3, 9],
[4, 16],
[5, 15]
]
print(tabulate(tabel_kuadrat, headers=["i", "kuadrat"]))
i kuadrat
--- ---------
1 1
2 4
3 9
4 16
5 15
Terlihat bahwa tabel tersebut memiliki lima baris, dan tiap baris berupa list yang merupakan elemen dari list besar tabel_kuadrat
. Kita bisa membuatnya secara “otomatis” atau secara pemrograman:
tabel_mentah = []
for i in range(1, 6): # mulai dari 1, lanjut selama kurang dari 6
calon_baris = [i, kuadrat(i)] # baris baru
tabel_mentah.append(calon_baris) # menambahkan baris baru ke list besar
print(tabulate(tabel_mentah, headers=["i", "kuadrat"]))
i kuadrat
--- ---------
1 1
2 4
3 9
4 16
5 25
Tentu saja, calon_baris
tidak harus langsung jadi ketika baru didefinisikan. Tiap bagian dari suatu baris bisa saja ditambahkan secara berangsur-angsur:
tabel_mentah = []
for i in range(1, 6): # mulai dari 1, lanjut selama kurang dari 6
calon_baris = [] # baris baru
calon_baris.append(i) # bagian pertama pada baris
# bagian kedua pada baris
nilai_kedua = kuadrat(i)
calon_baris.append(nilai_kedua)
tabel_mentah.append(calon_baris) # menambahkan baris baru ke list besar
print(tabulate(tabel_mentah, headers=["i", "kuadrat"]))
i kuadrat
--- ---------
1 1
2 4
3 9
4 16
5 25
Adanya lebih dari dua kolom juga sangat memungkinkan, tinggal ditambahkan ke calon_baris
:
tabel_mentah = []
for i in range(1, 6): # mulai dari 1, lanjut selama kurang dari 6
calon_baris = [] # baris baru
# bagian pertama pada baris
calon_baris.append(i)
# bagian kedua pada baris
nilai_kedua = kuadrat(i)
calon_baris.append(nilai_kedua)
# bagian ketiga
calon_baris.append(i**3)
# bagian keempat
calon_baris.append(i**4)
tabel_mentah.append(calon_baris) # menambahkan baris baru ke list besar
print(tabulate(tabel_mentah, headers=["i", "kuadrat", "pangkat tiga","pangkat empat"]))
i kuadrat pangkat tiga pangkat empat
--- --------- -------------- ---------------
1 1 1 1
2 4 8 16
3 9 27 81
4 16 64 256
5 25 125 625
Apabila kita sudah memiliki data tiap kolom dalam bentuk list, kita bisa membentuk calon_baris
pada tiap iterasi for loop dengan mengakses elemen ke-i dari tiap list.
# misalnya data ini sudah ada, atau sudah diolah sebelumnya
kolom_awal = [1, 2, 3, 4, 5]
kolom_kuadrat = [1, 4, 9, 16, 25]
kolom_tiga = [1, 8, 27, 64, 125]
kolom_empat = [1, 16, 81, 256, 625]
# mari kita buat tabel
tabel_mentah = []
for i in range(0, 5): # indeks list dimulai dari nol, lanjut selama i < 5
calon_baris = []
# elemen ke-i dari tiap list kolom
calon_baris.append(kolom_awal[i])
calon_baris.append(kolom_kuadrat[i])
calon_baris.append(kolom_tiga[i])
calon_baris.append(kolom_empat[i])
tabel_mentah.append(calon_baris)
print(tabulate(tabel_mentah, headers=["i", "kuadrat", "pangkat tiga","pangkat empat"]))
i kuadrat pangkat tiga pangkat empat
--- --------- -------------- ---------------
1 1 1 1
2 4 8 16
3 9 27 81
4 16 64 256
5 25 125 625
Bagaimana kalau misalnya ada data yang tidak lengkap? Kita bisa saja menggunakan try-except, untuk memasukkan “X” ketika ada data yang tidak lengkap, sekaligus menghindari error:
# contoh data
kolom_awal = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
kolom_kuadrat = [1, 4, 9, 16, 25]
tabel_mentah = []
for i in range(0, 10): # indeks list dimulai dari nol, lanjut selama i < 10
calon_baris = []
# elemen ke-i dari tiap list kolom
calon_baris.append(kolom_awal[i])
try:
calon_baris.append(kolom_kuadrat[i])
except IndexError:
calon_baris.append("X")
tabel_mentah.append(calon_baris)
print(tabulate(tabel_mentah, headers=["i", "kuadrat", "pangkat tiga","pangkat empat"]))
i kuadrat
--- ---------
1 1
2 4
3 9
4 16
5 25
6 X
7 X
8 X
9 X
10 X
NumPy juga memiliki semacam tipe data atau nilai yang standar untuk menandakan data yang hilang atau tidak tersedia, yaitu NaN (Not a Number), melalui numpy.nan
# contoh data
kolom_awal = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
kolom_kuadrat = [1, 4, 9, 16, 25]
tabel_mentah = []
for i in range(0, 10): # indeks list dimulai dari nol, lanjut selama i < 10
calon_baris = []
# elemen ke-i dari tiap list kolom
calon_baris.append(kolom_awal[i])
try:
calon_baris.append(kolom_kuadrat[i])
except IndexError:
calon_baris.append(np.nan)
tabel_mentah.append(calon_baris)
print(tabulate(tabel_mentah, headers=["i", "kuadrat", "pangkat tiga","pangkat empat"]))
i kuadrat
--- ---------
1 1
2 4
3 9
4 16
5 25
6 nan
7 nan
8 nan
9 nan
10 nan
Bagaimana kalau misalnya kita sudah punya suatu fungsi yang melakukan perhitungan secara iteratif dan hanya menampilkan hasil akhirnya, tetapi kita ingin memperoleh tiap hasil iterasi, bukan hasil akhirnya saja? Contohnya, fungsi menghitung faktorial \(n! = n * (n-1) * \dots * 3 * 2 * 1\) berikut ini,
def faktorial(n):
# nilai awal
hasil = 1
# iterasi
for i in range(2, n+1):
# mulai dari 2, lanjut selama i < n + 1
# sehingga iterasi terakhir adalah untuk i = n
hasil = hasil * i
# mengembalikan hasil akhir setelah semua iterasi selesai
return hasil
# peroleh hasil akhir dari fungsi faktorial, kemudian print
print(faktorial(5))
120
Kita bisa saja melakukan print (di dalam fungsinya) tiap kali nilai hasil
diperbarui.
def faktorial(n):
# nilai awal
hasil = 1
print(hasil) # tampilkan hasil
# iterasi
for i in range(2, n+1):
# mulai dari 2, lanjut selama i < n + 1
# sehingga iterasi terakhir adalah untuk i = n
hasil = hasil * i
print(hasil) # tampilkan hasil yang baru
# tidak perlu return karena sudah menggunakan print
# fungsi cukup dipanggil saja,
# karena print sudah ada di dalam fungsi
faktorial(5)
1
2
6
24
120
Alternatifnya, kita bisa memasukkan tiap hasil baru ke dalam suatu list, yang kemudian dikembalikan oleh fungsi, lalu kita bisa print list tersebut.
def ListFaktorial(n):
list_baru = []
# nilai awal
hasil = 1
list_baru.append(hasil) # tambahkan ke list
# iterasi
for i in range(2, n+1):
# mulai dari 2, lanjut selama i < n + 1
# sehingga iterasi terakhir adalah untuk i = n
hasil = hasil * i
list_baru.append(hasil) # tambahkan tiap hasil baru ke list
# kembalikan list semua hasil
return list_baru
# peroleh list dari fungsi di atas, kemudian print
print(ListFaktorial(5))
[1, 2, 6, 24, 120]
Bahkan, list ini bisa diubah menjadi tabel!
def ListFaktorial(n):
list_baru = []
# nilai awal
hasil = 1
list_baru.append(hasil) # tambahkan ke list
# iterasi
for i in range(2, n+1):
# mulai dari 2, lanjut selama i < n + 1
# sehingga iterasi terakhir adalah untuk i = n
hasil = hasil * i
list_baru.append(hasil) # tambahkan tiap hasil baru ke list
# kembalikan list semua hasil
return list_baru
# kolom nilai i
kolom_kiri = [1, 2, 3, 4, 5]
# bisa juga dibuat dengan for loop dengan range(1,6) append i
# peroleh list dari fungsi di atas
kolom_kanan = ListFaktorial(5)
# "gabung" kedua kolom menjadi satu tabel, seperti biasa
tabel_mentah = []
for i in range(0,5):
calon_baris = []
calon_baris.append(kolom_kiri[i])
calon_baris.append(kolom_kanan[i])
tabel_mentah.append(calon_baris)
tabel_olahan = tabulate(tabel_mentah, headers=["i", "faktorial"])
print(tabel_olahan)
i faktorial
--- -----------
1 1
2 2
3 6
4 24
5 120
Perhatikan bahwa kita memerlukan dua list untuk membentuk tabel di atas. Bisa saja, kita membentuk kedua list sepenuhnya di dalam fungsi. Dengan begitu, setelah menggunakan fungsi, kita tinggal membentuk tabel dari kedua list.
def DuaListFaktorial(n):
kolom_kiri = [] # berisi i
kolom_kanan = [] # berisi faktorial atau i!
# nilai awal
hasil = 1
# tambahkan ke list
kolom_kiri.append(1)
kolom_kanan.append(hasil)
# iterasi
for i in range(2, n+1):
# mulai dari 2, lanjut selama i < n + 1
# sehingga iterasi terakhir adalah untuk i = n
hasil = hasil * i
# tambahkan tiap hasil baru ke list
kolom_kiri.append(i)
kolom_kanan.append(hasil)
# kembalikan kedua list
return kolom_kiri, kolom_kanan
# peroleh kedua list dari fungsi
kolom_kiri, kolom_kanan = DuaListFaktorial(5)
# "gabung" kedua kolom menjadi satu tabel, seperti biasa
tabel_mentah = []
for i in range(0,5):
calon_baris = []
calon_baris.append(kolom_kiri[i])
calon_baris.append(kolom_kanan[i])
tabel_mentah.append(calon_baris)
tabel_olahan = tabulate(tabel_mentah, headers=["i", "faktorial"])
print(tabel_olahan)
i faktorial
--- -----------
1 1
2 2
3 6
4 24
5 120
Kalau mau, bahkan proses pembentukan tabel juga bisa dilakkukan di dalam fungsi, sehingga fungsi memberikan output berupa tabel yang siap diolah tabulate.
def TabelFaktorial(n):
kolom_kiri = [] # berisi i
kolom_kanan = [] # berisi faktorial atau i!
# nilai awal
hasil = 1
# tambahkan ke list
kolom_kiri.append(1)
kolom_kanan.append(hasil)
# iterasi
for i in range(2, n+1):
# mulai dari 2, lanjut selama i < n + 1
# sehingga iterasi terakhir adalah untuk i = n
hasil = hasil * i
# tambahkan tiap hasil baru ke list
kolom_kiri.append(i)
kolom_kanan.append(hasil)
tabel_mentah = []
for i in range(0,n):
# sampai indeks (n-1)
# nilai n tergantung banyaknya iterasi
calon_baris = []
calon_baris.append(kolom_kiri[i])
calon_baris.append(kolom_kanan[i])
tabel_mentah.append(calon_baris)
return tabel_mentah
tabel_mentah = TabelFaktorial(5)
tabel_olahan = tabulate(tabel_mentah, headers=["i", "faktorial"])
print(tabel_olahan)
i faktorial
--- -----------
1 1
2 2
3 6
4 24
5 120
Bahkan, pengolahan tabel bisa dilakukan di dalam fungsi…
def TabelFaktorial(n):
kolom_kiri = [] # berisi i
kolom_kanan = [] # berisi faktorial atau i!
# nilai awal
hasil = 1
# tambahkan ke list
kolom_kiri.append(1)
kolom_kanan.append(hasil)
# iterasi
for i in range(2, n+1):
# mulai dari 2, lanjut selama i < n + 1
# sehingga iterasi terakhir adalah untuk i = n
hasil = hasil * i
# tambahkan tiap hasil baru ke list
kolom_kiri.append(i)
kolom_kanan.append(hasil)
tabel_mentah = []
for i in range(0,n):
# sampai indeks (n-1)
# nilai n tergantung banyaknya iterasi
calon_baris = []
calon_baris.append(kolom_kiri[i])
calon_baris.append(kolom_kanan[i])
tabel_mentah.append(calon_baris)
# mengolah tabel di dalam fungsi
tabel_olahan = tabulate(tabel_mentah, headers=["i", "faktorial"])
return tabel_olahan
tabel_jadi = TabelFaktorial(5)
print(tabel_jadi)
i faktorial
--- -----------
1 1
2 2
3 6
4 24
5 120
Tentu saja, nilai 5 itu selalu bisa diganti menjadi sembarang bilangan bulat positif, seperti 7, 10, 15, 22, atau bahkan lebih besar lagi, dan banyaknya baris akan menyesuaikan, karena pembentukan tabel dilakukan secara otomatis.
i faktorial
--- ----------------------
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
10 3628800
11 39916800
12 479001600
13 6227020800
14 87178291200
15 1307674368000
16 20922789888000
17 355687428096000
18 6402373705728000
19 121645100408832000
20 2432902008176640000
21 51090942171709440000
22 1124000727777607680000