About

Swaroop C H is 29 years of age. He is a coder and startupper. He has previously worked at Yahoo!, Adobe, his own startup and Infibeam.

Read more about him

Views
Personal tools
COLLECTION
Collection

Python el:Περισσότερα

From Notes

Jump to: navigation, search

Contents

Εισαγωγή

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

Πέρα δώθε οι πλειάδες

Θέλατε ποτέ να επιστρέψετε δύο διαφορετικές τιμές από μια συνάρτηση; Μπορείτε. Το μόνο που χρειάζεται είναι να χρησιμοποιήσετε μια πλειάδα.

>>> def get_error_details():
...     return (2, 'second error details')
...
>>> errnum, errstr = get_error_details()
>>> errnum
2
>>> errstr
'second error details'

Παρατηρήστε ότι η χρήση του a, b = <κάποια έκφραση> ερμηνεύει το αποτέλεσμα της έκφρασης ως μια πλειάδα με δύο τιμές.

Αν θέλετε να ερμηνεύσετε τα αποτελέσματα ως (a, <οτιδήποτε άλλο>), τότε απλά προσθέστε ένα αστερίσκο, όπως θα κάνατε και με τις παραμέτρους μιας συνάρτησης:

>>> a, *b = [1, 2, 3, 4]
>>> a
1
>>> b
[2, 3, 4]

Αυτό σημαίνει επίσης ότι ο πιο γρήγορος τρόπος για να ανταλλάξετε τις τιμές δύο μεταβλητων στην Python είναι:

>>> a = 5; b = 8
>>> a, b = b, a
>>> a, b
(8, 5)

Ειδικές μέθοδοι

Υπάρχουν μερικές μέθοδοι όπως η __init__ και η __del__ οι οποίες έχουν ειδική σημασία στις κλάσεις.

Οι ειδικές μέθοδοι μιμούνται μερικές συμπεριφορές των ενσωματωμένων τύπων. Για παράδειγμα, αν θέλετε να χρησιμοποιήσετε τη λειτουργία ευρετηρίασης x[key] για την κλάση σας (όπως τη χρησιμοποιείτε για τις λίστες και τις πλειάδες), τότε το μόνο που χρειάζεται να κάνετε είναι να υλοποιήσετε τη μέθοδο __getitem__() και η δουλειά σας έγινε. Αν το καλοσκεφτείτε, αυτό είναι που κάνει η Python για την ίδια την κλάση list!

Στον ακόλουθο πίνακα εμφανίζονται μερικές χρήσιμες ειδικές μέθοδοι. Αν θέλετε τα μάθετε τα πάντα για τις ειδικές μεθόδους δείτε το εγχειρίδιο.

Μερικές ειδικές μέθοδοι

Όνομα

Εξήγηση

__init__(self, ...)

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

__del__(self)

Καλείται αμέσως πριν καταστραφεί το αντικείμενο

__str__(self)

Καλείται όταν χρησιμοποιούμε τη συνάρτηση print ή όταν χρησιμοποιείται η str().

__lt__(self, other)

Καλείται όταν χρησιμοποιείται ο τελεστής μικρότερο απόn (<). Ομοίως, υπάρχουν ειδικές μέθοδοι για όλους τους τελεστές (+, >, κ.λπ.).

__getitem__(self, key)

Καλείται όταν χρησιμοποιείται ο τελεστής ευρετηρίασης x[key].

__len__(self)

Καλείται όταν χρησιμοποιείται η ενσωματωμένη συνάρτηση len() για το αντικείμενο ακολουθίας.

Πλοκάδες μοναδικών εντολών

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

>>> flag = True
>>> if flag: print 'Yes'
...
Yes

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

Lambda Forms

Η εντολή lambda χρησιμοποιείται για να δημιουργήσει νέα αντικείμενα συναρτήσεων και να τα επιστρέψει κατά την εκτέλεση.

#!/usr/bin/python
# Filename: lambda.py
 
def make_repeater(n):
    return lambda s: s * n
 
twice = make_repeater(2)
 
print(twice('word'))
print(twice(5))

Έξοδος:

   $ python lambda.py
   wordword
   10

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

Εδώ χρησιμοποιούμε τη συνάρτηση make_repeater για να δημιουργήσουμε καινούρια αντικείμενα συναρτήσεων κατά την εκτέλεση και να τα επιστρέψουμε. Η εντολή lambda χρησιμοποιείται για να δημιουργήσει το αντικείμενο συνάρτησης. Ουσιαστικά η lambda δέχεται μια παράμετρο ακολουθούμενη από μια μοναδική έκφραση η οποία γίνεται το σώμα της συνάρτησης και η τιμή αυτής της έκφρασης επιστρέφεται από τη νέα συνάρτηση. Σημειώστε ότι ούτε καν μια εντολή print δε μπορεί να χρησιμοποιηθεί μέσα σε μια lambda, μόνο εκφράσεις.

TODO
Μπορούμε να κάνουμε ένα list.sort() παρέχοντας μια συνάρτηση σύγκρισης δημιουργημένη από μια lambda;
points = [ { 'x' : 2, 'y' : 3 }, { 'x' : 4, 'y' : 1 } ]
# points.sort(lambda a, b : cmp(a['x'], b['x']))

Κατανόηση λιστών

Η κατανόηση λιστών (List comprehension) χρησιμοποιείται για να εξάγουμε μια νέα λίστα από μια υφιστάμενη. Ας πούμε ότι έχετε μια λίστα από αριθμούς και θέλετε να πάρετε μια λίστα με τους αριθμούς της υφιστάμενης λίστα πολλαπλασιασμένους επί 2 μόνο όταν ο ίδιος ο αριθμός είναι μεγαλύτερος από 2. Η κατανόηση λίστας είναι ιδανική για τέτοιες περιπτώσεις.

#!/usr/bin/python
# Filename: list_comprehension.py
 
listone = [2, 3, 4]
listtwo = [2*i for i in listone if i > 2]
print(listtwo)

Έξοδος:

   $ python list_comprehension.py
   [6, 8]

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

Εδώ, έχουμε εξάγει μια νέα λίστα ορίζοντας ένα χειρισμό (2*i) όταν ικανοποιείται μια συνθήκη (if i > 2). Παρατηρήστε ότι η αρχική λίστα δεν τροποποιείται.

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

Αποστολή πλειάδων και λεξικών σε συναρτήσεις

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

>>> def powersum(power, *args):
...     '''Return the sum of each argument raised to specified power.'''
...     total = 0
...     for i in args:
...         total += pow(i, power)
...     return total
...
>>> powersum(2, 3, 4)
25
 
>>> powersum(2, 10)
100

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

exec και eval

Η συνάρτηση exec χρησιμοποιείται για να εκτελέσει εντολές της Python οι οποίες είναι αποθηκευμένες σε μια συμβολοσειρά ή σε ένα αρχείο, αντί να είναι γραμμένες μέσα στο ίδιο το πρόγραμμα. Για παράδειγμα, μπορούμε να δημιουργήσουμε μια συμβολοσειρά που να περιέχει κώδικα Python κατά την εκτέλεση, και να εκτελέσουμε αυτές τις εντολές χρησιμοποιώντας την εντολή exec:

>>> exec('print("Hello World")')
Hello World

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

>>> eval('2*3')
6

Η εντολή assert

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

>>> mylist = ['item']
>>> assert len(mylist) >= 1
>>> mylist.pop()
'item'
>>> mylist
[]
>>> assert len(mylist) >= 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

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

Η συνάρτηση repr

Η συνάρτηση repr χρησιμοποιείται για να λάβουμε μια κανονικοποιημένη αναπαράσταση ως συμβολοσειράς του αντικειμένου. Το ενδιαφέρον μέρος είναι ότι θα έχετε eval(repr(object)) == object τις περισσότερες φορές.

>>> i = []
>>> i.append('item')
>>> repr(i)
"['item']"
>>> eval(repr(i))
['item']
>>> eval(repr(i)) == i
True

Βασικά, η συνάρτηση repr χρησιμοποιείται για να λάβουμε μια ευανάγνωστη και εκτυπώσιμη αναπαράσταση του αντικειμένου. Μπορείτε να ελέγξετε τι επιστρέφουν οι κλάσεις σας για τη συνάρτηση repr ορίζοντας τη μέθοδο __repr__ στην κλάση.

Σύνοψη

Καλύψαμε μερικές ακόμα δυνατότητες της Python σ' αυτό το κεφάλαιο, αλλά και πάλι δεν τις έχουμε καλύψει όλες. Ωστόσο, σ' αυτό το στάδιο έχουμε μιλήσει τα περισσότερα από τα χαρακτηριστικά που θα χρειαστείτε στην πράξη. Αυτά είναι αρκετά για να ξεκινήσετε με οποιαδήποτε προγράμματα σκοπεύετε να δημιουργήσετε.

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



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

Please add your comments by clicking on the 'Discussion' link in the left sidebar.