post

Python el:Δομές δεδομένων

Contents

Εισαγωγή

Οι δομές δεδομένων είναι αυτό που λέει το όνομά τους, δηλαδή είναι δομές που μπορούν να κρατήσουν μαζί μερικά δεδομένα. Με άλλα λόγια χρησιμοποιούνται για να αποθηκεύουν δεδομένα που έχουν σχέση μεταξύ τους.

Υπάρχουν τέσσερις δομές δεδομένων ενσωματωμένες στη Python, οι λίστες, οι πλειάδες, τα λεξικά και τα σύνολα. Θα δούμε πώς να τα χρησιμοποιούμε και πώς μας κάνουν τη ζωή ευκολότερη.

Λίστα

Μια λίστα είναι μια δομή δεδομένων που συγκρατεί μια διατεταγμένη συλλογή στοιχείων, δηλαδή μπορείτε να αποθηκεύσετε μια ακολουθία (sequence) αντικειμένων στη λίστα. Αυτό είναι εύκολο να το φανταστείτε αν σκεφτείτε μια λίστα για αγορές, όπου έχετε μια λίστα με αντικείμενα που πρέπει να αγοράσετε, και εκτός αυτού πιθανόν έχετε κάθε στοιχείο σε διαφορετική γραμμή στη λίστα αγορών σας, ενώ στην Python τοποθετείτε κόμματα ανάμεσα στα στοιχεία.

Η λίστα των στοιχείων πρέπει να κλείνεται σε αγκύλες (δηλαδή [ και ] ) έτσι ώστε να καταλαβαίνει η Python ότι καθορίζετε μια λίστα. Αφού έχετε δημιουργήσει μια λίστα μια φορά μπορείτε να προσθέσετε, να μετακινήσετε ή να ψάξετε για στοιχεία σ’ αυτή τη λίστα. Από τη στιγμή που μπορούμε να προσθέσουμε και να μετακινήσουμε στοιχεία, λέμε ότι η λίστα είναι ένας μεταβλητός τύπος δεδομένων (mutable data type), δηλαδή αυτός ο τύπος μπορεί να αλλαχθεί.

Γρήγορη εισαγωγή στα αντικείμενα (objects) και τις κλάσεις (classes)

Αν και έχουμε αναβάλει μέχρι τώρα τη συζήτηση για τα αντικείμενα και τις κλάσεις, μια μικρή επεξήγηση απαιτείται ακριβώς τώρα για να καταλάβετε καλύτερα τις λίστες. Θα εξερευνήσουμε αυτό το θέμα αργότερα σε δικό του κεφάλαιο.

Η λίστα είναι ένα παράδειγμα χρήσης αντικειμένων και κλάσεων. Όταν χρησιμοποιούμε τη μεταβλητή i και εκχωρούμε σ’ αυτήν μια τιμή, ας πούμε τον ακέραιο αριθμό 5, αυτό μπορούμε να το σκεφτούμε σαν τη δημιουργία ενός αντικειμένου (δηλ. υπόστασης (instance)) i της κλάσης (δηλ. τύπου (type)) int. Στην πραγματικότητα μπορείτε να διαβάσετε τη βοήθεια στο help(int) για να το καταλάβετε καλύτερα.

Mια κλάση μπορεί επίσης να έχει μεθόδους (methods), δηλαδή συναρτήσεις που ορίστηκαν για χρήση που έχει σχέση μόνο με αυτή την κλάση. Μπορείτε να χρησιμοποιήσετε αυτά τα μέρη λειτουργικότητας μόνο όταν έχετε ένα αντικείμενο σε αυτή την κλάση. Για παράδειγμα η Python παρέχει μια μέθοδο append για την κλάση list, που σας επιτρέπει να προσθέσετε ένα αντικείμενο στο τέλος της λίστας. Για παράδειγμα, το mylist.append('an item') θα προσθέσει αυτή τη συμβολοσειρά στο τέλος του mylist. Σημειώστε τη χρήση του συμβολισμού με τελείες για να εισαχθούν οι μέθοδοι των αντικειμένων.

Μια κλάση μπορεί επίσης να έχει πεδία (fields), που δεν είναι τίποτα άλλο παρά μεταβλητές που ορίστηκαν για χρήση που έχει σχέση μόνο με αυτή την κλάση. Μπορείτε να χρησιμοποιήσετε αυτές τις μεταβλητές/ονομασίες μόνο όταν έχετε ένα αντικείμενο αυτής της κλάσης. Τα πεδία επίσης εισάγονται με συμβολισμό με τελείες, για παράδειγμα, mylist.field.

Παράδειγμα:

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Filename: using_list.py

# Αυτή είναι η λίστα αγορών μου
shoplist = ['μήλο', 'μάνγκο', 'καρότο', 'μπανάνα']

print('Πρέπει ν' αγοράσω', len(shoplist), 'πράγματα.')

print('Τα πράγματα αυτά είναι:', end=' ')
for item in shoplist:
    print(item, end=' ')

print('nΠρέπει επίσης ν' αγοράσω ρύζι.')
shoplist.append('ρύζι')
print('Η λίστα αγορών μου τώρα είναι:', shoplist)

print('Θα ταξινομήσω τη λίστα μου τώρα')
shoplist.sort()
print('Η ταξινομημένη λίστα μου είναι', shoplist)

print('Το πρώτο πράγμα που θ' αγοράσω είναι', shoplist[0])
olditem = shoplist[0]
del shoplist[0]
print('Αγόρασα το', olditem)
print('Η λίστα αγορών μου τώρα είναι', shoplist)

Έξοδος:

   $ python using_list.py
   Πρέπει ν' αγοράσω 4 πράγματα.
   Τα πράγματα αυτά είναι: μήλο μάνγκο καρότο μπανάνα
   Πρέπει επίσης ν' αγοράσω ρύζι.
   Η λίστα αγορών μου τώρα είναι: ['μήλο', 'μάνγκο', 'καρότο', 'μπανάνα', 'ρύζι']
   Θα ταξινομήσω τη λίστα μου τώρα
   Η ταξινομημένη λίστα μου είναι ['καρότο', 'μάνγκο', 'μήλο', 'μπανάνα', 'ρύζι']
   Το πρώτο πράγμα που θ' αγοράσω είναι καρότο
   Αγόρασα το καρότο
   Η λίστα αγορών μου τώρα είναι ['μάνγκο', 'μήλο', 'μπανάνα', 'ρύζι']

Πώς δουλεύει:

H μεταβλητή shoplist είναι μια λίστα αγορών για κάποιον που πηγαίνει στην αγορά. Στη shoplist αποθηκεύουμε συμβολοσειρές των ονομάτων των αντικειμένων που θα αγοράσουμε, αλλά μπορείτε να προσθέσετε οποιοδήποτε είδος αντικειμένου στη λίστα συμπεριλαμβανομένων αριθμών ή ακόμα και άλλες λίστες.

Επίσης έχουμε χρησιμοποιήσει το βρόχο for..in για να επανελέγξουμε τα αντικείμενα της λίστας. Μέχρι τώρα, πρέπει να έχετε καταλάβει ότι η λίστα είναι επίσης μια ακολουθία. Η ιδιαιτερότητα των ακολουθιών θα συζητηθεί σε επόμενη ενότητα.

Παρατηρήστε πως χρησιμοποιούμε τη λέξη-κλειδί όρισμα end στη συνάρτηση print, για να δείξουμε ότι θέλουμε να τελειώσουμε (end) την έξοδο με ένα διάστημα (space) αντί της συνηθισμένης νέας γραμμής (line break).

Κατόπιν προσθέτουμε ένα στοιχείο στη λίστα χρησιμοποιώντας τη μέθοδο append του αντικειμένου λίστας, όπως ήδη συζητήσαμε. Τότε, ελέγχουμε ότι το στοιχείο έχει πραγματικά προστεθεί στη λίστα, τυπώνοντας τα περιεχόμενα της λίστας, απλά περνώντας τη λίστα στην εντολή print και την τυπώνει.

Τότε, ταξινομούμε τη λίστα χρησιμοποιώντας τη μέθοδο sort της λίστας. Είναι σημαντικό να καταλάβετε ότι αυτή η μέθοδος επηρεάζει την ίδια τη λίστα και δεν επιστρέφει μια τροποποιημένη λίστα, αυτή είναι η διαφορά από τον τρόπο που δουλεύουν οι συμβολοσειρές. Αυτό είναι που εννοούμε λέγοντας ότι οι λίστες είναι μεταβλητές (mutable) και οι συμβολοσειρές αμετάβλητες (immutable).

Κατόπιν, όταν αγοράσουμε ένα πράγμα από τη λαϊκή, θέλουμε να το αφαιρέσουμε από τη λίστα. Αυτό το επιτυγχάνουμε χρησιμοποιώντας την εντολή del. Εδώ αναφέρουμε ποιο στοιχείο της λίστας θέλουμε να αφαιρέσουμε και η εντολή del το αφαιρεί από τη λίστα για μας. Καθορίζουμε ότι θέλουμε να αφαιρέσουμε το πρώτο αντικείμενο από τη λίστα και έτσι χρησιμοποιούμε την del shoplist[0] (θυμηθείτε ότι η Python αρχίζει να μετρά από το μηδέν).

Εάν θέλετε να γνωρίσετε όλες τις μεθόδους που ορίζονται από τη λίστα αντικειμένου, κοιτάξτε το help(list) για λεπτομέρειες.

Πλειάδα

Οι πλειάδες χρησιμοποιούνται για να συγκρατήσουν μαζί πολλαπλά αντικείμενα. Σκεφτείτε τα σαν παρόμοια με τις λίστες, αλλά χωρίς την εκτεταμένη λειτουργικότητα που η κλάση της λίστας σας δίνει. Ένα κύριο χαρακτηριστικό των πλειάδων είναι ότι είναι αμετάβλητες όπως οι συμβολοσειρές, δηλαδή δε μπορείτε να τροποποιήσετε πλειάδες.

Οι πλειάδες ορίζονται καθορίζοντας στοιχεία που διαχωρίζονται με κόμματα, μέσα σε ένα προαιρετικό ζευγάρι παρενθέσεων.

Οι πλειάδες χρησιμοποιούνται, συνήθως, στις περιπτώσεις όπου μια εντολή ή μια συνάρτηση οριζόμενη από το χρήστη, μπορεί με ασφάλεια να θεωρήσει ότι η συλλογή των τιμών δηλ. η πλειάδα των τιμών που χρησιμοποιούνται δε θα αλλάξει.

Παράδειγμα:

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Filename: using_tuple.py

zoo = ('πύθωνας', 'ελέφαντας', 'πιγκουίνος') # θυμηθείτε οι παρενθέσεις είναι προαιρετικές
print('Ο αριθμός των ζώων στο ζωολογικό κήπο είναι', len(zoo))

new_zoo = ('μαϊμού', 'καμήλα', zoo)
print('Ο αριθμός των κλουβιών στο νέο ζωολογικό κήπο είναι', len(new_zoo))
print('Όλα τα ζώα στο νέο ζωολογικό κήπο είναι', new_zoo)
print('Όλα τα ζώα που έφεραν από τον παλιό ζωολογικό κήπο είναι', new_zoo[2])
print('Το τελευταίο ζώο που έφεραν από τον παλιό ζωολογικό κήπο είναι', new_zoo[2][2])
print('Ο αριθμός των ζώων που είναι στο νέο ζωολογικό κήπο', len(new_zoo)-1+len(new_zoo[2]))

Έξοδος:

   $ python using_tuple.py
   Ο αριθμός των ζώων στο ζωολογικό κήπο είναι 3
   Ο αριθμός των κλουβιών στο νέο ζωολογικό κήπο είναι 3
   Όλα τα ζώα στο νέο ζωολογικό κήπο είναι ('μαϊμού', 'καμήλα', ('πύθωνας', 'ελέφαντας', 'πιγκουίνος'))
   Όλα τα ζώα που έφεραν από τον παλιό ζωολογικό κήπο είναι ('πύθωνας', 'ελέφαντας', 'πιγκουίνος')
   Το τελευταίο ζώο που έφεραν από τον παλιό ζωολογικό κήπο είναι πιγκουίνος
   Ο αριθμός των ζώων που είναι στο νέο ζωολογικό κήπο 5

Πώς δουλεύει:

Η μεταβλητή zoo αναφέρεται σε μια πλειάδα στοιχείων. Βλέπουμε ότι η συνάρτηση len μπορεί να χρησιμοποιηθεί για να πάρει το μήκος της πλειάδας. Αυτό επίσης δείχνει ότι η πλειάδα είναι επίσης και μια ακολουθία.

Τώρα μετακινούμε αυτά τα ζώα σε ένα νέο ζωολογικό κήπο επειδή ο παλιός κλείνει. Συνεπώς, η πλειάδα the new_zoo περιέχει κάποια ζώα που βρίσκονται ήδη εκεί, μαζί με τα ζώα που έφεραν από τον παλιό ζωολογικό κήπο. Πίσω στην πραγματικότητα, σημειώστε ότι μια πλειάδα μέσα σε μια πλειάδα δε χάνει την ταυτότητά της.

Μπορούμε να έχουμε πρόσβαση στα αντικείμενα μέσα στην πλειάδα, καθορίζοντας τη θέση του στοιχείου μέσα σε ένα ζευγάρι αγκύλες, ακριβώς όπως κάναμε για τις λίστες. Αυτό ονομάζεται τελεστής ευρετηρίασης (indexing operator). Παίρνουμε το τρίτο στοιχείο μέσα στο new_zoo καθορίζοντας new_zoo[2] και παίρνουμε το τρίτο στοιχείο μέσα στο τρίτο στοιχείο στην πλειάδα new_zoo καθορίζοντας new_zoo[2][2]. Aυτό είναι πολύ απλό άπαξ και έχετε καταλάβει το ιδίωμα.

Παρενθέσεις
Αν και οι παρενθέσεις είναι προαιρετικές, εγώ προτιμώ πάντα να τις έχω για να κάνω φανερό ότι αυτή είναι μια πλειάδα, ειδικά επειδή αποφεύγεται η ασάφεια. Για παράδειγμα, το print(1,2,3) και το print( (1,2,3) ) σημαίνουν δυο διαφορετικά πράγματα -το μεν τυπώνει τρεις αριθμούς, αντίθετα το δε τυπώνει μια πλειάδα (η οποία περιέχει τρεις αριθμούς).
Πλειάδα με 0 ή 1 στοιχεία
Μια άδεια πλειάδα δομείται από ένα άδειο ζευγάρι παρενθέσεων όπως το myempty = (). Πάντως, μια πλειάδα με ένα μόνο στοιχείο δεν είναι τόσο απλή. Πρέπει να την καθορίσετε χρησιμοποιώντας ένα κόμμα μετά το πρώτο και μοναδικό στοιχείο, έτσι ώστε η Python να μπορεί να διαφοροποιεί μια πλειάδα από ένα ζευγάρι παρενθέσεων που παρεμβάλλουν το αντικείμενο σε μια έκφραση, δηλαδή πρέπει να καθορίζετε singleton = (2 , ), εάν εννοείτε ότι θέλετε μια πλειάδα που περιέχει το στοχείο 2.
Σημείωση για τους προγραμματιστές της Perl
Μια λίστα μέσα σε μια λίστα δεν χάνει την ταυτότητά της δηλ. οι λίστες δεν ισοπεδώνονται όπως στην Perl. Το ίδιο ισχύει για μια πλειάδα μέσα σε μια πλειάδα, ή για μια πλειάδα μέσα σε μια λίστα, ή για μια λίστα μέσα σε μια πλειάδα, κ.τ.λ. Σε ό,τι αφορά την Python, αυτά είναι μόνο αντικείμενα που αποθηκεύονται χρησιμοποιώντας ένα άλλο αντικείμενο, κι αυτό είναι όλο.

Λεξικό

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

Σημειώστε ότι μπορείτε να χρησιμοποιήσετε μόνο αμετάβλητα αντικείμενα (όπως συμβολοσειρές) για τα κλειδιά του λεξικού, αλλά μπορείτε να χρησιμοποιήσετε είτε αμετάβλητα είτε μεταβλητά αντικείμενα για τις τιμές του λεξικού. Αυτό ουσιαστικά σημαίνει ότι πρέπει να χρησιμοποιείτε μόνο απλά αντικείμενα για κλειδιά.

Ζευγάρια κλειδιών και τιμών καθορίζονται στο λεξικό χρησιμοποιώντας το συμβολισμό d = {key1: value1, key2: value2 }. Παρατηρήστε ότι τα ζευγάρια κλειδί-τιμή διαχωρίζονται με διπλή τελεία και τα ζευγάρια διαχωρίζονται μεταξύ τους με κόμματα και όλα αυτά περικλείονται σε ένα ζευγάρι άγκιστρων.

Θυμηθείτε ότι τα ζευγάρια κλειδί-τιμή σε ένα λεξικό δεν ταξινομούνται με κανένα τρόπο. Αν θέλετε μια ειδική σειρά ταξινόμησης, τότε πρέπει να τα ταξινομήσετε από μόνοι σας πριν τα χρησιμοποιήσετε.

Τα λεξικά που θα χρησιμοποιείτε είναι υποστάσεις/αντικείμενα της κλάσης dict.

Παράδειγμα:

#!/usr/bin/python
# Filename: using_dict.py

# 'ab' is short for 'a'ddress'b'ook

ab = {  'Swaroop'  : 'swaroop@swaroopch.com',
        'Larry'    : 'larry@wall.org',
        'Matsumoto': 'matz@ruby-lang.org',
        'Spammer'  : 'spammer@hotmail.com'
    }

print("Swaroop's address is", ab['Swaroop'])

# Deleting a key-value pair
del ab['Spammer']

print('nThere are {0} contacts in the address-bookn'.format(len(ab)))

for name, address in ab.items():
    print('Contact {0} at {1}'.format(name, address))

# Adding a key-value pair
ab['Guido'] = 'guido@python.org'

if 'Guido' in ab:
    print("nGuido's address is", ab['Guido'])

Έξοδος:

   $ python using_dict.py
   Swaroop's address is swaroop@swaroopch.com

   There are 3 contacts in the address-book

   Contact Swaroop at swaroop@swaroopch.com
   Contact Matsumoto at matz@ruby-lang.org
   Contact Larry at larry@wall.org

   Guido's address is guido@python.org

Πώς δουλεύει:

Δημιουργούμε το λεξικό ab χρησιμοποιώντας το συμβολισμό που ήδη συζητήσαμε. Τότε εισάγουμε ζευγάρια κλειδί-τιμή καθορίζοντας το κλειδί, χρησιμοποιώντας τον τελεστή ευρετηρίασης (indexing operator) όπως συζητήθηκε στο απόσπασμα των λιστών και πλειάδων. Παρατηρήστε την απλή σύνταξη.

Μπορούμε να διαγράψουμε ζευγάρια κλειδί-τιμή χρησιμοποιώντας τον παλιό μας φίλο, την εντολή del. Eμείς απλά καθορίζουμε το λεξικό και τον τελεστή ευρετηρίασης για το κλειδί που θα αφαιρεθεί και τα περνάμε στην εντολή del. Δεν είναι αναγκαίο να γνωρίζετε την τιμή που αντιστοιχεί στο κλειδί για αυτή τη λειτουργία.

Έπειτα, εισάγουμε κάθε ζευγάρι κλειδί-τιμή του λεξικού χρησιμοποιώντας τη μέθοδο items του λεξικού, η οποία επιστρέφει μια λίστα πλειάδων, όπου κάθε πλειάδα περιέχει ένα ζευγάρι στοιχείων -το κλειδί ακολουθούμενο από την τιμή. Ανακτούμε αυτό το ζευγάρι και το εκχωρούμε στις μεταβλητές name (ονομασία) και address (διεύθυνση) αντιστοίχως για κάθε ζευγάρι, χρησιμοποιώντας το βρόχο for..in και μετά τυπώνει αυτές τις τιμές στην πλοκάδα for.

Μπορούμε να προσθέσουμε νέα ζευγάρια κλειδί-τιμή, απλά χρησιμοποιώντας τον τελεστή ευρετηρίασης για να εισάγουμε ένα κλειδί και να εκχωρήσουμε σ’ αυτό μια τιμή, όπως έχουμε κάνει για το Guido στην ανωτέρω περίπτωση.

Μπορούμε να ελέγξουμε εάν ένα ζευγάρι κλειδί-τιμή υπάρχει, χρησιμοποιώντας τον τελεστή in, ή ακόμα και τη μέθοδο has_key της κλάσης dict. Μπορείτε να δείτε την τεκμηρίωση για ολόκληρη τη λίστα των μεθόδων της κλάσης dict χρησιμοποιώντας τη help(dict).

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

Ακολουθίες

Οι λίστες, οι πλειάδες και οι συμβολοσειρές είναι παραδείγματα ακολουθιών, αλλά τι είναι οι ακολουθίες και τι το ιδιαίτερο με αυτές;

Tα κυρίαρχα χαρακτηριστικά είναι ότι έχουν δοκιμές ένταξης (membership tests, δηλ. τις εκφράσεις in και not in) και λειτουργίες ευρετηρίασης (indexing operations). H λειτουργία ευρετηρίασης μας επιτρέπει να πάρουμε απ’ ευθείας ένα συγκεκριμένο στοιχείο στην ακολουθία.

Οι τρεις τύποι ακολουθιών που αναφέρθηκαν παραπάνω, λίστες, πλειάδες και συμβολοσειρές έχουν επίσης μια λειτουργία τεμαχισμού (slicing operation), που μας επιτρέπει να ανακτούμε ένα μέρος (slice) της ακολουθίας.

Παράδειγμα:

#!/usr/bin/python
# Filename: seq.py

shoplist = ['apple', 'mango', 'carrot', 'banana']
name = 'swaroop'

# Indexing or 'Subscription' operation
print('Item 0 is', shoplist[0])
print('Item 1 is', shoplist[1])
print('Item 2 is', shoplist[2])
print('Item 3 is', shoplist[3])
print('Item -1 is', shoplist[-1])
print('Item -2 is', shoplist[-2])
print('Character 0 is', name[0])

# Slicing on a list
print('Item 1 to 3 is', shoplist[1:3])
print('Item 2 to end is', shoplist[2:])
print('Item 1 to -1 is', shoplist[1:-1])
print('Item start to end is', shoplist[:])

# Slicing on a string
print('characters 1 to 3 is', name[1:3])
print('characters 2 to end is', name[2:])
print('characters 1 to -1 is', name[1:-1])
print('characters start to end is', name[:])

Έξοδος:

   $ python seq.py
   Item 0 is apple
   Item 1 is mango
   Item 2 is carrot
   Item 3 is banana
   Item -1 is banana
   Item -2 is carrot
   Character 0 is s
   Item 1 to 3 is ['mango', 'carrot']
   Item 2 to end is ['carrot', 'banana']
   Item 1 to -1 is ['mango', 'carrot']
   Item start to end is ['apple', 'mango', 'carrot', 'banana']
   characters 1 to 3 is wa
   characters 2 to end is aroop
   characters 1 to -1 is waroo
   characters start to end is swaroop

Πώς λειτουργεί:

Αρχικά βλέπουμε πώς να χρησιμοποιούμε ευρετήρια για να παίρνουμε μοναδικά στοιχεία της ακολουθίας. Αυτό αναφέρεται επίσης σαν συνδρομητική λειτουργία (subscription operation). Οποτεδήποτε καθορίζετε ένα νούμερο σε μια ακολουθία μέσα σε αγκύλες, όπως φαίνεται παραπάνω, η Python θα φέρνει το στοιχείο που αντιστοιχεί σε αυτή τη θέση στην ακολουθία. Θυμηθείτε ότι η Python αρχίζει να μετράει τα νούμερα από το μηδέν. Για αυτό το λόγο η shoplist[0] κάνει μετάκληση του πρώτου στοιχείου και η shoplist[3] κάνει μετάκληση του τέταρτου στοιχείου στην ακολουθία shoplist.

Το ευρετήριο μπορεί να είναι ένας αρνητικός αριθμός, στην οποία περίπτωση, η θέση υπολογίζεται από το τέλος της ακολουθίας. Έτσι, η shoplist[-1] αναφέρεται στο τελευταίο στοιχείο στην ακολουθία και η shoplist[-2] κάνει μετάκληση του δεύτερου από το τέλος στοιχείου στην ακολουθία.

Η λειτουργία τεμαχισμού χρησιμοποιείται καθορίζοντας την ονομασία της ακολουθίας, ακολουθούμενο από ένα προαιρετικό ζευγάρι αριθμών, που διαχωρίζονται από διπλή τελεία μέσα σε αγκύλες. Σημειώστε ότι αυτό είναι παρόμοιο με τη λειτουργία ευρετηρίασης, που έχει χρησιμοποιηθεί μέχρι τώρα. Θυμηθείτε ότι τα νούμερα είναι προαιρετικά αλλά η διπλή τελεία δεν είναι.

Το πρώτο νούμερο (πριν από τη διπλή τελεία) στη λειτουργία τεμαχισμού αναφέρεται στη θέση από όπου το τμήμα (slice) αρχίζει και το δεύτερο νούμερο (μετά τη διπλή τελεία) δείχνει που θα σταματήσει το τμήμα. Εάν δεν καθορίζεται το πρώτο νούμερο, η Python θα αρχίσει στην αρχή της ακολουθίας. Εάν το δεύτερο νούμερο παραλήφθηκε, η Python θα σταματήσει στο τέλος της ακολουθίας.

Σημειώστε ότι το τμήμα που επιστρέφεται ξεκινά από την αρχική θέση και τελειώνει ακριβώς πριν από την τελική θέση, δηλαδή η αρχική θέση συμπεριλαμβάνεται αλλά η τελική θέση αποκλείεται από το τμήμα της ακολουθίας.

Έτσι η shoplist[1:3] επιστρέφει ένα τμήμα της ακολουθίας αρχίζοντας στη θέση 1, περιλαμβάνει τη θέση 2, αλλά σταματάει στη θέση 3, συνεπώς, επιστρέφεται ένα τμήμα δύο αντικειμένων. Παρόμοια, η shoplist[:] επιστρέφει ένα αντίγραφο όλης της ακολουθίας.

Μπορείτε επίσης να κάνετε τεμαχισμό με αρνητικές θέσεις. Οι αρνητικοί αριθμοί χρησιμοποιούνται για θέσεις από το τέλος της ακολουθίας. Για παράδειγμα, η shoplist[:-1] θα επιστρέψει ένα τμήμα της ακολουθίας η οποία παραλείπει το τελευταίο στοιχείο της ακολουθίας, αλλά περιέχει κάθε άλλο.

Μπορείτε επίσης να δώσετε ένα τρίτο όρισμα για το τμήμα, το οποίο είναι το βήμα (step) για τον τεμαχισμό (από προεπιλογή το μέγεθος βήματος είναι 1):

>>> shoplist = ['apple', 'mango', 'carrot', 'banana']
>>> shoplist[::1]
['apple', 'mango', 'carrot', 'banana']
>>> shoplist[::2]
['apple', 'carrot']
>>> shoplist[::3]
['apple', 'banana']
>>> shoplist[::-1]
['banana', 'carrot', 'mango', 'apple']

Παρατηρήστε ότι όταν το βήμα είναι 2, παίρνουμε τα στοιχεία με θέση 0, 2, … Όταν το μέγεθος βήματος είναι 3, παίρνουμε τα στοιχεία με θέση 0, 3, κ.τ.λ.

Δοκιμάστε διάφορους συνδυασμούς από τέτοιους προσδιορισμούς τμημάτων, χρησιμοποιώντας το διερμηνευτή Python αλληλεπιδραστικά, δηλ. την προτροπή (prompt) έτσι ώστε να μπορείτε να δείτε τα αποτελέσματα αμέσως. Το σπουδαίο με τις ακολουθίες είναι ότι μπορείτε να έχετε πρόσβαση σε πλειάδες, λίστες και συμβολοσειρές όλες με τον ίδιο τρόπο.

Σύνολο (Set)

Τα σύνολα είναι μη ταξινομημένες συλλογές απλών αντικειμένων. Αυτά χρησιμοποιούνται όταν η ύπαρξη ενός αντικειμένου σε μια συλλογή είναι πιο σπουδαία από την εντολή ή πόσες φορές αυτή συμβαίνει.

Χρησιμοποιώντας τα σύνολα, μπορείτε να ελέγξετε για ένταξη (membership), εάν είναι ένα υποσύνολο (subset) ενός άλλου συνόλου, να βρείτε την τομή (intersection) ανάμεσα σε δύο σύνολα και ούτω καθεξής.

>>> bri = set(['brazil', 'russia', 'india'])
>>> 'india' in bri
True
>>> 'usa' in bri
False
>>> bric = bri.copy()
>>> bric.add('china')
>>> bric.issuperset(bri)
True
>>> bri.remove('russia')
>>> bri & bric # OR bri.intersection(bric)
{'brazil', 'india'}

Πώς δουλεύει:

To παράδειγμα εξηγείται από μόνο του, διότι περιλαμβάνει βασική θεωρία μαθηματικών συνόλων που διδάσκεται στο σχολείο.

Παραπομπές (References)

Όταν δημιουργείτε ένα αντικείμενο και το εκχωρείτε σε μια μεταβλητή, η μεταβλητή απλά παραπέμπει στο αντικείμενο και δεν αντιπροσωπεύει καθ’ αυτό το αντικείμενο. H ονομασία της μεταβλητής δείχνει σε εκείνο το σημείο της μνήμης του υπολογιστή, όπου αποθηκεύεται το αντικείμενο. Αυτό ονομάζεται συσχέτιση (binding) της ονομασίας με το αντικείμενο.

Γενικά δεν πρέπει να ανησυχείτε για αυτό, αλλά υπάρχει μια μικρή επίδραση εξαιτίας των παραπομπών την οποία πρέπει να αντιληφθείτε.

Παράδειγμα:

#!/usr/bin/python
# Filename: reference.py

print('Simple Assignment')
shoplist = ['apple', 'mango', 'carrot', 'banana']
mylist = shoplist # mylist is just another name pointing to the same object!

del shoplist[0] # I purchased the first item, so I remove it from the list

print('shoplist is', shoplist)
print('mylist is', mylist)
# notice that both shoplist and mylist both print the same list without
# the 'apple' confirming that they point to the same object

print('Copy by making a full slice')
mylist = shoplist[:] # make a copy by doing a full slice
del mylist[0] # remove first item

print('shoplist is', shoplist)
print('mylist is', mylist)
# notice that now the two lists are different

Έξοδος:

   $ python reference.py
   Simple Assignment
   shoplist is ['mango', 'carrot', 'banana']
   mylist is ['mango', 'carrot', 'banana']
   Copy by making a full slice
   shoplist is ['mango', 'carrot', 'banana']
   mylist is ['carrot', 'banana']

Πώς δουλεύει:

Το μεγαλύτερο μέρος της εξήγησης είναι διαθέσιμο στα σχόλια.

Θυμηθείτε ότι εάν θέλετε να φτιάξετε ένα αντίγραφο μιας λίστας, ή τέτοιου είδους ακολουθίες, ή σύμπλοκα αντικείμενα (όχι απλά αντικείμενα όπως ακέραιους αριθμούς), τότε πρέπει να χρησιμοποιήσετε τη λειτουργία τεμαχισμού για να φτιάξετε αντίγραφο. Εάν εκχωρήσετε την ονομασία της μεταβλητής σε μια άλλη ονομασία, τότε και οι δυο τους θα παραπέμπουν στο ίδιο αντικείμενο και αυτό θα μπορούσε να είναι πρόβλημα για σας, εάν δεν είστε προσεκτικοί.

Σημείωση για τους προγραμματιστές της Perl
Θυμηθείτε ότι μια εντολή εκχώρησης για λίστες δε δημιουργεί αντίγραφο. Πρέπει να χρησιμοποιήσετε τη λειτουργία τεμαχισμού για να φτιάξετε αντίγραφο της ακολουθίας.

Περισσότερα για τις συμβολοσειρές

Έχουμε ήδη συζητήσει νωρίτερα για τις συμβολοσειρές (strings) προηγουμένως. Τι περισσότερο μπορούμε να μάθουμε; Λοιπόν, γνωρίζατε ότι οι συμβολοσειρές είναι επίσης αντικείμενα και έχουν μεθόδους που κάνουν τα πάντα, από τον έλεγχο του τμήματος μιας συμβολοσειράς μέχρι αποκοπή των διαστημάτων!

Οι συμβολοσειρές που χρησιμοποιείτε στο πρόγραμμα είναι όλες αντικείμενα της κλάσης str. Μερικές χρήσιμες μεθόδοι της κλάσης παρουσιάζονται στο επόμενο παράδειγμα. Για μια ολοκληρωμένη λίστα τέτοιων μεθόδων, κοιτάξτε τη help(str).

Παράδειγμα:

#!/usr/bin/python
# Filename: str_methods.py

name = 'Swaroop' # This is a string object

if name.startswith('Swa'):
    print('Yes, the string starts with "Swa"')

if 'a' in name:
    print('Yes, it contains the string "a"')

if name.find('war') != -1:
    print('Yes, it contains the string "war"')

delimiter = '_*_'
mylist = ['Brazil', 'Russia', 'India', 'China']
print(delimiter.join(mylist))

Έξοδος:

   $ python str_methods.py
   Yes, the string starts with "Swa"
   Yes, it contains the string "a"
   Yes, it contains the string "war"
   Brazil_*_Russia_*_India_*_China

Πώς δουλεύει:

Eδώ βλέπουμε πολλές μεθόδους της συμβολοσειράς σε ενέργεια. Η μέθοδος startswith χρησιμοποιείται για να ανακαλύψουμε αν η συμβολοσειρά αρχίζει με τη δοθείσα συμβολοσειρά. Ο τελεστής in χρησιμοποιείται για να ελέγξει αν η δοθείσα συμβολοσειρά είναι μέρος της συμβολοσειράς.

Η μέθοδος find χρησιμοποιείται για να ανακαλύψει τη θέση της δοθείσας συμβολοσειράς στη συμβολοσειρά ή επιστρέφει -1 εάν δεν επιτύχει την ανακάλυψη της υποσυμβολοσειράς (substring). Η κλάση str επίσης έχει την ωραία μέθοδο join για να ενώνει τα στοιχεία μιας ακολουθίας, με τη συμβολοσειρά να ενεργεί σα διαχωριστικό (delimiter) ανάμεσα σε κάθε στοιχείο της ακολουθίας, και επιστρέφει μια μεγαλύτερη συμβολοσειρά γεννημένη από αυτό.

Σύνοψη

Έχουμε διερευνήσει τις διάφορες ενσωματωμένες δομές δεδομένων της Python με λεπτομέρεια. Αυτές οι δομές δεδομένων θα είναι απαραίτητες για τη συγγραφή προγραμμάτων σε κάποιο υπολογίσιμο μέγεθος.

Τώρα που έχουμε δει πολλά από τα βασικά της Python, θα δούμε πώς να σχεδιάζουμε και να γράφουμε ένα πραγματικό πρόγραμμα Python.


Πίσω στα περιεχόμενα