Les og utforsk


Introduksjon

Det er mange typer som er innebygget i Python. Forrige uke lærte vi å jobbe med heltall (int), flyttall (float) og tekststrenger (str). I tillegg til disse grunnleggende typene, skal vi senere lære mer avanserte typer som lister (list), tupler (tuple), sett (set) og oppslagsverk (dict) som gir oss flere måter å organisere og manipulere dataene våre på.

Denne uken skal vi lære bruken av boolske verdier (bool) i kombinasjon med if-setninger for å kontrollere flyten i programmet ditt. For å få mest mulig ut av denne uken, anbefaler vi at du leser den første delen av kapittel 2 i Automate the Boring Stuff frem til «while Loop Statements».


Booleans

Mens int-, float- og strdatatyper har et ubegrenset antall mulige verdier, har bool-datatypen bare to verdier: True og False.De starter alltid med en stor T eller F.

type(False)
type(True)
print("Boolske verdier:")
print(True)
print(False)
print("Ikke Boolske:")
print(true)
print(false)

Boolske tolkninger av noen verdier

print("bool(1) =", bool(1))
print("bool(-234) =", bool(-234))
print("bool(0.0001) =", bool(0.0001))
print(f"{bool(0) = }")
print(f"{bool(0.0) = }")
print(f"{bool(-0.0) = }")
print(f'{bool("Hallo") = }')
print(f'{bool("") = }')
Boolske Sammenligninger.

Sammenligningsoperatører (<, >, ==, >=, <=), også kalt relasjonsoperatører, sammenligner to verdier og evaluerer ned til en enkel Boolean-verdi.

tall_1 = 5
tall_2 = 9

print(tall_1 > tall_2)
print(f"{tall_1 > tall_2}")  # Du kan gjøre detsamme med f-strings
print("tall_1 > tall_2 =", tall_1 > tall_2)
# Omskrivning med f-strings:
print(f"tall_1 > tall_2 = {tall_1 > tall_2}")


# Prøv selv! Skriv om følgende som f-strings:
print(tall_1 == tall_2)
print(tall_1 <= tall_2)

print(3 <= tall_1 <= 7 < tall_2 < 10)

print("---------------")

# Vi kan sammenligne strenger i alfabetisk rekkefølge.
navn_1 = "Alice"
navn_2 = "Albert"

print(f"navn_1 < navn_2 = {navn_1 < navn_2}")
print(navn_1 == navn_2)
print(navn_1 > navn_2)

# Vi kan lagre boolske verdier i variabler.
matches = navn_1 == "Bob"  # Merk forskjellen mellom "=" og "==" her.

print(f"matches = {matches}")
Boolske Operatorer

Noen operasjoner er så vanlige at vi har spesielle symboler for å utføre dem. For eksempel symboler som + for addisjon. Du kan finne en oversikt over alle operatorene i Python i denne tabellen. mange av dem vil vi lære mer om senere i kurset, men nå skal vi fokusere på bruken av symbolene and, or og not for å utføre boolske operasjoner.

Her er noen eksempler på de boolske operatorene and, or og not.

print("Boolean operators")
print(True and True)
print(True and False)
print("--------")
print(True or False)
print(True or True)
print("--------")
print(not True)
print(not False)

print("Larger boolean expressions")

test_1 = (5 > 3) and ("a" < "c")
print(f"test_1 = {test_1}")

x = True
test_2 = (not x) and x
print(f"test_2 = {test_2}")

sky_is_green = False
grass_is_green = True
test_3 = sky_is_green and grass_is_green
print(f"test_3 = {test_3}")


print("Confuse yourself...")
true = False
false = True
# decide what the output will be before running!
test_4 = true and True
print(test_4)
test_5 = test_4 or false
print(test_5)
in Operatoren

in operatøren sjekker medlemskap. Vi kan bruke ordet in til å sjekke om en ting er med i en annen ting.

a_prog = 'a' in 'programmering'
print(f"Bokstaven 'a' er med i ordet 'programmering': {a_prog}")

print(f"Bokstaven 'a' er med i ordet 'Anton': {'a' in 'Anton'}")
# Hvorfor blir det 'False' i den siste print-satsen?

If-setninger

Her er noen eksempler på if-setninger. Om uttrykket etter if har verdien True kjøres kodeblokkene under.

if True:
    print("ABCDEF")

if False:
    print("KLMXYZ")

Det kan være litt vanskelig å forstå hva koden gjør. Du kan tegne bildet av koden for å hjelpe deg selv til å forstå. Se Illustrasjon bildet for eksempelet på kontrollflyten for denne if-setning a < b :

# denne koden gir samme informasjon som bildet nedenfor
a = 5
b = 9
if a < b:
  print("Smaller!")

Illustrasjon av  if-setning a < b

La oss øve litt mer på dette. Kjør koden nedenfor. Prøve å tegne et bilde av kontrollflyten for a > b i koden.

a = 5
b = 9

#############

if a > b:
    print("Bigger!")

print("BBB")

#############

if a == b:
    print("The same!")
    print("More than one line can be here:")
    print("as")
    print("many")
    print("as")
    print("you")
    print("like.")

print("CCC")

#############

if a > 5 and b < 10:
    print("A is above 5 and B is less than 10")

Til slutt er det noen if-setninger som ikke er så gode. Hva er galt med dem? Hvordan kan du skrive dem bedre?

# How not to not write bad if-conditions

if (a < b) == True:  # Do *not* write comparisons like this!
    print('Writing "if (a<b) == True" is doing double work!')
    print('"a < b" is already a boolean by itself.')
    print('Writing "if True==True:" doesn\'t make it more true')

if not (a >= b) == False:  # nooooo! use this instead: if a >= b:
    print("An if statement with many negatives is not readable")

# We can save booleans in variables.
a_smaller_than_b = a < b  # What value does this variable have?

# We can then use them in if-statements.
if a_smaller_than_b:
    print("'a' is smaller than 'b'.")

La oss prøve et annet eksempel. Hvorfor skrives ut ingenting i den siste if-setningen?

name = "Fred"
if name == "Fred":
    print("Welcome, Fred!")

if "re" in name:
    print("Your name has 're' inside!")

name = "Alice"
if name == "Alice":
    print("Welcome, Alice!")

if "re" in name:
    print("Your name has 're' inside!")

La oss prøve et siste eksempel på if-setninger. Hvorfor skrives ut ingenting i den siste if-setningen? Kan du endre koden slik at noe blir skrevet ut i den?

x = 101.2
y = -56.8
z = 104

if z % 5 == 0:
    print("Z is divisible by 5")
    if x > 100:
        print("Also, x is larger than 100")
    if y > 50:
        print("Also, y is larger than 50")
    print("Still in the Z if-block")
print("Outside again. Try other values for x y z")

If-else-setninger

Her er noen eksempler på if-else-setninger. Om uttrykket ved if ikke har verdien True kjøres koden under else i stedet.

Se bildet for et eksempel på kontrollflyten for if-else-setning a < b i denne koden:

if a < b:
    print("Smaller!")
else:
    print("Bigger!")

Illustrasjon av  if-else-setning a < b

Hvis vi bytte inne tall for senteningen, får vi den:

# samme if-sentning som a < b, men med tall:
if 30 < 50:
    print("30 is smaller than 50")
else:
    print("30 is not smaller than 50")

Det finnes en annen måte å bruke if-else: vi kan bruke A if X else B som et uttrykk. Uttrykket har verdien A om X har verdien True, ellers har det verdien B:

x = "apple" if (5 < 6) else "banana"
print(x) # hva skrives ut her?

x = "apple" if (9 < 6) else "banana"
print(x) # hva skrives ut her?
If-elif-else-setninger

Her er noen eksempler på if-elif-else-setninger. Om uttrykket ved if ikke har verdien True går Python videre til elif og sjekker om det uttrykket har verdien True, og kjører isåfall kodeblokken under. Forskjellen mellom to if etter hverandre og if så elif er at om uttrykket ved if har verdien True sjekkes ikke det i elif’en. Om man har to if etter hverandre sjekkes alltid begge uttrykkene.

Se bildet for et eksempel på kontrollflyten for en enkel if-elif-else-setning:

# denne koden gjør det samme som bildet:
if a < b:
  print("Smaller!")
elif a > b:
    print("Bigger!")
elif a == b:
    print("Same!")

Illustrasjon av  if-elif-else-setning

Hvorfor blir det ulike resultater fra ’Flow 4’ med elif og ’Flow 4’ med bare if?

# Prøv å tegne diagram til vert programflyt!
print("Flow 1")
if False:
    print("A")
elif False:
    print("B")
elif False:
    print("C")
elif False:
    print("D")
else:
    print("E")
#######################
print("Flow 2")
if False:
    print("A")
elif False:
    print("B")
elif True:
    print("C")
elif False:
    print("D")
else:
    print("E")
#######################
print("Flow 3")
if True:
    print("A")
elif False:
    print("B")
elif False:
    print("C")
elif False:
    print("D")
else:
    print("E")
#######################
print("Flow 4")
if False:
    print("A")
elif True:
    print("B")
elif False:
    print("C")
elif True:
    print("D")
else:
    print("E")
#######################
print("Flow 4, just using if")
if False:
    print("A")
if True:
    print("B")
if False:
    print("C")
if True:
    print("D")
else:
    print("E")

Her er et annet eksempel av if-elif som er litt morsommere. Tenk deg at du spiller The Witcher og du har nettopp kommet til byen. Du møtt en fyr på puben, og må bestemme deg hva du skal gjør neste:

pub_guy = "angry"

if pub_guy == "happy":
  print("Let's have a pint!")
elif pub_guy == "demon":
  print("Slay him")
else:
  print("Grunt and walk away")

Kan du tegne et diagram for denne programflyten?

Finn feilene

Her er noen eksempler på kode som ikke er riktig. Prøv å finn feilene uten å kjøre koden først.

Finn feilen og endre slik at koden går ann å kjøre.

Hva hvis en som besøker museumet er både en senior og en student? Endre koden slik at denne personen betaler riktig pris (en person som tilhører to kategorier betaler kun den billigste prisen).

number = 42
if number % 7 == 0
    print(f"{number} is divisible by 7.")

if number % 5 = 0:
    print(f"{number} is divisible by 5.")


name = "Alice"
if name == Alice:
    print('Hello, Alice!')


if True:
    print('A')
     print('B')
   print('C')

   

if 5 < 3:
    print('Five is smaller than three')
    else:
        print('Five is bigger than three')


# This code should tell a visitor entering a museum what
# they must pay, depending on whether the visitor is a
# senior, a student or none of the above. Try some different values.


visitor_is_senior == False
visitor_is_student == False

if visitor_is_senior:
    print('Please pay 80 NOK.')
if visitor_is_student:
    print('Please pay 90 NOK.')
else:
    print('Please pay 100 NOK.')

For å skrive God stil kode med if-elif-else struktur, anbefaler vi å lese gjennom denne.

Modulus

For et heltall \(x\) og et positivt heltall \(y\) er operasjonen \(x \mod y\) definert i matematikken som forskjellen mellom \(x\) og det største tallet mindre enn eller lik \(x\) som er delbart med \(y\). For positive tall vil dette være det samme som resten etter heltallsdivisjon.

print(" 6%3 =", ( 6%3))
print(" 5%3 =", ( 5%3))
print(" 2%3 =", ( 2%3))
print(" 0%3 =", ( 0%3))
print("-4%3 =", (-4%3))
print(" 3%0 =", ( 3%0))
a = 37
if a % 2 == 0:
    print(f"{a} is even")
else:
    print(f"{a} is odd")
Turtle

Forrige uke møte vi Python-turtle. Denne uken bruke vi turtle-modulen for å demonstrere boolsk logikk med programflyt. Last ned koden nedenfor og kjør koden. Hva er rekkefølgen av kommandoer du må gi for å tegne en firkantet form?



import turtle as t

t.forward(100)

response_1 = input(
    "Direction 1 (enter 'l' to turn left, or 'r' to turn right.)? "
)
if response_1 == "r":
    t.right(90)
else:
    t.left(90)

###
t.forward(100)

response_2 = input(
    "Direction 2 (enter 'l' to turn left, or 'r' to turn right.)? "
)
if response_2 == "r":
    t.right(90)
else:
    t.left(90)

###
t.forward(100)

response_3 = input(
    "Direction 3 (enter 'l' to turn left, or 'r' to turn right.)? "
)
if response_3 == "r":
    t.right(90)
else:
    t.left(90)

###
t.forward(100)


t.done()