Πρώτα βήματα
Δεδομένα
Αποφάσεις
Επανάληψη
Συναρτήσεις και σφάλματα
Λίστες και for
Πέντε μαθήματα, πέντε βαθμοί και θέλεις τον μέσο όρο. Με μία μεταβλητή για κάθε βαθμό, το πρόγραμμα είναι αυτό:
pythonmath = 17 physics = 14 history = 19 english = 12 biology = 16 average = (math + physics + history + english + biology) / 5 print(average)
Τρέχει και τυπώνει
15.6. Στο επόμενο τετράμηνο μπαίνει και η Χημεία. Φτιάχνεις έκτη μεταβλητή, την προσθέτεις στην παρένθεση και αλλάζεις το 5 σε 6. Αν ξεχάσεις το 5, ο μέσος όρος βγαίνει λάθος χωρίς κανένα μήνυμα. Και σε ένα καλάθι e-shop με 40 προϊόντα κανείς δε θα έγραφε 40 μεταβλητές. Αυτό που λείπει είναι ένα όνομα για όλους τους βαθμούς μαζί.Μια λίστα κρατάει πολλές τιμές
pythongrades = [17, 14, 19, 12, 16]
Αυτό είναι μια λίστα: τιμές σε αγκύλες, χωρισμένες με κόμμα, σε σειρά. Στο σχολικό βιβλίο θα τη βρεις με το όνομα πίνακας, με μία διαφορά: ο πίνακας της ΓΛΩΣΣΑΣ έχει σταθερό μέγεθος, ενώ μια λίστα της Python μεγαλώνει όσο της προσθέτεις στοιχεία. Η λίστα θυμάται τη σειρά που έγραψες τις τιμές και κάθε τιμή, κάθε στοιχείο, έχει έναν αριθμό θέσης.
Η αρίθμηση ξεκινάει από το 0. Το
grades[0] είναι το 17, το grades[1] το 14 και το τελευταίο, το 16, είναι το grades[4]. Ο αριθμός λέει πόσες θέσεις απέχει το στοιχείο από την αρχή της λίστας: το πρώτο απέχει μηδέν.Πόσα στοιχεία έχει η λίστα σου λέει το
len: το len(grades) δίνει 5. Αφού η αρίθμηση ξεκινάει από το 0, η τελευταία θέση είναι πάντα μία λιγότερη από το len. Αν ζητήσεις το grades[5], το πρόγραμμα κρασάρει με IndexError: list index out of range: η θέση 5 δεν υπάρχει.Κάθε λίστα ξέρει να προσθέτει ένα στοιχείο στο τέλος της. Το γράφεις με τελεία μετά το όνομα:
grades.append(18). Η λίστα μεγαλώνει κατά ένα και το len(grades) γίνεται 6.Το for περνάει από κάθε στοιχείο
Για να κάνεις κάτι με κάθε στοιχείο της λίστας, χρησιμοποιείς το
for:pythonfor grade in grades: print(grade)
Το διαβάζεις «για κάθε
grade στο grades». Σε κάθε πέρασμα η μεταβλητή grade παίρνει το επόμενο στοιχείο της λίστας και τρέχει το σώμα με εσοχή. Όταν τελειώσουν τα στοιχεία, τελειώνει και το loop. Εδώ δεν υπάρχει συνθήκη να γράψεις ούτε μετρητής να ξεχάσεις να ανεβάσεις, οπότε ένα for που περνάει μια λίστα σταματάει μόνο του.Ο μέσος όρος με λίστα και
for:python
Τρέξε το και μετά πρόσθεσε στη λίστα έναν έκτο βαθμό,
18, για τη Χημεία. Δεν αλλάζεις τίποτα άλλο: το for περνάει και από το νέο στοιχείο και το len μετράει 6. Ο μέσος όρος πρέπει να βγει 16.0.Το
total ξεκινάει από το 0 πριν από το loop και σε κάθε πέρασμα μαζεύει έναν ακόμα βαθμό. Αυτή τη συνταγή θα τη γράψεις ξανά και ξανά, για το σύνολο ενός καλαθιού ή για την κατανάλωση ρεύματος μιας χρονιάς. Προχώρα βήμα βήμα με τρεις βαθμούς: Βήμα προς βήμαΒήμα 1 από 10grades = [17, 14, 20]total = 0for grade in grades:total += gradeprint(total / len(grades))Μεταβλητέςgrades = [17, 14, 20]
Η λίστα με τρεις βαθμούς.
Η θέση του
total = 0 μετράει. Αν τη βάλεις στο σώμα του loop, με εσοχή, ο μηδενισμός τρέχει σε κάθε πέρασμα:pythonfor grade in grades: total = 0 total += grade
Σε κάθε πέρασμα το
total ξαναγίνεται 0 και μετά παίρνει μόνο τον τρέχοντα βαθμό. Με τους πέντε βαθμούς στο τέλος κρατάει 16, τον τελευταίο, και ο μέσος όρος βγαίνει 3.2. Ο κώδικας είναι έγκυρος, οπότε η Python δε βγάζει κανένα σφάλμα. Ό,τι πρέπει να γίνει μία φορά μπαίνει πριν από το loop.Το μεγαλύτερο στοιχείο της λίστας
Με τον ίδιο τρόπο βρίσκεις και το μεγαλύτερο στοιχείο. Κρατάς σε μια μεταβλητή το μεγαλύτερο που έχεις δει ως τώρα και σε κάθε πέρασμα το συγκρίνεις με το τρέχον στοιχείο. Το παρακάτω πρόγραμμα ψάχνει τη μεγαλύτερη από τις θερμοκρασίες τεσσάρων πρωινών του Ιανουαρίου στη Φλώρινα. Πριν το τρέξεις, κοίτα τη λίστα και πες τι πρέπει να τυπώσει.
python
Τυπώνει
Μέγιστη: 0, μια θερμοκρασία που δεν υπάρχει στη λίστα. Το best ξεκίνησε από το 0 και κανένα στοιχείο δεν ήταν μεγαλύτερο από αυτό, οπότε το if δεν έτρεξε ποτέ. Με βαθμούς ή τιμές προϊόντων το ίδιο πρόγραμμα θα δούλευε, γιατί εκεί όλα τα στοιχεία είναι πάνω από το 0. Έτσι το λάθος μένει κρυμμένο, ώσπου να φτάσει μια λίστα με αρνητικούς αριθμούς.Διόρθωσέ το: το
best πρέπει να ξεκινάει από μια τιμή που υπάρχει στη λίστα, το πρώτο στοιχείο, temps[0]. Τρέξε ξανά. Πρέπει να δεις Μέγιστη: -1.Αριθμοί με range
Κάποιες φορές δε σου φτάνει το στοιχείο, χρειάζεσαι και τον αριθμό της θέσης του. Άλλες φορές θέλεις απλώς να επαναλάβεις κάτι έναν συγκεκριμένο αριθμό φορών. Και για τα δύο υπάρχει το
range, που φτιάχνει μια σειρά από ακέραιους για να τους περάσει το for: Πρόβλεψεfor i in range(1, 5): print(i)Τι θα εμφανιστεί στην οθόνη;
Διάλεξε μία
Με έναν αριθμό, το
range(3) δίνει 0, 1, 2: τρεις αριθμούς, από το 0. Είναι ακριβώς οι θέσεις μιας λίστας με τρία στοιχεία, οπότε το range(len(prices)) σου δίνει όλες τις θέσεις της λίστας prices. Το ίδιο range(3) σου χρησιμεύει κι όταν θέλεις απλώς κάτι να τρέξει τρεις φορές.Ένα e-shop θέλει να τυπώνει το καλάθι αριθμημένο από το 1, όπως το βλέπει ο πελάτης. Κάποιος το έγραψε έτσι. Τρέξε το και δες πού σταματάει:
python
Τυπώνει
1 4.5 και 2 30.0 και μετά κρασάρει με IndexError. Μία γραμμή έκανε δύο λάθη: το πρόγραμμα προσπέρασε το πρώτο προϊόν, των 12.9 ευρώ, και στο τέλος ζήτησε τη θέση 3, που δεν υπάρχει. Ο κώδικας χρησιμοποιεί το ίδιο i και για τη θέση στη λίστα, που ξεκινάει από 0, και για τον αριθμό που βλέπει ο πελάτης, που ξεκινάει από 1. Ένα loop που πάει μία θέση πιο πέρα ή πιο πίσω από το σωστό είναι από τα πιο συνηθισμένα λάθη στον προγραμματισμό και οι προγραμματιστές το λένε off-by-one.Διόρθωσέ το: άφησε το
i να περνάει τις θέσεις της λίστας με range(len(prices)) και φτιάξε τον αριθμό για τον πελάτη στο print, με i + 1. Πρέπει να δεις 1 12.9, 2 4.5 και 3 30.0.Όταν δε χρειάζεσαι τη θέση, το
for price in prices είναι πιο απλό και δεν αφήνει περιθώριο για off-by-one. Το for ταιριάζει όταν περνάς μια λίστα ή ξέρεις πόσες φορές θα τρέξει το σώμα. Το while ταιριάζει όταν σταματάς επειδή κάτι άλλαξε, όπως ένας κουμπαράς που γέμισε.Το ίδιο σε ψευδοκώδικα
Ο μέσος όρος των πέντε βαθμών σε ψευδοκώδικα:
ΓΛΩΣΣΑΠΡΟΓΡΑΜΜΑ ΜΕΣΟΣ_ΟΡΟΣ ΜΕΤΑΒΛΗΤΕΣ ΑΚΕΡΑΙΕΣ: ΒΑΘΜΟΙ[5], ΣΥΝΟΛΟ, i ΠΡΑΓΜΑΤΙΚΕΣ: ΜΕΣΟΣ ΑΡΧΗ ΒΑΘΜΟΙ[1] ← 17 ΒΑΘΜΟΙ[2] ← 14 ΒΑΘΜΟΙ[3] ← 19 ΒΑΘΜΟΙ[4] ← 12 ΒΑΘΜΟΙ[5] ← 16 ΣΥΝΟΛΟ ← 0 ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 5 ΣΥΝΟΛΟ ← ΣΥΝΟΛΟ + ΒΑΘΜΟΙ[i] ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ ΜΕΣΟΣ ← ΣΥΝΟΛΟ / 5 ΓΡΑΨΕ 'Μέσος όρος:', ΜΕΣΟΣ ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
Στη ΓΛΩΣΣΑ δηλώνεις από πριν πόσα στοιχεία θα έχει ο πίνακας,
ΒΑΘΜΟΙ[5], και οι θέσεις ξεκινούν από το 1. Το ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 5 περνάει και από το 5, ενώ το range(1, 5) σταματάει στο 4. Το ΓΙΑ περνάει αριθμούς, οπότε το στοιχείο το παίρνεις με ΒΑΘΜΟΙ[i]. Το i είναι λατινικό μικρό γράμμα, όπως στο βιβλίο. Το for grade in grades της Python σου δίνει κατευθείαν το στοιχείο. Και εδώ το σώμα κλείνει με ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ αντί για το τέλος της εσοχής.Σύνοψη
- Μια λίστα κρατάει πολλές τιμές με ένα όνομα και με σειρά:
grades = [17, 14, 19, 12, 16]. - Οι θέσεις ξεκινούν από το 0. Το
grades[0]είναι το πρώτο στοιχείο και το τελευταίο βρίσκεται στη θέσηlen(grades) - 1. Μια θέση που δεν υπάρχει δίνειIndexError. - Το
for grade in gradesτρέχει το σώμα μία φορά για κάθε στοιχείο, με τοgradeνα παίρνει κάθε φορά το επόμενο. Σταματάει μόνο του, όταν τελειώσουν τα στοιχεία. - Για σύνολο ή μέσο όρο, η μεταβλητή που μαζεύει το αποτέλεσμα παίρνει αρχική τιμή πριν από το loop και όχι στο σώμα του.
- Για το μεγαλύτερο στοιχείο ξεκινάς από το πρώτο στοιχείο της λίστας, όχι από το 0.
- Το
range(a, b)δίνει από τοaέως τοb - 1και τοrange(n)δίνει από το 0 έως τοn - 1. Τοrange(len(prices))δίνει όλες τις θέσεις μιας λίστας. - Στον ψευδοκώδικα οι θέσεις ξεκινούν από το 1 και το
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 5περνάει και από το 5.
Θες να συνεχίσεις;
Το course είναι δωρεάν. Κάνε σύνδεση για να κρατάς την πρόοδο και τις σημειώσεις σου.