Συναρτήσεις και παράμετροι — DedSec Project
Συναρτήσεις — ορίσματα, προεπιλογές και κανόνας στρογγυλοποίησης Η έννοια και το αναμενόμενο αποτέλεσμα Η συνάρτηση επιτρέπει να χρησιμοποιείς ξανά έναν υπολογισμό χωρίς αντιγραφή σε πολλές…
Συναρτήσεις — ορίσματα, προεπιλογές και κανόνας στρογγυλοποίησης
Η έννοια και το αναμενόμενο αποτέλεσμα
Η συνάρτηση επιτρέπει να χρησιμοποιείς ξανά έναν υπολογισμό χωρίς αντιγραφή σε πολλές οθόνες. Η apply_discount δέχεται ακέραια λεπτά και προαιρετικό ακέραιο ποσοστό έκπτωσης από μηδέν έως 100. Όταν ο καλών δεν δίνει έκπτωση, χρησιμοποιείται το προεπιλεγμένο μηδέν. Η έξοδος είναι ποσό σε ακέραια λεπτά, όχι εκτυπωμένο μήνυμα, ώστε η ίδια λογική να δοκιμάζεται και να καλείται από τερματικό ή γραφική διεπαφή.
Εκτελέσιμη άσκηση Python 3
Αποθήκευσε ως 05_Functions.py και εκτέλεσε με Python 3. Πρώτα πρόβλεψε το αποτέλεσμα· όλοι οι έλεγχοι χρησιμοποιούν απλές τεχνητές τιμές χωρίς δίκτυο.
def apply_discount(total_cents, percentage=0):
if (type(total_cents) is not int or total_cents < 0 or
type(percentage) is not int or not 0<=percentage<=100):
raise ValueError("invalid price or discount")
# Explicit round-down of fractional cents.
return total_cents*(100-percentage)//100
assert apply_discount(1000) == 1000
assert apply_discount(1000,25) == 750
assert apply_discount(101,50) == 50
assert apply_discount(500,100) == 0
for p in (-1,101):
try: apply_discount(100,p)
except ValueError: pass
else: raise AssertionError("bad percentage accepted")
print("PASS function contract and default arguments")
Γιατί λειτουργεί
Ο τύπος πολλαπλασιάζει πριν διαιρέσει και χρησιμοποιεί ακέραια διαίρεση προς τα κάτω, απορρίπτοντας κλασματικά λεπτά. Αυτός είναι ρητός κανόνας: 101 λεπτά με έκπτωση 50% γίνονται 50 λεπτά, όχι 51. Ο κανόνας δεν είναι κατάλληλος αυτόματα για κάθε κατάστημα ή νομικό καθεστώς· κάθε εφαρμογή πρέπει να τον τεκμηριώνει. Απόφυγε μεταβαλλόμενες λίστες ή λεξικά ως προεπιλεγμένα ορίσματα, γιατί στην Python δημιουργούνται κατά τον ορισμό της συνάρτησης.
Καθοδηγούμενη εξάσκηση
Πρόβλεψε το αποτέλεσμα για 1000 λεπτά με 25%, για 101 λεπτά με 50% και για 500 λεπτά με 100%. Έλεγξε ότι παράλειψη της έκπτωσης είναι ισοδύναμη με μηδενική έκπτωση. Φτιάξε ξεχωριστή συνάρτηση φόρου αντί να ανακατέψεις πολιτικές υπολογισμού. Δοκίμασε διαφορετικούς κανόνες στρογγυλοποίησης χωρίς να αλλάξεις σιωπηλά τις υπάρχουσες απαιτήσεις.
Αντιμετώπιση λαθών
Αν η συνάρτηση επιστρέφει None, έλεγξε ότι χρησιμοποιεί return αντί για απλή εκτύπωση. Όταν δύο ποσά διαφέρουν κατά ένα λεπτό, εξέτασε τη σειρά πράξεων και τον κανόνα στρογγυλοποίησης. Η μορφοποίηση της εξόδου ανήκει σε χωριστό επίπεδο.