- Αποφεύγετε να βάζετε κενά (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 Falsereturn 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")Το ίδιο ισχύει και για τη while.
- Είναι εντυπωσιακό άλλα πάρα πολλές φορές βλέπω το εξής: Ζητάω να βρω το μεγαλύτερο (ή μικρότερο) σε μία λίστα και φτιάχνετε μία 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')- Αποφεύγουμε κάνουμε iterate μία λίστα χρηιμοποιώντας τα indexes. Προτιμούμε καλύτερα να κάνουμε iterate τα στοιχεία μιας λίστας:
Λάθος:
a = ['Hello', 'world']
for i in range(0, len(a)):
print (a[i])Σωστό:
a = ['Hello', 'world']
for x in a:
print (x)-
Μην χρησιμοποιείται την input Η input σταματάει τη ροή της εκτέλεσης και ζητάει από τον χρήστη να δώσει μία τιμή. Αυτό καθυστερεί (έως μεποδίζει) πολύ την αυτόματη εκτέλεση του προγράμματος. Θεωρούμε ότι η είσοδος είναι δεδομένη, ότι δίδεται από την γραμμή εκτέσης (command line) ή ότι υπάρχει ως παράμετρο σε μία συνάρτηση!
-
Αποφεύγουμε να κάνουμε return "false", return "true" κτλ. Καλύτερα είναι να χρησιμοποιούμε τις έτοιμες τιμές της python. Δηλαδή:
Λάθος
return "False"
return "True"Σωστό:
return False
return True- Αποφέυγουμε να κάνουμε return "error". Καλύτερα είναι να κάνουμε raise ένα exception με λεπτομέρειες για το λάθος. Δηλαδή:
Λάθος:
return "error"Σωστό:
raise Exception('This particular error happened')