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

Σχετικά έγγραφα
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό. Συναρτήσεις Χειμερινό Εξάμηνο 2016

ΜΥΥ105: Εισαγωγή στον Προγραμματισμό. Συναρτήσεις

Γιώργος Μανής Επίκουρος Καθηγητής Τμήματος Μηχανικών Η/Υ και Πληροφορικής 3 Μαϊου 2015

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Λίστες και Πλειάδες Χειµερινό Εξάµηνο 2014

Εξαιρέσεις Εισαγωγή. Εξαιρέσεις. ηµήτρης Λεβεντέας

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Αναδροµικές Συναρτήσεις Χειµερινό Εξάµηνο 2014

Γλώσσα προγραμματισμού python

Εισαγωγή στον Προγ/μό Υπολογιστών

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Λεξικά Χειµερινό Εξάµηνο 2014

ΜΥΥ105: Εισαγωγή στον Προγραμματισμό. Αλφαριθμητικά Χειμερινό Εξάμηνο 2016

Εισαγωγή στον Προγ/μό Υπολογιστών

Εισαγωγή στον Προγραμματισμό

ΜΥΥ105: Εισαγωγή στον Προγραμματισμό. Λεξικά Χειμερινό Εξάμηνο 2016

ΜΥΥ105: Εισαγωγή στον Προγραμματισμό. Αναζήτηση και Ταξινόμηση Χειμερινό Εξάμηνο 2016

Σημειωματάριο Τετάρτης 18 Οκτ. 2017

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Έλεγχος Ροής Προγράµµατος Χειµερινό Εξάµηνο 2014

ΜΥΥ105: Εισαγωγή στον Προγραμματισμό. Ακολουθίες: Λίστες και Πλειάδες Χειμερινό Εξάμηνο 2016

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Αναζήτηση και Ταξινόµηση Χειµερινό Εξάµηνο 2014

Εισαγωγή στον Προγραμματισμό Python Μάθημα 4: Συναρτήσεις (functions) και δομοστοιχεία (modules) στην Python

ΠΛΗΡΟΦΟΡΙΚΗ Ι (Python) Ενότητα 4

Θέματα Προγραμματισμού Η/Υ

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

Πληρουορική Γ Γσμμασίοσ

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

Βασικά στοιχεία γλώσσας προγραμματισμού. Σπάχος Κυριάκος Καθηγητής Πληροφορικής ΠΕ19

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (Programming in the large)

Βασικές Ασκήσεις από τα Εργαστήρια της Python. Πέμπτη Εργ. 3 17:15 και 19:15

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Σφάλµατα, εξαιρέσεις, εκσφαλµάτωση Χειµερινό Εξάµηνο 2014

print( x is positive ) Στο διερμηνευτή Python, προσοχή στη στοίχιση, διότι γίνεται από το χρήστη:

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Εισαγωγή στην Python Χειµερινό Εξάµηνο 2014

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

ΜΥΥ105: Εισαγωγή στον Προγραμματισμό. Σφάλματα, εξαιρέσεις, εκσφαλμάτωση Χειμερινό Εξάμηνο 2016

Θέματα Προγραμματισμού Η/Υ

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Έλεγχος Ροής - Παραδείγµατα Χειµερινό Εξάµηνο 2014

ΜΥΥ105: Εισαγωγή στον Προγραμματισμό. Έλεγχος Ροής Προγράμματος

Διάλεξη 5η: Εντολές Επανάληψης

ΠΛΗΡΟΦΟΡΙΚΗ Ι (Python) Ενότητα 5. Λεξικά (Dictionaries)

ΕισαγωγήστουςΗ/Υ. PHP Hypertext Preprocessor

Συναρτήσεις. ΚΕΡΟΣ ΓΙΑΝΝΗΣ, ΠΕ19 1ο ΕΠΑΛ ΚΙΛΚΙΣ. Κέρος Α. Ιωάννης Καθηγητής Πληροφορικής ΠΕ19 1 ο ΕΠΑΛ Κιλκίς

ΜΥΥ105: Εισαγωγή στον Προγραμματισμό. Επαναληπτικές Ασκήσεις Χειμερινό Εξάμηνο 2016

ΠΛΗΡΟΦΟΡΙΚΗ ΤΕΧΝΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ

Σημειωματάαριο Δευτέρας 16 Οκτ. 2017

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

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Επαναληπτικές Ασκήσεις Χειµερινό Εξάµηνο 2014

Ο πιο κάτω πίνακας περιγράφει σε ποιες περιπτώσεις χρησιμοποιούμε τους τρεις πιο πάνω τρόπους:

Πληροφορική ΙΙ Θεματική Ενότητα 3

Κεφάλαιο : Επαναλήψεις (for, do-while)

Πως θα αποθηκεύσει τη λίστα με τα ψώνια του και θα την ανακτήσει στο Σ/Μ; και πως θα προσθέσει στη λίστα του επιπλέον προϊόντα;

Βασικά Στοιχεία Python 3

Κεφάλαιο 7: Υποπρογράμματα. Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

Σημειωματάριο Δευτέρας 30 Οκτ. 2017

Προγραμματισμός Συστημάτων

Σημειωματάριο Δευτέρας 9 Οκτ. 2017

Κεφάλαιο 7: Υπορουτίνες

Κεφάλαιο 5ο: Εντολές Επανάληψης

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Θέματα Προγραμματισμού Η/Υ

ΗΥ-150. Προγραμματισμός

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

Γιώργος Μανής Επίκουρος Καθηγητής Τμήματος Μηχανικών Η/Υ και Πληροφορικής 6 Οκτωβρίου 2014

4 η Διάλεξη Python - Συναρτήσεις

ΕΝΟΤΗΤΑ 4 Λήψη Αποφάσεων και Συναρτήσεις Ελέγχου

for for for for( . */

Εισαγωγή στην Γλώσσα Προγραμματισμού Python. 12/10/16 1

Θέματα Προγραμματισμού Η/Υ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

ΜΥΥ105: Εισαγωγή στον Προγραμματισμό. Εισαγωγή στην Python Χειμερινό Εξάμηνο 2016

Κλάσεις και Αντικείµενα

ιαχείριση Πληροφοριών στο ιαδίκτυο

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Εντολές επιλογής Επαναλήψεις (if, switch, while)

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού

Προγραμματιστικά Εργαλεία και Τεχνολογίες για Επιστήμη Δεδομένων

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

Γλώσσες Προγραμματισμού Εφαρμογών - ΜΕΠΒ20

Βασικές Ασκήσεις από τα Εργαστήρια της PYTHON (εβδομάδα 6 & 7) Πέμπτη ΠΚ2 11:15, 13:15, 15:15, 17:15 και 19:15

Δομημένος Προγραμματισμός

ΘΕΜΑΤΑ ΚΑΙ ΛΥΣΕΙΣ. 1) Έστω η λογική συνάρτηση F = A' + Β'. D + B. C' + C. D' (όπου οι τόνοι δηλώνουν συμπληρώματα).

ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΣΥΝΟΛΟ ΣΕΛΙΔΩΝ: ΕΞΙ (6)

Φύλλο Εργασίας 3. Μια γρήγορη επανάληψη από τα προηγούμενα

Κεφάλαιο 3.1, : Συναρτήσεις I. ( ιάλεξη 11) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ΠΛΗΡΟΦΟΡΙΚΗ Ι Σημειώσεις Python Ενότητα 3 Ν. Φερεντίνος. ΠΛΗΡΟΦΟΡΙΚΗ Ι (Python) Ενότητα 3. Συναρτήσεις

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 8/11/07

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Κεφάλαιο Πίνακες Ι. ( ιάλεξη 15) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Γιώργος Μανής Επίκουρος Καθηγητής Τμήματος Μηχανικών Η/Υ και Πληροφορικής Mάρτιος 2015

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

Η γλώσσα προγραμματισμού C

Αρχές Προγραμματισμού

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

είκτες και Πίνακες (2)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Δρ. Ιωάννης Λυχναρόπουλος Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας

Εισαγωγή στον Προγραμματισμό

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Transcript:

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

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

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

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

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

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

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

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

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

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

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

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

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

Προσοχή στο 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. 14

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

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

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

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

«Πέρασµα µε αναφορά» µη µεταβαλλόµενης µεταβλητής Τι κάνουµε στην 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) Β τρόπος: κάνουµε τη µεταβλητή µας µεταβαλλόµενη 19

Παράµετροι: η σειρά µετράει Η αντιστοίχιση των παραµέτρων µε τις εξωτερικές µεταβλητές γίνεται µε βάση τη σειρά 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) (µε αυτό τον τρόπο η σειρά δεν έχει σηµασία) 20

Παράµετροι: default τιµές Μπορούµε να ορίσουµε 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! 21

Παράµετροι: default τιµές Κάντε χρήση 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' 22

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

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

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

Μεταβλητός αριθµός παραµέτρων Με χρήση διπλού αστερίσκου ** πριν το όνοµα της παραµέτρου, παίρνουµε ένα λεξικό από αυτές 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) 26

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

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

Παραδείγµατα 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.' 29

Παραδείγµατα 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) 8 >>> params = (5,) * 2 >>> power(*params) 3125 >>> power(3, 3, 'Hello, world') Received redundant parameters: ('Hello, world',) 27 30

Παραδείγµατα 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 31

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

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

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

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

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

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

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