Professional Documents
Culture Documents
Ν. Μαμουλής
Προγραµµατισµός
Προγραµµατισµός
ΔΕΝ ΕΙΝΑΙ απλά γράφω κώδικα…
λύνω πρακτικά
είναι
προβλήµατα
χρησιµοποιώντας τον υπολογιστή
2
Εφαρµογές
Τι είναι η Εφαρµογή (Application);
Η εφαρµογή είναι το λογισµικό που αναπτύσσεται για
να διευκολύνει τους χρήστες να διαικπεραιώσουν
συγκεκριµένες εργασίες.
Εφαρµογές
Εφαρµογές
Εφαρµογές παντού!
Ηλεκτρονικά Παιχνίδια
Πολυµεσικές εφαρµογές
Υπολογιστική Όραση, Γραφικά
Εφαρµογές Τεχνητής Νοηµοσύνης
6
Προγραµµατισµός Εφαρµογών
ΙΔΕΑ Δεξιότητες
7
Σύγγραµµα
• Beginning Python: From Novice to Professional,
Magnus Lie Hetland, Apress, 2008.
• To pdf είναι διαθέσιµο για download από τη σελίδα
του ecourse.
• Άλλα συγγράµµατα:
• Introduction to Computing Using Python: An
Application Development Focus, L. Perkovic,
Wiley, 2012
• Εισαγωγή στους Υπολογιστές µε τη γλώσσα
Python, Ν. Αβούρης, Μ. Κουκιάς, Β. Παλιούρας,
Κ. Σγάρµπας, Παν/µιο Πατρών, 2013
9
Βασικές Πληροφορίες Μαθήµατος
Python
• Κατεβάστε τη γλώσσα Python στον υπολογιστή
σας!
• www.python.org
• Ο προγραµµατισµός µαθαίνεται αφιερώνοντας
χρόνο στον υπολογιστή, δεν αρκεί το διάβασµα.
10
Μαθησιακοί Στόχοι
1. [Επίλυση Προβληµάτων] Ανάλυση απαιτήσεων
απλών προβληµάτων, σχεδιασµός και υλοποίηση
προγραµµάτων που τα λύνουν µέσω µιας λογικής ροής
απλών εντολών.
2. [Ανάπτυξη Εφαρµογών] Ανάπτυξη µεγαλύτερων
προγραµµάτων, µέσω κατάλληλων δοµών και
συναρτήσεων.
3. [Εκσφαλµάτωση] Έλεγχος, εντοπισµός και διόρθωση
των σφαλµάτων ενός προγράµµατος.
4. [Έλεγχος Προγράµµατος] Έλεγχος της σωστής
λειτουργίας ενός προγράµµατος µε βάση τις
προδιαγραφές του.
15
Πρόγραµµα Μαθήµατος
1. Εισαγωγή στον προγραµµατισµό
2. Εισαγωγή στην Python
3. Λίστες και πλειάδες
4. Αλφαριθµητικά
5. Λεξικά
6. Έλεγχος ροής προγράµµατος
7. Διαγράµµατα ροής
8. Δόµηση προγράµµατος και συναρτήσεις
9. Αναδροµικές συναρτήσεις
10. Ταξινόµηση και αναζήτηση
11. Διαχείρηση αρχείων κειµένου
12. Το περιβάλλον γραφικών της Python
16
Άλλες Πληροφορίες
n Το µάθηµα δεν προαπαιτεί γνώσεις προγραµµατισµού.
Προαπαιτεί όµως:
¡ Βασικές γνώσεις χρήσης υπολογιστή (άνοιγµα/σώσιµο
αρχείων, εύρεση/οργάνωση αρχείων στο δίσκο,
πληκτρολόγηση)
¡ Καλό επίπεδο Αγγλικών
n Οι βασικές αρχές προγραµµατισµού σε Python είναι
χρήσιµες/απαραίτητες για την εκµάθηση άλλων
γλωσσών (Java, C++)
n Ο προγραµµατισµός µαθαίνεται µε την εξάσκηση
¡ εργαστήρια, ασκήσεις, προσωπική ενασχόληση
17
Ας αρχίσουµε!
Σχεδιασµός Προγράµµατος
Βασικές Έννοιες
«Υπολογιστής» δεν είναι µόνο ο προσωπικός
σας υπολογιστής (PC), µπορεί να είναι:
• Ο υπολογιστής µέσα στο κινητό σας
• Ο υπολογιστής µέσα στην ψηφιακή µηχανή σας
• Ο υπολογιστής µέσα στην κονσόλα
παιχνιδιών σας
iPhone 5 Galaxy S4
Panasonic Lumix GF
Υλικό
Τα φυσικά («χειροπιαστά») µέρη τα
οποία συνθέτουν έναν υπολογιστή.
5
Υλικό
Τα φυσικά («χειροπιαστά») µέρη τα
οποία συνθέτουν έναν υπολογιστή.
Υλικό
Τα φυσικά («χειροπιαστά») µέρη τα
οποία συνθέτουν έναν υπολογιστή.
2. Κύρια Μνήµη (RAM)
A DDR3 RAM
Main Memory
…
αριθµό) που προσδιορίζει τη θέση του.
0 0 0 0 0 0 0 1
…
Κάθε κελλί µνήµης έχει 8
δυαδικά ψηφία (1 byte). Ερώτηση: Ποιο είναι ένα τυπικό
µέγεθος RAM σήµερα;
Προσωρινή – τα δεδοµένα στη
Απάντηση: 8GB DDR3 RAM,
µνήµη χάνονται (σβήνονται) µε έχοντας 8,589,934,592 κελλιά
το κλείσιµο του υπολογιστή µνήµης! 8
Υλικό
Τα φυσικά («χειροπιαστά») µέρη τα
οποία συνθέτουν έναν υπολογιστή.
3. Δευτερεύουσα Μνήµη
Μόνιµη – η πληροφορία δεν χάνεται µε
το κλείσιµο του υπολογιστή.
Για µόνιµη αποθήκευση πληροφορίας σε
αρχεία. A 3.5” Hard Disk
Flash hard drive External Hard Disk DVD/CD ROMs USB flash drive 9
Υλικό
Τα φυσικά («χειροπιαστά») µέρη τα
οποία συνθέτουν έναν υπολογιστή.
4. Περιφερειακά
Συσκευές επικοινωνίας µεταξύ χρήστη και
υπολογιστή.
Συσκευές εισόδου
Συσκευές εξόδου
10
Υλικό
Επεξεργαστής
(CPU) Συσκευές
εισόδου
γρήγορα
Συσκευές
Κύρια Μνήµη εξόδου
αργά
Πρόγραµµα
Τι είναι ένα πρόγραµµα
Επεξεργαστής
(CPU) Συσκευές Μία ακολουθία εντολών που
εισόδου
σκοπό έχουν την εκτέλεση µιας
γρήγορα
συγκεκριµένης εργασίας στον
υπολογιστή.
Συσκευές
Κύρια Μνήµη εξόδου
αργά
Δευτερεύουσα Compute
Μνήµη
2+3=?
13
Πρόγραµµα
Όταν ένα πρόγραµµα εκτελείται
Επεξεργαστής
(CPU) Συσκευές 1) Το πρόγραµµα φορτώνεται
εισόδου στην κύρια µνήµη.
γρήγορα
Συσκευές
Κύρια Μνήµη εξόδου
Compute
2+3=?
αργά
Δευτερεύουσα Compute
Μνήµη
2+3=?
14
Πρόγραµµα
Όταν ένα πρόγραµµα εκτελείται
Επεξεργαστής
(CPU) Συσκευές 1) Το πρόγραµµα φορτώνεται
Compute
εισόδου στην κύρια µνήµη.
2+3=5
γρήγορα
2) Ο επεξεργαστής διαβάζει και
εκτελεί τις εντολές, καθώς και τα
Συσκευές
δεδοµένα από τη µνήµη.
Κύρια Μνήµη εξόδου
Compute
2+3=?
αργά
Δευτερεύουσα Compute
Μνήµη
2+3=?
15
Πρόγραµµα
Όταν ένα πρόγραµµα εκτελείται
Επεξεργαστής
(CPU) Συσκευές 1) Το πρόγραµµα φορτώνεται
Compute
εισόδου στην κύρια µνήµη.
2+3=5
γρήγορα
2) Ο επεξεργαστής διαβάζει και
εκτελεί τις εντολές, καθώς και τα
Συσκευές
δεδοµένα από τη µνήµη.
Κύρια Μνήµη εξόδου 3) Η έξοδος του προγράµµατος
Compute
2+3=? µπορεί να γραφτεί στην κύρια
µνήµη, στη δευτερεύουσα µνήµη
ή σε συσκευή εξόδου.
αργά
Δευτερεύουσα Compute
Μνήµη
2+3=?
16
Πρόγραµµα
Μία κοντινή µατιά στον επεξεργαστή
Επεξεργαστής
Επεξεργαστής
(CPU)
(CPU)
Μονάδα Ελέγχου (ΜΕ) – Εξάγει τις εντολές
Συσκευές
]\ από τη µνήµη, τις αποκωδικοποιεί και τις
εισόδου
ΜΕ
εκτελέι.
γρήγορα
Συσκευές
Κύρια Μνήµη εξόδου
αργά
Δευτερεύουσα
Μνήµη
17
Πρόγραµµα
Καταχωρητές Μία κοντινή µατιά στον επεξεργαστή
Επεξεργαστής
Processer CPU
(CPU)
Μονάδα Ελέγχου (ΜΕ) – Εξάγει τις εντολές
Συσκευές
ΜΕ από τη µνήµη, τις αποκωδικοποιεί και τις
εισόδου
εκτελεί.
γρήγορα Καταχωρητές (Registers) – Αποθηκεύουν
τις εντολές/δεδοµένα που εξάχθηκαν από
Συσκευές
τη µνήµη για γρήγορη επεξεργασία.
Κύρια Μνήµη εξόδου
αργά
Δευτερεύουσα
Μνήµη
18
Πρόγραµµα
Καταχωρητές
ΑΛΜ
Μία κοντινή µατιά στον επεξεργαστή
Επεξεργαστής
Processer CPU
(CPU)
Μονάδα Ελέγχου (ΜΕ) – Εξάγει τις εντολές
Συσκευές
ΜΕ από τη µνήµη, τις αποκωδικοποιεί και τις
εισόδου
εκτελεί.
γρήγορα Καταχωρητές (Registers) – Αποθηκεύουν
τις εντολές/δεδοµένα που εξάχθηκαν από
Συσκευές
τη µνήµη για γρήγορη επεξεργασία.
Κύριαmemory
Main Μνήµη εξόδου
Compute Αριθµητική Λογική Μονάδα (ΑΛΜ) – Εκτελεί
2+3=?
απλές αριθµητικές/λογικές πράξεις (AND/OR).
Ερώτηση: Η ΚΜΕ επεξεργάζεται δεδοµένα και εντολές
αργά εκφρασµένες µε «0» και «1». Πώς µπορεί να εκτελέσει
ένα πρόγραµµα από µια γλώσσα προγραµµατισµου;
Δευτερεύουσα
Μνήµη
19
Πρόγραµµα
Καταχωρητές
ΑΛΜ
Μία κοντινή µατιά στον επεξεργαστή
Επεξεργαστής
(CPU)
Μονάδα Ελέγχου (ΜΕ) – Εξάγει τις εντολές
Συσκευές
ΜΕ από τη µνήµη, τις αποκωδικοποιεί και τις
εισόδου
εκτελεί.
γρήγορα Καταχωρητές (Registers) – Αποθηκεύουν
001100100100
100101010110 τις εντολές/δεδοµένα που εξάχθηκαν από
Συσκευές
τη µνήµη για γρήγορη επεξεργασία.
Κύριαmemory
Main Μνήµη εξόδου
Compute Αριθµητική Λογική Μονάδα (ΑΛΜ) – Εκτελεί
2+3=?
απλές αριθµητικές/λογικές πράξεις (AND/OR).
Ερώτηση: Η ΚΜΕ επεξεργάζεται δεδοµένα και εντολές
αργά εκφρασµένες µε «0» και «1», πώς µπορεί να εκτελέσει
ένα πρόγραµµα από µια γλώσσα προγραµµατισµου;
Γλώσσες Προγραµµατισµού
Γλώσσα Μηχανής
Ο επεξεργαστής καταλαβαίνει µόνο γλώσσα µηχανής.
Συγκεκριµένες εντολές σε γλώσσα µηχανής εκτελούνται
απευθείας στην κεντρική µονάδα επεξεργασίας.
?
Γλώσσα Ανθρώπινη
µηχανής γλώσσα
0111000100001111 Γράψε µου ένα πρόγραµµα
που να υπολογίζει το
1001110110110001
άθροισµα 2 αριθµών.
1110000100111110
21
Γλώσσες Προγραµµατισµού
Γλώσσα Assembly
Γλώσσα χαµηλού επιπέδου ορισµένη από τον
κατασκευαστή του επεξεργαστή.
Είναι διατυπωµένη σε δυαδική γλώσσα µηχανής για να
εκτελεστεί από την ΚΜΕ.
22
Γλώσσες Προγραµµατισµού
Γλώσσες προγραµµατισµού υψηλού επιπέδου
C C++ Pytho
n Pascal COBOL
Θυµίζουν ανθρώπινη γλώσσα.
Έχουν πιο περίπλοκες εντολές από αυτές της Assembly.
Προγράµµατα σε αυτές τις γλώσσες πρέπει να
µεταφραστούν σε κώδικα µηχανής για να εκτελεστούν
από την ΚΜΕ.
Γλώσσα Γλώσσα Γλώσσα Ανθρώπινη
µηχανής Assembly Προγραµµατισµού γλώσσα
0111000100001111 LOAD A Γράψε µου ένα πρόγραµµα
# Python code που να υπολογίζει το
1001110110110001 ADD B C = A+B άθροισµα 2 αριθµών.
1110000100111110 STORE C
23
Λογισµικό
Τα προγράµµατα που χρησιµοποιούνται
ευρέως σε ένα υπολογιστικό σύστηµα
24
25
Κέλυφος - Command Prompt
Το κέλυφος (shell) ή το περιβάλλον γραµµής διαταγών
(command prompt) επιτρέπει στους χρήστες να
επικοινωνούν µε το λειτουργικό, εισάγοντας εντολές.
Στα Windows, το command prompt ενεργοποιείται
πληκτρολογώντας “cmd” στη γραµµή εκκίνησης.
26
Επεξεργαστής κειµένου
Χρησιµοποιείται για να γράφουµε και να
αλλάζουµε τον πηγαίο κώδικα ενός
προγράµµατος. Μπορεί να αναγνωρίσει και
να χρωµατίσει τα µέρη του προγράµµατος. Επεξεργαστής
Κειµένου
Δηµοφιλείς επεξεργαστές κειµένου
- emacs
- vi width = int(input("Width: "))
length = int(input("Length: "))
- pico area = width*length
- UltraEdit print("Area: ", area)
- Crimson
Πηγαίος κώδικας (area.py)
- TextWrangler
27
Μεταγλωττιστής
Οι επεξεργαστές καταλαβαίνουν µόνο
προγράµµατα σε γλώσσα χαµηλού επιπέδου
(απλές εντολές), που µπορεί να διαφέρουν
ανάλογα τον υπολογιστή.
Επεξεργαστής
Ο µεταγλωττιστής (compiler) είναι ένα Κειµένου
πρόγραµµα που µεταφράζει αυτόµατα
πηγαίο κώδικα υψηλού επιπέδου (π.χ. #include <iostream>
C++) σε γλώσσα µηχανής, ώστε ο …
υπολογιστής να µπορεί να τον εκτελέσει. int main (){
int width = 5;
int height = 10;
int area = width * height;
cout << “Area is “ <<
Δυαδικός Κώδικας area;
(Γλώσσα Μηχανής) Compiler return 0;
}
(π.χ. area.o) Πηγαίος κώδικας (area.cpp) 28
Μεταγλωττιστής
Το αποτέλεσµα της µεταγλώττισης πολλές
φορές δεν είναι το βέλτιστο αφου η διαδικασία
είναι µηχανιστική.
Είναι όµως εντυπωσιακά καλό και Επεξεργαστής
πολλές φορές καλύτερο από τον κώδικα Κειµένου
µηχανής που θα έγραφε ένας
προγραµµατιστής. #include <iostream>
…
Απευθείας προγραµµατισµός σε γλώσ- int main ( ) {
σα µηχανής είναι εξαιρετικά δύσκολος. int width = 5;
int height = 10;
int area = width * height;
cout << “Area is “ <<
Δυαδικός Κώδικας area;
(Γλώσσα Μηχανής) Compiler return 0;
}
(π.χ. area.o) Πηγαίος κώδικας (area.cpp) 29
Συνδετής
Ένα πρόγραµµα µπορεί να χρησιµοποιεί
κοµµάτια κώδικα (βιβλιοθήκες) που έχουν
γραφτεί από άλλους (π.χ. µαθ. συναρτήσεις)
Ο συνδετής (linker) είναι ένα Επεξεργαστής
πρόγραµµα που συνδέει ένα ή Κειµένου
περισσότερα αρχεία (µεταγλωττισµένου)
µηχανικού κώδικα σε ένα εκτελέσιµο #include <iostream>
πρόγραµµα …
int main ( ) {
Linker Εκτελέσιµο int width = 5;
int height = 10;
(π.χ. area.exe) int area = width * height;
Library
Library cout << “Area is “ <<
Library
Δυαδικός Κώδικας area;
(Γλώσσα Μηχανής) Compiler return 0;
(π.χ. iostream.o) }
(π.χ. area.o) Πηγαίος κώδικας (area.cpp) 30
Διερµηνέας
Κάποιες γλώσσες προγραµµατισµού “π.χ.
Python) δεν έχουν µεταγλωττιστή, αλλά
διερµηνέα (interpreter).
Ο διερµηνέας µεταφράζει και εκτελεί ένα Επεξεργαστής
πρόγραµµα, εντολή προς εντολή Κειµένου
! "#$%
& ! 0- 12(+! +
# sample Python program ) 2" % . &3 &/+! +4
# computes the area of a ) . ’ 2) /&0
34
Τύποι Σφαλµάτων
n Συντακτικά λάθη (syntax errors)
n Λάθη κατά την εκτέλεση (run-time errors)
n Λογικά σφάλµατα
35
Συντακτικά λάθη
n Εντοπίζονται από το µεταγλωττιστή/διερµηνέα
ή τον συντακτικό αναλυτή (parser)
n Διορθώνονται εύκολα
Ανάπτυξη Προγράµµατος
n Βήµα 1: Σχεδιασµός
¡ Κατανόηση των απαιτήσεων (τι θέλουµε να κάνουµε;)
¡ Αναγνώριση της εισόδου και της επιθυµητής εξόδου του
προγράµµατος
¡ Σχεδιασµός ενός αλγορίθµου που λύνει το πρόβληµα
n Βήµα 2: Υλοποίηση
¡ Μετατροπή του αλγορίθµου στη γλώσσα προγραµµατισµού
¡ Μεταγλώττιση/Διερµηνεία για εντοπιστό τυχόν συντακτικών λαθών
¡ Εκτέλεση του προγράµµατος δίνοντας ως είσοδο δεδοµένα µε τα
οποία µπορούµε να ελεγξουµε τυχόν σφάλµατα κατα την εκτέλεση
και λογικά λάθη
39
Παράδειγµα
n Προδιαγραφές προβλήµατος:
Μία κατασκευαστική εταιρία παρέχει µια υπηρεσία δόµησης σκάλας µε
λίθινες ράβδους για τους πελάτες της. Υποθέστε ότι κάθε ράβδος έχει 30
εκ. ύψος και το κόστος µιας ράβδου είναι 10€. Ζητείται ένα πρόγραµµα
που να υπολογίσει το κόστος κατασκευής µιας σκάλας ύψους χ εκ.
ύψος 30 60 90
κόστος 10€ 20€ 30€
40
Παράδειγµα
n Προδιαγραφές προβλήµατος:
Μία κατασκευαστική εταιρία παρέχει µια υπηρεσία δόµησης σκάλας µε
λίθινες ράβδους για τους πελάτες της. Υποθέστε ότι κάθε ράβδος έχει 30
εκ. ύψος και το κόστος µιας ράβδου είναι 10€. Ζητείται ένα πρόγραµµα
που να υπολογίσει το κόστος κατασκευής µιας σκάλας ύψους χ εκ.
Ερώτηση:
Ποια είναι η είσοδος και η έξοδος
του προγράµµατος µας;
Απάντηση:
1) Ο χρήστης θα ορίσει το επιθυµητό
ύψος χ της σκάλας
2) Το κόστος κάθε ράβδου είναι 10€
3) Το ύψος κάθε ράβδου είναι 30 εκ. ύψος 30 60 90
4) Ζητούµενο (έξοδος) είναι το κόστος κόστος 10€ 20€ 30€
µιας σκάλας χ εκατοστών.
41
Παράδειγµα
n Προδιαγραφές προβλήµατος:
Μία κατασκευαστική εταιρία παρέχει µια υπηρεσία δόµησης σκάλας µε
λίθινες ράβδους για τους πελάτες της. Υποθέστε ότι κάθε ράβδος έχει 30
εκ. ύψος και το κόστος µιας ράβδου είναι 10€. Ζητείται ένα πρόγραµµα
που να υπολογίσει το κόστος κατασκευής µιας σκάλας ύψους χ εκ.
ΙΔΕΑ :
1) Διαιρώ το χ µε 30 για να πάρω το
ύψος υ της σκάλας σε ράβδους
2) Χρειάζοµαι 1+2+...+ υ ράβδους! ύψος 30 60 90
3) Το κόστος είναι (1+2+...+ υ)*10! κόστος 10€ 20€ 30€
42
Παράδειγµα
n Προδιαγραφές προβλήµατος:
Μία κατασκευαστική εταιρία παρέχει µια υπηρεσία δόµησης σκάλας µε
λίθινες ράβδους για τους πελάτες της. Υποθέστε ότι κάθε ράβδος έχει 30
εκ. ύψος και το κόστος µιας ράβδου είναι 10€. Ζητείται ένα πρόγραµµα
που να υπολογίσει το κόστος κατασκευής µιας σκάλας ύψους χ εκ.
Μπορούµε να κάνουµε το
πρόγραµµα πιο γρήγορο;
45
Πρότυπα Προγραµµατισµού
n Διαδικαστικός (Δοµηµένος) Προγραµµατισµός
¡ Πρόγραµµα σε µεταβλητές, δοµές, συναρτήσεις
¡ Pascal, C
n Αντικειµενοστρεφής Προγραµµατισµός
¡ Πρόγραµµα βασισµένο σε αντικείµενα
¡ C++, Java, Python
n Συναρτησιακός Προγραµµατισµός
¡ Πρόγραµµα σαν µαθηµατικές συναρτήσεις
¡ Lisp, Haskel, Erlang, Scala
n Λογικός Προγραµµατισµός
¡ Prolog 46
47
Γιατί Python;
n Εξαιρετικά δηµοφιλής γλώσσα
n Εύκολη και γρήγορη ανάπτυξη εφαρµογών
n Υπάρχει διαθέσιµος µεγάλος όγκος ελεύθερου
λογισµικού (προγράµµατα και βιβλιοθήκες)
n Χρησιµοποιείται και στην ανάπτυξη εµπορικών
εφαρµογών
n Μαθαίνοντάς την, µαθαίνουµε στοιχεία διαδικαστικού
και αντικειµενοστρεφούς προγραµµατισµού
48
Ο Διαδραστικός Διερµηνέας
n Μετά την εγκατάσταση, µπορούµε να «ανοίξουµε»
το διαδραστικό διερµηνέα (interactive interpreter)
¡ Μέσω του κελύφους, πληκτρολογώντας python3
¡ Τρέχοντας το πρόγραµµα IDLE
n Ο διερµηνέας σας επιτρέπει να εισάγετε εντολές
Python γραµµή-γραµµή, που εκτελούνται άµεσα.
Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 00:54:21)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "copyright", "credits" or "license()" for more information.
>>> WARNING: The version of Tcl/Tk (8.5.9) in use may be unstable.
Visit http://www.python.org/download/mac/tcltk/ for current information.
>>>
3
Εξοικείωση
n Μια πρώτη εντολή:
>>> print("Hello, world!")
Hello, world!
Αριθµητικές Πράξεις
>>> 2+2
µπορείτε να
4 χρησιµοποιήσετε την
Python σαν αριθµητήριο!
>>> 1/2
0.5
>>> 4/2
2.0
5
int και float
n Οι πραγµατικοί αριθµοί στις γλώσσες
προγραµµατισµού λέγονται «αριθµοί κινητής
υποδιαστολής» (floating-point numbers)
¡ int (integer, ακέραιος)
¡ float (floating-point number, πραγµατικός)
n Οι αριθµοί 3 και 5 είναι ακέραιοι.
n Οι αριθµοί 3.5 και 5.0 είναι αριθµοί κινητής
υποδιαστολής.
n Οι ακέραιοι µετατρέπονται σε floats κατ’ ανάγκην
2.5
>>> 5//2 ακέραια διαίρεση
2
>>> 5%2 υπόλοιπο
ακέραιας διαίρεσης
1
Ύψωση σε δύναµη
>>> 2**3
8
>>> -3**2
-9
>>> (-3)**2
9
9
Μη δεκαδικοί αριθµοί
n Το AF στο δεκαεξαδικό σύστηµα ισούται µε
10*16+15=175 στο δεκαδικό σύστηµα.
>>>0xAF
175
n To 10 στο οκταδικό σύστηµα ισούται µε
1*8+0=8 στο δεκαδικό σύστηµα.
>>>0o10 >>> 0b1001000101001
8 4649
10
>>> abs(-4)
4
>>> max(2,-5,6)
6
>>> min(2,-5,6)
-5
>>>pow(2,3)
8
>>>round(3.8)
4
11
Modules
n Επεκτείνουν την Python πέρα από τις βασικές
εντολές/συναρτήσεις της Το math είναι
module
>>> import math µεγαλύτερος
ακέραιος
>>> math.floor(3.5) µικρότερος ή
ισος του 3.5
3 συνάρτηση
>>> math.sqrt(9) τετραγωνικής
ρίζας
3.0
12
Module fraction
n Χειρισµός κλασµάτων
¡ Αν θέλουµε µεγαλύτερη ακρίβεια από floats
Το κλάσµα
>>> import fractions 3/4
>>> a = fractions.Fraction(3,4)
>>> b = fractions.Fraction(1,2)
>>> c = a+b
>>> c
Fraction(5, 4)
13
Module fraction
n Χειρισµός κλασµάτων
¡ Αν θέλουµε µεγαλύτερη ακρίβεια από floats
>>> 0.5**1075
0.0
>>> fractions.Fraction(1,2)**1075
Fraction(1,
404804506614621236704990693437834614099113299528284236713
802716054860679135990693783920767402874248990374155728633
623822779617474771586953734026799881477019843034848553132
722728933815484186432682479535356945490137124014966849385
397236206711298319112681620113024717539104666829230461005
064372655017292012526615415482186989568)
14
Δυαδικές Εκφράσεις
>>> 2<3
δεσµευµένες
True λέξεις στην Python
για δυαδικές εκφρασεις
>>> 3<2
False
>>> 5-1>2+1
True
15
Τελεστές Σύγκρισης Αριθµών
>>> 3 == 3
True
>>> 3+5 == 4+4
True
>>> 3 == 5-3
False
>>> 3 <= 4
True
>>> 3 > 5
False
>>> 3 != 5
True
16
Δυαδικοί Τελεστές
>>> 2 < 3 and 4 > 5
False
πίνακες αληθείας
>>> 3 < 5 and True
True
p not p p q p and p p q p or p
>>> 3 < 4 or 4 <3
True T F T T T T T T
>>> 3 < 2 and 2 < 1 F T T F F T F T
False
F T F F T T
>>> not (3 < 4)
False F F F F F F
17
Σχέση τύπων bool, int, float
n True = 1 και False = 0
n Μετατροπή τύπων µε bool(), int(), float()
>>> 5+True µετατροπή σε
True/False
6
>>> bool(5-5) όλοι οι αριθµοί εκτός του
0 µετατρέπονται σε True
False
>>> bool(3-2.8)
µετατροπή σε
True πραγµατικό
>>> float(False)
0.0 ακέραιο µέρος του 5.8
>>> int(4.8+True)
5
18
Μεταβλητές
απόδοση τιµής
<µεταβλητή> = <έκφραση>
>>> x=3
>>> x*2
6
>>> print(x*3)
9
19
Προσοχή!
>>> x=1
>>> y=x
>>> x=100
>>> y Η τιµή µιας µεταβλητής µετά
την αρχικοποίησή της είναι
1 ανεξάρτητη από τις άλλες
µεταβλητές!
20
Ποια η διαφορά;
Η έκφραση αυτή δεν θα κάνει
τίποτα σε ένα πρόγραµµα
>>> 2*3 Python
6 Η εντολή αυτή θα τυπώσει 6 σε
ένα πρόγραµµα Python
>>> print(2*3)
6
21
Απόδοση τιµής από το χρήστη
Αλλά...
Η συνάρτηση µετατροπής
περιµένει ακέραιο!
>>> x = int(input("x: "))
x: 4.5
Traceback (most recent call last):
File "<pyshell#64>", line 1, in <module>
x = int(input("x: "))
ValueError: invalid literal for int() with base 10: '4.5’
>>> x = float(input("x: "))
x: 4.5
>>> x
4.5 Αυτόµατη µετατροπή
>>> x = eval(input("x: "))
23
Ονόµατα Μεταβλητών
n Στα Αγγλικά!
n Επιτρεπτοί χαρακτήρες:
¡ A..Z, a..z, _, 0..9
¡ Μια µεταβλητή ΔΕΝ µπορεί να αρχίζει µε ψηφίο (0..9)
¡ π.χ. my_list, myList, mylist, _list, αλλά όχι 5list, list-3
n Διαλέγουµε ονόµατα που βγάζουν νόηµα
¡ π.χ. interestRate, tempVar
¡ θα βοηθήσουν άλλους να κατανοήσουν το πρόγραµµά µας
n ...και εµάς(!) για να το θυµηθούµε ή να το εκσφαλµατώσουµε
n ΔΕΝ χρησιµοποιούµε δεσµευµένα ονόµατα
(reserved keywords), π.χ. False, for, class
24
Αλφαριθµητικά
n Ακολουθίες χαρακτήρων κλεισµένες σε εισαγωγικά
¡ "Hello World" ή 'Hello World', αλλά όχι "Hello World’
25
Προσοχή!
>>> 'Let's go'
SyntaxError: invalid syntax
>>> "Let's go"
"Let's go"
>>> 'Let\'s go'
"Let's go"
26
Σύγκριση αλφαριθµητικών
>>> s = "hello"
>>> s == "hello"
True
>>> t = "world"
>>> s != t
True
>>> s == t
False µε βάση τη λεξικογραφική
σειρά!
>>> s < t
True
27
Πράξεις µε αλφαριθµητικά
28
>>> s = "hello"
>>> 'g' in s
False
>>> 'll' in s
True
>>> len(s)
5
29
Δεικτοδότηση αλφαριθµητικών
n Οι χαρακτήρες σε ένα αλφαριθµητικό
δεικτοδοτούνται
n Ο πρώτος χαρακτήρας είναι στη θέση 0, ο
δεύτερος στη θέση 1, κ.ο.κ.
>>> s = "hello"
>>> s[0]
'h'
>>> s[3]
'l'
>>> s[4]
'o'
30
Αρνητική δεικτοδότηση
n Μπορούµε να προσπελάσουµε τους χαρακτήρες
και από το τέλος
n Ο τελευταίος χαρακτήρας είναι στη θέση -1, ο
προτελευταίος στη θέση -2, κ.ο.κ.
>>> s = "hello"
>>> s[-1]
'o' θετικοί δείκτες 0 1 2 3 4
>>> s[-4] αρνητικοί δείκτες -5 -4 -3 -2 -1
'e' αλφαριθµητικό h e l l o
31
Μακρά Αλφαριθµητικά
n Αλφαριθµητικά που χρειάζονται πολλές γραµµές
(π.χ. κείµενα).
>>> print("Hello, \
World!")
Hello, World!
32
33
Οι µεταβλητές δεν έχουν τύπο
n Οι µεταβλητές είναι απλά ονόµατα για τα
αντικείµενα στα οποία αναφέρονται.
>>> s = "hello"
>>> type(s)
<class 'str'>
34
Προγράµµατα σε Python
n Μπορούµε να δηµιουργήσουµε ένα πρόγραµµα
και να το σώσουµε σε ένα αρχείο κειµένου.
n Μπορούµε να χρησιµοποιήσουµε οποιοδήποτε
επεξεργαστή κειµένου.
n Επεξεργαστές κειµένου για γλώσσες
προγραµµατισµού µας βοηθάνε στη συγγραφή
και παρέχουν λειτουργίες εκτέλεσης του
προγράµµατος.
n Ο επεξεργαστής κειµένου που έρχεται µε την
εγκατάσταση της Python ειναι το IDLE.
¡ Εναλλακτικά: UltraEdit, Crimson, emacs 35
Προγράµµατα σε Python
n Ένα αρχείο προγράµµατος Python πρόγραµµα
µπορεί να εκτελεστεί: εκτέλεσης
αρχείων Python
¡ Μέσω του IDLE
όνοµα
¡ Από το κέλυφος ή τη γραµµή διαταγών αρχείου
Python
width = int(input("Width: ")) Ø python3 area.py
length = int(input("Length: ")) Width: 3
area = width*legth
print("Area: ", area) Length: 4
Area: 12
Αρχείο (area.py)
Εκτέλεση στο κέλυφος
36
Σχόλια
n Τα προγράµµατα πρέπει να τεκµηριώνονται
¡ για να µπορεί κάποιος που θα διαβάσει τον κώδικά σας
να τον κατανοήσει
¡ για να θυµάστε εσείς ποιος είναι ο σκοπός ή το νόηµα
ενός µέρους του προγράµµατος
¡ η τεκµηρίωση διευκολύνει την εκσφαλµάτωση
n Σχόλια: οτιδήποτε ακολουθεί µια δίεση (#)
# this program computes the area of a rectangle
width = int(input("Width: ")) # ask the user to input the width
length = int(input("Length: ")) # ask the user to input the length
area = width*legth # compute the area
print("Area: ", area) # print the area
Αρχείο (area.py)
37
Λίστες και Πλειάδες
Δοµές δεδοµένων
n Μια δοµή δεδοµένων είναι µια δοµηµένη
(οργανωµένη) συλλογή στοιχείων (π.χ., ψηφίων,
χαρακτήρων, αριθµών, αλφαριθµητικών, κλπ.).
n Η πιο βασική δοµή στην Python είναι η ακολουθία.
n Κύριοι τύποι ακολουθιών:
¡ Λίστα (list)
¡ Πλειάδα (tuple)
¡ Αλφαριθµητικό (string)
n Βασική διαφορά µεταξύ λιστών και άλλων
ακολουθιών είναι ότι οι λίστες µπορούν να
µεταβληθούν 2
Χρήση ακολουθιών
n Η χρήση ακολουθιών στην Python είναι εκτενής
n Ορίζουµε και χρησιµοποιούµε ακολουθίες όταν
θέλουµε να διαχειριστούµε συλλογές δεδοµένων
n Π.χ. χρήση λιστών για τη δηµιουργία µιας βάσης
δεδοµένων µε ονόµατα και ηλικίες προσώπων:
>>>edward=['Edward Gumby', 42]
>>>john=['John Smith', 50]
>>>database=[edward, john]
>>>database
[['Edward Gumby', 42], ['John Smith', 50]]
Λίστες
n Μια λίστα ορίζεται σαν ακολουθία στοιχείων,
χωρισµένα από κόµµατα, εντός ενός [ και ενός ]
n Μια λίστα µπορεί να περιέχει στοιχεία διαφορετικών
τύπων
4
Προσπέλαση στοιχείων
n Τα στοιχεία µιας λίστας µπορούν να προσπελαστούν
κατ’ αντιστοιχία µε την προσπέλαση χαρακτήρων σε
ένα αλφαριθµητικό
n Το πρώτο στοιχείο στη θέση 0, το 2ο στη θέση 1,
κλπ.
n Επίσης: αρνητική δεικτοδότηση
>>> john[0]
'John Smith'
>>> database[-1]
['John Smith', 50]
6
Άλλες λειτουργίες σε λίστες
>>> 3 * john
['John Smith', 50, 'John Smith', 50, 'John Smith', 50]
Άσκηση
n Δίνεται µια λίστα µε λέξεις. Βρες τη µικρότερη και
τη µεγαλύτερη λέξη (σε λεξικογραφική σειρά)
>>> min(words)
'badmington'
>>> max(words)
'bat'
8
Κατάτµηση λιστών
n Κατάτµηση (slicing): Ένα τµήµα µιας λίστας
ορίζεται µε ένα διάστηµα θέσεων [x:y] σε αυτή
n Το x είναι η θέση του πρώτου στοιχείου και το y η
εποµένη της θέσης του τελευταίου που θέλουµε
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
>>> letters[3:6]
['d', 'e', 'f']
>>> letters[-3:-1]
µη έγκυρο διάστηµα
['h', 'i']
>>> letters[-3:0]
[]
9
Κατάτµηση λιστών
n To διάστηµα θέσεων [x:y] µπορεί να έχει ένα ή
και κανένα όριο
¡ Π.χ. αν δεν προσδιορίσουµε το πάνω όριο, τότε
εννοείται ότι θέλουµε µεχρι το τελευταίο στοιχείο
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
>>> letters[-3:]
['h', 'i', 'j']
>>> letters[:5]
['a', 'b', 'c', 'd', 'e']
>>> letters[:]
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
10
Άσκηση
n Δίνεται µια διαδικτυακή διεύθυνση (URL) του
τύπου http://www.something.com
n Ζητείται να υπολογίσουµε το domain (something)
Βήµα
n Στo διάστηµα θέσεων [x:y] µπορούµε να
ορίσουµε έναν τρίτο αριθµό (βήµα)
¡ ορίζει για καθε πόσα στοιχεία θα παίρνουµε ένα
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
>>> letters[0:7:2]
['a', 'c', 'e', 'g']
>>> letters[1::2]
['b', 'd', 'f', 'h', 'j']
>>> letters[::3]
['a', 'd', 'g', 'j'] αρνητικό βήµα
>>> letters[8:4:-2]
['i', 'g']
12
Δηµιουργία λίστας από
αλφαριθµητικό
n Η συνάρτηση list() προσφέρει έναν γρήγορο
τρόπο δηµιουργίας λίστας χαρακτήρων
>>> list('Hello')
['H', 'e', 'l', 'l', 'o']
>>> x=list('Hello')
>>> x
['H', 'e', 'l', 'l', 'o']
13
15
16
Αλλαγή τµηµάτων λίστας
n Μπορούµε να αλλάξουµε ολόκληρα τµήµατα
λιστών µε χρήση slicing
εισαγωγή στοιχείων χωρίς
>>> numbers = [1, 5] να διαγράψουµε τα
>>> numbers[1:1] = [2, 3, 4] υπάρχοντα
>>> numbers
[1, 2, 3, 4, 5] διαγραφή στοιχείων µέσα
στο διάστηµα θέσεων
>>> numbers[1:4] = []
>>> numbers
[1, 5]
17
19
>>> a = [1, 2, 3]
>>> b = a
>>> a.extend(b)
>>> a
[1, 2, 3, 1, 2, 3]
20
Μέθοδοι λίστών (pop)
n Η µέθοδος pop υπολογίζει ένα στοιχείο της λίστας
και ταυτόχρονα το διαγράφει από αυτή
αν δεν προσδιορίσουµε τη
>>> x = [1, 2, 3] θέση του στοιχείου η pop
>>> x.pop() θεωρεί ότι θέλουµε το
τελευταίο στοιχείο από τη
3 λίστα
>>> x
[1, 2]
>>> x.pop(0)
1
>>> x
[2]
21
22
Μέθοδοι λίστών (reverse)
n Η µέθοδος reverse αντιστρέφει τη σειρά των
στοιχείων της λίστας
>>> x=[1,2,3]
>>> x.reverse()
>>> x
[3, 2, 1] reversed(x): επιστρέφει τα
στοιχεία της λίστας x σε
>>> x=[1,2,3] αντίστροφη σειρά χωρίς να
>>> y=list(reversed(x)) αντιστρέφει την ίδια τη
>>> y λίστα x
[3, 2, 1]
>>> x
[1, 2, 3]
23
24
Μέθοδοι λίστών (sort)
n Άσκηση: Θέλουµε να αρχικοποιήσουµε µια νέα
λίστα µε τα περιεχόµενα της x ταξινοµηµένα, χωρίς
να πειράξουµε τη x
>>> x = [4, 6, 2, 1, 7, 9]
>>> y=x
>>> y.sort() λάθος τρόπος:
>>> y το πρόβληµα είναι ότι το y
αναφέρεται στην ίδια λίστα µε
[1, 2, 4, 6, 7, 9] το x (το y δεν είναι αντιγραφή
>>> x του x)
[1, 2, 4, 6, 7, 9]
25
26
Αντίστροφη ταξινόµηση
n Άσκηση: Ταξινόµησε τη λίστα x τοποθετώντας τα
στοιχεία από το µεγαλύτερο στο µικρότερο
>>> x = [4, 6, 2, 1, 7, 9]
>>> x.sort()
>>> x.reverse()
>>> x
[9, 7, 6, 4, 2, 1]
Μεταβλητές (ξανά!)
n Γενικά µια µεταβλητή αναφέρεται σε ένα
αντικείµενο (αριθµός, αλφαριθµητικό, λίστα, κλπ.)
>>> x = 5 x lst
>>> lst = [1,2,3,4]
5 [1,2,3,4]
28
Μεταβλητές (ξανά!)
n Υπάρχουν δύο τύποι αντικειµένων:
µεταβαλλόµενα και µη µεταβαλλόµενα
¡ µεταβαλλόµενα: λίστες
¡ µή µεταβαλλόµενα: αριθµοί, αλφαριθµητικά, πλειάδες
>>> x = 5 x lst
>>> lst = [1,2,3,4]
5 [1,2,3,4]
29
Μεταβλητές (ξανά!)
n Ο µόνος τρόπος να αλλάξουµε ένα
µη µεταβαλλόµενο αντικείµενο είναι να ορίσουµε
ένα νέο αντικείµενο για τη µεταβλητή µας
>>> x = 7 x lst
5 7 [1,2,3,4]
30
Μεταβλητές (ξανά!)
n Αντίθετα, µπορούµε να αλλάξουµε ένα
µεταβαλλόµενο αντικείµενο, χωρίς να χρειαστεί
να ορίσουµε νέο
[1,2,3,4]
7
31
Μεταβλητές (ξανά!)
n Αν εξισώσουµε 2 µεταβλητές, αυτές θα
αναφέρονται στο ίδιο αντικείµενο.
¡ Αν το αντικείµενο είναι µεταβαλλόµενο και αλλάξει, οι
τιµές και των δύο µεταβλητών αλλάζουν
32
Μεταβλητές (ξανά!)
n Αν εξισώσουµε 2 µεταβλητές, αυτές θα
αναφέρονται στο ίδιο αντικείµενο.
¡ Αν το αντικείµενο είναι µη µεταβαλλόµενο και
αλλάξουµε τη µία µεταβλητή, τότε αυτή θα αναφέρεται
σε άλλο αντικείµενο
>>> x = 5 y x
>>> y = x
>>> x = 7 5 7
>>> y
5
33
Μέθοδοι λίστών
n Οι λίστες είναι η κύρια δοµή δεδοµένων στην
Python.
n Υποστηρίζονται από µεγάλο αριθµό µεθόδων
>>> help(list)
Help on class list in module builtins:
class list(object)
| list() -> new empty list
| list(iterable) -> new list initialized from iterable's items
|
| Methods defined here:
…
34
Πλειάδες
n Οι πλειάδες (tuples) είναι ακολουθίες, όπως οι
λίστες, οι οποίες όµως δεν µπορούν να
αλλαχθούν
¡ Το ίδιο ισχύει και για τα αλφαριθµητικά (strings)
>>> x=1,2,3
>>> x
(1, 2, 3)
>>> x[2]
3
>>> x[2] = 5
Traceback (most recent call last):
File "<pyshell#212>", line 1, in <module>
x[2] = 5
TypeError: 'tuple' object does not support item assignment 35
Πλειάδες - αρχικοποίηση
το κόµµα στο τέλος
>>> x = 1, υπονοεί πλειάδα µε ένα
>>> x στοιχείο
(1,) x = 1 (χωρίς κόµµα) ορίζει
>>> x = tuple([1]) οτί το x είναι ακέραιος
>>> x αριθµός και όχι πλειάδα!
(1,)
>>> tuple([1, 2, 3])
(1, 2, 3)
>>> tuple('abc')
('a', 'b', 'c')
>>> tuple((1, 2, 3))
(1, 2, 3)
>>> z = tuple()
>>> z
()
36
Λειτουργίες σε Πλειάδες
n Ακριβώς όπως οι λειτουργίες σε λίστες (π.χ. slicing)
n Διαφορές
¡ Οι πλειάδες δεν µπορούν να αλλαχθούν
¡ Οι πλειάδες δεν έχουν όλες τις µεθοδους λιστών
n συγκεκριµένα: δεν έχουν τις µεθόδους που αλλάζουν τις λίστες
Γιατί πλειάδες;
n Αφου οι πλειάδες έχουν περιορισµένη
λειτουργικότητα σε σχέση µε τις λίστες, γιατί τις
χρησιµοποιούµε;
¡ Κάποιες λειτουργίες που θα δούµε αργότερα (π.χ.
κλειδιά σε λεξικό) υποστηρίζοντα µε πλειάδες
¡ Κάποιες συναρτήσεις επιστρέφουν το αποτέλεσµά τους
σε µορφή πλειάδων, οπότε πρέπει να ξέρουµε πως να
τις χειριστούµε
n Στη γενική περίπτωση στα προγράµµατα
χρησιµοποιούµε λίστες αντί για πλειάδες
38
Αλφαριθµητικά
Λειτουργίες σε αλφαριθµητικά
n Μπορούµε να εφαρµόσουµε όλες τις λειτουργίες
που έχουµε δει για πλειάδες και λίστες (π.χ.
slicing) σε αλφαριθµητικά
n Προσοχή!
¡ Τα αλφαριθµητικά δεν τροποποιούνται
Άλλες λειτουργίες
>>> s='Hello World'
>>> min(s)
''
>>> max(s)
'r'
>>> 'Hello' in s
True
>>> len(s)
11
>>> 'Hello'*2+'World'
'HelloHelloWorld'
4
Μέθοδοι Αλφαριθµητικών
>>> s='Hello Hello World' επιστρέφει το αλφαριθµητικό
>>> s.count('Hello') µετά την αντικατάσταση αλλά
2 δεν αλλάζει το αρχικό s
>>> s.replace('Hello','Bye') τα αλφαριθµητικά δεν
'Bye Bye World' τροποποιούνται!
>>> s.split()
['Hello', 'Hello', 'World']
>>> s = 'hello'
>>> s.capitalize()
'Hello'
>>> s.upper()
'HELLO'
5
Μέθοδοι Αλφαριθµητικών
επιστρέφει τη θέση της
>>> s='Hello Hello World'
πρώτης εµφάνισης του
>>> s.find('Hello') ‘Hello’ στο s
0 άρχισε να ψάχνεις από τη
>>> s.find('Hello',1) θέση 1 και µετά
6
δηλώνει ότι το ‘Help’ δεν
>>> s.find('Help') υπάρχει στο s
-1
>>> seq = ['1', '2', '3', '4', '5']
>>> sep = '+' συνένωση των στοιχείων της
λίστας seq σε ένα
>>> sep.join(seq) αλφαριθµητικό
'1+2+3+4+5'
6
Που είναι το λάθος;
ΟΛΑ τα στοιχεία της
>>> seq = ['1', '2', '3', '4', 5] λίστας πρέπει να είναι
>>> sep = '+’ αλφαριθµητικά!
>>> sep.join(seq)
Traceback (most recent call last):
File "<pyshell#106>", line 1, in <module>
sep.join(seq)
TypeError: sequence item 4: expected str instance, int
found
8
string formating
n Χρησιµοποιείται στον ορισµό η τύπωση
(στοιχισµένων) αλφαριθµητικών µε διαφόρους
τύπους δεδοµένων
δηλώνει µετατροπή σε αλφαριθµητικό
>>> '%s plus %s equals %s' % (1, 1, 2)
'1 plus 1 equals 2'
>>> from math import pi
>>> 'Pi: %f...' % pi δηλώνει µετατροπή σε float
'Pi: 3.141593...' δηλώνει µετατροπή
>>> 'Very inexact estimate of pi: %i' % pi σε int
'Very inexact estimate of pi: 3'
Παραδείγµατα
>>> x=1234.5678
>>> print(x)
1234.5678
>>> print('%d' % x)
1234
>>> print('%10d' % x)
1234
>>> print('%s' % x)
1234.5678
>>> print('%10s' % x)
1234.5678
12
Παραδείγµατα
>>> x=1234.5678
>>> print('%9.4f' % x)
1234.5678
>>> print('%10.4f' % x)
1234.5678
>>> print('%10.3f' % x)
1234.568
>>> print('%10.5f' % x)
1234.56780
13
Παράδειγµα: τύπωµα
τιµοκαταλόγου
# Print a formatted price list with a given width
width = int(input('Please enter width: '))
price_width = 10
item_width = width - price_width
header_format = '%-*s%*s'
fformat = '%-*s%*.2f'
print ('=' * width)
print (header_format % (item_width, 'Item', price_width, 'Price'))
print ('-' * width)
print (fformat % (item_width, 'Apples', price_width, 0.4))
print (fformat % (item_width, 'Pears', price_width, 0.5))
print (fformat % (item_width, 'Cantaloupes', price_width, 1.92))
print (fformat % (item_width, 'Dried Apricots (16 oz.)', price_width, 8))
print (fformat % (item_width, 'Prunes (4 lbs.)', price_width, 12))
print ('=' * width)
14
Παράδειγµα: τύπωµα
τιµοκαταλόγου
Please enter width: 40
========================================
Item Price
----------------------------------------
Apples 0.40
Pears 0.50
Cantaloupes 1.92
Dried Apricots (16 oz.) 8.00
Prunes (4 lbs.) 12.00
========================================
15
Αλφαριθµητικές σταθερές
>>> import string χρήση του string module
>>> string.digits
'0123456789'
>>> string.printable
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGH
IJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\
\]^_`{|}~ \t\n\r\x0b\x0c'
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
>>> '5' in string.digits
True
16
Αλφαριθµητικές σταθερές
n string.digits A string containing the digits 0–9
n string.letters A string containing all letters (upper- and
lowercase)
n string.lowercase A string containing all lowercase letters
n string.printable A string containing all printable characters
n string.punctuation A string containing all punctuation
characters
n string.uppercase A string containing all uppercase letters
17
Λεξικά
Γιατί Λεξικά;
n Στις ακολουθίες (π.χ. λίστες, αλφαριθµητικά)
µπορούµε να αναφερόµαστε σε ένα στοιχείο µε
τον αριθµητικό δείκτη του (π.χ. database[1], s[4])
n Κάποιες φορές βολεύει να αναφερόµαστε σε ένα
στοιχείο ή να ψάχνουµε ένα στοιχείο µε το όνοµά
του (π.χ. database['John'])
n Τα λεξικά µας δίνουν αυτή τη δυνατότητα
¡ Ανάλογο της χρήσης λεξικού στην καθηµερινή µας ζωή
Λεξικά
n Το λεξικό είναι µια συλλογή ζευγών
n Κάθε ζεύγος περιέχει ένα κλειδί και µια τιµή
¡ Χρησιµοποιούµε τα κλειδιά για να ψάξουµε ή να
αναφερθούµε στις τιµές
¡ π.χ. κλειδί = όνοµα λέξης, τιµή = ορισµός λέξης
¡ π.χ. κλειδί = όνοµα, τιµή = τηλέφωνο χωρίζει κλειδί από τιµή
>>> phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
>>> phonebook['Beth'] δεν είµαστε
'9102' υποχρεωµένοι να
εισάγουµε τα κλειδιά σε
λεξικογραφική σειρά
3
Μοναδικότητα κλειδιών
n Τα κλειδιά είναι µοναδικά σε ένα λεξικό
¡ δεν µπορεί δύο ζεύγη να έχουν τα ίδια κλειδιά
n Οι τιµές δεν χρειάζεται να είναι µοναδικές
χρήση τελευταίου κλειδιού
5
Άλλη χρήση της dict()
n Η συνάρτηση dict µπορεί να πάρει ως είσοδο και
µια σειρά από στοιχεία τύπου κλειδί=τιµή
>>> d = dict(name='Gumby', age=42)
>>> d
{'age': 42, 'name': 'Gumby'}
για κλειδιά τύπου
αλφαριθµητικού µόνο!
Βασικές λειτουργίες
>>> d = dict(name='Gumby', age=42)
>>> len(d)
2
>>> d['age']
42
>>> d['something']
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
d['something']
KeyError: 'something' True, αν υπάρχει
>>> 'something' in d εγγραφή στο d µε
False κλειδί ‘something’
>>> d['age']=43
>>> del d['age'] εισάγει νέα εγγραφή αν δεν υπάρχει το
>>> d['something']='I don\'t know’ κλειδί, αλλιώς την αλλάζει
7
Ειδικά χαρακτηριστικά
n Τα κλειδιά πρέπει να είναι µη µεταβαλλόµενου
τύπου (δεν µπορεί να είναι λίστες)
n Όταν ορίζουµε µια τιµή για ένα κλειδί, το ζευγάρι
(κλειδί, τιµή) εισάγεται στο λεξικό αν δεν υπάρχει
ήδη το κλειδί
¡ δεν γίνεται έτσι µε τις λίστες
>>> lst = ['a','b','c']
>>> lst[3] = 'd'
Traceback (most recent call last):
File "<pyshell#37>", line 1, in <module>
lst[3] = 'd'
IndexError: list assignment index out of range 8
Ειδικά χαρακτηριστικά
n Η εύρεση (π.χ. τελεστής in) γίνεται µε βάση το
κλειδί
n Η εύρεση σε µεγάλα λεξικά είναι γρηγορότερη από
την εύρεση σε µεγάλες λίστες
¡ δεικτοδότηση (indexing) µέσω κατακερµατισµού
(hashing)
n Στα λεξικά, τα στοιχεία κλειδιών-τιµών δεν έχουν
κάποια συγκεκριµένη σειρά
¡ τα λεξικά είναι αταξινόµητα σύνολα, τα στοιχεία των
λιστών/πλειάδων είναι σε συγκεκριµένη σειρά
9
Formatting µε χρήση λεξικού
κλειδί λεξικό
>>> phonebook
{'Beth': '9102', 'Cecil': '3258', 'Alice': '2341'}
>>> "Cecil's phone number is %(Cecil)s." % phonebook
"Cecil's phone number is 3258."
>>> "Cecil's phone number is %s." % phonebook['Cecil']
"Cecil's phone number is 3258."
10
Η µέθοδος clear
n Καθαρίζει το λεξικό από τα περιεχόµενά του
>>> d = {}
>>> d['name'] = 'Gumby’
>>> d['age'] = 42
>>> d
{'age': 42, 'name': 'Gumby'}
>>> d.clear()
>>> d
{}
11
Γιατί όχι αρχικοποίηση;
>>> x = {} >>> x = {}
>>> y = x >>> y = x
>>> x['key']='value' >>> x['key']='value'
>>> y >>> y
{'key': 'value'} {'key': 'value'}
>>> x = {} >>> x.clear()
>>> y >>> y
{'key': 'value'} {}
12
Η µέθοδος copy
n Αντιγράφει το λεξικό σε ένα άλλο λεξικό
¡ ρηχή αντιγραφή: τα αντικείµενα δεν αντιγράφονται
13
Η µέθοδος copy
n Αντιγράφει το λεξικό σε ένα άλλο λεξικό
¡ ρηχή αντιγραφή: τα αντικείµενα δεν αντιγράφονται
x = {'username': 'admin', x y
'machines': ['zeus','gaia']}
'username' 'machines' 'username' 'machines'
y = x.copy()
'admin' ['zeus','gaia'] 'user1'
y['username']='user1'
y['machines'].remove('gaia')
Η συνάρτηση deepcopy
n Αντιγράφει το λεξικό σε ένα άλλο λεξικό
¡ πλήρης αντιγραφή: τα αντικείµενα αντιγράφονται
16
Η µέθοδος get
n Ψάχνει και επιστρέφει µια τιµή µε βάση το κλειδί,
ενώ επιστρέφει «None» αν το κλειδί δεν υπάρχει
>>> d ={'John': '3456'}
>>> d['Paul']
Traceback (most recent call last):
File "<pyshell#145>", line 1, in <module>
d['Paul']
KeyError: 'Paul’
>>> print(d.get('Paul')) ειδική τιµή: σηµαίνει
None «τίποτα»
>>> print(d.get('John'))
3456
17
Η µέθοδος get
n Ψάχνει και επιστρέφει µια τιµή µε βάση το κλειδί,
ενώ επιστρέφει «None» αν το κλειδί δεν υπάρχει
>>> d ={'John': '3456'} αντικαθιστά το None, σε
>>> print(d.get('Paul','N/A')) περίπτωση που δεν
υπαρχει το κλειδί ‘Paul’
N/A
>>> d = dict.fromkeys(['name', 'age'])
>>> print(d.get('name'))
None
>>> print(d.get('Paul','N/A')) το ‘Paul’ δεν υπάρχει
N/A
>>> print(d.get('name','N/A')) το ‘name’ υπάρχει!
None
18
Η µέθοδος has_key
n Επιστρέφει True αν το κλειδί που παίρνει για
όρισµα υπάρχει στο λεξικό, αλλίως False
>>> d = {}
>>> d.has_key('name')
False
>>> d['name'] = 'Eric'
>>> d.has_key('name')
True
19
Η µέθοδοi items, keys και
values
n items: Επιστρέφει όλα τα ζευγάρια του λεξικού σε µια λίστα
(χωρίς κάποια συγκεκριµένη σειρά)
n keys: Επιστρέφει όλα τα κλειδιά του λεξικού σε µια λίστα
(χωρίς κάποια συγκεκριµένη σειρά)
n values: Επιστρέφει όλες τις τιµές του λεξικού σε µια λίστα
(χωρίς κάποια συγκεκριµένη σειρά)
22
Η µέθοδος update
n Εισάγει σε ένα λεξικό τα περιεχόµενα ενός άλλου.
Τυχόν υπάρχουντα κλειδιά, ενηµερώνονται.
23
Διάφορες Λειτουργίες
Τύπωµα µε κόµµατα
n Η συνάρτηση print µπορεί να πάρει µια σειρά
από ορίσµατα χωρισµένα µε κόµµατα
n Η print αφήνει ένα κενό µεταξύ των τυπωµένων
ορισµάτων
>>> x = 10
>>> print("x =", x) δεν επιτρέπεται πρόσθεση αριθµού σε
x = 10 αλφαριθµητικό
>>> print("x = "+x)
Traceback (most recent call last):
File "<pyshell#232>", line 1, in <module>
print("x = "+x)
TypeError: Can't convert 'int' object to str implicitly 2
Modules, ξανά
n Η συνάρτηση import επιτρέπει τη χρήση
συναρτήσεων από modules
>>> import math
>>> math.sqrt(4)
2.0
>>> from math import sqrt
>>> sqrt(4) ΟΛΕΣ τις συναρτήσεις και σταθερές
2.0 από τη math
>>> from math import *
>>> sqrt(pi)
1.7724538509055159
Αλυσιδωτές αναθέσεις
n Αναθέσεις ίδιων τιµών σε πολλές µεταβλητές σε
µία γραµµή
>>> x = y = max(2,15,4)
>>> x
15
>>> y Το ίδιο µε:
15 y = max(2,15,4)
x=y
6
Ανάθεση µε βάση
προηγούµενη τιµή
n Οι τελεστές +,*,/,%,κλπ. µπορούν να
χρησιµοποιηθούν σαν +=,*=,κλπ. αν παίρνουµε τις
τιµές από την ίδια µεταβλητή
>>> x=1
>>> x+=1 Το ίδιο µε:
>>> x x = x+1
2
>>> fnord = 'foo'
>>> fnord += 'bar'
>>> fnord *= 2
>>> fnord
'foobarfoobar'
7
Διαγράµµατα Ροής
n Τρόπος σχεδιασµού ενός αλγορίθµου
¡ Ο αλγόριθµος είναι το σχέδιο του προγράµµατος
n Βασικά µέρη ενός διαγράµµατος ροής
no
temp > 30
print(x)
yes
3
Έλεγχος ροής µε if
n if δυαδική έκφραση :
µπλοκ εντολών οι εντολές στο
temp = eval(input('Enter the current temperature: ')) µπλοκ είναι
if temp > 25: στοιχισµένες
print('It is hot!') 4 θέσεις δεξιά
print('Be sure to drink liquids.')
yes
temp > 25
no print('It is hot!')
Έλεγχος ροής µε if
n if δυαδική έκφραση :
µπλοκ εντολών
temp = eval(input('Enter the current temperature: '))
if temp > 25: µετά το µπλόκ,
print('It is hot!') εκτελείται
print('Be sure to drink liquids.') ανεξάρτητα από
print('Goodbye!') την έκβαση της if
yes
temp > 25
no print('It is hot!')
print('Goodbye!') 5
Έλεγχος ροής µε if/else
n if δυαδική έκφραση :
µπλοκ εντολών
else :
µπλοκ εντολών
no yes
temp > 25
print('It is not hot.') print('It is hot!')
print('Goodbye!')
7
Έλεγχος ροής µε if/elif/else
n if δυαδική έκφραση :
µπλοκ εντολών
elif δυαδική έκφραση :
µπλοκ εντολών
else :
µπλοκ εντολών
x > 0
yes
no print('The number is positive')
yes
x < 0
print('The number is negative') no
yes yes
x > 0
x > 1000
no no
yes print('A large positive number')
x < 0
print('The number is negative') no print('The number is positive')
print('The number is zero')
10
Συγκρίσεις
12
Λεξικογραφική σειρά
13
Παραδείγµατα
name = input('What is your name? ')
if 's' in name:
print('Your name contains the letter "s".')
else:
print('Your name does not contain the letter "s".')
14
Παραδείγµατα
number = int(input('Enter a number between 1 and 10: '))
if number <= 10:
if number >= 1:
print('Great!')
else:
print('Wrong!')
else:
print('Wrong!')
15
Παραδείγµατα (and, or, not)
number = int(input('Enter a number between 1 and 10: '))
if number>=1 and number<=10:
print('Great!')
else:
print('Wrong!')
το ίδιο µε:
>>> y=0
if y>1:
>>> x = 5 if y>1 else 0
x=5
>>> x
else:
0
x=0
17
Άσκηση
n Τί πρόβληµα έχει ο παρακάτω κώδικας;
Άσκηση
n Είσοδος: ένας αριθµός από το 1 ως το 4
n Έξοδος: τύπωσε ‘John’ αν είναι 1, ‘Paul’ αν είναι 2,
‘Maria’ αν είναι 3, ‘Sue’ αν είναι 4
c = int(input('Please input a number between 1 and 4: '))
if c == 1:
print('John')
elif c == 2:
print('Paul')
elif c == 3:
print('Maria')
elif c == 4:
print('Sue')
19
Άσκηση
n Είσοδος: ένας αριθµός από το 1 ως το 4
n Έξοδος: τύπωσε ‘John’ αν είναι 1, ‘Paul’ αν είναι 2,
‘Maria’ αν είναι 3, ‘Sue’ αν είναι 4
n Χωρίς να χρησιµοποιήσετε if !
d = {1:'John',2:'Paul',3:'Maria',4:'Sue'}
c = int(input('Please input a number between 1 and 4: '))
print(d[c])
20
Επαναλήψεις (loops)
n Στα προγράµµατά µας µπορεί να θέλουµε να
τρέξουµε την ίδια σειρά εντολών πολλές φορές
¡ µε πιθανές παραµετροποιηµένες µικροαλλαγές σε κάθε
επανάληψη
¡ είτε γνωρίζοντας πόσες φορές (for) είτε ενόσω µια
συνθήκη είναι αληθής (while)
x=1
no yes
x <= 100
print(x)
x=x+1
21
Ο βρόγχος while
n Eνόσω η συνθήκη είναι αληθής εκτελείται το
µπλοκ εντολών που είναι στοιχισµένες κάτω της
x =1
while x <= 100:
print(x)
x += 1
κενό αλφαριθµητικό
True, αν το name
name = '' είναι κενό
while not name:
name = input('Please enter your name: ')
print('Hello, %s!' % name)
Αν θέλουµε το διάστηµα ' ' να µην είναι αποδεκτό σαν όνοµα, βάζουµε:
while not name or name.isspace() ή while not name.strip() 22
Ο βρόγχος for
n Χρησιµοποιείται αν θέλουµε να επαναλάβουµε ένα
µπλοκ κώδικα, για κάθε τιµή ενός συνόλου
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for x in numbers:
print(x)
24
Άσκηση
n Τύπωσε τους ζυγούς αριθµούς µέχρι το 10
for x in range(0,11,2):
print(x)
25
Άσκηση
n Δίνεται µια λίστα lst αριθµών. Βρές το γινόµενό
τους
lst = [3,4,6,5]
prod = 1
for x in lst: το ίδιο µε
prod *= x prod = prod*x
print(prod)
26
Επαναλήψεις σε λεξικά
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
print(key, 'corresponds to', d[key])
z corresponds to 3
y corresponds to 2
n Εναλλακτικά: x corresponds to 1
d = {'x': 1, 'y': 2, 'z': 3}
for key, value in d.items():
print(key, 'corresponds to', value)
27
Παράλληλες επαναλήψεις
names = ['anne', 'beth', 'george', 'damon']
ages = [12, 45, 32, 102] range(4)=range(0,4)
for i in range(len(names)):
print (names[i], 'is', ages[i], 'years old')
28
anne 12 3 4
beth 45 45 3
30
31
While True µε break
n Όταν θέλουµε να βγούµε από το βρόγχο ακριβώς
µόλις ικανοποιηθεί µια συνθήκη εξόδου, χωρίς να
εκτελέσουµε τις υπόλοιπες εντολές του βρόγχου
πάντα αληθές
while True:
x = int(input("How many states are in the U.S.? "))
if x == 50:
print("Correct! There are 50 states in the U.S.")
break;
else:
print("The answer is NOT correct!"
µόνη πιθανή έξοδος
32
33
While True µε break
while True:
x = int(input("How many states are in the U.S.? "))
if x == 50:
print("Correct! There are 50 states in the U.S.")
break;
else:
print("The answer is NOT correct!")
34
35
While True µε break
while True:
x = int(input("How many states are in the U.S.? "))
if x == 50:
print("Correct! There are 50 states in the U.S.")
break;
else:
print("The answer is NOT correct!")
36
37
While True µε break
while True:
x = int(input("How many states are in the U.S.? "))
if x == 50:
print("Correct! There are 50 states in the U.S.")
break;
else:
print("The answer is NOT correct!")
38
39
While True µε break
while True:
x = int(input("How many states are in the U.S.? "))
if x == 50:
print("Correct! There are 50 states in the U.S.")
break;
else:
print("The answer is NOT correct!")
40
41
While True µε break
while True:
x = int(input("How many states are in the U.S.? "))
if x == 50:
print("Correct! There are 50 states in the U.S.")
break;
else:
print("The answer is NOT correct!")
42
43
While True µε break
while True:
x = int(input("How many states are in the U.S.? "))
if x == 50:
print("Correct! There are 50 states in the U.S.")
break;
else:
print("The answer is NOT correct!")
while True:
x = int(input("How many states are in the U.S.? "))
if x == 50:
print("Correct! There are 50 states in the U.S.")
break;
print("The answer is NOT correct!"
46
Άσκηση
n Γράψε το ίδιο πρόγραµµα χωρίς χρήση break
while True:
x = int(input("How many states are in the U.S.? "))
if x == 50:
print("Correct! There are 50 states in the U.S.")
break;
print("The answer is NOT correct!"
x=0
while x !=50 :
x = int(input("How many states are in the U.S.? "))
if x !=50 :
print("The answer is NOT correct!")
print("Correct! There are 50 states in the U.S.")
47
Άσκηση
n Δίνεται µια λίστα lst. Γράψε ένα πρόγραµµα που
να ελέγχει αν η λίστα είναι ταξινοµηµένη
lst = [3,4,6,5,7]
βοηθητική
is_sorted = True µεταβλητή
for i in range(0,len(lst)-1): έλεγχος αν
if lst[i] > lst[i+1]: υπαρχει στοιχείο
print('list',lst, 'is not sorted!') µεγαλύτερο από
is_sorted = False
το επόµενο
break
if is_sorted:
print('list' , lst , 'is sorted!')
48
0 0!
0 1! Δες το στο http://pythontutor.com/visualize.html
1 0!
1 1!
2 0!
2 1!
49
Η εντολή continue
n Τερµατίζει την τρέχουσα επανάληψη και πάει στην
επόµενη
n Παράδειγµα: τύπωσε όλους τους χαρακτήρες ενός
αλφαριθµητικού, εκτός από τα φωνήεντα
50
51
Σύνθεση λίστας µε for/if
52
Η εντολή pass
53
Άσκηση
for i in range(10):
if i % 2 == 0:
pass
else:
print(i)
for i in range(10):
pass
else:
print('ok')
54
Η συνάρτηση enumerate
n Για κάθε στοιχείο µιας ακολουθίας (λίστας,
πλειάδας, κλπ.), επιστρέφει το στοιχείο και ένα
δείκτη στη θέση του.
n Π.χ. τύπωσε τα διακριτά στοιχεία µιας λίστας
lst = [1,2,4,5,6,3,2,3,6,2,6,3,2]
lst2 = []
for idx,elem in enumerate(lst):
if elem not in lst[0:idx]: Αν δεν εµφανίζεται στα
lst2.append(elem) προηγούµενα
print(lst2)
[1, 2, 4, 5, 6, 3]
55
Σηµαντικό!
56
Εισαγωγή στον Προγραµµατισµό
Σύντοµες Σηµειώσεις
Γιώργος Μανής
Νοέµβριος 2012
Αλγόριθµοι και Λογικά
∆ιαγράµµατα
1
ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΛΟΓΙΚΑ ∆ΙΑΓΡΑΜΜΑΤΑ 2
τικές ϱίζες, τότε τυπώνεται ένα µήνυµα που µας ειδοποιεί ότι δεν υπάρχουν
πραγµατικές ϱίζες.
Είσοδος στοιχείων απαιτείται κατά την εκκίνηση του προγράµµατος όπου
και Ϲητείται το τριώνυµο, οι συντελεστές α, ϐ και γ δηλαδή. ΄Ετσι, στην αρχή
του λογικού διαγράµµατος υπάρχουν τρία πλάγια παραλληλόγραµµα. Για να
είναι το πρόγραµµα ϕιλικό στο χρήστη πριν από κάθε ερώτηση για τις τιµές
των α, ϐ και γ πρέπει να τυπώνεται ένα µήνυµα στην οθόνη που να πληροφορεί
το χρήστη τι ακριβώς πρέπει να κάνει. Συνεπώς, πριν από κάθε πλάγιο πα-
ϱαλληλόγραµµο για την εισαγωγή µίας τιµής πρέπει να υπάρχει και ένα άλλο
πλάγιο παραλληλόγραµµο που να τυπώνει ένα µήνυµα της µορφής : ¨∆ώσε
µου το συντελεστή α :¨, ή ¨∆ώσε µου το συντελεστή ϐ:¨ ή ¨∆ώσε µου το συν-
τελεστή γ:¨, αντίστοιχα. Στο τέλος του προγράµµατος πρέπει να τυπώνεται το
αποτέλεσµα. ΄Ετσι, σε κάποιο σηµείο του λογικού µας διαγράµµατος πρέπει
να υπάρχουν τα κατάλληλα πλάγια παραλληλόγραµµα για τα αποτελέσµατα :
¨Το τριώνυµο δεν έχει πραγµατικές ϱίζες¨ και ¨Το τριώνυµο έχει µία πραγ-
µατική διπλή ϱίζα την :¨ και ¨Το τριώνυµο έχει δύο πραγµατικές ϱίζες τις :¨.
Επίσης, αν διαπιστωθεί ότι η εξίσωση είναι πρωτοβάθµια πρέπει να τυπωθεί το
κατάλληλο µήνυµα ¨Η εξίσωση είναι πρωτοβάθµια¨ (Αν και αυτό µαθηµατικά
ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΛΟΓΙΚΑ ∆ΙΑΓΡΑΜΜΑΤΑ 5
Σχήµα 5: ∆ιάγραµµα ϱοής για την εύρεση του µέγιστου τριών αριθµών
και όσες γλώσσες έχουν προκύψει από αυτήν Ϲητούνται στην αγορά εργασίας.
΄Ισως είναι λίγο νωρίς να µπούµε από τώρα στα ϐαθιά. Θα αναζητήσουµε τον
κοινό παρονοµαστή όλων των γλωσσών προγραµµατισµού που ανήκουν στην
κατηγορία των γλωσσών του δοµηµένου προγραµµατισµού (όσο αυτό ϐέβαια
είναι δυνατό), και ϑα διδακτούµε αυτό. Σαν ϐάση, λοιπόν, ϑα χρησιµοποι-
ήσουµε τη γλώσσα Python αλλά σκοπός µας δεν είναι να µάθουµε Python
και να εµβαθύνουµε σε αυτή, αλλά να τη χρησιµοποιήσουµε ως µέσο για να
µάθουµε αυτό που καλείται δοµηµένος προγραµµατισµός.
Έλεγχος Ροής - Παραδείγµατα
Δίσεκτο έτος
n Ένα έτος είναι δίσεκτο αν διαιρείται ακριβώς µε το
400 ή διαιρείται ακριβώς µε το 4 και δεν διαιρείται
ακριβώς µε το 100
n Υπολογίστε αν ένα δοθέν έτος είναι δίσεκτο
2
ln(2) – συγκλίνον άθροισµα
n Ο φυσικός λογάριθµος του 2 µπορεί να X ∞
(−1)k+1
υπολογιστεί µε την εξίσωση: ln 2 =
k
n ln(2) = 1/1 – 1/2 + 1/3 – 1/4 =… k=1
from math import log
print('computes ln(2) up to a given accuracy’) log(): φυσικός
error = float(input('allowed error = ')) λογάριθµος
sum=0 log(x,base)=
previous=1000 #a very large integer log(x)/log(base)
sign=-1
i=1
while abs(sum-previous)>error:
previous=sum
sign=sign*(-1)
sum=sum+sign/float(i)
i=i+1
print('%f %f %10.8f’ % (sum, log(2), abs(sum-log(2)))) 3
Προπαίδεια του 7
n Τύπωσε στοιχισµένα την προπαίδεια του 7
6
Δέντρο από αστεράκια
n Τυπώστε ένα δέντρο από αστεράκια µε ύψος x
Ύψωση σε δύναµη: xy
x = int(input('Input base: '))
y = int(input('Input power: '))
value = 1
for i in range(0, y):
value *= x
print('%d to the power of %d = %d' % (x, y, value))
8
Παραγοντικό: x!
n x! = 1*2*3*…*x
x = int(input('Input a number: '))
f=1
for i in range(1,x+1):
f *= i
print('%d! = %d' % (x,f))
Υπολογισµός αθροίσµατος
ψηφίων ακέραιου αριθµού
n x = 4579, dsum = 4+5+7+9 = 25
n = int(input('Input a number: '))
dsum = 0
while n>0:
dsum += n%10
n//=10
print('The sum of the number\'s digits is', dsum)
11
Υπολογισµός τυπικής
απόκλισης
1 N −1
n a = [4,5,7,9], µ = (4+5+7+9)/4, σ = ∑
N i =0
(a[i] − µ ) 2
12
Άσκηση: άθροισµα ζυγών
n Δίνεται µια λίστα αριθµών. Βρές το άθροισµα των
ζυγών στη λίστα
s = input('Input a set of numbers separated by commas: ')
a = [int(x) for x in s.split(",")]
esum = 0
for x in a:
if x%2 ==0:
esum = esum + x
print("The sum is: ", esum)
Άσκηση
n Δίνονται δύο λίστες αριθµών. Υπολόγισε µια νέα
λίστα που περιέχει το γινόµενο όλων των ζευγών
από τις 2 λίστες
¡ Π.χ. L1 = [3,4,5], L2 = [1,2], L3 = [3,6,4,8,5,10]
s1 = input('Input a set of numbers separated by commas: ')
L1 = [int(x) for x in s1.split(",")]
s2 = input('Input a set of numbers separated by commas: ')
L2 = [int(x) for x in s2.split(",")]
L3 = []
for x in L1:
for y in L2:
L3.append(x*y)
print(L3)
14
Ορισµός και χρήση πινάκων
n Μπορούµε να χρησιµοποιήσουµε λίστες ως
πίνακες
¡ Μπορούµε να χρησιµοποιήσουµε και πλειάδες
¡ Ποια η διαφορά; µονοδιάστατος πίνακας:
A = [4 5 6 7]
>>> A = [4,5,6,7] προσπέλαση του Αi µε A[i]
>>> A[2] δισδιάστατος πίνακας:
6
1 2 3
>>> B = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] B = 4 5 6
>>> B[2][1] 7 8 9
8
προσπέλαση του Bij µε B[i][j]
15
16
Πρόσθεση πινάκων
n Πρόσθεση δύο πικάνων διαστάσεων N x M
N=M=2
A = [[0.0 for j in range(M)] for i in range(N)]
B = [[0.0 for j in range(M)] for i in range(N)] 1 2 5 6 6 8
C = [[0.0 for j in range(M)] for i in range(N)] + =
for i in range(N):
3 4 7 8 10 12
for j in range(M):
A[i][j] = float(input('A[%d][%d]: ' % (i, j)))
for i in range(N):
for j in range(M):
B[i][j] = float(input('B[%d][%d]: ' % (i, j)))
for i in range(N):
for j in range(M):
C[i][j] = A[i][j] + B[i][j]
for i in range(N):
for j in range(M):
print('C[%d][%d]:%7.2f ' % (i, j, C[i][j]), end = '')
print('')
17
Πολλαπλασιασµός πινάκων
NxN
N=2
A = [[0.0 for j in range(N)] for i in range(N)]
B = [[0.0 for j in range(N)] for i in range(N)]
C = [[0.0 for j in range(N)] for i in range(N)]
for i in range(N):
for j in range(N):
A[i][j] = float(input('A[%d][%d]: ' % (i, j)))
for i in range(N):
for j in range(N):
B[i][j] = float(input('B[%d][%d]: ' % (i, j)))
for i in range(N):
for j in range(N):
for k in range(N):
1 2 5 6 19 22
× =
C[i][j] += A[i][k]*B[k][j] 3 4 7 8 43 50
for i in range(N):
for j in range(N):
print('C[%d][%d]:%7.2f ' % (i, j, C[i][j]), end = '')
print('')
18
Εύρεση ελάχιστου σε πίνακα
N=M=2 Ερώτηση:
A = [[0.0 for j in range(N)] for i in range(N)] Τι θα
for i in range(N): επιστρέψει
for j in range(M): το min(A);
A[i][j] = float(input('A[%d][%d]: ' % (i, j)))
minelem = A[0][0] Ερώτηση:
for i in range(N): πως θα
for j in range(M): βρούµε το
ελάχιστό
if minelem > A[i][j]: ΚΑΙ τη θέση
minelem = A[i][j] του;
print('The minimum element is ',minelem)
19
Υπολογισµός ανάστροφου
πίνακα
N=2
M=3 1 2 3
A=
A = [[0.0 for j in range(M)] for i in range(N)] 4 5 6
invA = [[0.0 for j in range(N)] for i in range(M)]
1 4
for i in range(N): T
A = 2 5
for j in range(M):
3 6
A[i][j] = float(input('A[%d][%d]: ' % (i, j)))
invA[j][i] = A[i][j]
for i in range(M):
for j in range(N):
print('invA[%d][%d]:%7.2f ' % (i, j, invA[i][j]), end = '')
print('')
20
Άσκηση
n Όρισε ένα άνω τριγωνικό πίνακα, µε τα στοιχεία
από τη διαγώνιο και πάνω =1
21
Συναρτήσεις
Δόµηση προγράµµατος
n Μέχρι τώρα έχουµε δει πως να χρησιµοποιούµε
έτοιµες συναρτήσεις και µεθόδους στα
προγράµµατά µας (π.χ. len(), max(), print())
n Μπορούµε να ορίσουµε τις δικές µας συναρτήσεις
για λειτουργίες που επαναλαµβάνονται στο
πρόγραµµά µας
n Ο ορισµός συναρτήσεων συντελεί στη σωστή
δόµηση του προγράµµατός µας
¡ Το πρόγραµµά µας γίνεται πιο ευανάγνωστο
¡ Αποφεύγονται οι επαναλήψεις κώδικα
¡ Βοηθούν στο σχεδιασµό του προγράµµατός µας
2
Συναρτήσεις
n Οι συναρτήσεις στις γλώσσες προγραµµατισµού
µοιάζουν µε τις συναρτήσεις στα µαθηµατικά
¡ µπορούν να πάρουν σαν όρισµα κάποιες τιµές
¡ µπορούν να επιστρέψουν µια τιµή
n Οι συναρτήσεις στις γλώσσες προγραµµατισµού
γενικεύουν τις µαθηµατικές συναρτήσεις
¡ µπορούν να εκτελέσουν κάποια λειτουργία χωρίς
απαραίτητα να παίρνουν ορίσµατα ή να επιστρέφουν
τιµές
¡ µπορούν να παίρνουν µεταβλητό αριθµό ορισµάτων
¡ µπορούν να εκτελούν λειτουργίες ανεξάρτητες από τα
ορίσµατά τους 3
Παραδείγµατα συναρτήσεων
n Μαθηµατικές συναρτήσεις στην Python:
n f(x) = x2+1 µπλοκ κώδικα που ορίζει
τη συνάρτηση f
def f(x):
return x**2 + 1
µέρος κώδικα όπου
εκτελείται η f
print(4*f(2))
Τι θα τυπώσει το πρόγραµµα;
Παραδείγµατα συναρτήσεων
n Άσκηση: Ορίστε µια συνάρτηση µε όνοµα average
που θα παίρνει ως ορίσµατα 2 µεταβλητές και θα
επιστρέφει το µέσο όρο τους
¡ π.χ. average(2,3.5) = 2.75
def average(x,y):
return (x+y)/2
5
Παραδείγµατα συναρτήσεων
n Άσκηση: Ορίστε µια συνάρτηση µε όνοµα
perimeter που θα παίρνει ως ορίσµατα την ακτίνα
ενός κύκλου και θα επιστρέφει την περίµετρό του
¡ π.χ. perimeter(1) = 6.283185307179586
def perimeter(x):
from math import pi
return 2*pi*x
Παραδείγµατα συναρτήσεων
n Άσκηση: Ορίστε µια συνάρτηση που θα παίρνει ως
όρισµα ένα όνοµα και θα τυπώνει ‘Hello όνοµα’
¡ π.χ. >>>hello('John')
hello John!
7
Προσοχή
n Οι f1 και f2 φαίνεται να κάνουν το ίδιο, αλλά
υπάρχουν σηµαντικές διαφορές
def f1(x): def f2(x):
return x**2 + 1 print(x**2 + 1)
>>> f1(2)
5 Επίσης:
>>> f2(2) η y = f2(5) δεν θα
5 καταχωρήσει την τιµή της
>>> f2(2)+5 f2(5) στο y
5
Traceback (most recent call last):
File "<pyshell#29>", line 1, in <module>
f2(2)+5
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' 8
9
Ορισµός πριν την κλήση
n Πρώτα ορίζουµε µια συνάρτηση, µετά την καλούµε
n Γιατί θα προκύψει σφάλµα αν εκτελεστεί το
παρακάτω πρόγραµµα;
print(f(2))
def f(x):
return x**2 + 1
10
def g(x):
return f(x)
def f(x):
return x**2 + 1
12
Τοπικότητα παραµέτρων
n Αν αλλάξουµε την τιµή µιας παραµέτρου µέσα στη
συνάρτηση η µεταβλητή που περνάει σαν
παράµετρος δεν αλλάζει στο εξωτερικό πρόγραµµα
για µη µεταβαλλόµενες µεταβλητές.
def try_to_change(n): Η µεταβλητή n µέσα στη
n = 'Mr. Gumby' συνάρτηση έχει τώρα τιµή
'Mr. Gumby’ ανεξάρτητα
name = 'Mrs. Entity' από την τιµή της κατά την
try_to_change(name) κλήση της συνάρτησης
print(name) Η µεταβλητή name
παραµένει αµετάβλητη µετά
την κλήση της
Mrs. Entity
try_to_change
15
Τοπικότητα παραµέτρων
n Αν αλλάξουµε την τιµή ενός µεταβαλλόµενου
αντικειµένου που περνιέται σαν παράµετρος µέσα
στη συνάρτηση, τότε το αντικείµενο αλλάζει στο
εξωτερικό πρόγραµµα
def change(n): Το αντικείµενο (λίστα) που
n[0] = 'Mr. Gumby' δείχνει η παράµετρος n
αλλάζει και στο εξωτερικό
names = ['Mrs. Entity', 'Mrs. Thing'] πρόγραµµα
change(names)
print(names) Η µεταβλητή names αλλάζει
µετά την κλήση της
συνάρτησης change
['Mr. Gumby', 'Mrs. Thing']
16
Άσκηση
n Τι θα τυπώσει το παρακάτω πρόγραµµα;
def change(n):
n[0] = 'Mr. Gumby'
Αντιγράφει τη
names = ['Mrs. Entity', 'Mrs. Thing'] µεταβλητή names σε
change(names[:]) άλλη µεταβλητή (άλλη
print(names) λίστα) και η συνάρτηση
change αλλάζει την
άλλη λίστα, όχι τη
['Mrs. Entity', 'Mrs. Thing']
names
17
Πέρασµα µε τιµή/αναφορά
n Στις γλώσσες προγραµµατισµού γενικά υπάρχουν
2 τρόποι περάσµατος παραµέτρων σε
συναρτήσεις
¡ Πέρασµα µε τιµή: η τιµή της µεταβλητής που µπαίνει
σαν παράµετρος αντιγράφεται σε τοπική µεταβλητή
(µεταβλητή παραµέτρου στη συνάρτηση) – τυχόν
αλλαγές στην τιµή της τοπικής µεταβλητής µέσα στη
συνάρτηση δεν επηρεάζουν την εξωτερική µεταβλητή
¡ Πέρασµα µε αναφορά: η µεταβλητή που µπαίνει σαν
παράµετρος αλλάζει άν η τοπική µεταβλητή (µεταβλητή
παραµέτρου στη συνάρτηση) αλλάξει
18
«Πέρασµα µε αναφορά» µη
µεταβαλλόµενης µεταβλητής
n Τι κάνουµε στην Python αν η συνάρτησή µας
θέλουµε να αλλάξει την τιµή της παραµέτρου, αν
αυτή είναι µή µεταβαλλόµενη µεταβλητη;
def inc(x): def inc(x):
return x + 1 x[0] = x[0] + 1
y=1 y = [1]
y = inc(y) inc(y)
print(y) print(y)
Α τρόπος: βάζουµε τη Β τρόπος: κάνουµε τη
συνάρτηση να µεταβλητή µας
επιστρέφει τη νέα τιµή µεταβαλλόµενη
και την αναθέτουµε στη
µεταβλητή 19
Παράµετροι: η σειρά µετράει
n Η αντιστοίχιση των παραµέτρων µε τις εξωτερικές
µεταβλητές γίνεται µε βάση τη σειρά
def my_pow(base, exponent):
value = 1
for i in range(0, exponent):
value *= base
return value
x = int(input('Input base: '))
y = int(input('Input exponent: '))
print('%d to the power of %d = %d' % (x, y, my_pow(x,y)))
21
Παράµετροι: default τιµές
n Κάντε χρήση default τιµών για µη υποχρεωτικές
παραµέτρους
def hello(name, greeting='Hello', punctuation='!'):
print ('%s, %s%s' % (greeting, name, punctuation))
>>> hello('John')
Hello, John!
>>> hello('John','Howdy')
Howdy, John!
>>> hello('John','Howdy','...')
Howdy, John...
>>> hello('John',punctuation='...')
Hello, John...
>>> hello()
Traceback (most recent call last):
File "<pyshell#62>", line 1, in <module>
hello()
TypeError: hello() missing 1 required positional argument: 'name' 22
>>> print_params('test1')
('test1',)
>>> print_params('test1',1,2)
('test1', 1, 2)
>>> print_params()
()
23
Μεταβλητός αριθµός παραµέτρων
n Με χρήση αστερίσκου * πριν το όνοµα της
παραµέτρου, παίρνουµε µια πλειάδα από αυτές
def print_params(title, *params):
print(title) υποχρεωτική
print(params) παράµετρος
>>> print_params('Label',1,2,3)
Label
(1, 2, 3)
24
def print_family(*members):
print('My family consists of ',end='')
for x in members[:-1]:
print(x, 'and', end=' ')
print(members[-1])
>>> print_family('dad','mom','sis','bro')
My family consists of dad and mom and sis and bro
25
Μεταβλητός αριθµός παραµέτρων
n Με χρήση διπλού αστερίσκου ** πριν το όνοµα της
παραµέτρου, παίρνουµε ένα λεξικό από αυτές
def print_params(**params):
print(params)
26
>>> params=(1,2)
>>> add(*params)
3
27
Κατανοµή τιµών σε παραµέτρους
n Η συνάρτησή µας µπορεί να έχει συγκεκριµένο
αριθµό παραµέτρων και να την καλέσουµε δίνοντας
σαν όρισµα ένα λεξικό παραµέτρων:τιµών
µε χρήση **
def hello(greeting='Hello', name='world'):
print('%s, %s!' % (greeting, name))
28
Παραδείγµατα
def story(**kwds):
return 'Once upon a time, there was a ' \
'%(obj)s called %(name)s.' % kwds
>>> power(2,3)
8
>>> power(y=3,x=2)
8
>>> params = (5,) * 2
>>> power(*params)
3125
>>> power(3, 3, 'Hello, world')
Received redundant parameters: ('Hello, world',)
27
30
Παραδείγµατα
def interval(start, stop=None, step=1): Περιγραφή συνάρτησης
'Imitates range() for step > 0' (σαν σχόλιο)
if stop is None: # If the stop is not supplied...
start, stop = 0, start # shuffle the parameters
result = []
i = start # We start counting at the start index
while i < stop: # Until the index reaches the stop index...
result.append(i) # ...append the index to the result...
i += step # ...increment index
>>> interval(10)
return result [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> interval(1,5)
[1, 2, 3, 4]
>>> interval(3,12,4)
[3, 7, 11]
>>> power(*interval(3,7))
Received redundant parameters: (5, 6)
81
31
Εµβέλεια µεταβλητών
n Όταν δίνουµε τιµή σε µια µεταβλητή είναι σαν να
δίνουµε τιµή στο κλειδί µε το όνοµα της µεταβλητής
σε ένα λεξικό
n vars(): επιστρέφει το built-in λεξικό της Python για τις
µεταβλητές
ΠΡΟΣΟΧΗ: Γενικά µην
>>> x = 1 αλλάζετε το λεξικό
>>> vars()['x'] µεταβλητών της Python,
1 αλλά να ορίζετε και να
>>> vars()['x']+=1 αλλάζετε τις µεταβλητές µε
>>> x τον παραδοσιακό τρόπο
2
32
Εµβέλεια µεταβλητών
n σφαιρική µεταβλητή: είναι µια µεταβλητή που
ορίζεται και χρησιµοποιείται σε όλο το πρόγραµµα
n τοπική µεταβλητή: είναι µια µεταβλητή που ορίζεται
και χρησιµοποιείται µέσα σε µια συνάρτηση
ΠΡΟΣΟΧΗ: Η x µέσα στη
>>> def foo(): x = 42 συνάρτηση είναι τοπική
µεταβλητή
>>> x = 1
>>> foo()
>>> x ΠΡΟΣΟΧΗ: Μετά την κλήση της foo() η
1 σφαιρική µεταβλητή x δεν αλλάζει
Εµβέλεια µεταβλητών
n Οι εξωτερικές (π.χ. σφαιρικές) µεταβλητές µπορούν
να διαβαστούν µέσα σε µια συνάρτηση, αλλά δεν
µπορούν να πάρουν νέα τιµή
>>> def combine(param): print (param + external)
35
Επισκίαση
n Η επισκίαση (shadowing) µιας µεταβλητής συµβαίνει
όταν έχει οριστεί εξωτερικά, αλλά δεν µπορεί να
προσπελαστεί µέσα σε µια συνάρτηση επειδή
υπάρχει µια τοπική µεταβλητή µε το ίδιο όνοµα
def dosomething():
y=5
Αν ήθελα στο σηµείο αυτό να
x=3
χρησιµοποιήσω την εξωτερική
print(x,y)
µεταβλητή x δεν θα µπορούσα γιατί το x
πλέον αναφέρεται στην τοπική
x=1
µεταβλητή x
dosomething()
print(x)
36
Επισκίαση
n Η προσπέλαση µιας σφαιρικής µεταβλητής που
επισκιάζεται σε µια συνάρτηση επισκίαση, µπορεί να
γίνει µέσω του λεξικού που επιστρέφει η globals()
def dosomething():
y=5 Αναφορά στη σφαιρική µεταβλητή x
x=3
print(x,y,globals()['x'])
x=1
dosomething()
print(x)
>>> change_global()
>>> x
2
38
Αναδροµικές Συναρτήσεις
Ορισµός και ιδιότητες
n Μια συνάρτηση είναι αναδροµική αν καλεί τον εαυτό
της
n Οι περισσότερες γλώσσες προγραµµατισµού
υποστηρίζουν αναδροµικές συναρτήσεις
n Οι αναδροµικές συναρτήσεις είναι πολλές φορές πιο
διαισθητικές από τις αντίστοιχες επαναληπτικές
¡ Η εκσφαλµάτωσή τους είναι όµως δυσκολότερη, οπότε
πρέπει να χρησιµοποιούνται µε προσοχή
¡ Επίσης οι αναδροµικές συναρτήσεις µπορεί να
επιβαρύνουν τη µνήµη του συστήµατος και να είναι πιο
αργές
2
5
Παράδειγµα: αριθµοί Fibonacci
αναδρομική συνάρτηση:
επαναληπτική συνάρτηση:
def rfib(n): def fib(n):
if n==1 or n==2: if n<=1: return -1 # undefined
return 1 p = 1 # first number
else: c = 1 # second number
return rfib(n-1)+rfib(n-2) for i in range(n-2):
# c becomes p, compute new c
p, c = c, p +c
return c
Αναδροµικές συναρτήσεις σε
γλώσσα προγραµµατισµού
n Πιο περίπλοκες από τις µαθηµατικές αναδροµές
n Μπορούν να δηµιουργήσουν προβλήµατα αν δεν
οριστούν σωστά
Η «βασική» περίπτωση
n Άσκηση: ορίζει τη συνθήκη
¡ Τι κάνει η παρακάτω συνάρτηση; τερµατισµού
¡ Ποιο είναι το πρόβληµα της παρακάτω συνάρτησης;
¡ Πως θα φτιάξουµε το πρόβληµα;
def countdown(n): def countdown(n):
print(n) print(n)
if n==0: print('blast off!'); return
countdown(n-1) countdown(n-1)
7
Αναδροµικές συναρτήσεις σε
γλώσσα προγραµµατισµού
def countdown(n):
print(n)
if n==0: print('blast off!'); return
countdown(n-1)
Αναδροµικές συναρτήσεις σε
γλώσσα προγραµµατισµού
n Το παράδειγµά µας εξακολουθεί να έχει
προβλήµατα:
¡ Αν καλέσουµε countdown(-1) η συνάρτηση δεν τερµατίζει
¡ Αν καλέσουµε countdown(10000) το πρόγραµµα θα
«κολλήσει» µετά από περίπου 1000 κλήσεις αναδροµής
n ... η «στοίβα» του προγράµµατος θα γεµίσει
n RuntimeError: maximum recursion depth exceeded
def countdown(n):
print(n)
if n==0: print('blast off!'); return
countdown(n-1)
9
Σκεπτόµενοι αναδροµικά
n Άσκηση: φτιάξτε µια αναδροµική συνάρτηση
vertical, η οποία να τυπώνει τα ψηφία ενός
αριθµού «κάθετα» από το περισσότερο στο
λιγότερο σηµαντικό
n Επιθυµητή συµπεριφορά:
>>> vertical(3124)
3
1
2
4
10
Σκεπτόµενοι αναδροµικά
n Βήµα 1: ποια είναι η «βασική» περίπτωση;
>>> vertical(6)
6
11
Σκεπτόµενοι αναδροµικά
n Βήµα 2: ποια είναι η «αναδροµική» περίπτωση;
¡ αν ο αριθµός έχει περισσότερα από ένα ψηφία (=n),
τότε σπάσε τον σε δύο µέρη:
n στο τελευταίο ψηφίο
n σε όλα τα υπόλοιπα µαζί (δηλ. τα πρώτα n-1 ψηφία)
n π.χ. το 3124 σπάει σε 312 και 4
¡ πρώτα χρειριζόµαστε τα πρώτα ψηφία
(υποπρόβληµα), µετά το τελευταίο ψηφίο
n τα πρώτα n-1 ψηφία µπορούν να τυπωθούν µε τη σωστή σειρά
µε µια αναδροµική κλήση
n ο χειρισµός του τελευταίου ψηφίου είναι η «βασική»
περίπτωση
12
Σκεπτόµενοι αναδροµικά
def vertical(n):
if n<10: # base case: n has 1 digit
print(n) # just print n
else: # recursive case: n has 2 or more digits
vertical(n//10) # recursively print all but last digit
print(n%10) # print last digit of n
>>> vertical(3124)
3
1
2
4
Άσκηση
n Τι κάνει η παρακάτω συνάρτηση;
def vertical(n):
if n<10: # base case: n has 1 digit
print(n) # just print n
else: # recursive case: n has 2 or more digits
print(n%10) # print last digit of n
vertical(n//10) # recursively print all but last digit
>>> vertical(3124)
4
2
1
3
15
Σκεπτόµενοι αναδροµικά
n Άσκηση: φτιάξτε µια αναδροµική συνάρτηση
pattern που να τυπώνει αστεράκια όπως στα
παρακάτω παραδείγµατα
>>> pattern(0) >>> pattern(2) >>> pattern(3)
>>> pattern(1) * *
* ** **
* *
***
*
**
*
16
Σκεπτόµενοι αναδροµικά
n Βήµα 1: ποια είναι η «βασική» περίπτωση;
>>> vertical(0)
>>>
17
Σκεπτόµενοι αναδροµικά
n Βήµα 2: ποια είναι η «αναδροµική» περίπτωση;
¡ µε ανάλυση της επιθυµητής συµπεριφοράς και λίγη
σκέψη...
>>> pattern(1) >>> pattern(2) >>> pattern(3)
1 φορά ‘*’ * pattern(1)
* * pattern(2)
2 φορές ‘*’
pattern(0) ** **
* pattern(1) *
3 φορές ‘*’
***
* pattern(2)
**
*
18
Σκεπτόµενοι αναδροµικά
def pattern(n):
if n==0:
return # base case for n=0
else: # recursive case: n>0
pattern(n-1) # recursively print pattern for n-1
print(n*'*') # print n stars
pattern(n-1) # recursively print pattern for n-1
19
Πόσο γρήγορη είναι η
συνάρτησή µας;
n Όταν σχεδιάζουµε µια συνάρτηση, πρέπει να
σκεφτόµαστε και την ταχύτητά της
Η συνάρτηση rfib είναι πολύ πιο αργή από τη fib
¡
αναδρομική συνάρτηση:
επαναληπτική συνάρτηση:
def rfib(n): def fib(n):
if n==1 or n==2: if n<1: return -1 # undefined
return 1 p = 1 # first number
else: c = 1 # second number
return rfib(n-1)+rfib(n-2) for i in range(n-2):
# c becomes p, compute new c
p, c = c, p +c
return c
20
επαναληπτική συνάρτηση:
n Η fib(n) χρειάζεται
περίπου n def fib(n):
επαναλήψεις if n<1: return -1 # undefined
p = 1 # first number
n Άρα ο χρόνος της c = 1 # second number
for i in range(n-2):
fib(n) είναι ανάλογος # c becomes p, compute new c
του n p, c = c, p +c
return c
21
Πόσο γρήγορη είναι η
συνάρτησή µας;
n Άσκηση: όταν εκτελούµε την rfib(7) πόσες φορές
εκτελείται η rfib(3);
αναδρομική συνάρτηση:
def rfib(n):
if n==1 or n==2:
return 1
else:
return rfib(n-1)+rfib(n-2)
>>> my_pow(1.00000001,100000000)
2.71828179834636
>>> 1.00000001**100000000
2.7182817983473577 23
Πόσο γρήγορη είναι η
συνάρτησή µας;
n Λύση: πως µπορούµε να ορίσουµε τη συνάρτηση
my_pow αναδροµικά;
n an = an/2*an/2 αν ο n είναι ζυγός
n αν είναι µονός;
¡ an = a*an/2*an/2
n και στις 2 περιπτώσεις το an/2 χρειάζεται να
υπολογιστεί µόνο 1 φορά
n Πόσες αναδροµικές κλήσεις απαιτούνται για τον
υπολογισµό του an;
¡ περίπου log2n
24
25
Αναζήτηση και Ταξινόµηση
Συνάρτηση αναζήτησης
n Άσκηση: γράψτε µια συνάρτηση search_list, η οποία
παίρνει σαν όρισµα µια λίστα και ένα στοιχείο και
επιστρέφει
¡ την πρώτη θέση του στοιχείου στη λίστα αν το στοιχείο
υπάρχει
¡ -1 αλλιώς def search_list(l, x):
for i in range(len(l)):
>>> l = [1,2,3,4,5,6,1,2,3,4,5] if x == l[i]:
>>> search_list(l, 4) return I
3 return -1
>>> search_list(l, 99)
-1 if x in l:
return l.index(x)
4
Συνάρτηση αναζήτησης
n Άσκηση: γράψτε µια συνάρτηση search_list2, η
οποία παίρνει σαν όρισµα µια λίστα και ένα στοιχείο
και επιστρέφει όλες τις θέσεις του στοιχείου στη
λίστα
def search_list2(l, x):
pos = []
>>> l = [1,2,3,4,5,6,1,2,3,4,5] for i in range(len(l)):
>>> search_list2(l, 4) if x == l[i]:
[3, 9] pos.append(i)
>>> search_list2(l,99)
[]
return pos
Γραµµική αναζήτηση
n Οι search_list, search_list2 υλοποιούν τη γραµµική
αναζήτηση (linear search), όπου κοιτάµε ένα-ένα
τα στοιχεία της ακολουθίας µέχρι να βρούµε το
στοιχείο (ή τα στοιχεία) που ψάχνουµε
n Η γραµµική αναζήτηση δεν προϋποθέτει τίποτα
σχετικά µε την οργάνωση των στοιχείων στην
ακολουθία
¡ ο απλούστερος δυνατός τρόπος αναζήτησης
¡ συγκρίνει όλα τα στοιχεία της ακολουθίας µε το στοιχείο
προς εύρεση
¡ χρήσιµος για µικρές, µη ταξινοµηµένες ακολουθίες
6
Δυαδική αναζήτηση
n Μπορούµε να εφαρµόσουµε δυαδική αναζήτηση
(binary search), αν η ακολουθία µας είναι
ταξινοµηµένη.
n Π.χ. ψάχνουµε το στοιχείο key στη λίστα lst
n Βασική ιδέα:
¡ mid = len(lst)/2 (το µεσαία θέση στη λίστα)
¡ αν lst[mid] == key τότε το βρήκαµε!
¡ αν lst[mid] > key τότε ψάχνουµε στο 1ο µισό της λίστας
¡ αν lst[mid] < key τότε ψάχνουµε στο 2ο µισό της λίστας
n ψάχνουµε αναδροµικά
Δυαδική αναζήτηση
def binarysearchrec(lst, key, low, high): [1,2,3,4,5,6,9,10,15,20]
key = 4
if low>high: «βασική»
return -1 περίπτωση 1: low = 0, high = 9
else: δεν βρέθηκε mid = 4, lst[mid]=5
mid=(low+high)//2
«βασική» [1,2,3,4,5,6,9,10,15,20]
if key==lst[mid]:
περίπτωση 2: low = 0, high = 3
return mid
βρέθηκε! mid = 1, lst[mid]=2
elif key<lst[mid]:
return binarysearchrec(lst, key, low, mid-1)
else: [1,2,3,4,5,6,9,10,15,20]
low = 2, high = 3
return binarysearchrec(lst, key, mid+1, high)
mid = 2, lst[mid]=3
[1,2,3,4,5,6,9,10,15,20]
low = 3, high = 3
mid = 3, lst[mid]=4
return 3
8
Δυαδική αναζήτηση
def binarysearchrec(lst, key, low, high): [1,2,3,4,5,6,9,10,15,20]
key = 11
if low>high:
return -1 low = 0, high = 9
else: mid = 4, lst[mid]=5
mid=(low+high)//2
if key==lst[mid]: [1,2,3,4,5,6,9,10,15,20]
return mid low = 5, high = 9
elif key<lst[mid]: mid = 7, lst[mid]=10
return binarysearchrec(lst, key, low, mid-1)
else: [1,2,3,4,5,6,9,10,15,20]
low = 8, high = 9
return binarysearchrec(lst, key, mid+1, high)
mid = 8, lst[mid]=15
[1,2,3,4,5,6,9,10,15,20]
low = 8, high = 7
return -1
9
Δυαδική αναζήτηση
n Η δυαδική αναζήτηση είναι πολύ γρήγορη
n Σε κάθε αναδροµή, το εύρος της ακολουθίας που
εξετάζουµε µειώνεται στο µισό
n Άσκηση: πόσες φορές καλείται η συνάρτηση
(αναδροµικά) αν η λίστα έχει 1000 στοιχεία;
¡ 10 γιατί κάθε φορά ψάχνουµε στο µισό της λίστας από
την προηγούµενη φορά
n Πόσες φορές καλείται για µια λίστα µήκους n;
¡ log2n στη χειρότερη περίπτωση
10
Δυαδική αναζήτηση
n Επαναληπτική συνάρτηση
11
Ταξινόµηση
n Στόχος της ταξινόµησης είναι να ανακατατάξει τα
στοιχεία µιας ακολουθίας ώστε να εµφανίζονται µε
σειρά από το µικρότερο στο µεγαλύτερο (η
αντίστροφα)
¡ Η µέθοδος sort ταξινοµεί λίστες της Python
n Θυµηθείτε ότι τα αλφαριθµητικά και πλειάδες είναι µη
µεταβαλλόµενα και στα λεξικά δεν έχει νόηµα η ταξινόµηση
¡ Η συνάρτηση sorted() επιστρέφει µια ταξινοµηµένη
λίστα απο µια ακολουθία (λίστα, πλειάδα, string) ή
λεξικό
n Θα δούµε κάποιους αλγορίθµους ταξινόµησης και
πως αυτοί υλοποιούνται στην Python 12
Ταξινόµηση µε επιλογή:
(selection sort)
n Λογική: Βρες το µικρότερο στοιχείο και βάλτο
πρώτο, µετά το 2ο µικρότερο και βάλτο 2ο, κ.ο.κ.
64, 25, 12, 22, 11
Ταξινόµηση µε επιλογή:
(selection sort)
def SelectionSort(lst):
for pos in range(0, len(lst)):
# find min starting from pos
minpos=FindMin(lst, pos)
# swap elements
lst[pos],lst[minpos] = lst[minpos],lst[pos]
14
Βubble sort
n Λογική:
¡ Συγκρίνουµε το κάθε στοιχείο µε το επόµενό του και
αλλάζουµε τις θέσεις τους αν δεν είναι στη σωστή
σειρά.
¡ Μετά το πρώτο πέρασµα το µεγαλύτερο στοιχείο θα
είναι τελευταίο στη λίστα. Μετά το 2ο πέρασµα το
δεύτερο µεγαλύτερο στοιχείο θα είναι προ-τελευταίο στη
λίστα, κ.ο.κ.
15
64, 25, 12, 22, 11 25, 12, 22, 11, 64 12, 22, 11, 25, 64
25, 64, 12, 22, 11 12, 25, 22, 11, 64 12, 22, 11, 25, 64
25, 64, 12, 22, 11 12, 25, 22, 11, 64 12, 11, 22, 25, 64
25, 12, 64, 22, 11 12, 22, 25, 11, 64 το 3ο µέγιστο στοιχείο
25, 12, 64, 22, 11 12, 22, 25, 11, 64
25, 12, 22, 64, 11 12, 22, 11, 25, 64
25, 12, 22, 64, 11 το 2ο µέγιστο στοιχείο
25, 12, 22, 11, 64
το µέγιστο στοιχείο ...
16
Bubble sort
def BubbleSort(lst):
for i in range(len(lst)): # rounds
for j in range(0,len(lst)-i-1): # i-th round
if lst[j]>lst[j+1]:
lst[j],lst[j+1] = lst[j+1],lst[j]
17
Insertion sort
n Λογική: Αρχίζοντας από το 2ο στοιχείο, βάλε το
κάθε στοιχείο στη σωστή σειρά σε σχέση µε τα
προηγούµενά του
¡ Τελειώνοντας το ν-στο στοιχείο τα πρώτα ν στοιχεία
είναι ταξινοµηµένα
2ο στοιχείο 4ο στοιχείο 5ο στοιχείο
64, 25, 12, 22, 11 12, 25, 64, 22, 11 12, 22, 25, 64, 11
25, 64, 12, 22, 11 12, 25, 22, 64, 11 12, 22, 25, 11, 64
3ο στοιχείο 12, 22, 25, 64, 11 12, 22, 11, 25, 64
25, 64, 12, 22, 11 12, 11, 22, 25, 64
25, 12, 64, 22, 11 11, 12, 22, 25, 64
12, 25, 64, 22, 11 18
Insertion sort
def InsertionSort(lst):
for i in range(1,len(lst)): # 2nd, 3rd, etc.
pos = i
#swap with previous element while smaller
while pos>0 and lst[pos]<lst[pos-1]:
lst[pos],lst[pos-1] = lst[pos-1],lst[pos]
pos = pos-1
19
Merge sort
n Λογική: Ταξινόµησε αναδροµικά το πρώτο µισό και
το δεύτερο µισό της λίστας και µετά «συγχώνευσε»
τα δύο µισά σε µια ταξινοµηµένη λίστα.
MergeSort(64, 5, 25, 12, 22, 11)
αναδρομικές κλήσεις
merge
MergeSort(64, 5, 25) 5, 25, 64
5 11 12 22 25 64
MergeSort(12, 22, 11) 11, 12, 22
20
Merge sort
def MergeSort(lst):
if len(lst)<=1: # base case: already sorted
return lst
else: # recursive case
mid = (len(lst))//2
lst1 = MergeSort(lst[:mid]) # sort first half
lst2 = MergeSort(lst[mid:]) # sort second half
outl = [] # merged list to be returned
i = j = 0 # pointers to positions of sorted halves
while i<len(lst1) and j<len(lst2):
if lst1[i]<=lst2[j]:
outl.append(lst1[i])
i += 1
else:
outl.append(lst2[j])
j += 1
outl.extend(lst1[i:]) # add remainders
outl.extend(lst2[j:])
return outl 21
22
Αρχεία
Διαχείριση αρχείων
n Ως τώρα έχουµε δει πως µπορούµε να πάρουµε την
είσοδο ενός προγράµµατος από το χρήστη και πως
να τυπώνουµε την έξοδό του στην οθόνη.
n Σε πολλές εφαρµογές, θέλουµε να πάρουµε την
είσοδο ενός προγράµµατος από ένα αρχείο του
υπολογιστή, ή να γράψουµε σε ένα αρχείο.
n Η Python παρέχει συναρτήσεις για διάβασµα και
γράψιµο σε αρχεία.
2
Τύποι αρχείων
n Αρχεία κειµένων (text files): Περιέχουν
χαρακτήρες ASCII µόνο και µπορούµε να τα
διαβάσουµε ανοίγοντάς τα µε έναν απλό
επεξεργαστή κειµένου (π.χ. αρχεία µε κατάληξη txt)
ή τυπώνοντάς τα στην κονσόλα του λειτουργικού
συστήµατος
n Δυαδικά αρχεία κειµένων (binary files): Περιέχουν
κωδικοποιηµένη πληροφορία σε δυαδική µορφή. Δεν
µπορούµε να τα διαβάσουµε µε έναν απλό
επεξεργαστή κειµένου ή τυπώνοντάς τα στην
κονσόλα του λειτουργικού συστήµατος
3
6
«Άνοιγµα» ενός αρχείου
n Γίνεται µε τη συνάρτηση open(filename)
n Η συνάρτηση ανοίγει το αρχείο µε το όνοµα filename
ή δίνει σφάλµα αν δεν υπάρχει αρχείο µε αυτό το
όνοµα
µεταβλητή που δείχνει στο αντικείµενο αρχείου
µπορούµε να δώσουµε και πλήρη
>>> f = open('testfile.txt') διεύθυνση του αρχείου στο δίσκο
>>> f = open('testfile') (π.χ. ‘C:\files\testfile.txt’)
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
f = open('testfile')
FileNotFoundError: [Errno 2] No such file or
directory: 'testfile'
7
Γράψιµο σε αρχείο
n Μέσω της µεθόδου write
11
Τυχαία Προσπέλαση
n Μπορούµε να µετακινηθούµε σε µια συγκεκριµένη
θέση του αρχείου και να διαβάσουµε, ή να γράφουµε
εκέι µέσω της µεθόδου seek
>>> f = open('testfile.txt','r') testfile.txt
>>> f.seek(4) πήγαινε στη Hello, World!
4 θέση 4
>>> f.read(3)
'o, '
>>> f.tell() επιστρέφει την
7 τρέχουσα θέση
στο αρχείο
12
Παράδειγµα µε seek και write
n Μπορούµε να µετακινηθούµε σε µια συγκεκριµένη
θέση του αρχείου και να διαβάσουµε, ή να γράφουµε
εκέι µέσω της µεθόδου seek
testfile.txt
>>> f = open('testfile.txt','r+') Hello, World!
>>> f.seek(3)
3
>>> f.write('p ')
2 testfile.txt
>>> f.seek(0) Help , World!
0
>>> f.read()
'Help , World!'
13
0: Hello, World!
1: How are you?
14
readline, readlines, writelines
n Η µέθοδος readlines() διαβάζει όλες τις
γραµµές του αρχείου και τις επιστρέφει σε µία
λίστα.
testfile.txt
>>> f = open('testfile.txt')
>>> l = f.readlines() Hello, World!
>>> l How are you?
['Hello, World!\n', 'How are you?']
Το \n είναι ειδικός χαρακτήρας
που σηµαίνει «αλλαγή γραµµής»
15
16
Διαβάζοντας µε επαναλήψεις
n Μπορούµε να καλούµε τις µεθόδους read και
readline επαναληπτικά µέχρι να φτάσουµε στο
τέλος του αρχείου
>>> f = open('testfile.txt') testfile.txt
>>> char = f.read(1) Hello, World!
>>> while char: How are you?
print(char,end='')
char = f.read(1)
ενόσω ο τρέχων χαρακτήρας που
Hello, World! διαβάσαµε δεν είναι κενός, που
σηµαίνει ότι το αρχείο δεν έχει
How are you?
τελειώσει
>>>
17
Διαβάζοντας µε επαναλήψεις
n Μπορούµε να καλούµε τις µεθόδους read και
readline επαναληπτικά µέχρι να φτάσουµε στο
τέλος του αρχείου
>>> f = open('testfile.txt') testfile.txt
>>> l = f.readline() Hello, World!
>>> while l: How are you?
print(l, end='')
l = f.readline()
χρειάζεται, γιατί η κάθε γραµµή
περιέχει το \n στο τέλος
Hello, World!
How are you?
>>>
18
Διαβάζοντας µε επαναλήψεις
n Το ίδιο µε while-True / break
20
Διάβασµα γραµµή-γραµµή µε
χρήση for
n Εναλλακτικός επαναληπτικός τρόπος
διαβάσµατος για κάθε γραµµή l που
>>> f = open('testfile.txt') διαβάζεται από το αρχείο
>>> for l in f: (το read εδώ υπονοείται)
print(l,end='') testfile.txt
list(open(filename))
n Μπορoύµε να µετατρέψουµε τα περιεχόµενα
του αρχείου σε λίστα χρησιµοποιώντας
list(open(filename))
¡ Αντίστοιχα µε το list(range(5))
22
Παράδειγµα
>>> f = open('testfile2.txt','w')
>>> f.write('First line\n')
11
>>> f.write('Second line\n')
12
>>> f.write('Third line\n')
11
>>> f.close()
>>> first, second, third = open('testfile2.txt')
>>> first
'First line\n' ανοίγει το αρχείο και
>>> second διαβάσει τις γραµµές
'Second line\n' στις µεταβλητές
>>> third ταυτόχρονα
'Third line\n'
23
Άσκηση
n Γράψτε µια συνάρτηση, η οποία θα παίρνει
σαν όρισµα ένα όνοµα αρχείου και ένα
αλφαριθµητικό και θα επιστρέφει πόσες φορές
εµφανίζεται το αλφαριθµητικό µέσα στο αρχείο
¡ π.χ. stringCount('testfile.txt','you') = 1
testfile.txt
def stringCount(filename, s): Hello, World!
f = open(filename) How are you?
content = f.read()
return content.count(s)
διαβάζει όλο το αρχείο και
βάζει τα περιεχόµενά του
στο αλφαριθµητικό content
24
Άσκηση
n Γράψτε µια συνάρτηση, η οποία θα παίρνει
σαν όρισµα ένα όνοµα αρχείου και θα
επιστρέφει τον αριθµό των λέξεων σε αυτό
¡ π.χ. wordCount('testfile.txt') = 5
testfile.txt
def wordCount(filename): Hello, World!
f = open(filename) How are you?
content = f.read()
return len(content.split())
25
Άσκηση
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν όρισµα
ένα όνοµα αρχείου και θα επιστρέφει τις λέξεις του σε
µια λίστα, χωρίς σηµεία στίξης (!,.:;?)
¡ π.χ. words('testfile.txt') = ['Hello', 'World', 'How', 'are', 'you']
def words(filename):
f = open(filename)
content = f.read()
lout = [] testfile.txt
for s in content.split(): Hello, World!
chars = list(s) How are you?
l = []
for c in chars:
if c not in '!,.:;?':
l.append(c)
lout.append(''.join(l))
return lout 26
Άσκηση
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν όρισµα
ένα όνοµα αρχείου και θα επιστρέφει τις λέξεις του σε
µια λίστα, χωρίς σηµεία στίξης (!,.:;?)
¡ π.χ. words('testfile.txt') = ['Hello', 'World', 'How', 'are', 'you’]
¡ Με χρήση translate testfile.txt
Hello, World!
def words(filename):
How are you?
trantab = str.maketrans('!,.:;?', ' ')
δηµιουργεί πίνακα
f = open(filename) µετάφρασης trantab, που
αντιστοιχίζει κάθε σηµείο
content = f.read() στίξης σε ένα διάστηµα
newcontent = content.translate(trantab)
return newcontent.split() «µεταφράζει» το content
µε βάση το trantab
27
Άσκηση
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν όρισµα
ένα όνοµα αρχείου και ένα αλφαριθµητικό και θα
τυπώνει τις γραµµές του αρχείου που περιέχουν το
αλφαριθµητικό
¡ π.χ. grep('testfile.txt','are') >>> How are you?
28
close και flush
n Όταν ανοίγουµε ένα αρχείο για γράψιµο και γράφουµε
σε αυτό, οι αλλαγές στο αρχείο γίνονται πρώτα στη
µνήµη του υπολογιστη: δεν υπάρχει εγγύσηση ότι το
αρχείο στο δίσκο έχει αλλάξει.
¡ Η f = open(‘filename’,’w’) δε δηµιουργεί το αρχείο στο δίσκο
απ’ ευθείας
¡ Η f.write(‘something’) δεν γράφει απ’ευθείας στο αρχείο του
δίσκου
n Οι αλλαγές γίνονται σε ένα buffer της µνήµης
n Η f.close() γράφει όλα τα δεδοµένα του buffer στο
αρχείο και κλείνει το αρχείο
n Η f.flush() γράφει όλα τα δεδοµένα του buffer στο
αρχείο χωρίς να το κλείσει
29
Άσκηση: openLog
n Γράψτε µια συνάρτηση, openLog() η οποία θα
ανοίγει ένα αρχείο (όπως η open()) και θα
καταγράφει σε ένα αρχείο log.txt το ιστορικό
των ανοιγµάτων αρχείων µέσω της openLog()
n Παράδειγµα επιθυµητής συµπεριφοράς:
…
>>> f = openLog('testfile.txt','r’)
log.txt
…
Wednesday Dec/03/14 12:38 PM: File testfile.txt opened.
30
Άσκηση: openLog, βήµα 1
n Ας αρχίσουµε από το βασικό: θέλουµε η
openLog() να κάνει ότι και η open() :
def openLog(filename, mode):
f = open(filename, mode)
return f
31
return f
time module
n Η µέθοδος strftime µετατρέπει ένα αντικείµενο
χρόνου σε ένα κατανοητό αλφαριθµητικό
>>> time.strftime('%A %b/%d/%y %I:%M %p', time.localtime())
'Tuesday Mar/16/10 02:06 PM'
34
time module
n Η µέθοδος strftime µετατρέπει ένα αντικείµενο
χρόνου σε ένα κατανοητό αλφαριθµητικό
35
f = open(filename, mode)
return f
36
Σφάλµατα, εξαιρέσεις,
εκσφαλµάτωση
Τύποι Σφαλµάτων
n Συντακτικά λάθη (syntax errors)
n Λάθη κατά την εκτέλεση (run-time errors)
n Λογικά σφάλµατα
2
Συντακτικά Λάθη
n Είναι σηµαντικό να καταλάβουµε το συντακτικό
λάθος και να το διορθώσουµε
break.py
from math import sqrt
for n in range(99, 0, -1):
root = sqrt(n)
if root == int(root):
print (n)
break
python3 break.py
File "break.py", line 6
break
^
IndentationError: unindent does not match
any outer indentation level 3
Συντακτικά Λάθη
n Είναι σηµαντικό να καταλάβουµε το συντακτικό
λάθος και να το διορθώσουµε
test.py
suits = ['\u2660', '\u2661', '\u2662', '\u2663']
print((suits)
x=5
python3 test.py
File "test.py", line 3
x=5
^
SyntaxError: invalid syntax
4
Συντακτικά Λάθη
n Είναι σηµαντικό να καταλάβουµε το συντακτικό
λάθος και να το διορθώσουµε
>>> (3+4]
SyntaxError: invalid syntax
>>> if x==5
SyntaxError: invalid syntax
>>> print 'hello'
SyntaxError: invalid syntax
>>> lst = [1;2;3]
SyntaxError: invalid syntax
>>> for i in range(10):
print(i)
SyntaxError: expected an indented block
8
Εξαιρέσεις
n Όταν το πρόγραµµα µπει σε µια µη έγκυρη κατάσταση
δηµιουργεί µια εξαίρεση (exception)
¡ Η εξαίρεση είναι κι αυτή αντικείµενο
n Κάθε εξαίρεση ανήκει σε ένα τύπο
¡ Ο τύπος µας βοηθάει να καταλάβουµε το σφάλµα
Εξαίρεση Εξήγηση
KeyboardInterrupt Ο χρήστης διέκοψε το πρόγραµµα µε Crtl-C
OverflowError Ένας float πήρε πολύ µεγάλη τιµή
ZeroDivisionError Διαίρεση µε το 0
FileNotFoundError Το όνοµα αρχείου που επιχειρούµε να ανοίξουµε δεν υπάρχει
IndexError Προσπαθήσαµε να προσπελάσουµε µια µη έγκυρη θέση ακολουθίας
NameError Προσπέλαση µεταβλητής που δεν έχει οριστεί
TypeError Μια λειτουργία εφαρµόζεται σε λάθος τύπο αντικειµένου
ValueError Μια λειτουργία εφαρµόζεται σε µη έγκυρη τιµή 9
Δηµιουργία Εξαιρέσεων
n Μπορούµε να δηµιουργήσουµε εξαίρεση στο πρόγραµµα
ή τη συνάρτησή µας αν κάτι δεν είναι έγκυρο µε βάση τις
προδιαγραφές µας µε την εντολή raise
x = int(input('Input a number between 10 and 20: '))
if x<10 or x>20:
raise Exception('Number outside valid range')
print(x**2)
περιγραφή της εξαίρεσης
Input a number between 10 and 20: 12
144
Input a number between 10 and 20: 3
Traceback (most recent call last):
File "test.py", line 3, in <module>
raise Exception('Number outside valid range')
Exception: Number outside valid range
10
«Πιάσιµο» Εξαιρέσεων
n Μπορούµε να αποφύγουµε να τερµατίσει το πρόγραµµά
µας, φροντίζοντας να «πιάνουµε» τυχόν εξαιρέσεις
try:
x = eval(input('Enter the first number: '))
y = eval(input('Enter the second number: '))
print (x/y)
except ZeroDivisionError:
print("The second number can't be zero!")
print("program finished normally...")
«Πιάσιµο» Εξαιρέσεων
n Μπορούµε να αποφύγουµε να τερµατίσει το πρόγραµµά
µας, φροντίζοντας να «πιάνουµε» τυχόν εξαιρέσεις
try:
x = eval(input('Enter the first number: '))
y = eval(input('Enter the second number: '))
print (x/y)
except ZeroDivisionError:
print("The second number can't be zero!")
print("program finished normally...")
«Πιάσιµο» Εξαιρέσεων
try:
x = eval(input('Enter the first number: '))
y = eval(input('Enter the second number: '))
print (x/y) οι εξαίρεσεις
except ZeroDivisionError: εξετάζονται
print("The second number can't be zero!") µε αυτή τη
except NameError: σειρά
print("You did not give a number")
except SyntaxError:
print("You did not give a number”)
14
«Πιάσιµο» Εξαιρέσεων
try:
x = eval(input('Enter the first number: '))
y = eval(input('Enter the second number: '))
print (x/y)
except ZeroDivisionError:
print("The second number can't be zero!")
except:
print("Something wrong happened")
«Πιάσιµο» Εξαιρέσεων
try:
x = eval(input('Enter the first number: '))
y = eval(input('Enter the second number: '))
print (x/y)
except (ZeroDivisionError, NameError, SyntaxError):
print("Something wrong with your numbers")
16
«Πιάσιµο» Εξαιρέσεων
try:
x = eval(input('Enter the first number: '))
y = eval(input('Enter the second number: '))
print (x/y)
except (ZeroDivisionError, NameError, SyntaxError) as e:
print(e)
αποθηκεύει το περιεχόµενο
της εξαίρεσης (ένα
Enter the first number: 3a αλφαριθµητικό) στη
unexpected EOF while parsing (<string>, line 1) µεταβλητή e
17
Χρήση try/except/else
while True:
try:
x = eval(input('Enter the first number: '))
y = eval(input('Enter the second number: '))
value = x/y
print ('x/y is', value) τυπώνουµε την εξαίρεση
except Exception as e: για να ξέρει ο χρήστης τι
print('Invalid input: ',e) πήγε στραβά
print('Please try again.')
else:
break
αν δε δηµιουργήθηκε
εξαίρεση, τότε όλα πήγαν
καλά και ο βρόγχος
τερµατίζει
18
Παράδειγµα
n Γράψτε µια συνάρτηση που θα µετατρέπει την πρώτη γραµµή
ενός αρχείου σε ακέραιο και µετά θα τυπώνει τον ακέραιο
def readAge(filename):
try:
infile = open(filename)
strAge = infile.readline()
age = int(strAge)
print('age is',age)
except IOError:
print('Input/Output error.')
except ValueError:
print('Value cannot be converted to integer.')
except:
print('Other error.')
19
20
Εξαιρέσεις και συναρτήσεις
def faulty():
raise Exception('Something is wrong')
def ignore_exception():
faulty()
def handle_exception():
try: faulty()
except: print('Exception handled')
>>> ignore_exception()
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
ignore_exception()
File "test.py", line 5, in ignore_exception
faulty()
File "test.py", line 3, in faulty
raise Exception('Something is wrong')
Exception: Something is wrong
21
>>> handle_exception()
Exception handled
22
Εξαιρέσεις και συναρτήσεις
23
Παράδειγµα
n Έστω ότι αποθηκεύουµε τα στοιχεία προσώπων σαν λεξικά
n Αν ένα πρόσωπο δέν έχει κάποια στοιχεία, ή δεν τα
γνωρίζουµε, απλά δεν υπάρχουν στο λεξικό του
24
Παράδειγµα
n Θέλουµε να γράψουµε µια συνάρτηση describePerson() που
να τυπώνει τα υπάρχοντα στοιχεία του προσώπου που της
δίνεται σαν όρισµα
n Το name είναι υποχρεωτικό κλειδί στο όρισµα της
συνάρτησης, τα υπόλοια στοιχεία, προαιρετικά
>>> john = {'age':34, 'name':'John'}
>>> steve = {'name':'Steve', 'occupation':'locksmith'}
>>> describePerson(john)
Description of John
Age: 34
>>> describePerson(steve)
Description of Steve
Occupation: locksmith
25
Παράδειγµα
n Θέλουµε να γράψουµε µια συνάρτηση describePerson() που
να τυπώνει τα υπάρχοντα στοιχεία του προσώπου που της
δίνεται σαν όρισµα
def describePerson(person):
print('Description of', person['name'])
if 'age' in person:
print('Age:', person['age'])
if 'occupation' in person:
print('Occupation:', person['occupation'])
if 'marital' in person:
print('Marital Status:', person['marital'])
27
Αποσφαλµάτωση
n Αν το πρόγραµµά µας δε λειτουργεί σωστά (π.χ. έχει
λογικό σφάλµα) και δεν ξέρουµε που είναι το
σφάλµα, πρέπει να χρησιµοποιήσουµε µια µέθοδο
εκσφαλµάτωσης (debugging).
n Η εκσφαλµάτωση µπορεί να γίνει µε ειδικά
προγράµµατα (debuggers)
¡ Ο debugger προσοµοιώνει την εκτέλεση του
προγράµµατος εντολή-προς-εντολή και δίνει ανά πάσα
στιγµή τις τιµές των µεταβλητών και τη στοίβα του
προγράµµατος
n Τα περισσότερα IDE (integrated development
interfaces) εµπεριέχουν debugger 28
Αποσφαλµάτωση
n Τυπική µεθοδολογία εκσφαλµάτωσης:
¡ Επανάληψη του προγράµµατος (ώστε να εντοπιστεί το
σφάλµα)
¡ Αποµόνωση του σηµείου που εµφανίζεται το σφάλµα
¡ Αναγνώριση της αιτίας που το προκαλεί (π.χ. από
απροσεξία ή από λογικό σφάλµα)
¡ Διόρθωση του σφάλµατος
¡ Επιβεβαίωση της διόρθωσης (επανάληψη του
προγράµµατος, δοκιµή µε διαφορετικές εισόδους)
n Τα παραπάνω βήµατα είναι τυπικά. Κάποιοι
προγραµµατιστές µπορεί να ακολουθούν µια
παραλλαγή της µεθοδολογίας αυτής 29
2
Σύνολα στην Python
n Στην Python, τα σύνολα, µοιάζουν µε τα λεξικά, αλλά
δεν έχουν ζευγάρια (κλειδί,τιµή)
¡ είναι σαν λεξικά που έχουν µόνο κλειδιά
n Ορίζονται µε χρήση {}, όπως και τα λεξικά
n Υποστηρίζονται από βασικές συναρτήσεις και
τελεστές ακολουθιών
>>> A = {1,2,3}
>>> len(A)
3
>>> 2 in A
True
3
Βασικές λειτουργίες
n Ένωση, τοµή, διαφορά συνόλων όπως στα
µαθηµατικά
>>> A = {1,2,3} τελεστής ένωσης
>>> B = {3,4,5}
>>> A | B τελεστής τοµής
{1, 2, 3, 4, 5}
>>> A & B
τελεστής διαφοράς
{3}
>>> A - B
συµµετρική διαφορά
{1, 2}
>>> A ^ B
{1, 2, 4, 5}
4
Τελεστές συνόλων
n Ισότητα, ανισότητα, (γνήσιο) υποσύνολο
>>> A={1,2,3}
>>> B={3,4,5}
>>> C={2,3}
>>> A == B
False
>>> A != B υποσύνολο
True
>>> C <= A γνήσιο υποσύνολο
True
>>> C < A
True
>>> C <= B
False
5
Μέθοδοι συνόλων
n Πρόσθεση, αφαίρεση στοιχείων, καθαρισµός
>>> x = {'a','b','c'} προσθέτει το ‘d’
>>> x.add('d')
>>> x
{'b', 'a', 'd', 'c'} προσθέτει το ‘b’
>>> x.add('b')
Το ‘b’ υπάρχει ήδη!
>>> x
{'b', 'a', 'd', 'c’} αφαιρεί το ‘c’
>>> x.remove('c')
>>> x
{'b', 'a', 'd'} καθαρίζει το σύνολο
>>> x.clear()
6
Άσκηση
n Φτιάξτε µια συνάρτηση union(lst) η οποία παίρνει
σαν όρισµα µια λίστα lst από σύνολα και επιστρέφει
την ένωση όλων των συνόλων
def union(lst): αρχικοποιεί ένα άδειο
u = set() σύνολο
for s in lst:
u=u|s
return u
Άσκηση
n Φτιάξτε µια συνάρτηση elim(lst) η οποία παίρνει
σαν όρισµα µια λίστα lst από αριθµούς και
επιστρέφει µια λίστα µε τα ίδια στοιχεία όπως η lst
χωρίς όµως διπλά στοιχεία. Κάντε χρήση
συνόλων.
8
Γραφικά Περιβάλλοντα
Γραφικό Περιβάλλον
n Οι περισσότερες εφαρµογές συνοδεύονται µε
ένα γραφικό περιβάλλον
¡ Ο χρήστης επικοινωνεί µε την εφαρµογή µέσω του
περιβάλλοντος
n Το γραφικό περιβάλλον βοηθάει το χρήστη να
εισάγει τα δεδοµένα του και να βλέπει τα
αποτελέσµατα µέσω παραθύρων.
2
Ανάπτυξη Γραφικού
Περιβάλλοντος στην Python
n Μέσω του module tkinter
n Επιτρέπει σχεδιασµό βασικών στοιχείων σε
παραθυρικά περιβάλλοντα, όπως κουµπιά,
ετικέττες, φόρµες εισαγωγής κειµένου, µενού,
κλπ.
n Τα στοιχεία αυτά αποκαλούνται widgets
n Θα κάνουµε µια µικρή εισαγωγή στη χρήση
του module tkinter
Το βασικό παράθυρο
4
Βάζοντας ετικέττες
>>> from tkinter import Tk, Label δηµιουργεί µια ετικέττα
>>> root = Tk() και την τοποθετεί στο root
>>> hello = Label(master = root, text = 'Hello GUI world!')
>>> hello.pack()
ορίζει αυτόµατα το πως θα
>>> root.mainloop() εµφανιστεί η ετικέττα
Παρουσίαση εικόνων
from tkinter import Tk, Label, PhotoImage
root = Tk() # the window
# transform GIF image to a format tkinter can display
photo = PhotoImage(file='car07a.gif')
car.pack()
root.mainloop()
6
Πακετάρισµα πολλών
widgets
from tkinter import Tk, Label, PhotoImage,BOTTOM,LEFT,RIGHT
root = Tk()
photo1 = PhotoImage(file='wheel.gif')
photo2 = PhotoImage(file='car07a.gif')
txt = Label(master=root,text = 'Driving my car with a steering wheel')
txt.pack(side=BOTTOM)
car = Label(master=root,image=photo1)
car.pack(side=LEFT)
car = Label(master=root,image=photo2)
car.pack(side=RIGHT)
root.mainloop()
8
Άσκηση
n Φτιάξτε µια συνάρτηση cal(year, month), που θα
παίρνει σαν όρισµα ένα έτος και ένα µήνα και θα
δείχνει σε ένα παράθυρο το αντίστοιχο ηµερολόγιο
n Π.χ.
>>> cal(2012, 2)
Άσκηση
n Για να λύσουµε την άσκηση θα χρησιµοποιήσουµε
το module calendar:
>>> from calendar import monthrange
>>> monthrange(2012, 2) # year 2012, month 2 (February)
(2, 29)
σηµαίνει Wednesday
0: Monday, 1: Tuesday, …
σηµαίνει ότι ο µήνας έχει
29 µέρες
10
Άσκηση
from tkinter import Tk, Label
from calendar import monthrange
def cal(year, month):
root = Tk()
daysofweek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
for i in range(7):
label = Label(root, text=daysofweek[i])
label.grid(row=0,column=i)
weekday, nodays = monthrange(year, month)
week = 1
for i in range(1,nodays+1):
label = Label(root, text=str(i))
label.grid(row=week,column=weekday)
weekday += 1
if weekday>6:
weekday=0
week +=1
root.mainloop()
11
12
Παράδειγµα µε κουµπί
>>>
Day: 14 Dec 2014
Time: 08:27:44 AM
13
Παράδειγµα µε κουµπί
16
Ερµηνεία της root.mainloop()
n Όταν καλείται η root.mainloop() η Python τρέχει το
εξής ατέρµον loop:
n while True:
περίµενε να συµβεί κάποιο γεγονός
κάλεσε τη συνάρτηση που χειρίζεται το γεγονός
n Ο παραπάνω βρόγχος τερµατίζει από µια
συνάρτηση χειρισµού
¡ Π.χ. πατώντας το κουµπάκι που κλείνει το κυρίως
παράθυρο
17
Άσκηση
n Αλλάξτε την άσκηση στη διαφάνεια 8 ώστε οι
ετικέττες να «πατιούνται» και να τυπώνεται ο
αριθµός και το σύµβολο που πατιούνται κάθε φορά
>>>
25470#51456#02
18
Άσκηση
from tkinter import Tk, Button
root = Tk()
labels = [['1', '2', '3'], # phone dial labels
['4', '5', '6'], # organized in a grid
['7', '8', '9'],
['*', '0', '#']] Συναρτήσεις
for r in range(4): χειρισµού
for c in range(3): κουµπιών
def clicked(x=labels[r][c]):
print(x,end='')
but = Button(root,
text=labels[r][c],
command=clicked)
but.grid(row=r, column=c)
root.mainloop()
19
Παράδειγµα µε φόρµα
label entry
button
messagebox
20
Παράδειγµα µε φόρµα (Entry)
from tkinter import Tk, Button, Entry, Label, END
from time import strptime, strftime
from tkinter.messagebox import showinfo
def compute(): Μετατρέπει
global dateEnt # dateEnt is a global variable αλφαριθµητικό
date = dateEnt.get() # read date from entry dateEnt σε αντικείµενο
# compute weekday corresponding to date χρόνου
weekday = strftime('%A', strptime(date, '%b %d, %Y'))
# display the weekday in a pop-up window
showinfo(message = '%s was a %s' % (date, weekday))
dateEnt.delete(0, END) # delete date from entry dateEnt
root = Tk()
label = Label(root, text='Enter date')
label.grid(row=0, column=0)
dateEnt = Entry(root) Πιάνει 2 στήλες
dateEnt.grid(row=0, column=1)
button = Button(root, text='Enter', command=compute)
button.grid(row=1, column=0, columnspan=2)
root.mainloop() 21
Μέθοδοι φορµών
n e.get() Επιστρέφει το αλφαριθµητικό που υπάρχει
στη φόρµα e
n e.insert(index, text) Εισάγει το αλφαριθµητικό text
µέσα στη φόρµα e στη θέση index. Αν index=END το
text προστίθεται στο τέλος
n e.delete(from, to) Διαγράφει όλους τους
χαρακτήρες από τη θέση from στη θέση to. Π.χ. η
delete(0, END) διαγράφει όλο το κείµενο από τη
φόρµα
22
Άσκηση
n Φτιάξτε ένα πρόγραµµα που θα παίρνει από το
χρήστη ένα ποσό, ένα επιτόκιο (%) και έναν αριθµό
ετών και θα υπολογίζει πόσο θα έχει γίνει το ποσό
µετά τον αριθµό ετών
23
Άσκηση
from tkinter import Tk, Button, Entry, Label, END
from tkinter.messagebox import showinfo
def compute():
global amountEnt # amountEnt is a global variable
amount = amountEnt.get() # read amount from entry amountEnt
global rateEnt # rateEnt is a global variable
rate = rateEnt.get() # read rate from entry rateEnt
global yearsEnt # yearsEnt is a global variable
years = yearsEnt.get() # read years from entry yearsEnt
# compute amount plus interest
result = eval(amount)
for i in range(int(years)):
result = result*(1+eval(rate)/100)
# display the result in a pop-up window
showinfo(message = 'Your amount after %s years will be %.2f' % (years, result))
amountEnt.delete(0, END) # delete amount
rateEnt.delete(0, END) # delete rate
yearsEnt.delete(0, END) # delete years συνεχίζεται
24
Άσκηση
root = Tk() Ορίζει τον τίτλο του παραθύρου
root.title("Interest")
label1 = Label(root, text='Amount:’)
label1.grid(row=0, column=0)
amountEnt = Entry(root)
amountEnt.grid(row=0, column=1)
label2 = Label(root, text='Rate:’)
label2.grid(row=1, column=0)
rateEnt = Entry(root)
rateEnt.grid(row=1, column=1)
label3 = Label(root, text='Years:’)
label3.grid(row=2, column=0)
yearsEnt = Entry(root)
yearsEnt.grid(row=2, column=1)
button = Button(root, text='Calculate', command=compute)
button.grid(row=3, column=0, columnspan=2)
root.mainloop()
25
Παράδειγµα µε κείµενο
text
>>>
char = h
char = e
char = l
char = l
char = o
char = space
char = w
char = o
26
Παράδειγµα µε κείµενο (Text)
from tkinter import Tk, Text, BOTH
def record(event):
'''event handling function for key press events;
input event is of type tkinter.Event'''
print('char = %s' % event.keysym) # print key symbol
root = Tk()
text = Text(root,
width=20, # set width to 20 characters
height=5) # set height to 5 rows of characters
# Bind a key press event with the event handling function record()
text.bind('<KeyPress>', record)
# widget expands if the master does
text.pack(expand=True, fill=BOTH)
root.mainloop()
συνάρτηση που καλείται για κάθε
γεγονός τύπου <KeyPress>
Πρέπει να έχει σαν όρισµα το event
27
28
«Δέσιµο» γεγονότος σε
συνάρτηση χειρισµού
n text.bind('<KeyPress>', record)
n Δένει το γεγονός που περιγράφεται µε το
αλφαριθµητικό '<KeyPress>' στη συνάρτηση record
n Γενικά οι τύποι γεγονότων έχουν τη µορφή:
¡ <modifier-type-detail>
n Παραδείγµατα:
¡ <Control-Button-1>: Ctrl + left mouse button
¡ <Button-1><Button-3>: left mouse button, then right
mouse button
¡ <KeyPress-D><Return>: D, then Enter/Return
29
Παραδείγµατα Γεγονότων
n <modifier-type-detail>
30
Η συνάρτηση χειρισµού
παίρνει σαν όρισµα το γεγονός
n def record(event):
print('char = %s' % event.keysym)
n Ένα αντικείµενο γεγονότος έχει διάφορα
χαρακτηριστικά τα οποία µπορούµε να χειριστούµε
µέσα στη συνάρτηση
31
Παράδειγµα µε καµβά
canvas
32
Παράδειγµα µε καµβά (canvas)
from tkinter import Tk, Canvas
def begin(event):
'initializes the start of the curve to mouse position'
global oldx, oldy
oldx, oldy = event.x, event.y
def draw(event):
'draws a line segment from old mouse position to new one'
global oldx, oldy, canvas # oldx and oldy will be modified
newx, newy = event.x, event.y # new mouse position
# connect previous mouse position to current one
canvas.create_line(oldx, oldy, newx, newy)
oldx, oldy = newx, newy # new position becomes previous
root = Tk()
oldx, oldy = 0, 0 # mouse coordinates (global variables)
canvas = Canvas(root, height=100, width=150) # canvas
# bind left mouse button click event to function begin()
canvas.bind("<Button-1>", begin)
# bind mouse motion while pressing left button event
canvas.bind("<Button1-Motion>", draw)
canvas.pack()
root.mainloop()
33
34
Επαναληπτικές Ασκήσεις
Λίστες
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν
όρισµα 2 λίστες και θα επιστρέφει το γινόµενo των
2 «µεσαίων» στοιχείων τους.
¡ Π.χ. L1 = [5,1,3,2,4], L2 = [9,2,1,8,0]
¡ median(L1) = 3, median(L2) = 2
¡ result = 6
def multimedians(L1,L2):
L1.sort()
L2.sort()
return L1[len(L1)//2]*L2[len(L2)//2]
2
Αλφαριθµητικά
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν
όρισµα ένα αλφαριθµητικό, το οποίο θα είναι ένα
κείµενο, και θα επιστρέφει τη λέξη µε τους
περισσότερους χαρακτήρες. Η συνάρτηση θα
πρέπει να µην υπολογίζει τυχόν τελείες ως µέρη
των λέξεων. def longest(s):
¡ Π.χ. s = ‘I went to the shops s2 = s.replace('.',' ')
today. I bought a cake.’ l = s2.split()
¡ result = ‘bought’ res = ''
for w in l:
if len(w)>len(res):
res = w
return res
3
Αλφαριθµητικά
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν
όρισµα ένα αλφαριθµητικό και θα επιστρέφει ένα
αντίγραφό του, όπου οι τελευταίοι 5 χαρακτήρες
θα είναι µε ανεστραµµένη σειρά.
¡ Π.χ. s = ‘I went to the market’
¡ result = ‘I went to the mtekra’
def rev(s):
x = s[-5:]
l = list(x)
l.reverse()
y = ''.join(l)
return s[:-5]+y
4
Λεξικά
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν όρισµα
ένα αλφαριθµητικό, το οποίο θα είναι ένα κείµενο, και θα
επιστρέφει ένα λεξικό, όπου για κάθε µήκος θα
καταγράφεται πόσες λέξεις έχουν αυτό το µήκος. Η
συνάρτηση θα πρέπει να µην υπολογίζει τυχόν τελείες ως
µέρη των λέξεων. def lengths(s):
¡ Π.χ. s = ‘I went to the shops s2 = s.replace('.',' ')
today. I bought a cake.’ l = s2.split()
¡ result = d = {}
{1: 3, 2: 1, 3: 1, 4: 2, 5: 2, 6: 1} for w in l:
if len(w) in d:
d[len(w)] += 1
else:
d[len(w)] = 1
return d 5
Έλεγχος ροής
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν
όρισµα µια λίστα και θα επιστρέφει µια νέα λίστα,
η οποία θα έχει µόνο τα στοιχεία που δεν είναι 0.
¡ Π.χ. L = [3,2,1,0,3,2,0,2]
¡ result = [3,2,1,3,2,2]
def nozeros(L):
L2 = []
for x in L:
if x != 0:
L2.append(x)
return L2
6
Έλεγχος ροής
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν
όρισµα µια λίστα και θα επιστρέφει µια νέα λίστα, η
οποία θα έχει µόνο τα στοιχεία µέχρι το πρώτο 0.
¡ Π.χ. L = [3,2,1,0,3,2,0,2]
¡ result = [3,2,1]
def untilzero(L):
L2 = []
for x in L:
if x == 0:
break
L2.append(x)
return L2
Έλεγχος ροής
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν
όρισµα µια λίστα και θα επιστρέφει µια νέα λίστα, η
οποία θα έχει µόνο τα στοιχεία µέχρι το πρώτο 0,
αλλά χωρίς τα 2.
¡ Π.χ. L = [3,2,1,0,3,2,0,2] def untilzeronotwos(L):
¡ result = [3,1] L2 = []
for x in L:
if x == 0:
break
if x != 2:
L2.append(x)
return L2
8
Έλεγχος ροής
n Γράψτε την προηγούµενη συνάρτηση ξανά, αλλά µε
χρήση while αντί για if.
def untilzeronotwos2(L):
L2 = []
while L:
x = L.pop(0)
if x == 0:
break
if x != 2:
L2.append(x)
return L2
Έλεγχος ροής
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν
όρισµα ένα θετικό ακέραιο n και θα τυπώνει τις
δυνάµεις του 2 απο το 21 εώς το 2n χωρισµένες µε
διαστήµατα
¡ Π.χ. n = 6
¡ result = 2 4 8 16 32 64
def powers(n):
for i in range(1,n+1):
print(pow(2,i), end=' ')
10
Έλεγχος ροής
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν
όρισµα µια λίστα αριθµών και θα επιστρέφει True αν
η λίστα είναι αριθµητική ακολουθία, αλλιώς False.
¡ Αριθµητική ακολουθία: η διαφορά µεταξύ συνεχόµενων
στοιχείων είναι σταθερή
¡ Π.χ.
def arithmetic(L):
¡ L = [3,6,9,12,15] True if len(L)<2:
¡ L = [3,6,9,10,13] False return True
¡ L = [3] True diff = L[1]-L[0]
for i in range(1,len(L)-1):
if L[i+1]-L[i] != diff:
return False
return True
11
Έλεγχος ροής
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν
όρισµα ένα αλφαριθµητικό και θα επιστρέφει το
ακρώνυµό του. Η συνάρτηση θα πρέπει να
µετατρέπει τα πεζά σε κεφαλαία όπου χρειάζεται
¡ Π.χ. s = ‘central processing unit’
¡ result = ‘CPU’
def acronym(s):
L = s.split()
res = ''
for w in L:
res = res + w[0].upper()
return res
12
Έλεγχος ροής
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν
όρισµα µια λίστα L θα µετατρέπει κάθε στοιχείο L[i]
της L στο άθροισµα των στοιχείων απο τη θέση i και
µετά
¡ Π.χ. L = [2, 5, 6, 4, 3, 0]
L = [20, 18, 13, 7, 3, 0]
def rangesum(A):
for i in range(len(A)-1):
A[i] = sum(A[i:])
def rangesum(A):
if len(A)>1:
for i in range(len(A)-2,-1,-1):
A[i] += A[i+1]
13
Έλεγχος ροής
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν
όρισµα µια λίστα L, θα βρίσκει την υπολίστα της L µε
το µέγιστο άθροισµα και θα επιστρέφει το άθροισµα.
¡ Π.χ. L = [2, -5, 6, 4, -3, 10, -2, 1]
result = 17
def maxsublist(L):
m = L[0] # first elem of L
for i in range(len(L)): #start index
for j in range(i,len(L)): #end index
if sum(L[i:j]) > m:
m = sum(L[i:j])
return m
14
Έλεγχος ροής
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν
όρισµα ένα δισδιάστατο πίνακα Α και θα τον
µετατρέπει ώστε κάθε στοιχείο στην πρώτη στήλη να
είναι το άθροισµα όλων των στοιχείων της γραµµής
του
¡ Π.χ. A = [[2, 5],
[6, 4]]
A = [[7, 5],
[10, 4]]
def rowsum(A):
for i in range(len(A)):
A[i][0] = sum(A[i])
15
Έλεγχος ροής
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν
όρισµα ένα θετικό ακέραιο n και θα επιστρέφει
πόσες φορές µπορούµε να διαιρέσουµε το n µε το 2
(ακέραια διαίρεση) µέχρι το n να γίνει 1
¡ Π.χ. n = 25
result = 4
def intlog(n):
i=0
while n>1:
n//=2
i+=1
return i
16
Συναρτήσεις
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν
υποχρεωτικά ορίσµατα δύο αριθµούς x και y και
ένα προεραιτικό όρισµα z (z=1 αν δεν ορίζεται) και
θα επιστρέφει τον αριθµό των βηµάτων από τον x
µέχρι τον y αν το κάθε βήµα είναι z.
¡ Π.χ. x = 4, y = 11, z =2
¡ result = 4 def numsteps(x,y,z=1):
(4-6, 6-8, 8-10, 10-11) if y<=x: return 0
numsteps = (y-x)//z
if (y-x)%z:
numsteps +=1
return numsteps
17
Αναδροµικές Συναρτήσεις
n Γράψτε µια αναδροµική συνάρτηση, η οποία θα
υπολογίζει τον µέγιστο κοινό διαιρέτη δύο αριθµών
χρησιµοποιώντας τον αλγόριθµο του Ευκλείδη:
¡ gcd(a,0) = a
¡ gcd(a,b) = gcd(b, a mod b) def gcd(a,b):
¡ Π.χ. gcd(48,18) = if b==0: return a
gcd(18, 12) = return gcd(b, a%b)
gcd(12, 6) =
gcd(6, 0) =
6
# non-recursive
def gcd(a,b):
while b: a, b = b, a%b
return a
18
Αναδροµικές Συναρτήσεις
n Γράψτε µια αναδροµική συνάρτηση, η οποία θα
παίρνει σαν όρισµα ένα θετικό ακέραιο n και θα
επιστρέφει πόσες φορές µπορούµε να διαιρέσουµε
το n µε το 2 (ακέραια διαίρεση) µέχρι το n να γίνει 1
¡ Π.χ. n = 25
result = 4
def intlog_rec(n):
if n<=1: return 0
return 1 + intlog_rec(n//2)
19
Ταξινόµηση
n Τροποποιήστε τη bubblesort ώστε να ταξινοµεί µια
λίστα αριθµών βάζοντας πρώτα τους ζυγούς σε
αύξουσα σειρά και µετά τους µονούς σε φθίνουσα
σειρά def BubbleSort(lst):
¡ Π.χ. for i in range(len(lst)): # rounds
[2, 5, 6, 4, 3, 0] -> for j in range(0,len(lst)-i-1): # i-th round
[0, 2, 4, 6, 5, 3] if lst[j]%2 : # odd number
if lst[j+1] % 2 == 0 or lst[j]<lst[j+1]:
lst[j],lst[j+1] = lst[j+1],lst[j]
else: # even number
if lst[j+1] % 2 == 0 and lst[j]>lst[j+1]:
lst[j],lst[j+1] = lst[j+1],lst[j]
20
Αρχεία
n Γράψτε µια συνάρτηση, η οποία θα παίρνει σαν
όρισµα ένα όνοµα αρχείου, θα διαβάζει το αρχείο
και θα γράφει σέ ένα άλλο αρχείο µε όνοµα
stats.txt, τον αριθµό των χαρακτήρων, λέξεων, και
γραµµών. def fstats(filename):
¡ Π.χ. try:
testfile.txt f = open(filename)
s = f.read()
Hello, World! except IOError:
How are you? print('Error reading',filename)
return
stats.txt g = open('stats.txt','w')
g.write('%d,%d,%d' %
26,5,2 (len(s),len(s.split()),s.count('\n')+1))
21
Εξαιρέσεις
n Γράψτε µια συνάρτηση, η οποία θα ζητάει από το χρήστη να
δίνει αριθµούς µέχρι να δώσει κενό. Η συνάρτηση να
επιστρέφει τότε το µέσο όρο και τον µεσαίο (median) των
αριθµών που έχουν εισαχθεί σαν µια πλειάδα. Αν ο χρήστης
εισάγει µη έγκυρο αριθµό, η συνάρτηση θα επιστρέφει τα
στατιστικά των µεχρι τότε αριθµών
¡ Π.χ.
13
1
2
4
4x
result = (5, 4)
22
Εξαιρέσεις (συνέχεια)
def stats():
L = []
while True:
s = input()
if not s: break
try:
L.append(eval(s))
except:
break
L.sort()
if len(L)>0:
return (float(sum(L))/len(L), L[len(L)//2])
23