n sebagai argument method

update() dalam bentuk dictionary.

◉ Menghapus item dictionary

Method pop() digunakan untuk menghapus item dictionary berdasarkan key.

profile = {

"name": "mario",

}

print("len:", len(profile), "data:", profile)

# output ➜ len: 1 data: {'name': 'mario'}

profile["favourite_color"] = "red"

print("len:", len(profile), "data:", profile)

# output ➜ len: 2 data: {'name': 'mario', 'favourite_color': 'red'}

profile.update({"race": "italian"})

print("len:", len(profile), "data:", profile)

# output ➜ len: 3 data: {'name': 'mario', 'favourite_color': 'red',

'race': 'italian'}

profile.pop("hobbies")

print(profile)

Keyword del juga bisa difungsikan untuk operasi yang sama. Contoh:

◉ Pengaksesan dictionary keys

Method keys() digunakan untuk mengakses semua keys dictionary, hasilnya

yaitu  tipe data view objects dict_keys . Dari nilai tersebut bungkus

memakai   list() untuk mendapatkan nilainya dalam bentuk list.

◉ Pengaksesan dictionary values

Method values() digunakan untuk mengakses semua value dictionary,

hasilnya yaitu  tipe data view objects dict_values . Gunakan fungsi list()

untuk mengkonversinya ke bentuk list.

del profile["id"]

print(profile)

profile = {

"id": 2,

"name": "mario",

"hobbies": ("playing with luigi", "saving the mushroom kingdom"),

"is_female": False,

}

print(list(profile.keys()))

# output ➜ ['id', 'name', 'hobbies', 'is_female']

profile = {

"id": 2,

"name": "mario",

"hobbies": ("playing with luigi", "saving the mushroom kingdom"),

"is_female": False,

◉ Method items() dictionary

Digunakan untuk mengakses semua item dictionary. Nilai baliknya bertipe view

objects dict_items yang strukturnya cukup mirip seperti list berisi tuple.

Untuk mengkonversinya ke bentuk list, gunakan fungsi list() .

◉ Copy dictionary

Method copy() digunakan untuk meng-copy dictionary, hasilnya data

dictionary baru.

profile = {

"id": 2,

"name": "mario",

"hobbies": ("playing with luigi", "saving the mushroom kingdom"),

"is_female": False,

}

print(list(profile.items()))

# output ➜ [('id', 2), ('name', 'mario'), ('hobbies', ('playing with

luigi', 'saving the mushroom kingdom')), ('is_female', False)]

p1 = {

"id": 2,

"name": "mario",

"is_female": False,

}

print(p1)

# output ➜ {'id': 2, 'name': 'mario', 'is_female': False}

p2 = p1.copy()

print(p2)

Pada contoh di atas, statement p1.copy() menghasilkan data baru dengan isi

sama seperti isi p1 , data tersebut kemudian ditampung oleh variabel p2 .

Operasi copy disini jenisnya yaitu  shallow copy.

Lebih detailnya mengenai shallow copy vs deep copy dibahas pada

chapter terpisah.

◉ Mengosongkan isi dictionary

Method clear() berguna untuk menghapus isi dictionary.

Catatan chapter 📑📑

◉ Source code praktik

github.com/novalagung/dasarpemrogramanpython-example/../dictionary

profile = {

"id": 2,

"name": "mario",

"is_female": False,

}

print("len:", len(profile), "data:", profile)

# output ➜ len: 3 data: {'id': 2, 'name': 'mario', 'is_female': False}

profile.clear()

print("len:", len(profile), "data:", profile)

# output ➜ len: 0 data: {}

◉ Chapter relevan lainnya

• OOP ➜ Class & Object

◉ Referensi

• https://docs.python.org/3/library/stdtypes.html#mapping-types-dict

A.17. Python String

String (atau str ) merupakan kumpulan data char atau karakter yang

tersimpan secara urut (text sequence). String di Python mengadopsi standar

Unicode dengan default encoding yaitu  UTF-8 .

A.17.1. Pengenalan String

Python mendesain tipe data string dalam bentuk yang sangat sederhana dan

mudah digunakan. Untuk membuat string cukup tulis saja text yang diinginkan

dengan diapit tanda petik satu atau petik dua. Contoh:

◉ Multiline string

Untuk string multiline atau lebih dari satu baris, cara penulisannya bisa

dengan:

• memakai   karakter spesial \n :

text = "hello python"

print(text)

# output ➜ hello python

text = 'hello python'

print(text)

# output ➜ hello python

text = "a multiline string\nin python"

print(text)

• Atau memakai   tanda """ atau ''' untuk mengapit text. Contoh:

Teknik penulisan string memakai   tanda """ atau ''' selain

digunakan untuk membuat multiline string, juga bisa dimanfaatkan

untuk hal lain yaitu pembuatan docstring.

Lebih detailnya mengenai docstring dibahas di chapter DocString.

◉ Escape character

Python mengenal escape character umum yang ada di banyak bahasa

pemrograman, contohnya seperti \" digunakan untuk menuliskan karakter

" (pada string yang dibuat memakai   literal " " ). Penambahan karakter

\ yaitu  penting agar karakter " terdeteksi sebagai penanda string.

Sebagai contoh, dua statement berikut yaitu  ekuivalen:

text = """a multiline string

in python"""

print(text)

# output ↓

#

# a multiline string

# in python

text = 'this is a "string" in python'

print(text)

# output ➜ this is a "string" in python

text = "this is a \"string\" in python"

A.17.2. String special characters

Di atas telah dicontohkan bagaimana cara menulis karakter newline atau baris

baru memakai   \n , dan karakter petik dua memakai   \" . Dua

karakter tersebut yaitu  contoh dari special characters.

Python mengenal banyak special characters yang masing-masing memiliki

kegunaan yang cukup spesifik. Agar lebih jelas silakan lihat tabel berikut:

Special character Kegunaan

\\ karakter backslash (\)

\' tanda petik satu (')

\" tanda kutip (petik dua) (")

\a bunyi beeb (ASCII BEL)

\b backspace (ASCII BS)

\f page separator / formfeed (ASCII FF)

\n karakter baris baru linefeed (ASCII LF)

\r karakter baris baru carriage return (ASCII CR)

\t horizontal tab (ASCII TAB)

Special character Kegunaan

\v vertical tab (ASCII VT)

\{oktal} nilai oktal, contoh: \122 , \004 , \024

\x{hex} nilai heksadesimal, contoh: \xA4 , \x5B

Tambahan contoh penggunaan salah satu special character \t (horizontal

tab):

Program di atas menghasilkan output berikut:

Syntax 0xC548 yaitu  salah satu penulisan numerik berbasis

hexadecimal. Pembahasan detailnya ada di chapter Number.

print("Nama\t\t| Umur\t| Gender")

print("--------------------------------")

print("Bruce Wayne\t| 34\t| laki-laki")

print("Cassandra Cain\t| 22\t| perempuan")

A.17.3. String formatting

String formatting yaitu  teknik untuk mem-format string agar menghasilkan

text sesuai dengan format yang diinginkan.

Cara termudah melakukan string formatting yaitu  dengan memakai   f-

strings (atau formatted string literals). Tulis string seperti biasa tapi diawali

dengan huruf f atau F sebelum penulisan " " .

Pada contoh berikut, sebuah string dibuat dimana dua bagian string

didalamnya datanya bersumber dari variabel string lain.

Penjelasan:

• String dibuat dengan metode f-strings, dimana struktur text yaitu  hello,

my name is {name}, I'm an {occupation} .

• Text {name} di dalam string di-replace oleh nilai variable name , yang

pada konteks ini nilainya Aiden Pearce .

• Text {occupation} di dalam string di-replace oleh nilai variable

occupation , yang pada konteks ini nilainya IT support .

• f-strings di atas menghasilkan text hello, my name is Aiden Pearce,

I'm an IT support .

name = "Aiden Pearce"

occupation = "IT support"

text = f"hello, my name is {name}, I'm an {occupation}"

print(text)

# output ➜ hello, my name is Aiden Pearce, I'm an IT support

Pada penerapan metode f-strings, isi dari {} tidak harus data string,

tetapi tipe data lainnya juga bisa digunakan asalkan printable atau bisa

di-print.

Selain memakai   metode di atas, ada beberapa alternatif cara lain yang

bisa digunakan, diantaranya:

Semua metode string formatting yang telah dipelajari menghasilkan nilai balik

yang sama, yaitu hello, my name is Aiden Pearce, I'm an IT support .

Mana yang lebih baik? Silakan pilih saja metode yang sesuai selera.

A.17.4. Penggabungan string & split

string

◉ Penggabungan string (concatenation)

Ada beberapa metode yang bisa digunakan untuk string concatenation atau

operasi penggabungan string.

text = "hello, my name is {name}, I'm an {occupation}".format(name =

name, occupation = occupation)

print(text)

# output ➜ hello, my name is Aiden Pearce, I'm an IT support

text = "hello, my name is {0}, I'm an {1}".format(name, occupation)

print(text)

# output ➜ hello, my name is Aiden Pearce, I'm an IT support

text = "hello, my name is {}, I'm an {}".format(name, occupation)

print(text)

# output ➜ hello, my name is Aiden Pearce, I'm an IT support

• memakai   teknik penulisan string literal sebaris.

Caranya dengan langsung tulis saja semua string-nya memakai  

separator karakter spasi.

• memakai   operator + .

Operator + jika diterapkan pada string menghasilkan penggabungan

string.

Untuk data non-string jika ingin digabung harus dibungkus dengan fungsi

str() terlebih dahulu. Fungsi str() digunakan untuk mengkonversi

segala jenis data ke bentuk string.

text = "hello " "python"

print(text)

# output ➜ hello python

text_one = "hello"

text_two = "python"

text = text_one + " " + text_two

print(text)

# output ➜ hello python

text = "hello"

number = 123

yes = True

message = text + " " + str(number) + " " + str(yes)

print(message)

• memakai   method join() milik string.

Pada penerapannya, karakter pembatas atau separator ditulis terlebih

dahulu, kemudian di-chain dengan method join dengan isi argument

yaitu  list yang ingin digabung.

◉ Split string

Split string yaitu  operasi pemisahan karakter string menjadi list dengan

element berisi string. Operasi ini merupakan kebalikan dari penggabungan

string.

Cara penggunaannya yaitu  dengan mengakses method split() langsung

dari data string. Pemanggilan method tersebut perlu disertai argument berisi

separator atau karakter pemisah string.

Pada contoh berikut, string hello python 12345 di split memakai  

karakter spasi ( ).

Parameter method split() boleh untuk tidak diisi apapun, dengan efek

text = " ".join(["hello", "python"])

print(text)

# output ➜ hello python

```

text = "hello python 12345"

res = text.split(" ")

print(res)

# output ➜ ['hello', 'python', '12345']

yaitu  string menjadi di-split memakai   separator \n , \r , \t ,

\f atau spasi ( ).

A.17.5. Operasi sequence pada string

String masih termasuk kategori tipe data sequence, yang artinya bisa

digunakan pada operasi standar sequence, contoh seperti perulangan,

pengaksesan elemen, dan slicing.

◉ Mengecek jumlah karakter string

Fungsi len() ketika digunakan pada tipe data string mengembalikan

informasi jumlah karakter string.

◉ Mengakses element string

Setiap elemen string bisa diakses memakai   index. Penulisan notasi

pengaksesannya sama seperti pada tipe data sequence lainnya, yaitu

memakai   string[index] .

text = "hello python"

print("text:", text)

# output ➜ hello python

print("length:", len(text))

# output ➜ 12

text = "hello python"

print(text[0])

Selain via index, keyword perulangan for bisa dimanfaatkan untuk

mengiterasi elemen string. Contoh:

Contoh lain memakai   range() :

Output:

DANGER

Pengaksesan elemen memakai   index di-luar kapasitas data akan

menghasilkan error.

Sebagai contoh, string text = "hello" , jika diakses index ke-5-nya

for c in text:

print(c)

for i in range(0, len(text)):

print(text[i])

misalnya ( text[5] ) hasilnya yaitu  error.

◉ Slicing string

Teknik slicing bisa diterapkan pada data string. Contoh:

Pembahasan detail mengenai slice ada di chapter Slice

A.17.6. Operasi character & case

Tipe data string memiliki beberapa method yang berguna untuk keperluan

operasi string yang berhubungan dengan character & case

◉ Pengecekan karakter alfabet dan angka

• Method isalpha() digunakan untuk mengecek apakah string berisi

karakter alfabet atau tidak. Nilai kembaliannya True jika semua karakter

dalam string yaitu  alfabet.

text = "hello python"

print(text[1:5])

# output ➜ ello

print(text[7:])

# output ➜ ython

print(text[:4])

# output ➜ hell

• Method isdigit() digunakan untuk mengecek apakah string berisi

karakter digit atau tidak. Nilai kembaliannya True jika semua karakter

dalam string yaitu  angka numerik (termasuk pangkat).

• Method isdecimal() digunakan untuk mengecek apakah string berisi

print("abcdef".isalpha())

# output ➜ True, karena abcdef yaitu  alfabet

print("abc123".isalpha())

# output ➜ False, karena ada karakter 123 yang bukan merupakan alfabet

print("زوم".isalpha())

# output ➜ True, karena زوم yaitu  abjad arabic

print("⯑⯑⯑".isalpha())

# output ➜ True, karena ⯑⯑⯑ yaitu  karakter jepang

print("123456".isdigit())

# output ➜ True, karena 123456 yaitu  digit

print("123abc".isdigit())

# output ➜ False, karena ada karakter abc yang bukan merupakan digit

print('2⅓'.isdigit())

# output ➜ False, karena bilangan pecahan memiliki karakter `/` yang

tidak termasuk dalam kategori digit

print('4²'.isdigit())

# output ➜ True, karena 4² yaitu  bilangan pangkat

print('٢٨'.isdigit())

# output ➜ True, karena ٢٨ yaitu  digit arabic

print('𝟜'.isdigit())

# output ➜ True, karena 𝟜 yaitu  digit

karakter desimal atau tidak. Nilai kembaliannya True jika semua karakter

dalam string yaitu  angka numerik desimal.

• Method isnumeric() digunakan untuk mengecek apakah string berisi

karakter desimal atau tidak. Nilai kembaliannya True jika semua karakter

dalam string yaitu  angka numerik (termasuk pecahan, pangkat, dan

angka numerik lainnya).

print("123456".isdecimal())

# output ➜ True, karena 123456 yaitu  angka desimal

print("123abc".isdecimal())

# output ➜ False, karena ada karakter abc yang bukan merupakan angka

desimal

print('2⅓'.isdecimal())

# output ➜ False, karena bilangan pecahan memiliki karakter `/` yang

tidak termasuk dalam kategori angka desimal

print('4²'.isdecimal())

# output ➜ False, karena bilangan pangkat yang tidak termasuk dalam

kategori angka desimal

print('٢٨'.isdecimal())

# output ➜ True, karena ٢٨ yaitu  angka desimal arabic

print('𝟜'.isdecimal())

# output ➜ True, karena 𝟜 yaitu  angka desimal

print("123456".isnumeric())

# output ➜ True, karena 123456 yaitu  angka numerik

print("123abc".isnumeric())

# output ➜ False, karena ada karakter abc yang bukan merupakan numerik

• Method isalnum() digunakan untuk mengecek apakah string berisi

setidaknya karakter alfabet atau digit, atau tidak keduanya. Nilai

kembaliannya True jika semua karakter dalam string yaitu  alfabet atau

angka numerik.

◉ Pengecekan karakter whitespace

Method isspace() digunakan untuk mengecek apakah string berisi karakter

whitespace.

print("123abc".isalnum())

# output ➜ True, karena 123 yaitu  digit dan abc yaitu  alfabet

print("12345⅓".isalnum())

# output ➜ True, karena 12345⅓ yaitu  digit

print("abcdef".isalnum())

# output ➜ True, karena abcdef yaitu  alfabet

print("abc 12".isalnum())

# output ➜ False, karena ada karakter spasi yang bukan merupakan

karakter digit ataupun alfabet

print("زوم".isalnum())

# output ➜ True, karena زوم yaitu  abjad arabic

print("⯑⯑⯑".isalnum())

# output ➜ True, karena ⯑⯑⯑ yaitu  karakter jepang

print(" ".isspace())

# output ➜ True, karena string berisi karakter spasi

print("\n".isspace())

# output ➜ True, karena string berisi karakter newline

◉ Pengecekan karakter case

• Method islower() digunakan untuk mengecek apakah semua karakter

string yaitu  ditulis dalam huruf kecil (lower case), jika kondisi tersebut

terpenuhi maka nilai kembaliannya yaitu  True .

• Method istitle() digunakan untuk mengecek apakah kata dalam string

yaitu  ditulis dengan awalan huruf besar (title case), jika kondisi tersebut

terpenuhi maka nilai kembaliannya yaitu  True .

• Method isupper() digunakan untuk mengecek apakah semua karakter

string yaitu  ditulis dalam huruf besar (upper case), jika kondisi tersebut

terpenuhi maka nilai kembaliannya yaitu  True .

print("hello python".islower())

# output ➜ True

print("Hello Python".islower())

# output ➜ False

print("HELLO PYTHON".islower())

# output ➜ False

print("hello python".istitle())

# output ➜ False

print("Hello Python".istitle())

# output ➜ True

print("HELLO PYTHON".istitle())

# output ➜ False

◉ Mengubah karakter case

Beberapa method yang bisa digunakan untuk mengubah case suatu string:

• Method capitalize() berfungsi untuk mengubah penulisan karakter

pertama string menjadi huruf besar (capitalize).

• Method title() berfungsi untuk mengubah penulisan kata dalam string

diawali dengan huruf besar (title case).

• Method upper() berfungsi untuk mengubah penulisan semua karakter

string menjadi huruf besar (upper case).

• Method lower() berfungsi untuk mengubah penulisan semua karakter

string menjadi huruf kecil (lower case).

• Method swapcase() berfungsi untuk membalik penulisan case karakter

string. Untuk karakter yang awalnya huruf kecil menjadi huruf besar, dan

sebaliknya.

print("hello python".isupper())

# output ➜ False

print("Hello Python".isupper())

# output ➜ False

print("HELLO PYTHON".isupper())

# output ➜ True

print("hello python".capitalize())

# output ➜ Hello python

print("hello python".title())

# output ➜ Hello Python

print("hello python".upper())

A.17.7. Operasi pencarian string &

substring

◉ Pengecekan string memakai   keyword in

Keyword in bisa digunakan untuk mengecek apakah suatu string merupakan

bagian dari string lain. Nilai balik statement yaitu  boolean. Contoh:

Teknik tersebut bisa dikombinasikan dengan seleksi kondisi if :

◉ Pengecekan substring

Ada beberapa Method yang bisa digunakan untuk keperluan pengecekan

substring, apakah suatu string merupakan bagian dari string lain.

• memakai   method startswith() untuk mengecek apakah suatu

string diawali dengan huruf/kata tertentu.

text = "hello world"

print("ello" in text)

# output ➜ True

text = "hello world"

if "ello" in text:

print(f"py is in {text}")

# output ➜ py is in hello world

print("hello world".startswith("hell"))

# output ➜ True

• memakai   method endswith() untuk mengecek apakah suatu string

diakhiri dengan huruf/kata tertentu.

• memakai   method count() untuk mengecek apakah suatu string

merupakan bagian dari string lain.

Method ini mengembalikan jumlah huruf/kata yang ditemukan. Jika

kebutuhannya yaitu  mencari tau apakah suatu substring ada atau tidak,

maka gunakan operasi logika lebih dari 0 (atau n > 0 ).

◉ Pencarian index substring

Method-method berikut sebenarnya kegunaannya mirip seperti method untuk

pengecekan substring, perbedaannya yaitu  nilai balik pemanggilan method

berupa index substring.

• Method count() mengembalikan jumlah substring yang ditemukan sesuai

kata kunci yang dicari.

print("hello world".endswith("orld"))

# output ➜ True

print("hello world".endswith("worl"))

# output ➜ False

print("hello world".count("ello"))

# output ➜ 1

print("hello world".count("ello") > 0)

# output ➜ True

• Method index() mengembalikan index substring pertama yang

ditemukan sesuai kata kunci yang dicari. Jika substring tidak ditemukan,

method ini menghasilkan error.

• Method rindex() mengembalikan index substring pertama yang

ditemukan sesuai kata kunci yang dicari dengan urutan pencarian yaitu 

dari kanan. Jika substring tidak ditemukan, method ini menghasilkan error.

• Method find() mengembalikan index substring pertama yang ditemukan

sesuai kata kunci yang dicari. Jika substring tidak ditemukan, method ini

menghasilkan nilai -1 .

• Method rfind() mengembalikan index substring pertama yang

ditemukan sesuai kata kunci yang dicari dengan urutan pencarian yaitu 

dari kanan. Jika substring tidak ditemukan, method ini menghasilkan nilai

text = "hello world hello world"

print(text.count("ello"))

# output ➜ 2

text = "hello world hello world"

print(text.index("worl"))

# output ➜ 6

text = "hello world hello world"

print(text.rindex("worl"))

# output ➜ 18

text = "hello world hello world"

print(text.find("worl"))

# output ➜ 6

-1 .

A.17.8. Operasi string lainnya

◉ Replace substring

Method replace() digunakan untuk me-replace suatu substring dengan

string lain. Contoh penggunaan:

◉ Trim / strip

Metode trimming/stripping digunakan untuk menghapus whitespace yang

diantaranya yaitu  baris baru dan juga spasi.

Sebelum kita mulai, coba perhatikan kode berikut. String text dideklarasikan

memakai   """ """ yang dalam penerapannya tidak akan meng-escape

whitespace.

text = "hello world hello world"

print(text.rfind("worl"))

# output ➜ 18

str_old = "hello world"

str_new = str_old.replace("world", "python")

print(str_new)

# output ➜ hello python

text = """

hello python

"""

Bisa dilihat saat di print kelihatan newline atau baris barunya pada awal string

dan juga akhir string.

Dengan memakai   teknik trimming, whitespace bisa dihilangkan. Ada

beberapa method yang bisa digunakan, diantaranya:

• Method lstrip() untuk trim whitespace karakter di awal atau sebelah

kiri string.

• Method rstrip() untuk trim whitespace karakter di akhir atau sebelah

kanan string.

• Method strip() untuk trim whitespace karakter di awal dan akhir string.

text = """

hello python

"""

print(f"--{text.lstrip()}--")

# output ↓

#

# --hello python

# --

text = """

hello python

"""

print(f"--{text.rstrip()}--")

# output ↓

#

# --

# hello python--

◉ Join string

Method join() berguna untuk menggabungkan list berisi element string.

String yang digunakan untuk memanggil method ini menjadi separator operasi

join.

◉ Konversi data ke string

Ada beberapa metode konversi tipe data ke string, diantaranya:

• memakai   fungsi str() .

Fungsi ini bisa digunakan untuk mengkonversi data bertipe apapun ke

bentuk string. Contoh penerapan:

text = """

hello python

"""

print(f"--{text.strip()}--")

# output ➜ --hello python--

data = ["hello", "world", "abcdef"]

res = "-".join(data)

print(res)

# output ➜ hello-world-abcdef

number = 24

string1 = str(number)

print(string1)

# output ➜ 24

• memakai   teknik string formatting. Contoh:

Catatan chapter 📑📑

◉ Source code praktik

github.com/novalagung/dasarpemrogramanpython-example/../string

◉ Chapter relevan lainnya

• String ➜ Unicode

number = 24

string1 = f"{number}"

print(string1)

# output ➜ 24

items = [1, 2, 3, 4]

string2 = f"{items}"

print(string2)

# output ➜ [1, 2, 3, 4]

obj = {

"name": "AMD Ryzen 5600g",

"type": "processor",

"igpu": True,

}

string3 = f"{obj}"

print(string3)

# output ➜ {'name': 'AMD Ryzen 5600g', 'type': 'processor', 'igpu':

True}

• Slice

◉ TBA

• Bytes

• Konversi tipe data ke string

◉ Referensi

• https://docs.python.org/3/library/string.html

• https://docs.python.org/3/library/stdtypes.html#text-sequence-type-str

• https://docs.python.org/3/reference/lexical_analysis.html#f-strings

A.18. Python Unicode String

Python mengadopsi aturan standar Unicode dalam pengelolaan karakter pada string. Benefitnya Python mendukung

dan mengenali berbagai macam jenis karakter, termasuk diantaranya yaitu  huruf Arab, Jepang, emoji, symbol, dan

banyak jenis karakter lainnya.

Unicode sendiri yaitu  suatu aturan standar untuk encoding text yang di-maintain oleh Unicode Consortium.

Standarisasi ini diciptakan untuk mendukung semua jenis penulisan yang ada di bumi.

Pada chapter ini kita akan membahas tentang bagaimana implementasi Unicode di Python.

A.18.1. Pengenalan Unicode String

Dalam dunia per-Unicode-an, ada yang disebut dengan code point yaitu suatu angka numerik (bisa desimal maupun

hexadecimal) yang merepresentasikan karakter tertentu. Jadi bisa diibaratkan identifier dari suatu karakter. Semua

karakter ada code point-nya, termasuk huruf A, B, C, maupun karakter lainnya (angka, tulisan romawi, symbol, dll).

Cara penulisan karakter unicode sendiri bisa dengan langsung menuliskan karakternya, atau bisa juga dengan

menuliskan code point dalam notasi tertentu.

• Contoh penulisan text dengan langsung menuliskan karakternya:

• memakai   notasi special character \uXXXX , dimana XXXX diisi dengan code point dalam encoding 16-bit.

◦ Code point 16-bit C548 merepresentasikan karakter ⯑

◦ Code point 16-bit B155 merepresentasikan karakter ⯑

◦ Code point 16-bit D558 merepresentasikan karakter ⯑

◦ Code point 16-bit C548 merepresentasikan karakter ⯑

◦ Code point 16-bit C694 merepresentasikan karakter ⯑

Untuk memunculkan emoji memakai   kode encoding 16-bit butuh tambahan effort karena code point emoji

tidak cukup jika direpresentasikan oleh code point yang lebarnya hanya 16-bit.

• memakai   notasi special character \UXXXXXXXX , dimana XXXXXXXX diisi code point dalam encoding 32-bit.

message = "⯑⯑⯑⯑⯑ 😀"print(message)# output ➜ ⯑⯑⯑⯑⯑ 😀

message = "\uC548\uB155\uD558\uC138\uC694"print(message)# output ➜ ⯑⯑⯑⯑⯑

message = "\U0000C548\U0000B155\U0000D558\U0000C138\U0000C694 \U0001F600"print(message)

◦ Code point 32-bit 0000C548 merepresentasikan karakter ⯑

◦ Code point 32-bit 0000B155 merepresentasikan karakter ⯑

◦ Code point 32-bit 0000D558 merepresentasikan karakter ⯑

◦ Code point 32-bit 0000C138 merepresentasikan karakter ⯑

◦ Code point 32-bit 0000C694 merepresentasikan karakter ⯑

◦ Code point 32-bit 0001F600 merepresentasikan emoji 😀

• Atau memakai   notasi special character \N{NAME} , dimana NAME diisi dengan nama karakter unicode

dalam huruf besar.

◦ Nama karakter Unicode HANGUL SYLLABLE AN merepresentasikan karakter ⯑

◦ Nama karakter Unicode HANGUL SYLLABLE NYEONG merepresentasikan karakter ⯑

◦ Nama karakter Unicode GRINNING FACE merepresentasikan emoji 😀

Salah satu website yang berguna untuk mencari informasi nama dan code point karakter Unicode:

https://www.compart.com/en/unicode/

A.18.2. Fungsi utilitas pada Unicode

◉ Fungsi ord()

Fungsi ord() digunakan untuk mengambil nilai code point dari suatu karakter. Nilai baliknya yaitu  numerik

berbasis desimal.

Untuk menampilkan code point dalam notasi heksadesimal, cukup bungkus memakai   fungsi hex() .

message = "\N{HANGUL SYLLABLE AN}\N{HANGUL SYLLABLE NYEONG} \N{GRINNING FACE}"print(message)# output ➜ ⯑⯑ 😀

text = "N"codePoint = ord(text)print(f'code point of {text} in decimal: {codePoint}')# output ➜ code point of N in decimal: 78

text = "⯑"codePoint = ord(text)print(f'code point of {text} in decimal: {codePoint}')# output ➜ code point of ⯑ in decimal: 50504

text = "⯑"codePoint = ord(text)

print(f'code point of {text} in decimal: {codePoint}')# output ➜ code point of ⯑ in decimal: 50504

Bisa dilihat dari program di atas, unicode code point dari karakter ⯑ dalam bentuk heksadesimal yaitu  c548 . Jika

dicek pada praktek sebelumnya, kode heksadesimal yang sama kita gunakan juga dalam penulisan karakter unicode

memakai   notasi \uXXXX (yaitu \uc548 ).

◉ Fungsi chr()

Fungsi chr() yaitu  kebalikan dari fungsi ord() , kegunaannya yaitu  untuk menampilkan string sesuai code

point.

Pada contoh dibawah ini fungsi chr() digunakan untuk memunculkan karakter dengan code point desimal 50504

dan juga heksadesimal C548 , yang keduanya yaitu  merepresentasikan karakter yang sama, yaitu ⯑ .

Catatan chapter 📑📑

◉ Source code praktik

github.com/novalagung/dasarpemrogramanpython-example/../unicode

◉ Chapter relevan lainnya

• String

◉ Referensi

• https://docs.python.org/3/howto/

unicode.html#:~:text=Python's%20string%20type%20uses%20the,character%20its%20own%20unique%20code.

• https://docs.python.org/3/howto/unicode.html?highlight=unicode%20howto#the-string-type

codePoint = chr(50504)print(codePoint)# output ➜ ⯑

codePoint = chr(0xC548)print(codePoint)# output ➜ ⯑

A.19. Number/Bilangan di Python

Sedikit mengulang tentang pembahasan chapter Tipe Data ➜ numerik, telah dijelaskan bahwa Python

mengenal 3 jenis tipe data numerik, yaitu int , float , dan complex .

Pada chapter ini kita akan belajar lebih dalam tentang ketiganya.

A.19.1. Integer

Bilangan bulat direpresentasikan oleh tipe data int (kependekan dari integer). Cara deklarasi nilai

bertipe data ini yaitu  memakai   literal integer dimana angka ditulis langsung. Contoh:

INFO

Ada yang unik dengan deklarasi bilangan bulat di Python. Diperbolehkan untuk menambahkan

karakter underscore ( _ ) di sela-sela angka. Misalnya:

Variabel angka3 di atas nilainya yaitu  sama dengan literal 1002345123 .

Literal integer default-nya yaitu  berbasis 10, contohnya seperti 24 dan 13 di atas keduanya yaitu 

berbasis 10. Dan umumnya bahasa pemrograman lain juga sama.

A.19.2. Hexadecimal, Octal, Binary

Selain basis 10, bilangan bulat bisa dituliskan memakai   basis lain, misalnya heksadesimal/oktal/biner,

caranya dengan memanfaatkan prefix atau suatu awalan saat penulisan literalnya.

• Prefix literal untuk heksadesimal: 0x

• Prefix literal untuk oktal: 0o

• Prefix literal untuk biner: 0b

angka1 = 24angka2 = 13total = angka1 + angka2print(f"angka: {total}")# output ➜ angka: 37

angka3 = 100_2_345_123

print(f"angka3: {angka3}")# output ➜ angka3: 1002345123

Nilai numerik (tanpa melihat basis deklarasinya) ketika di-print pasti dimunculkan dalam basis 10. Python

otomatis meng-handle proses konversi antar basisnya. Pembuktiannya bisa dilihat pada output program di

atas.

Dari perbandingan source code dan output, terlihat bahwa angka 8c heksadesimal yaitu  sama dengan

214 oktal dan 10001100 biner.

Sedangkan untuk memunculkan angka-angka tersebut sesuai basisnya caranya yaitu  dengan

memakai   metode string formatting, dengan menambahkan suffix dalam penulisan variabel. Contoh:

angka = 140angka_heksadesimal = 0x8cangka_oktal = 0o214angka_biner = 0b10001100

print(f"angka: {angka}")# output ➜ angka: 140

print(f"heksadesimal: {angka_heksadesimal}")# output ➜ heksadesimal: 140

print(f"oktal: {angka_oktal}")# output ➜ oktal: 140

print(f"biner: {angka_biner}")# output ➜ biner: 140

angka = 140angka_heksadesimal = 0x8cangka_oktal = 0o214angka_biner = 0b10001100

print(f"angka: {angka:d}")# output ➜ angka: 140

print(f"heksadesimal: {angka_heksadesimal:x}")# output ➜ heksadesimal: 8c

print(f"oktal: {angka_oktal:o}")# output ➜ oktal: 214

print(f"biner: {angka_biner:b}")

Output program:

Perbedaan lengkap tentang prefix dan suffix tiap basis bilangan bisa dicek pada tabel berikut:

Nama Basis

Deklarasi String formatting

Prefix Contoh Suffix Contoh

Decimal 10 -

d

atau

tanpa

suffix

Hexadecimal 16 0x x

Octal 8 0o o

Binary 2 0b b

Lebih detailnya mengenai string formatting dibahas pada chapter String Formatting

◉ Operasi perbandingan antar basis

Nilai bilangan integer meskipun dideklarasikan dengan basis biner, heksadesimal, atau oktal, nilai tersebut

disimpan di variabel oleh Python dalam satu tipe data, yaitu int . Dari sifat tersebut, maka operasi logika

perbandingan bisa dilakukan tanpa melihat basis numerik-nya, karena kesemuanya pasti bertipe int .

angka1 = 24angka2 = 13 print(f"angka1: {angka1}")print(f"angka2: {angka2:d}")

hex1 = 0x8chex2 = 0xff00c0 print(f"hex1: {hex1:x}")print(f"hex2: {hex2:x}")

oct1 = 0o214oct2 = 0o605 print(f"oct1: {oct1:o}")print(f"oct2: {oct2:o}")

bin1 = 0b1010bin2 = 0b110 print(f"bin1: {bin1:b}")print(f"bin2: {bin2:b}")

angka = 140

Output program:

◉ Print nilai numerik dalam basis tertentu memakai   suffix

Angka numerik bisa di-print dalam basis apapun tanpa melihat deklarasinya memakai   basis apa.

Contohnya bisa dilihat pada program berikut, nilai oktal 214 di-print dalam 4 basis berbeda dengan

memanfaatkan suffix tiap-tiap basis.

◉ Operasi aritmatika antar basis

Operasi aritmatika, apapun itu, juga bisa dilakukan antar basis. Contoh:

Output program:

angka_oktal = 0o214

print(f"angka: {angka_oktal:d}")# output ➜ angka 140

print(f"heksadesimal: {angka_oktal:x}")# output ➜ heksadesimal: 8c

print(f"oktal: {angka_oktal:o}")# output ➜ oktal: 214

print(f"biner: {angka_oktal:b}")# output ➜ biner: 10001100

angka = 140angka_heksadesimal = 0x8cangka_oktal = 0o214angka_biner = 0b10001100

total = angka + angka_heksadesimal + angka_oktal + angka_binerprint(f"total: {total} (hex: {total:x}, oct: {total:o}, bin: {total:b})")

◉ Print nilai numerik dalam basis tertentu memakai   fungsi

• Fungsi oct() digunakan untuk memunculkan nilai numerik dalam basis oktal dalam tipe data string.

• Fungsi hex() digunakan untuk memunculkan nilai numerik dalam basis heksadesimal dalam tipe

data string.

• Fungsi bin() digunakan untuk memunculkan nilai numerik dalam basis biner dalam tipe data string.

◉ Fungsi int()

Fungsi int() digunakan untuk mengkonversi data string berisi angka numerik berbasis apapun (selama

basisnya 0 hingga 36) ke tipe data integer.

int1 = oct(140)print(f"int1: {int1}")# output ➜ int1: 0o214

int2 = oct(0x8c)print(f"int2: {int2}")# output ➜ int2: 0o214

int3 = hex(140)print(f"int3: {int3}")# output ➜ int3: 0x8c

int4 = hex(0b10001100)print(f"int4: {int4}")# output ➜ int4: 0x8c

int5 = bin(140)print(f"int5: {int5}")# output ➜ int5: 0b10001100

int6 = bin(0o214)print(f"int6: {int6}")# output ➜ int6: 0b10001100

int1 = int("0b10001100", base=2)print(f"int1: {int1}")# output ➜ int1: 140

int2 = int("0x8c", base=16)print(f"int2: {int2}")

A.19.3. Floating point (float)

Bilangan float yaitu  bilangan yang memiliki angka dibelakang koma (atau titik untuk sistem angka luar

negeri), misalnya angka 3.14 (yang di negara kita biasa ditulis dengan 3,14 ).

Umumnya bilangan ini dikenal dengan nama bilangan desimal. Namun penulis tidak

memakai   istilah ini karena kata desimal pada chapter ini tidak selalu berarti bilangan dengan

nilai dibelakang koma.

Penulis memilih memakai   istilah bilangan float.

Untuk mendeklarasikan bilangan float, langsung saja tulis angka yang diinginkan dengan penanda

dibelakang koma yaitu  tanda titik. Misalnya:

Khusus untuk bilangan float yang nilai belakang komanya yaitu  0 bisa dituliskan dengan tanpa

menuliskan angka 0 -nya. Contoh:

◉ Pembulatan / rounding

Pembulatan nilai di belakang koma dilakukan memakai   fungsi round() . Panggil fungsi tersebut,

sisipkan data float yang ingin dibulatkan sebagai argument pertama fungsi dan jumlah digit belakang

koma sebagai argument ke-dua.

Selain fungsi round() ada juga 2 fungsi milik module math yang cukup berguna untuk keperluan

angka_float = 3.141592653589print(f"angka float: {angka_float}")# output ➜ angka float: 3.141592653589

angka_float = 3.print(f"angka float: {angka_float}")# output ➜ angka float: 3.0

pi = 3.141592653589

n1 = round(pi, 2)print(f"n1: {n1}")# output ➜ n1: 3.14

n2 = round(pi, 5)print(f"n2: {n2}")# output ➜ n2: 3.14159

pembulatan ke-bawah atau ke-atas.

• Pembulatan ke-bawah.

• Pembulatan ke-atas

Kedua fungsi di atas menghasilkan nilai balik bertipe int , tidak seperti fungsi round() yang

mengembalikan nilai float.

◉ Pembulatan float dengan string formatting

Fungsi round() , math.floor() , dan math.ceil() menerima data float sebagai argument pemanggilan

fungsi dan mengembalikan nilai baru setelah dibulatkan.

Jika pembulatan hanya diperlukan saat printing saja, lebih efektif memakai   metode string formatting.

Caranya, tulis variabel dalam string formatting lalu tambahkan suffix :.{n}f dimana n diisi dengan

jumlah digit belakang koma. Sebagai contoh, suffix :.2f menghasilkan string berisi data float dengan 2

digit dibelakang koma.

Contoh versi lebih lengkap:

import math

n3 = math.floor(pi)print(f"n3: {n3}")# output ➜ n3: 3

import math

n4 = math.ceil(pi)print(f"n4: {n4}")# output ➜ n4: 4

angka_float = -3.141592653589

print(f"angka float: {angka_float:.2f}")# output ➜ angka float: -3.14

print(f"angka float: {angka_float:.3f}")# output ➜ angka float: -3.142

print(f"angka float: {angka_float:.4f}")# output ➜ angka float: -3.1416

◉ Karakteristik floating point

Hampir di semua bahasa pemrograman yang ada, tipe data float (atau sejenisnya) memiliki satu sifat unik

dimana angka belakang koma tidak tersimpan secara pasti informasinya digitnya.

Agar lebih jelas, silakan run program berikut:

Ajaib bukan? Operasi aritmatika 3.14 + 2.8 menghasilkan output 5.9399999999999995 .

Namun tidak usah khawatir, ini bukan error. Di belakang layar, komputer memang selalu menyimpan

informasi angka belakang koma float secara tidak pasti (tidak fixed).

Untuk menampilkan angka fixed-nya, gunakan suffix :f . Contoh:

Manfaatkan suffix :{n}f untuk menampilkan jumlah digit belakang koma ( n ) sesuai keinginan.

Misalnya:

Lebih detailnya mengenai string formatting dibahas pada chapter String Formatting

◉ Konversi tipe data via fungsi float()

Fungsi float() digunakan untuk mengkonversi suatu nilai menjadi float.

n = 3.14 + 2.8print(f"3.14 + 2.8: {n}")

n = 3.14 + 2.8

print(f"3.14 + 2.8: {n:f}")# output ➜ 3.14 + 2.8: 5.940000

n = 3.14 + 2.8print(f"3.14 + 2.8: {n:.2f}")# output ➜ 3.14 + 2.8: 5.94

number = 278885float_num1 = float(number)

Fungsi ini cukup berguna untuk dipergunakan dalam kebutuhan konversi tipe data, misalnya dari string ke

float.

◉ Notasi float exponential

Deklarasi nilai float bisa ditulis memakai   literal float dengan notasi exponsensial, yaitu {f}e{n} atau

{f}e+{n} dimana literal tersebut menghasilkan angka f * (10 ^ n) .

Agar lebih jelas, langsung ke praktek saja.

Penjelasan:

• Notasi 2e0 artinya yaitu  2.0 * (10 ^ 0) . Nilai tersebut ekuivalen dengan 2.0

• Notasi 577e2 artinya yaitu  577.0 * (10 ^ 2) . Nilai tersebut ekuivalen dengan 57700.0

• Notasi 68277e+6 artinya yaitu  68277.0 * (10 ^ 6) . Nilai tersebut ekuivalen dengan

68277000000.0

Nilai n setelah huruf e jika diisi dengan nilai negatif menghasilkan output dengan formula f / (10 ^

n) . Contoh:

A.19.4. Bilangan complex

Bilangan complex yaitu  bilangan yang isinya merupakan kombinasi bilangan real dan bilangan imajiner,

text = '278885.666'float_num2 = float(text)print(f"float_num2: {float_num2}")# output ➜ float_num: 278885.666

float1 = 2e0print(f"float1: {float1}")# output ➜ float1: 2.0

float2 = 577e2print(f"float2: {float2}")# output ➜ float2: 57700.0

float3 = 68277e+6print(f"float3: {float3}")# output ➜ float3: 68277000000.0

float4 = 6e-3print(f"float4: {float4}")# output ➜ float4: 0.006

contohnya seperti 120+3j .

Informasi bilangan real pada complex number bisa dimunculkan memakai   property real sedangkan

informasi bilangan imajinernya memakai   property imag . Contoh:

◉ Fungsi complex()

Fungsi complex() yaitu  digunakan sebagai alternatif cara membuat bilangan kompleks.

Sebagai contoh, bilangan 120+3j jika dituliskan memakai   fungsi complex() maka penulisannya

seperti berikut:

◉ Operasi aritmatika bilangan complex

Seperti wajarnya suatu bilangan, nilai complex bisa dimasukan dalam operasi matematika standar,

misalnya:

angka_complex = 120+3jprint(f"angka complex: {angka_complex}")# output ➜ angka complex: (120+3j)

r = angka_complex.realprint(f"angka real: {r}")# output ➜ angka real: 120.0

i = angka_complex.imagprint(f"angka imajiner: {i}")# output ➜ angka imajiner: 3.0

angka_complex = complex(120, 3)print(f"angka complex: {angka_complex}")# output ➜ angka complex: (120+3j)

cmp1 = 120-2jcmp2 = -19+4j

res = cmp1 + cmp2print(f"angka complex: {res}")# output ➜ angka complex: (101+2j)

res = cmp1 + cmp2 + 23print(f"angka complex: {res}")# output ➜ angka complex: (124+2j)

res = (cmp1 + cmp2 + 23) / 0.5print(f"angka complex: {res}")

Penjelasan:

• Operasi antar bilangan kompleks akan melakukan perhitungan terhadap bilangan real dan juga

bilangan imajinernya.

• Operasi antara bilangan kompleks vs. bilangan real, menghasilkan dua operasi aritmatika:

◦ Menghitung bilangan real bilangan complex vs bilangan real

◦ Dan juga menghitung bilangan imajiner vs bilangan real

Catatan chapter 📑📑

◉ Source code praktik

github.com/novalagung/dasarpemrogramanpython-example/../number-bilangan

◉ Chapter relevan lainnya

• Variabel

• Tipe Data

• String ➜ formatting

◉ TBA

• nan

• inf

◉ Referensi

• https://pythondev.readthedocs.io/numbers.html

• https://note.nkmk.me/en/python-nan-usage/

• https://note.nkmk.me/en/python-inf-usage/

A.20. Python Slice (Data

Sequence Slicing)

Pada chapter ini kita akan belajar tentang penerapan teknik slice pada data

sequence.

A.20.1. Pengenalan slice

Teknik slice atau slicing digunakan untuk mengakses sekumpulan element/item

dari data sequence sesuai dengan index yang diinginkan. Data sequence

sendiri yaitu  klasifikasi tipe data yang berisi kumpulan data terurut atau

sekuensial. Yang termasuk dalam tipe data sequence yaitu  list, range, tuple,

dan string.

Operasi slice mengembalikan data bertipe sama seperti data aslinya,

sedangkan isi sesuai dengan index yang ditentukan.

Salah satu penerapan slice yaitu  dengan memanfaatkan notasi

data[start:end] atau data[start:end:step] .

• start yaitu  index awal slicing. Misalkan index start yaitu  2 maka

slicing dimulai dari element index ke-2.

• end yaitu  index akhir slicing. Misalkan index end yaitu  5 maka

slicing berakhir sebelum element index ke-5 (yang berarti element ke-4).

• step by default nilainya 1 , kegunaannya untuk menentukan apakah

element yang dikembalikan yaitu  setiap step index.

Lanjut praktek. Pada contoh berikut disiapkan variabel data_str berisi string

hello world yang kemudian akan di-slice datanya.

Variabel data_str visualisasinya dalam bentuk sequence kurang lebih seperti

ini. Lebar element data yaitu  11 dengan index awal 0 dan index akhir 10 .

Ok, sekarang kita coba slice data_str :

• Slicing element index ke-0 hingga ke-2, maka notasinya yaitu 

data_str[0:3] . Perlu diketahui bahwa end diisi dengan nilai index-1 ,

jadi jika ingin mengambil element hingga index ke-2 maka nilai end

yaitu  3 .

• Slicing element index ke-2 hingga ke-7, maka notasinya yaitu 

data_str = "hello world"

print(data_str)

# output ➜ hello world

data_str = "hello world"

slice1 = data_str[0:3]

print(slice1)

# output ➜ hel

data_str[2:8] .

• Slicing element hingga index ke-4, maka notasinya yaitu  data_str[:5] .

Nilai start jika tidak diisi maka default-nya yaitu  0 . Notasi tersebut

yaitu  ekuivalen dengan data_str[0:5] .

• Slicing element dimulai index ke-4, maka notasinya yaitu  data_str[4:] .

Nilai end jika tidak diisi maka default-nya yaitu  nilai jumlah element

data (ekuivalen dengan notasi data_str[4:len(data_str)] ).

slice2 = data_str[2:8]

print(slice2)

# output ➜ llo wo

slice3 = data_str[:5]

print(slice3)

# output ➜ hello

slice4 = data_str[4:]

• Slicing element dimulai index ke-3 hingga ke-6 dengan element yang

dikembalikan yaitu  setiap 1 element, maka notasinya yaitu 

data_str[3:7:1] .

• Slicing element dimulai index ke-2 hingga ke-8 dengan ketentuan element

yang dikembalikan yaitu  setiap 2 element, notasinya: data_str[2:9:2] .

slice5 = data_str[3:7:1]

print(slice5)

# output ➜ lo w

slice6 = data_str[2:9:2]

print(slice6)

# output ➜ lowr

• Slicing seluruh element bisa dilakukan dengan notasi data_str[:] . Notasi

tersebut yaitu  ekuivalen dengan data_str[0:len(data_str)] .

• Slicing seluruh element dengan ketentuan element yang dikembalikan

yaitu  setiap 2 element, ditulis dengan notasi data_str[::2] . Notasi

tersebut yaitu  ekuivalen dengan data_str[0:len(data_str):2] .

slice7 = data_str[:]

print(slice7)

# output ➜ hello world

slice8 = data_str[::2]

print(slice8)

# output ➜ hlowrd

◉ Tentang slicing seluruh element

Slicing seluruh element bisa dilakukan dengan notasi data[0:len(data)]

atau data[0:len(data):1] . Sebagai contoh, 3 statement printing tuple

berikut memunculkan output yang sama meskipun data tuple yang

ditampilkan yaitu  dari variabel yang berbeda.

Ok, lalu kenapa harus memakai   teknik ini? padahal operasi assignment

data tuple ke variabel baru jauh lebih mudah, misalnya:

data_tuple = (1, 3, 5, 7, 9, 11, 13, 14)

print(data_tuple)

# output ➜ (1, 3, 5, 7, 9, 11, 13, 14)

tuple1 = data_tuple[0:len(data_tuple)]

print(tuple1)

# output ➜ (1, 3, 5, 7, 9, 11, 13, 14)

tuple2 = data_tuple[0:len(data_tuple):1]

print(tuple2)

# output ➜ (1, 3, 5, 7, 9, 11, 13, 14)

tuple3 = data_tuple

print(tuple3)

# output ➜ (1, 3, 5, 7, 9, 11, 13, 14)

Statement assignment tuple3 di atas isinya yaitu  sama dengan data hasil

operasi slicing tuple1 dan tuple2 , namun reference-nya yaitu  berbeda.

Pembahasan detail mengenai reference ada di chapter Object ID &

Reference

A.20.2. Fungsi slice()

Notasi penulisan slice bisa disimpan pada suatu variabel dengan

memanfaatkan fungsi slice() . Nilai start , end , dan step dijadikan

argument pemanggilan fungsi tersebut dengan notasi slice(start, end)

atau slice(start, end, step) .

Pada contoh berikut, perhatikan bagaimana perbedaan slicing pada list1 ,

list2 , dan list3 :

data_list = [2, 4, 6, 7, 9, 11, 13]

print(data_list)

# output ➜ [2, 4, 6, 7, 9, 11, 13]

list1 = data_list[2:6:1]

print(list1)

# output ➜ [6, 7, 9, 11]

list2 = data_list[slice(2, 6, 1)]

print(list2)

# output ➜ [6, 7, 9, 11]

sl = slice(2, 6)

list3 = data_list[sl]

print(list3)

# output ➜ [6, 7, 9, 11]

Catatan chapter 📑📑

◉ Source code praktik

github.com/novalagung/dasarpemrogramanpython-example/../slice

◉ Chapter relevan lainnya

• List

• Tuple

• String

• Object ID & Reference

◉ TBA

• Negative index slicing

◉ Referensi

• https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-

range

• https://python-reference.readthedocs.io/en/latest/docs/functions/slice.html

• https://stackoverflow.com/questions/509211/how-slicing-in-python-works

A.21. Python Object ID &

Reference

Pada chapter ini kita akan belajar tentang beberapa hal yang berhubungan

dengan object/data dan reference, diantaranya:

• Apa itu identifier data (object ID)

• Bagaimana Python mengelola data

• Apa yang terjadi sewaktu data di-assign ke variabel lain

• Dan juga peran ID dalam data reference dan operasi slicing

A.21.1. Object ID

Di Python, semua object atau data memiliki identifier, yaitu angka unik yang

merepresentasikan data tersebut. Sebagai contoh, pada kode berikut nilai

numerik 24 tersimpan pada variabel number , ID nya yaitu 

140728206353928 .

Output program di atas jika di-run:

number = 24

print("data:", number)

# output ➜ data: 24

identifier = id(number)

print("id:", identifier)

# output ➜ id: 140728206353928

Object ID dialokasikan oleh Python saat program dijalankan, dan nilainya bisa

saja berbeda setiap eksekusi program.

◉ Fungsi id()

Fungsi id() digunakan untuk melihat ID suatu data. Cara penggunaannya

cukup mudah, tulis fungsi lalu sisipkan data yang ingin dicek ID-nya sebagai

parameter pemanggilan fungsi.

A.21.2. Reference / alamat memori data

Perlu diketahui bahwa Identifier merupakan metadata informasi yang

menempel pada data atau object, bukan menempel ke variabel. Data yang

sama jika di-assign ke banyak variabel, maka pengecekan ID pada semua

variabel tersebut mengembalikan ID yang sama.

Reference pada konteks programming artinya yaitu  referensi suatu

data ke alamat memori.

Coba pelajari kode berikut. Variabel message1 berisi string hello world .

String tersebut kemudian di-assign ke message2 . Selain itu ada juga variabel

message3 berisi string yang sama persis tapi dari deklarasi literal berbeda.

message1 = "hello world"

message2 = message1

Jalankan program, lalu perhatikan id -nya:

Penjelasan program:

• Ketiga variabel di atas berisi data string yang sama persis, yaitu hello

world .

• Identifier data string pada variabel message1 dan message2 yaitu 

sama. Hal ini wajar karena memang variabel message2 mendapatkan data

dari message1 . Yang terjadi di belakang layar, kedua variabel tersebut

menampung nilai yang tersimpan di alamat memori yang sama

(reference-nya sama).

• Identifier data string pada variabel message3 yaitu  berbeda

dibandingkan message1 maupun message2 , hal ini karena meskipun isi

string ketiga variabel sama, dua diantaranya yaitu  tersimpan di alamat

memory yang berbeda.

Ilustrasi dalam bentuk grafiknya kurang lebih seperti ini:

Variabel hanya merupakan media untuk pengaksesan data. Data sendiri

tersimpan-nya yaitu  di memory. Sangat mungkin ada situasi dimana satu

data direpresentasikan oleh lebih dari 1 variabel. Contohnya seperti message1

dan message2 .

A.21.3. Operasi logika via keyword is

Kita sudah cukup sering memakai   operator == dan operator logika

lainnya untuk membandingkan dua buah nilai. Dalam penerapannya, operator-

operator tersebut akan membandingkan isi data, bukan identifier-nya.

Pada kode berikut ini, 3 variabel yang telah dibuat sebelumnya digunakan

pada statement perbandingan.

Hasil dari ke-3 statement perbandingan yaitu  True , karena memang isi

data-nya yaitu  sama, yaitu string hello world .

Selanjutnya coba bandingkan dengan satement operator perbandingan

memakai   keyword is . Keyword is akan melakukan pengecekan

apakah identifier suatu data yaitu  sama dengan yang dibandingkan (yang di-

cek yaitu  identifier-nya, bukan isi datanya).

message1 = "hello world"

message2 = message1

message3 = "hello world"

print(f"message1 ({id(message1)}) == message2 ({id(message2)}) ➡

{message1 == message2}")

# output ➜ message1 (2131034204400) == message2 (2131034204400) ➡ True

print(f"message1 ({id(message1)}) == message3 ({id(message3)}) ➡

{message1 == message3}")

# output ➜ message1 (2131034204400) == message3 (2131034205616) ➡ True

print(f"message2 ({id(message2)}) == message3 ({id(message3)}) ➡

{message2 == message3}")

# output ➜ message2 (2131034204400) == message3 (2131034205616) ➡ True

message1 = "hello world"

message2 = message1

message3 = "hello world"

print(f"message1 ({id(message1)}) is message2 ({id(message2)}) ➡

{message1 is message2}")

# output ➜ message1 (2131034204400) is message2 (2131034204400) ➡ True

print(f"message1 ({id(message1)}) is message3 ({id(message3)}) ➡

{message1 is message3}")

# output ➜ message1 (2131034204400) is message3 (2131034205616) ➡ False

Hasilnya:

• Statement message1 is message2 menghasilkan True karena kedua

variabel tersebut merepresentasikan satu data yang sama (tersimpan di

alamat memory yang sama).

• Statement perbandingan lainnya menghasilkan False karena identifier

data yaitu  berbeda meskipun isi data yaitu  sama.

◉ Lebih dalam mengenai korelasi operasi assignment

dan object ID

Mari kita modifikasi lagi kode sebelumnya agar lebih terlihat jelas efek dari

operasi assignment ke object ID.

Pada kode berikut, kita coba tampilkan hasil operasi perbandingan

memakai   keyword is . Kemudian nilai variabel message2 diubah dan

dibandingkan ulang. Setelah itu, nilai message3 diubah untuk diisi dengan

nilai dari message2 .

message1 = "hello world"

message2 = message1

message3 = "hello world"

print(f"message1 ({id(message1)}) is message2 ({id(message2)}) ➜

{message1 is message2}")

print(f"message1 ({id(message1)}) is message3 ({id(message3)}) ➜

{message1 is message3}")

print(f"message2 ({id(message2)}) is message3 ({id(message3)}) ➜

{message2 is message3}")

message2 = "hello world"

print(f"message1 ({id(message1)}) is message2 ({id(message2)}) ➜

{message1 is message2}")

Output program:

Bisa dilihat, pada bagian akhir, statement message2 is message3

menghasilkan nilai True karena pada baris tersebut isi data message3 sudah

diganti dengan data dari message2 , menjadikan kedua variabel menampung

satu data yang sama, dan tersimpan di alamat memory yang sama.

Ilustrasi perubahan data pada program di atas dalam bentuk grafik bisa dilihat

pada penjelasan berikut:

• Fase 1:

message1 = "hello world" # statement 1

message2 = message1 # statement 2

message3 = "hello world" # statement 3

• Fase 2:

message1 = "hello world" # statement 1

message2 = message1 # statement 2

message3 = "hello world" # statement 3

message2 = "hello world" # statement 4

• Fase 3:

message1 = "hello world" # statement 1

message2 = message1 # statement 2

message3 = "hello world" # statement 3

message2 = "hello world" # statement 4

message3 = message2 # statement 5

A.21.4. Reference data sequence

Data sequence (entah itu list, string, ataupun lainnya) kalau dilihat dari segi

manajemen memory-nya yaitu  berbeda dibandingkan dengan bagaimana

data dalam array di-manage di bahasa lain.

List di Python tersimpan pada satu alamat memory. Tidak seperti slice/array

pada bahasa Go (misalnya), yang setiap element-nya merupakan reference.

Perhatikan kode berikut, variabel numbers1 berikut di-assign ke variabel

bernama numbers2 , maka identifier kedua variabel yaitu  sama karena

mengarah ke satu data yang sama.

Perlu diingat bahwa data sequence bukan data atomic seperti int yang isinya

sangat spesifik, yaitu nilai numerik. Data sequence merupakan data kolektif

dengan isi banyak element. Data sequence isi-isi element-nya bisa dimutasi

atau diubah tanpa men-trigger alokasi alamat memory baru (identifier-nya

yaitu  tetap).

Sebagai contoh, pada program berikut, variabel numbers1 dan numbers2

reference-nya yaitu  sama. Apa yang akan terjadi ketika ada penambahan

element baru di salah satu variabel?

Output program:

numbers1 = [1, 2, 3, 4]

print("numbers1", id(numbers1), numbers1)

# output ➜ numbers1 2269649131136 [1, 2, 3, 4]

numbers2 = numbers1

print("numbers1", id(numbers1), numbers1)

# output ➜ numbers1 2269649131136 [1, 2, 3, 4]

print("numbers2", id(numbers2), numbers2)

# output ➜ numbers2 2269649131136 [1, 2, 3, 4]

import sys

numbers1 = [1, 2, 3, 4]

print("numbers1", numbers1, id(numbers1), sys.getsizeof(numbers1))

numbers2 = numbers1

numbers2.append(9)

print("numbers1", numbers1, id(numbers1), sys.getsizeof(numbers1))

print("numbers2", numbers1, id(numbers2), sys.getsizeof(numbers2))

Dari output eksekusi program terlihat bahwa data numbers1 ikut berubah

setelah numbers2 diubah lewat penambahan element baru (via method

append() ). perubahan di kedua variabel terjadi karena memang keduanya

merepresentasikan satu data yang sama, reference-nya yaitu  sama.

Terlihat juga ID kedua variabel juga tetap meskipun setelah isi element-nya di-

ubah.

◉ Fungsi sys.getsizeof()

Fungsi getsizeof() tersedia dalam module sys , kegunaannya untuk

melihat ukuran data dalam byte.

A.21.5. Reference pada data hasil slicing

Bagaimana dengan slicing, apakah ada efeknya ke object ID dan reference

data? Yap, ada. Coba saja test program berikut:

numbers1 = [1, 2, 3, 4]

numbers2 = numbers1

numbers3 = numbers1[:]

print("numbers1", numbers1, id(numbers1)) # statement 1

print("numbers2", numbers2, id(numbers2)) # statement 2

print("numbers3", numbers3, id(numbers3)) # statement 3

Kemudian lihat hasilnya:

Penjelasan:

• Ketika suatu data sequence di assign dari satu variabel ke variabel lain,

maka keduanya memiliki reference yang sama.

• Namun, jika assignment tersebut merupakan hasil operasi slice, maka data

hasil slicing merupakan data baru yang tersimpan di alamat memory baru.

Jadi ID-nya sudah pasti berbeda.

Ilustrasi yang terjadi pada saat statement 1, 2, 3 dieksekusi:

Lalu setelah angka 9 di-append ke numbers2 :

A.21.6. Catatan tambahan tentang object

ID

Ada hal unik/spesial yang berhubungan dengan object ID yang wajib untuk

diketahui, diantaranya:

◉ Object ID data numerik

Python meng-cache informasi data numerik integer -5 hingga 256 , karena

alasan ini terkadang ID suatu data numerik integer yaitu  sama (meskipun

tidak selalu).

n1 = 12

n2 = 12

◉ Object ID data string

Python meng-cache informasi data string a hingga Z , karena alasan ini

terkadang ID suatu data string yaitu  sama (meskipun tidak selalu).

Catatan chapter 📑📑

◉ Source code praktik

github.com/novalagung/dasarpemrogramanpython-example/../object-id-

reference

◉ Chapter relevan lainnya

• Slice

◉ TBA

• Hashable

str1 = 'Indonesia'

str2 = "Indonesia"

print(f"id str1: {id(str1)}, id str2: {id(str2)}")

# output ➜ id str1: 133983722110320, id str2: 133983722110320

print(f"str1 == str2: {str1 == str2}")

# output ➜ str1 == str2: True

print(f"str1 is str2: {str1 is str2}")

# output ➜ str1 is str2: True

◉ Referensi

• https://stackoverflow.com/questions/45335809/python-pass-by-reference-

and-slice-assignment

• https://stackoverflow.com/a/15172182/1467988

A.22. Python Function /

Fungsi

Penerapan fungsi di Python cukup mudah dan pada chapter ini kita akan

memulai untuk mempelajarinya.

O iya, chapter ini merupakan chapter pembuka pembahasan topik fungsi. Ada

banyak hal yang perlu dipelajari, oleh karena itu penulis memutuskan untuk

memecah chapter menjadi beberapa bagian.

A.22.1. Pengenalan Fungsi

Function atau fungsi yaitu  kode program yang terisolasi dalam satu blok

kode, yang bisa dipanggil sewaktu-waktu. Fungsi memiliki beberapa atribut

seperti nama fungsi, isi fungsi, parameter/argument, dan nilai balik.

Pembuatan fungsi dilakukan dengan keyword def diikuti dengan nama fungsi,

lalu di bawahnya ditulis body/isi fungsi. Sebagai contoh pada kode berikut

fungsi say_hello() dideklarasikan dengan isi yaitu  sebuah statement yang

menampilkan text hello .

Setelah di deklarasikan, fungsi bisa dipanggil berkali-kali. Misalnya pada

contoh berikut fungsi say_hello() dipanggil 3x.

def say_hello():

print("hello")

def say_hello():

Output program sewaktu di-run:

Suatu fungsi hanya bisa diakses atau dipanggil setelah fungsi tersebut

dideklarasikan (statement pemanggilan fungsi harus dibawah statement

deklarasi fungsi). Jika fungsi dipaksa digunakan sebelum dideklarasikan

hasilnya error.

Pada contoh di atas, selain say_hello() sebenarnya ada satu buah fungsi

lagi yang digunakan pada contoh, yaitu print() . Fungsi print()

dideklarasikan dalam Python Standard Library (stdlib). Sewaktu program

dijalankan fungsi-fungsi dalam stdlib otomatis ter-import dan bisa digunakan.

Lebih detailnya mengenai Python Standard Library dibahas pada chapter

Python Standard Library

Untuk tambahan latihan, buat satu fungsi lagi, lalu isi dengan banyak

statement. Misalnya:

Output program:

Penulisan isi fungsi (statement-statement dalam fungsi) harus disertai dengan

indentation yang benar. Isi statement posisinya tidak boleh sejejar dengan blok

deklarasi fungsi (secara vertikal). Isi fungsi harus lebih menjorok ke kanan.

Sebagai contoh, penulisan statement berikut yaitu  tidak valid dan

menghasilkan error sewaktu di-run:

def print_something():

print("hello")

today = "Thursday"

print(f"happy {today}")

for i in range(5):

print(f"i: {i}")

print_something()

A.22.2. Parameter dan argument fungsi

Fungsi bisa memiliki parameter. Dengan adanya parameter, suatu nilai bisa di-

sisipkan ke dalam fungsi secara dinamis saat pemanggilannya.

Parameter sendiri merupakan istilah untuk variabel yang menempel pada

fungsi, yang mengharuskan kita untuk menyisipkan nilai pada parameter

tersebut saat pemanggilan fungsi.

Contoh:

Penjelasan:

• Fungsi calculate_circle_area() dideklarasikan memiliki parameter

bernama r .

• Notasi penulisan parameter fungsi ada diantara penulisan kurung () milik

def print_something():

print("hello")

today = "Thursday"

print(f"happy {today}")

for i in range(5):

print(f"i: {i}")

def calculate_circle_area(r):

area = 3.14 * (r ** 2)

print("area of circle:", area)

calculate_circle_area(788)

# output ➜ area of circle: 1949764.1600000001

blok deklarasi fungsi.

• Tugas fungsi calculate_circle_area() yaitu  menghitung luas lingkaran

dengan nilai jari-jari didapat dari parameter r . Nilai luas lingkaran

kemudian di-print.

• Setelah blok deklarasi fungsi, ada statement pemanggilan fungsi

calculate_circle_area() . Nilai numerik 788 digunakan sebagai

argument parameter r pemanggilan fungsi tersebut.

INFO

Catatan:

• Parameter yaitu  istilah untuk variabel yang menempel di fungsi.

• Argument yaitu  isitilah untuk nilai yang disisipkan saat pemanggilan

fungsi (yang ditampung oleh parameter).

Dewasa ini, kedua istilah tersebut dimaknai sama, jadi tidak usah bingung.

Parameter by default bisa menerima segala jenis tipe data. Untuk memaksa

suatu parameter agar hanya bisa menerima data tertentu, maka tulis tipe data

yang diinginkan dengan notasi penulisan sama seperti deklarasi variabel.

Perhatikan contoh berikut agar lebih jelas. Fungsi calculate_circle_area()

di atas di-refactor menjadi fungsi dengan 2 parameter yaitu message bertipe

string dan r bertipe int .

def calculate_circle_area(message: str, r: int):

area = 3.14 * (r ** 2)

print(message, area)

calculate_circle_area("area of circle:", 788)

Fungsi bisa tidak memiliki parameter, satu parameter, atau bisa lebih dari

satu, tidak ada batasan.

Python memiliki args dan kwargs, pembahasan detailnya ada di

chapter Function ➜ Args & Kwargs

O iya, argument fungsi bisa dituliskan secara horizontal maupun vertikal.

Misalnya:

• Penulisan argument secara horizontal

• Penulisan argument secara vertikal

Penulisan argument secara vertikal umumnya cukup berguna pada situasi

dimana fungsi yang dipanggil memiliki cukup banyak parameter yang harus

diisi.

A.22.3. Naming convention fungsi &

parameter

Mengacu ke dokumentasi PEP 8 – Style Guide for Python Code, nama fungsi

dianjurkan untuk ditulis memakai   snake_case .

calculate_circle_area("area of circle:", 788)

calculate_circle_area(

"area of circle:",

788

)

Sedangkan aturan penulisan nama parameter/argument yaitu  sama seperti

nama variabel, yaitu memakai   snake_case juga. Misalnya:

A.22.4. Nilai balik fungsi (return value)

Fungsi bisa memiliki return value atau nilai balik. Data apapun bisa dijadikan

sebagai nilai balik fungsi, caranya dengan dengan memanfaatkan keyword

return , tulis keyword tersebut di dalam isi fungsi diikuti dengan data yang

ingin dikembalikan.

Mari coba praktekan, coba jalankan kode berikut:

def say_hello():

print("hello")

def say_hello(the_message):

print(the_message)

def calculate_circle_area(r: int):

area = 3.14 * (r ** 2)

return area

def calculate_circle_circumference(r: int):

return 2 * 3.14 * r

area = calculate_circle_area(788)

print(f"area: {area:.2f}")

# output ➜ area: 1949764.16

circumference = calculate_circle_circumference(788)

print(f"circumference: {circumference:.2f}")

# output ➜ circumference: 4948.64

Penjelasan:

• Notasi penulisan parameter fungsi ada dalam kurung () milik blok

deklarasi fungsi.

• Fungsi calculate_circle_area() dideklarasikan memiliki parameter

bernama r .

◦ Tugas fungsi ini yaitu  menghitung luas lingkaran dengan nilai jari-jari

didapat dari parameter r . Hasil perhitungan disimpan di variabel

area .

◦ Di akhir isi fungsi, nilai variabel area dikembalikan memakai  

keyword return .

• Fungsi calculate_circle_circumference() mirip seperti fungsi

sebelumnya, hanya saja fungsi ini memiliki tugas yang berbeda yaitu

untuk menghitung keliling lingkaran.

◦ Fungsi ini melakukan perhitungan 2 * 3.14 * r kemudian hasilnya

dijadikan nilai balik.

• Setelah blok deklarasi fungsi, ada statement pemanggilan fungsi

calculate_circle_area() . Nilai 788 digunakan sebagai argument

parameter r pemanggilan fungsi tersebut.

• Kemudian ada lagi statement pemanggilan fungsi

calculate_circle_circumference() . Nilai 788 digunakan sebagai

argument parameter r pemanggilan fungsi tersebut.

• Nilai balik kedua pemanggilan fungsi di atas masing-masing di-print.

O iya, fungsi yang didalamnya tidak memiliki statement return sebenarnya

juga mengembalikan nilai balik, yaitu None .

Pembahasan detail mengenai tipe data None ada di chapter None

A.22.5. Tipe data nilai balik fungsi

(return type)

Python mendukung type hinting yaitu penentuan tipe data nilai balik fungsi

yang ditulis secara eksplisit. Penerapannya bisa dilihat pada kode berikut

dimana fungsi calculate_circle_area() dan

calculate_circle_circumference() tipe data nilai baliknya ditulis secara

jelas.

Notasi penulisan type hinting yaitu  dengan menuliskan tanda -> setelah

deklarasi fungsi diikuti dengan tipe datanya.

def calculate_circle_area(r: int) -> float:

area = 3.14 * (r ** 2)

return area

def calculate_circle_circumference(r: int) -> float:

return 2 * 3.14 * r

area = calculate_circle_area(788)

print(f"area: {area:.2f}")

# output ➜ area: 1949764.16

circumference = calculate_circle_circumference(788)

print(f"circumference: {circumference:.2f}")

# output ➜ circumference: 4948.64

def <function_name>() -> <data_type>:

return <data>

Penerapan type hinting mewajibkan fungsi untuk selalu memiliki nilai balik

berupa data bertipe sesuai.

Jika nilai balik tipe datanya berbeda dengan yang ditulis di deklarasi fungsi,

warning akan muncul.

Khusus untuk tipe data nilai balik None tidak wajib diikuti statement return .

Contoh:

• Fungsi dengan return type None diikuti statement return :

• Fungsi dengan return type None tanpa diikuti statement return :

• Fungsi dengan tanpa return type maupun return statement:

def say_hello() -> None:

print("hello world")

return None

def say_hello() -> None:

print("hello world")

def say_hello():

print("hello world")

A.22.6. Keyword pass

Keyword pass secara fungsional umumnya tidak terlalu berguna, kecuali

untuk beberapa situasi. Misalnya untuk dipergunakan sebagai isi pada fungsi

yang masih belum selesai dikerjakan. Daripada fungsi isinya kosong dan akan

menghasilkan error kalau di-run, lebih baik diisi pass .

Sebagai contoh, penulis berencana membuat fungsi bernama

transpose_matrix() , namun fungsi tersebut tidak akan di-coding sekarang

karena suatu alasan. Jadi yang penulis lakukan yaitu  mendeklarasikan fungsi

tersebut, kemudian diisi hanya statement pass .

Dari blok kode di atas, nantinya engineer akan tau bahwa fungsi tersebut akan

dibuat tapi belum selesai pengerjaannya.

Catatan chapter 📑📑

◉ Source code praktik

github.com/novalagung/dasarpemrogramanpython-example/../function

# need to complete sometime later

def transpose_matrix(matrix):

pass

◉ Chapter relevan lainnya

• Function ➜ Positional, Optional, Keyword Arguments

• Function ➜ Args & Kwargs

• Function ➜ Closure

• Function ➜ Lambda

◉ Referensi

• https://docs.python.org/3/tutorial/controlflow.html#defining-functions

• https://peps.python.org/pep-3102/

• https://peps.python.org/pep-0484/

A.23. Python Function

Argument (Positional,

Optional, Keyword

Argument)

Pada chapter ini kita akan belajar tentang apa itu positional argument, optional

argument, dan keyword arguments, serta bagaimana penerapannya di Python.

A.23.1. Positional argument

Positional argument yaitu  istilah untuk urutan parameter/argument fungsi.

Pengisian argument saat pemanggilan fungsi harus urut sesuai dengan

deklarasi parameternya.

Silakan perhatikan kode berikut:

def create_sorcerer(name, age, race, era):

return {

"name": name,

"age": age,

"race": race,

"era": era,

}

obj1 = create_sorcerer("Sukuna", 1000, "incarnation", "heian")

print(obj1)

# output ➜ {'name': 'Sukuna', 'age': 1000, 'race': 'incarnation', 'era':

'heian'}

Coba lakukan sedikit experiment dengan mengubah urutan pengisian data

contohnya seperti ini. Hasilnya: program tidak error, namun data yang

dihasilkan yaitu  tidak sesuai harapan.

Saat pemanggilan fungsi dengan argument, pastikan untuk selalu menyisipkan

argument sesuai dengan parameter yang dideklarasikan. Gunakan penamaan

parameter yang sesuai agar lebih mudah untuk mengetahui parameter harus

diisi dengan data apa.

A.23.2. Keyword argument

Keyword argument atau named argument yaitu  metode pengisian argument

pemanggilan fungsi disertai nama parameter yang ditulis secara jelas

(eksplisit).

Pada kode berikut dibuat 3 buah statement pemanggilan fungsi

create_sorcerer() . Ketiganya memiliki perbedaan satu sama lain pada

bagian bagaimana argument disisipkan ke fungsi.

obj4 = create_sorcerer("400 year ago", 400, "human", "Hajime Kashimo")

print(obj3)

# output ➜ {'name': '400 year ago', 'age': 400, 'race': 'human', 'era':

'Hajime Kashimo'}

obj5 = create_sorcerer("Sukuna", 1000, "incarnation", "heian")

print(obj5)

# output ➜ {'name': 'Sukuna', 'age': 1000, 'race': 'incarnation', 'era':

'heian'}

obj6 = create_sorcerer(name="Kenjaku", age=1000, race="human", era="1000+

year ago")

print(obj6)

Penjelasan:

• Pada statement obj5 , fungsi dipanggil dengan nilai argument disisipkan

seperti biasa.

• Pada statement obj6 , fungsi dipanggil dengan nilai argument disisipkan

disertai nama parameter.

• Pada statement obj7 , argument pertama dan ke-2 ditulis tanpa nama

parameter, sedangkan argument ke-3 dan ke-4 ditulis disertai nama

parameternya.

Kombinasi penulisan argument seperti pada statement obj7 yaitu 

diperbolehkan, dengan catatan: untuk argument yang tidak disertai nama

parameter harus diletakkan di kiri sebelum penulisan argument parameter

lainnya yang mengadopsi metode keyword argument.

Salah satu benefit dari penerapan keyword argument: pada argument

pemanggilan fungsi yang disertai nama parameter, urutan penulisan argument

boleh di-ubah. Contohnya seperti ini:

Pada statement obj8 semua argument pemanggilan fungsi ditulis

memakai   metode keyword argument dan urutannya diubah total.

obj8 = create_sorcerer(era="1000+ year ago", age=1000, name="Kenjaku",

race="human")

print(obj8)

# output ➜ {'name': 'Kenjaku', 'age': 1000, 'race': 'human', 'era':

'1000+ year ago'}

obj9 = create_sorcerer("Hajime Kashimo", 400, era="400 year ago",

race="human")

print(obj9)

# output ➜ {'name': 'Hajime Kashimo', 'age': 400, 'race': 'human', 'era':

'400 year ago'}

Sewaktu di-print, hasilnya tetap valid. Sedangkan pada statement obj9 ,

hanya argument parameter era dan race yang ditulis memakai  

metode keyword argument dengan urutan diubah. Sisanya (yaitu name dan

age ) ditulis memakai   metode positional argument secara urut.

Kesimpulannya:

• Penulisan argument pemanggilan fungsi by default harus urut (sesuai

dengan aturan positional argument), dengan pengecualian jika argument

ditulis memakai   keyword argument maka boleh diubah urutannya.

• Jika suatu pemanggilan fungsi pada bagian penulisan argument-nya

menerapkan kombinasi positional argument dan keyword argument maka

untuk argument yang ditulis tanpa keyword harus berada di bagian kiri dan

dituliskan secara urut.

A.23.3. Optional argument

Suatu parameter bisa ditentukan nilai default-nya saat deklarasi fungsi.

Efeknya, saat pemanggilan fungsi diperbolehkan untuk tidak mengisi nilai

argument karena nilai default sudah ditentukan.

Sebagai contoh, pada fungsi print_matrix() berikut, parameter matrix di-

set nilai default-nya yaitu  list kosong [] . Fungsi print_matrix() dipanggil

2x, pemanggilan pertama dengan tanpa argument, dan yang kedua dengan

argument matrix [[1, 2], [5, 6]] .

def print_matrix(matrix=[]):

if len(matrix) == 0:

print("[]")

for el in matrix:

Silakan run program di atas, dan perhatikan outpunya. Error tidak muncul saat

eksekusi statement print_matrix() pertama yang padahal tidak ada data

yang disisipkan saat pemanggilan fungsi. Hal ini karena fungsi tersebut pada

parameter matrix sudah ada nilai default-nya.

A.23.4. Kombinasi positional argument,

keyword argument, dan optional

argument

Parameter fungsi bisa berisi nilai default (seperti pada contoh sebelumnya)

atau tidak, atau bisa juga kombinasi keduanya.

Kode program berikut yaitu  contoh pengaplikasiannya. Fungsi

matrix_multiply_scalar() memiliki 2 buah parameter yaitu matrix yang

tidak memiliki default value dan scalar yang default value-nya yaitu  1 .

def matrix_multiply_scalar(matrix, scalar = 1):

res = []

for row in matrix:

res.append([cell * scalar for cell in row])

Pada kode di atas fungsi matrix_multiply_scalar() dipanggil beberapa kali:

• Pemanggilan ke-1: nilai parameter scalar tidak diisi, efeknya maka

default value digunakan.

• Pemanggilan ke-2: nilai parameter scalar ditentukan yaitu  3 .

• Pemanggilan ke-3: nilai parameter scalar ditentukan yaitu  2

memakai   metode keyword argument diterapkan.

• Pemanggilan ke-4: nilai parameter matrix dan scalar dituliskan

memakai   metode keyword argument diterapkan.

• Pemanggilan ke-5: nilai parameter matrix dan scalar dituliskan

memakai   metode keyword argument diterapkan dengan posisi

penulisan argument diubah.

Argument pemanggilan fungsi yang ditulis memakai   metode keyword

argument harus selalu diposisikan di sebelah kanan, setelah penulisan

argument yang memakai   metode positional argument. Jika dipaksa ditulis

terbalik, maka menghasilkan error. Contohnya seperti pada gambar berikut:

Catatan chapter 📑📑

◉ Source code praktik

github.com/novalagung/dasarpemrogramanpython-

example/../positional-optional-keyword-argument

◉ Chapter relevan lainnya

• Function

• Function ➜ Args & Kwargs

• Function ➜ Closure

• Function ➜ Lambda

◉ Referensi

• https://docs.python.org/3/tutorial/controlflow.html#defining-functions



A.24. Python Args &

Kwargs

Pada chapter ini kita akan belajar tentang penerapan args dan kwargs pada

fungsi di Python.

A.24.1. Pengenalan Args

Args (atau yang umumnya ditulis sebagai *args) merupakan notasi penulisan

parameter spesial dengan kapabilitas bisa menampung banyak positional

argument untuk ditampung dalam 1 parameter saja.

Agar lebih jelas tentang kegunaan args, mari pelajari terlebih dahulu kode

berikut:

Fungsi sum_then_print() menerima 5 buah argument numerik yang dari nilai

tersebut kemudian dihitung totalnya lalu ditampilkan.

Fungsi tersebut memiliki limitasi yaitu hanya bisa menerima 5 buah data

numerik. Untuk membuatnya bisa menampung sejumlah data, solusinya bisa

dengan cukup memakai   1 parameter saja dengan data argument yang

disisipkan harus dalam tipe data sequence seperti list, atau solusi alternatif

def sum_then_print(n1, n2, n3, n4, n5):

total = n1 + n2 + n3 + n4 + n5

print(total)

sum_then_print(2, 3, 4, 5, 4)

# output ➜ 18

lainnya bisa dengan memakai   *args yang di bawah ini dibahas.

Implementasi args cukup mudah, pada deklarasi fungsi tulis saja parameter

dengan nama apapun bebas, tetapi pada penulisannya diawali karakter

asterisk atau *, contohnya seperti parameter numbers berikut:

Fungsi di atas parameter numbers -nya ditulis memakai   notasi *args,

maka parameter tersebut akan menampung semua argument yang disisipkan

saat pemanggilan fungsi. Nilai argument disimpan oleh parameter numbers

dalam bentuk tuple. Variabel numbers di-iterasi nilainya lalu dihitung

totalnya.

◉ Args untuk argument dengan tipe data bervariasi

Metode *args ini mampu menampung segala jenis argument tanpa

meghiraukan tipe datanya. Contohnya bisa dilihat pada program berikut ini:

def sum_then_print(*numbers):

total = 0

for n in numbers:

total = total + n

print(total)

sum_then_print(2, 3, 4, 5, 4)

# output ➜ 18

def print_data(*params):

print(f"type: {type(params)}, data: {params}")

for i in range(len(params)):

print(f"param {i}: {params[i]}")

print_data("hello python", 123, [5, True, ("yesn't")], {"iwak", "peyek"})

# output ↓

◉ Kombinasi positional argument dan args

Args sebenarnya tidak benar-benar menangkap semua argument pemanggilan

fungsi, melainkan hanya argument yang ditulis sesuai posisi parameter hingga

posisi setelahnya. Misalnya, sebuah fungsi memiliki 2 parameter dimana

parameter pertama menampung string dan parameter kedua yaitu  *args,

maka pada contoh ini parameter *args hanya menampung argument ke-2 dan

setelahnya. Contoh:

Bisa dilihat, pada kode di atas parameter message menampung argument

ke-1 yaitu string total nilai: , dan parameter numbers menampung

argument ke-2 hingga seterusnya (yaitu data 2 , 3 , 4 , 5 , 4 ).

Perlu diketahui dalam penerapan kombinasi positional argument dan args,

positional argument harus selalu ditulis sebelum parameter *args.

◉ Kombinasi positional argument, args, dan keyword

argument

Keyword argument bisa digunakan bebarengan dengan positional argument

dan *args, dengan syarat harus dituliskan di akhir setelah *args.

def sum_then_print(message, *numbers):

total = 0

for n in numbers:

total = total + n

print(f"{message} {total}")

sum_then_print("total nilai:", 2, 3, 4, 5, 4)

# output ➜ total nilai: 18

A.24.2. Pengenalan Kwargs

Kwargs (atau yang umumnya ditulis sebagai **kwargs atau keyword

arguments) merupakan notasi penulisan parameter spesial dengan

kapabilitas bisa menampung banyak keyword argument pemanggilan fungsi

dalam 1 parameter saja.

def sum_then_print(message, *numbers, suffix_message):

total = 0

for n in numbers:

total = total + n

print(f"{message} {total} {suffix_message}")

sum_then_print("total nilai:", 2, 3, 4, 5, 4, suffix_message="selesai!")

# output ➜ total nilai: 18 selesai!

def print_data(**data):

print(f"type: {type(data)}")

print(f"data: {data}")

for key in data:

print(f"param: {key}, value: {data[key]}")

print_data(phone="nokia 3310", discontinue=False, year=2000,

networks=["GSM", "TDMA"])

# output ↓

#

# type: <class 'dict'>

# data: {'phone': 'nokia 3310', 'discontinue': False, 'year': 2000,

'networks': ['GSM', 'TDMA']}

#

# param: phone, value: nokia 3310

# param: discontinue, value: False

# param: year, value: 2000

Argument yang ditampung oleh parameter **kwargs datanya tersimpan

dalam bentuk dictionary dengan key yaitu  nama parameter dan value yaitu 

nilai argument.

◉ Kombinasi positional argument dan kwargs

Kwargs sebenarnya hanya menampung semua argument mulai dari argument

ke- n hingga seterusnya dimana n yaitu  nomor/posisi **kwargs ditulis.

Contohnya pada kode berikut, parameter data hanya akan menampung

argument nomor ke-3 hingga seterusnya. Argument pertama ditampung oleh

parameter message sedangkan argument ke-2 oleh parameter number .

Dalam penerapannya, positional argument harus selalu ditulis sebelum

parameter **kwargs.

def print_data(message, number, **data):

print(f"message: {message}")

print(f"number: {number}")

print()

for key in data:

print(f"param: {key}, value: {data[key]}")

print_data("sesuk prei", 2023, phone="nokia 3315", networks=["GSM",

"TDMA"])

# output ↓

#

# message: sesuk prei

# number: 2023

#

# param: phone, value: nokia 3310

# param: networks, value: ['GSM', 'TDMA']

◉ Kombinasi positional argument, args dan kwargs

Kombinasi antara positional argument, *args, dan **kwargs juga bisa

dilakukan dengan ketentuan semua positional argument ditulis terlebih dahulu,

kemudian diikuti *args, lalu **kwargs.

Contoh penerapannya:

Python secara cerdas mengidentifikasi argument mana yang akan disimpan

pada positional parameter, *args, dan **kwargs. Pada kode di atas, mapping

antara arguments dengan parameter yaitu  seperti ini:

• Argument hello world ditampung parameter message .

• Argument 1 , True ,dan ("yesn't", "nope") ditampung parameter

params .

• Keyword argument name="nokia 3310" , discontinued=True , dan

year_released=2000 ditampung parameter others .

◉ Kombinasi positional argument, args, keyword

def print_all(message, *params, **others):

print(f"message: {message}")

print(f"params: {params}")

print(f"others: {others}")

print_all("hello world", 1, True, ("yesn't", "nope"), name="nokia 3310",

discontinued=True, year_released=2000)

# output ↓

#

# message: hello world

# params: (1, True, ("yesn't", 'nope'))

# others: {'name': 'nokia 3310', 'discontinued': True, 'year_released':

2000}

argument, dan kwargs

Keyword argument bisa dituliskan diantara *args, dan **kwargs, diluar itu

menghasilkan error.

Catatan chapter 📑📑

◉ Source code praktik

github.com/novalagung/dasarpemrogramanpython-example/../args-

kwargs

◉ Chapter relevan lainnya

• Function

def print_all(message, *params, say_something, **others):

print(f"message: {message}")

print(f"params: {params}")

print(f"say_something: {say_something}")

print(f"others: {others}")

print_all("hello world", 1, True, ("yesn't", "nope"), say_something="how

are you", name="nokia 3310", discontinued=True, year_released=2000)

# output ↓

#

# message: hello world

# params: (1, True, ("yesn't", 'nope'))

# say_something: how are you

# others: {'name': 'nokia 3310', 'discontinued': True, 'year_released':

2000}

• Function ➜ Positional, Optional, Keyword Arguments

• Function ➜ Closure

• Function ➜ Lambda

◉ Referensi

• https://docs.python.org/3/tutorial/controlflow.html#arbitrary-argument-lists

A.25. Python Closure

Closure yaitu  istilah umum dalam programming untuk deklarasi fungsi yang

berada di dalam fungsi (nested function). Pada chapter ini kita akan

mempelajari cara implementasinya.

A.25.1. Pengenalan Closure

Di Python, fungsi bisa dideklarasikan di-dalam suatu fungsi. Penerapannya

cukup berguna pada kasus dimana ada blok kode yang perlu di-eksekusi lebih

dari satu kali tetapi eksekusinya hanya di dalam fungsi tertentu, atau

eksekusinya setelah pemanggilan fungsi tertentu.

Permisalan ada fungsi inner() yang dideklarasikan di dalam fungsi

outer() , maka:

• Fungsi inner() bisa diakses dari dalam fungsi outer()

• Fungsi inner() juga bisa diakses dari luar fungsi outer() asalkan fungsi

inner() tersebut dijadikan sebagai nilai balik fungsi outer() (untuk

kemudian ditampung ke dalam variabel lalu dieksekusi)

Program berikut berisi contoh praktis tentang fungsi inner() dan outer() .

Silakan pelajari dan praktekan.

def outer_func(numbers = []):

print(f"numbers: {numbers}")

def inner_func():

print(f"max: {max(numbers)}")

print(f"min: {min(numbers)}")

Output program:

Program di atas jika di-breakdown sesuai urutan eksekusi statement-nya

kurang lebih seperti ini:

• Tahap 1: eksekusi statement print("call outer_func()")

• Tahap 2: eksekusi statement print(f"numbers: {numbers}")

• Tahap 3: eksekusi statement print("call inner_func() within

outer_func()")

• Tahap 4: eksekusi statement inner_func()

◦ Tahap 4.A. eksekusi statement print(f"max: {max(numbers)}")

◦ Tahap 4.B. eksekusi statement print(f"min: {min(numbers)}")

• Tahap 5: eksekusi statement print("call inner_func() outside of

outer_func()")

• Tahap 6: eksekusi statement inner_func() via f() dari luar fungsi

outer_func()

◦ Tahap 6.A. eksekusi statement print(f"max: {max(numbers)}")

◦ Tahap 6.B. eksekusi statement print(f"min: {min(numbers)}")

Jika di-flatten semua statement-nya maka programnya menjadi seperti ini:

◉ Fungsi min() & max()

Kedua fungsi ini digunakan untuk menghitung agregasi data numerik.

• Fungsi min() untuk pencarian nilai minimum dari data list yang berisi

elemen data numerik.

Contoh min([3, 4, 1, 2, 3, 4]) menghasilkan data 1 .

• Fungsi max() untuk pencarian nilai maksimum dari data list yang berisi

elemen data numerik.

Contoh max([3, 4, 1, 2, 3, 4]) menghasilkan data 4 .

A.25.2. Menampung fungsi dalam

variabel

Pada contoh sebelumnya, fungsi inner_func() ditampung ke variabel

bernama f via nilai balik pemanggilan fungsi outer_func() . Dari sini terlihat

bahwa closure bisa disimpan ke variabel.

Tidak hanya closure, fungsi biasa-pun juga bisa disimpan dalam variabel,

print("call outer_func()")

numbers = [1, 2, 3, 4]

print(f"numbers: {numbers}")

print("call inner_func() within outer_func()")

print(f"max: {max(numbers)}")

print(f"min: {min(numbers)}")

print("call inner_func() outside of outer_func()")

print(f"max: {max(numbers)}")

print(f"min: {min(numbers)}")

contohnya ada pada fungsi print_all() berikut yang disimpan pada variabel

display untuk kemudian di-eksekusi.

A.25.3. Fungsi sebagai argument

parameter

Selain disimpan dalam variabel, fungsi/closure bisa juga dijadikan sebagai nilai

argument suatu parameter fungsi. Metode seperti ini cukup sering digunakan

terutama pada operasi data sequence atau agregasi data numerik.

Contoh penerapan fungsi/closure sebagai argument pemanggilan fungsi bisa

dilihat pada kode berikut ini. Silakan coba dan pelajari, penjelasannya ada

dibawah kode.

def print_all(message, *numbers, **others):

print(f"message: {message}")

print(f"numbers: {numbers}")

print(f"others: {others}")

display = print_all

display("hello world", 1, 2, 3, 4, name="nokia 3310", discontinued=True,

year_released=2000)

# output ↓

#

# message: hello world

# numbers: (1, 2, 3, 4)

# others: {'name': 'nokia 3310', 'discontinued': True, 'year_released':

2000}

def aggregate(message, numbers, f):

res = f(numbers)

print(f"{message} is {res}")

Fungsi aggregate() dideklarasikan memiliki 3 buah parameter yaitu

message , numbers , dan f dimana f yaitu  akan diisi dengan fungsi/

closure. Di dalam fungsi aggregate() , fungsi f dipanggil dengan disisipkan

argument yaitu numbers dalam pemanggilannya.

Ada juga fungsi sum() dideklarasikan dengan tugas untuk menghitung total

dari data list numerik numbers . Dan fungsi avg() untuk nilai rata-rata dari

data numbers .

Kemudian di bawahnya ada 4 buah statement pemanggilan fungsi

aggregate() :

• Pemanggilan ke-1 yaitu  perhitungan nilai total numbers . Fungsi sum

yang telah dideklarasikan sebelumnya dijadikan sebagai argument

pemanggilan fungsi aggregate() untuk ditampung di parameter f .

• Pemanggilan ke-2 yaitu  perhitungan nilai rata-rata dimana fungsi avg

yang telah dideklarasikan dijadikan sebagai argument pemanggilan fungsi

aggregate() ..

• Pemanggilan ke-3 yaitu  perhitungan nilai maksimum. Fungsi max yang

merupakan fungsi bawaan Python digunakan sebagai argument

pemanggilan fungsi aggregate() .

• Pemanggilan ke-1 yaitu  perhitungan nilai minimum. Fungsi min yang

merupakan fungsi bawaan Python digunakan sebagai argument

pemanggilan fungsi aggregate() .

Dari contoh terlihat bagaimana contoh penerapan closure sebagai nilai

argument parameter fungsi. Fungsi atau closure bisa digunakan sebagai nilai

argument, dengan catatan skema parameter-nya harus disesuaikan dengan

kebutuhan.

Di dalam fungsi aggregate() , closure f diharapkan untuk memiliki

parameter yang bisa menampung data list numbers . Selama fungsi/closure

memenuhi kriteria ini maka penggunaannya tidak menghasilkan error.

Catatan chapter 📑📑

◉ Source code praktik

github.com/novalagung/dasarpemrogramanpython-example/../args-

kwargs

◉ Chapter relevan lainnya

• Function

• Function ➜ Positional, Optional, Keyword Arguments

• Function ➜ Args & Kwargs

• Function ➜ Lambda

◉ Referensi

• https://docs.python.org/3/library/stdtypes.html#functions


A.26. Python Lambda

Pada chapter ini kita