Εισαγωγή στην Python

Από Κοινότητα Ελεύθερου Λογισμικού ΕΜΠ
Μετάβαση σε: πλοήγηση, αναζήτηση

H Python είναι μια πολύ όμορφη, ιδιαίτερα εκφραστική, αντικειμενοστραφής, υψηλού επιπέδου γλώσσα προγραμματισμού. Το σύστημα τύπων της είναι πλήρως δυναμικό και η διαχείριση μνήμης αυτόματη, η standard υλοποίησή της (CPython) είναι ένας bytecode compiler και interpreter και η βιβλιοθήκη της πολύ πλούσια.

Βασική αρχή της Python είναι ότι ο χρόνος του προγραμματιστή είναι πολύ σημαντικότερος από τους κύκλους μηχανής και τον απαλλάσσει από τις χαμηλού επιπέδου λεπτομέρειες που πρέπει να φροντίσει στη C/C++ ή, ως ένα βαθμό, στη Java. Αυτό το άρθρο δεν θα σας μάθει την Python, είναι μια απόπειρα παρουσίασης των προηγμένων χαρακτηριστικών της με την ελπίδα ότι θα τσιμπήσετε και θα ακολουθήσετε τα link στο τέλος ;-).

Τρέχοντας προγράμματα

Είναι σχεδόν σίγουρο ότι η Python υπάρχει στη GNU/Linux διανομή σας, ενώ από το website της μπορείτε να την κατεβάσετε για κάποιο άλλο σύστημα. Μπορούμε να δώσουμε εντολές διαδραστικά στον interpreter της γλώσσας (όπως θα κάνουμε εδώ) ή να δημιουργήσουμε εκτελέσιμα με τη συνήθη σύμβαση στα Unix scripts, με πρώτη γραμμή όπως αυτή:

#!/usr/bin/python

και θέτοντας 1 το execute bit του αρχείου:

$ chmod +x my_first_script.py

Δεδομένα

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

>>> a=1234
>>> a="hello world"
>>> print a
hello world

Λίστες

Οι λίστες της Python έχουν δυναμικό μέγεθος και τα αντικείμενά τους είναι οποιουδήποτε τύπου:

>>> my_list=[123,"Python rocks"]
>>> my_list.append(234)  
>>> print my_list
[123, 'Python rocks', 234]
>>> my_list.remove(234)
>>> print my_list
[123, 'Python rocks']

Σημείωση: τα μονά εισαγωγικά στην Python είναι ισοδύναμα με τα διπλά.

Μπορούμε να βρούμε ένα στοιχείο με βάση τη θέση του σε σχέση με την αρχή ή το τέλος της λίστα:

>>> languages=["Python","Perl","PHP","Ruby","OCaml","Java","Brainfuck"]
>>> print languages[1],languages[-1]
Perl Brainfuck

Με λίστα a, θετικό j a[-j]==a[len(a)-j]. Δημιουργούμε εύκολα υπολίστες:

>>> languages[1:4]
['Perl', 'PHP', 'Ruby']
>>> languages[:-1]
['Python', 'Perl', 'PHP', 'Ruby', 'OCaml', 'Java']

Η λίστα a[i:j] περιλαμβάνει το στοιχείο a[i] αλλά όχι το στοιχείο a[j]. Λαμβάνουμε μια νέα λίστα, εφαρμόζοντας μια συνάρτηση στα στοιχεία της αρχικής:

>>> numbers=range(5)
>>> print numbers
[0, 1, 2, 3, 4]
>>> [item*2 for item in numbers]
[0, 2, 4, 6, 8]

ή μια συνθήκη στα στοιχεία της αρχικής:

>>> print numbers
[0, 1, 2, 3, 4]
>>> [item for item in numbers if item%2==0]
[0, 2, 4]

Η δομή for της Python εκτελεί το αντίστοιχο κομμάτι κώδικα για κάθε στοιχείο μιας λίστας:

>>> for a in [5,7,3]:
...     print a,
... 
5 7 3

Σημείωση: με το κόμμα στην print αποφεύγουμε τον χαρακτήρα νέας γραμμής

Μπορούμε να προσομοιώσουμε την for των άλλων γλωσσών (αν και αυτό σχεδόν ποτέ δεν χρειάζεται) με κλήση της range.

με help(list) μπορούμε να δούμε τις διαθέσιμες μεθόδους του τύπου list.

Tuples

Τα tuples μοιάζουν με τις λίστες. Η πρόσβαση σε αυτά είναι γρηγορότερη, αλλά δεν μπορούμε να προσθέσουμε ή να διαγράψουμε στοιχεία.

>>> my_tuple=(1,2,3,4)
>>> my_tuple[1:-1]
(2, 3)

Λεξικά

Χρησιμοποιούνται για να βρίσκουμε εύκολα ένα αντικείμενο με βάση κάποιο κλειδί (το οποίο δεν είναι απαραίτητα ακέραιος, όπως στο παράδειγμα):

>>> my_dict={1:"one"}
>>> my_dict[1]
'one'
>>> my_dict[2]="two"
>>> my_dict
{1: 'one', 2: 'two'}

Strings

Μπορούμε να κάνουμε πράξεις με αυτά:

>>> good_os="Linux"
>>> 3*good_os
'LinuxLinuxLinux'
>>> good_os="GNU/"+good_os
>>> print good_os
GNU/Linux

Είναι εύκολο να συνενώσουμε μια λίστα από strings:

>>> " ".join(languages)
'Python Perl PHP Ruby OCaml Java Brainfuck'

Τα strings διαθέτουν χρήσιμες μεθόδους, για παράδειγμα αναζήτηση:

>>> "Python rocks".find("ro")
7

Μπορείτε να δείτε τις διαθέσιμες μεθόδους με help(str).

Είναι δυνατόν να δημιουργήσουμε strings φορμάροντας κάποιο input, αντίστοιχα με την printf της C:

>>> "numbers are %d, %d" %(4,5)
'numbers are 4, 5'

Τα strings πολλών γραμμών περικλείονται σε """.

Πρόσβαση σε substrings ή σε μεμονωμένους χαρακτήρες έχουμε με την σύνταξη των λιστών που παρουσιάζεται παραπάνω.

Μπορούμε να εκτελέσουμε δυναμικά το περιεχόμενο ενός string, σαν να ήταν ένα οποιοδήποτε άλλο κομμάτι κώδικα:

>>> exec("a=2007")
>>> print a
2007

Συναρτήσεις

Δημιουργούμε συναρτήσεις όπως στο παράδειγμα που ακολουθεί:

def my_function(a):
    if a>0:
        b=3*a+5
    else:
        b=-3*a+5
    return b

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

Οι συναρτήσεις μπορεί να είναι εμφωλευμένες:

def another_function(a):
    def embeddef_function(b):
        return 2*b
    return embedded_function(b)+3

Μπορούμε να χρησιμοποιήσουμε μια μεταβλητή ως αναφορά σε κάποια συνάρτηση ή να περάσουμε μια συνάρτηση ως παράμετρο σε μια άλλη:

alias=my_function
c=alias(5)

Η Python δεν κάνει έλεγχο τύπων στα ορίσματα που περνάμε στις συναρτήσεις και μπορούμε να χρησιμοποιήσουμε την ίδια συνάρτηση για διαφορετικά ορίσματα:

def multi_input_function(val):
    if type(val)==str:
        do_something()
    elif type(val)==int:
        do_something_else()

Μέρος των ορισμάτων μιας συνάρτησης μπορεί να έχει default τιμές:

def function_default_params(a,b=None):
    if b:
        print a,b
        return
    print a
    return

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

Μπορούμε να χρησιμοποιήσουμε ένα tuple ως λίστα ορισμάτων μιας συνάρτησης:

params=(2,3)
function_default_params(*params)

Η Python διαθέτει lambda συναρτήσεις, όπως η Lisp:

>>> (lambda x:x*x)(3)
9

Αντικειμενοστραφής Προγραμματισμός

Δίνεται ένα παράδειγμα ιεραρχίας κλάσεων:

class simple_class:
    pass

class child_class(simple_class):

    __objects=0

    def __init__(self,value):
        child_class.__objects+=1
        self.element=value

    def show(self):
        print "child value is",self.element

    def number():
        return child_class.__objects

    def __del__(self):
        try:
            child_class.__objects-=1
        except(AttributeError):
            pass

    number=staticmethod(number)

my_object=child_class(3)
print "child_class objects number:",child_class.number()
  • Η εντολή pass δεν κάνει τίποτα, χρησιμοποιείται όταν δεν θέλουμε να συμβεί κάτι στο πρόγραμμα αλλά συντακτικά απαιτείται μια δήλωση. Η simple_class είναι η απλούστερη δυνατή κλάση.
  • H child_class κληρονομεί την simple_class (η Python επιτρέπει και πολλαπλή κληρονομικότητα).
  • Το objects είναι στατικό μέλος της κλάσης (με την ορολογία της C++) και στις μεθόδους αναφερόμαστε σε αυτό ως child_class.objects. Στην Python τα ονόματα που ξεκινούν με __ είναι ορατά μόνο στη συγκεκριμένη κλάση (ούτε καν σε αυτές που την κληρονομούν) ή module.
  • Στην Python __init__ και __del__ είναι ο constructor και ο destructor αντίστοιχα. Ο πρώτος καλείται όταν δημιουργούμε ένα αντικείμενο της κλάσης και ο δεύτερος όταν αφαιρεθούν όλες οι αναφορές σε αυτό.
  • Στη διάλεκτο της Python το αντικείμενο στο οποίο αναφερόμαστε (όπως το my_object στο παράδειγμα) εμφανίζεται ως πρώτη παράμετρος των μεθόδων. Κατά σύμβαση το όνομα της παραμέτρου είναι self. Προσέξτε ότι στη μέθοδο __init__ εκχωρούμε τιμή στο self.element και όχι στο element.
  • Ορίζουμε την number ως στατική μέθοδο. Η Python εκτός από staticmethods διαθέτει και classmethods (η διαφορά τους εδώ) ενώ θα μπορούσαμε στη θέση τους να χρησιμοποιήσουμε κανονικές συναρτήσεις με εμβέλεια το module.
  • Ο λόγος για τον οποίο στην __del__ του παραδείγματος χρησιμοποιούμε τη δομή try ... except στο [1]. Λεπτομέρειες για τον χειρισμό εξαιρέσεων της Python στην επόμενη ενότητα.

Exceptions

Modules

Σύνδεσμοι