Saturday, 9 May 2015

11.Operasi Logika

Salah satu yang menjadi dasar setiap program adalah logika. Python menyediakan empat set operasi logika.

  1. operator identitas
  2. operator pembanding
  3. operator member
  4. operator logika

1. Operator Identitas

Semua variable dalam Python adalah refernsi objek, dan kadang kita ingin mengetahui apakah dua atau lebih refersi objek itu merupakan objek yang sama. Operator 'is' merupakan operato binary yang menghasilkan 'True' bila objek yang sebelah kiri merupakan objek referen dengan objek yang sebelah kanan.

  1. >>> a=[1,2,3,'hallo']
  2. >>> b=[1,2,3,'hallo']
  3. >>> a is b
  4. False
  5. >>> b=a
  6. >>> a is b
  7. True
  8. >>> b is a
  9. True
  10. >>> 

Pada contoh diatas data variable a (baris 1) dan variable b (baris 2) adalah sama, tetapi data yang ada pada variable b bukanlan refernsi objek dari data variable a. Sehingga a is b (baris 3) menjadi 'False'. Apa yang terjadi disini? varible a dan variable b memiliki lokasi alamat memori yang berbeda, karena kita membuat data tersebut satu-satu, sehinggal Python menyimpan data tersebut dengan dua alamat memory (walaupun isi data adalah sama). Sedangkan pada baris 5, b=a, kita membuat objek referensi pada alamat a. Bila kita ingin membandingkan data, jangan menggunakan perintah 'is'.

Keuntungan menggunakan refernsi objek adalah sangat cepat, Python tidak perlu menganalisa data satu per satu, Operator 'is' hanya membandingkan alamat memory pada objek, alamat yang sama adalah objek yang sama.

Penggunaan operator 'is' biasanya untuk membandingkan data yang nilainya 'None'. 

  1. >>> a='satu hal'
  2. >>> b=None
  3. >>> a is None
  4. False
  5. >>> a is not None
  6. True
  7. >>> b is None
  8. True
  9. >>> b is not None
  10. False
  11. >>> 
Untuk membalikan identitas kita menpergunakan 'is not'.

2. Operator Pembanding

Python juga menyediakan opertor pembanding binary, yaitu 

  • ' < ' (kurang dari), 
  • ' <= ' (kurang dari  atau sama-dengan), 
  • ' > ' (lebih dari), 
  • ' >= '(lebih dari atau sama-dengan), 
  • ' == ' (double sama dengan equal sama-dengan), dan 
  • ' =! ' (sama dengan tanda seru, equal tidak sama-dengan) 
Operator ini yang membandingkan nilai objek.
  1. >>> a=[1,2,3]
  2. >>> b=[2,3,4]
  3. >>> a > b
  4. False
  5. >>> a<b
  6. True
  7. >>> a<=b
  8. True
  9. >>> a != b
  10. True
  11. >>> c=[2,3,4]
  12. >>> d=b
  13. >>> b is c
  14. False
  15. >>> b is d
  16. True
  17. >>> b == c
  18. True
  19. >>> 
Pada baris 17, walaupun b dan c adalah objek yang berbeda tetapi memiliki nilai yang sama, sehingga Python mengeluakan hasil 'True'. Hati-hati bila kita menggunakan pembandingan ini bila nilai dari variable adalah unicode, sehingga penggunaanya lebih komplek.

Perhatikan contoh dibawah ini:

  1. >>> a,b,c=2,2,b
  2. >>> a
  3. 2
  4. >>> b
  5. 2
  6. >>> c
  7. 2
  8. >>> a==b
  9. True
  10. >>> a is b
  11. True
  12. >>> b is c
  13. True
  14. >>> 
Pada variable a, kita membuat variable sendiri, dan variable c adalah refernsi dari variable b, dan pada baris ke 8 (a == b) menghasilkan 'True', ini disebabkan Python menggunakan objek yang sama secara otomatis, ini bisa terjadi pada angka dan string, walaupun kita membuat secara terpisah variable a dan b, juga karena pertimbangan harga sama dan tidak dapat dimodifikasi.


3.Operator Member

Untuk data yang merupakan baris atau kumpulan data seperti list, strings, dan tuples, kita bisa mengujinya dengan operator 'in' dan untuk nilai yang bukan member dari data menggunakan 'not in'.
  1. >>> a=(1,2,3,'hello', 'hi')
  2. >>> 1 in a
  3. True
  4. >>> 6 in a
  5. False
  6. >>> 'hello' in a
  7. True
  8. >>> hi in a
  9. Traceback (most recent call last):
  10.   File "<pyshell#41>", line 1, in <module>
  11.     hi in a
  12. NameError: name 'hi' is not defined
  13. >>> 'hi' in a
  14. True
  15. >>> 6 not in a
  16. True
  17. >>> 
Operator 'in' dan 'not in' ini biasa digunakan untuk dictionaries dan set. Operator ini akan berjalan lambat bila digunakan oleh lists dan tuple yang datanya mencapai ribuan (mungkin ribuan masih 'ok' yang pasti puluhan ribu akan terasa pelannya).
  1. >>> a='Begitu banyak hal menakjubkan yang terjadi dalam masa kecil para anggota Laskar Pelangi. Sebelas orang anak Melayu Belitong yang luar biasa ini tak menyerah walau keadaan tak bersimpati pada mereka. Tengoklah Lintang, seorang kuli kopra cilik yang genius dan dengan senang hati bersepeda 80 kilometer pulang pergi untuk memuaskan dahaganya akan ilmu'
  2. >>> 'orang' in a
  3. True
  4. >>> 'a' in a
  5. True
  6. >>> 'anyak' in a
  7. True
  8. >>> 

4.Operator Logika

Python memberikan tiga opeartor logika yaitu, 'and', 'or ', dan 'not'. Operator 'and' dan 'or' memberikan hasil bukan boolean, kecuali merupakan operasi boolean.

  1. >>> a=1
  2. >>> b=2
  3. >>> a and b
  4. 2
  5. >>> a or b
  6. 1
  7. >>> b and a
  8. 1
  9. >>> b or a
  10. 2
  11. >>> 

Pada dasarnya opeator 'and' dalam bentuk boolean adalah untuk memberikan hasil sebagai berikut:
a
b
Hasil
0
0
0
0
1
0
1
0
0
1
1
1

Operator 'or' :
a
b
Hasil
0
0
0
0
1
1
1
0
1
1
1
1

Dan operator 'not' adalah kebalikanya:
a
Hasil
0
1
1
0






Thursday, 7 May 2015

10.4.Menyimpan Data Binary

Untuk membuat file data berbasis binary kita memerlukan sebuah file yang berextension bin(*.bin). Pada Python membuat file tersebut menggunakan perintah open dengan 'wb' (write binary) mode. Lalu menggunakan perintah 'struct' untuk membuat suatu data menjadi binary.

Dengan perintan 'struct' kita diharuskan untuk memberikan format data terlebih dahulu, sebelumnya melanjutkan, kita lihat dahulu fomatnya.
Format
C type
Python
Keterangan
x
Pad byte Tidak ada nilai

c
char Bytes

b
signed char Integer Support str utf-8
B
unsigned char Integer

?
_Bool bool _Bool type C99, Bila bukan, menjadi char
h
short Integer

H
Unsignes short Integer

i
int Integer

I
Unsigned int Integer

l
long Integer

L
Unsigned long Integer

q
Long long Integer Native mode windows -int64
Q
Unsigned long long Integer Native mode windows -int64
f
float float

D
double float

s
char[] Bytes Support str utf-8
p
char[] Bytes Support str utf-8
P
void Integer


Untuk fomat string ditulis dengan '4h' yang isi sama dengan 'hhhh'. tempat kosong (spasi) tidak dihitung, 
Untuk 's' format karakter, penghitungannya sepanjang bytes-nya, contohnya:
'10s' berarti ada sebuah 10 bytes string.
Dan '10c' berarti ada 10 karakter.Untuk 'p' merupakan 'Pascal String' yang berarti panjang variable string yang pendek disimpan dalam suatu byte yang tetap.


Ada juga format string yang lain, merupakan indikator byte order.
Karakter
Byte Order
@
Native Native
=
Native Standar
<
little-endian Standar
>
big-endian Standar
!
Network (=big-endian) Standar




  1. >>> struct.pack('h',1)
  2. b'\x01\x00'
  3. >>> struct.pack('l',1)
  4. b'\x01\x00\x00\x00'
  5. >>> v1=struct.pack('iiii',1,2,3,4)
  6. >>> v2=struct.pack('4i',5,6,7,8)
  7. >>> v1
  8. b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00'
  9. >>> v2
  10. b'\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00'
  11. >>> 

Baris ke 5 dan baris ke 6 adalah sama, beda penulisannya saja.
Dan untuk mendapatkan kembali data dari v1 dan v2, kita gunakan 'struct.unpack()'

  1. >>> uv1=struct.unpack('4i',v1)
  2. >>> uv2=struct.unpack('iiii',v2)
  3. >>> uv1
  4. (1, 2, 3, 4)
  5. >>> uv2
  6. (5, 6, 7, 8)
  7. >>> 

--








10.3.Menyimpan Objek Python dalam Format JSON

Format JSON mendekati dictionaries dan list pada python, walaupun demikian pickle tidak mendukung format tersebut. Ini disebabkan format JSON tergolong baru dalam hal penyimpanan data. Tetapi python menyediakan modul khusus untuk JSON.
  1. >>> vdata=dict(nama='Budi', namapanggilan='Ubud')
  2. >>>komplit=dict(vdata=vdata,tanggallahir=[21,'Mei',1990], gender='pria')
  3. >>> komplit 
  4. {'vdata': {'nama': 'Budi', 'namapanggilan': 'Ubud'}, 'gender': 'pria', 'tanggallahir': [21, 'Mei', 1990]}
  5. >>> 

Contoh diatas mirip dengan data JSON. Sekarang kita tinggal mengkonversikannya kedalam JSON.
  1. >>> import json
  2. >>> dataJSON=json.dumps(komplit)
  3. >>> dataJSON
  4. '{"vdata": {"nama": "Budi", "namapanggilan": "Ubud"}, "gender": "pria", "tanggallahir": [21, "Mei", 1990]}'
  5. >>> xx=json.loads(dataJSON)
  6. >>> xx
  7. {'vdata': {'nama': 'Budi', 'namapanggilan': 'Ubud'}, 'tanggallahir': [21, 'Mei', 1990], 'gender': 'pria'}
  8. >>> xx==komplit
  9. True
  10. >>> json.dump(komplit,fp=open('c:/testjson.txt','w'),indent=4)
  11. >>> print(open('c:/testjson.txt').read())
  12. {
  13.     "vdata": {
  14.         "nama": "Budi",
  15.         "namapanggilan": "Ubud"
  16.     },
  17.     "gender": "pria",
  18.     "tanggallahir": [
  19.         21,
  20.         "Mei",
  21.         1990
  22.     ]
  23. }
  24. >>> 
--

10.2.Pickle

Modul pickle adalah salah satu alat yang powerful,  seperti juga eval yang mengkonversikan string menjadi objek. Perbedaanya adalah, eval bisa menghapus semua file yang ada di komputer kita bila kita mengijinkannya. Tetapi bila kita tidak mempercayai sumber data dalam sebuah file, maka pickle adalah alat yang ideal.

Pickle adalah alat yang lebih advance sehingga dapat memyimpan segala objek langsung ke file.

  1. >>> a={'aa':1,'bb':2}
  2. >>> lokasi='c:/testpickle.pkl'
  3. >>> vfile=open(lokasi,'wb')  #'b' pada 'wb' adalah untuk binary
  4. >>> import pickle
  5. >>> pickle.dump(a,vfile)
  6. >>> vfile.close()
  7. >>>
Data tersimpan dalam binary, ini diindikasikan pada baris ke 3 vfile=open(lokasi,'wb'), b pada wb berarti kita membuat file yang berisi binary.

Lalu kita buka file tersebut.
  1. >>> vfile=open(lokasi,'wb')
  2. >>> pickle.dump(a,vfile)
  3. >>> vfile.close()
  4. >>> vfile=open(lokasi,'rb')
  5. >>> hasil=pickle.load(vfile)
  6. >>> hasil
  7. {'bb': 2, 'aa': 1}
  8. >>> 

Dan kita masih bisa melihat data bakunya pada file tersebut:

  1. >>> open(lokasi,'rb').read()
  2. b'\x80\x03}q\x00(X\x02\x00\x00\x00bbq\x01K\x02X\x02\x00\x00\x00aaq\x02K\x01u.'
  3. >>> 

Baris 1 ( open(lokasi,'rb').read() ), rb adalah read binary.









Wednesday, 6 May 2015

10.1. Menyimpan Objek dalam File

Untuk menulikan objek-objek python kedalam file txt (penggunaan perintah 'open' selalu menggunakan string) tidak selalu secara otomatis memformatnya sehingga semua data akan ditulis secara memanjang tanpa ada baris baru.  
  1. >>> lokasi='c:/test2.txt' # string lokasi file
  2. >>> a,b,c=10,11,12        # int a,b,c
  3. >>> vstring='hello'        # string
  4. >>> vDict={'da':20, 'db':21, 'dc':22} #dictionary
  5. >>> vList=[30,31,32]     #list
  6. >>> vfile=open(lokasi,'w')   
  7. >>> vfile.write('%s,%s,%s\n' %(a,b,c))
  8. 9
  9. >>> vfile.write(vstring+'\n')
  10. 6
  11. >>> vfile.write(str(vDict)+'\n')
  12. 31
  13. >>> vfile.write(str(vList)+'\n')
  14. 13
  15. >>> vfile.close()   # tulis data kedalam file dan tutup
  16. >>> vfileRead=open(lokasi)
  17. >>> vfileRead.readlines()
  18. ['10,11,12\n', 'hello\n', "{'da': 20, 'dc': 22, 'db': 21}\n", '[30, 31, 32]\n']
  19. >>> 

Sekarang file yang kita buat berada di drive c, bernama test2.txt, lalu kita cek file tersebut dengan notepad. Bisa juga kita buka dengan python menggunakan perintan 'open' seperti perintah pada baris ke 16 dan 17. Bisa pula kita langsung menjadikannya sebuah string dengan perintah 'open'.
  1. >>> vfile=open(lokasi).read()
  2. >>> vfile
  3. "10,11,12\nhello\n{'da': 20, 'dc': 22, 'db': 21}\n[30, 31, 32]\n"
  4. >>> 

Bila kita ingin menbaca perbaris:
  1. >>> vfile=open(lokasi)
  2. >>> baris1=vfile.readline()
  3. >>> baris1
  4. '10,11,12\n'
  5. >>> baris1.rstrip()  #menhapus akhir dari baris
  6. '10,11,12'
  7. >>> baris1
  8. '10,11,12\n'
  9. >>> baris2=vfile.readline()
  10. >>> baris2.rstrip()
  11. 'hello'
  12. >>>

Pada variable baris1 (string '10,11,12') adalah satu variable string. bila kita ingin menggunakan salah satunya saja, kita harus memisahkan terlebih dahulu.
  1. >>> pisahString=baris1.split(',')
  2. >>> pisahString
  3. ['10', '11', '12\n']

Sekarang kita memiliki variable list yang bernama 'pisahString' (masih berbentuk string), kita tinggal memanggil index list yang kita perlukan.
  1. >>> vInt1=int(pisahString[0])
  2. >>> vInt1
  3. 10
  4. >>> vIntSemua=[int(x) for x in pisahString]
  5. >>> vIntSemua
  6. [10, 11, 12]
  7. >>> 

Pada baris ke-4 kita membuat variable list yang bernama 'vIntSemua' isinya integer, bukan string lagi. Dan kita tidak perlu menghapus dengan perintah 'rstrip' untuk menghapus karakter '\n', karena dengan 'int' dan beberapa fungsi konversi tidak memperhitungkan tempat kosong disekitar angka.

Sekarang kita mencoba untuk mengkonversikan list dan dictionary, dengan menggunakan perintah 'eval'

  1. >>> baris3=vfile.readline()
  2. >>> baris3
  3. "{'da': 20, 'dc': 22, 'db': 21}\n"
  4. >>> baris4=vfile.readline()
  5. >>> baris4
  6. '[30, 31, 32]\n'
  7. >>> vcampur=[baris3,baris4]
  8. >>> vcampur
  9. ["{'da': 20, 'dc': 22, 'db': 21}\n", '[30, 31, 32]\n']
  10. >>> eval(vcampur[0])
  11. {'da': 20, 'dc': 22, 'db': 21}
  12. >>> eval(vcampur[1])
  13. [30, 31, 32]
  14. >>> pisah=[eval(x) for x in vcampur]
  15. >>> pisah
  16. [{'da': 20, 'dc': 22, 'db': 21}, [30, 31, 32]]
  17. >>> 

Selanjutnya kurang lebih sama dengan yang pertama.