Excerpt |
---|
Dette eksemplet bygger videre på rpncalc1 og viser hvordan en kan bruke funksjoner for å gjøre et program ryddigere. |
Code Block |
# rpncalc2.py
operands = []
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 |
---|
| 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 |
---|
| while (True):
...
|
|
...
...
...
...
...
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 |
---|
|
# 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") |