Πρώτα βήματα
Δεδομένα
Αποφάσεις
Επανάληψη
Συναρτήσεις και σφάλματα
Κείμενο που μοιάζει με αριθμό
Γράφεις 30 στο πεδίο «Ηλικία» μιας φόρμας και πατάς «Αποστολή». Το πρόγραμμα που παίρνει τη φόρμα λαμβάνει το κείμενο
"30", δύο χαρακτήρες στη σειρά, κι ας μοιάζει με αριθμό. Το ίδιο ισχύει για τους βαθμούς που ένα πρόγραμμα διαβάζει από αρχείο και για το κείμενο ενός μηνύματος: τα ψηφία φτάνουν ως str.Στα παραδείγματα εδώ, η τιμή που θα ερχόταν απ' έξω είναι γραμμένη στην πρώτη γραμμή, σε εισαγωγικά, όπως θα έφτανε από τη φόρμα. Για να δοκιμάσεις άλλη τιμή, την αλλάζεις και πατάς «Τρέξε».
python
Τυπώνει
3030. Το age είναι str, και το + ανάμεσα σε δύο str τα κολλάει το ένα δίπλα στο άλλο, είτε έχουν γράμματα είτε ψηφία.Από κείμενο σε αριθμό
Για να κάνεις πράξεις με μια τέτοια τιμή, τη μετατρέπεις πρώτα σε αριθμό. Το
int("30") επιστρέφει τον ακέραιο 30 και το float("4.5") τον δεκαδικό 4.5. Η μετατροπή πετυχαίνει μόνο όταν το κείμενο είναι ήδη γραμμένο σαν αριθμός του σωστού τύπου. Η int θέλει ακέραιο, οπότε ακόμα και το int("4.5") σταματάει με ValueError:Το
ValueError λέει ότι η τιμή είχε τον σωστό τύπο, ήταν κείμενο, αλλά από το περιεχόμενό της δε βγαίνει αριθμός. Το TypeError είναι άλλο πρόβλημα: η πράξη πήρε τιμή λάθος τύπου, όπως κείμενο συν αριθμό.Το παρακάτω δε δουλεύει. Τρέξε το, διάβασε το σφάλμα και διόρθωσέ το, ώστε να τυπώνει πόσο χρονών θα είσαι του χρόνου. Μετά βάλε τη δική σου ηλικία στην πρώτη γραμμή και ξανατρέξε.
python
Το σφάλμα είναι
TypeError: can only concatenate str (not "int") to str: το age είναι κείμενο και το 1 αριθμός. Η διόρθωση είναι να περάσεις την τιμή από την int πριν από την πράξη. Μπορείς να το κάνεις σε ξεχωριστή γραμμή, age = int(age), ή μέσα στην πράξη, int(age) + 1. Στη δεύτερη εκδοχή η Python εκτελεί πρώτα την int και προσθέτει το 1 στον αριθμό που επιστρέφει.Η μετατροπή φτιάχνει νέα τιμή
Πρόβλεψεtext = "30" age = int(text) print(text + text) print(age + age)Τι θα εμφανιστεί στην οθόνη;
Διάλεξε μία
Αν γράψεις σκέτο
int(text) σε μια γραμμή, χωρίς ανάθεση, η μετατροπή γίνεται και ο αριθμός που επιστρέφει πετιέται. Το text μένει κείμενο και η επόμενη πράξη δίνει πάλι 3030.Από αριθμό σε κείμενο
Η αντίστροφη μετατροπή γίνεται με τη
str: το str(31) επιστρέφει το κείμενο "31". Τη χρειάζεσαι όταν θέλεις να ενώσεις έναν αριθμό με κείμενο με το +.pythonage = 30 message = "Του χρόνου θα είσαι " + str(age + 1) print(message)
Τυπώνει
Του χρόνου θα είσαι 31. Χωρίς τη str θα έπαιρνες ακριβώς το ίδιο TypeError με πριν, γιατί πάλι θα ένωνες κείμενο με αριθμό.Ο λογαριασμός της ταβέρνας
Ο λογαριασμός της ταβέρνας είναι 87 ευρώ. Σε μια εφαρμογή που μοιράζει λογαριασμούς, κάποιος γράφει 4 στο πεδίο «Άτομα» και το πρόγραμμα το παίρνει ως κείμενο. Προχώρα βήμα βήμα:
Βήμα προς βήμαΒήμα 1 από 4text = "4"people = int(text)share = 87 / peopleprint("Ο καθένας πληρώνει:", share)Μεταβλητέςtext = "4"
Το text κρατάει το κείμενο "4", με εισαγωγικά, όπως ήρθε από το πεδίο της φόρμας.
Η τιμή φτάνει ως κείμενο, τη μετατρέπεις και μετά κάνεις την πράξη. Αν αλλάξεις τη σειρά και διαιρέσεις πριν από τη μετατροπή, παίρνεις
TypeError.Κείμενο που δε γίνεται αριθμός
Μια φόρμα που δεν ελέγχει τι γράφει κάποιος μπορεί να στείλει «τέσσερα» στο πεδίο «Άτομα». Το
int("τέσσερα") δεν έχει τι να επιστρέψει και το πρόγραμμα σταματάει:textValueError: invalid literal for int() with base 10: 'τέσσερα'
Στο τέλος του μηνύματος, σε εισαγωγικά, είναι η τιμή που δε μετατράπηκε. Το «base 10» σημαίνει ότι η
int έψαχνε αριθμό γραμμένο στο δεκαδικό σύστημα.Στα ελληνικά οι δεκαδικοί γράφονται με κόμμα, οπότε ο λογαριασμός μπορεί να φτάσει ως
"87,5" και ένας βαθμός ως "18,5". Το float("87,5") σταματάει με ValueError: could not convert string to float: '87,5', γιατί η Python περιμένει τελεία. Η λύση είναι να αλλάξεις το κόμμα σε τελεία πριν από τη μετατροπή. Κάθε κείμενο ξέρει να αντικαθιστά ένα κομμάτι του με ένα άλλο. Το γράφεις με τελεία μετά το κείμενο: το text.replace(",", ".") επιστρέφει το ίδιο κείμενο με τελεία στη θέση του κόμματος.pythontext = "87,5" text = text.replace(",", ".") total = float(text)
Η
replace, όπως και η int, δεν αλλάζει το κείμενο που έχεις. Επιστρέφει νέο κείμενο, γι' αυτό η δεύτερη γραμμή το ξαναβάζει στο text.Το παρακάτω πρόγραμμα σταματάει στη γραμμή με το
float. Πρόσθεσε τη γραμμή που λείπει, ώστε να τυπώνει πόσα πληρώνει ο καθένας. Μετά γράψε "87.5" στην πρώτη γραμμή και ξανατρέξε: το πρόγραμμα πρέπει να δουλεύει και με τα δύο.python
Σύνοψη
- Τιμές που έρχονται απ' έξω, από μια φόρμα, ένα αρχείο ή ένα μήνυμα, φτάνουν ως κείμενο, ακόμα κι όταν έχουν μόνο ψηφία. Το
"30" + "30"δίνει3030. - Η
intμετατρέπει κείμενο σε ακέραιο και ηfloatσε δεκαδικό. Ηstrκάνει το αντίστροφο, από αριθμό σε κείμενο. - Η μετατροπή επιστρέφει νέα τιμή και αφήνει την αρχική όπως ήταν. Αν δεν τη βάλεις σε μεταβλητή, χάνεται.
- Πρώτα μετατρέπεις και μετά κάνεις την πράξη. Πράξη με το κείμενο πριν από τη μετατροπή δίνει
TypeError. - Κείμενο που δεν είναι γραμμένο σαν αριθμός του σωστού τύπου σταματάει τη μετατροπή με
ValueError, όπως τοint("τέσσερα")και τοint("4.5"). - Στους ελληνικούς δεκαδικούς το κόμμα,
"87,5", σταματάει τοfloat. Τοtext.replace(",", ".")πριν από τη μετατροπή το διορθώνει.
Θες να συνεχίσεις;
Το course είναι δωρεάν. Κάνε σύνδεση για να κρατάς την πρόοδο και τις σημειώσεις σου.