Vodič za Pajton 2.6/Bulovi izrazi
Ovde je mali primer Bulovih izraza(ne morate da ga kucate):
a = 6
b = 7
c = 42
print 1, a == 6
print 2, a == 7
print 3, a == 6 and b == 7
print 4, a == 7 and b == 7
print 5, not a == 7 and b == 7
print 6, a == 7 or b == 7
print 7, a == 7 or b == 6
print 8, not (a == 7 and b == 6)
print 9, not a == 7 and b == 6
Sa izlazom:
1 True 2 False 3 True 4 False 5 True 6 True 7 False 8 True 9 False
Šta se dešava? Program se sastoji od gomile čudnih print
naredbi. Svaka print
naredba štampa broj i izraz. Broj služi da pomogne da pratimo stazu naredbe kojom se računar bavi. Obratite pažnju kako se svaki izraz završi kao False
ili True
. U Pajtonu, netačno se takođe može napisati kao 0 a tačno kao 1.
Linije:
print 1, a == 6
print 2, a == 7
štampa True
i False
odnosno baš kao što se očekuje, jer prva je tačna, a druga je netačna. Treća štampa, print 3, a == 6 and b == 7
, je malo drugačija. Operator and
znači da ako su obe naredbe pre i posle tačne onda će cep izraz biti tačan, u suprotnom ceo izraz će biti netačan. Sledeća linija, print 4, a == 7 and b == 7
, prikazuje ako je deo pre and
izraza netačan, onda je sve netačno. Ponašanje and
naredbe se može sažeti na sledeći način:
izraz | rezultat |
---|---|
tačno and tačno
|
tačno |
tačno and netačno
|
netačno |
netačno and tačno
|
netačno |
netačno and netačno
|
netačno |
Obratite pažnju da ako je prvi izraz je lažan Pajton ne čeka drugi izraz, jer zna da je ceo izraz lažan.
Sledeća linija, print 5, not a == 7 and b == 7
, koristi not
operaciju. not
samo daje suprotan izraz. (Izraz se može prepraviti ovako print 5, a != 7 and b == 7
). Ovde je tabela:
izraz | rezultat |
---|---|
not tačno
|
netačno |
not netačno
|
tačno |
Sledeće dve linije, print 6, a == 7 or b == 7
i print 7, a == 7 or b == 6
, koriste or
operaciju. Operacija or
vraća tačno ako je prvi izraz tačan, ili ako je drugi taćan ili ako su oba. Ako nijedan nije tačan vraća netačno. Ovde je tabela:
izraz | rezultat |
---|---|
tačno or tačno
|
tačno |
tačno or netačno
|
tačno |
netačno or tačno
|
tačno |
netačno or netačno
|
netačno |
Imajte na umu da ako je prvi izraz tačan Pajton ne proverava drugi izraz pošto zna da je ceo izraz tačan. Ovo radi or
da je tačno ako je bar jedna polovina izraza tačna. Prvi deo je tačan tako da će drugi deo biti ili tačan ili netačan, ali je ceo izraz i dalje tačan.
Sledeće dve linije, print 8, not (a == 7 and b == 6)
i print 9, not a == 7 and b == 6
, prikazuju kako zagrade mogu koristiti za grupisanje izraza i tada traži da se jedan deo prvi izračuna. Primetite da su zagrade promenile izraz iz netačno u tačno. To se dogodilo jer su zagrade primorale not
da se primeni na ceo izraz osim na samo a == 7
deo.
Ovde je primer korišćenja Bulovih izraza:
листа = ["Живот", "Универзум", "Све", "Џек", "Џил", "Живот", "Џил"]
# направите копију листе. погледајте поглавље Више са листама да видите шта [:] значи.
коп = листа[:]
# сортирање копије
коп.sort()
прет = коп[0]
del коп[0]
бројање = 0
# проћи кроз листу у потрази за паром
while бројање < len(коп) and коп[бројање] != прет:
прет = коп[бројање]
бројање = бројање + 1
# Ако пар није пронађен онда бројање не може бити мање од дужине
# јер се while петља наставља док је бројање мање од дужине
# а није пронаћен пар
if бројање < len(коп):
print "Први пар:", прет
I ovde je izlaz:
Први пар: Џил
Ovaj program radi nastavljajući da proverava par while бројање < len(коп) and коп[бројање] није једнако прет
. Onda je бројање
veće od poslednjeg indeksa коп
ili je par pronađen and
više nije tačno pa petlja postoji. if
jednostavno proverava da se uveri da je iz while
petlje izašao jer je pronađeno podudaranje.
Drugi "trik" je and
korišćen u ovom primeru. Ako pogledate u tabelu za and
primetićete da je treći ulaz "netačan i neće proveravati". Ako бројање >= len(коп)
(drugim rečima бројање < len(коп)
je netačno) onda коп[пројање]
nije nikad pogledano. Ovo je zato što Pajton zna da ako je prvi tačan onda ne mogu oba biti tačna. Ovo je poznato kao prečica i korisno je, ako će druga polovina and
izazvati grešku ako nešto nije dobro. Ja koristim prvi izraz (бројање < len(коп)
) da proverim i vidim da li je бројање
dobar indeks za коп
. (Ako mi ne verujete uklonite parove "Džil" i "Život", proverite da li i dalje radi, a onda obrnite redosled бројање < len(коп) and коп[бројање] != прет
u коп[бројање] != прет and бројање < len(коп)
.)
Bulovi izrazi mogu da se koriste kada treba da proverite dve ili više različitih stvari odjednom.
Napomena o Bulovim operatorima
[uredi]Uobičajena greška za ljude nove u programiranju je nerazumevanje načina na koji logički operatori rade, koja proizilazi iz načina na koji pajton prevodilac čita ove izraze. Na primer, nakon prvobitnog učenja o "and " i "or" iskazima, moglo bi se pretpostaviti da će izraz x == ('a' or 'b')
proveravati da vidi ako je promenljiva x
jednaka nizu 'a'
ili 'b'
. To nije. Da biste videli o čemu pričam, započnite interaktivnu sesiju sa prevodiocem i unesite sledeće izraze:
>>> 'a' == ('a' or 'b') >>> 'b' == ('a' or 'b') >>> 'a' == ('a' and 'b') >>> 'b' == ('a' and 'b')
I ovo će biti neintuitivan rezultat:
>>> 'a' == ('a' or 'b') True >>> 'b' == ('a' or 'b') False >>> 'a' == ('a' and 'b') False >>> 'b' == ('a' and 'b') True
Sa ove tačke, and
i or
operateri izgledaju da su slomljeni. Nema smisla da je, za prva dva izraza, 'a'
jednako 'a'
ili 'b'
dok 'b'
nije. Štaviše, nema smisla da je 'b' jednako 'a'
i 'b'
. Nakon razmatranja šta prevodilac radi sa logičkim operatorima, ovi rezultati rade u stvari upravo ono što ste tražili od njih, to jednostavno nije isto kao ono što ste mislili da pitate.
Kada Pajton prevodilac gleda or
izraz, uzima prvu izjavu i proverava da li je istina. Ako je prva izjava tačna, onda Pajton vraća vrednost tog objekta bez proveravanja druge izjave. Ovo je zato što je za or
izraz, cela stvar tačna ako je jedna od vrednosti tačna; program ne mora da se bavi drugom izjavom. Sa druge strane, ako je prva vrednost netačna Pajton proverava drugu polovinu i vraća tu vrednost. Ta druga polovina određuje vrednost celog izraza jer je prva bila netačna. Ova "lenjost" dela interpretera se zove "prečica" i predstavlja uobičajen način vrednovanja bulovih izraz u mnogim programskim jezicima.
Slično, za and
izraz, Pajton koristi tehniku prečice da ubrza istinitosnu procenu vrednosti. Ako je prva izjava netačna onda ceo izraz mora biti netačan, pa ovo vraća tu vrednost. U suprotnom ako je prva vrednost tačna on proverava drugu i vraća vrednost.
Jednu stvar imajte na umu u ovom trenutku,a to je da Bulov izraz vraća vrednost ukazujući na True
ili False
, ali Pajton smatra da veliki broj različitih stvari ima istine vrednosti dodeljene na njih. Da biste proverili istinitosnu vrednost o bilo kom predmetu x
, možete koristiti funkciju bool(x)
da vidite njegovu istinitosnu vrednost. Ispod je tabela sa primerima vrednosti istine raznih objekata:
Tačno | Netačno |
---|---|
Tačno | Netačno |
1 | 0 |
Brojevi različiti od nule | Niz 'None' |
Ne-prazan niz | Prazan niz |
Ne-prazna lista | Prazna lista |
Ne-prazni rečnici | Prazni rečnici |
Sada je moguće razumeti zbunjujući rezultate koje smo dobijali kada smo testirali te bulove izraze pre. Hajde da pogledamo šta interpreter "vidi" kada prolazi kroz taj kod:
Prvi slučaj:
>>> 'a' == ('a' or 'b') # Погледајте заграде прво, тако је вредност израза "('a' or 'b')" # 'a' је не-празан низ, па је прва вредност тачна # Враћа ту прву вредност: 'a' >>> 'a' == 'a' # низ 'a' је једнак низу 'a', па је израз тачан True
Drugi slučaj:
>>> 'b' == ('a' or 'b') # Погледајте заграде прво, тако је вредност израза "('a' or 'b')" # 'a' је не-празан низ, па је прва вредност тачна # Враћа ту прву вредност: 'a' >>> 'b' == 'a' # низ 'b' није једнак низу 'a', па је израз нетачан False
Treći slučaj:
>>> 'a' == ('a' and 'b') # Погледајте заграде прво, тако је вредност израза "('a' and 'b')" # 'a' је не-празан низ, па је прва вредност тачна, испитати другу вредност # 'b' је не-празан низ, па је друга вредност тачна # Враћа ту другу вредност као резултат целог израза: 'b' >>> 'a' == 'b' # низ 'a' није једнак низу 'b', па је израз нетачан False
Četvrti slučaj:
>>> 'b' == ('a' and 'b') # Погледајте заграде прво, so evaluate expression "('a' and 'b')" # 'a' је не-празан низ, па је прва вредност тачна, испитати другу вредност # 'b' је не-празан низ, па је друга вредност тачна # Враћа ту другу вредност као резултат целог израза: 'b' >>> 'b' == 'b' # низ 'b' је једнак низу 'b', па је израз тачан True
Tako da je Pajton zaista radio svoj posao kada je dao te naizgled lažne rezultate. Kako je već pomenuto, važno je da prepozna šta će vrednost vašeg Bulovog izraza vratiti kada se procenjuje, jer nije uvek očigledno.
Da se vratimo tim prvim izrazima, ovako bi ste ih napisati tako da bi se ponašali na način na koji želite:
>>> 'a' == 'a' or 'a' == 'b' True >>> 'b' == 'a' or 'b' == 'b' True >>> 'a' == 'a' and 'a' == 'b' False >>> 'b' == 'a' and 'b' == 'b' False
Kada bi se ova poređenja ocenjivala vratile bi se vrednosti istine u pogledu Tačno ili Netačno, ne kao nizovi, tako da smo dobili odgovarajuće rezultate.
Primeri
[uredi]šifra1.py
## Овај програм пита корисника за име и лозинку.
# Затим их проверава, да ли је кориснику дозвољено унутра.
име = raw_input("Које је Ваше име? ")
шифра = raw_input("Која је шифра? ")
if име == "Џош" and шифра== "Петак":
print "Добродошао Џоше"
elif име == "Фред" and шифра== "Рок":
print "Добродошао Фреде"
else:
print "Не познајем те."
Primeri
Које је Ваше име? Џош Која је шифра? Петак Добродошао Џоше
Које је Ваше име? Бил Која је шифра? Новац Не познајем те.
Vežbe
[uredi]Napišite program koji ima zadatak da korisniku pogodi ime, ali ima samo 3 pogotka dok se program ne završi.
Otkrivena je petlja šablona: Šablon:Rešenje Šablon:Vodiš za Pajton 2.6/Navigation