- Αλέξανδρος Καντεράκης. kantale@ics.forth.gr
- Τσατ: https://gitter.im/CRETE_PYTHON_2018/Lobby (δοκιμαστικό)
- 8 Νοεμβρίου 2018 . 11:00 - 14:00, 7A-02
- 22 Νοεμβρίου 2018 . 11:00 - 14:00, 7Α-04
- 23 Νοεμβρίου 2018 . 10:00 - 13:00, 7Α-02
- 29 Νοεμβρίου 2018 . 11:00 - 14:00, 7Α-01
- 6 Δεκεμβρίου 2018 . 9:00 - 12:00, 7Α-01 (ίσως ΔΙΕΠ)
13 δεκεμβρίου 2018 . 9:00 - 12:00, 7Α-01 (ίσως ΔΙΕΠ)- 18 Δεκεμβρίου 2018. 12:00 - 15:00
- Γιατί jupyter; https://www.nature.com/articles/d41586-018-07196-1
- pythoncheatsheet . Πολύ καλό και "συμπαγές" σημείο αναφοράς. Χρήσιμο όταν έχεις ξεχάσει πως γίνεται κάτι.
- 28 Jupyter Notebook tips, tricks and shortcuts - Dataquest. From Thimo. Thanks!
- Βιβλίο: automating the boring stuff with python
- Challenges: https://www.hackerrank.com/dashboard
- Θα δωθούν 5 σειρές ασκήσεων, μία κάθε 2 εβδομάδες περίπου. Η κάθε σειρά μετράει στο 10% του βαθμού (συνολικά 50%).
- Στο τέλος της χρονιάς θα δωθεί ένα project. Το project θα μετρήσει για το 60% του βαθμού.
- Διάλεξη 1η, 11 Οκτωβρίου 2018. Το υλικό είναι το ίδιο με τη 1η διάλεξη του 2017-2018, μέχρι και το σημείο [252] (λίστες). Στο επόμενο μάθημα φέρτε λάπτοπ! Επίσης μελετήστε markdown. Εδώ υπάρχουν το βασικά, τα οποία είναι αρκετά για το μάθημα. Στο επόμενο μάθημα θα εγκαταστήσουμε anaconda python και θα δείξουμε τα βασικά του jupyter.
- Διάλεξη 2η, 15 Οκτωβρίου 2018 . Το υλικό είναι ίδιο με τη 1η διάλεξη του 2017-2018 από το κεφάλαιο "Λίστες" και μετά. Το υλικό συμπληρώνεται με τη 2η διάλεξη του 2017-2018 από την αρχή μέχρι το κεφάλαιο για το
while
(χωρίς αυτό). Προσπαθήστε να πειραματιστείτε με Jupyter και με αυτά που είπαμε. Μαζέψτε απορίες να τις συζητήσουμε στο επόμενο μάθημα! - Διάλεξη 3η, 25 Οκτωβρίου 2018. To υλικό είναι το ίδιο με τα κεφάλαιο "List Comprehensions" και "while" της διάλεξης της προηγούμενης χρονιάς. Επίσης μελετήστε το κομμάτι if_then_else επίσης από πέρσι. Επίσης μπορείτε να δείτε τις (πολύ) πρόχειρες σημειώσεις από τη διάλεξη
- Διάλεξη 4η. 1 Νοεμβρίου 2018. Διαβάστε τα Functions και τη συνάρτηση map από τις περσινές διαλέξεις. Επίσης μπορείτε να βρείτε και τις πρόχειρες σημειώσεις του μαθήματος
- Διάλεξη 5η. 8 Νοεμβρίου 2018. Διαβάζουμε για τα dictionaries από πέρσι και για iteration σε dictionary και dictionary comprehension επίσης από πέρσι. Επίσης διαβάζουμε για τα σύνολα (sets) και για τα set comprehensions. Σε αυτό το gist βρίσκονται οι πρόχειρες σημειώσεις του σημερινού μαθήματος
- Διάλεξη 6η. 22 Νοεμβρίου 2018. Μελετάμε: Sorting, lambda functions + generators. Εδώ βρίσκονται οι πρόχειρες σημειώσεις του μαθήματος
- Διάλεξη 7η. 23 Νοεμβρίου 2018. Διαβάζουμε files και serialization από τις περσινές διαλέξεις. Οι πρόχειρες σημεώσεις του μαθήματος είναι εδώ
- Διάλεξη 8η. 29 Νοεμβρίου 2018. Διαβάζουμε regular expressions από τις περσινές διαλέξεις και Exceptions. Οι πρόχειρες σημειώσεις βρίσκονται εδώ
- Διάλεξη 9η. 8 Δεκεμβρίου 2018 . Διαβάζουμε
- Διάλεξη 10η. 20 Δεκεμβρίου 2018.
- Διαβάζουμε περί numpy από τις περσινές σημειώσεις
- Πρόχειρες σημειώσεις
- Διάλεξη 11η. 10 Ιανουαρίου 2019
- Διαβάζουμε: Τις σημειώσεις από το 2016-2017 για matplotlib
- Διαβάζουμε: Τις σημείωσεις από το 2017-2018 για bokeh
- Καλό είναι να ρίξετε και μια ματιά στις βιβλιοθήκες seaborn και plot.ly
- Πρόχειρες σημειώσεις
- Διάλεξη 12η. 17 Ιανουαρίου 2019
- Διαβάζουμε τις περυσινές σημειώσεις για pandas
- Επίσης pandas cheatsheet
- Πρόχειρες σημειώσεις
- Διάλεξη 13η, 24 Ιανουαρίου 2019
- Διάβάζουμε κλάσεις 1ο μέρος από τις περυσινές σημείωσεις
- Διαβάζουμε κλάσεις 2ο και 3ο μέρος απο πέρσι
- Διαβάζουμε τις σημείωσεις του Σπύρου Χαυλή από το έτος 2016-2017
- Πρόχειρες σημείωσεις
Όλες οι ερωτήσεις των ασκήσεων είναι ισοδύναμες. Η τελική ημερομηνία παράδοσης είναι 28 Φεβρουαρίου 2019. Προσοχή: Η τελική ημερομηνία παράδοσης είναι μακριά ακριβώς για να κάνετε τον δικό σας σχεδιασμό χρόνου. ΔΕΝ ΘΑ ΔΟΘΕΙ ΠΑΡΆΤΑΣΗ ΓΙΑ ΜΕΤΑ ΤΙΣ 28 ΦΕΒΡΟΥΑΡΙΟΥ. Επίσης θα πρέπει να έχετε στείλει τουλάχιστον μία προσπάθεια για τις ασκήσεις μέχρι την ημερομηνία που αναγράφεται στη λίστα. Μπορείτε να στέλνετε τις απαντήσεις σταδιακά. Δηλαδή μπορείτε να στείλετε μόνο τις απαντήσεις συγκεκριμμένων ερωτημάτων τώρα και τις υπόλοιπες μετά από 1 μήνα ή όποτε θέλετε. Επίσης αν στείλετε μία απάντηση λάθος επειδή δεν καταλάβατε την εκφώνηση μπορείτε να τη ξαναστείλετε. Μπορεί να φαίνονται ελαστικά τα παραπάνω αλλά πρέπει να έχετε υπόψην σας ότι κάθε σειρά ασκήσεων θα έχει πολλά ερωτήματα. Κάντε σωστό πλάνο. Συμβουλέυω να δουλεύετε τις ασκήσεις σε εβδομαδιαία βάση και να στέλνετε ό,τι έχετε έτοιμο στο τέλος της εβδομάδας.
Η χρήση google επιτρέπεται και ενθαρρύνεται. Απλά, θα πρέπει να βάζετε σε σχόλια τα links τα οποία θεωρείτε ότι σας βοήθησαν στη λύση σας. Μη κάνετε copy/paste λύσεις που βρίσκετε στο Internet. Αν βρείτε μία λύση, μελετήστε τη, δείτε "πως το έκανε" και ξαναγράφτε τη λύση με το δικό σας τρόπο. Αν έχετε κολήσει, στείλτε μέιλ!
Περί αντιγραφής: Δεν πρόκειται να κάνω κάποιον σοβαρό έλεγχο για αντιγραφή και ποινές (μηδενισμός) θα υπάρξουν μόνο για πολύ κραυγαλέες περιπτώσεις. Για ό,τι δεν μπορείτε να λύσετε, δεν "βγαίνει", δεν έχετε καταλάβει στείλτε mail να το δούμε μαζί! Εκμεταλευτείτε το μάθημα στο έπακρο για να μάθετε ένα εργαλείο που θα σας είναι απαραίτητο στο μέλλον!
Mail με απορίες είναι ευπρόσδεκτα. Αν είσαστε στο δίλημμα αν πρέπει ή δεν πρέπει να στείλετε mail, τότε στείλτε mail! Απλά βοηθήστε με να σας βοηθήσω. Το mail σας θα πρέπει να περιέχει απαραίτητα τον κώδικα που έχετε δοκιμάσει και δεν δούλεψε. Μην στέλνετε mail "δοκίμασα να κάνω list comprehension αλλά δεν δούλεψε". Επίσης στείλετε είτε το error που πετάει είτε τη λάθος λύση.
Οι ασκήσεις μπορούν να παραδοθούν στέλνοντας τις λύσεις με email στο kantale@ics.forth.gr με έναν από τους παρακάτω τρόπους:
- Στείλτε ένα .ipynb (jupyter notebook) αρχείο ως attachment με τις λύσεις.
- Στείλτε ένα .py (python) αρχείο ως attachment με τις λύσεις.
- Στείλτε ένα link στο gist με το jupyter notebook με τις λύσεις.
- Στείλτε ένα link στο gist με τον python κώδικα με τις λύσεις.
Σε κάθε περίπτωση βάζετε σε σχόλια (ή σε markdown) τον αριθμό της άσκησης που λύνετε
- ΣΕΙΡΑ ΑΣΚΗΣΕΩΝ 1 Αρχική παράδοση μέχρι: 9 Δεκεμβρίου 2018
- ΣΕΙΡΑ ΑΣΚΗΣΕΩΝ 2 Αρχική παράδοση μέχρι: 23 Δεκεμβρίου 2018
- ΣΕΙΡΑ ΑΣΚΗΣΕΩΝ 3 Αρχική παράδοση μέχρι: 6 Ιανουαρίου 2019
- ΣΕΙΡΑ ΑΣΚΗΣΕΩΝ 4 Αρχική παράδοση μέχρι: 20 Ιανουαρίου 2019
- ΣΕΙΡΑ ΑΣΚΗΣΕΩΝ 5 Αρχική παράδοση μέχρι: 3 Φεβρουαρίου 2019
- Περιγραφή Project Αρχική παράδοση μέχρι 28 Φεβρουαρίου 2019
- Η άσκηση βγάζει λάθος αποτέλεσμα και κάποια ψήγματα υλοποίησης έχουν γίνει.
- Η άσκηση βγάζει λάθος αποτέλεσμα αλλά έχει υλοποιηθεί ένα μικρό κομμάτι της λύσης.
- Η άσκηση βγάζει λάθος αποτέλεσμα αλλά έχει υλοποιηθεί ένα σημαντικό κομμάτι της λύσης.
- Η άσκηση βγάζει λάθος αποτελέσματα λόγω πολύ σημαντικών λαθών στη λογική.
- Η άσκηση βγάζει λάθος αποτέλεσμα λογω λαθών στη λογική
- Η άσκηση βγάζει λάθος αποτέλεσμα λόγω μικρών λαθών στη λογική.
- H άσκηση βγάζει σωστό αποτέλεσμα, αλλά όχι για όλα τα πιθανά σενάρια/inputs.
- Η άσκηση βγάζει σωστό αποτέλεσμα, αλλά η λογική σας έχει κάποιο λάθος (συμβαίνει πολλές φορές..).
- Η άσκηση βγάζει σωστό αποτέλεσμα, αλλά υπάρχει μία προφανής πιο γρήγορη/σύντομη λύση.
- Η άσκηση είναι αλάνθαστη. Μπράβο!
- Αποφεύγετε να βάζετε κενά (spaces) σε ονόματα αρχείων. Δυσκολεύουν (κάνουν πιο πολύπλοκα) τα scripts που τα αναλύουν
- Μη χρησιμοποιείτε λέξεις που είναι ονόματα global συναρτήσεων της python για ονόματα μεταβλητών. Δηλαδή αποφεύγουμε:
sum=0
min=1
Δοκιμάστε και το εξής:
print (sum([1,2,3,]) # Prints 6
sum = 0
print (sum([1,2,3,]) # Petaei error! H sum sunarthsh xa8hke!!!
- Αυτά τα 2 είναι ισοδύναμα:
if a>b:
return True
else:
return False
return a>b
Το δεύτερο εννοείται είναι προτιμότερο.
- H python δεν απαιτεί παρενθέσεις σε if και return. Τα παρακάτω είναι ισοδύναμα:
if (a>b):
if a>b:
To ίδιο και στη return
.
-
To ξέρω ότι ακούγεται αυτιστικό, αλλά στη python ΔΕΝ χρησιμοποιούμε camel case, χρησιμοποιούμε snake case (και καλά python, snake κ'έτσ'). Δηλαδή προτιμάμε:
optimal_solution
απόoptimalSolution
. Θυμηθείτε: readability counts! -
Όταν χρησιμοποιείτε boolean μεταβλητές (True/False) μην τις βάζετε τιμές 0 και 1 (μπορείτε, αλλά είναι άσχημο). Χρησιμοποιήστε
True
καιFalse
.
This is ugly:
found = 0
# Add amazing code here
if found == 1:
print ("Found!")
This is pretty:
found = False
# Add amazing code here
if found:
print ("Found!")
- Προσπαθήστε να χρησιμοποιείτε όσο το δυνατόν λιγότερο global μεταβλητές. Προσπαθήστε οι λύσεις σας να βρίσκονται σε self contained συναρτήσεις. Η python επιτρέπει σε μία συνάρτηση να προσπελαύνει μεταβλητές που έχουν οριστεί έξω από τη συνάρτηση. Στις υλοποιήσεις σας θα πρέπει να αποφεύγετε όσο μπορείτε αυτό. Κάθε μεταβλητή θα πρέπει να δημιουργείται σε μία συνάρτηση. Επίσης κάθε συνάρτηση δεν πρέπει να "εξαρτάται" από μεταβλητές που έχουν οριστεί έξω από αυτή. Ιδανικά αν κάποιος κάνει copy-paste τη συνάρτησή σας θα πρέπει να τρέχει. Μία καλή τακτική είναι να μην υπάρχει ΚΑΜΙΑ μεταβλητή που να μην έχει δηλωθεί σε κάποια συνάρτηση. Αυτό κάνει τον κώδικα πολύ πιο ευανάγνωστο!
Για παράδειγμα: Φτιάξτε μία συνάρτηση που παίρνει μία λίστα και επιστρέφει μία νέα λίστα που περιέχει μόνο τους άρτιους αριθμούς της πρώτης λίστας. Λάθος τρόπος:
new_list = []
def f(l)
for i in l:
if i % 2 == 0:
new_list.append(i)
Σωστός τρόπος:
def f(l):
new_list = []
for i in l:
if i % 2 == 0:
new_list.append(i)
return new_list
Ακόμα πιο σωστός τρόπος:
def f(l):
return [i for i in l if i%2==0]
- Don't repeat yourself. Μαθαίνουμε προγραμματισμό για να κάνουμε τη ζωή μας πιο εύκολη και πιο ενδιαφέρουσα. Με τον προγραμματισμό βάζουμε τον υπολογιστή να κάνει τα βαρετά πράγματα για να επικεντρωθούμε εμείς στα ενδιαφέροντα. Αν βρείτε τον εαυτό σας να επαναλαμβάνει ή να κάνει copy/paste τις ίδιες γραμμές κώδικα, τότε κάτι έχετε κάνει λάθος.
Παράδειγμα: Βρείτε το άθροισμα όλων των αριθμών από το 1 μέχρι το 20.
RY (Repeat Yourself) λύση:
print (1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20)
DRY λύση:
print (sum(range(1,21))
- (Λίγο ψαγμένο αυτό). Πολλές φορές χρησιμοποιούμε μία boolean μεταβλητή για να δούμε αν ο αλγόριθμός μας έχει κάνει break από μία loop. π.χ, Έστω ότι ψάχνουμε να βρούμε αν μία λίστα έχει έναν άρτιο(ζυγό) αριθμό (δεν μας νοιάζει πόσους άρτιους έχει, αρκεί να έχει έναν)
found = False
for x in my_list:
if x%2==0:
found = True
break
if not found:
print ("Did not found even")
Μπορούμε να υλοποιήσουμε αυτό χωρίς τη found? Ναι, με την else
!.
for x in my_list:
if x%2 == 0:
break
else:
print ("Did not found even")
- Είναι εντυπωσιακό άλλα πάρα πολλές φορές βλέπω το εξής: Ζητάω να βρω το μεγαλύτερο (ή μικρότερο) σε μία λίστα και φτιάχνετε μία for η οποία ελέγχει όλα τα στοιχεία αν είναι ίσα με το μικρότερο. Αφού έχετε βρεί το μικρότερο γιατί δεν το.. τελειώνετε εκεί; Για παράδειγμα. Βρείτε το μικρότερο στοιχεία της λίστας
a = [5,6,4,7]
Λάθος τρόπος:
m = min(a)
for x in a:
if x == m:
print (x)
Επίσης λάθος τρόπος:
for x in a:
m = min(a)
if x == m:
print (x)
Σωστός τρόπος:
min(a)
-
Προσπαθήστε οι υλοποιήσεις σας είναι σε μικρές και χαριτωμένες συναρτησούλες. Κάθε συναρτησούλα πρέπει να είναι (όσο το δυνατόν) αυτόνομη. Αποφύγεται τα "σεντόνια κώδικα".
-
Προσπαθήστε ο κώδικάς σας να έχει όσο το δυνατόν λιγότερο identation. Ένας κώδικας που έχει if μέσα σε for μέσα σε μια άλλη if κτλ, δεν είναι ευανάγνωστος.
Παραδείγματα 1: Μία συνάρτηση που παίρνει ένα string του οποίου το μήκος πρέπει να διαιρείται με 3:
Λάθος:
def f(s):
if len(s)%3==0:
papades..
else:
raise Exception('The length of s is not divided exactly to 3')
Σωστό:
def f(s):
if len(s)%3:
raise Exception('The length of s is not divided exactly to 3')
papades..
Προσέξτε και οι δύο κάνουν ακριβώς το ίδιο, αλλά η στη 2η η papades...
είναι ένα identation πιο μέσα.
2ο Παράδειγμα. Παρσάρετε ένα αρχείο. Αν η γραμμή του αρχίζει από '#' τότε θεωρήστε ότι είναι σχόλιο και αγνοήστε τη.
Λάθος:
with open(file) as f:
for line in f:
if line[0] != '#':
papades...
Σωστό:
with open(file) as f:
for line in f:
if line[0] == '#':
continue
papades...
Πάλι προσέξτε ότι η papades...
είναι ένα identation πιο μέσα.
-
Όταν λέμε υλοποιήστε κάτι με numpy δεν εννοούμε αντί να χρησιμοποιήσετε λίστες, να χρησιμοποιήσετε numpy arrays! Αλλά να χρησιμοποιήσετε τους μηχανισμούς της numpy που κάνουν γρήγορα υπολογισμούς. Ένας πολύ καλός τρόπος να το κάνετε αυτό είναι απλά, να μη χρησιμοποιήσετε for και while όταν δουλεύετε με numpy. Αν βάλετε for και while σε numpy ΔΕΝ εκμεταλευόσαστε τη τεράστια ταχύτητα που έχει.
-
Προσπαθήστε οι επιλογές στα if, else κτλ να είναι όσο το δυνατόν πιο συγκεκριμμένες. Δεν πειράζει να βάλετε 2-3 γραμμές παραπάνω για να είστε σίγουροι ότι θα εκτελεστεί ο σωστός κώδικας. Για παράδειγμα, ας υποθέσουμε ότι το x μπορεί να πάρει μόνο 3 τιμές 1,2,3 και ανάλογα με τη τιμη του x, το πρόγραμμά μας κάτι κάνει.
Λάθος:
if x == 1:
# actions for when x==1
elif x == 2:
# actions for when x==2
else:
# actions for when x==3
Το πρόβλημα με το παραπάνω είναι ότι αν για κάποιο λόγο το x πάρει τιμή διαφορετικό από το 1,2,3 (συμβαίνει πιο συχνά απ' ό,τι νομίζετε..) τότε το πρόγραμμά σας θα θεωρείσει ότι το x είναι 3.
Σωστό:
if x == 1:
# actions for when x==1
elif x == 2:
# actions for when x==2
elif x == 3
# actions for when x==3
else:
raise Exception('Invalid x value')