rangkuman buku Python Data Structures and Algorithms chapter 1
Objek, Jenis, dan Ekspresi Python
Python adalah salah satu bahasa pemrograman tingkat lanjut yang termudah bagi pemula. python juga merupakan bahasa pilihan untuk banyak tugas data tingkat lanjut karena alasan yang sangat bagus. Di python, ada banyak struktur data dan algoritma yang baerguna yang dibangun ke dalam bahasa tersebut.
Selain itu, karena Python adalah bahasa berbasis objek, membuat objek data khusus relatif mudah. Namun, jika kamu sedikit tidak paham, berasal dari bahasa lain, atau tidak memiliki pengetahuan sama sekali tentang python, jangan kwhawatir, bab pertama ini akan segera menjelaskannya kepada kamu.
Memahami struktur data dan algoritma
algoritma dan struktur data adalah konsep paling dasar dalam ilmu komputer. Memiliki pemahaman tentang konsep dasar ini sangat penting dalam desain perangkat lunak dan melibatkan tiga karakteristik berikut :
Bagaimana algoritma memanipulasi informasi yang terkandung dalam struktur data?
bagaimana data diatur dalam memori?
apa karakteristik dari sturktur data tertentu?
Pertama-tama kita akan melihat dasar-dasar bahasa pemrograman python dalam hal struktur data algoritma. Kedua, penting bagi kamu untuk memiliki alat matematika yang tepat. kita perlu memahami beberapa konsep dasa ilmu komputer dan untuk itu kamu membutuhkan matematika. Mengambil pendekatan intuitif berarti kita tidak memerlukan lebih dari matematika sekolah menengah untuk mengembangkan beberapa prinsip paduan umumnya untuk memahami prinsip dari ide inti ini.
Akhirnya, kita membutuhkan strategi desain eksperimental yang solid. Untuk memberi kita beberapa wawasan tentang pemikiran algoritmik, mari kita ambil contoh dunia nyata. Bayangkan kita berada di pasar yang tidak diketahui dan diberi tugas untuk membeli daftar produk. Tujuan kami adalah meminimalkan harga yang kami bayarkan untuk setiap prosuk serta meminimalkan waktu yang dihabiskan di pasar. salah satu cara untuk mendekati ini adalah dengan menulis algoritma seperti berkut:
ulangi untuk setiap vendor :
- Apakah vendor memiliki item di daftar saya dan biayanya kurang dari perkiraan biaya untuk barang?
- Jika ya, beli dan hapus dari daftar; jika tidak, lanjutkan ke vendor berikutnya.
- Jika tidak ada lagi vendor, akhiri.
Selain itu, kita perlu memahami apa yang terjadi ketika membandingkan item di daftar belanja kita dengan barang yang dijual oleh masing-masing penjual, karena jumlah barang yang ada di daftar belanja kita atau jumlah barang yang dijual oleh masing-masing penjual bertambah. Urutan pencarian item dan bentuk struktur data dapat secara signifikan mempengaruhi wakru yang di perlukan untuk melakukan pencarian. Tentunya kita ingin mengatur daftarnya, serta pesanan yang kami kunjungi di setiap penjuak sedemikian rupa untuk menimalkan waktu pencarian.
perhatikan juga apa yang akan terjadi jika kita mengubah syarat pembelian menjadi harga termurah bukan hanya di bawah harga rata-rata. Alih-alih berpindah secara bertahap dari satu penjual ke penjual lainnya, kita harus menjelajahi pasar suatu hari nanti dan dengan pengetahuan ini, kita dapat memesan daftar belanja kita sesuai dengan penjual yang ingin kita kunjungi.
Jelas, lebih banyak seluk-belut yang terlibat dalam menerjemahkan masalah dunia nyata ke dalam konstruksi abstrak seperti bahasa pemrograman. Misalnya, saat kita bergerak melalui pasar, pengetahuan kita mengenai biaya satu produk meningkat sehingga perkiraan variabel harga rata-rata menjadi lebih akurat sampai pengetahuan kita mengenai pasar pada perhentian terakhir sempurna. Dengan asumsi semua jenis algoritma pelacakan mundur menimbulkan biaya, kita dapat melihat alasan kita meninjau seluruh strategi kita. Kondisi seperti variabilitas harga tinggi, ukuran dan bentuk struktur data kita, dan biaya penelusuran kembali semuanya menentukan solusi yang paling tepat.
Python untuk data
Python memiliki beberapa struktur data yang telah ditentukan termasuk daftar, kamus, dan set, yang kita gunakan untuk membuat objek khusus. Selain itu, ada sejumlah pustaka terintegrasi seperti koleksi dan objek matematika yang memungkinkan kita membuat struktur yang lebih kompleks dan melakukan perhitungan padanya. Terakhir, ada pustaka eksternal seperti yang ada di paker SciPy. Hal ini memungkinkan kita untuk melakukan berbagai tugas data lanjutan seperti logistik dan regresi linear, visualisasi, dan perhitungan matematika seperti operasi matriks dan vektor. Perpustakaan eksternal bisa sangat berguna untuk solusi langsung.
Lingkungan python
Fitur python adalah konsol interaktifnya memungkinkan kita menggunakan python sebagau kalkulator yang dapat diprogram untuk komputer deskop serta lingkungan untuk menulis dan menguji cuplikan kode. read-evaluasi-print Loop dari kosol adalah cara yang sangat nyaman untuk berinteraksi dengan database kode yang lebih besar misalnya untuk fungsi dan metode runtime atau untuk membuat contoh kelas. Ini adalah salah satu keunggulan utama pythin dibandingkan bahasa dikomplasi seperti C / C++ atau Java, dimana write-compile-test-recompile dapat memperpanjang waktu pengembangan secara signifikan dibandingkan dengan loop read-evalu-print python.
Selain CPython versi resmi, ada beberapa distribusi python yang sangat baik. Dua yang populer diantarannya adalah Anaconda dan Canopy. Yang paling penting adalah platform / jupyter yang mencakup lingkungan komputasi web.
Variabel dan Ekspresi
Untuk menerjemahkan masalah dunia nyata menjadi yang dapat diselesaikan menggunkan algoritma, ada dua tugas yang saling terkait. Pertama pilih variabel dan kemudian temukan ekspresi yang terkait dengan variabel itu.Variabel merupakan label yang dilampirkan ke objek; mereka buka objek itu sendiri. Mereka juga bukan wadah untuk barang. Variabel tidak berisi objek tetapi bertindak sebagai penunjuk atau referensi ke objek. seperti contoh berikut, perhatikanlah :
Bagian ini kami telah membuat variabel a yang menunjuk ke objek daftar. Kami membuat variabel kain b yang menunjuk pada objek daftar yang sama ini. Saat kita menambahkan elemen pada objek daftar ini, perubahan akan terlihat di a dan b.
python adalah bahasa yang diketik secara dinamis. Setiap nilai adalah tipe, string, atau integer misalnya; ini berarti bahwa ketika kita menganalisasi variabel dengan python, kita tidak perlu mendeklarasikan sebuah tipe. Selain itu, variabel, atau lebih tepatnya objek yang mereka tunjuk, daoat mengubah jenis tergantung pada nilai yang diterapkan padanya, misalnya
Lingkup variabel
Sangat penting dalam memahami aturan pelingkupan variabel di dalamnya fungsi. Namespace lokal baru dibuat setiap kali dungsi dijalankan. Mewakili lingkungan lokal yang berisi nama parameter dan variable yang ditentukan oleh fungsi. Agar menyelesaikan namespace saat fungsi dipanggil, interpreter Python akan mencari namespace lokal (yaitu, fungsinya sendiri) dan jika tidak ditemukan ada yang cocok, maka ia akan mencari namespace global. Namespace global ini adalah modul tempat fungsi didefinisikan. Jika namanya masih tidak ditemukan, ia mencari namespace built-in. Akhirnya, jika gagal maka interpreter menampilkan NameError pengecualian. Perhatikan kode berikut:
def fungsi saya ():
global a
a = 11; b = 21
my_function ()
print (a) #prints 11
print (b) #prints 20
berikut keluaran dari kode sebelumnya:
Dalam kode sebelumnya, kami mendefenisikan dua variabel global. Kita perlu memberi tahu juru bahasa bahwa yang kita maksud adalah variabel global di dalam fungsi, menggunakan kata kunci global. Saat kita mengubah variabel ini menjadi 11, perubahan terlihat dalam cakupan global. Namun, variabel b yang kita setel ke 21 bersifat lokal untuk fungsi tersebut dan perubahan apa pun yang dibuat pada fungsi tersebut tidak terlihat dalam cakupan global.
Kontrol aliran dan iterasi
Program python terdiri dari urutan pernyataan. Ini benar jika kedua file dijalankan sebagai program utama serta file yang dimuat melalui import. Semua pernyataan, termasuk tugas variabel, definisi fungsi, definisi kelas, dan impor modul, memiliki status yang sama. Ada dua cara untuk mengontrol aliran eksekusi program, pernyataan bersyarat dan loop.
Pernyataan if, else, dan elif mengontrol eksekusi pernyataan bersyarat. Format umum adalah rangkaian pernyataan if dan elif yang diikuti dengan pernyataan akhir lain :
if x == 0 :
print('False')
elif x == 1 :
print('True')
else: print('Something else')
#prints 'something else'
perhatikan penggunaan penggunaan operator == untuk menguji nilai yang sama. Ini mengembalikan true jika nilainya sama; jika tidak makan akan mengembalikan false. Perhatikan juga bahwa menyetel x ke string mengembalikan sesuatu yang berbeda dari hasil kesalahan seperti yang mungkin terjadi dalam bahasa yang diketik secara dinamis. Bahasa yang di ketik secara dinamis seperti python memungkinkan penugasan yang fleksibel dari berbagai jenis objek. Cara lain untuk mengontrol aliran program adalah dengan loop. Mereka dibuat menggunakan while atau for statement, misalnya :
Gambaran umum tipe data dan objek
Python berisi 12 tipe data bawaan. Ini termasuk empat tipe numerik (int, float, complex, bool), empat tipe urutan (str, list, tuple, range), satu tipe pemetaan (dist), dan dua tipe set. Dimungkinkan juga untuk membuat objek yang ditentukan pengguna seperti fungsi atau kelas.
Semua tipe data di python adalah objek. Faltanya, hampir semuanya adalah ibjek dalam python, termasuk modul, kelas, dan fungsi, serta liberal seperti string dan bilangan bulat. Setiap objekdi python memiliki tipe, nilai, dan identitas. Saat kita menulis greet = "hello world" kita membuat instance objek objek string dengan nilai "hello world" dan identitas greet. Identitas suatu objek bertindak sebagai penunjuk ke lokasi objek dalam memori. Tipe objek, juga dikenal sebagai kelas objek, mendeskripsikan representasi internal objek serta metode dan operasi yang didukungnya.
selain itu, ada beberapa cara untuk membandingkan objek, misalnya :
Perbedaan penting perlu dibuat antara objek yang bisa diubah dan tidak bisa diubah objeknya. Mereka memiliki metode, seperti insert () atau append (), yang mengubah nilai objek. Objek yang tidak dapat diubah, seperti string, tidak dapat diubah nilainya, jadi saat kita menjalankan metodenya, mereka hanya mengembalikan nilai daripada mengubah nilai objek yang mendasarinya.
String
String adalah objek urutan tetap, dengan ssetiap karakter mewakili elemen dalam urutan. Seperti semua objek, kami menggunakan metode untuk melakukan operasi. String, karena tidak dapat diubah, tidak mengubah instrance; setiap metode hanya mengembalikan nilai. Nilai ini dapat disimpan sebagai variabel lain atau diberikan sebagai argumen untuk argumen untuk fungsi atau metode.
Tabel berikut adalah daftar dari beberapa metode string yang paling umum digunakan dan deskripsinya :
Kita bisa menggunakan ekspresi, variabel, atau operator apa pun sebagai indeks selama nilainya adalah bilangan bulat, misalnya:
Operasi umum lainnya yaitu melintasi string dengan loop, misalnya:
Seperti yang ditampilkan kode ini, kita menggunakan operator slice untuk membagi string pada posisi indeks 5 dan menggunakan + untuk menggabungkan. Python tidak pernah mengartikan konten string sebagai angka. Jika kita ingin melakukan operasi matematika pada sebuah string, pertama-tama kita perlu mengonversinya menjadi tipe numerik, misalnya:
Lists
Daftar adalah struktur data bawaan yang paling banyak digunakan di Python karena dapat terdiri dari sejumlah data lain jenis. Seperti string, mereka diindeks oleh bilangan bulat yang dimulai dari nol. Tabel berikut berisi metode yang paling umum digunakan daftar dan deskripsi mereka:
Saat kita bekerja dengan list, dan kontainer atau objek lainnya, penting untuk memahami mekanisme internal yang digunakan Python untuk menyalinnya. Saat kita menetapkan nilai variabel ke variabel lain, kedua variabel itu menunjuk ke lokasi memori yang sama. Slot baru di memori hanya dapat dialokasikan jika salah satu dari variabel berubah. Ini memiliki konsekuensi penting untuk objek gabungan yang bisa berubah seperti list. Perhatikan kode berikut:
Disini, list1 dan list2 variabel menunjuk ke slot yang sama di memori. Saat kita mengubah y variabel menjadi 4, kita mengubah sama dengan y yang variabel yang list1 ditunjuk. Fitur penting dari list adalah dimana list dapat berisi struktur bersarang, yaitu daftar lain, misalnya:
Baris pertama keluaran adalah dari konstruksi loop for. Yang kedua adalah dari ekspresi pemahaman list:
Pemahaman list juga dapat digunakan untuk mereplikasi aksi loop bersarang dalam bentuk yang lebih kompak. Misalnya, kita mengalikan setiap elemen yang terdapat dalam list1 satu sama lain:
Kita juga dapat menggunakan pemahaman list dengan objek lain seperti string, untuk membangun struktur yang lebih kompleks. Misalnya, kode berikut membuat list kata dan jumlah hurufnya:
Seperti yang akan kita lihat, list membentuk dasar dari banyak struktur data yang akan kita lihat. Fleksibilitas, kemudahan pembuatan, dan penggunaannya memungkinkan mereka membangun struktur data yang lebih terspesialisasi dan kompleks.
Fungsi sebagai objek kelas pertama
Kedua fungsi dan kelas adalah apa yang dikenal sebagai objek kelas satu, memungkinkan mereka untuk dimanipulasi dengan cara yang sama seperti tipe data bawaan. Menurut definisi, objek kelas pertama adalah:
- Dibuat saat runtime
- Ditugaskan sebagai variabel atau dalam struktur data
- Diteruskan sebagai argumen ke suatu fungsi
- Dikembalikan sebagai hasil dari suatu fungsi
def salam (bahasa):
if language == 'eng':
return 'hello world'
if language == 'fr'
return 'Bonjour le monde'
else: return 'bahasa tidak didukung'
Fungsi juga bisa digunakan sebagai argumen untuk fungsi lain. Misalnya, kita dapat mendefinisikan fungsi berikut:
Di sini, callf () mengambil fungsi sebagai argumen, menetapkan variabel bahasa ke 'eng', dan kemudian memanggil fungsi dengan variabel bahasa sebagai argumennya. Kita bisa melihat bagaimana if akan berguna, misalnya for, kita ingin membuat program yang mengembalikan kalimat tertentu dalam berbagai bahasa, mungkin untuk aplikasi bahasa alami. Di sini kita memiliki tempat sentral untuk mengatur bahasa. Selain sapaan fungsi, kita bisa membuat fungsi serupa yang mengembalikan kalimat berbeda. Dengan memiliki satu titik di mana kita mengatur bahasa, logika program lainnya tidak perlu mengkhawatirkan hal ini. Jika kita ingin mengubah bahasa, kita cukup mengubah variabel bahasa dan kita dapat menyimpan yang lainnya tetap sama.
Fungsi orde tinggi
Begitu juga kalo kita dapat menggunakan filter built-in fungsi untuk item filter dalam list:
Kelihatannya tidak ada banyak perbedaan dalam karakteristik kinerja selain dari sedikit keunggulan kinerja saat menggunakan fungsi peta dan filter bawaan tanpa lambda operator, dibandingkan dengan pemahaman daftar. Meskipun demikian, sebagian besar panduan gaya merekomendasikan penggunaan pemahaman daftar daripada fungsi bawaan, mungkin karena mereka cenderung lebih mudah dibaca.
Berikut adalah contoh lain untuk pengurutan tidak peka huruf besar / kecil:
Fungsi rekursif
Secara teknis, rekursi adalah kasus khusus dari iterasi yang dikenal sebagai iterasi ekor, dan biasanya selalu memungkinkan untuk mengubah fungsi berulang menjadi fungsi rekursif dan sebaliknya. Hal yang menarik tentang fungsi rekursif adalah bahwa mereka mampu mendeskripsikan objek tak hingga dalam pernyataan hingga. Kode berikut harus menunjukkan perbedaan antara rekursi dan iterasi. Kedua fungsi ini hanya mencetak angka antara rendah dan tinggi, yang pertama menggunakan iterasi dan yang kedua menggunakan rekursi:
Generator dan rutinitas bersama
Python berisi fungsi generator, yang merupakan cara mudah untuk membuat iterator dan sangat berguna sebagai pengganti daftar panjang yang tidak bisa berfungsi. Generator menghasilkan item, bukan daftar build. Misalnya, kode berikut menunjukkan mengapa kita mungkin memilih untuk menggunakan generator daripada membuat daftar:
# membandingkan waktu berjalan daftar dibandingkan dengan waktu impor generator
# fungsi generator membuat iterator bilangan ganjil antara n dan m def oddGen (n, m):
sementara n <m:
yield n
n + = 2
#membuat daftar jumlah ganjil antara n dan m
def oddLst (n, m):
lst = []
sedangkan n <m:
lst.append (n)
n + = 2
return lst
# waktu yang diperlukan untuk melakukan penjumlahan pada iterator
t1 = waktu .time ()
sum (oddGen (1.1000000))
print ("Waktu untuk menjumlahkan iterator:% f"% (time.time () - t1))
# waktu yang diperlukan untuk membuat dan menjumlahkan daftar
t1 = waktu .time ()
sum (oddLst (1.1000000))
print ("Waktu untuk membangun dan menjumlahkan daftar:% f"% (time.time () - t1))berikut ini keluarannya :
Peningkatan kinerja sebagai hasil dari penggunaan generator adalah karena nilai dibuat sesuai permintaan, bukan disimpan sebagai daftar di memori. Perhitungan dapat dimulai sebelum semua elemen dibuat dan elemen dibuat hanya jika diperlukan.
Dalam contoh sebelumnya, penjumlahan metode memuat setiap angka ke dalam memori saat diperlukan untuk penghitungan. Ini dicapai dengan objek generator yang berulang kali memanggil __next __ () metode khusus. Generator tidak pernah mengembalikan nilai selain Tidak Ada.
Biasanya, objek generator digunakan untuk loop. Misalnya, kita dapat menggunakan oddcount yang fungsi generatordibuat pada kode sebelumnya untuk mencetak bilangan bulat ganjil antara 1 dan 10:
untuk i dalam jumlah ganjil (1,10): print (i)
Kelas dan pemrograman objek
Kelas adalah cara untuk membuat jenis objek baru dan merupakan pusat pemrograman berorientasi objek. Kelas mendefinisikan sekumpulan atribut yang digunakan bersama di seluruh instance kelas itu. Biasanya, kelas adalah kumpulan fungsi, variabel, dan properti. Tindakan dan logika tentu saja masih ada, tetapi dengan mewujudkannya dalam objek, kami memiliki cara untuk merangkum fungsionalitas, memungkinkan objek untuk berubah dengan cara yang sangat spesifik. Ini membuat kode kita tidak terlalu rentan terhadap kesalahan, lebih mudah untuk diperluas dan dipelihara, dan dapat membuat model objek dunia nyata.
class Employee (object):
numEmployee = 0
def __init __ (self, name, rate):
self.owed = 0
self.name = name
self.rate = rate
Employee.numEmployee + = 1
def __del __ (self):
Employee.numEmployee - = 1
def jam (self, numHours):
self.owed + = numHours * self.rate
return ("%. 2f hours working"% numHours)
def pay (self):
self.owed = 0payed
return ("% s" % self.name)
Variabel kelas, seperti numEmployee, berbagi nilai di antara semua instance kelas. Dalam contoh ini, numEmployee digunakan untuk menghitung jumlah instance karyawan. Perhatikan bahwa Karyawan kelasmengimplementasikan __init__ dan __del__ metode khusus, yang akan kita bahas di bagian selanjutnya.
Kita bisa membuat instance Employee objek, menjalankan metode, dan mengembalikan kelas dan variabel instance dengan melakukan hal berikut:
Metode khusus
Satu-satunya metode khusus yang kita panggil dalam program kita, sebagai praktik umum, adalah __init__ metode, untuk memanggil penginisialisasi super class dalam definisi kelas kita sendiri. Sangat disarankan agar tidak menggunakan sintaks garis bawah ganda untuk objek Anda sendiri karena potensi konflik saat ini atau masa depan dengan metode khusus Python sendiri.
class my_class ():
def __init __ (self, greet):
self.greet = greet
def __repr __ (self):
return 'a custom object (% r)'% (self.greet)
Warisan
class specialEmployee (Employee):
def jam (self, numHours):
self.owed + = numHours * self.rate * 2
return ("%. 2f hours works"% numHours)
class specialEmployee (Employee):
def __init __ (self, name, rate, bonus):
Employee .__ init __ (self, name, rate) #calls the base class self.bonus = bonus
def hours (self, numHours):
self.owed + = numHours * self.rate + self.bonus
return ("%. 2f hours works"% numHours)
class Aexp (objek):
base = 2
@classmethod
def exp (cls, x):
return (cls.base ** x)
class Bexp (Aexp):
base = 3
Enkapsulasi dan properti data
Untuk mencegah hal ini, metode yang kita definisikan dengan atribut privat memiliki garis bawah ganda, seperti __privateMethod (). Nama metode ini secara otomatis diubah menjadi _Classname__privateMethod () untuk mencegah konflik nama dengan metode yang ditentukan di kelas dasar. Properti adalah sejenis atribut yang alih-alih mengembalikan nilai yang disimpan, menghitung nilainya saat dipanggil. Misalnya, kita bisa mendefinisikan kembali properti exp () dengan yang berikut ini:
class Bexp (Aexp):
__base = 3
def __exp (self):
return (x ** cls.base)
Komentar
Posting Komentar