Poglavlje2.6.4

**2.6.4 Opšti SET operatori**

Python podržava nekoliko SET operatora

Primer:

Dat je SET a\_set = {2 , 4 ,5 ,9 ,12 ,21 ,30 ,51 ,76 , 127 ,195 }

\*Možemo da proverimo da li se neka vrednost nalazi u okviru seta koristeci izraz ***in*** :

Ovakav izraz vraća boolean vrednost (true/false)

\*Unija dva skupa se realizuje preko već ugrađene funkcije ***union( ),*** koja vraca novi set sa svim vrednostima oba skupa ,prikazano na primeru :

\*Preko funkcije ***intersection(* *)*** se može napraviti presek dva skupa tako sto se vraća novi set koji je presek skupa **a** i **b** ,prikazano na primeru :

\*Funkcija ***difference( )*** vraća novi set koji sadrži sve elemente koji se nalaze u set-u **a** ali ne u set-u **b**

\*Funkcija ***symmetric\_difference( )*** vraća novi set koji sadrži elemente koji su strogo u jednom od set-ova

Sledeće tri funckije su simetrične :

1. Simetrična razlika seta **a** u odnosu na set **b** *izgleda* drugačije u odnosu na simetričnu razliku **b** u odnosu na **a** , ali setovi *unordered* (tj. neuređeni ). Bilo koja dva seta koja sadrže iste vrednosti,pritom da nemaju još neku vrednost pored tih, smatraju se istima.

2. Tačno to se i ovde dešava.Set **a** i **b** su isti što se može i videti na ovom primeru.

3. Unija dva seta je takođe simetrična

4. Presek dva seta je simetrična funkcija

5. Razlika dva seta nije simetrična.Razlika dva seta je analogna oduzimanju dva broja, redosled operandi je bitan(nije isto x - y i y – x )

Postoje još nekoliko stvari koje mogu da se rade sa setovima

1. Set **a** je subset(podskup) **b** to znači da članovi u **a** su takođe članovi u **b** , za to koristimo boolean funkciu ***issubset(...)***

2. Funkcija ***issuperset(...)*** je obrnuta funkcija od ***issubset(...)*** , to se vidi na ovom primeru jer su svi članovi **a** takođe u **b**

3. Čim dodate neku vrednost u **a** koja nije u **b** , obe će vratiti *False*

**2.6.5 Set-ovi kao Boolean vrednosti**

Preko funkcije **is\_it\_true(...)** ćemo pokazati set-ove u boolean kontekstu

1. U boolean logici kada je set prazan tada ćemo vratiti *False*

2. Bilo koji set sa minimum jednom vrednošću će biti *True*

3. Broj elemenata,ako je veći od jedan, nije ni bitan uvek će funkcija vraćati *True*

**2.7. Dictionaries (rečnici)**

Rečnik je neuređeni set koji se sastoji od key-value parova(ključ - vrednost).To znači da svaka vrednost(ili vrednosti) imaju svoj ključ.Kada dodate ključ u rečnik morate takođe dodati i vrednost (ta vrednost se može menjati kasnije).Python rečnici su optimizovani za pronalazak vrednosti ako znate ključ, ali ne i obrnuto.

**2.7.1 Pravljenje rečnika**

Pri kreiranju rečnika proces je sličan kao kod set-ova , ali umesto samo vrednosti imamo i parove ključ-vrednost.Kada napravite rečnik lako možete da pronađete vrednosti po njihovom ključu.

1. Prvo ćemo napraviti novi rečnik sa dva elementa i dodeliti ga promenljivoj ***a\_dict*** . Svaki element je ključ-vrednost par,ovo se deklarise izmedju vitičastih zagrada {…}

2. ‘*server*’ je u datom primeru ključ, i za njega se vezuje vrednost ‘*db.diveintopython3.org’*

3. *‘database’* je takođe ključ , za koji se vezuje vrednost *‘mysql’*

'*4. **Vrednost se može lako dobiti ukoliko znamo ključ (***a\_dict['server'] ***će biti* 'db.diveintopython3.org' *, ali*** a\_dict['db.diveintopython3.org'] ***će izbaciti izuzetak jer* 'db.diveintopython3.org** nije ključ

**2.7.2. Modifikovanje rečnika**

Rečnici nemaju neku predefinisanu granicu veličine.Možete da dodajete parove ključ-vrednost u rečnik kada god želite,ali takođe možete da uređujete vrednost postojećeg ključa.

1. Ne možete da imate duplikate ključeva u rečniku,ako već postojećem ključu dodelite novu vrednost ona će obrisati prethodnu.

2. Možete dodati novi ključ-vrednost par bilo kada.Sintaksa je ista kao i kod uređeivanja postojeće vrednosti.

3. Novi element u rečniku (ključ *‘user’* , vrednost *‘mark’*) čini se da se nalazi u sredini.Zapravo,to je samo slučajnost da se elementi u ovom primeru prikazuju kao da su poređani po redu.

4. Dodavanje vrednosti na već postojeći ključ prosto rečeno zamenjuje staru vrednost novom.

5. Postavlja se pitanje da li će vrednost *‘user’* ključa biti promenjena na 'mark'.NE! Pogledajmo bolje ključ – imamo veliko početno slovo U u ‘User’. Rečnici su “osetljivi ” na mala i velika slova , zato ova naredba pravi novi par ključ-vrednost

**2.7.3 Rečnici sa mešovitim vrednostima**

Rečnici nisu samo za niske(stringove). Vrednosti rečnika mogu da budu bilo kog tipa podataka , uključujući celi brojeve(integers) , boolean(true/false) , arbitrarne objekte , čak i druge rečnike.U okviru samog rečnika, vrednosti ne moraju da sve budu iste vrednosti, možete da kombinujete kako vam je volja.Ključevi su više “ograničeni“ po ovom pitanju, oni mogu biti niske,celi brojevi, i još po neki tip podataka.Takođe i tipove podataka ključeva možete da “mešate“ po volji.

Već smo videli rečnike koji nemaju ključ kao nisku , u “Našem prvom Python programu“

Hajde da malo to bolje pogledamo:

1. Kao i kod lista I set-ova , *len( )* funkcija nam daje broj ključeva u rečniku.

2. Takođe kao i kod lista i set-ova , mozete koristiti *in* operator da testirate da li neki ključ postoji u datom rečniku.

3. *1000* je ključ u rečniku *SUFFIXES* ,njegova vrednost je lista od osam elemenata.

4. Slično ovome, *1024* je takođe ključ rečnika *SUFFIXES* , njegova vrednost je takođe lista od osam elemenata.

5. Pošto je *SUFFIXES[1000]* lista,možete da dodajete samostalno elemente u listu preko njenog indexiranja(počev od 0).

**2.7.4 Rečnici kao Boolean tipovi**

Rečnike možete takođe da koristite u boolean kontekstu,kao na primeru:

1. U boolean kontekstu prazan rečnik je False.

2. Bilo koji rečnik sa najmanje jednim ključ-vrednost parom je True.

**2.8. None**

*None* je specijalna konstanta u Python-u.Ona ima takozvanu **null** vrednost. *None* nije isto kao i *Flase* , *None* takođe nije *0*.*None* nije prazna niska(string) . Ukoliko upoređujemo *None* sa bilo čime što nije *None* će prikazati *False*.

*None* je samo **null** vrednost. Ona ima sovj tip podatka (pr. *datatype(NoneType)* ). *None* možete dodeliti bilo kojoj promenljivoj ali ne možete druge *NoneType* objekte.Sve promenljive kojima je dodeljena *None* vrednost su iste jedna drugoj.

**2.8.1 None kao Boolean**

U Boolean kontekstu *None* je false , a *not None* je true.Što se može videti na primeru: