ΜΥΥ105: Εισαγωγή στον Προγραμματισμό Ακολουθίες: Λίστες και Πλειάδες Χειμερινό Εξάμηνο 2016
Δομές δεδομένων Μια δομή δεδομένων είναι μια δομημένη (οργανωμένη) συλλογή στοιχείων (π.χ., ψηφίων, χαρακτήρων, αριθμών, αλφαριθμητικών, κλπ.). Η πιο βασική δομή στην Python είναι η ακολουθία. Κύριοι τύποι ακολουθιών: Λίστα (list) Πλειάδα (tuple) Αλφαριθμητικό (string) Βασική διαφορά μεταξύ λιστών και άλλων ακολουθιών είναι ότι οι λίστες μπορούν να μεταβληθούν 2
Χρήση ακολουθιών Η χρήση ακολουθιών στην Python είναι εκτενής Ορίζουμε και χρησιμοποιούμε ακολουθίες όταν θέλουμε να διαχειριστούμε συλλογές δεδομένων 3
Λίστες Μια λίστα ορίζεται σαν ακολουθία στοιχείων, χωρισμένα από κόμματα, εντός ενός [ και ενός ] Μια λίστα μπορεί να περιέχει στοιχεία διαφορετικών τύπων >>>digits=[0,1,2,3,4,5,6,7,8,9] >>>letters = [ A, B, C, D, E, F ] >>>hex = [0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F ] >>>lanisters = [ Tywin, Tyrion, Cercei, Jamie ] 4
Προσπέλαση στοιχείων Τα στοιχεία μιας λίστας μπορούν να προσπελαστούν κατ αντιστοιχία με την προσπέλαση χαρακτήρων σε ένα αλφαριθμητικό Το πρώτο στοιχείο στη θέση 0, το 2 ο στη θέση 1, κλπ. Επίσης: αρνητική δεικτοδότηση >>> digits[0] 0 >>> hex[-1] F 5
Άλλες λειτουργίες σε λίστες μήκος λίστας = αριθμός στοιχείων στη λίστα >>> len(digits) 10 >>> digits + [10,11,12,13,14,15] [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] συνένωση λιστών >>> digits + letters [0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F ] >>> A' in letters True επαλήθευση μέλους λίστας συνένωση λιστών με διαφορετικά στοιχεία 6
Άλλες λειτουργίες σε λίστες >>> 3*['A','B','C'] ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'] >>> lst = [23.99, 19.99, 34.50, 120.99] >>> min(lst) 19.99 >>> max(lst) 120.99 >>> sum(lst) 199.46999999999997 7
Άσκηση Δίνεται μια λίστα με λέξεις. Βρες τη μικρότερη και τη μεγαλύτερη λέξη (σε λεξικογραφική σειρά) >>> words = ['bat', 'ball', 'barn', 'basket', 'badmington'] >>> min(words) 'badmington' >>> max(words) 'bat' 8
Λίστες από λίστες Μια λίστα μπορεί να περιέχει στοιχεία άλλες λίστες Π.χ. χρήση λιστών για τη δημιουργία μιας βάσης δεδομένων με ονόματα και ηλικίες προσώπων: >>>edward=['edward Gumby', 42] >>>john=['john Smith', 50] λίστα από λίστες >>>database=[edward, john] >>>database [['Edward Gumby', 42], ['John Smith', 50]] 9
Άλλες λειτουργίες σε λίστες >>> len(database) 2 μήκος λίστας = αριθμός στοιχείων στη λίστα = αριθμός από λίστες συνένωση λιστών με διαφορετικά στοιχεία >>> john + database ['John Smith', 50, ['Edward Gumby', 42], ['John Smith', 50]] >>> 'John Smith' in john True επαλήθευση μέλους λίστας >>> 'John Smith' in database γιατί;; False τα μέλη της database είναι ['Edward Gumby', 42] και ['John Smith', 50] 10
Άσκηση Δημιουργήστε τον μοναδιαίο 3x3 πίνακα >>> I = [[1,0,0],[0,1,0],[0,0,1]] >>> I [[1, 0, 0], [0, 1, 0], [0, 0, 1]] Πως θα διαβάσουμε το στοιχείο στην πρώτη γραμμή και δεύτερη στήλη? >>> I[0][1] 0 Μας δίνει το δεύτερο στοιχείο της λίστας Μας δίνει την λίστα στην πρώτη γραμμή
Κατάτμηση λιστών Κατάτμηση (slicing): Ένα τμήμα μιας λίστας ορίζεται με ένα διάστημα θέσεων [x:y] σε αυτή Το x είναι η θέση του πρώτου στοιχείου και το y η επομένη της θέσης του τελευταίου που θέλουμε >>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] >>> letters[3:6] ['d', 'e', 'f'] >>> letters[-3:-1] ['h', 'i'] >>> letters[3:-3] ['d', 'e', 'f', 'g'] μη έγκυρο διάστημα >>> letters[-3:0] [] 12
Κατάτμηση λιστών To διάστημα θέσεων [x:y] μπορεί να έχει ένα ή και κανένα όριο Αν δεν προσδιορίσουμε το πάνω όριο, τότε εννοείται ότι θέλουμε μεχρι το τελευταίο στοιχείο, αν δεν προσδιορίσουμε το κάτω όριο θέλουμε μέχρι το πρώτο, αν κανένα τα θέλουμε όλα >>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] >>> letters[-3:] ['h', 'i', 'j'] >>> letters[:5] ['a', 'b', 'c', 'd', 'e'] >>> letters[:] ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 13
Άσκηση Δίνεται μια διαδικτυακή διεύθυνση (URL) του τύπου http://www.something.com Ζητείται να υπολογίσουμε το domain (something) # Split up a URL of the form http://www.something.com url = input('please enter the URL: ') postfix = url[11:] domain = postfix[:-4] print("domain name: ", domain) Please enter the URL: http://www.python.org Domain name: python 14
Βήμα Στo διάστημα θέσεων [x:y] μπορούμε να ορίσουμε έναν τρίτο αριθμό (βήμα) ορίζει για καθε πόσα στοιχεία θα παίρνουμε ένα >>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] >>> letters[0:7:2] ['a', 'c', 'e', 'g'] >>> letters[1::2] ['b', 'd', 'f', 'h', 'j'] >>> letters[::3] ['a', 'd', 'g', 'j'] αρνητικό βήμα >>> letters[8:4:-2] ['i', 'g'] 15
Δημιουργία λίστας από αλφαριθμητικό Η συνάρτηση list() προσφέρει έναν γρήγορο τρόπο δημιουργίας λίστας χαρακτήρων >>> list('hello') ['H', 'e', 'l', 'l', 'o'] =list('hello') ['H', 'e', 'l', 'l', 'o'] 16
Αλλαγή στοιχείων λίστας Μπορούμε να προσπελάσουμε και να αλλάξουμε ένα στοιχείο λίστας με την χρήση δείκτη Μπορούμε να σβήσουμε ένα στοιχείο λίστας =list('hello') ['H', 'e', 'l', 'l', 'o'] [3]='p' ['H', 'e', 'l', 'p', 'o'] >>> del x[4] ['H', 'e', 'l', 'p'] 17
Αλλά... = 'Hello 'Hello' [3] = 'p' Traceback (most recent call last): File "<pyshell#72>", line 1, in <module> x[3] = 'p' TypeError: 'str' object does not support item assignment Στα αλφαριθμητικά (όπως και στις πλειάδες) δεν μπορούμε να κάνουμε αλλαγές! Είναι μη μεταβλητά αντικείμενα! 18
Αλλαγή τμημάτων λίστας Μπορούμε να αλλάξουμε ολόκληρα τμήματα λιστών με χρήση slicing >>> name = list('perl') >>> name ['P', 'e', 'r', 'l'] >>> name[2:] = list('ar') >>> name ['P', 'e', 'a', 'r'] >>> name[1:] = list('ython') >>> name ['P', 'y', 't', 'h', 'o', 'n'] αλλαγή στοιχείων και επέκταση της λίστας ταυτόχρονα 19
Αλλαγή τμημάτων λίστας Μπορούμε να αλλάξουμε ολόκληρα τμήματα λιστών με χρήση slicing >>> numbers = [1, 5] >>> numbers[1:1] = [2, 3, 4] >>> numbers [1, 2, 3, 4, 5] >>> numbers[1:4] = [] >>> numbers [1, 5] εισαγωγή στοιχείων χωρίς να διαγράψουμε τα υπάρχοντα διαγραφή στοιχείων μέσα στο διάστημα θέσεων 20
Μέθοδοι λίστών (append) Μπορούμε να προσθέσουμε ένα στοιχείο στο τέλος της λίστας με τη μέθοδο append Μέθοδος: συνάρτηση που καλείται μέσα από ένα αντικείμενο = list('hello') ['H', 'e', 'l', 'l', 'o'].append('p') ['H', 'e', 'l', 'l', 'o', 'p'].append('pow') ['H', 'e', 'l', 'l', 'o', 'p', 'pow'] η λίστα είναι αντικείμενο η append είναι μέθοδος λιστών H append προσθέτει πάντα στο τέλος στης λίστας μπορούμε να προσθέσουμε οποιουδήποτε τύπου στοιχεία σε μια λίστα 21
Μέθοδοι λίστών (insert) Μπορούμε να προσθέσουμε ένα στοιχείο σε μια συγκεκριμένη θέση της λίστας με τη μέθοδο insert = list('hello') ['H', 'e', 'l', 'l', 'o'].insert(0, 'P') ['P', 'H', 'e', 'l', 'l', 'o'].insert(len(x),'p') ['P', 'H', 'e', 'l', 'l', 'o', 'p'] το νεο στοιχείο μπαίνει ακριβώς πρίν από τη θέση εισαγωγής που καθορίζουμε ισοδύναμο με το x.append('p') το x.insert(i, elem) ισοδυναμεί με το x[i:i] = elem 22
Μέθοδοι λίστών (count) Μπορούμε να μετρήσουμε το πλήθος των στοιχείων μιας λίστας που έχουν μια συγκεκριμένη τιμή με τη μέθοδο count = [[1, 2], 1, 1, [2, 1, [1, 2]]].count(1) 2.count([1,2]) 1 >>> ['to', 'be', 'or', 'not', 'to', 'be'].count('to') 2 23
Μέθοδοι λίστών (extend) Πολλαπλά στοιχεία προστίθενται σε μια λίστα με τη μέθοδο extend >>> a = [1, 2, 3] >>> b = a >>> a.extend(b) >>> a [1, 2, 3, 1, 2, 3] To a.extend(b) είναι ισοδύναμο με το a[len(a):]=b 24
Μέθοδοι λίστών (pop) Η μέθοδος pop επιστρέφει ένα στοιχείο της λίστας και ταυτόχρονα το διαγράφει από αυτή = [1, 2, 3].pop() 3 [1, 2].pop(0) 1 [2] αν δεν προσδιορίσουμε τη θέση του στοιχείου η pop θεωρεί ότι θέλουμε το τελευταίο στοιχείο από τη λίστα 25
Μέθοδοι λίστών (index) Μπορούμε να ψάξουμε για την πρώτη εμφάνιση ενός στοιχείου με τη μέθοδο index >>> knights = ['We', 'are', 'the', 'knights', 'who', 'say', 'ni'] >>> knights.index('who') 4 >>> knights.index('herring') Traceback (most recent call last): File "<pyshell#123>", line 1, in <module> knights.index('herring') ValueError: 'herring' is not in list 26
Μέθοδοι λίστών (reverse) Η μέθοδος reverse αντιστρέφει τη σειρά των στοιχείων της λίστας =[1,2,3].reverse() [3, 2, 1] =[1,2,3] >>> y=list(reversed(x)) >>> y [3, 2, 1] [1, 2, 3] reversed(x): επιστρέφει τα στοιχεία της λίστας x σε αντίστροφη σειρά χωρίς να αντιστρέφει την ίδια τη λίστα x 27
Μέθοδοι λίστών (sort) Η μέθοδος sort ταξινομεί τη λίστα, βάζοντας τα στοιχεία της σε αυξουσα σειρα = [4, 6, 2, 1, 7, 9].sort() [1, 2, 4, 6, 7, 9] = [4, 6, 2, 1, 7, 9] >>> sorted(x) [1, 2, 4, 6, 7, 9] [4, 6, 2, 1, 7, 9] sorted(x): επιστρέφει τα στοιχεία της λίστας x ταξινομημένα χωρίς να ταξινομεί την ίδια τη λίστα x 28
Μέθοδοι λίστών (sort) Άσκηση: Θέλουμε να αρχικοποιήσουμε μια νέα λίστα με τα περιεχόμενα της x ταξινομημένα, χωρίς να πειράξουμε τη x = [4, 6, 2, 1, 7, 9] >>> y=x >>> y.sort() >>> y [1, 2, 4, 6, 7, 9] [1, 2, 4, 6, 7, 9] λάθος τρόπος: το πρόβλημα είναι ότι το y αναφέρεται στην ίδια λίστα με το x (το y δεν είναι αντιγραφή του x) 29
Μέθοδοι λίστών (sort) Άσκηση: Θέλουμε να αρχικοποιήσουμε μια νέα λίστα με τα περιεχόμενα της x ταξινομημένα, χωρίς να πειράξουμε τη x = [4, 6, 2, 1, 7, 9] >>> y=x[:] >>> y.sort() >>> y [1, 2, 4, 6, 7, 9] [4, 6, 2, 1, 7, 9] σωστός τρόπος αντιγραφής λίστας H λειτουργεία της κατάτμησης επιστρέφει μια ένα λίστα εναλλακτικά: y = list(x) y.sort() y = sorted(x) 30
Αντίστροφη ταξινόμηση Άσκηση: Ταξινόμησε τη λίστα x τοποθετώντας τα στοιχεία από το μεγαλύτερο στο μικρότερο = [4, 6, 2, 1, 7, 9].sort().reverse() [9, 7, 6, 4, 2, 1] Αλλιώς: x.sort(reverse=true) Μεγάλη γκάμα δυνατοτήτων ταξινόμησης στην Python: http://wiki.python.org/moin/howto/sorting 31
Μέθοδοι και Συναρτήσεις Η συνάρτηση είναι ένα κομμάτι κώδικα που επιτελεί μια λειτουργία. Καλείται με ορίσματα. Π.χ., sorted(x) Η μέθοδος είναι ένα κομμάτι κώδικα που επιτελεί μια λειτουργία που καλείται από ένα αντικείμενο (π.χ., από μία λίστα ή ένα αλφαριθμητικό) Π.χ., x.sort() Η διαφορά είναι ότι η συνάρτηση δουλεύει με τα ορίσματα που της δίνονται. Η μέθοδος έχει πρόσβαση σε όλα τα δεδομένα του αντικειμένου.
Μεταβλητές (ξανά!) Γενικά μια μεταβλητή αναφέρεται σε ένα αντικείμενο (αριθμός, αλφαριθμητικό, λίστα, κλπ.) = 5 >>> lst = [1,2,3,4] x lst 5 [1,2,3,4] 33
Μεταβλητές (ξανά!) Υπάρχουν δύο τύποι αντικειμένων: μεταβαλλόμενα και μη μεταβαλλόμενα μεταβαλλόμενα: λίστες μή μεταβαλλόμενα: αριθμοί, αλφαριθμητικά, πλειάδες = 5 >>> lst = [1,2,3,4] x lst 5 [1,2,3,4] 34
Μεταβλητές (ξανά!) Ο μόνος τρόπος να αλλάξουμε ένα μη μεταβαλλόμενο αντικείμενο είναι να ορίσουμε ένα νέο αντικείμενο για τη μεταβλητή μας = 7 x lst 5 7 [1,2,3,4] 35
Μεταβλητές (ξανά!) Αντίθετα, μπορούμε να αλλάξουμε ένα μεταβαλλόμενο αντικείμενο, χωρίς να χρειαστεί να ορίσουμε νέο >>> lst[2] = 7 lst [1,2,3,4] 7 36
Μεταβλητές (ξανά!) Αν εξισώσουμε 2 μεταβλητές, αυτές θα αναφέρονται στο ίδιο αντικείμενο. Αν το αντικείμενο είναι μεταβαλλόμενο και αλλάξει, οι τιμές και των δύο μεταβλητών αλλάζουν >>> lst = [1,2,3,4] >>> lstnew = lst >>> lst[2] = 7 >>> lstnew [1, 2, 7, 4] lst lstnew [1,2,3,4] 7 37
Μεταβλητές (ξανά!) Αν εξισώσουμε 2 μεταβλητές, αυτές θα αναφέρονται στο ίδιο αντικείμενο. Αν το αντικείμενο είναι μη μεταβαλλόμενο και αλλάξουμε τη μία μεταβλητή, τότε αυτή θα αναφέρεται σε άλλο αντικείμενο = 5 >>> y = x y x = 7 >>> y 5 5 7 38
= [[1,2],[3,4]] >>> y = list(x) >>> y.append(5) >>> y [[1, 2], [3, 4], 5] [[1, 2], [3, 4]] >>> y[1][0] = 0 >>> y [[1, 2], [0, 4], 5] [[1, 2], [0, 4]] Μεταβλητές Τι θα εκτυπώσει το παρακάτω πρόγραμμα?
Μεταβλητές Τι θα εκτυπώσει το παρακάτω πρόγραμμα? = [[1,2],[3,4]] >>> y = list(x) >>> y.append(5) >>> y [[1, 2], [3, 4], 5] [[1, 2], [3, 4]] >>> y[1][0] = 0 >>> y [[1, 2], [0, 4], 5] [[1, 2], [0, 4]] x [1,2] [3,4]
Μεταβλητές Τι θα εκτυπώσει το παρακάτω πρόγραμμα? = [[1,2],[3,4]] >>> y = list(x) >>> y.append(5) >>> y [[1, 2], [3, 4], 5] [[1, 2], [3, 4]] >>> y[1][0] = 0 >>> y [[1, 2], [0, 4], 5] [[1, 2], [0, 4]] x [1,2] [3,4] y
Μεταβλητές Τι θα εκτυπώσει το παρακάτω πρόγραμμα? = [[1,2],[3,4]] >>> y = list(x) >>> y.append(5) >>> y [[1, 2], [3, 4], 5] [[1, 2], [3, 4]] >>> y[1][0] = 0 >>> y [[1, 2], [0, 4], 5] [[1, 2], [0, 4]] x [1,2] [3,4] y 5
Μεταβλητές Τι θα εκτυπώσει το παρακάτω πρόγραμμα? = [[1,2],[3,4]] >>> y = list(x) >>> y.append(5) >>> y [[1, 2], [3, 4], 5] [[1, 2], [3, 4]] >>> y[1][0] = 0 >>> y [[1, 2], [0, 4], 5] [[1, 2], [0, 4]] x [1,2] [0,4] y 5
Άσκηση Τι θα εκτυπώσει το παρακάτω πρόγραμμα? >>> I = 3*[[0,0,0]] >>> I [[0, 0, 0], [0, 0, 0], [0, 0, 0]] >>> I[0][0]= 1 >>> I[1][1]= 1 >>> I[2][2]= 1 >>> I [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
Άσκηση Τι θα εκτυπώσει το παρακάτω πρόγραμμα? >>> I = 3*[[0,0,0]] >>> I [[0, 0, 0], [0, 0, 0], [0, 0, 0]] >>> I[0][0]= 1 >>> I[1][1]= 1 >>> I[2][2]= 1 >>> I [[1, 1, 1], [1, 1, 1], [1, 1, 1]] Ι [0,0,0]
Άσκηση Τι θα εκτυπώσει το παρακάτω πρόγραμμα? >>> I = 3*[[0,0,0]] >>> I [[0, 0, 0], [0, 0, 0], [0, 0, 0]] >>> I[0][0]= 1 >>> I[1][1]= 1 >>> I[2][2]= 1 >>> I [[1, 1, 1], [1, 1, 1], [1, 1, 1]] Ι [1,0,0]
Άσκηση Τι θα εκτυπώσει το παρακάτω πρόγραμμα? >>> I = 3*[[0,0,0]] >>> I [[0, 0, 0], [0, 0, 0], [0, 0, 0]] >>> I[0][0]= 1 >>> I[1][1]= 1 >>> I[2][2]= 1 >>> I [[1, 1, 1], [1, 1, 1], [1, 1, 1]] Ι [1,1,0]
Άσκηση Τι θα εκτυπώσει το παρακάτω πρόγραμμα? >>> I = 3*[[0,0,0]] >>> I [[0, 0, 0], [0, 0, 0], [0, 0, 0]] >>> I[0][0]= 1 >>> I[1][1]= 1 >>> I[2][2]= 1 >>> I [[1, 1, 1], [1, 1, 1], [1, 1, 1]] Ι [1,1,1]
Μέθοδοι λίστών Οι λίστες είναι η κύρια δομή δεδομένων στην Python. Υποστηρίζονται από μεγάλο αριθμό μεθόδων >>> help(list) Help on class list in module builtins: class list(object) list() -> new empty list list(iterable) -> new list initialized from iterable's items Methods defined here: 49
Πλειάδες Οι πλειάδες (tuples) είναι ακολουθίες, όπως οι λίστες, οι οποίες όμως δεν μπορούν να αλλαχθούν Το ίδιο ισχύει και για τα αλφαριθμητικά (strings) =1,2,3 (1, 2, 3) [2] 3 [2] = 5 Traceback (most recent call last): File "<pyshell#212>", line 1, in <module> x[2] = 5 TypeError: 'tuple' object does not support item assignment 50
Πλειάδες - αρχικοποίηση = 1, (1,) = tuple([1]) (1,) >>> tuple([1, 2, 3]) (1, 2, 3) >>> tuple('abc') ('a', 'b', 'c') >>> tuple((1, 2, 3)) (1, 2, 3) >>> z = tuple() >>> z () το κόμμα στο τέλος υπονοεί πλειάδα με ένα στοιχείο x = 1 (χωρίς κόμμα) ορίζει οτί το x είναι ακέραιος αριθμός και όχι πλειάδα! 51
Λειτουργίες σε Πλειάδες Ακριβώς όπως οι λειτουργίες σε λίστες (π.χ. slicing) Διαφορές Οι πλειάδες δεν μπορούν να αλλαχθούν Οι πλειάδες δεν έχουν όλες τις μεθοδους λιστών συγκεκριμένα: δεν έχουν τις μεθόδους που αλλάζουν τις λίστες =1,2,3 [:2] (1, 2).count(2) 1.index(3) 2.sort() Traceback (most recent call last): File "<pyshell#209>", line 1, in <module> x.sort() AttributeError: 'tuple' object has no attribute 'sort' 52
Γιατί πλειάδες; Αφου οι πλειάδες έχουν περιορισμένη λειτουργικότητα σε σχέση με τις λίστες, γιατί τις χρησιμοποιούμε; Κάποιες λειτουργίες που θα δούμε αργότερα (π.χ. κλειδιά σε λεξικό) υποστηρίζονται με πλειάδες Κάποιες συναρτήσεις επιστρέφουν το αποτέλεσμά τους σε μορφή πλειάδων, οπότε πρέπει να ξέρουμε πως να τις χειριστούμε Στη γενική περίπτωση στα προγράμματα χρησιμοποιούμε λίστες αντί για πλειάδες 53
Μετατροπές >>> l = list((1,2,3)) >>> l [1, 2, 3] >>> t = tuple(l) >>> t (1, 2, 3) >>> l = list("hello") >>> l ['h', 'e', 'l', 'l', 'o'] >>> s = "".join(l) >>> s 'hello' >>> l = 3*["a rose"] >>> " is ".join(l) 'a rose is a rose is a rose' join: μέθοδος των strings η οποία παίρνει μια λίστα από strings και τα συνενώνει με διαχωριστικό το string που καλεί την μέθοδο