def
Τα περισσότερα προγράμματα τα οποία φτιάξαμε μέχρι τώρα θα μπορούσαμε να τα δούμε ως ολοκληρωμένες μεθόδους οι οποίες αποτελούνται από τα εξής μέρη
x = 5.0
y = 6.0
if x > y:
m = x
else:
m = y
print(m)
def maximum(x,y):
if x > y:
m = x
else:
m = y
return m
Η λέξη def
είναι μία εντολή της python και ορίζει μία συνάρτηση.
Έχουμε τους εξής κανόνες για τον ορισμό της συνάρτησης.
maximum
).
Το όνομα μιας συνάρτησης ακολουθεί τους συνηθισμένους κανόνες της Python για τα ονόματα μεταβλητών.
return
η οποία καθορίζει ποιά είναι η τιμή της συνάρτησης.Βλέπουμε λοιπόν ότι μία γενική μορφή για την συνάρτηση είναι η εξής.
def functionName(variable1,variable2,...):
statements
return variable
maximum
το πρόγραμμα το οποίο βρίσκει τον μέγιστο μεταξύ δύο αριθμών μπορεί να χρησιμοποιήσει την συνάρτηση και να γραφεί ως εξής.
a = 5.0
b = 6.0
result = maximum(a,b)
print(result)
Οι παραπάνω εντολές αποτελούν το κύριο πρόγραμμα. Το ολοκληρωμένο πρόγραμμα αποτελείται τώρα από δύο τμήματα: την συνάρτηση και το κύριο πρόγραμμα (το οποίο ακολουθεί τη συνάρτηση)
Ας δούμε σε λεπτομέρεια τι ακριβώς συμβαίνει στο παραπάνω πρόγραμμά μας στο οποίο περιέχεται μία συνάρτηση (maximum(x,y)
με τυπικά ορίσματα x,y) και στο οποίο επίσης έχουμε χρησιμοποιήσει στο κύριο πρόγραμμα το όνομά της maximum(a,b)
.
maximum
καλείται με τις πραγματικές παραμέτρους (ή ορίσματα) a,b.
Αυτές μπορεί να είναι μεταβλητές οι οποίες έχουν τιμές (π.χ., a=5.0; b=6.0; m=maximum(a,b)
), αλλά μπορεί να είναι και αριθμοί (π.χ., m=maximum(5.0,6.0)
).x=a; y=b
στην μία περίπτωση και x=5.0; y=6.0
στην δεύτερη περίπτωση) και το πρόγραμμα συνεχίζει εκτελόντας τις εντολές εντός της συνάρτησης.return
ο έλεγχος επιστρέφει στο κύριο πρόγραμμα.return
(δηλαδή, m
) είναι η τιμή της συνάρτησης.
Αυτή δίδεται στο κύριο πρόγραμμα (στη μεταβλητή result
)
αριστερά της ισότητας στην κλήση της συνάρτησης.
def isleap(year):
longfeb = (year%4 == 0) and (year%100 != 0) or (year%400 == 0)
return longfeb
momYear = 1968 # το κύριο πρόγραμμα
dadYear = 1967
kidYear = 2000
print(isleap(momYear),isleap(dadYear),isleap(kidYear))
def f(x): # εδώ είναι η συνάρτηση f(x)
fvalue = x**2 - 2*x + 1
return fvalue
x = 3.0 # εδώ είναι το κύριο πρόγραμμα
result = f(x)
print(x,result)
True
, αλλιώς η τιμή της συνάρτησης θα είναι False
.
def nameEnd(s):
if s[-4:] == 'akis':
return True
else:
return False
name = input("Give a name: ")
print(nameEnd(name))
return
και απουσία της.return
σε οποιοδήποτε σημείο στο σώμα μιας συνάρτησης τερματίζει την εκτέλεση των εντολών της συνάρτησης και επιστρέφει τη ροή του προγράμματος στο σημείο αμέσως μετά την κλήση της. Η χρήση της εντολής return
είναι προαιρετική. Αν αυτή δεν εμφανίζεται ή η εμφάνισή της δεν ακολουθείται από κάποια έκφραση, τότε η συνάρτηση επιστρέφει την τιμή None.
def sayHello():
print('Hello!')
Ας την καλέσουμε
sayHello()
θα πάρουμε το αποτέλεσμα
Hello!
Αν γράψουμε
result = sayHello()
τότε η μεταβλητή result
παίρνει την τιμή None
.
Επίσης, αν γράψουμε print(sayHello(),'Maria!')
θα δούμε το μήνυμα None Maria!
γιατί None
είναι η τιμή η οποία επιστρέφει η συνάρτηση sayHello
.
Δείτε ακόμα ότι η συνάρτηση αυτή δεν έχει τυπικά ορίσματα και γι' αυτό η λίστα των τυπικών ορισμάτων της είναι κενή, αλλά η κλήση της συνάρτησης διατηρεί την κενή λίστα των ορισμάτων.
Πρέπει να παρατηρήσουμε ότι έχουμε ήδη δει συναρτήσεις σε προηγούμενα μαθήματα,
όπως αυτές τις οποίες παρέχει το πακέτο math
.
math.sin(x), math.cos(x)
etc.
Παρατηρήστε ότι όλες οι παραπάνω παίρνουν ένα όρισμα και επιστρέφουν μία τιμή,
όπως ακριβώς οι συναρτήσεις που ορίζονται με την εντολή def
.
Επίσης, έχουμε δει ενσωματωμένες συναρτήσεις της python.
type(a), print(), len(s)
etc.
Θα βάλουμε τα σημεία μας σε μια λίστα L
η οποία θα περιέχει λίστες μήκους 2 (μία λίστα για κάθε σημείο) και το μοναδικό μας σημείο θα αποθηκευθεί στις μεταβλητές x και y.
import math
L = [ [1, 2], [0.1, -2], [3, 4], [-10, -3] ] # Το σύνολο των σημείων
x = 0.1 # Το μοναδικό σημείο
y = 3.0
D = [] # Λίστα για τις αποστάσεις
for p in L:
d = math.sqrt((x-p[0])**2 + (y-p[1])**2)
D.append(d)
mindistance = min(D) # Βρίσκουμε το ελάχιστο στοιχείο της λίστας D
print("Η ελάχιστη απόσταση είναι {}".format(mindistance))
Τώρα κατασκευάζουμε μία συνάρτηση mindistance(q, L)
η οποία χρησιμοποιεί τον προηγούμενο αλγόριθμο.
Το q
είναι μία λίστα με δύο στοιχεία η οποία περιέχει το σημείο την απόσταση του οποίου ψάχνουμε και L
είναι η λίστα των σημείων.
Η συνάρτηση επιστρέφει την ελάχιστη από τις αποστάσεις του q
από τα σημεία της L
.
import math
def mindistance(q, L):
D = []
for p in L:
d = math.sqrt((q[0]-p[0])**2 + (q[1]-p[1])**2)
D.append(d)
return min(D)
# Καλούμε τη συνάρτηση με
# q = [0.1, 3] και L = [ [1, 2], [0.1, -2], [3, 4], [-10, -3] ]
md = mindistance([0.1, 3], [ [1, 2], [0.1, -2], [3, 4], [-10, -3] ])
print("Η ελάχιστη απόσταση είναι {}".format(md))
Παρατηρούμε ότι η συνάρτηση mindistance
μπορεί να πάρει μία πιο κομψή και κατανοητή μορφή αν απλοποιήσουμε την γραμμή η οποία βρίσκει την απόσταση σημείων.
Για τον σκοπό αυτό κατασκευάζουμε μία επιπλέον συνάρτηση dist
η οποία δίνει την απόσταση μεταξύ δύο σημείων, τα οποία παριστάνονται ως δύο λίστες a,b
με δύο στοιχεία.
import math
def dist(a,b):
d = math.sqrt((a[0]-b[0])**2 + (a[1]-b[1])**2)
return d
def mindistance(q, L):
D = []
for p in L:
d = dist(p,q)
D.append(d)
return min(D)
md = mindistance([0.1, 3], [ [1, 2], [0.1, -2], [3, 4], [-10, -3] ])
print("Η ελάχιστη απόσταση είναι {}".format(md))
D
η οποία έχει στοιχεία αριθμούς.
Ας γράψουμε μία συνάρτηση η οποία κάνει την άθροιση.
def sumL(D):
s = 0.0
for e in D:
s += e
return s
Αν υποθέσουμε ότι έχουμε μία λίστα L
η οποία περιέχει λίστες (π.χ., την L = [ [1, 2], [0.1, -2], [3, 4], [-10, -3] ]
).
Η sumL
μπορεί επίσης να χρησιμοποιηθεί για να παράγουμε μια λίστα με τα επιμέρους αθροίσματα κάθε λίστας στην αρχική λίστα.
def listOfSums(L):
sums = []
for innerList in L:
sums.append(sumL(innerList))
return sums
Η συνάρτηση sumL
μπορεί επίσης να χρησιμοποιηθεί για την άθροιση όλων των επιμέρους στοιχείων (αριθμών) μιας λίστας από λίστες.
def sumListOfLists(L):
s = 0.0
for innerList in L:
s += sumL(innerList)
return s
Μάλιστα, έχοντας τις συναρτήσεις sumL
και listOfSums
, θα μπορούσαμε να ξαναγράψουμε διαφορετικά, με πολύ συμπαγή τρόπο, την sumListOfLists
ως εξής.
def sumListOfLists2(L):
return sumL(listOfSums(L))