Python: συναρτήσεις και βιβλιοθήκες
def, εμβέλεια μεταβλητών, και import από τις random και math.
40 λεπτά
Θα μάθεις να
- Να ορίζεις συναρτήσεις με def, παραμέτρους και return, και να τις καλείς με ορίσματα.
- Να ξεχωρίζεις το return από το print, και να εξηγείς τι επιστρέφει μια συνάρτηση χωρίς return.
- Να εξηγείς την εμβέλεια: τοπικές και καθολικές μεταβλητές.
- Να εισάγεις και να χρησιμοποιείς συναρτήσεις από τις βιβλιοθήκες math και random.
Γιατί συναρτήσεις
Έχεις ήδη χρησιμοποιήσει πολλές συναρτήσεις: print(), len(), int(), sum(). Καθεμιά κάνει μία δουλειά, και την καλείς με το όνομά της χωρίς να ξέρεις πώς είναι γραμμένη μέσα.
Μπορείς να φτιάξεις και δικές σου. Μια συνάρτηση είναι ένα κομμάτι κώδικα με όνομα, που γράφεται μία φορά και καλείται όσες φορές χρειαστεί. Είναι η αποσύνθεση του πρώτου μαθήματος, γραμμένη σε κώδικα: κάθε υποπρόβλημα γίνεται μία συνάρτηση.
Ορισμός και κλήση
def area(width, height):
return width * height
print(area(3, 4))
total = area(5, 2) + area(1, 1)
print(total)
12
11
| Κομμάτι | Τι είναι |
|---|---|
def | η λέξη που ξεκινά τον ορισμό |
area | το όνομα της συνάρτησης |
width, height | οι παράμετροι: μεταβλητές που παίρνουν τιμή κατά την κλήση |
return | τερματίζει τη συνάρτηση και επιστρέφει μια τιμή σε αυτόν που την κάλεσε |
area(3, 4) | η κλήση· το 3 και το 4 είναι τα ορίσματα |
Ο ορισμός από μόνος του δεν εκτελεί τίποτα. Απλώς λέει στην Python «όταν σου ζητήσω area, κάνε αυτό». Ο κώδικας μέσα τρέχει μόνο όταν η συνάρτηση καλείται, και κάθε φορά με τα ορίσματα της συγκεκριμένης κλήσης.
return ή print;
def show_area(width, height):
print(width * height)
x = show_area(3, 4)
print(x)
12
None
Το 12 εμφανίστηκε από την print μέσα στη συνάρτηση. Η x όμως πήρε None: έτσι λέγεται στην Python το «καμία τιμή», και αυτό επιστρέφει κάθε συνάρτηση που τελειώνει χωρίς return.
Μια συνάρτηση μπορεί να έχει περισσότερα από ένα return. Το πρώτο που εκτελείται την τερματίζει αμέσως:
def is_even(n):
if n % 2 == 0:
return True
return False
print(is_even(4), is_even(7))
True False
Προκαθορισμένες τιμές παραμέτρων
Μια παράμετρος μπορεί να έχει τιμή που χρησιμοποιείται όταν το όρισμα λείπει:
def greet(name, greeting="Γεια"):
return greeting + ", " + name
print(greet("Άννα"))
print(greet("Νίκο", "Καλημέρα"))
Γεια, Άννα
Καλημέρα, Νίκο
Εμβέλεια: τοπικές και καθολικές μεταβλητές
Η εμβέλεια (scope) μιας μεταβλητής είναι το κομμάτι του προγράμματος όπου αυτή υπάρχει.
- Τοπική είναι μια μεταβλητή που δημιουργείται μέσα σε συνάρτηση, μαζί με τις παραμέτρους της. Υπάρχει μόνο όσο τρέχει η συνάρτηση, και δεν φαίνεται έξω από αυτήν.
- Καθολική (global) είναι μια μεταβλητή που δημιουργείται έξω από κάθε συνάρτηση. Φαίνεται παντού, και οι συναρτήσεις μπορούν να τη διαβάσουν.
counter = 10
def change():
counter = 99
print("μέσα:", counter)
change()
print("έξω:", counter)
μέσα: 99
έξω: 10
Η εκχώρηση counter = 99 μέσα στη συνάρτηση δεν άλλαξε την καθολική. Δημιούργησε μια νέα, τοπική μεταβλητή με το ίδιο όνομα, που χάθηκε όταν τελείωσε η συνάρτηση. Αντίστροφα, μια τοπική μεταβλητή δεν φαίνεται απ' έξω. Η Python σταματά με σφάλμα, και η τελευταία γραμμή του μηνύματος λέει τι έγινε:
def f():
y = 5
f()
print(y)
NameError: name 'y' is not defined
Βιβλιοθήκες: import
Η Python έρχεται με έτοιμες βιβλιοθήκες (modules): αρχεία γεμάτα συναρτήσεις που έγραψαν άλλοι. Για να τις χρησιμοποιήσεις, τις εισάγεις με import.
Η math
import math
print(math.sqrt(16), math.floor(3.7), math.ceil(3.2))
print(round(math.pi, 2))
print(math.ceil(120 / 50))
4.0 3 4
3.14
3
Μετά το import math, κάθε συνάρτηση γράφεται με το όνομα της βιβλιοθήκης μπροστά: math.sqrt. Η ceil στρογγυλεύει προς τα πάνω, και λύνει το πρόβλημα των λεωφορείων του πρώτου μαθήματος: μαθητές θέλουν λεωφορεία των θέσεων, όχι .
Αν χρειάζεσαι μόνο μία συνάρτηση, μπορείς να την εισαγάγεις χωριστά, και τότε γράφεται χωρίς πρόθεμα:
from math import sqrt
print(sqrt(2))
1.4142135623730951
Η random
Η random δίνει ψευδοτυχαίους αριθμούς: μοιάζουν τυχαίοι, αλλά παράγονται από αλγόριθμο.
import random
die = random.randint(1, 6)
coin = random.choice(["κορόνα", "γράμματα"])
p = random.random()
print(die, coin, p)
Κάθε εκτέλεση δίνει άλλα αποτελέσματα, γι' αυτό δεν υπάρχει μία «σωστή» έξοδος. Η randint(1, 6) δίνει ακέραιο από το ως το , μαζί με το , σε αντίθεση με τη range(). Η choice διαλέγει ένα στοιχείο από λίστα, και η random() δίνει πραγματικό αριθμό από το ως λίγο κάτω από το .
Λυμένα παραδείγματα
Παράδειγμα 1
Γράψε συνάρτηση average(numbers) που επιστρέφει τον μέσο όρο μιας λίστας, και συνάρτηση above(numbers) που επιστρέφει πόσα στοιχεία είναι πάνω από τον μέσο όρο.
Δοκίμασέ το πρώτα. Μετά δες τη λύση.
Παράδειγμα 2
Ένα πρόγραμμα ορίζει x = 5 και τη συνάρτηση double(x), που εκτελεί x = x * 2 και return x. Μετά γράφει y = double(x) και print(x, y). Τι εμφανίζει, και γιατί;
Δοκίμασέ το πρώτα. Μετά δες τη λύση.
Παράδειγμα 3
Χρησιμοποίησε τη random για να προσομοιώσεις 1000 ρίψεις ζαριού, και μέτρησε πόσες φορές έφερε 6. Τι αριθμό περιμένεις;
Δοκίμασέ το πρώτα. Μετά δες τη λύση.
Ασκήσεις
Πρώτα ερωτήσεις με επιλογές: διαλέγεις, πατάς «Έλεγξε» και μαθαίνεις αμέσως αν το βρήκες και γιατί. Στο τέλος, λίγες ασκήσεις χωρίς επιλογές — εκεί κρύβεται μόνο η απάντηση.
Τα κατάφερες;
- Να ορίζεις συναρτήσεις με def, παραμέτρους και return, και να τις καλείς με ορίσματα.
- Να ξεχωρίζεις το return από το print, και να εξηγείς τι επιστρέφει μια συνάρτηση χωρίς return.
- Να εξηγείς την εμβέλεια: τοπικές και καθολικές μεταβλητές.
- Να εισάγεις και να χρησιμοποιείς συναρτήσεις από τις βιβλιοθήκες math και random.
Λύσε τις ασκήσεις πιο πάνω και θα δεις εδώ πού στέκεσαι.