Start | logik
 

Logik



Logik handlar om True och False samt operatorerna and, or och not. Det handlar också om alla uttryck som kan anta dessa värden.

ganska logiskt

Det mesta runt logik är ganska ... logiskt. "Om du är snäll OCH städar ditt rum, så får du veckopeng på fredag". Vi lärde oss logik innan vi visste vem Aristoteles, George Boole eller Augustus de Morgan var. Vem sjutton är Augustus de Morgan föresten? Det var han som skrev följande lagar:

( not(X or Y) ) == ( (not X) and (not Y) )
eller
( not(X and Y) ) == ( (not X) or (not Y) )

Tvivlar du? Kolla själv!

XYX or Ynot (X or Y)not(X)not(Y)not(X) and not(Y)
TTTFFFF
TFTFFTF
FTTFTFF
FFFTTTT

not()


Not inverterar. Om vi inverterar 2 gånger så kommer vi tillbaka dit vi startade.

not


Not inverterar värdet, True blir False och False blir True.

Anot(A)
FalseTrue
TrueFalse
A = True B = not(A) print(B) B = not(B) print(B)

and


Med and krävs det att allt är sant för att uttrycket ska vara sant.

and


Både A och B (eller alla om det är fler) måste vara sanna (True) för att svaret skall vara True.

ABA and B
FalseFalseFalse
FalseTrueFalse
TrueFalseFalse
TrueTrueTrue
A = True B = False C = A and B print(C)

all( ... )


Funktionen all(iterable) tar en lista, tuple, mängd eller dictionary eller annan iterable och returnerar True om alla element är True. På så vis fungerar den som and. Om något element är False avbryter den direkt och returnerar False.
print(all([True,True,True,True])) print(all({True,True,True,True}))

or


Med or räcker det att något är sant, så blir uttrycket sant.

or


Räcker med att A eller B är sann (True) för att svaret skall vara True.

ABA or B
FalseFalseFalse
FalseTrueTrue
TrueFalseTrue
TrueTrueTrue
A = True B = False C = A or B print(C)

any( ... )


Funktionen any(iterable) tar en lista, tuple, mängd eller dictionary eller annan iterable och returnerar True om något element är True. På så vis fungerar den som or. Om något element är True avbryter den direkt och returnerar True.
print(any([True,False,False,True])) print(any({True,False,False,True}))
Tänk efter lite. Det spelar ingen roll om and eller or har högre prioritet.

(True and False) or True = False or True = True
True and (False or True) = True and True = True

x = True and False or True print(x)

Vad är True eller False ?

Naturligtvis är True = True och False = False. Men rent allmänt finns det en viktig princip som är ärvd från andra programmeringsspråk och det är följande.

- Det som är tomt, noll, None är False.
- Det som innehåller något, är icke noll, information, det är True.

Den inbyggda funktionen bool(x) klargör detta tydligt. Allt nedan är False.
print(bool(0)) print(bool([])) print(bool({})) print(bool(""))
Allt nedan betraktas som True.
print(bool(1)) print(bool([1])) print(bool({"q":1})) print(bool("hej"))
Hur kan vi använda detta?
lst = [3, 5, 8, 9] if(bool(lst)): print(lst) else: print("listan är tom")
Ofta behöver man inte ens används bool(). Titta på nedan kod.
a = 10 while(a): a = a - 1 print(a) print("hoppat ur loopen!")
Loopen terminerar när a när 0 efter 0 = inget = "false".
a = [5,3,7,6] while(a): print(a) a.pop() print("hoppat ur loopen!")

Så vad blir följande?
a = True b = False logik = a and not(b) or not(a) print(logik)
Eller följande.
x = bool(1) y = bool([]) z = bool({"q":1}) a = z and (x or y) print(a)

Jämförelser och logik




OperatorAnvändningFörklaring
notnot(X)not(False) = True
andX and YBåda True ger True
orX or YEna True ger True
==X == YSamma värde True
>X > YX störst ger True
>X >= YX större/lika ger True
<X < YY störst ger True
<X <= YY större/lika ger True


= vs ==


Observera att vid tilldelning, t.ex. a=10, då skriver vid enbart = medans vid jämförelse a==b då skriver vi ==

När vi skriver if(a==b) så testar vi förstås om a == b, dvs det kan vara sant eller falskt. Studera följande kod.
def samma(a,b): return(a==b) print(samma(10,10)) print(samma(10,9))
Själva uttrycket a == b är alltså sant eller falskt.
a = 10 b = 10 c = (a==b) print(c)
Vilket osökt leder in oss på att alla jämförelser ger ifrån sig ett logiskt sanningsvärde.
a = 10 b = 10 c = (a>b) print(c)
Vad blir nedan?
a = 10 b = 10 c = ( a > b ) or ( a < b ) print(c)
Varför blir det False? Antingen är a större eller b större, dvs en helgardering ? Inte alls, då a = b. Nedan är däremot en helgardering.
a = 10 b = 10 c = ( a > b ) or ( a < b ) or (a == b) print(c)
Vad blir detta?
a = 10 b = 10 c = (a > (b) or a) < (b or (a) == b) print(c)
Fixa meningsfulla parenteser så att logiken blir logisk !

Lite frågor

Vad blir not( True and False or True)
  False
  True
Vad blir bool({"q":1}) and bool([])
  False
  True
Vad blir any({True,False,False,True}) ?
  False
  True
all({True,True,True,False})
  False
  True

Skriv färdigt koden som avslöjar om du någonsin kommer förstå Pyton
kan_redan = latt_lara = diciplinerad = laggar_ner_tid = lyckas = kan_redan or ... print(lyckas)


18.279075622559 ms