Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ"— Μεταγράφημα παρουσίασης:

1 ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Eισαγωγή στον προγραμματισμό Συναρτήσεις Διδάσκων: Ν. Μαμουλής

2 Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς.

3 ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Συναρτήσεις Χειμερινό Εξάμηνο 2014

4 Δόμηση προγράμματος Μέχρι τώρα έχουμε δει πως να χρησιμοποιούμε έτοιμες συναρτήσεις και μεθόδους στα προγράμματά μας (π.χ. len(), max(), print()). Μπορούμε να ορίσουμε τις δικές μας συναρτήσεις για λειτουργίες που επαναλαμβάνονται στο πρόγραμμά μας. Ο ορισμός συναρτήσεων συντελεί στη σωστή δόμηση του προγράμματός μας Το πρόγραμμά μας γίνεται πιο ευανάγνωστο Αποφεύγονται οι επαναλήψεις κώδικα Βοηθούν στο σχεδιασμό του προγράμματός μας.

5 Συναρτήσεις Οι συναρτήσεις στις γλώσσες προγραμματισμού μοιάζουν με τις συναρτήσεις στα μαθηματικά μπορούν να πάρουν σαν όρισμα κάποιες τιμές μπορούν να επιστρέψουν μια τιμή. Οι συναρτήσεις στις γλώσσες προγραμματισμού γενικεύουν τις μαθηματικές συναρτήσεις μπορούν να εκτελέσουν κάποια λειτουργία χωρίς απαραίτητα να παίρνουν ορίσματα ή να επιστρέφουν τιμές μπορούν να παίρνουν μεταβλητό αριθμό ορισμάτων μπορούν να εκτελούν λειτουργίες ανεξάρτητες από τα ορίσματά τους.

6 Παραδείγματα συναρτήσεων
Μαθηματικές συναρτήσεις στην Python: f(x) = x2+1 Γενικά οι συναρτήσεις ορίζονται ως εξής: def <όνομα συνάρτησης> (<μεταβλητές>): <κώδικας συνάρτησης>. μπλοκ κώδικα που ορίζει τη συνάρτηση f def f(x): return x**2 + 1 print(4*f(2)) μέρος κώδικα όπου εκτελείται η f Τι θα τυπώσει το πρόγραμμα;

7 Παραδείγματα συναρτήσεων
Άσκηση: Ορίστε μια συνάρτηση με όνομα average που θα παίρνει ως ορίσματα 2 μεταβλητές και θα επιστρέφει το μέσο όρο τους π.χ. average(2,3.5) = 2.75. def average(x,y): return (x+y)/2

8 Παραδείγματα συναρτήσεων
Άσκηση: Ορίστε μια συνάρτηση με όνομα perimeter που θα παίρνει ως ορίσματα την ακτίνα ενός κύκλου και θα επιστρέφει την περίμετρό του π.χ. perimeter(1) = def perimeter(x): from math import pi return 2*pi*x

9 Παραδείγματα συναρτήσεων
Άσκηση: Ορίστε μια συνάρτηση που θα παίρνει ως όρισμα ένα όνομα και θα τυπώνει ‘Hello όνομα’ π.χ. >>>hello('John') hello John! def hello(x): print('Hello, '+x+'!') Η συνάρτηση hello() τυπώνει κάτι, αλλά δεν επιστρέφει κάτι. Ποια η διαφορά;

10 Προσοχή Οι f1 και f2 φαίνεται να κάνουν το ίδιο, αλλά υπάρχουν σημαντικές διαφορές. def f1(x): return x**2 + 1 def f2(x): print(x**2 + 1) >>> f1(2) 5 >>> f2(2) >>> f2(2)+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' Επίσης: η y = f2(5) δεν θα καταχωρήσει την τιμή της f2(5) στο y

11 Οι ορισμοί συναρτήσεων είναι εντολές
Τι κάνει το παρακάτω πρόγραμμα; s = input("Enter square or cube: ") if s == 'square': def f(x): return x*x else: return x*x*x

12 Ορισμός πριν την κλήση Πρώτα ορίζουμε μια συνάρτηση, μετά την καλούμε
Γιατί θα προκύψει σφάλμα αν εκτελεστεί το παρακάτω πρόγραμμα; print(f(2)) def f(x): return x**2 + 1

13 Ορισμός πριν την κλήση Θα προκύψει σφάλμα από την εκτέλεση του παρακάτω; Οχι! Οι συναρτήσεις f() και g() δεν εκτελούνται, παρά μόνο ορίζονται. Μετά τον ορισμό τους μπορούν να κληθούν χωρίς κανένα πρόβλημα. def g(x): return f(x) def f(x): return x**2 + 1

14 Συναρτήσεις σαν αντικείμενα
Οι συναρτήσεις είναι κι αυτές αντικείμενα, όπως οι αριθμοί, τα αλφαριθμητικά, οι λίστες, κλπ. Μπορούμε να διαπιστώσουμε αν ένα αντικείμενο είναι συνάρτηση με την callable. >>> x = 1 >>> y = len >>> callable(x) False >>> callable(y) True

15 Προσοχή στο return Αν η ροή σε μιά συνάρτηση φτάσει σε ένα return, η συνάρτηση τερματίζει άμεσα επιστρέφοντας το όρισμα του return. Ερώτηση: τι θα κάνει η παρακάτω συνάρτηση όταν κληθεί; def test(): print('Hello', end='') return print(' world') >>> x = test() Hello >>> x >>> print(x) None Μετά το return οι εντολές είναι άχρηστες

16 Προσοχή στο return Φροντίστε οι συναρτήσεις σας να επιστρέφουν τις τιμές που πρέπει σε κάθε περίπτωση κάνοντας ελέγχους μέσω if. def translate_temp(t): if (t<5): return 'It\'s freezing!' elif (t>25): return 'It\'s hot!' else: return 'It\'s cool.' >>> temp = int(input("Enter the current temperature: ")) Enter the current temperature: 20 >>> print(translate_temp(temp)) It's cool.

17 Τοπικότητα παραμέτρων
Αν αλλάξουμε την τιμή μιας παραμέτρου μέσα στη συνάρτηση η μεταβλητή που περνάει σαν παράμετρος δεν αλλάζει στο εξωτερικό πρόγραμμα για μη μεταβαλλόμενες μεταβλητές. Η μεταβλητή n μέσα στη συνάρτηση έχει τώρα τιμή 'Mr. Gumby’ ανεξάρτητα από την τιμή της κατά την κλήση της συνάρτησης def try_to_change(n): n = 'Mr. Gumby' name = 'Mrs. Entity' try_to_change(name) print(name) Η μεταβλητή name παραμένει αμετάβλητη μετά την κλήση της try_to_change Mrs. Entity

18 Τοπικότητα παραμέτρων
Αν αλλάξουμε την τιμή ενός μεταβαλλόμενου αντικειμένου που περνιέται σαν παράμετρος μέσα στη συνάρτηση, τότε το αντικείμενο αλλάζει στο εξωτερικό πρόγραμμα. Το αντικείμενο (λίστα) που δείχνει η παράμετρος n αλλάζει και στο εξωτερικό πρόγραμμα def change(n): n[0] = 'Mr. Gumby' names = ['Mrs. Entity', 'Mrs. Thing'] change(names) print(names) Η μεταβλητή names αλλάζει μετά την κλήση της συνάρτησης change ['Mr. Gumby', 'Mrs. Thing']

19 Άσκηση Τι θα τυπώσει το παρακάτω πρόγραμμα; def change(n):
n[0] = 'Mr. Gumby' names = ['Mrs. Entity', 'Mrs. Thing'] change(names[:]) print(names) Αντιγράφει τη μεταβλητή names σε άλλη μεταβλητή (άλλη λίστα) και η συνάρτηση change αλλάζει την άλλη λίστα, όχι τη names ['Mrs. Entity', 'Mrs. Thing']

20 Πέρασμα με τιμή/αναφορά
Στις γλώσσες προγραμματισμού γενικά υπάρχουν 2 τρόποι περάσματος παραμέτρων σε συναρτήσεις Πέρασμα με τιμή: η τιμή της μεταβλητής που μπαίνει σαν παράμετρος αντιγράφεται σε τοπική μεταβλητή (μεταβλητή παραμέτρου στη συνάρτηση) – τυχόν αλλαγές στην τιμή της τοπικής μεταβλητής μέσα στη συνάρτηση δεν επηρεάζουν την εξωτερική μεταβλητή. Πέρασμα με αναφορά: η μεταβλητή που μπαίνει σαν παράμετρος αλλάζει άν η τοπική μεταβλητή (μεταβλητή παραμέτρου στη συνάρτηση) αλλάξει.

21 «Πέρασμα με αναφορά» μη μεταβαλλόμενης μεταβλητής
Τι κάνουμε στην Python αν η συνάρτησή μας θέλουμε να αλλάξει την τιμή της παραμέτρου, αν αυτή είναι μή μεταβαλλόμενη μεταβλητη; def inc(x): return x + 1 y = 1 y = inc(y) print(y) def inc(x): x[0] = x[0] + 1 y = [1] inc(y) print(y) Α τρόπος: βάζουμε τη συνάρτηση να επιστρέφει τη νέα τιμή και την αναθέτουμε στη μεταβλητή Β τρόπος: κάνουμε τη μεταβλητή μας μεταβαλλόμενη

22 Παράμετροι: η σειρά μετράει
Η αντιστοίχιση των παραμέτρων με τις εξωτερικές μεταβλητές γίνεται με βάση τη σειρά. 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))) Μπορούμε επίσης να γράψουμε: my_pow(base = x, exponent = y) ή my_pow(exponent = y, base = x) (με αυτό τον τρόπο η σειρά δεν έχει σημασία).

23 Παράμετροι: default τιμές
def hello(greeting='Hello', name='world'): print('%s, %s!' % (greeting, name)) >>> hello('Geia sou', 'file') Geia sou, file! >>> hello('Geia sou') Geia sou, world! >>> hello(name = 'aderfe') Hello, aderfe! >>> hello() Hello, world!

24 Παράμετροι: 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'

25 Μεταβλητός αριθμός παραμέτρων
Με χρήση αστερίσκου * πριν το όνομα της παραμέτρου, παίρνουμε μια πλειάδα από αυτές. def print_params(*params): print(params) >>> print_params('test1') ('test1',) >>> print_params('test1',1,2) ('test1', 1, 2) >>> print_params() ()

26 Μεταβλητός αριθμός παραμέτρων
Με χρήση αστερίσκου * πριν το όνομα της παραμέτρου, παίρνουμε μια πλειάδα από αυτές. def print_params(title, *params): print(title) print(params) υποχρεωτική παράμετρος >>> print_params('Label',1,2,3) Label (1, 2, 3)

27 Μεταβλητός αριθμός παραμέτρων
Παράδειγμα 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

28 Μεταβλητός αριθμός παραμέτρων
Με χρήση διπλού αστερίσκου ** πριν το όνομα της παραμέτρου, παίρνουμε ένα λεξικό από αυτές. def print_params(**params): print(params) >>> print_params(x=1, y=2, z=3) {'y': 2, 'x': 1, 'z': 3} def print_params(x, y, z=3, *pospar, **keypar): print (x, y, z) print (pospar) print (keypar)

29 Κατανομή τιμών σε παραμέτρους
Η συνάρτησή μας μπορεί να έχει συγκεκριμένο αριθμό παραμέτρων και να την καλέσουμε δίνοντας σαν όρισμα μια πλειάδα/λίστα τιμών με χρήση * def add(x, y): return x + y >>> params=(1,2) >>> add(*params) 3

30 Κατανομή τιμών σε παραμέτρους
Η συνάρτησή μας μπορεί να έχει συγκεκριμένο αριθμό παραμέτρων και να την καλέσουμε δίνοντας σαν όρισμα ένα λεξικό παραμέτρων:τιμών με χρήση ** def hello(greeting='Hello', name='world'): print('%s, %s!' % (greeting, name)) >>> params = {'name': 'Sir Robin', 'greeting': 'Well met'} >>> hello(**params) Well met, Sir Robin!

31 Παραδείγματα def story(**kwds):
return 'Once upon a time, there was a ' \ '%(obj)s called %(name)s.' % kwds >>> story(obj='king', name='Gumby') 'Once upon a time, there was a king called Gumby.' >>> story(name='Sir Robin', obj='brave knight') 'Once upon a time, there was a brave knight called Sir Robin.' >>> params = {'obj': 'language', 'name': 'Python'} >>> story(**params) 'Once upon a time, there was a language called Python.' >>> del params['obj'] >>> story(obj='stroke of genius', **params) 'Once upon a time, there was a stroke of genius called Python.'

32 Παραδείγματα def power(x, y, *others): if others:
print ('Received redundant parameters:', others) return pow(x, y) >>> power(2,3) 8 >>> power(y=3,x=2) >>> params = (5,) * 2 >>> power(*params) 3125 >>> power(3, 3, 'Hello, world') Received redundant parameters: ('Hello, world',) 27

33 Παραδείγματα Περιγραφή συνάρτησης (σαν σχόλιο)
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 return result >>> interval(10) [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

34 Εμβέλεια μεταβλητών Όταν δίνουμε τιμή σε μια μεταβλητή είναι σαν να δίνουμε τιμή στο κλειδί με το όνομα της μεταβλητής σε ένα λεξικό. vars(): επιστρέφει το built-in λεξικό της Python για τις μεταβλητές. ΠΡΟΣΟΧΗ: Γενικά μην αλλάζετε το λεξικό μεταβλητών της Python, αλλά να ορίζετε και να αλλάζετε τις μεταβλητές με τον παραδοσιακό τρόπο. >>> x = 1 >>> vars()['x'] 1 >>> vars()['x']+=1 >>> x 2

35 Εμβέλεια μεταβλητών σφαιρική μεταβλητή: είναι μια μεταβλητή που ορίζεται και χρησιμοποιείται σε όλο το πρόγραμμα τοπική μεταβλητή: είναι μια μεταβλητή που ορίζεται και χρησιμοποιείται μέσα σε μια συνάρτηση Η Python ορίζει ένα τοπικό λεξικό μεταβλητών μέσα σε κάθε συνάρτηση. ΠΡΟΣΟΧΗ: Η x μέσα στη συνάρτηση είναι τοπική μεταβλητή. >>> def foo(): x = 42 >>> x = 1 >>> foo() >>> x 1 ΠΡΟΣΟΧΗ: Μετά την κλήση της foo() η σφαιρική μεταβλητή x δεν αλλάζει.

36 Εμβέλεια μεταβλητών Οι παράμετροι μιας συνάρτησης αντιγράφονται ως τοπικές μεταβλητές Αλλαγή στις τιμές των παραμέτρων δεν επηρεάζουν τις εξωτερικές (σφαιρικές) μεταβλητές Προσοχή: αν η τοπική μεταβλητή δείχνει στο ίδιο μεταβαλλόμενο αντικείμενο όπως η σφαιρική, το αντικείμενο αλλάζει μέσα στη συνάρτηση. >>> def output(x): print(x); x += 1; print(x) >>> y=2 >>> output(y) 2 3 >>> y >>> def add0(l): l.append(0) >>> lst = [] >>> add0(lst) >>> lst [0]

37 Εμβέλεια μεταβλητών Οι εξωτερικές (π.χ. σφαιρικές) μεταβλητές μπορούν να διαβαστούν μέσα σε μια συνάρτηση, αλλά δεν μπορούν να πάρουν νέα τιμή. >>> def combine(param): print (param + external) >>> external = 'berry' >>> combine('black') blackberry προσπέλαση εξωτερικής μεταβλητής μέσα στη συνάρτηση combine()

38 Επισκίαση Η επισκίαση (shadowing) μιας μεταβλητής συμβαίνει όταν έχει οριστεί εξωτερικά, αλλά δεν μπορεί να προσπελαστεί μέσα σε μια συνάρτηση επειδή υπάρχει μια τοπική μεταβλητή με το ίδιο όνομα. def dosomething(): y=5 x=3 print(x,y) x = 1 dosomething() print(x) Αν ήθελα στο σημείο αυτό να χρησιμοποιήσω την εξωτερική μεταβλητή x δεν θα μπορούσα γιατί το x πλέον αναφέρεται στην τοπική μεταβλητή x.

39 Επισκίαση Η προσπέλαση μιας σφαιρικής μεταβλητής που επισκιάζεται σε μια συνάρτηση επισκίαση, μπορεί να γίνει μέσω του λεξικού που επιστρέφει η globals(). Το λεξικό που επιστρέφει η locals() περιέχει τις μεταβλητές που έχουν τοπική εμβέλεια (στη συνάρτηση). def dosomething(): y=5 x=3 print(x,y,globals()['x']) x = 1 dosomething() print(x) Αναφορά στη σφαιρική μεταβλητή x

40 «Δέσιμο» τοπικής μεταβλητής σε σφαιρική
Αν θέλουμε να αλλάξουμε μια σφαιρική μεταβλητή μέσα σε μια συνάρτηση μπορούμε να τη δηλώσουμε ως σφαιρική μεταβλητή της συνάρτησης. >>> x = 1 >>> def change_global(): global x x = x + 1 >>> change_global() >>> x 2 Η τοπική μεταβλητή x «δένεται» στην αντίστοιχη σφαιρική.

41 Τέλος Ενότητας

42 Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Ιωαννίνων» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.

43 Σημειώματα

44 Σημείωμα Ιστορικού Εκδόσεων Έργου
Το παρόν έργο αποτελεί την έκδοση 1.0. Έχουν προηγηθεί οι κάτωθι εκδόσεις: Έκδοση 1.0 διαθέσιμη εδώ. .

45 Σημείωμα Αναφοράς Copyright Πανεπιστήμιο Ιωαννίνων, Διδάσκων: Ν. Μαμουλής. «Εισαγωγή στον Προγραμματισμό. Συναρτήσεις». Έκδοση: 1.0. Ιωάννινα Διαθέσιμο από τη δικτυακή διεύθυνση: .

46 Σημείωμα Αδειοδότησης
Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά Δημιουργού - Παρόμοια Διανομή, Διεθνής Έκδοση 4.0 [1] ή μεταγενέστερη. [1]


Κατέβασμα ppt "ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ"

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google