Επαναχρησιμοποίηση Κώδικα 3/3-2 Modules

Δημιουργήσαμε τις συναρτήσεις μας για να τις καλέσουμε αρκετές φορές στο πρόγραμμά μας. Μπορούμε όμως αφού τις φτιάξουμε στο τρέχον σενάριό μας να τις χρησιμοποιήσουμε εκτός από αυτό και σε άλλα προγράμματα και πώς ?? Όπως έχουμε δει, πολλά πράγματα στη γλώσσα αυτή (Πάϊθον),  δεν γίνονται με ένα και μόνο τρόπο έτσι και αυτό. Εδώ θα δούμε τα αρθρώματα λογισμικού (modules).

 Ας φτιάξουμε λοιπόν ένα αρχείο το οποίο έχει δύο συναρτήσεις:

την unique η οποία δέχεται ως παράμετρο μία λίστα και επιστρέφει μία νέα η οποία περιέχει κάθε στοιχείο της πρώτης λίστας από μία φορά με την ίδια σειρά εμφάνισης.

def unique(a_list):
    new_list = []
    for item in a_list:
        if item not in new_list:
            new_list.append(item)
    return new_list
>>> unique([1,2,3,4,5,1,2,3,4,5,1,2,3,1,2,3,4,5,9])
[1, 2, 3, 4, 5, 9]

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

def pop_all(item, a_list):
    '''Η Συνάρτηση διαγράφει τα στοιχεία
    item από τη λίστα a_list'''
    i = 0
    while i <= len(a_list)-1:
        if item == a_list[i]:
            a_list.pop(i)
        else:
            i += 1
    return a_list

τις οποίες και εφαρμόζουμε εντός του προγράμματος σε μία λίστα ακεραίων με τη βοήθεια μίας νέα συνάρτησης της main.

Στο τέλος εάν επιθυμούμε να τις χρησιμοποιήσουμε και σε άλλα σενάρια κλείνουμε με τη «μαγική εντολή» if __name__ == ‘__main__’:

ακολουθεί το ολοκληρωμένο σενάριο:

def unique(a_list):
    new_list = []
    for item in a_list:
        if item not in new_list:
            new_list.append(item)
    return new_list

def pop_all(item, a_list):
    '''Η Συνάρτηση διαγράφει τα στοιχεία
    item από τη λίστα a_list'''
    i = 0
    while i <= len(a_list)-1:
        if item == a_list[i]:
            a_list.pop(i)
        else:
            i += 1
    return a_list

def main():
    a_list = [1,2,3,1,2,3,1,2,3]
    new = unique(a_list)
    print new
    pop_all(1, a_list)
    print a_list

if __name__ == "__main__":
    main()

πως είπατε ??? :

if __name__ == "__main__":
    main()

Image result for wtf funny cartoon

απόλυτα κατανοητό έτσι !#$%^@*!.

Image result for dont' panic cartoon funny

Don’t Panic εξηγούμε ευθύς αμέσως .. ίσως έτσι είναι πιο κατανοητό …

def unique(a_list):
    new_list = []
    for item in a_list:
        if item not in new_list:
            new_list.append(item)
    return new_list

def pop_all(item, a_list):
    '''Η Συνάρτηση διαγράφει τα στοιχεία
    item από τη λίστα a_list'''
    i = 0
    while i <= len(a_list)-1:
        if item == a_list[i]:
            a_list.pop(i)
        else:
            i += 1
    return a_list


a_list = [1,2,3,1,2,3,1,2,3]
new = unique(a_list)
print new
pop_all(1, a_list)
print a_list

Ορίζουμε τις συναρτήσεις και στη συνέχεια τις καλούμε πάνω σε πραγματικά δεδομένα, καλύτερα έτσι !!! να και τα αποτελέσματα εκτέλεσης επάνω στα δεδομένα:

>>> 
[1, 2, 3]
[2, 3, 2, 3, 2, 3]

Όταν εκτελούμε το σενάριο (run) όλα πάνε καλά,  εάν δοκιμάσουμε όμως να αποθηκεύσουμε το σενάριο (πχ new_list_func.py)και στη συνέχεια το κάνουμε εισαγωγή με την εντολή import για να χρησιμοποιήσουμε τις συναρτήσεις σε ένα άλλο σενάριο θα εμφανιστούν τα αποτελέσματα εκτέλεσης του αρχικού σεναρίου δηλαδή :

>>> import new_list_func
>>> 
[1, 2, 3]
[2, 3, 2, 3, 2, 3]

Άκομψο έτσι δεν είναι, κάθε φορά που φορτώνουμε το άρθρωμα να εμφανίζονται άσχετα δεδομένα εκτέλεσης.

Προτιμότερο θα ήταν να μπορούμε να πούμε κάτι όπως το παρακάτω:

def unique(a_list):
    .........
    return new_list

def pop_all(item, a_list):
    .........
    return a_list

if "το σενάριο εκτελείται με run":
    a_list = [1,2,3,1,2,3,1,2,3]
    new = unique(a_list)
    print new
    pop_all(1, a_list)
    print a_list
elif "το σενάριο φορτώνεται από άλλο σενάριο":
    μην εκτελείς τίποτα απλά φόρτωσε τις συναρτήσεις

Έεεε λοιπόν αυτό κάνει η μαγική εντολή:

if __name__ == "__main__":

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

def unique(a_list):
    .........
    return new_list

def pop_all(item, a_list):
    .........
    return a_list

if __name__ == "__main__":
    print "script is executed from within"
    a_list = [1,2,3,1,2,3,1,2,3]
    new = unique(a_list)
    print new
    pop_all(1, a_list)
    print a_list
else:
    print "script is imported ..."
    print "functions unique & pop_all loaded and ready to fire"

ή πιο κομψά και με πληρότητα:

def unique(a_list):
    new_list = []
    for item in a_list:
        if item not in new_list:
            new_list.append(item)
    return new_list

def pop_all(item, a_list):
    '''Η Συνάρτηση διαγράφει τα στοιχεία
    item από τη λίστα a_list'''
    i = 0
    while i <= len(a_list)-1:
        if item == a_list[i]:
            a_list.pop(i)
        else:
            i += 1
    return a_list

def main():
    a_list = [1,2,3,1,2,3,1,2,3]
    new = unique(a_list)
    print new
    pop_all(1, a_list)
    print a_list

if __name__ == "__main__":
    print "script is executed from within"
    main()
else:
    print "script is imported ..."
    print "functions unique & pop_all loaded and ready to fire"

Αποτελέσματα με εκτέλεση:

>>> 
script is executed from within
[1, 2, 3]
[2, 3, 2, 3, 2, 3]

Αποτελέσματα με φόρτωση:

>>> import new_list_func
script is imported ...
functions unique & pop_all loaded and ready to fire
>>>

Image result for i feel good cartoon funny

Τώρα μάλιστα …

…..και

…..

και …

εάν θέλω να μαζέψω όλα προγράμματα αυτά που επαναχρησιμοποιώ σε άλλο φάκελλο εκτός του c:\python27 και να τα φορτώνω από εκεί γιατί δε δουλεύει και βγάζει σαχλαμάρες κόκκινου χρώματος :

Traceback (most recent call last):
  File "<pyshell#12>", line 1, in 
    import nwe
ImportError: No module named xxx

… Σε επόμενο άρθρο ….

Image result for path in mountain cartoon funny

Δημοσιεύθηκε στην Προγραμματισμός. Αποθηκεύστε τον μόνιμο σύνδεσμο.

Αφήστε μια απάντηση