Valg og funktioner

If, elif - else

Ofte har man brug for at ens program skal gøre forskellige ting ved forskellige betingelser. Dette gøres med if-elif-else strukturer.

if

Forestil dig der skal laves et valg mellem om man er en dreng eller pige. Herunder er der lavet et eksempel hvor indtastningen 1 giver en dreng og 2 giver en pige:

Læg mærke til at der er lighedstegn efter hinanden (==). Det bliver vi nød til at gøre fordi python ellers tror at vi opretter en ny variabel

	
valg = int(input("Tast 1 for dreng og 2 for pige: "))
if valg == 1:
    print ("\nDu valgte dreng")
if valg == 2:
    print ("\nDu valgte pige")
	

Herunder vælges 2

Tast 1 for dreng og 2 for pige: 2     

Du valgte pige

------------------
(program exited with code: 0)
Press return to continue

Når vi spørger med if er syntaksen

	
if *** betingelse *** :
	

Betingelsen i eksemplet herover er, at variablen valg skal være 1. Læg mærke til, at hele sætningen afsluttes med et kolon - :, og det som skal udføres under det valg er tabuleret ind. På den måde ved Python hvad der skal udføres hvis man har valgt 1 eller 2.

if-else

Ofte arbejder man med binære problemstillinger, altså hvor det er enten-eller. Her anvender man if-else strukturer. Man spørger om den ene betingelse er opfyldt (if), og så må resten nødvendigvis tilhøre den anden mulighed (else).

	
valg = int(input("Tast 1 for dreng og 2 for pige: "))

if valg == 1: 
    print ("\nDu valgte dreng")
else:
    print ("\nDu valgte pige")
	

Denne kode fungerer ved at den evalurer om valget var 1 eller ej. Fordelen er, at du kan nøjes med at sortere efter den betingelse der er lettest at beskrive - alle de muligheder der er tilbage "falder" automatisk ind under else.

if-elif-else

Problemet er bare, at hvis nu brugeren taster 3, så vil programmet også svare at man valgte pige. Men det var jo en fejltastning. Vi har altså brug for at kunne smide en ekstra mulighed ind. Det kan vi gøre ved hjælp af at tilføje elif imellem if og else.

	
valg = int(input("Tast 1 for dreng og 2 for pige: "))

if valg == 1: 
    print ("\nDu valgte dreng")
elif valg == 2:
    print ("\nDu valgte pige")
else:
    print ("Du skal vælge enten 1 eller 2")
	

Det som koden gør nu er:

  1. Beder brugeren om et input
  2. Hvis det er 1 svarer den med "Du valgte dreng" (if).
  3. Hvis det er 2 svarer den med "Du valgte pige" (elif).
  4. Hvis det hverken er 1 eller 2, så"svarer Python med "Du skal vælge enten 1 eller 2" (else).

Læg mærke til, at der skal anvendes en fast struktur. elif anvendes kun hvis der er mere end 2 betingelser der skal undersøges. Generelt kan disse betingelser skrives op på følgende formel

	
if *Betingelse*:

    *Gør noget*

elif *Ny betingelse*:

    *Gør noget andet*

else: 

    *Gør noget tredie
	

Man kan indsætte alle de elif man vil, men man skal huske at der bør afsluttes med else.

Grunden til at man bør afslutte med else er, at man derved sikrer sig at man har dækket alle mulighederne. En god måde er at man skriver alle de betingelser ned der skal tjekkes for, og så sørger man for at den sidste mulighed er else. F.eks hvis man vil spørge om ens funktion på gymnasiet hvor 1-3 angiver klassetrin, d - EUD og x - EUX:

  • 1. årgang - if
  • 2. årgang - elif
  • 3. årgang - elif
  • EUD - elif
  • EUX - else

Opgaver

I disse opgaver skal du bruge if-/elif-/elsestrukturer, sammen med operatorer. Der er et overblik over operatorerne herunder.

Overblik over operatorer
Operator Beskrivelse Eksempel
== Lig med 5 == 8 → falsk
> større end 5 > 8 → falsk
< mindre end 5 < 8 → sand
>= Større end eller lig med 5 >= 8 → falsk
<= Mindre end eller lig med 5 <= 8 → sand
!= Ikke lig med 5 != 8 → sand
is Identisk med 5 is "5" → falsk
is not Ikke identisk med 5 is not "5" → sand
x and y Både x og y skal være sand x=6 ; y=3

(x < 10 and y > 1) → sand
x or y Kun en behøver at være sand x=6 ; y=3

(x == 6 or y == 1) → sand

Er du myndig?

Lav en kode der undersøger om man er myndig eller ej (18+)

Pendlerkort

Lav en kode der undersøger om personen hos DSB er berettiget til et ungdomskort (under 20), et pensionistkort (over 65) eller skal købe en almindelig billet.

  • Under 20 → ungdomskort
  • 20-64 → almindeligt
  • 65-110 → Pensionistkort
  • 110+ → Spøgelser betaler ikke billetter

Er det fredag?

På hjemmesiden http://www.erdetfredag.dk/ får du at vide om det er fredag. Lav en lignende kode, hvor svarene er:

  • Hvis Fredag → YES det er fredag!
  • Hvis Lørdag og Søndag → Nej... Men det er weekend!
  • Ellers → Nope .... :(

HINT: For at få det til lykkes skal du importere modulet strftime fra pakken time. Ved hjælp af den kan man finde:

Overblik over strftime()
Dato
%u dag i ugen (mandag=1, søndag=7)
%V Ugenr: 00-53 (ISO 8601)
%d Hvilken dag i måneden
%m Månede
%y Årstal - 2 cifre (17)
%Y Årstal - 4 cifre (2017)
%D Dato (Måned/dag/år)
Tid
%H Timetal (0-24)
%M Minuttal
%S Sekundtal
%R Klokken (timer:minutter)
%T klokken (timer:minutter:sekunder)

Se fuldliste her: https://www.tutorialspoint.com/python/time_strptime.htm

Eksempel på strftime() kørt på en mandag:

	
from time import strftime

ugedag = strftime("%u")

print(ugedag)
	
1

------------------
(program exited with code: 0)
Press return to continue

Ændr. koden så den fortæller hvor mange dage der er til fredag.

Hvornår har du fri

Lav en kode der fortæller hvor mange timer og minutter der er til du har fri, for hver dag i ugen.

X in Y

Ofte har man brug for at finde ud af om en tekststreng findes i en sætning, f.eks. om et navn er nævnt i en sætning. Det kan man gøre ved at bruge in. Det får programmet til at svarer tilbage med enten True eller False. Dette enten/eller svar kaldes på progammeringssprog for "boolean". Lad os afprøve det herunder.

"Der findes mange programmeringssprog, og de kan stort set det samme. Men de gør den på en forskellig måde. C er et meget præcist, men også meget omstændigt sprog, hvorimod Python er noget lettere at gå til."

Lad os undersøge denne sætning for følgende tekst: Python, C og Java.

	
tekst = "Der findes mange programmeringssprog, og de kan stort set det samme. Men de gør den på en forskellig måde. C er et meget præcist, men også meget omstændigt sprog, hvorimod Python er noget lettere at gå til."

prg_python = "Python" in tekst
prg_c = "C" in tekst
prg_java = "Java" in tekst

print ("Findes Python i sætningen: {0}".format(prg_python))
print ("Findes C i sætningen: {0}".format(prg_c))
print ("Findes Java i sætningen: {0}".format(prg_java))
	
Findes Python i sætningen: True
Findes C i sætningen: True
Findes Java i sætningen: False


------------------
(program exited with code: 0)
Press return to continue

Opgaver

Ord i tekst 1

Ændr opgaven så du ved hjælp af et input kan få svar på om et ord findes i tekstrengen

Indsæt et større tekst fra nettet og lav søgninger på ord i denne tekst ved hjælp af et brugerinput.

Try

Med denne metode får man Python til at teste noget og reagere hvis der kommer en fejl. Forestil dig at du vil teste om a er et heltal (int).

	
a = "k"

int(k)
	

Python vil svare tilbage med følgende fejlmeddelelse, fordi programmet ikke kan konvertere bogstavet a til et heltal.

Traceback (most recent call last):
  File "statistic_test.py", line 1, in <module>
    int("k")
ValueError: invalid literal for int() with base 10: 'k'

For at undgå den slags fejl, der får programmet til at bryde sammen, anvender man try. Se herunder:

	
a = "k"

try:
	int(a)
	print("Variablen a er et heltal")
except:
	print("Variablen a er ikke et heltal")
	
Variablen a er ikke et heltal

Denne gang går vi ind og undersøger om a er et helttal ved at sætte det ind under try:. Hvis koden på et eller andet tidspunkt fejler under try:, så vil programmet hoppe til except: delen og udføre denne, i stedet for at bryde sammen.

Herunder kan du se resultatet når a = 2:

Variablen a er et heltal

Som programmør skal man prøve at forudse den slags problemer, for man skal huske på Murphy's lov:

Hvis noget kan gå galt, så vil det gå galt

Funktioner

Ofte har man behov for at noget skal udføres gentagne gange. Det kan f.eks. være at udskrive et logo, eller en if-else struktur der skal køres ofte. Her anvender man funktioner, så man kan skrive koden en gang, men "kalde" på den lige så ofte man vil.

Lad os prøve at lave et simpelt eksempel med funktionen produkt(), som udregner produktet af parametrene a,b.

	
def produkt(a,b):
	
	produkt = a*b
	
	print("\nProduktet er {0}".format(produkt))
	
	
produkt(2,3) # skal give svaret "Produktet er 6"

produkt(3,4) # skal give svaret "Produktet er 12"
	
Produktet er 6

Produktet er 12

------------------
(program exited with code: 0)

Press any key to continue . . .

Det som du skal være opmærksom på er:

  • Den første linie skal starte med def og afsluttes med :
  • Selve funktionen skal afsluttes med parantes indeholdende parametre (her produkt(a,b))
  • Det som hører under funktione skal være rykket ind under den
  • Funktionen anvendes ved at skrive funktionsnavnet og angive de parametre den skal anvende.

Tomme funktioner

Man kan også lave tomme funktioner. Forestil dig at du gang på gang i din kode skal have det samme output, f.eks. dine grundinformatiner

	
def tekst():
	
	print("Denne software er lavet af : \n\tThomas Jensen \n\tfakeuser@fakemail.dk")
	
tekst()
	
Denne software er lavet af :

        Thomas Jensen
        fakeuser@fakemail.dk

------------------
(program exited with code: 0)

Press any key to continue . . .

Funktioner med parametre

Forestil dig en situation hvor vi skal have en blæser til at tænde når temperaturen overstiger et vist gradtal. I eksemplet herunder angiver vi selv temperaturen, men temperaturen kunne lige så godt have kommet fra en aflæsning af et digitalt termometer. Vi sætter a til at være rummets temperatur og b til at være den temperatur der skal til for at tænde blæseren.

	
def turn_on (a,b):

    if a > b:	
        return True
	
rum_temp = 19 # rummets temperatur

tænd_temp = 18 # Tændningstemperaturen

if turn_on(rum_temp,tænd_temp) is True:

    #Udfør kommandoer hvis den skal tændes
    print ("tænd") #kommandoen der tænder for blæseren
    
else:
	
    #Udfør kommandoer hvis den skal slukkes
	print ("Sluk") #kommandoen der slukker for blæseren
	
tænd

------------------
(program exited with code: 0)
Press return to continue

Ved at angive to konstanter i funktionen kan vi "kalde" parametre fra koden ind i funktionen. På den måde kan vi lave funktioner der er meget fleksible.

Variabler i funktioner

Når laver variabler i funktioner, så gælder de kun indenfor selve funktionen. Det er smart fordi det sikrer at man kan kopierer definitioner ind i sit dokument uden at bekymre sig om det vil "vælte" resten af ens kode pga. ens variabelnavne.

HVIS man skal anvende en funktion inde fra en variabel skal den gøres global. Det gøres på følgende måde:

	
def skriv_tal():
	
	valgt_tal=int(input("Skriv et tal: "))
	global dobbelt_a #Her gøres variablen dobbelt_a global
	dobbelt_a=valgt_tal*2
	
skriv_tal()
print ("Det fordoblede tal er: {0}".format(dobbelt_a))
	
Skriv et tal: 5
Det fordoblede tal er: 10

------------------
(program exited with code: 0)
Press return to continue

Prøv at fjerne linien global dobbelt_a og undersøg fejlmeddelelsen.

Return i funktioner

Det smarte ved funktioner er at man kan få dem til at svare med en værdi eller tekstreng. Det gøres ved at bruge return. Se eksemplet herunder:

	
def _2tabel(a):
	# spørger om a er i to tabellen
	
	if a%2==0:
		return True
	else:
		return False
	
	
print(_2tabel(17)) 
	
False

------------------
(program exited with code: 0)

Press any key to continue . . .

Opgaver

Til disse opgaver skal du anvende matematik.

Generelle regneregler

Regningsarterne fungerer ved at anvende tegnene: +, -, * og /. Se herunder:

	>>> 6+3
	9
	>>> 6-3
	3
	>>> 6*3
	18
	>>> 6/3
	2.0	

Læg mærke til at der bliver anvendt int i alle eksemplerne, og at resultatet bliver leveret på samme måde ved +, - og *. Men ved division bliver resulatet ændret til float. Se nedestående eksempel

	>>> 2/3
	0.6666666666666666	

Python anvender korrekte regneregler, hvilket vil sige at + og - adskiller ledene, og at de skal sættes paranteser for at omgå dette. Se eksemplerne herunder:

	>>> 3+2*6
	15
	>>> (3+2)*6
	30
	>>> 3+6/2
	6.0
	>>> (3+6)/2
	4.5	
	

Læg mærke til at tallene bliver til float, når man dividerer.

Er det en faktor

Til denne opgave skal du anvende modulus og floordivision

Brug af modulus og floor division

For at finde restværdien og heltallet af en division anvender man henholdsvis % (modulus) og // (floordivision).

Funktion Tegn Beskrivelse Eksempel
modulus % Returnere resten efter division 9%5 = 4
floor division // Returnerer heltallet efter division 9//5 = 1
Anvendelse

modulus og floor division virker i første omgang lidt underlige, men har en masse praktiske anvendelser. F.eks:

  • Hvis noget skal ske hver tredie gang: x%3 = 0
  • Antal fyldte ølkasser: *antal flasker* // 30

Lav funktionen Factor(a,b) der undersøger om a er en faktor i b. Undersøg følgende to tilfælde:

  • faktor(10,5) → Ja
  • faktor(3097,37) → Nej

Lav et output der ligner nedestående:

Undersøger om 2 er en faktor i 10.
2 er en faktor i 10.

Undersøger om 37 er en faktor i 3097.
37 er ikke en faktor i 3097.

------------------
(program exited with code: 0)
Press return to continue

Skæring med X aksen

Lav funktionen skæring_x(a,b), der udregner skæringspunktet med x-aksen ud fra ligningen \( f(x) = ax+b \), og hvor den skærer y-aksen.

Altså hvor:

$$ x = \frac{ -b }{ a } $$
Udledning af formel
$$ ax+b = 0 \\ \Updownarrow \\ ax = -b \\ \Updownarrow \\ x = \frac{ -b }{ a } $$

Test din kode med linjerne:

  • 2x+2 skæring_x(2,2) -1.0
  • 2x-2 skæring_x(2,-2) 1.0
Linjen skærer x-aksen i værdien -1.0
Linjen skærer x-aksen i værdien 1.0

------------------
(program exited with code: 0)

Press any key to continue . . .

Ændr koden så heltal ikke udskrives som decimaltal, men som integers. Du skal bruge funktionen is_integer()

Brug af is_integer()

is_integer() undersøger om et tal af typen float, hvis det er returnerer funktionen et True.

		
>>> a = 3.14
>>> a.is_integer()
False
>>> a = 2.0
>>> a.is_integer()
True
	

Det betyder at man kan undersøge om et tal skal laves om til en integer:

		
a = 3.14
b = 2.0

if a.is_integer():
	a = int(a)	

if b.is_integer():
	b = int(b)

print(a)

print(b)
		
	
3.14
2

------------------
(program exited with code: 0)
Press return to continue
  • 2x+2 skæring_x(2,2) -1
  • 2x-2 skæring_x(2,-2) 1
Linjen skærer x-aksen i værdien -1
Linjen skærer x-aksen i værdien 1

------------------
(program exited with code: 0)

Press any key to continue . . .

Find normalform

Lav funktionen normalform(a,b,c,d), der udskriver den linie der kører igennem de to punkter \( P = (a,b) \) og \( Q = (c,d) \).

Funktionen skal udskrive linien på formen: \( y = ax + b \)

Altså hvor

$$ a=\frac{ y_2-y_1 }{ x_2-x_1 } $$
og
$$ b=y_1-ax_1 $$

Test din kode med funktionerne:

  • P = (2,6) og Q = (5,12) punkter(2,6,5,12) y = 2.0x+2.0
  • P = (2,2) og Q = (-1,-4) punkter(2,2,-1,-4) y = 2.0x-2.0
Punkterne P=(2,6) og Q=(5,12) gennemskæres af linjen: y = 2.0x+2.0


Punkterne P=(2,2) og Q=(-1,-4) gennemskæres af linjen: y = 2.0x-2.0

------------------
(program exited with code: 0)

Press any key to continue . . .

Ændr koden så heltal ikke udskrives som decimaltal, men som integers. Du skal bruge funktionen is_integer()

Test din kode med funktionerne:

  • P = (2,6) og Q = (5,12) punkter(2,6,5,12) y = 2x+2
  • P = (2,2) og Q = (-1,-4) punkter(2,2,-1,-4) y = 2x-2
Punkterne P=(2,6) og Q=(5,12) gennemskæres af linjen: y = 2x+2


Punkterne P=(2,2) og Q=(-1,-4) gennemskæres af linjen: y = 2x-2

------------------
(program exited with code: 0)

Press any key to continue . . .

Skæring mellem to linier:

Lav funktionen skaering(a,b,c,d), der udregner skæringspunktet med x-aksen ud fra ligningen \( f(x) = ax+b \), og \( g(x) = cx+d \).

Altså hvor:

$$ x= \frac{ d-b }{ a-c } $$
Udledning af formel
$$ ax+b=cx+d \\ \Updownarrow \\ ax-cx = d - b \\ \Updownarrow \\ x(a-c)=d-b \\ \Updownarrow \\ x= \frac{ d-b }{ a-c } $$

Test din kode med linierne:

  • \( y = 2x-3 \) og \( y = -\frac{ 1 }{ 3 }x+4 \) skæring(2,-3,-1/3,4) P = (3.0,3.0)
  • \( y = \frac{ 1 }{ 2 }x-3 \) og \( y = -1\frac{ 1 }{ 2 }x+3 \) skæring(1/2,-3,-1.5,3) P = (3.0,-1.5)
Linjerne skærer hinanden i punktet: P = (3.0,3.0)

Linjerne skærer hinanden i punktet: P = (3.0,-1.5)

------------------
(program exited with code: 0)
Press return to continue

Ændr koden så heltal ikke udskrives som decimaltal, men som integers. Du skal bruge funktionen is_integer()

Linjerne skærer hinanden i punktet: P = (3,3)

Linjerne skærer hinanden i punktet: P = (3,-1.5)

------------------
(program exited with code: 0)
Press return to continue

Andengradsligning

Til denne opgave skal du anvender kvadrarødder og potenser

Brug af kvadratrødder og potenser

For at finde potens tal og rødder anvendes funktionen pow(a,b), hvor a er grundtallet og b er potensen. Se nedestående eksempler:

Matematisk udtryk Python funktion
\( a^b \) pow(a,b)
\( \sqrt[b]{a} = a^{\frac{ 1 }{ b }} \) pow(a,1/b)

Det anbefales at man anvender funktionen pow() fremfor **. Det gør koden mere læselig.

Eksempler med \( 2^4 \) og \( \sqrt{4} \):

	>>> pow(2,4) 
	16
	>>> pow(4,1/2)
	2.0

Lav funktionen andengrad(a,b,c) der udregner parablens skæring(er) med x-aksen ud fra normalformen på en andegradsligning: \( ax^2 + bx + c \). Anvend formlerne herfra: ../matematik/andengradsfunktion.html

Output skal fortælle:

  • ... om parablens ben vender op eller ned
  • ... hvor mange skæringer der er med x-aksen
  • ... hvor den skærer y og x-aksen
  • ... hvad toppunktet er
  • ... der må kun stå et fortegn for hvert led (altså ikke +-

Test din kode med funktionerne:

  • \( f(x) = x^2 + 4x +4 \) andengrad(1,4,4)
  • \( f(x) = -x^2 - x + 6 \) andengrad(-1,-1,6)

Du skal lave om til integers, hvis det er muligt og programmet skal have følgende udskrift:

Her undersøges funktionen: f(x) = 1x^2 + 4x + 4

	Andegradsliningen har en løsning og skærer x-aksen i punktet -2

	Parablens ben vender opad

	Parablen skærer y-aksen i punktet 4

	Toppunktet er: Tp = ( -2 , 0 )


Her undersøges funktionen: f(x) = -1x^2 - 1x + 6

	Andegradsligningen har 2 løsninger og skærer x-aksen i punkterne -3 og 2

	Parablems ben vender nedad

	Parablen skærer y-aksen i punktet 6

	Toppunktet er: Tp = ( -0.5 , 6.25 )
		

------------------
(program exited with code: 0)
Press return to continue

Random

Ofte har man brug for at computeren skal kunne levere et tilfældigt tal. Det kan feks. være hvis computeren skal udvælge et element i en liste eller skal simulere terningkast. For at kunne anvende Random skal det først importeres, hvorefter vi får adgang til dets funktioner. Den væsentligste forskel ligger i hvordan det bliver præsenteret i koden. Lad os se på det første eksempel:

	
from random import random, randrange

tilfældigtal = random() # giver et tilfældig tal i området [0;1]

terningkast = randrange(1,7) # Giver et tilfældigt heltal i området [1;7[ - altså 1,2,3,4,5,6

print ("Et tilfældigt tal: {0}".format(tilfældigtal))
print ("\nEt terningkast: {0}".format(terningkast))
	
Et tilfældigt tal: 0.5522756126989775

Et terningkast: 5

------------------
(program exited with code: 0)
Press return to continue
Import af moduler og funktioner

I dette eksempel importeres enkelt elementerne fra modulet. Det gør at vi kan kalde modulets funktioner direkte i vores kode. Dvs. for at kunne lave et random tal skal vi blot angive random().

Hvis vi blot importerer modulet skal vi hver gang vi anvender noget fra modulet angive både modulets navn og funktion (random.random()).

		
	import random

	tilfældigtal = random.random()
	terningkast = random.randrange(1,7)
		
	

Begge metoder har deres fordele. Fordelen ved at importere de enkelte moduler hver for sig er, at man i koden kan kalde den konkrete funktion uden at skulle skrive modulets navn først, samt at alle anvendte funktioner står i toppen af dokumentet. Fordelen ved at kalde hele funktionen er, at man i koden kan se når funktioner kaldes fra moduler. Du skal vælge ud fra hvad der giver dig det bedste overblik.

Hvis du senere skal kompilere koden er der en anden overvejelse du skal gøre dig. Hvis du vælger kun at importere elementer fra et modul, så er det kun dem du tager med i det endelige program. Det kan få betydning for programmets størrelse og hastighed.

Hvis du får fejlen : cannot import name 'random', skyldes det, at du har en anden fil på computeren der hedder random.py:

Har du kaldt filen python.py, skal du omdøbe den og fjerne den gamle fil fra computeren.

Opgaver

Terningspil 1

Lav et program hvor man skal spille terning mod computeren, og hvor den største værdi vinder.

  • Terningen bliver kastet 1 gang
  • Brugeren skal kunne indtaste sit navn
  • Output skal være om computer eller bruger er vinder eller at der er uafgjort
Hvad er dit navn: Thomas

Thomas: 4
Computer: 4

Det blev uafgjort

------------------
(program exited with code: 0)
Press return to continue

Ordsprog

Lav et program der ved hjælp af random() udskriver et ud af mindst 4 forskellige ordsprog.