Водич за Пајтон 2.6/Булови изрази

Извор: Викикњиге
Пређи на навигацију Пређи на претрагу

Овде је мали пример Булових израза(не морате да га куцате):

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

Са излазом:

1 True
2 False
3 True
4 False
5 True
6 True
7 False
8 True
9 False

Шта се дешава? Програм се састоји од гомиле чудних print наредби. Свака print наредба штампа број и израз. Број служи да помогне да пратимо стазу наредбе којом се рачунар бави. Обратите пажњу како се сваки израз заврши као False или True. У Пајтону, нетачно се такође може написати као 0 а тачно као 1.

Линије:

print 1, a == 6
print 2, a == 7

штампа True и False односно баш као што се очекује, јер прва је тачна, а друга је нетачна. Трећа штампа, print 3, a == 6 and b == 7, је мало другачија. Оператор and значи да ако су обе наредбе пре и после тачне онда ће цеп израз бити тачан, у супротном цео израз ће бити нетачан. Следећа линија, print 4, a == 7 and b == 7, приказује ако је део пре and израза нетачан, онда је све нетачно. Понашање and наредбе се може сажети на следећи начин:

израз резултат
тачно and тачно тачно
тачно and нетачно нетачно
нетачно and тачно нетачно
нетачно and нетачно нетачно

Обратите пажњу да ако је први израз је лажан Пајтон не чека други израз, јер зна да је цео израз лажан.

Следећа линија, print 5, not a == 7 and b == 7, користи not операцију. not само даје супротан израз. (Израз се може преправити овако print 5, a != 7 and b == 7). Овде је табела:

израз резултат
not тачно нетачно
not нетачно тачно

Следеће две линије, print 6, a == 7 or b == 7 и print 7, a == 7 or b == 6, користе or операцију. Операција or враћа тачно ако је први израз тачан, или ако је други таћан или ако су оба. Ако ниједан није тачан враћа нетачно. Овде је табела:

израз резултат
тачно or тачно тачно
тачно or нетачно тачно
нетачно or тачно тачно
нетачно or нетачно нетачно

Имајте на уму да ако је први израз тачан Пајтон не проверава други израз пошто зна да је цео израз тачан. Ово ради or да је тачно ако је бар једна половина израза тачна. Први део је тачан тако да ће други део бити или тачан или нетачан, али је цео израз и даље тачан.

Следеће две линије, print 8, not (a == 7 and b == 6) и print 9, not a == 7 and b == 6, приказују како заграде могу користити за груписање израза и тада тражи да се један део први израчуна. Приметите да су заграде промениле израз из нетачно у тачно. То се догодило јер су заграде приморале not да се примени на цео израз осим на само a == 7 део.

Овде је пример коришћења Булових израза:

листа = ["Живот", "Универзум", "Све", "Џек", "Џил", "Живот", "Џил"]

# направите копију листе. погледајте поглавље Више са листама да видите шта [:] значи.
коп = листа[:]
# сортирање копије
коп.sort()
прет = коп[0]
del коп[0]

бројање = 0

# проћи кроз листу у потрази за паром
while бројање < len(коп) and коп[бројање] != прет:
    прет = коп[бројање]
    бројање = бројање + 1

# Ако пар није пронађен онда бројање не може бити мање од дужине
# јер се while петља наставља док је бројање мање од дужине
# а није пронаћен пар

if бројање < len(коп):
    print "Први пар:", прет

И овде је излаз:

Први пар: Џил

Овај програм ради настављајући да проверава пар while бројање < len(коп) and коп[бројање] није једнако прет. Онда је бројање веће од последњег индекса коп или је пар пронађен and више није тачно па петља постоји. if једноставно проверава да се увери да је из while петље изашао јер је пронађено подударање.

Други "трик" је and коришћен у овом примеру. Ако погледате у табелу за and приметићете да је трећи улаз "нетачан и неће проверавати". Ако бројање >= len(коп) (другим речима бројање < len(коп) је нетачно) онда коп[пројање] није никад погледано. Ово је зато што Пајтон зна да ако је први тачан онда не могу оба бити тачна. Ово је познато као пречица и корисно је, ако ће друга половина and изазвати грешку ако нешто није добро. Ја користим први израз (бројање < len(коп)) да проверим и видим да ли је бројање добар индекс за коп. (Ако ми не верујете уклоните парове "Џил" и "Живот", проверите да ли и даље ради, а онда обрните редослед бројање < len(коп) and коп[бројање] != прет у коп[бројање] != прет and бројање < len(коп).)

Булови изрази могу да се користе када треба да проверите две или више различитих ствари одједном.

Напомена о Буловим операторима[уреди]

Уобичајена грешка за људе нове у програмирању је неразумевање начина на који логички оператори раде, која произилази из начина на који пајтон преводилац чита ове изразе. На пример, након првобитног учења о "and " и "or" исказима, могло би се претпоставити да ће израз x == ('a' or 'b') проверавати да види ако је променљива x једнака низу 'a' или 'b'. То није. Да бисте видели о чему причам, започните интерактивну сесију са преводиоцем и унесите следеће изразе:

>>> 'a' == ('a' or 'b')
>>> 'b' == ('a' or 'b')
>>> 'a' == ('a' and 'b')
>>> 'b' == ('a' and 'b')

И ово ће бити неинтуитиван резултат:

>>> 'a' == ('a' or 'b')
True
>>> 'b' == ('a' or 'b')
False
>>> 'a' == ('a' and 'b')
False 
>>> 'b' == ('a' and 'b')
True

Са ове тачке, and и or оператери изгледају да су сломљени. Нема смисла да је, за прва два израза, 'a' једнако 'a' или 'b' док 'b' није. Штавише, нема смисла да је 'b' једнако 'a' и 'b'. Након разматрања шта преводилац ради са логичким операторима, ови резултати раде у ствари управо оно што сте тражили од њих, то једноставно није исто као оно што сте мислили да питате.

Када Пајтон преводилац гледа or израз, узима прву изјаву и проверава да ли је истина. Ако је прва изјава тачна, онда Пајтон враћа вредност тог објекта без проверавања друге изјаве. Ово је зато што је за or израз, цела ствар тачна ако је једна од вредности тачна; програм не мора да се бави другом изјавом. Са друге стране, ако је прва вредност нетачна Пајтон проверава другу половину и враћа ту вредност. Та друга половина одређује вредност целог израза јер је прва била нетачна. Ова "лењост" дела интерпретера се зове "пречица" и представља уобичајен начин вредновања булових израз у многим програмским језицима.

Слично, за and израз, Пајтон користи технику пречице да убрза истинитосну процену вредности. Ако је прва изјава нетачна онда цео израз мора бити нетачан, па ово враћа ту вредност. У супротном ако је прва вредност тачна он проверава другу и враћа вредност.

Једну ствар имајте на уму у овом тренутку,а то је да Булов израз враћа вредност указујући на True или False, али Пајтон сматра да велики број различитих ствари има истине вредности додељене на њих. Да бисте проверили истинитосну вредност о било ком предмету x, можете користити функцију bool(x) да видите његову истинитосну вредност. Испод је табела са примерима вредности истине разних објеката:

Тачно Нетачно
Тачно Нетачно
1 0
Бројеви различити од нуле Низ 'None'
Не-празан низ Празан низ
Не-празна листа Празна листа
Не-празни речници Празни речници

Сада је могуће разумети збуњујући резултате које смо добијали када смо тестирали те булове изразе пре. Хајде да погледамо шта интерпретер "види" када пролази кроз тај код:

Први случај:

>>> 'a' == ('a' or 'b')  # Погледајте заграде прво, тако је вредност израза "('a' or 'b')"
                           # 'a' је не-празан низ, па је прва вредност тачна
                           # Враћа ту прву вредност: 'a'
>>> 'a' == 'a'           # низ 'a' је једнак низу 'a', па је израз тачан
True

Други случај:

>>> 'b' == ('a' or 'b')  # Погледајте заграде прво, тако је вредност израза "('a' or 'b')"
                           # 'a' је не-празан низ, па је прва вредност тачна
                           # Враћа ту прву вредност: 'a'
>>> 'b' == 'a'           # низ 'b' није једнак низу 'a', па је израз нетачан
False 

Трећи случај:

>>> 'a' == ('a' and 'b') # Погледајте заграде прво, тако је вредност израза "('a' and 'b')"
                           # 'a' је не-празан низ, па је прва вредност тачна, испитати другу вредност
                           # 'b' је не-празан низ, па је друга вредност тачна
                           # Враћа ту другу вредност као резултат целог израза: 'b'
>>> 'a' == 'b'           # низ 'a' није једнак низу 'b', па је израз нетачан
False

Четврти случај:

>>> 'b' == ('a' and 'b') # Погледајте заграде прво, so evaluate expression "('a' and 'b')"
                           # 'a' је не-празан низ, па је прва вредност тачна, испитати другу вредност
                           # 'b' је не-празан низ, па је друга вредност тачна
                           # Враћа ту другу вредност као резултат целог израза: 'b'
>>> 'b' == 'b'           # низ 'b' је једнак низу 'b', па је израз тачан
True 

Тако да је Пајтон заиста радио свој посао када је дао те наизглед лажне резултате. Како је већ поменуто, важно је да препозна шта ће вредност вашег Буловог израза вратити када се процењује, јер није увек очигледно.

Да се вратимо тим првим изразима, овако би сте их написати тако да би се понашали на начин на који желите:

>>> 'a' == 'a' or 'a' == 'b' 
True
>>> 'b' == 'a' or 'b' == 'b' 
True
>>> 'a' == 'a' and 'a' == 'b' 
False
>>> 'b' == 'a' and 'b' == 'b'
False

Када би се ова поређења оцењивала вратиле би се вредности истине у погледу Тачно или Нетачно, не као низови, тако да смо добили одговарајуће резултате.

Примери[уреди]

шифра1.py

## Овај програм пита корисника за име и лозинку.
# Затим их проверава, да ли је кориснику дозвољено унутра.

име = raw_input("Које је Ваше име? ")
шифра = raw_input("Која је шифра? ")
if име == "Џош" and шифра== "Петак":
    print "Добродошао Џоше"
elif име == "Фред" and шифра== "Рок":
    print "Добродошао Фреде"
else:
    print "Не познајем те."

Примери

Које је Ваше име? Џош
Која је шифра? Петак
Добродошао Џоше
Које је Ваше име? Бил
Која је шифра? Новац
Не познајем те.

Вежбе[уреди]

Напишите програм који има задатак да кориснику погоди име, али има само 3 поготка док се програм не заврши.

Откривена је петља шаблона: Шаблон:Решење Шаблон:Водиш за Пајтон 2.6/Navigation