You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 4 Next »

Dette eksemplet bygger videre på rpncalc1 og viser hvordan en kan bruke funksjoner for å gjøre et program ryddigere.

Definisjon og bruk av funksjoner

Funksjoner kan ses på som en innkapsling av programkode, med flere viktige fordeler:

  • Ved å sette navn på et stykke kode og bruke navnet i stedet, så gjøres resten av koden ryddigere og lettere å lese.
  • Parametre og retur-verdier tydeliggjør hvilke verdier et stykke kode er avhengig av og har som resultat.
  • En funksjon kan kalles fra flere steder, altså en slags gjenbruk, og gjør programmet mer kompakt.

Den vanskeligste delen er å finne ut hvilke funksjoner som er nyttigst, altså hvilke funksjoner gjøre koden ryddigst og gir mest gjenbruk. En god test er om det er lett å finne et fornuftig navn og skille koden fra resten ved å angi parametre og returverdi.

Ta koden fra rpncalc1.py for sjekke om en tekst er en operand (og ikke en operator) som eksempel: token[0].isdigit(). Det er ikke opplagt hva hensikten er, men ved f.eks. å kalle koden isOperand, så gjøres dette tydeligere. Koden blir som følger:

def isOperand(token):
    return token[0].isdigit()

...
while (True):
    ...
    token = raw_input(" > ")
    if isOperand(token):
        operand = float(token)
	...
... 

Øverst defineres isOperand-funksjonen: Den tar inn en tekst (string) og returnerer en logisk verdi (boolean, altså True eller False).

Lenger ned brukes av isOperand: token overføres som argument returverdien brukes direkte som betingelsen i if-setningen.

 

 

Dersom en senere finner en bedre måte å gjøre det på, så er det bare å bytte ut funksjonskoden, uten at koden som kaller funksjonen må endres. 

# rpncalc2.py
operands = []

def isOperand(token):
    return token[0].isdigit()

def hasOperands(n):
    return len(operands) < n

def plus():
    if hasOperands(2):
        operands.append(operands.pop() + operands.pop())
def minus():
    if hasOperands(2):
        operands.append(- (operands.pop() - operands.pop()))
while (True):
    print(operands)
    token = raw_input(" > ")
    if isOperand(token):
        operand = float(token)
        operands.append(operand)
    elif token == "exit":
        break
    elif token == "+":
        plus()
    elif token == "-":
        minus()
    else:
        print("Unsupported operator: " + token)
print("program exited")
  • No labels