Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
# rpncalc2.py operands = []
Excerpt

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

Code Block

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

Code Block
languagepython
def isOperand(token):
   

...

 return token[0].isdigit()

Definisjon av isOperand: Den tar inn en tekst (string) og returnerer en logisk verdi (boolean, altså True eller False).

 

Code Block
languagepython
while (True):
    ...
    

...

token

...

 = raw_input(" > ")
    

...

if isOperand(token):
    

...

 

...

   operand = float(token)
	...

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

Code Block
languagepython
# rpncalc2.py
operands = return False[]

def checkOperandsisOperand(ntoken):
    if (len(operands) < return token[0].isdigit()

def hasOperands(n):
        raise ValueError("Missing operands, " + str(n) + " where required")return len(operands) < n

def plus():
    if checkOperandshasOperands(2):
        operands.append(operands.pop() + operands.pop())

def minus():
    checkOperandsif hasOperands(2):
        operands.append(- (operands.pop() - operands.pop()))

while (True):
    print(operands)
    token = raw_input(" > ")
    if (isOperand(token)):
        operand = float(token)
        operands.append(operand)
    else:
        try:
            if (elif token == "exit"):
                break
            elif (token == "+"):
                plus()
            elif (token == "-"):
                minus()
        except ValueError as veelse:
        print("Unsupported operator: " + print(vetoken)
print("program exited")