Δημιουργήσαμε τις συναρτήσεις μας για να τις καλέσουμε αρκετές φορές στο πρόγραμμά μας. Μπορούμε όμως αφού τις φτιάξουμε στο τρέχον σενάριό μας να τις χρησιμοποιήσουμε εκτός από αυτό και σε άλλα προγράμματα και πώς ?? Όπως έχουμε δει, πολλά πράγματα στη γλώσσα αυτή (Πάϊθον), δεν γίνονται με ένα και μόνο τρόπο έτσι και αυτό. Εδώ θα δούμε τα αρθρώματα λογισμικού (modules).
Μέρος 2ο – Modules
Ας φτιάξουμε για τις ανάγκες μας λοιπόν ένα αρχείο το οποίο έχει δύο συναρτήσεις:
- την unique η οποία δέχεται ως παράμετρο μία λίστα και επιστρέφει μία νέα η οποία περιέχει κάθε στοιχείο της πρώτης λίστας από μία φορά με την ίδια σειρά εμφάνισης.
1 2 3 4 5 6 7 8 9 10 |
# # 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, η οποία δέχεται ως παραμέτρους μία λίστα και ένα στοιχείο και διαγράφει το στοιχείο από όλες τις θέσεις της λίστας.
1 2 3 4 5 6 7 8 9 10 11 12 |
# # 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__’:
ακολουθεί το ολοκληρωμένο σενάριο:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# # 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()
απόλυτα κατανοητό έτσι !#$%^@*!.
Don’t Panic εξηγούμε ευθύς αμέσως .. ίσως έτσι είναι πιο κατανοητό …
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# # 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 4 |
>>> >>> [1, 2, 3] [2, 3, 2, 3, 2, 3] |
Όταν εκτελούμε το σενάριο (run) όλα πάνε καλά, εάν δοκιμάσουμε όμως να αποθηκεύσουμε το σενάριο (πχ new_list_func.py)και στη συνέχεια το κάνουμε εισαγωγή με την εντολή import για να χρησιμοποιήσουμε τις συναρτήσεις σε ένα άλλο σενάριο θα εμφανιστούν τα αποτελέσματα εκτέλεσης του αρχικού σεναρίου δηλαδή :
1 2 3 4 5 6 |
>>> >>> >>> import new_list_func >>> [1, 2, 3] [2, 3, 2, 3, 2, 3] |
Άκομψο έτσι δεν είναι, κάθε φορά που φορτώνουμε το άρθρωμα να εμφανίζονται άσχετα δεδομένα εκτέλεσης.
Προτιμότερο θα ήταν να μπορούμε να πούμε κάτι όπως το παρακάτω:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# # 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 πάρει ως τιμή το όνομα του τρέχοντος σεναρίου σημαίνει ότι το σενάριο εκτελείται, διαφορετικά σημαίνει ότι φορτώνεται. Γράψτε το παρακάτω σενάριο και στη συνέχεια δοκιμάστε να το τρέξετε και έπειτα να το φορτώσετε :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# # 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" |
ή πιο κομψά και με πληρότητα:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# # 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" |
Αποτελέσματα με εκτέλεση:
1 2 3 4 5 |
>>> >>> script is executed from within [1, 2, 3] [2, 3, 2, 3, 2, 3] |
Αποτελέσματα με φόρτωση:
1 2 3 4 5 6 |
>>> >>> >>> import new_list_func script is imported ... functions unique & pop_all loaded and ready to fire >>> |
Τώρα μάλιστα … και … και … εάν θέλω να μαζέψω όλα προγράμματα αυτά που επαναχρησιμοποιώ σε άλλο φάκελλο εκτός του c:\python27 και να τα φορτώνω από εκεί γιατί δε δουλεύει και βγάζει σαχλαμάρες κόκκινου χρώματος :
Traceback (most recent call last):
File “<pyshell#12>”, line 1, in
import nwe
ImportError: No module named xxx
… Σε επόμενο άρθρο …. η παροιμία που λέγαμε