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:
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).
| 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.
# 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")