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. Forestil dig der skal laves et vælg 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.

Vi kunne også lave dette eksempel på følgende måde:

	
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. 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).

Koden er stadig ret mangefuld, da den jo ikke gentager spørgsmålet hvis brugeren svarer forkert. Det er noget vi vil kigge på i afsnittet om løkker. 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. Der skal altid afsluttes med else. 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 skal afsluttes med else.

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

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 18), et pensionistkort (over 65) eller skal købe en almindelig billet.

  • Under 18 → ungdomskort
  • 18-64 → almindeligt
  • 110+ → Spøgelser betaler ikke billetter
  • Ellers → Nope .... :(

Opgave - X in Y

Ændr opgaven så du ved hjælp af et input kan få svar på om et ord findes i tekstrengen - og hvor mange gange de optræder.

Indsæt et større tekst fra nettet og lav søgninger på ord i den tekst.

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 datetime og anvende datetime.datetime.today().weekday() til at returnere en talværdi for dagen. Mandag er 0 og søndag er 6.

Eksempel på datetime kørt på en torsdag:

	
import datetime

today = datetime.datetime.today().weekday()

print(today)
	
3


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

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

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, hvor vi anvender en funktion til at indsætte noget f.eks:

╔═══════════════════╗
║                   ║
║     Velkommen     ║
║                   ║
╚═══════════════════╝

Øverst skriver vi def Velkommen(). Det betyder at vi nu definerer en funktion der hedder velkommen. Det som står i funktionen bliver først kørt når programmet kalder funktionen, og det gøres ved at skrive Velkommen(). Se her eksemplet:

	
def Velkommen():

    print("╔═══════════════════╗")
    print("║                   ║")
    print("║     Velkommen     ║")
    print("║                   ║")
    print("╚═══════════════════╝")	
	

print("Herunder udskrives funktionen\n")
Velkommen()
	
Herunder udskrives funktionen

╔═══════════════════╗
║                   ║
║     Velkommen     ║
║                   ║
╚═══════════════════╝


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

Som du kan se springer programmet selve funktionen over, og udfører den først når programmet rammer Velkommen(). Definitioner skal derfor placeres øverst i programmet, da programmet ellers ikke vil ane, at det skal gøre når det rammer Velkommen().

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
	
room_temp = 19 # rummets temperatur

turn_on_temp = 18 # Tændningstemperaturen

if turn_on(room_temp,turn_on_temp) is True:
	
    print ("tænd")
	
else:
		
    print ("Sluk")
	
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

Lad os forestille os at vi vil lave en funktion der ganger et indtastet tal med 2. I selve funktionen laver vi den nye variabel, som efterfølgende skal skrives ud:

	
def skriv_tal():
	
	valgt_tal=int(input("Skriv et tal: "))
	dobbelt_a=valgt_tal*2
	
skriv_tal()

print("Det fordoblede tal er: {0}".format(dobbelt_a))
	
Skriv et tal: 5
Traceback (most recent call last):
  File "test.py", line 10, in 
    print(dobbelt_a)
NameError: name 'dobbelt_a' is not defined


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

Fejlkoden fortæller os at den ikke kan finde variablen dobbelt_a. Det skyldes at variablen er sat inde i funktionen skriv_tal() og derfor kun kan anvendes der.

For at omgå dette må vi gøre sådan at variablen bliver tilgængelig i hele programmet. Det opnås ved at oprette variablen globalt før værdien sættes ved at skrive: global dobbelt_a

	
def skriv_tal():
	
	valgt_tal=int(input("Skriv et tal: "))
	
	global dobbelt_a
	
	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

Check kode

Et trick man kan anvende når man programmerer og ønsker at følge udviklingen af ens variabler er, at lave en chk() funktion. Det betyder at når vi sætter variablen check = 1, så vil de udføre funktionen ellers ikke. På den måde kan man under kodningen følge med hvad der sker.

	
def chk(a):
	
    if check == 1:

        print (a)

check = 1

mail = "hansboedker@dkmail.dk"

mail_len = len(mail)

chk(mail_len)
	
21


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

Ændres værdien check til 0, vil outputtet være tomt



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

Opgaver

Er det en faktor

Lav funktionen Factor(a,b) der undersøger om a er en faktor i b. Lav et output der ligner nedestående:

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


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

Skæring med X aksen

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

Andengradsligning

Lav funktionen 2grad(a,b,c) der udregner parablens sækæring(er) med x-aksen.. Anvend formlen:

\( x = \frac{-b \pm \sqrt D}{2a}~, ~~ hvor~~D = b^2-4ac\)

Output skal fortælle:

  • ... hvor mange skæringer der er med x-aksen
  • ... hvor den skærer y og x-aksen
  • ... om parablens ben vender op eller ned

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()

terningkast = randrange(1,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

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,6)
	

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.

Opgaver

Opgave - Terningspil 1

Lav et program hvor man skal spille terning mod computeren.

  • 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

Opgave - Terningspil 2

Ændre koden så:

  • brugeren skal vælge mellem en D4, D6, D10 og D20 terning
  • brugeren vælger antallet af slag
  • programmet udnævner en vinder og laver en udskrift af hvor mange gange henholdsvis bruger og computer har vundet og antallet af uafgjorte runder.

Herunder er et eksempel på en udskrift.

Spil terning mod computeren

Hvad er dit navn: Thomas
 4)  D4
 6)  D6
10)  D10
20)  D20

Hvilken terning vil du slå med.
Vælg antallet af sider på terningen. (4, 6, 10, 20): 20
Hvor mange omgange skal der spilles?: 10000

-----------------------------------------

Her er resultatet af spillet mellem dig og computeren

Der blev spillet med en D20 terning og var med 10000 slag

Lige: 543
Thomas: 4730
Computer: 4727

-----------------------------------------
Thomas vandt


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

Opgave - Ordsprog

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