Tabel {i>Hash Dict<i}
Struktur tabel hash kunci/nilai Python yang efisien disebut "dict". Konten kamus dapat ditulis sebagai serangkaian pasangan kunci:nilai dalam tanda kurung kurawal { }, misalnya, dict = {key1:value1, key2:value2, ... }. "Kamus kosong" hanyalah sepasang tanda kurung kurawal {} yang kosong.
Mencari atau menetapkan nilai dalam dict menggunakan tanda kurung siku, misalnya dict['foo'] mencari nilai berdasarkan kunci 'foo'. String, angka, dan tuple berfungsi sebagai kunci, dan jenis apa pun dapat berupa nilai. Jenis lain mungkin berfungsi dengan benar atau tidak sebagai kunci (string dan tuple berfungsi dengan baik karena tidak dapat diubah). Mencari nilai yang tidak ada dalam dict akan memunculkan KeyError -- gunakan "in" untuk memeriksa apakah kunci ada dalam dict, atau gunakan dict.get(key) yang menampilkan nilai atau None jika kuncinya tidak ada (atau get(key, not-found) memungkinkan Anda menentukan nilai apa yang akan dikembalikan dalam kasus yang tidak ditemukan).
## Can build up a dict by starting with the empty dict {} ## and storing key/value pairs into the dict like this: ## dict[key] = value-for-that-key dict = {} dict['a'] = 'alpha' dict['g'] = 'gamma' dict['o'] = 'omega' print(dict) ## {'a': 'alpha', 'o': 'omega', 'g': 'gamma'} print(dict['a']) ## Simple lookup, returns 'alpha' dict['a'] = 6 ## Put new key/value into dict 'a' in dict ## True ## print(dict['z']) ## Throws KeyError if 'z' in dict: print(dict['z']) ## Avoid KeyError print(dict.get('z')) ## None (instead of KeyError)
Loop for pada kamus melakukan iterasi pada kuncinya secara default. Kunci akan muncul dalam urutan arbitrer. Metode dict.keys() dan dict.values() menampilkan daftar kunci atau nilai secara eksplisit. Ada juga items() yang menampilkan daftar tuple (kunci, nilai), yang merupakan cara paling efisien untuk memeriksa semua data nilai kunci dalam kamus. Semua daftar ini dapat diteruskan ke fungsi sorted().
## By default, iterating over a dict iterates over its keys. ## Note that the keys are in a random order. for key in dict: print(key) ## prints a g o ## Exactly the same as above for key in dict.keys(): print(key) ## Get the .keys() list: print(dict.keys()) ## dict_keys(['a', 'o', 'g']) ## Likewise, there's a .values() list of values print(dict.values()) ## dict_values(['alpha', 'omega', 'gamma']) ## Common case -- loop over the keys in sorted order, ## accessing each key/value for key in sorted(dict.keys()): print(key, dict[key]) ## .items() is the dict expressed as (key, value) tuples print(dict.items()) ## dict_items([('a', 'alpha'), ('o', 'omega'), ('g', 'gamma')]) ## This loop syntax accesses the whole dict by looping ## over the .items() tuple list, accessing one (key, value) ## pair on each iteration. for k, v in dict.items(): print(k, '>', v) ## a > alpha o > omega g > gamma
Catatan strategi: dari sudut pandang performa, kamus adalah salah satu alat terbaik Anda, dan Anda harus menggunakannya jika memungkinkan sebagai cara mudah untuk mengatur data. Misalnya, Anda dapat membaca file log yang setiap barisnya diawali dengan alamat IP, dan menyimpan data ke dalam kamus menggunakan alamat IP sebagai kunci, dan daftar baris tempat alamat IP muncul sebagai nilai. Setelah membaca seluruh file, Anda dapat mencari alamat IP mana pun dan langsung melihat daftar barisnya. Kamus mengambil data yang tersebar dan menjadikannya sesuatu yang koheren.
Pemformatan Dict
Operator % berfungsi dengan mudah untuk mengganti nilai dari kamus ke string menurut nama:
h = {} h['word'] = 'garfield' h['count'] = 42 s = 'I want %(count)d copies of %(word)s' % h # %d for int, %s for string # 'I want 42 copies of garfield' # You can also use str.format(). s = 'I want {count:d} copies of {word}'.format(h)
Del
Operator "del" melakukan penghapusan. Dalam kasus paling sederhana, variabel ini dapat menghapus definisi variabel, seolah-olah variabel tersebut belum ditentukan. Del juga dapat digunakan pada elemen atau slice daftar untuk menghapus bagian daftar tersebut dan menghapus entri dari kamus.
var = 6 del var # var no more! list = ['a', 'b', 'c', 'd'] del list[0] ## Delete first element del list[-2:] ## Delete last two elements print(list) ## ['b'] dict = {'a':1, 'b':2, 'c':3} del dict['b'] ## Delete 'b' entry print(dict) ## {'a':1, 'c':3}
File
Fungsi open() membuka dan menampilkan handle file yang dapat digunakan untuk membaca atau menulis file dengan cara biasa. Kode f = open('name', 'r') membuka file ke dalam variabel f, siap untuk operasi pembacaan, dan menggunakan f.close() setelah selesai. Sebagai ganti 'r', gunakan 'w' untuk menulis, dan 'a' untuk menambahkan. Standar for-loop berfungsi untuk file teks, melakukan iterasi melalui baris-baris file (ini hanya berfungsi untuk file teks, bukan file biner). Teknik for-loop adalah cara sederhana dan efisien untuk melihat semua baris dalam file teks:
# Echo the contents of a text file f = open('foo.txt', 'rt', encoding='utf-8') for line in f: ## iterates over the lines of the file print(line, end='') ## end='' so print does not add an end-of-line char ## since 'line' already includes the end-of-line. f.close()
Membaca satu baris pada satu waktu memiliki kualitas bagus karena tidak semua file perlu muat dalam memori sekaligus -- berguna jika Anda ingin melihat setiap baris dalam file 10 gigabyte tanpa menggunakan memori 10 gigabyte. Metode f.readlines() membaca seluruh file ke dalam memori dan menampilkan kontennya sebagai daftar barisnya. Metode f.read() membaca seluruh file menjadi satu string, yang dapat menjadi cara praktis untuk menangani teks sekaligus, seperti dengan ekspresi reguler yang akan kita lihat nanti.
Untuk menulis, metode f.write(string) adalah cara termudah untuk menulis data ke file output yang terbuka. Atau, Anda dapat menggunakan "print" dengan file terbuka seperti "print(string, file=f)".
Unicode File
Untuk membaca dan menulis file yang dienkode unicode, gunakan mode `'t'` dan tentukan encoding secara eksplisit:
with open('foo.txt', 'rt', encoding='utf-8') as f: for line in f: # here line is a *unicode* string with open('write_test', encoding='utf-8', mode='wt') as f: f.write('\u20ACunicode\u20AC\n') # €unicode€ # AKA print('\u20ACunicode\u20AC', file=f) ## which auto-adds end='\n'
Pengembangan Inkrementalitas Latihan
Saat mem-build program Python, jangan menulis semuanya dalam satu langkah. Sebaiknya identifikasi hanya {i>milestone<i} pertama, misalnya "langkah pertama adalah mengekstrak daftar kata". Tulis kode untuk mencapai tonggak pencapaian itu, dan cukup cetak struktur data Anda pada saat itu, dan kemudian Anda dapat melakukan sys.exit(0) sehingga program tidak berjalan ke bagian yang belum selesai. Setelah kode tonggak pencapaian berfungsi, Anda dapat mengerjakan kode untuk tonggak pencapaian berikutnya. Kemampuan untuk melihat cetakan variabel pada satu status dapat membantu Anda memikirkan cara mengubah variabel tersebut untuk mencapai status berikutnya. Python sangat cepat dengan pola ini, sehingga Anda dapat melakukan sedikit perubahan dan menjalankan program untuk melihat cara kerjanya. Manfaatkan waktu yang cepat tersebut untuk membuat program Anda dalam beberapa langkah kecil.
Latihan: wordcount.py
Menggabungkan semua materi Python dasar -- string, daftar, kamus, tuple, file -- coba latihan ringkasan wordcount.py di Latihan Dasar.