﻿<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
> <channel><title>GreekTuts &#187; Προγραμματισμός</title> <atom:link href="http://greektuts.net/tag/%cf%80%cf%81%ce%bf%ce%b3%cf%81%ce%b1%ce%bc%ce%bc%ce%b1%cf%84%ce%b9%cf%83%ce%bc%cf%8c%cf%82/feed/" rel="self" type="application/rss+xml" /><link>http://greektuts.net</link> <description>Ελληνικά Βοηθήματα</description> <lastBuildDate>Fri, 27 Apr 2012 09:31:40 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.2</generator> <item><title>Μαθαίνοντας Python – Μέρος 7ο (γ)</title><link>http://greektuts.net/python-part7c/</link> <comments>http://greektuts.net/python-part7c/#comments</comments> <pubDate>Thu, 17 Mar 2011 07:51:40 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[krap]]></category> <category><![CDATA[part 7]]></category> <category><![CDATA[απόστολος]]></category> <category><![CDATA[απόστολος κρητικός]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[μέρος 7γ]]></category> <category><![CDATA[μέρος 7ο]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=4800</guid> <description><![CDATA[Συνεχίζοντας το 7ο μέρος του οδηγού μας είμαστε έτοιμοι να δούμε ακόμη μια θεμελιώδη δομή δεδομένων, την ουρά. Για όσους έφθασαν στο άρθρο κατά τύχη, ακολουθεί μικρή περίληψη του αντικειμένου του 7ου μέρους του οδηγού καθώς και μικρή αναφορά στην δομή του άρθρου.]]></description> <content:encoded><![CDATA[<p>Εν γένει, στην συγκεκριμένη κατηγορία εμπίπτουν διάφορα θέματα τα σημαντικότερα από τα οποία συνοψίζονται στα εξής:</p><ul><li>Λίστες      (Lists)</li><li>Πλειάδες      και ακολουθίες (Tuples      &amp; Sequences)</li><li>Σετ (Sets)</li><li>Λεξικά      (Dictionaries)</li></ul><p>Και κάποια εξεζητημένα ζητήματα όπως:</p><ul><li>Τεχνικές      επανάληψης (Looping      Techniques)</li><li>Συνθήκες      επιλογής (Conditions)      – προχωρημένα θέματα –</li></ul><p><strong>Προαπαιτούμενα</strong></p><p><a
href="../../../../../category/programming/python/">Μαθαίνοντας Python</a></p><p><strong>Πριν ξεκινήσουμε…</strong></p><p>… θα ήθελα να επισημάνω ένα – δύο πρακτικά ζητήματα.</p><p>Στη συνέχεια παρουσιάζεται ο τρόπος για να επιτευχθούν οι στόχοι που περιγράψαμε στην εισαγωγή. Θα παρατηρήσετε ότι το άρθρο ακολουθεί τη δομή:</p><div><blockquote><p><em>Μικρή περιγραφή του τι θέλουμε να επιτύχουμε (+ επιπλέον σχόλια)</em></p></blockquote><pre name="code" class="py">
Παράδειγμα κώδικα
</pre></div><p>Για να τα χρησιμοποιήσετε, αντιγράφετε το εκάστοτε παράδειγμα σε ένα νέο αρχείο python και το εκτελείτε (βλ. <a
title="Permanent Link to Μαθαίνοντας Python – Μέρος 1ο" href="../../../../../archives/1571">Μαθαίνοντας Python – Μέρος 1ο</a> ). Τα παραδείγματα είναι φτιαγμένα με τέτοιον τρόπο ώστε να τυπώνουν τα αποτελέσματα στην οθόνη ώστε να μπορείτε να πιστοποιήσετε εύκολα τη λειτουργικότητά τους. Για διευκόλυνσή σας έχουμε χωρίσει τα παραδείγματα με σχόλια που δίνουν μια μικρή περιγραφή του τι επιχειρούμε κάθε φορά.</p><p>Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</p><h1><strong>( ΒΛΕΠΟΝΤΑΣ ΤΙΣ ΛΙΣΤΕΣ ΜΕ «ΑΛΛΟ ΜΑΤΙ» )</strong></h1><p><strong><em> </em></strong></p><p>Στο σημερινό άρθρο θα μας απασχολήσουν πιο προχωρημένα θέματα που έχουν να κάνουν με λίστες.</p><p><span
style="text-decoration: underline;">Χρησιμοποιώντας τις λίστες σαν ουρές</span></p><p>Αδυνατώ να φανταστώ κάποιον αναγνώστη που να μην είναι εξοικειωμένος με την έννοια της ουράς. Αν συμφωνήσουμε ότι αφήνουμε απ’ έξω την έννοια της ουράς ως λειτουργικό τμήμα του σώματος ενός ζώου, μας μένει το στερεότυπο μιας σειράς ανθρώπων που, ο ένας πίσω από τον άλλον περιμένουν κάτι. Να  πάρουν λεφτά από κάποιο μηχάνημα αυτόματης ανάληψης, να εξυπηρετηθούν σε κάποια δημόσια υπηρεσία (!), να πληρώσουν στο ταμείο κάποιου καταστήματος, να πάρουν φαγητό.</p><p>Μια ουρά δηλαδή, είναι ένα σύνολο αντικειμένων στοιχισμένα το ένα πίσω από το άλλο. Κάθε νέο αντικείμενο που προστίθεται στην ουρά καταλαμβάνει την τελευταία θέση (μπαίνει πίσω από κάθε άλλο προϋπάρχον στοιχείο). Επίσης, όταν πάρουμε ένα αντικείμενο από την ουρά, θα  είναι το στοιχείο που βρίσκεται στην πρώτη θέση. Η παραπάνω σκέψη μας οδηγεί στο συμπέρασμα ότι μια ουρά λειτουργεί με τη λογική «το πρώτο στοιχείο που εισάγουμε, είναι το πρώτο που εξάγουμε». Στη βιβλιογραφία αυτή η διαπίστωση και, κατ’ επέκταση η φύση λειτουργίας της ουράς, ως δομή δεδομένων, αναφέρεται ως &#8220;FIRST IN, FIRST OUT&#8221; ή, εν συντομία, “FIFO”.</p><p>Πως το υλοποιούμε σε Python όμως;</p><p>Σε αντίθεση με την δομή δεδομένων της στοίβας, με την οποία ασχοληθήκαμε στο προηγούμενο άρθρο μας, η Python περιλαμβάνει κάποιες εντολές που βολεύουν ιδιαίτερα για την υλοποίηση της ουράς. Ας τις δούμε αναλυτικά:</p><pre name="code" class="py">
&gt;&gt;&gt; from collections import deque
</pre><p>Εδώ χρειάζεται  μια μικρή προσοχή μιας και την παραπάνω εντολή την συναντούμε για πρώτη φορά στον οδηγό μας. Ο αναγνώστης που έχει εμπειρία στον προγραμματισμό αναγνωρίζει απευθείας ότι η παραπάνω εντολή «φορτώνει» μία βιβλιοθήκη, κάνει δηλαδή δυνατή τη χρήση μιας βιβλιοθήκης από το πρόγραμμά μας.</p><blockquote><p><span
style="text-decoration: underline;">TIP</span>: Ο όρος “collections” συναντάται σε πολλές γλώσσες προγραμματισμού. Συνήθως αποτελεί μια συλλογή από δομές δεδομένων υλοποιημένες για την εκάστοτε γλώσσα.</p></blockquote><p>Τώρα που γνωρίζουμε τα παραπάνω μπορούμε εύκολα να αντιληφθούμε ότι η εντολή που μόλις πληκτρολογήσαμε «φορτώνει» από την βιβλιοθήκη «collections» τη δομή «deque» – η οποία αποτελεί προφανώς υλοποίηση της ουράς –.</p><p>Ο λόγος που αυτή τη φορά δεν χρησιμοποιούμε εντολές της Python για να «κατασκευάσουμε» τη δική μας ουρά αλλά χρησιμοποιούμε κάτι έτοιμο είναι ο εξής. Το να κάνουμε προσθήκες και ανακτήσεις στο τέλος μιας λίστας (δείτε <em>Μαθαίνοντας </em><em>Python – Μέρος 7<sup>ο</sup> (β)</em>) είναι γενικά μια διαδικασία που δεν κοστίζει πολύ από άποψη πόρων. Δυστυχώς όμως, η δομή της ουράς εμπλέκει το  τέλος της λίστας. Οι διαδικασίες της προσθήκης και ανάκτησης στο τέλος της λίστας είναι πράξεις που κοστίζουν στη γλώσσα Python.</p><p>Ας δούμε τώρα τι δυνατότητες διαχείρισης μας προσφέρονται.</p><pre name="code" class="py">
&gt;&gt;&gt; myQueue = deque(["The tale of Sir Robin", "The tale of Sir Lancelot", "The tale of Sir Bedevir"])
</pre><p>Με την εντολή deque(LIST) δημιουργούμε μια ουρά. Παρατηρήστε ότι το όρισμα που δέχεται η deque είναι μια λίστα (η οποία μπορεί να περιέχει όλα όσα έχουμε δει ότι μπορεί να περιέχει μια λίστα σε προηγούμενα άρθρα μας).</p><p>Η συγκεκριμένη εντολή δημιουργεί μία ουρά με αντικείμενα, τα αντικείμενα της λίστας που έχουμε δώσει σαν όρισμα (στην συγκεκριμένη περίπτωση LIST).</p><p>Οι διαδικασίες εισαγωγής και ανάκτησης γίνονται με τον ίδιο τρόπο που συναντήσαμε όταν μελετούσαμε τη δομή στοίβας (stuck). Αναλυτικότερα:</p><pre name="code" class="py">
&gt;&gt;&gt; myQueue.append("The tail of Sir Arthur")
</pre><p>Με την εντολή αυτή ένα νέο στοιχείο εισέρχεται στην ουρά (δηλαδή καταλαμβάνει την τελευταία θέση).</p><p>Όσων αφορά την υλοποίηση της ανάκτησης, θα χρησιμοποιήσουμε μια παραλλαγή της γνωστής μας, από την υλοποίηση της στοίβας, pop().</p><pre name="code" class="py">
&gt;&gt;&gt; myQueue.popleft()
</pre><p>Εκτελώντας την παραπάνω εντολή, η κονσόλα μας επιστρέφει:</p><p>&#8220;The tale of Sir Robin&#8221;</p><p>… που είναι το πρώτο στοιχείο που εισήχθηκε στη λίστα. Επαληθεύουμε με:</p><pre name="code" class="py">
&gt;&gt;&gt; myQueue
</pre><p>και παίρνουμε:</p><p>["The tale of Sir Lancelot", "The tale of Sir Bedevir"]</p><p>Εκτελώντας ξανά</p><pre name="code" class="py">
&gt;&gt;&gt; myQueue.popleft()
</pre><p>(σωστά μαντεύετε)</p><p>&#8220;The tale of Sir Lancelot&#8221;</p><p>και έτσι η ουρά μας έχει πλέον τη μορφή:</p><pre name="code" class="py">
&gt;&gt;&gt; myQueue
["The tale of Sir Bedevir"]
</pre><p>Η ουρά, όπως και η στοίβα αποτελούν μια από τις βασικότερες δομές δεδομένων στον τομέα της Πληροφορικής. Πολλοί προγραμματιστές βρίσκουν της δομές αυτές πλέον ξεπερασμένες. Η αλήθεια είναι ότι στις σύγχρονες σουίτες προγραμματισμού, δομές όπως η στοίβα ή η ουρά προσφέρονται μέσω κάποιων βιβλιοθηκών.</p><p>Το ίδιο ακριβώς συναντήσαμε στο σημερινό μας άρθρο. Η δομή της ουράς, για την Python, υπάρχει υλοποιημένη σε μία κλάση που  ονομάζεται deque και εμπεριέχεται μέσα στην βιβλιοθήκη collections. Αυτή η υλοποίηση, επιτρέπει στον προγραμματιστή, να μπορεί να χρησιμοποιεί τη δομή της ουράς, αφενός χωρίς να χρειάζεται να μπει στον κόπο να την υλοποιήσει από το μηδέν και αφετέρου, του δίνει τη διαπίστευση ότι η υλοποίηση της εν λόγω δομής, έχει γίνει με τέτοιο τρόπο ώστε να επιτυγχάνει την μέγιστη λειτουργικότητα και αποτελεσματικότητα.</p><p>Μένουν ελάχιστα ακόμη πράγματα που πρέπει να εξετάσουμε όσον αφορά τα προχωρημένα θέματα που αφορούν τη χρήση λιστών στην Python. Θα τα δούμε στο επόμενο άρθρο μας.</p><p>Μέχρι τότε, να μην ξεχνάτε…</p><p><em><span
style="text-decoration: underline;">να είστε καλά και να φροντίζεται τον εαυτό σας</span></em>.</p> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/python-part7c/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Μαθαίνοντας Python – Μέρος 7ο (β2)</title><link>http://greektuts.net/python-part7b2/</link> <comments>http://greektuts.net/python-part7b2/#comments</comments> <pubDate>Fri, 25 Feb 2011 09:20:45 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[krap]]></category> <category><![CDATA[part 7]]></category> <category><![CDATA[απόστολος]]></category> <category><![CDATA[απόστολος κρητικός]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[μέρος 7β]]></category> <category><![CDATA[μέρος 7ο]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=4723</guid> <description><![CDATA[Στο έβδομο μέρος του οδηγού θα ασχοληθούμε με δομές δεδομένων. Η αλήθεια είναι ότι κάποια από τα πράγματα τα οποία θα μας απασχολήσουν τα έχουμε ήδη δει εξ απαλών ονύχων σε περασμένα άρθρα. Τώρα ήρθε η ώρα να εμβαθύνουμε και να εμπλουτίσουμε με νέα στοιχεία και λειτουργικότητες. ]]></description> <content:encoded><![CDATA[<p>Εν γένει, στην συγκεκριμένη κατηγορία εμπίπτουν διάφορα θέματα τα σημαντικότερα από τα οποία συνοψίζονται στα εξής:</p><ul><li>Λίστες      (Lists)</li><li>Πλειάδες      και ακολουθίες (Tuples      &amp; Sequences)</li><li>Σετ (Sets)</li><li>Λεξικά      (Dictionaries)</li></ul><p>Και κάποια εξεζητημένα ζητήματα όπως:</p><ul><li>Τεχνικές      επανάληψης (Looping      Techniques)</li><li>Συνθήκες      επιλογής (Conditions)      – προχωρημένα θέματα –</li></ul><p>Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</p><p><strong>( ΒΛΕΠΟΝΤΑΣ ΤΙΣ ΛΙΣΤΕΣ ΜΕ ΑΛΛΟ ΜΑΤΙ )</strong></p><p><strong><em> </em></strong></p><p>Στο σημερινό άρθρο θα μας απασχολήσουν πιο προχωρημένα θέματα που έχουν να κάνουν με λίστες.</p><p>Χρησιμοποιώντας τις λίστες σαν στοίβες</p><p>Η έννοια της στοίβας είναι βασική όσων αφορά το αντικείμενο των δομών δεδομένων και αποτελεί συνήθως το εισαγωγικό μάθημα στο εν λόγω αντικείμενο σε μια σχολή Πληροφορικής.  Η στοίβα, ως δομή δεδομένων, δε διαφέρει ιδιαίτερα από την κοινή στοίβα που συναντούμε στην καθημερινή μας ζωή (μια στοίβα βιβλία, μια στοίβα CD ή DVD,  η στοίβα με τα άπλυτα, κλπ.).</p><p>Ας συμφωνήσουμε ότι μια στοίβα είναι ένα σύνολο αντικειμένων το ένα πάνω στο άλλο. Κάθε νέο αντικείμενο που προστίθεται στην στοίβα καταλαμβάνει την ανώτερη θέση. Επίσης όταν πάρουμε ένα αντικείμενο από τη στοίβα, μοιραία θα  είναι το στοιχείο που βρίσκεται στην ανώτερη θέση. Η παραπάνω σκέψη μας οδηγεί στο συμπέρασμα ότι μια στοίβα λειτουργεί με τη λογική «το τελευταίο στοιχείο που εισάγουμε, είναι το πρώτο που εξάγουμε». Στη βιβλιογραφία αυτή η διαπίστωση και, κατ’ επέκταση η φύση λειτουργίας της στοίβας ως δομή δεδομένων, αναφέρεται ως &#8220;LAST IN, FIRST OUT&#8221; ή, εν συντομία, “LIFO”.</p><p>Μετά τη σύντομη εισαγωγή στη σχετική με τις στοίβες θεωρία, ας περάσουμε σε πιο διασκεδαστικά αντικείμενα όπως, πως το υλοποιούμε σε Python.</p><p>Εάν είστε σαν και εμένα, σε αυτό το σημείο θα πρέπει να περιμένετε να δείτε ποιες είναι οι ειδικές εντολές τις Python που υλοποιούν τη λειτουργικότητα μιας στοίβας. Η πικρή αλήθεια είναι πως δεν υπάρχουν ειδικές εντολές. Η λειτουργικότητα της στοίβας υλοποιείται με τη χρήση εντολών Python που ήδη έχουμε μάθει.</p><p>Ας υποθέσουμε ότι έχουμε την παρακάτω λίστα στοιχείων (<span
style="text-decoration: underline;">πληκτρολογούμε τον κώδικα απευθείας στην κονσόλα</span>).</p><pre name="code" class="py">
&gt;&gt;&gt; myStack = [‘Monty Python and the holy grail’, ‘The life of Brian’, ‘The meaning of life’]
</pre><p>Σε αυτό το σημείο θα ήθελα να επικαλεστώ την φαντασία σας. Σκεφτείτε το παραπάνω σετ στοιχείων ως στοίβα… οπτικά θα έμοιαζε κάπως έτσι:</p><p>‘The meaning of life’<br
/> ‘The life of Brian’<br
/> ‘Monty Python and the holy grail’</p><p>Σωστά;</p><p>Ας υλοποιήσουμε τώρα την εισαγωγή ενός καινούριου στοιχείου στη στοίβα. Σύμφωνα με τη θεωρία κάθε νέο στοιχείο που εισέρχεται στη στοίβα καταλαμβάνει την ανώτερη θέση. Θέλουμε δηλαδή το νέο στοιχείο που θα προστεθεί στην παραπάνω στοίβα που δημιουργήσαμε, να τοποθετηθεί πάνω από το ‘The meaning of life’. Θυμάστε την append(); Αν όχι, ανατρέξτε σε προηγούμενα άρθρα του οδηγού και θυμηθείτε την γιατί είναι η λύση στο πρόβλημά μας <img
src='http://greektuts.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><pre name="code" class="py">
&gt;&gt;&gt; myStack.append(‘And now for something completely different’)
</pre><p>η στοίβα μας έχει τώρα  την ακόλουθη μορφή:</p><p>‘And now for something completely different’<br
/> ‘The meaning of life’<br
/> ‘The life of Brian’<br
/> ‘Monty Python and the holy grail’</p><p>Φυσικά η Python δεν μπορεί να απεικονίσει την στοίβα με τον παραπάνω τρόπο. Για την Python μια στοίβα θα είναι πάντοτε μια λίστα. Επομένως αν δώσουμε στην κονσόλα…</p><pre name="code" class="py">
&gt;&gt;&gt; myStack
</pre><p>…θα δούμε</p><p>[‘Monty Python and the holy grail’, ‘The life of Brian’, ‘The meaning of life’, ‘And now for something completely different’]</p><p>(σε μία γραμμή – γιατί πρέπει να χρησιμοποιώ πάντα τόσο μεγάλα παραδείγματα; <img
src='http://greektuts.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> – )</p><p>Ομοίως:</p><pre name="code" class="py">
&gt;&gt;&gt; myStack.append(‘Brazil’)
</pre><p>και η στοίβα μας έχει πάρει τη μορφή:</p><p>‘Brazil’<br
/> ‘And now for something completely different’<br
/> ‘The meaning of life’<br
/> ‘The life of Brian’<br
/> ‘Monty Python and the holy grail’</p><p>ή</p><p>[‘Monty Python and the holy grail’, ‘The life of Brian’, ‘The meaning of life’, ‘And now for something completely different’, ‘Brazil’]</p><p>Τώρα ήρθε η ώρα να υλοποιήσουμε το δεύτερο κομμάτι λειτουργικότητας που αποτελεί την ανάκτηση των στοιχείων της λίστας. Όπως είπαμε, «πρώτο στοιχείο» σε μια στοίβα θεωρείται το στοιχείο που βρίσκεται στην κορυφή σωστά μαντεύετε, στην συγκεκριμένη περίπτωση είναι το ‘Brazil’). Πως το υλοποιούμε όμως σε Python;</p><p>Θα χρησιμοποιήσουμε μία ακόμη γνωστή μας εντολή:</p><pre name="code" class="py">
&gt;&gt;&gt; myStack.pop()
</pre><p>…η κονσόλα μας επιστρέφει:</p><p>‘Brazil’</p><p>Ο κύβος ερρίφθη <img
src='http://greektuts.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>Ας σιγουρευτούμε ότι όλα πήγαν κατ’ ευχήν βλέποντας την τρέχουσα κατάσταση στην οποία έχει περιέλθει η λίστα μας:</p><pre name="code" class="py">
&gt;&gt;&gt; myStack
</pre><p>[‘Monty Python and the holy grail’, ‘The life of Brian’, ‘The meaning of life’, ‘And now for something completely different’]</p><p>Ομοίως…</p><pre name="code" class="py">
&gt;&gt;&gt; myStack.pop()
</pre><p>…και η κονσόλα μας επιστρέφει:</p><p>‘And now for something completely different’</p><pre name="code" class="py">
&gt;&gt;&gt; myStack
</pre><p>[‘Monty Python and the holy grail’, ‘The life of Brian’, ‘The meaning of life’]</p><p>Πολλοί από εσάς θα παρατήρησαν ότι στο  σημερινό άρθρο δεν δουλέψαμε πάνω σε κάποιο Python script, όπως συνήθως. Αντίθετα χρησιμοποιήσαμε εντολές απ’ ευθείας στην κονσόλα. Αυτό συμβαίνει διότι σήμερα δεν μάθαμε κάτι καινούριο. Χρησιμοποιήσαμε προϋπάρχουσα γνώση για να μπορέσουμε να υλοποιήσουμε μία από τις πιο θεμελιώδεις δομές δεδομένων στην θεωρία της Πληροφορικής. Τη στοίβα.</p><p>Αν το συγκεκριμένο άρθρο σας φάνηκε άχρηστο, ξανασκεφθείτε το. Στο σημερινό άρθρο παρουσιάσαμε κάτι πολύ σημαντικό. Καμία γνώση δεν αποκτάται για να χρησιμοποιείται ακριβώς όπως τη γνωρίζουμε. Η αγορά εργασίας απαιτεί από τον προγραμματιστή να είναι εφευρετικός. Το να μπορεί κανείς να βρει εναλλακτικούς τρόπους χρήσης παλαιάς γνώσης… είναι αν μη τι άλλο εφευρετικότητα. Μείνετε συντονισμένοι γιατί στο επόμενο άρθρο θα υλοποιήσουμε μια ακόμη σημαντική δομή δεδομένων. Την ουρά.</p><p>Μέχρι τότε, να μην ξεχνάτε…</p><p><span
style="text-decoration: underline;">να είστε καλά και να φροντίζεται τον εαυτό σας</span>.</p> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/python-part7b2/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Μαθαίνοντας Python – Μέρος 7ο (β)</title><link>http://greektuts.net/python-part7b/</link> <comments>http://greektuts.net/python-part7b/#comments</comments> <pubDate>Thu, 02 Dec 2010 07:37:52 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[krap]]></category> <category><![CDATA[part 7]]></category> <category><![CDATA[απόστολος]]></category> <category><![CDATA[απόστολος κρητικός]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[μέρος 7β]]></category> <category><![CDATA[μέρος 7ο]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=4493</guid> <description><![CDATA[Στο δεύετερο κομμάτι του έβδομου μέρος του οδηγού θα ασχοληθούμε με δομές δεδομένων. Η αλήθεια είναι ότι κάποια από τα πράγματα τα οποία θα μας απασχολήσουν τα έχουμε ήδη δει εξ απαλών ονύχων σε περασμένα άρθρα. Τώρα ήρθε η ώρα να εμβαθύνουμε και να εμπλουτίσουμε με νεά στοιχεία και λειτουργικότητες.]]></description> <content:encoded><![CDATA[<p>Εν γένει, στην συγκεκριμένη κατηγορία εμπίπτουν διάφορα θέματα τα σημαντικότερα από τα οποία συνοψίζονται στα εξής:</p><ul><li>Λίστες      (Lists)</li><li>Πλειάδες      και ακολουθίες (Tuples      &amp; Sequences)</li><li>Σετ (Sets)</li><li>Λεξικά      (Dictionaries)</li></ul><p>Και κάποια εξεζητημένα ζητήματα όπως:</p><ul><li>Τεχνικές      επανάληψης (Looping      Techniques)</li><li>Συνθήκες      επιλογής (Conditions)      – προχωρημένα θέματα –</li></ul><p><strong>Προαπαιτούμενα</strong></p><p><a
href="http://greektuts.net/category/programming/python/">Μαθαίνοντας Python</a></p><p><strong>Πριν ξεκινήσουμε…</strong><br
/> … θα ήθελα να επισημάνω ένα – δύο πρακτικά ζητήματα.</p><p>Στη συνέχεια παρουσιάζεται ο τρόπος για να επιτευχθούν οι στόχοι που περιγράψαμε στην εισαγωγή. Θα παρατηρήσετε ότι το άρθρο ακολουθεί τη δομή:</p><blockquote><p>Μικρή περιγραφή του τι θέλουμε να επιτύχουμε (+ επιπλέον σχόλια)</p></blockquote><pre name="code" class="py">
Παράδειγμα κώδικα</em>
</pre><p>Στο τέλος του αρχείου θα βρείτε συνημμένο ένα python script που περιέχει συγκεντρωμένα όλα τα παραδείγματα.</p><p>Για να τα χρησιμοποιήσετε, αντιγράφετε το εκάστοτε παράδειγμα σε ένα νέο αρχείο python και το εκτελείτε (βλ. <a
title="Permanent Link to Μαθαίνοντας Python – Μέρος 1ο" href="http://greektuts.net/python-part-1/">Μαθαίνοντας Python – Μέρος 1ο</a> ). Τα παραδείγματα είναι φτιαγμένα με τέτοιον τρόπο ώστε να τυπώνουν τα αποτελέσματα στην οθόνη ώστε να μπορείτε να πιστοποιήσετε εύκολα τη λειτουργικότητά τους. Για διευκόλυνσή σας έχουμε χωρίσει τα παραδείγματα με σχόλια που δίνουν μια μικρή περιγραφή του τι επιχειρούμε κάθε φορά.</p><p>Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</p><p><strong>( ΦΡΕΣΚΑΡΟΝΤΑΣ ΤΑ ΒΑΣΙΚΑ… )</strong></p><p>Στο σημερινό άρθρο θα μας απασχολήσουν και πάλι θέματα που έχουν να κάνουν με λίστες. Ας θυμηθούμε τα βασικά:</p><p><span
style="text-decoration: underline;">Ορισμός Λίστας</span></p><pre name="code" class="py">
myList = ['monty', 'python', 999, 222]
</pre><p><span
style="text-decoration: underline;">Επιλογή Στοιχείου Λίστας</span></p><pre name="code" class="py">
myList[0]
myList[-1]
</pre><p><span
style="text-decoration: underline;">Εισαγωγή Στοιχείου σε Λίστα</span></p><pre name="code" class="py">
myList[3] = 'foo'
</pre><p><span
style="text-decoration: underline;">Διαγραφή Στοιχείου από Λίστα</span></p><pre name="code" class="py">
myList[2] = []
</pre><p><span
style="text-decoration: underline;">Καθαρισμός Λίστας</span></p><pre name="code" class="py">
myList[:] = []
</pre><p><span
style="text-decoration: underline;">Μέγεθος Λίστας</span></p><pre name="code" class="py">
Len(myList)
</pre><p>Αφού θυμηθήκαμε τα βασικά, μπορούμε να προχωρήσουμε σε μια σειρά από προχωρημένες λειτουργίες που αφορούν λίστες.</p><p><span
style="text-decoration: underline;">Προσθήκη στοιχείου στο τέλος της λίστας</span></p><pre name="code" class="py">
myList.append("Team")
</pre><p>εδώ προστίθεται το στοιχείο Team στην τελευταία θέση</p><p><span
style="text-decoration: underline;">Επέκταση μιας λίστας με τα στοιχεία μιας άλλης</span></p><pre name="code" class="py">
anotherList = ['foo', 'foo2']
myList.extend( anotherList )
</pre><p>Η λίστα myList επεκτείνεται με τα στοιχεία της λίστας anotherList τα οποία και τοποθετούνται στο τέλος της myList</p><p><span
style="text-decoration: underline;">Εισαγωγή στοιχείου σε συγκεκριμένη θέση της λίστας</span></p><pre name="code" class="py">
myList.insert(0, 'inserted')
</pre><p>Εδώ το στοιχέιο &#8216;inserted&#8217; θα εισαχθεί στη θέση 0 (δηλαδή την πρώτη)</p><p><span
style="text-decoration: underline;">Αφαίρεση στοιχείου με συγκεκριμένη τιμή</span></p><pre name="code" class="py">
myList.remove('inserted')
</pre><p>Εδώ θα αφαιρεθεί το στοιχείο με τιμή &#8216;inserted&#8217;</p><p><span
style="text-decoration: underline;">Ανάγνωση του τελευταίου στοιχείου της λίστας</span></p><pre name="code" class="py">
print(myList.pop())
</pre><p>Εδώ θα επιστραφεί το τελευταίο στοιχείο της λίστας και θα διαγραφεί ταυτόχρονα από αυτή</p><p><span
style="text-decoration: underline;">Ανάγνωση του στοιχείου στη θέση </span><span
style="text-decoration: underline;">X</span></p><pre name="code" class="py">
print(myList.pop(0))
</pre><p>Εδώ θα επιστρέφει το στοιχείο στη θέση 0 και θα διαγραφεί από αυτήν</p><p><span
style="text-decoration: underline;">Εύρεση της θέσης στοιχείου με τιμή ‘τιμή’</span></p><pre name="code" class="py">
print(myList.index('Monty'))
</pre><p>Εδώ θα επιστραφεί η θέση του στοιχείου με τιμή &#8216;Monty&#8217;</p><p><span
style="text-decoration: underline;">Ταξινόμηση λίστας</span><br
/> <span
style="text-decoration: underline;">numList = [1, 15, 25, 2, 8, 19, 1012, 3]</span></p><pre name="code" class="py">
numList.sort()
</pre><p>Εδώ ταξινομούνται τα στοιχεία της λίστας σε αύξουσα σειρά</p><p><span
style="text-decoration: underline;">Αντιστροφή λίστας σε επίπεδο στοιχείων</span></p><pre name="code" class="py">
numList.reverse()
</pre><p>Εδώ η λίστα θα αντιστραφεί (αν η λίστα δεν είναι ταξινομημένη εξ’ αρχής, η λίστα που θα προκύψει θα είναι απλά η ανάστροφη της αρχικής).</p><p>Για την καλύτερη κατανόηση των παραπάνω ειδικών λειτουργιών με λίστες σας συμβουλεύουμε να ανατρέξετε στο παράδειγμα κώδικα που θα βρείτε στο τέλος του άρθρου.</p><p>Σε αυτό το άρθρο ξεκινούμε να γνωρίζουμε πιο προχωρημένα θέματα της γλώσσας Python. Μείνετε μαζί μας και θα ανακαλύψετε πολύ σύντομα ότι τη δύναμη της συγκεκριμένης γλώσσας προγραμματισμού είναι μεγαλύτερη από όσο φανταζόσασταν.</p><p>Μέχρι την επόμενη φορά ωστόσο, να μην ξεχνάτε…<br
/> <em><span
style="text-decoration: underline;">να είστε καλά και να φροντίζεται τον εαυτό σας</span></em></p><blockquote><p
style="text-align: center;"><em><strong>Μπορείτε να κατεβάσετε τα αρχεία του βοηθήματος εδώ</strong></em></p><p
style="text-align: center;"><em><strong><a
href="http://static.greektuts.net/uploads3/2010/12/py_tuts_part_7b.zip" ><img
src="../wp-content/uploads/2009/10/membersdownload1.png" alt="download" width="200" height="200" /></a></strong></em></p></blockquote> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/python-part7b/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Μαθαίνοντας Python – Παράγοντας Ποιοτικό Κώδικα (α)</title><link>http://greektuts.net/python-part7/</link> <comments>http://greektuts.net/python-part7/#comments</comments> <pubDate>Wed, 17 Nov 2010 07:31:07 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[krap]]></category> <category><![CDATA[part7]]></category> <category><![CDATA[απόστολος]]></category> <category><![CDATA[απόστολος κρητικός]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[Μέρος 7]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=4469</guid> <description><![CDATA[Έχοντας αρχίσει να γράφουμε μεγάλα τμήματα κώδικα σε Python είναι απαραίτητο να μάθουμε να παράγουμε ποιοτικό κώδικα. Για τον λόγο αυτό, αποφασίσαμε να κάνουμε ένα διάλειμμα από τα τεχνικά χαρακτηριστικά και να δούμε κάποια πολύ βασικά πράγματα που πρέπει να προσέχει ένας Python προγραμματιστής.]]></description> <content:encoded><![CDATA[<h1><strong>Τι είναι «ποιοτικός κώδικας»;</strong></h1><p>Όταν μιλούμε για ποιοτικό κώδικα εννοούμε, στην γενική περίπτωση, κώδικα ο οποίος κάνει σωστά και αποτελεσματικά αυτό για το οποίο προορίζεται, ενώ παράλληλα είναι ευανάγνωστος, καλογραμμένος και σωστά τεκμηριωμένος.</p><p>Στα πλαίσια του οδηγού που εκκινεί το συγκεκριμένο άρθρο θα μας απασχολήσει το κομμάτι που αφορά κυρίως το πόσο καλογραμμένος, ευανάγνωστο και καλά τεκμηριωμένος είναι ο κώδικάς μας. Με γνώμονα αυτό θα δώσουμε κάποια προγραμματιστικά τρικ που βοηθούν στο να επιτευχθούν οι παραπάνω στόχοι.</p><h1><strong>Προαπαιτούμενα;</strong></h1><p><strong> </strong></p><p>Η καλή συγγραφή κώδικα είναι κάτι το οποίο αφορά όλες τις γλώσσες προγραμματισμού. Αυτό σημαίνει ότι πολλά από τα τρικ που θα παρουσιάσουμε εδώ αποτελούν καλές πρακτικές είτε προγραμματίζουμε σε Python, είτε σε οποιαδήποτε άλλη γλώσσα.</p><p>Ωστόσο, επειδή ορισμένες συμβουλές αφορούν σε συγκεκριμένα χαρακτηριστικά της γλώσσας Python, είναι καλό να γνωρίζει κανείς τα βασικά. Συνοψίζοντας, η πληροφορία που θα παρουσιαστεί στον εν λόγω οδηγό είναι γενικής φύσης και αφορά όλους όσους σκέπτονται να ασχοληθούν ή ήδη ασχολούνται με τον προγραμματισμό, ωστόσο προτείνεται να έχετε δει (έστω και εν τάχει) όλα τα άρθρα της σειράς «Μαθαίνοντας την Python» για να επιτύχετε το μέγιστο δυνατό κέρδος.</p><h1><strong>ΟΚ με έπεισες… Ποιος υπογράφει τα τρικ;</strong></h1><p><strong> </strong></p><p>Προσπαθώντας να μεταφέρουμε κόλπα και τεχνικές από επαγγελματίες που γνωρίζουν το αντικείμενο στο μεγαλύτερο δυνατό βαθμό αποφασίσαμε να ακολουθήσουμε τον <a
href="http://www.python.org/dev/peps/pep-0008/">οδηγό συγγραφής κώδικα Python</a> που φιλοξενείται online στην επίσημη ιστοσελίδα της Python.</p><p>Το link που δώσαμε εξυπηρετεί στο να μπορέσει να διαβάσει, όποιος ενδιαφέρεται, το πλήρες αγγλικό κείμενο του οδηγού. Εμείς θα κάνουμε ένα φιλτράρισμα της πληροφορίας περιλαμβάνοντας μόνον έννοιες που έχουμε καλύψει ως τώρα, ακολουθώντας το ύφος και την οργάνωση του προαναφερθέντα οδηγού.</p><p>Εφόσον είστε έτοιμοι να ανακαλύψετε τις καλές πρακτικές συγγραφής Python κώδικα, βεβαιωθείτε ότι το μάτι της κουζίνας είναι κλειστό, ετοιμάστε μια κούπα καφέ ή τσάι… και ξεκινάμε.</p><h1><strong>Ζήτημα 1<sup>ο</sup> – Πότε πρέπει να ακολουθώ τους κανόνες συγγραφής και πότε όχι;</strong></h1><p><strong> </strong></p><p>Εν γένει είναι καλό να ακολουθούνται πάντοτε οι κανόνες συγγραφείς. Ωστόσο αν αυτό τύγχανε καθολικής αποδοχής τότε δεν θα είχε ποτέ δημιουργηθεί η φράση «οι κανόνες υπάρχουν για να παραβιάζονται». Όσο ριζοσπαστικό και αν ακούγεται αυτό σαν φράση εμπεριέχει μια μεγάλη αλήθεια. Οι κανόνες, τουλάχιστον σε ότι αφορά τον προγραμματισμό, έχουν δημιουργηθεί ώστε να λύνουν δύο μεγάλα προβλήματα:</p><ul><li>Να      παρέχουν μια κοινή γραμμή σε όλους τους προγραμματιστές μιας ομάδας (είτε      πρόκειται για παρέα, είτε για εταιρικό σχήμα, είτε για ομάδα φοιτητών)</li><li>Να      προλαμβάνουν κοινά προγραμματιστικά λάθη (ναι, η μη συμμόρφωση με τους      κανόνες μπορεί να καταλήξει σε προγραμματιστικά λάθη)</li></ul><p>Ένας πιο σημαντικός όμως λόγος, για να ακολουθήσει κάποιος του κανόνες συγγραφής κώδικα, είναι η πειθαρχία στην παραγωγή καλογραμμένου και άρα εν μέρει, ποιοτικού κώδικα.</p><p>Είπαμε τους λόγου για τους οποίους είναι καλό αν  ακολουθούμε τους κανόνες. Ας δούμε τώρα πότε επιτρέπεται, αν όχι επιβάλλεται, να τους σπάμε (είμαι σίγουρος ότι οι περισσότεροι πρόκειται να το διαβάσετε αυτό).</p><ol><li><em>Όταν το να εφαρμόσουμε τον κανόνα κάνει      το αποτέλεσμα λιγότερο ευανάγνωστο, ακόμη και για κάποιον που έχει      συνηθίσει να γράφει κώδικα ακολουθώντας τους κανόνες.</em></li><li><em>Για να είναι ο κώδικάς μας συμβατός με      άλλον, περιβάλλοντα κώδικα που επίσης δεν ακολουθεί κανόνες συγγραφείς –      αν και αυτή η περίπτωση αποτελεί μια καλή ευκαιρία να διορθώσουμε «παλιές      αμαρτίες». </em></li></ol><p>Εν γένει οι κανόνες καλής συγγραφής είναι καλό να ακολουθούνται. Ωστόσο, σε κάποιες περιπτώσεις είναι καλύτερο να αποφεύγονται. Η διάκριση μεταξύ των δύο περιπτώσεων είναι, τις περισσότερες φορές θέμα διαισθητικό και καθώς ο προγραμματιστής κερδίζει όλο και μεγαλύτερη εμπειρία, γίνεται όλο και πιο ξεκάθαρο το τι πρέπει να κάνει και πότε.</p><h1><strong>Ζήτημα 2<sup>ο</sup> – Αν πρόκειται να γράψεις κώδικα, κάντο με στυλ!</strong></h1><p>Ας δούμε μερικά απλά, αλλά σημαντικά θέματα που αφορούν στο στυλ του κώδικα όταν γράφουμε Python.</p><h2>Στοίχιση</h2><p><em> </em></p><p>Όπως έχουμε τονίσει από το πρώτο κιόλας άρθρο μας για την Python, η στοίχιση των εντολών αποτελεί ένα από τα σημαντικότερα «βίτσια» της γλώσσας. Η οδηγία λέει ότι στοιχίζουμε κάθε μπλοκ κώδικα κατά έναν <em>αριθμό κενών χαρακτήρων</em> πιο μέσα από το μπλοκ κώδικα στο οποίο περιέχεται.</p><p>Πόσοι όμως πρέπει να είναι αυτοί οι χαρακτήρες; Εδώ υπάρχουν δύο σχολές σκέψεις:</p><ul><li>Τέσσερις      (4). Αυτό σημαίνει ότι κάθε φορά που πάμε να γράψουμε ένα μπλοκ κώδικα που      περιέχεται μέσα σε ένα άλλο, κάθε εντολή του νέου μπλοκ θα γράφεται      τέσσερις χαρακτήρες πιο μέσα από ότι το εξωτερικό.</li><li>Ένα TAB κενοί      χαρακτήρες (δηλαδή 8). Αυτό σημαίνει ότι αντί να αφήνουμε 4 κενά, όπως      είπαμε παραπάνω για κάθε νέα εσοχή, αφήνουμε ένα TAB (το οποίο παράγεται με τον      πλήκτρο TAB). Όπως      ήδη τονίσαμε, αυτό ισοδυναμεί με 8 κενούς χαρακτήρες.</li></ul><p>Υποθέτω ότι οι περισσότεροι θα βρήκατε τον δεύτερο τρόπο ευκολότερο και πιο συμφέρον από τον πρώτο. Σε αυτήν την περίπτωση κάνατε λάθος. Αν και αμφότεροι οι τρόποι είναι σωστοί, σύμφωνα με τον οδηγό καλής συγγραφής κώδικα που αναφέραμε στην εισαγωγή του άρθρου ο καλύτερος τρόπος αντιμετώπισης είναι ο πρώτος. Ο ίδιος οδηγός προτείνει την πολιτική των TABs ως συμφέρουσα μόνον όταν δουλεύουμε πάνω σε κώδικα που έχει φτιαχτεί εξ’ αρχής (και προφανώς από κάποιον άλλο) με τη χρήση TABs. Σε κάθε περίπτωση που ξεκινούμε να φτιάχνουμε δικό μας κώδικα, προτείνεται η χρήση των 4 κενών χαρακτήρων.</p><blockquote><p><strong><span
style="text-decoration: underline;">ΠΡΟΣΟΧΗ</span></strong>: Οι παραπάνω δυο πολιτικές είναι αμφότερες σωστές. Η μίξη τους ωστόσο, δηλαδή η χρήση άλλοτε τεσσάρων κενών χαρακτήρων και άλλοτε TABs <strong>απαγορεύεται αυστηρα</strong>.</p></blockquote><h2>Μέγιστο μήκος γραμμής</h2><p>Αυτό είναι κάτι που οι περισσότεροι προγραμματιστές (τόσο νέοι όσο και παλαιοί) συνήθως αγνοούν ή έχουν ξεχάσει με τον καιρό. Στην Python, αλλά και στις περισσότερες γλώσσες προγραμματισμού εφαρμόζονται όρια στο μήκος γραμμής κώδικα. Αυτό σημαίνει ότι κάθε γραμμή δεν πρέπει να ξεπερνά συγκεκριμένο αριθμό χαρακτήρων.</p><p>Σύμφωνα με τον οδηγό που ακολουθούμε, αυτό το όριο για την Python είναι οι 79 χαρακτήρες.</p><p>Ανάλογα λοιπόν με τον επεξεργαστή κειμένου που χρησιμοποιείται θα πρέπει να ρυθμίσετε (εφόσον το υποστηρίζει) να αλλάζει γραμμή όταν η εντολή σας υπερβεί τους 79 χαρακτήρες. Εάν αυτό δεν υποστηρίζεται από τον κειμενογράφο σας θα πρέπει να έχετε το νου σας και να το κάνετε με το χέρι. Μην πανικοβάλλεστε! Ακόμη και στη δεύτερη περίπτωση τα πράγματα δεν είναι τραγικά. Όλοι οι κειμενογράφοι έχουν δύο μετρητές, έναν για τις γραμμές και έναν για τις στήλες (δηλαδή τους χαρακτήρες ανά γραμμή). Επομένως το μόνο που έχετε να κάνετε είναι καθώς γράφετε κώδικα να παρατηρείτε τον μετρητή των στηλών και μόλις φθάσει τους 79 χαρακτήρες να αλλάξετε γραμμή.</p><p>Η επίσημη αιτιολογία ύπαρξης του παραπάνω κανόνα είναι ότι ακόμη υπάρχουν μηχανήματα που δεν μπορούν να προβάλλουν γραμμές με περισσότερους των 80 χαρακτήρες, ωστόσο η πρακτική αξία του κανόνα είναι ο πηγαίος κώδικας να μην περιλαμβάνει πολύ μακριές γραμμές υποχρεώνοντας τον προγραμματιστή να χρησιμοποιεί τον οριζόντιο κέρσορα για να τις παρακολουθεί από την αρχή ως το τέλος.</p><p>Ακολουθεί ένα δείγμα κώδικα που ακολουθεί την πολιτική των 80 χαρακτήρων παρμένο από τον οδηγό που αναφέραμε στην αρχή του άρθρου. Δε χρειάζεται να τον καταλάβετε, απλά δείτε πως είναι δομημένος.</p><pre name="code" class="py">
class Rectangle(Blob):
       def __init__(self, width, height,
              color='black', emphasis=None, highlight=0):
       if width == 0 and height == 0 and \
              color == 'red' and emphasis == 'strong' or \
              highlight &gt; 100:
               raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                                     emphasis is None):
              raise ValueError("I don't think so -- values are %s, %s" %
                                   (width, height))
       Blob.__init__(self, width, height,
                            color, emphasis, highlight)
</pre><p>Στο παραπάνω δείγμα κώδικα η μεγαλύτερη γραμμή φθάνει τους 74 χαρακτήρες. Παρατηρήστε επίσης ότι οι πολύ μακριές γραμμές χωρίζονται με τον χαρακτήρα ‘\’.</p><h2>Κενές γραμμές</h2><ul><li>Οι      κλάσεις πρέπει να χωρίζονται μεταξύ τους με δύο κενές γραμμές</li><li>Η πρώτη      μέθοδος μιας κλάσης πρέπει να χωρίζεται από τα χαρακτηριστικά της κλάσης      με δύο κενές γραμμές</li><li>Έξτρα      κενές γραμμές μπορούν να χρησιμοποιηθούν σε μεγάλες (σε μέγεθος      συναρτήσεις) ώστε να χωρίζουν τη λογική της συνάρτησης σε τμήματα.</li></ul><h1><strong>Κωδικοποίηση χαρακτήρων (</strong><strong>encoding)</strong></h1><p><strong> </strong></p><p>Ο κώδικας του πυρήνα της διανομής της Python πρέπει υποχρεωτικά να είναι κωδικοποιημένος σε ASCII Latin-1 κωδικοποίηση χαρακτήρων (ISO-8859-1). Για εκδόσεις της Python από 3.0 και επάνω, η κωδικοποίηση χαρακτήρων UTF-8 προτιμάται τις Latin-1. Για περισσότερες πληροφορίες σχετικά με την οδηγία για την κωδικοποίηση χαρακτήρων μπορείτε να ανατρέξετε στο <a
href="http://www.python.org/dev/peps/pep-3120">PEP 3120</a> που βρίσκεται στο επίσημο site της Python.</p><p>Σε αυτό το άρθρο πήραμε μια πρώτη γεύση μερικών από τους κανόνες που αφορούν τον προγραμματισμό σε Python. Μείνετε συντονισμένοι για την συνέχεια του οδηγού καλής συγγραφής κώδικα.</p><p>Μέχρι την επόμενη φορά…</p><p><em><span
style="text-decoration: underline;">να είστε καλά και να φροντίζεται τον εαυτό σας</span></em>.</p> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/python-part7/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Μαθαίνοντας Python – Μέρος 6ο (γ)</title><link>http://greektuts.net/python-part-6c/</link> <comments>http://greektuts.net/python-part-6c/#comments</comments> <pubDate>Thu, 11 Nov 2010 10:00:22 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[krap]]></category> <category><![CDATA[απόστολος]]></category> <category><![CDATA[απόστολος κρητικός]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=4458</guid> <description><![CDATA[Με το σημερινό άρθρο ολοκληρώνουμε το κεφάλαιο των συναρτήσεων σε Python. Σε μια προσπάθεια να καλύψουμε όσο πιο σφαιρικά το αντικείμενο μπορούμε θα ασχοληθούμε με κάποια θέματα που έχουν απομείνει και θα κλείσουμε με τον τρόπο με τον οποίο τεκμηριώνουμε μια συνάρτηση σε Python γράφοντας σχόλια.]]></description> <content:encoded><![CDATA[<p>Αναλυτικότερα λοιπόν σήμερα θα μάθουμε:</p><ul><li>Να δημιουργήσουμε ανώνυμες συναρτήσεις τύπου lambda</li><li>Να τεκμηριώνουμε σωστά τις συναρτήσεις μας</li></ul><p><strong>Προαπαιτούμενα</strong></p><p><strong> </strong></p><p>Μαθαίνοντας Python:  <a
href="../python-part-1/" target="_blank">Μέρος Ι</a>, <a
href="../python-part-2/" target="_blank">Μέρος  ΙΙ</a>, <a
href="../python-part-3/" target="_blank">Μέρος ΙΙΙ</a>, <a
href="../python-part-4/" target="_blank">Μέρος IV</a>, <a
href="../python-part5/" target="_blank">Μέρος V</a>, <a
href="../python-part-6a/" target="_blank">Μερος VI  (α)</a><a
href="../../../../../python-part-6a/"></a>, <a
href="http://greektuts.net/python-part-6b/" target="_blank">Μερος VI  (β)</a></p><p><strong>Πριν ξεκινήσουμε…</strong></p><p><strong> </strong></p><p>… θα ήθελα να επισημάνω ένα – δύο πρακτικά ζητήματα.</p><p>Στη συνέχεια παρουσιάζεται ο τρόπος για να επιτευχθούν οι στόχοι που περιγράψαμε στην εισαγωγή. Θα παρατηρήσετε ότι το άρθρο ακολουθεί τη δομή</p><blockquote><p><em>Μικρή περιγραφή του τι θέλουμε να επιτύχουμε (+ επιπλέον σχόλια)</em></p></blockquote><pre name="code" class="py">
<em>Παράδειγμα κώδικα</em>
</pre><p>Στο τέλος του αρχείου θα βρείτε συνημμένο ένα python script που περιέχει συγκεντρωμένα όλα τα παραδείγματα.</p><p>Για να τα χρησιμοποιήσετε, αντιγράφετε το εκάστοτε παράδειγμα σε ένα νέο αρχείο python και το εκτελείτε (βλ. <a
title="Permanent Link to Μαθαίνοντας Python – Μέρος 1ο" href="http://greektuts.net/python-part-1/">Μαθαίνοντας Python – Μέρος 1ο</a> ). Τα παραδείγματα είναι φτιαγμένα με τέτοιον τρόπο ώστε να τυπώνουν τα αποτελέσματα στην οθόνη ώστε να μπορείτε να πιστοποιήσετε εύκολα τη λειτουργικότητά τους. Για διευκόλυνσή σας έχουμε χωρίσει τα παραδείγματα με σχόλια που δίνουν μια μικρή περιγραφή του τι επιχειρούμε κάθε φορά.</p><p>Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</p><p>( ΦΡΕΣΚΑΡΟΝΤΑΣ ΤΑ ΒΑΣΙΚΑ… )</p><p><strong><em>Σύνταξη μιας συνάρτησης</em></strong></p><pre name="code" class="py">
def triangle_area(a, b):
area = a * b / 2
print("Το εμβαδό του τριγώνου είναι:", area)
</pre><p><strong><em>Καλώντας μια συνάρτηση</em></strong></p><pre name="code" class="py">
triangle_area(66, 2010)
</pre><p>και χωρίς παραμέτρους αν χρειαστεί…</p><pre name="code" class="py">
def no_params_function():
print("Αυτή η συνάρτηση δε δέχεται παραμέτρους...")
</pre><p>Έχοντας στο μυαλό μας τα παραπάνω πάμε να δούμε τις περαιτέρω λειτουργίες που μπορεί να προσφέρει μια συνάρτηση γραμμένη σε γλώσσα Python.</p><p><strong>Lambda </strong><strong>forms</strong></p><p><strong> </strong></p><p>Ο όρος “Lambda form” προέρχεται από παλαιότερες συναρτησιακές γλώσσες (όπως η Lisp) και φαίνεται πως οι δημιουργοί της Python θεώρησαν καλό να την συμπεριλάβουν σαν δυνατότητα και στην δική τους γλώσσα προγραμματισμού.</p><p>Μια Lambda form δεν είναι τίποτε άλλο από μια mini <strong>ανώνυμη </strong>συνάρτηση που ορίζεται μέσα σε μία μεγαλύτερη ώστε  να επιτελεί κάποια συγκεκριμένη, απλή συνήθως διαδικασία.</p><p>Ας δούμε μαζί το ακόλουθο παράδειγμα</p><pre name="code" class="py">
def counter(n):
return lambda x: x + n
</pre><p>με το οποίο, αν μη τι άλλο απομυθοποιείται η φήμη του ότι οι lambda forms είναι κάτι το περίπλοκο. Η παραπάνω συνάρτηση (counter) δέχεται σαν όρισμα έναν αριθμό n και επιστρέφεται (μέσω μιας lambda form που ορίζεται στο σώμα της counter) ο αριθμός n αυξημένος κατά x.</p><p>Ας το δούμε στην πράξη.</p><p>Για να χρησιμοποιήσουμε την συνάρτηση counter θα πρέπει με κάποιο τρόπο να καταφέρουμε να ζητήσουμε από τον χρήστη την τιμή της παραμέτρου x. Επομένως…</p><pre name="code" class="py">
myCounter = counter(5)
</pre><p>αναθέτουμε μια κλήση της συνάρτησης counter με παράμετρο 5 (για το συγκεκριμένο παράδειγμα) σε μια μεταβλητή που ονομάζουμε myCounter.</p><blockquote><p><strong><em>?: </em></strong><em>Υπενθυμίζουμε σε αυτό το σημείο ότι οι μεταβλητές της </em><em>Python </em></p></blockquote><ul><li><em>Δεν έχουν τύπο </em></li><li><em>Μπορούν να φιλοξενήσουν υπό μορφήν      τιμής ακόμη  και ολόκληρες      συναρτήσεις</em></li></ul><p>Έτσι πλέον μπορούμε να καλούμε την myCounter με όρισμα κάποιον αριθμό (ο οποίος, αν επιστρέψουμε στον ορισμό της counter, θα αντιπροσωπεύει τον x).</p><pre name="code" class="py">
print( myCounter( 1 ) )
</pre><p>η παραπάνω κλήση έχει σαν αποτέλεσμα η συνάρτηση myCounter να εκτελέσει εσωτερικά την συνάρτηση counter με x = 1 και n = 5 (το n έχει οριστεί απαξ στο σημείο που αναθέσαμε στην myCounter το counter(5)).</p><p>Έτσι το αποτέλεσμα της παραπάνω κλήσης θα είναι το x το οποίο μέσα στην lambda form ορίζεται ως x: x + n άρα x: 1 + 5. Δηλαδή η παραπάνω κλήση θα εκτυπώσει στην οθόνη 6.</p><pre name="code" class="py">
print( myCounter( 30 ) )
</pre><p>Όμοια η κλήση αυτή θα δώσει… (αφήνεται ως άσκηση στον αναγνώστη).</p><p><strong>Τεκμηρίωση / σχολιασμός συναρτήσεων</strong></p><p><strong> </strong></p><p>Οι συναρτήσει αποτελούν ένα πολύ δυνατό χαρακτηριστικό της γλώσσας Python. Όπως όμως συμβαίνει με όλα τα δυνατά εργαλεία είναι άχρηστες αν κάποιος δεν γνωρίζει πώς να τις χρησιμοποιεί. Όταν γράφουμε κομμάτια κώδικα που επιτελούν συγκεκριμένες διαδικασίες είναι πολύ πιθανό να συμβεί ένα από τα παρακάτω σενάρια.</p><ol><li>Κατασκευάζουμε      το κομμάτι κώδικα που επιτελεί μια συγκεκριμένη διαδικασία χωρίς λάθη.      Χρησιμοποιούμε για ένα διάστημα των κώδικα αυτό και στη συνέχεια τον      εγκαταλείπουμε για λίγο. Αν ο κώδικάς μας δεν είναι καλά ή καθόλου      τεκμηριωμένος υπάρχει πολύ μεγάλη πιθανότητα, όταν τον ανοίξουμε μετά από      μερικούς μήνες να μην μπορούμε να θυμηθούμε τι ακριβώς κάνει.</li><li>Κατασκευάζουμε      το κομμάτι κώδικα που επιτελεί μια συγκεκριμένη διαδικασία χωρίς λάθη. Στη      συνέχεια μας ζητά τον κώδικα αυτόν κάποιος συνεργάτης. Αν ο κώδικάς μας      δεν είναι τεκμηριωμένος υπάρχει πολύ μεγάλη πιθανότητα ο συνεργάτης να μην      καταλάβει περί τίνος πρόκειται και, είτε να χάσει σημαντικό χρόνο      προσπαθώντας να τον ερμηνεύσει, είτε να μην ασχοληθεί και να επιλέξει να      τον ξαναγράψει από το μηδέν.</li></ol><p>Η τεκμηρίωση των συναρτήσεών, όπως και κάθε γραμμής κώδικα, είναι σημαντικότατη. Ας δούμε πως το κάνουμε σε Python.</p><pre name="code" class="py">
def hello():
""" Αυτή είναι μια απλή hello world συνάρτηση... """
print('Hello world')
</pre><p>Όπως εύκολα αντιλαμβάνεστε, το μόνο που χρειάζεται να κάνετε είναι να περικλείεται τα σχόλιά σας σε τριπλά διπλά εισαγωγικά J “”” … “””.</p><p>Χωρίς να βλέπω ιδιαίτερη χρησιμότητα, οφείλω να πω ότι υπάρχει τρόπος (με κώδικα) να εμφανίζεται τα σχόλια των συναρτήσεών σας.</p><pre name="code" class="py">
hello()
print("Σχόλια: '" + hello.__doc__ + "'")
</pre><p>Η πρώτη γραμμή είναι η κλήση της συνάρτησης hello() ενώ η δεύτερη εκτυπώνει στην κονσόλα τα σχόλια της συνάρτησης hello.</p><p>Στην γενική της μορφή η εντολή εμφάνισης των σχολίων είναι η ακόλουθη:</p><pre name="code" class="py">
&lt;ΟΝΟΜΑ_ΣΥΝΑΡΤΗΣΗΣ&gt;.__doc__
</pre><p>Με αυτό το άρθρο ολοκληρώσαμε το οδοιπορικό μας στον χώρο των συναρτήσεων σε Python. Πριν περάσουμε στο επόμενο αντικείμενο θα ξοδέψουμε λίγο χρόνο για ένα ειδικό θέμα.</p><p>Μέχρι τότε να μην ξεχνάτε…</p><p><em><span
style="text-decoration: underline;">να είστε καλά και να φροντίζεται τον εαυτό σας</span></em>.</p><blockquote><p
style="text-align: center;"><em><strong>Μπορείτε να κατεβάσετε τα       αρχεία του βοηθήματος εδώ</strong></em></p><p
style="text-align: center;"><em><strong><a
href="http://static.greektuts.net/uploads3/2010/11/py_tuts_part_6c.zip" ><img
src="../wp-content/uploads/2009/10/membersdownload1.png" alt="download" width="200" height="200" /></a></strong></em></p></blockquote> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/python-part-6c/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Μαθαίνοντας Python – Μέρος 6ο  (β)</title><link>http://greektuts.net/python-part-6b/</link> <comments>http://greektuts.net/python-part-6b/#comments</comments> <pubDate>Mon, 01 Nov 2010 07:55:16 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[krap]]></category> <category><![CDATA[απόστολος]]></category> <category><![CDATA[απόστολος κρητικός]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=4387</guid> <description><![CDATA[Αν και ελαφρώς καθυστερημένα (apologies!) ήρθε η στιγμή να προχωρήσουμε στο κεφάλαιο των συναρτήσεων σε Python. Την τελευταία φορά είδαμε τα βασικά όσον αφορά στη δημιουργία και κλήση συναρτήσεων ενώ προχωρήσαμε και σε διάφορα ενδιαφέροντα «τρικ» όπως χρήση μιας συνάρτησης σαν παράμετρο με μία άλλη συνάρτηση.]]></description> <content:encoded><![CDATA[<p><strong> </strong></p><p>Αναλυτικότερα λοιπόν σήμερα θα μάθουμε:</p><ul><li>Να ορίσουμε συναρτήσεις με παραμέτρους που αποτελούν λέξεις &#8211; κλειδιά</li><li>Να ορίσουμε συναρτήσεις με λίστες για παραμέτρους</li></ul><h1><strong>Προαπαιτούμενα</strong></h1><p><strong> </strong></p><p>Μαθαίνοντας Python:  <a
href="http://greektuts.net/python-part-1/" target="_blank">Μέρος Ι</a>, <a
href="http://greektuts.net/python-part-2/" target="_blank">Μέρος  ΙΙ</a>, <a
href="http://greektuts.net/python-part-3/" target="_blank">Μέρος ΙΙΙ</a>, <a
href="http://greektuts.net/python-part-4/" target="_blank">Μέρος IV</a>, <a
href="http://greektuts.net/python-part5/" target="_blank">Μέρος V</a>, <a
href="http://greektuts.net/python-part-6a/" target="_blank">Μερος VI (α)</a></p><h1><strong>Πριν ξεκινήσουμε…</strong></h1><p><strong> </strong></p><p>… θα ήθελα να επισημάνω ένα – δύο πρακτικά ζητήματα.</p><p>Στη συνέχεια παρουσιάζεται ο τρόπος για να επιτευχθούν οι στόχοι που περιγράψαμε στην εισαγωγή. Θα παρατηρήσετε ότι το άρθρο ακολουθεί τη δομή:</p><p><em>Μικρή περιγραφή του τι θέλουμε να επιτύχουμε (+ επιπλέον σχόλια)</em></p><pre name="code" class="python">
Παράδειγμα κώδικα
</pre><p>Στο τέλος του αρχείου θα βρείτε συνημμένο ένα python script που περιέχει συγκεντρωμένα όλα τα παραδείγματα.</p><p>Για να τα χρησιμοποιήσετε, αντιγράφετε το εκάστοτε παράδειγμα σε ένα νέο αρχείο python και το εκτελείτε (βλ. <a
title="Permanent Link to Μαθαίνοντας Python – Μέρος 1ο" href="http://greektuts.net/python-part-1/">Μαθαίνοντας Python – Μέρος 1ο</a> ). Τα παραδείγματα είναι φτιαγμένα με τέτοιον τρόπο ώστε να τυπώνουν τα αποτελέσματα στην οθόνη ώστε να μπορείτε να πιστοποιήσετε εύκολα τη λειτουργικότητά τους. Για διευκόλυνσή σας έχουμε χωρίσει τα παραδείγματα με σχόλια που δίνουν μια μικρή περιγραφή του τι επιχειρούμε κάθε φορά.</p><p>Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</p><p>( ΦΡΕΣΚΑΡΟΝΤΑΣ ΤΑ ΒΑΣΙΚΑ… )</p><h1><strong>Σύνταξη μιας συνάρτησης</strong></h1><pre name="code" class="python">
def triangle_area(a, b):
area = a * b / 2
print("Το εμβαδό του τριγώνου είναι:", area)
</pre><h1><strong>Καλώντας μια συνάρτηση</strong></h1><pre name="code" class="python">
triangle_area(66, 2010)
</pre><p>και χωρίς παραμέτρους αν χρειαστεί…</p><pre name="code" class="python">
def no_params_function():
print("Αυτή η συνάρτηση δε δέχεται παραμέτρους...")
</pre><p>Έχοντας στο μυαλό μας τα παραπάνω πάμε να δούμε τις περαιτέρω λειτουργίες που μπορεί να προσφέρει μια συνάρτηση γραμμένη σε γλώσσα Python.</p><h1><strong>Ορίζοντας προεπιλεγμένες τιμές στις παραμέτρους μιας συνάρτησης</strong></h1><p>Πολλές φορές η πληροφορία που ζητούμε από τον χρήστη μπορεί να είναι ελλιπείς (δηλαδή ο χρήστης να μη γνωρίζει τι πρέπει να δώσει σαν τιμή σε κάποιο από τα ζητούμενα). Συνήθως οι εφαρμογές απαιτούν να δοθεί τιμή σε όλες τις μεταβλητές και, αν αυτό δε συμβεί, εμφανίζουν προειδοποιητικά μηνύματα στον χρήστη μέχρις ότου να «γεμίσει» όλα τα πεδία με τιμές.</p><p>Στην Python, όπως και σε άλλες γλώσσες προγραμματισμού δίνεται η δυνατότητα στον προγραμματιστή να καθορίσει προεπιλεγμένες τιμές σε κάποιες από τις παραμέτρους της συνάρτησης έτσι ώστε:</p><ul><li>Αν ο      χρήστης δώσει τιμή, το σύστημα θα αναγνώσει και θα χρησιμοποιήσει την τιμή      αυτή.</li><li>Αν ο      χρήστης δε δώσει τιμή, το σύστημα θα χρησιμοποιήσει την τιμή που έχει      οριστεί ως προεπιλογή.</li></ul><p>Στην πράξη αυτό συμβαίνει ως εξής:</p><pre name="code" class="python">
def dbConnect(username, password, database, server='localhost', port='3306'):
print('Το string σύνδεσης για την MySQL είναι: ')
print()
print('driver={MySQL};server=' + server + ':port=' + port + ';uid=' + username + ';pwd=' + password + ';database=' + database + ';')
</pre><blockquote><p><strong><em>?:</em></strong><em> Η συνάρτηση </em><em>dbConnect</em><em> αναλαμβάνει να κατασκευάσει ενα </em><em>MySQL</em><em> </em><em>connection</em><em> </em><em>string</em><em> ζητώντας μια σειρά από παραμέτρους από τον χρήστη. Όπως εύκολα μπορεί να δει κανείς, κάποιες από τις παραμέτρους έχουν λάβει προεπιλεγμένες τιμές.</em></p></blockquote><p>Το σώμα της συνάρτησης δεν περιλαμβάνει κάτι διαστημικό. Δομεί ένα αλφαριθμητικό με βάση τις τιμές που παίρνει σαν παραμέτρους και το τυπώνει στην οθόνη. Η αξία του παραδείγματος στην πραγματικότητα έγκειται στην λίστα των παραμέτρων. Ας δούμε μερικά παραδείγματα  χρήσης για να αποσαφηνίσουμε την κατάσταση:</p><pre name="code" class="python">
dbConnect('akritiko', '123456', 'myDB', '127.0.0.1', '3333')
</pre><p>Εδώ, κατά την κλήση της συνάρτησης, δίνονται τιμές για όλες τις παραμέτρους της. Σε αυτήν την περίπτωση η Python θα αγνοήσει τελείως τις προεπιλεγμένες τιμές.</p><pre name="code" class="python">
dbConnect('akritiko', '123456', 'myDB', '127.0.0.1')
</pre><p>Εδώ, κατά την κλήση της συνάρτησης, δίνονται τιμές για κάποιες μόνον από τις παραμέτρους της. Σε αυτήν την περίπτωση η Python θα αγνοήσει τις προεπιλεγμένες τιμές για τις παραμέτρους για τις οποίες δίδονται τιμές κατά την κλήση της και θα χρησιμοποιήσει τις προεπιλεγμένες για τις υπόλοιπες.</p><pre name="code" class="python">
dbConnect('akritiko', '123456', 'myDB')
</pre><p>Εδώ, κατά την κλήση της συνάρτησης, δίνονται τιμές μόνον για τις παραμέτρους που δεν έχουν προεπιλεγμένες τιμές. Όπως και πάνω, για τις παραμέτρους για τις οποίες δεν δίνονται τιμές, θα χρησιμοποιηθούν οι προεπιλεγμένες.</p><pre name="code" class="python">
dbConnect('akritiko', '123456', 'myDB', port = '3333')
</pre><p>Εδώ, κατά την κλήση της συνάρτησης, θέλουμε να δώσουμε τιμή, εκτός των παραμέτρων που δεν έχουν προεπιλεγμένες τιμές και στην παράμετρο port. Είναι προφανές ότι αν γράφαμε</p><pre name="code" class="python">
dbConnect('akritiko', '123456', 'myDB', '3333')
</pre><p>η τιμή 3333 θα καταχωρούνταν στην παράμετρο server εφόσον προηγείται της port. Επομένως θα πρέπει με κάποιον τρόπο να δώσουμε στην Python να καταλάβει για ποια παράμετρο μιλάμε. Αυτό συμβαίνει χρησιμοποιώντας τη λέξη κλειδί (keyword) της παραμέτρου, που στην προκειμένη περίπτωση είναι το port, στη συνέχεια τον τελεστή ‘=’ και τέλος την επιθυμητή τιμή.</p><h1><strong>Προεπιλεγμένες τιμές και δυναμικά εξελισσόμενες παράμετροι</strong></h1><p>Είδαμε τι συμβαίνει με τις προεπιλεγμένες τιμές στις παραμέτρους – ορίσματα μιας συνάρτησης. Τι συμβαίνει όμως αν οι παράμετροι αυτοί είναι περισσότεροι πολύπλοκες (ως τύποι;). Ας ρίξουμε μια ματιά στον παρακάτω κώδικα:</p><pre name="code" class="python">
def wishlist(item, Wishlist=[]):
Wishlist.append(item)
return Wishlist
</pre><p>Πρόκειται για μια συνάρτηση η οποία προσθέτει αντικείμενα σε μία Wishlist (λειτουργία που μπορείτε να βρείτε – σε μία ομολογουμένως πιο εξεζητημένη υλοποίηση <img
src='http://greektuts.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> – στο Amazon.com). Εν ολίγοις ο κώδικας απλά παίρνει σαν παραμέτρους το αντικείμενο (item) και την λίστα (Wishlist) και κάθε φορά που εκτελείται συμπεριλαμβάνει το εκάστοτε αντικείμενο στην λίστα.</p><blockquote><p><strong><em>?: </em></strong><em>Παρατηρήστε ότι η </em><em>Wishlist έχει προεπιλεγμένη τιμή την κενή λίστα ( [] ). </em></p></blockquote><p><em> </em></p><p>Ας δούμε τώρα μια σειρά εκτελέσεων:</p><ol><li>print(wishlist(&#8216;Nokia N8&#8242;))</li><li>print(wishlist(&#8216;Harry Potter      and the Deathly Hallows&#8217;))</li><li>print(wishlist(&#8216;Monty Python      and The Holy Grail Blu-Ray Edition&#8217;))</li></ol><p>Σε κάθε εκτέλεση η λίστα διαμορφώνεται ως ακολούθως</p><ol><li>['Nokia N8']</li><li>['Nokia N8', 'Harry Potter and      the Deathly Hallows']</li><li>['Nokia N8', 'Harry Potter and      the Deathly Hallows', 'Monty Python and The Holy Grail Blu-Ray Edition']</li></ol><p>Παρατηρούμε λοιπόν ότι παρόλο που η λίστα έχει σαν προεπιλεγμένη τιμή την κενή λίστα καθώς συμβαίνουν διαδοχικές εκτελέσεις τα αντικείμενα προστίθενται κανονικά. Αυτό συμβαίνει γιατί η προεπιλεγμένη τιμή ισχύει μόνον για την πρώτη εκτέλεση.</p><p>Επιπλέον, αξίζει να σημειωθεί ότι παρότι σε κάθε κλήση εκτελείται εκ νέου η συνάρτηση, η κατάσταση της λίστας διατηρείται. Καταλαβαίνουμε λοιπόν ότι η φύση των δυναμικών παραμέτρων δεν επηρεάζεται από τις προεπιλεγμένες τιμές.</p><p>Στο επόμενο άρθρο θα κλείσουμε το κεφάλαιο των συναρτήσεων σε Python. Μείνετε συντονισμένοι γιατί το τρίτο μέρος του οδηγού σχετικά με συναρτήσεις στην Python πρόκειται να συνοδεύεται από πρακτικές καλής συγγραφής συναρτήσεων.</p><p>Μέχρι την ερχόμενη φορά λοιπόν…</p><p><em><span
style="text-decoration: underline;">να είστε καλά και να φροντίζεται τον εαυτό σας</span></em>.</p><blockquote><p
style="text-align: center;"><em><strong>Μπορείτε να κατεβάσετε τα      αρχεία του βοηθήματος εδώ</strong></em></p><p
style="text-align: center;"><a
href="http://static.greektuts.net/uploads3/2010/11/py_tuts_part_6b.zip" target="_blank"><em><strong><img
class="aligncenter" style="border: 0pt none;" src="../wp-content/uploads/2009/10/membersdownload1.png" alt="download" width="200" height="200" /></strong></em></a></p></blockquote><div
id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;"><!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:TargetScreenSize>800&#215;600</o:TargetScreenSize> </o:OfficeDocumentSettings> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EL</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:EnableOpenTypeKerning /> <w:DontFlipMirrorIndents /> <w:OverrideTableStyleHps /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val="&#45;-" /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="0" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="0" Name="Body Text" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman","serif";} --> <!--[endif]--></p><p
class="MsoBodyText" style="text-align: right;">30/10/2010</p><p
class="MsoNormal" style="text-align: justify;"><strong><span
style="font-size: 14pt;">Μαθαίνοντας </span></strong><strong><span
style="font-size: 14pt;" lang="EN-US">Python</span></strong><strong><span
style="font-size: 14pt;"> – Μέρος 6<sup>ο</sup> (β)</span></strong></p><p
class="MsoNormal" style="text-align: justify;"><strong><span
style="font-size: 14pt;"> </span></strong></p><p
class="MsoNormal" style="text-align: justify;">«<span
lang="EN-US">title</span>.<span
lang="EN-US">png</span>» <strong><span
style="font-size: 14pt;"></span></strong></p><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US"> </span></p><p
class="MsoNormal" style="text-align: justify;">Αν και ελαφρώς καθυστερημένα (<span
lang="EN-US">apologies</span>!) ήρθε η στιγμή να προχωρήσουμε στο κεφάλαιο των συναρτήσεων σε <span
lang="EN-US">Python</span>. Την τελευταία φορά είδαμε τα βασικά όσον αφορά στη δημιουργία και κλήση συναρτήσεων ενώ προχωρήσαμε και σε διάφορα ενδιαφέροντα «τρικ» όπως χρήση μιας συνάρτησης σαν παράμετρο με μία άλλη συνάρτηση.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Αναλυτικότερα λοιπόν σήμερα θα μάθουμε:</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoListParagraphCxSpFirst" style="text-align: justify; text-indent: -18pt;"><!--[if !supportLists]--><span
style="font-family: Symbol;"><span>·<span
style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"> </span></span></span><!--[endif]-->Να ορίσουμε συναρτήσεις με παραμέτρους που αποτελούν λέξεις &#8211; κλειδιά</p><p
class="MsoListParagraphCxSpLast" style="text-align: justify; text-indent: -18pt;"><!--[if !supportLists]--><span
style="font-family: Symbol;"><span>·<span
style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"> </span></span></span><!--[endif]-->Να ορίσουμε συναρτήσεις με λίστες για παραμέτρους</p><p
class="MsoNormal" style="text-align: justify;"><strong>Προαπαιτούμενα</strong></p><p
class="MsoNormal" style="text-align: justify;"><strong> </strong></p><p
class="MsoNormal">Μαθαίνοντας Python: <span> </span><a
href="../archives/1571">Μέρος Ι</a>, <a
href="../archives/1713">Μέρος<span> </span>ΙΙ</a>, <a
href="../archives/1838">Μέρος ΙΙΙ</a>, <a
href="../archives/1930">Μέρος <span
lang="EN-US">IV</span></a>, <a
href="../python-part5/">Μέρος <span
lang="EN-US">V</span></a>, <a
href="../python-part-6a/">Μερος <span
lang="EN-US">VI</span> (α)</a></p><p
class="MsoNormal"><p
class="MsoNormal"><p
class="MsoNormal"><strong>Πριν ξεκινήσουμε…</strong></p><p
class="MsoNormal"><strong> </strong></p><p
class="MsoNormal" style="text-align: justify;">… θα ήθελα να επισημάνω ένα – δύο πρακτικά ζητήματα.</p><p
class="MsoNormal" style="text-align: justify;">Στη συνέχεια παρουσιάζεται ο τρόπος για να επιτευχθούν οι στόχοι που περιγράψαμε στην εισαγωγή. Θα παρατηρήσετε ότι το άρθρο ακολουθεί τη δομή:</p><p
class="MsoNormal" style="text-align: justify;"><div
style="border: 1pt solid windowtext; padding: 1pt 4pt;"><p
class="MsoNormal" style="border: medium none; padding: 0cm;"><em>Μικρή περιγραφή του τι θέλουμε να επιτύχουμε (+ επιπλέον σχόλια)</em></p><p
class="MsoNormal" style="border: medium none; padding: 0cm;"><em>Παράδειγμα κώδικα</em></p></div><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Στο τέλος του αρχείου θα βρείτε συνημμένο ένα <span
lang="EN-US">python</span><span
lang="EN-US"> </span><span
lang="EN-US">script</span><span
lang="EN-US"> </span>που περιέχει συγκεντρωμένα όλα τα παραδείγματα.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Για να τα χρησιμοποιήσετε, αντιγράφετε το εκάστοτε παράδειγμα σε ένα νέο αρχείο <span
lang="EN-US">python</span><span
lang="EN-US"> </span>και το εκτελείτε (βλ. <a
title="Permanent Link to Μαθαίνοντας Python – Μέρος 1ο" href="../archives/1571">Μαθαίνοντας Python – Μέρος 1ο</a> ). Τα παραδείγματα είναι φτιαγμένα με τέτοιον τρόπο ώστε να τυπώνουν τα αποτελέσματα στην οθόνη ώστε να μπορείτε να πιστοποιήσετε εύκολα τη λειτουργικότητά τους. Για διευκόλυνσή σας έχουμε χωρίσει τα παραδείγματα με σχόλια που δίνουν μια μικρή περιγραφή του τι επιχειρούμε κάθε φορά.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">( ΦΡΕΣΚΑΡΟΝΤΑΣ ΤΑ ΒΑΣΙΚΑ… )</p><p
class="MsoNormal" style="text-align: justify;"><strong><em> </em></strong></p><p
class="MsoNormal" style="text-align: justify;"><strong><em>Σύνταξη μιας συνάρτησης</em></strong></p><p
class="MsoNormal" style="text-align: justify;"><strong><em> </em></strong></p><p
class="MsoNormal" style="text-align: justify;"><em><span
lang="EN-US">def</span><span
lang="EN-US"> </span></em><em><span
lang="EN-US">triangle</span>_</em><em><span
lang="EN-US">area</span>(</em><em><span
lang="EN-US">a</span>, </em><em><span
lang="EN-US">b</span>):<span> </span></em></p><p
class="MsoNormal" style="text-align: justify;"><em><span> </span>area = a * b / 2</em></p><p
class="MsoNormal" style="text-align: justify;"><em><span> </span>print(&#8220;Το εμβαδό του τριγώνου είναι:&#8221;, area)</em></p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><strong><em>Καλώντας μια συνάρτηση</em></strong></p><p
class="MsoNormal" style="text-align: justify;">triangle_area(66, 2010)</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">και χωρίς παραμέτρους αν χρειαστεί…</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">def no_params_function():</p><p
class="MsoNormal" style="text-align: justify;"><span> </span>print(&#8220;Αυτή η συνάρτηση δε δέχεται παραμέτρους&#8230;&#8221;)</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Έχοντας στο μυαλό μας τα παραπάνω πάμε να δούμε τις περαιτέρω λειτουργίες που μπορεί να προσφέρει μια συνάρτηση γραμμένη σε γλώσσα <span
lang="EN-US">Python</span>.<span
lang="EN-US"></span></p><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US"> </span></p><p
class="MsoNormal" style="text-align: justify;"><strong>Ορίζοντας προεπιλεγμένες τιμές στις παραμέτρους μιας συνάρτησης</strong></p><p
class="MsoNormal" style="text-align: justify;"><strong> </strong></p><p
class="MsoNormal" style="text-align: justify;">Πολλές φορές η πληροφορία που ζητούμε από τον χρήστη μπορεί να είναι ελλιπείς (δηλαδή ο χρήστης να μη γνωρίζει τι πρέπει να δώσει σαν τιμή σε κάποιο από τα ζητούμενα). Συνήθως οι εφαρμογές απαιτούν να δοθεί τιμή σε όλες τις μεταβλητές και, αν αυτό δε συμβεί, εμφανίζουν προειδοποιητικά μηνύματα στον χρήστη μέχρις ότου να «γεμίσει» όλα τα πεδία με τιμές.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Στην <span
lang="EN-US">Python</span>, όπως και σε άλλες γλώσσες προγραμματισμού δίνεται η δυνατότητα στον προγραμματιστή να καθορίσει προεπιλεγμένες τιμές σε κάποιες από τις παραμέτρους της συνάρτησης έτσι ώστε:</p><p
class="MsoNormal" style="text-align: justify;"><ul
style="margin-top: 0cm;" type="disc"><li
class="MsoNormal" style="text-align: justify;">Αν ο      χρήστης δώσει τιμή, το σύστημα θα αναγνώσει και θα χρησιμοποιήσει την τιμή      αυτή.</li><li
class="MsoNormal" style="text-align: justify;">Αν ο      χρήστης δε δώσει τιμή, το σύστημα θα χρησιμοποιήσει την τιμή που έχει      οριστεί ως προεπιλογή.</li></ul><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Στην πράξη αυτό συμβαίνει ως εξής:</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal"><span
lang="EN-US">def dbConnect(username, password, database, server=&#8217;localhost&#8217;, port=&#8217;3306&#8242;):</span></p><p
class="MsoNormal"><span
lang="EN-US"><span> </span>print</span><span>(&#8216;Το </span><span
lang="EN-US">string</span><span> σύνδεσης για την </span><span
lang="EN-US">MySQL</span><span> είναι: &#8216;)</span></p><p
class="MsoNormal"><span><span> </span></span><span
lang="EN-US">print</span><span>()</span></p><p
class="MsoNormal"><span><span> </span></span><span
lang="EN-US">print</span><span>(&#8216;</span><span
lang="EN-US">driver</span><span>={</span><span
lang="EN-US">MySQL</span><span>};</span><span
lang="EN-US">server</span><span>=&#8217; + </span><span
lang="EN-US">server</span><span> + &#8216;:</span><span
lang="EN-US">port</span><span>=&#8217; + </span><span
lang="EN-US">port</span><span> + &#8216;;</span><span
lang="EN-US">uid</span><span>=&#8217; + </span><span
lang="EN-US">username</span><span> + &#8216;;</span><span
lang="EN-US">pwd</span><span>=&#8217; + </span><span
lang="EN-US">password</span><span> + &#8216;;</span><span
lang="EN-US">database</span><span>=&#8217; + </span><span
lang="EN-US">database</span><span> + &#8216;;&#8217;)</span><span
lang="EN-US"></span></p><p
class="MsoNormal" style="text-align: justify;"><strong><em><span>?:</span></em></strong><em><span> Η συνάρτηση </span></em><em><span
lang="EN-US">dbConnect</span></em><em><span> αναλαμβάνει να κατασκευάσει ενα </span></em><em><span
lang="EN-US">MySQL</span></em><em><span
lang="EN-US"> </span></em><em><span
lang="EN-US">connection</span></em><em><span
lang="EN-US"> </span></em><em><span
lang="EN-US">string</span></em><em><span> ζητώντας μια σειρά από παραμέτρους από τον χρήστη. Όπως εύκολα μπορεί να δει κανείς, κάποιες από τις παραμέτρους έχουν λάβει προεπιλεγμένες τιμές.</span></em></p><p
class="MsoNormal" style="text-align: justify;"><em> </em></p><p
class="MsoNormal" style="text-align: justify;">Το σώμα της συνάρτησης δεν περιλαμβάνει κάτι διαστημικό. Δομεί ένα αλφαριθμητικό με βάση τις τιμές που παίρνει σαν παραμέτρους και το τυπώνει στην οθόνη. Η αξία του παραδείγματος στην πραγματικότητα έγκειται στην λίστα των παραμέτρων. Ας δούμε μερικά παραδείγματα<span> </span>χρήσης για να αποσαφηνίσουμε την κατάσταση:</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">dbConnect(&#8216;akritiko&#8217;, &#8217;123456&#8242;, &#8216;myDB&#8217;, &#8217;127.0.0.1&#8242;, &#8217;3333&#8242;)</span></p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Εδώ, κατά την κλήση της συνάρτησης, δίνονται τιμές για όλες τις παραμέτρους της. Σε αυτήν την περίπτωση η <span
lang="EN-US">Python</span><span
lang="EN-US"> </span>θα αγνοήσει τελείως τις προεπιλεγμένες τιμές.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">dbConnect(&#8216;akritiko&#8217;, &#8217;123456&#8242;, &#8216;myDB&#8217;, &#8217;127.0.0.1&#8242;)</span></p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Εδώ, κατά την κλήση της συνάρτησης, δίνονται τιμές για κάποιες μόνον από τις παραμέτρους της. Σε αυτήν την περίπτωση η <span
lang="EN-US">Python</span><span
lang="EN-US"> </span>θα αγνοήσει τις προεπιλεγμένες τιμές για τις παραμέτρους για τις οποίες δίδονται τιμές κατά την κλήση της και θα χρησιμοποιήσει τις προεπιλεγμένες για τις υπόλοιπες.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">dbConnect(&#8216;akritiko&#8217;, &#8217;123456&#8242;, &#8216;myDB&#8217;)</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Εδώ, κατά την κλήση της συνάρτησης, δίνονται τιμές μόνον για τις παραμέτρους που δεν έχουν προεπιλεγμένες τιμές. Όπως και πάνω, για τις παραμέτρους για τις οποίες δεν δίνονται τιμές, θα χρησιμοποιηθούν οι προεπιλεγμένες.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">dbConnect(&#8216;akritiko&#8217;, &#8217;123456&#8242;, &#8216;myDB&#8217;, port = &#8217;3333&#8242;)</span></p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Εδώ, κατά την κλήση της συνάρτησης, θέλουμε να δώσουμε τιμή, εκτός των παραμέτρων που δεν έχουν προεπιλεγμένες τιμές και στην παράμετρο <span
lang="EN-US">port</span>. Είναι προφανές ότι αν γράφαμε</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">dbConnect(&#8216;akritiko&#8217;, &#8217;123456&#8242;, &#8216;myDB&#8217;, &#8217;3333&#8242;)</span></p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">η τιμή 3333 θα καταχωρούνταν στην παράμετρο <span
lang="EN-US">server</span><span
lang="EN-US"> </span>εφόσον προηγείται της <span
lang="EN-US">port</span>. Επομένως θα πρέπει με κάποιον τρόπο να δώσουμε στην <span
lang="EN-US">Python</span><span
lang="EN-US"> </span>να καταλάβει για ποια παράμετρο μιλάμε. Αυτό συμβαίνει χρησιμοποιώντας τη λέξη κλειδί (<span
lang="EN-US">keyword</span>) της παραμέτρου, που στην προκειμένη περίπτωση είναι το <span
lang="EN-US">port</span>, στη συνέχεια τον τελεστή ‘=’ και τέλος την επιθυμητή τιμή.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><strong>Προεπιλεγμένες τιμές και δυναμικά εξελισσόμενες παράμετροι</strong></p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Είδαμε τι συμβαίνει με τις προεπιλεγμένες τιμές στις παραμέτρους – ορίσματα μιας συνάρτησης. Τι συμβαίνει όμως αν οι παράμετροι αυτοί είναι περισσότεροι πολύπλοκες (ως τύποι;). Ας ρίξουμε μια ματιά στον παρακάτω κώδικα:</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">def wishlist(item, Wishlist=[]):</span></p><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US"><span> </span>Wishlist.append(item)</span></p><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US"><span> </span></span>return Wishlist</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Πρόκειται για μια συνάρτηση η οποία προσθέτει αντικείμενα σε μία <span
lang="EN-US">Wishlist</span><span
lang="EN-US"> </span>(λειτουργία που μπορείτε να βρείτε – σε μία ομολογουμένως πιο εξεζητημένη υλοποίηση :<span
lang="EN-US">P</span><span
lang="EN-US"> </span>– στο <span
lang="EN-US">Amazon</span>.<span
lang="EN-US">com</span>). Εν ολίγοις ο κώδικας απλά παίρνει σαν παραμέτρους το αντικείμενο (<span
lang="EN-US">item</span>) και την λίστα (<span
lang="EN-US">Wishlist</span>) και κάθε φορά που εκτελείται συμπεριλαμβάνει το εκάστοτε αντικείμενο στην λίστα.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><strong><em>?: </em></strong><em>Παρατηρήστε ότι η </em><em><span
lang="EN-US">Wishlist</span><span
lang="EN-US"> </span>έχει προεπιλεγμένη τιμή την κενή λίστα ( [] ). </em></p><p
class="MsoNormal" style="text-align: justify;"><em><span
lang="EN-US"> </span></em></p><p
class="MsoNormal" style="text-align: justify;">Ας δούμε τώρα μια σειρά εκτελέσεων:</p><p
class="MsoNormal" style="text-align: justify;"><ol
style="margin-top: 0cm;" type="1"><li
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">print(wishlist(&#8216;Nokia N8&#8242;))</span></li><li
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">print(wishlist(&#8216;Harry Potter      and the Deathly Hallows&#8217;))</span></li><li
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">print(wishlist(&#8216;Monty Python      and The Holy Grail Blu-Ray Edition&#8217;)) </span></li></ol><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US"> </span></p><p
class="MsoNormal" style="text-align: justify;">Σε κάθε εκτέλεση η λίστα διαμορφώνεται ως ακολούθως</p><p
class="MsoNormal" style="text-align: justify;"><ol
style="margin-top: 0cm;" type="1"><li
class="MsoNormal" style="text-align: justify;">[<span
lang="EN-US">'Nokia N8'</span>]</li><li
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">['Nokia N8', 'Harry Potter and      the Deathly Hallows']</span></li><li
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">['Nokia N8', 'Harry Potter and      the Deathly Hallows', 'Monty Python and The Holy Grail Blu-Ray Edition']</span></li></ol><p
class="MsoNormal" style="text-align: justify;">Παρατηρούμε λοιπόν ότι παρόλο που η λίστα έχει σαν προεπιλεγμένη τιμή την κενή λίστα καθώς συμβαίνουν διαδοχικές εκτελέσεις τα αντικείμενα προστίθενται κανονικά. Αυτό συμβαίνει γιατί η προεπιλεγμένη τιμή ισχύει μόνον για την πρώτη εκτέλεση.</p><p
class="MsoNormal" style="text-align: justify;">Επιπλέον, αξίζει να σημειωθεί ότι παρότι σε κάθε κλήση εκτελείται εκ νέου η συνάρτηση, η κατάσταση της λίστας διατηρείται. Καταλαβαίνουμε λοιπόν ότι η φύση των δυναμικών παραμέτρων δεν επηρεάζεται από τις προεπιλεγμένες τιμές.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Στο επόμενο άρθρο θα κλείσουμε το κεφάλαιο των συναρτήσεων σε <span
lang="EN-US">Python</span>. Μείνετε συντονισμένοι γιατί το τρίτο μέρος του οδηγού σχετικά με συναρτήσεις στην <span
lang="EN-US">Python</span><span
lang="EN-US"> </span>πρόκειται να συνοδεύεται από πρακτικές καλής συγγραφής συναρτήσεων.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Μέχρι την ερχόμενη φορά λοιπόν…</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><em><span
style="text-decoration: underline;">να είστε καλά και να φροντίζεται τον εαυτό σας</span></em>.</p></div> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/python-part-6b/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>GreekTuts v3.0</title><link>http://greektuts.net/greektuts-v3-0/</link> <comments>http://greektuts.net/greektuts-v3-0/#comments</comments> <pubDate>Wed, 07 Jul 2010 07:27:45 +0000</pubDate> <dc:creator>Pantso</dc:creator> <category><![CDATA[Νέα]]></category> <category><![CDATA[design]]></category> <category><![CDATA[greek]]></category> <category><![CDATA[greektuts]]></category> <category><![CDATA[tutorials]]></category> <category><![CDATA[tuts]]></category> <category><![CDATA[version 3]]></category> <category><![CDATA[web design]]></category> <category><![CDATA[web development]]></category> <category><![CDATA[Άρθρα]]></category> <category><![CDATA[βοηθήματα]]></category> <category><![CDATA[έκδοση 3]]></category> <category><![CDATA[ελληνικά βοηθήματα]]></category> <category><![CDATA[επανασχεδιασμός]]></category> <category><![CDATA[νέα έκδοση]]></category> <category><![CDATA[Προγραμματισμός]]></category> <category><![CDATA[προσθήκες]]></category> <category><![CDATA[τεχνολογία]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=4030</guid> <description><![CDATA[Με τον ερχομό της πολυαναμενόμενης νέας έκδοσης του WordPress, αλλά και μετά από πάνω από 1 χρόνο λειτουργίας, το GreekTuts περνάει στην 3η έκδοση του. Σταδιακά λοιπόν, και μέχρι το τέλος του Ιουλίου όπου και θα πραγματοποιηθεί η αναβάθμιση, σε αυτό εδώ το άρθρο θα παρουσιάζουμε σιγά σιγά τις αλλαγές τόσο σε design όσο και σε λειτουργίες. Μείνετε μαζί μας, σε αυτό το ταξίδι μας...]]></description> <content:encoded><![CDATA[<h1>Νέα Χαρακτηριστικά</h1><p>Με το πέρας του καιρού, και έχοντας πλέον στις πλάτες μας <a
href="http://greektuts.net/1-year-greektuts-birthday/" target="_blank">πάνω από έναν χρόνο</a>, βλέπουμε τις ανάγκες των αναγνωστών μας να αυξάνονται, και πλέον πιο σίγουροι από ποτέ, μπορούμε να έχουμε μια πιο πλήρη άποψη για το τι μας λείπει και τι χρειαζόμαστε, ώστε να είμαστε πάντα στην κορυφή. Εμείς θα σας αποκαλύψουμε κάποια από τα νέα χαρακτηριστικά που θα έχει η τρίτη έκδοση του GreekTuts, αλλά θα σας κρατήσουμε και μερικά για έκπληξη. Μια σύντομη λίστα λοιπόν με τις νέες προσθήκες στο GreekTuts:</p><ul><li>Redesign &#8211; Πλήρης επανασχεδιασμός του look και της δομής της ιστοσελίδας</li><li>Επιστροφή του forum</li><li>Επανασχεδιασμός σχολίων, για πιο εύκολη συζήτηση πάνω στα άρθρα</li><li>Νέα περιοχή μελών, με άμεση πρόσβαση σε όλα τα αρχεία</li><li>Επανασχεδιασμός προσωπικής σελίδας συντακτών</li><li>Αλλά και πολλά άλλα&#8230;</li></ul><h1>Blast to the Past</h1><p>Ας θυμηθούμε όμως πώς ήταν το GreekTuts όταν άνοιξε. Ακολουθεί μια φωτογραφία, από το περιοδικό <a
href="http://greektuts.net/june-pcmagazine/" target="_blank">PCMagazine</a>, το οποίο μας έχει κάνει την τιμή να αναφερθεί σε εμάς, τόσο στην έντυπη όσο και στην διαδικτυακή μορφή του.</p><blockquote><p
style="text-align: center;"><a
href="http://static.greektuts.net/uploads/2009/06/pcmag.png"><img
class="aligncenter" title="GreekTuts v1.0" src="http://static.greektuts.net/uploads/2009/06/pcmag.png" alt="GreekTuts v1.0" width="420" height="590" /></a></p></blockquote><h1>Previews</h1><p>Κατά την διάρκεια του Ιουλίου, και μέχρι το τέλος του, θα αποκαλύπτονται εβδομάδα με την εβδομάδα screenshots από την νέα έκδοση του GreekTuts&#8230;</p><h2>Κεντρική Σελίδα</h2><blockquote><p
style="text-align: center;"><img
class="alignnone size-full wp-image-4147" src="http://static.greektuts.net/uploads3/2010/07/gtv32.jpg" alt="" width="580" height="288" /></p></blockquote><h2>Άρθρο σε Πλήρη Ανάπτυξη</h2><blockquote><blockquote><p
style="text-align: center;"><img
class="aligncenter" src="http://static.greektuts.net/uploads3/2010/07/gtv31.jpg" alt="" width="580" height="288" /></p></blockquote></blockquote><h2>Στατική Σελίδα</h2><blockquote><p
style="text-align: center;"><img
class="aligncenter" src="../wp-content/uploads3/2010/07/gtv3preview.jpg" alt="" width="580" height="450" /></p></blockquote><h2>Σελίδα Επικοινωνίας</h2><blockquote><p
style="text-align: center;"><img
class="aligncenter" src="../wp-content/uploads3/2010/07/gtv3preview.jpg" alt="" width="580" height="450" /></p></blockquote> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/greektuts-v3-0/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Μαθαίνοντας Python – Μέρος 6α</title><link>http://greektuts.net/python-part-6a/</link> <comments>http://greektuts.net/python-part-6a/#comments</comments> <pubDate>Tue, 08 Jun 2010 06:30:58 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[krap]]></category> <category><![CDATA[απόστολος]]></category> <category><![CDATA[απόστολος κρητικός]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=3928</guid> <description><![CDATA[Μετά από απουσία αρκετών μηνών, ήρθε η στιγμή να συνεχίσουμε το οδοιπορικό μας στην γλώσσα Python περνώντας πια σε προχωρημένα θέματα. Στο σημερινό μας άρθρο θα μιλήσουμε για συναρτήσεις (functions).]]></description> <content:encoded><![CDATA[<p>Οι συναρτήσεις αποτελούν χαρακτηριστικό κλειδί σε πολλές γλώσσες προγραμματισμού. Δεν θα μπορούσαν λοιπόν να απουσιάζουν και από την Python. Μία συνάρτηση στο προγραμματισμό λειτουργεί αντίστοιχα με μια μαθηματική συνάρτηση με μόνη (ίσως) διαφορά ότι στις προγραμματιστικές συναρτήσεις το αποτέλεσμα των συναρτήσεων <span
style="text-decoration: underline;">μπορεί να επιστραφεί (με τη μορφή κάποιου αντικειμένου) ή όχι</span>.</p><p>Στο τέλος του οδηγού θα μπορούμε:</p><ul><li>Να ορίσουμε συναρτήσεις με σταθερές τιμές παραμέτρων</li><li>Να ορίσουμε συναρτήσεις με παραμέτρους που αποτελούν λέξεις &#8211; κλειδιά</li><li>Να ορίσουμε συναρτήσεις με λίστες για παραμέτρους</li><li>Να δημιουργήσουμε ανώνυμες συναρτήσεις τύπου lambda</li><li>Να τεκμηριώνουμε σωστά τις συναρτήσεις μας</li></ul><p>Για την καλύτερη κατανόηση αυτού του αντικειμένου ο συγκεκριμένος οδηγός χωρίστηκε σε δύο τμήματα…</p><h1>Προαπαιτούμενα</h1><p><strong> </strong></p><p>Μαθαίνοντας Python:  <a
href="../archives/1571">Μέρος Ι</a>, <a
href="../archives/1713">Μέρος  ΙΙ</a>, <a
href="../archives/1838">Μέρος ΙΙΙ</a>, <a
href="../archives/1930">Μέρος IV</a>, <a
href="../python-part5/">Μέρος V</a></p><h1>Πριν ξεκινήσουμε…</h1><p><strong> </strong></p><p>… θα ήθελα να επισημάνω ένα – δύο πρακτικά ζητήματα.</p><p>Στη συνέχεια παρουσιάζεται ο τρόπος για να επιτευχθούν οι στόχοι που περιγράψαμε στην εισαγωγή. Θα παρατηρήσετε ότι το άρθρο ακολουθεί τη δομή:</p><p><em>Μικρή περιγραφή του τι θέλουμε να επιτύχουμε (+ επιπλέον σχόλια)</em></p><p><em>Παράδειγμα κώδικα</em></p><p>Στο τέλος του αρχείου θα βρείτε συνημμένο ένα python script που περιέχει συγκεντρωμένα όλα τα παραδείγματα.</p><p>Για να τα χρησιμοποιήσετε, αντιγράφετε το εκάστοτε παράδειγμα σε ένα νέο αρχείο python και το εκτελείτε (βλ. <a
title="Permanent Link to Μαθαίνοντας Python – Μέρος 1ο" href="../archives/1571">Μαθαίνοντας Python – Μέρος 1ο</a> ). Τα παραδείγματα είναι φτιαγμένα με τέτοιον τρόπο ώστε να τυπώνουν τα αποτελέσματα στην οθόνη ώστε να μπορείτε να πιστοποιήσετε εύκολα τη λειτουργικότητά τους. Για διευκόλυνσή σας έχουμε χωρίσει τα παραδείγματα με σχόλια που δίνουν μια μικρή περιγραφή του τι επιχειρούμε κάθε φορά.</p><p>Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</p><h1>Συντάσσοντας μια συνάρτηση</h1><pre name="code" class="python">
def triangle_area(a, b):
area = a * b / 2
print("Το εμβαδό του τριγώνου είναι:", area)
</pre><p>Παραπάνω μπορείτε να δείτε την βασική δήλωση της συνάρτησης υπολογισμού του εμβασδού τριγώνου. Αρχικά δηλώνουμε τη συνάρτηση χρησιμοποιώντας την δεσμευμένη λέξη def ακολουθούμενη από το όνομα της συνάρτησης (στην προκειμένη περίπτωση triangle_area). Σε παρένθεση τοποθετούνται οι απαιτούμενες παράμετροι (a, b) που στην προκειμένη περίπτωση υποδηλώνουν την βάση και το ύψος του τριγώνου αντίστοιχα). Στη συνέχεια μια νέα μεταβλητή ορίζεται, η μεταβλητή area, στην οποία θα ανατεθεί το αποτέλεσμα της φόρμουλας υπολογισμού του εμβαδού του τριγώνου (βάση * ύψος / 2). Τέλος η συνάρτηση αναλαμβάνει να εκτυπώσει το αποτέλεσμα στην οθόνη.</p><p><strong> </strong></p><h1>Κλήση συνάρτησης</h1><p><strong> </strong></p><p>Η κλήση μιας συνάρτησης σε Python γίνεται γράφοντας απλά το όνομα της συνάρτησης και περικλείοντας μέσα σε παρένθεση τις τιμές των παραμέτρων (εφόσον χρειάζεται). Έτσι για να χρησιμοποιήσουμε την συνάρτηση που ορίσαμε λίγο νωρίτερα χρησιμοποιούμε την παρακάτω γραμμή κώδικα.</p><pre name="code" class="python">
triangle_area(66, 2010)
</pre><p>Προφανώς η ύπαρξη παραμέτρων σε μία συνάρτηση δεν είναι υποχρεωτική. Ας δούμε μαζί την δήλωση της παρακάτω απλής συνάρτησης που τυπώνει ένα συγκεκριμένο μήνυμα στην κονσόλα όταν κληθεί:</p><pre name="code" class="python">
def no_params_function():
print("Αυτή η συνάρτηση δε δέχεται παραμέτρους...")
</pre><p>Όπως παρατηρείτε η παρένθεση δεν περιέχει τίποτε, δηλαδή δεν έχουν δηλωθεί παράμετροι. Η κλήση αυτής της συνάρτησης γίνεται ως εξής…</p><pre name="code" class="python">
no_params_function()
</pre><p>και όπως θα δείτε αν το δοκιμάσετε, δουλεύει άψογα παρόλη την απουσία των παραμέτρων.</p><p><strong> </strong></p><h1>Αναθέτοντας μια συνάρτηση σε μια μεταβλητή</h1><p><strong> </strong></p><p>Ναι! Είναι εφικτό. Στην Python μια συνάρτηση μπορεί να ανατεθεί σε μια μεταβλητή (ακόμη ένα σημείο που υποδηλώνει τη δύναμη της συγκεκριμένης γλώσσας προγραμματισμού.</p><pre name="code" class="python">
aVariable = triangle_area
aVariable(5,8)
</pre><p>Αν τρέξετε τον παραπάνω κώδικα θα διαπιστώσετε ότι θα πάρετε τα ίδια αποτελέσματα με αυτά που θα παίρνατε αν χρησιμοποιούσατε την αρχική συνάρτηση triangle_area(x,y) που δημιουργήσαμε νωρίτερα. Ας δούμε όμως αναλυτικότερα τις δύο αυτές γραμμές.</p><p>Στην πρώτη γραμμή αναθέτουμε την συνάρτησή μας στην μεταβλητή aVariable. Δώστε προσοχή στην απουσία παραμέτρων. Αυτό συμβαίνει γιατί δεν θέλουμε να γίνει ανάθεση της συνάρτησής μας για δύο συγκεκριμένες τιμές αλλά του μηχανισμού της.</p><p>Έτσι, στην δεύτερη γραμμή, συμπεριφερόμαστε στην μεταβλητή aVariable σαν να είναι η συνάρτησή μας. Για αυτόν τον λόγο και η το όνομα της μεταβλητής μας ακολουθείται από την παρένθεση με τις παραμέτρους που θα ορίζαμε αν τρέχαμε την αρχική μας συνάρτηση. Δοκιμάστε το και θα διαπιστώσετε ότι το αποτέλεσμα είναι σωστό.</p><h1>Επιστροφή του αποτελέσματος αντί για εκτύπωση</h1><p><strong> </strong></p><p>Ας δούμε άλλη μια εκδοχή της αγαπημένης μας συνάρτησης υπολογισμού του εμβαδού τριγώνου J.</p><pre name="code" class="python">
def triangle_area_return(a, b):
area = a * b / 2
return area
</pre><p>Σε αυτήν την εκδοχή της συνάρτησής μας ο προσεκτικός αναγνώστης παρατηρεί (εκτός από το διαφορετικό όνομα της συνάρτησης) μία ακόμη σημαντική διαφορά. Αντί για τη γραμμή εκτύπωσης του αποτελέσματος, χρησιμοποιούμε την δεσμευμένη λέξη return. Αυτή η αλλαγή έχει σαν αποτέλεσμα η τιμή του αποτελέσματος <span
style="text-decoration: underline;">να επιστρέφεται αντί να εκτυπώνεται</span>.</p><p>Έτσι, αν θέλουμε να εμφανίσουμε το αποτέλεσμα της συνάρτησης αυτής θα πρέπει να εκτελέσουμε την παρακάτω γραμμή κώδικα:</p><pre name="code" class="python">
print( triangle_area_return( 5, 5 ) )
</pre><p>Δοκιμάστε να εκτελέσετε την ίδια γραμμή χωρίς να περικλείεται από την εντολή print( ) και θα διαπιστώσετε ότι τίποτε δε συμβαίνει.</p><p><strong> </strong></p><h1>Πως το χρησιμοποιώ πραγματικά;</h1><p><strong> </strong></p><p>Οι συναρτήσεις χρησιμοποιούνται συνήθως για να υλοποιούν συχνά χρησιμοποιούμενες διαδικασίες. Πολύ συχνά το αποτέλεσμα μιας συνάρτησης χρειάζεται να τροφοδοτήσει μία άλλη. Αυτό επιτυγχάνεται με τη χρήση της return. Ας το δούμε στην πράξη:</p><p>Υπενθυμίζω την τελευταία έκδοση της συνάρτησής μας:</p><pre name="code" class="python">
def triangle_area_return(a, b):
area = a * b / 2
return area
</pre><p>Δημιουργούμε μία δεύτερη, πολύ απλή συνάρτηση η οποία λαμβάνει στην είσοδο ένα εμβαδό και τυπώνει ένα ειδικά διαμορφωμένο μήνυμα…</p><pre name="code" class="python">
def print_triangle_area_return(data):
print("Το εμβαδό του τριγώνου που διάβασα είναι:", data)
</pre><p>…στην τιμή myData ανατίθεται το αποτέλεσμα της συνάρτησης υπολογισμού του εμβαδού…</p><pre name="code" class="python">
myData = triangle_area_return(2, 155)
</pre><p>…τέλος τροφοδοτούμε το περιεχόμενο του myData στην συνάρτηση εκτύπωσης:</p><pre name="code" class="python">
print_triangle_area_return(myData)
</pre><p>Σε αυτό το άρθρο πήραμε μία γεύση από τα σημαντικότερα σημεία ορισμού και διαχείρισης συναρτήσεων σε Python. Μείνετε συντονισμένη για τη συνέχεια του οδηγού στον οποίο και θα ολοκληρωθεί το αντικείμενο αυτό.</p><p>Μέχρι τότε,</p><p><em><span
style="text-decoration: underline;">να είστε καλά και να φροντίζεται τον εαυτό σας</span></em>.</p><p><strong><p
style="text-align: center; font-weight: bold;"><br><img
src="http://greektuts.net/images/GTMemberAccess.png" alt="Member Area" /> <br>Άν είστε ήδη συνδρομητής κάντε login με τα στοιχεία σας. Για να γίνετε συνδρομητής πατήστε <a
href="/wp-login.php?action=register">εδώ</a></p></strong></p> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/python-part-6a/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Εισαγωγή στην ASP</title><link>http://greektuts.net/introduction-to-asp/</link> <comments>http://greektuts.net/introduction-to-asp/#comments</comments> <pubDate>Tue, 01 Jun 2010 06:30:14 +0000</pubDate> <dc:creator>Pantso</dc:creator> <category><![CDATA[ASP]]></category> <category><![CDATA[active server pages]]></category> <category><![CDATA[Γλώσσα]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=3900</guid> <description><![CDATA[Σε αυτό το βοήθημα θα κάνουμε την εισαγωγή στην γλώσσα προγραμματισμού ιστοσελίδων και διαδικτυακών εφαρμογών, την ASP. Στην εισαγωγή λοιπόν για την γλώσσα αυτή θα δούμε τι είναι η ASP, πως χρησιμοποιείται και τι κάνει, και θα μιλήσουμε για την σύνταξή της και τις διάφορες scripting γλώσσες που εμπεριέχει, ενώ σε αργότερα βοηθήματα θα δούμε περισσότερες λεπτομέριες]]></description> <content:encoded><![CDATA[<h1><strong>Τι Είναι η </strong><strong>ASP</strong></h1><p>Η γλώσσα προγραμματισμού <strong><em>ASP</em></strong><em> (</em><em>Active</em><em> </em><em>Server</em><em> </em><em>Pages</em><em>)</em> έχει το ιδιαίτερο χαρακτηριστικό ότι ο κώδικάς της πρώτα μεταγλωττίζεται στον server και μετά φορτώνεται σαν ένα κανονικό html έγγραφο, χωρίς ο χρήστης να είναι σε θέση να δει τον αρχικό κώδικα. Με την τεχνολογία της ASP μπορούμε να δημιουργήσουμε δυναμικές ιστοσελίδες (dynamic web pages).</p><p>Ανταγωνιστικές της τεχνολογίας ASP είναι η τεχνολογία <strong><em>Php</em></strong><em> (</em><em>HyperText</em><em> </em><em>PreProcessor</em><em>)</em> καθώς και η τεχνολογία <strong><em>CFML</em></strong><em> (</em><em>ColdFusion</em><em> </em><em>Markup</em><em> </em><em>Language</em><em>)</em>.</p><h1><strong>Τι Είναι ένα Αρχείο </strong><strong>ASP</strong><strong> </strong></h1><ul><li>Ένα αρχείο ASP είναι ακριβώς το ίδιο όπως ένα αρχείο HTML.</li><li>Ένα αρχείο ASP μπορεί να περιέχει κείμενο, HTML tags και scripts.</li><li>Τα scripts σ’ ένα αρχείο ASP εκτελούνται στον server.</li><li>Ένα αρχείο ASP έχει την επέκταση <strong><em>.</em></strong><strong><em>asp</em></strong>.</li></ul><p><strong> </strong></p><h1><strong>Πώς Δουλεύει ένα Αρχείο </strong><strong>ASP</strong></h1><ul><li>Όταν ένας φυλλομετρητής ζητάει ένα αρχείο HTML, ο server      επιστρέφει το αρχείο.</li><li>Όταν ένας φυλλομετρητής ζητάει ένα αρχείο ASP, ο server καλεί την ASP.</li><li>Η ASP      διαβάζει το αρχείο ASP και εκτελεί τα scripts που περιέχει.</li><li>Τέλος, το αρχείο ASP επιστρέφεται στον φυλλομετρητή σαν ένα απλό αρχείο HTML.</li></ul><p><strong> </strong></p><h1><strong>Τι Μπορεί να Κάνει η </strong><strong>ASP</strong><strong> για μας</strong></h1><ul><li>Να τροποποιήσει δυναμικά το περιεχόμενο μιας      ιστοσελίδας.</li><li>Να απαντά σε ερωτήσεις χρήστη ή σε δεδομένα      που υποβάλλονται από φόρμες HTML.</li><li>Να έχει πρόσβαση σε δεδομένα ή σε βάσεις      δεδομένων και να επιστρέφει τα αποτελέσματα σ’ έναν φυλλομετρητή.</li><li>Να προσαρμόζει μια ιστοσελίδα ώστε να την      κάνει πιο χρήσιμη στους χρήστες.</li><li>Τα πλεονεκτήματα από την χρήση της ASP αντί για την CGI και την Perl      είναι η απλότητα και η ταχύτητα.</li><li>Παρέχει ασφάλεια εφόσον ο ASP κώδικάς μας δεν μπορεί να ειδωθεί από τον      φυλλομετρητή.</li><li>Εφόσον τα αρχεία ASP επιστρέφονται σαν απλή HTML, μπορούν να ειδωθούν από οποιονδήποτε φυλλομετρητή.</li><li>Ο έξυπνος ASP προγραμματισμός μπορεί να ελαχιστοποιήσει την      κυκλοφορία στο δίκτυο (network traffic).</li></ul><p><strong> </strong></p><h1><strong>Σύνταξη της </strong><strong>ASP</strong></h1><p>Δεν μπορούμε να δούμε τον ASP κώδικα σ’ έναν φυλλομετρητή, αλλά μόνο την έξοδο από την ASP, που είναι απλή HTML. Και αυτό γιατί τα scripts εκτελούνται στον server πριν σταλεί το αποτέλεσμα στον φυλλομετρητή.</p><p><span
style="text-decoration: underline;">Παραδείγματα</span></p><p><strong><em>Εμφάνιση Κειμένου</em></strong></p><p>Πώς να γράψουμε κάποιο κείμενο στο τμήμα &lt;body&gt; του HTML εγγράφου με την ASP.</p><pre name="code" class="html">
&lt;html&gt;
&lt;body&gt;
&lt;%
response.write"Hello World!"
%&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre><p><strong><em>Κείμενο και </em></strong><strong><em>HTML</em></strong><strong><em> </em></strong><strong><em>tags</em></strong></p><p>Πώς να μορφοποιήσουμε το κείμενο με HTML tags.</p><pre name="code" class="html">
&lt;html&gt;
&lt;body&gt;
&lt;%
response.write("&lt;h2&gt; Hello World! &lt;br&gt; Αυτή η πρόταση χρησιμοποιεί
HTML tags για να μορφοποιήσει το κείμενο!
&lt;/h2&gt;")
%&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre><h1><strong>Ο Βασικός Κανόνας Σύνταξης της </strong><strong>ASP</strong></h1><p>Ενα αρχείο ASP περιέχει κανονικά HTML tags, όπως ένα κανονικό αρχείο HTML. Επιπλέον, ένα αρχείο ASP μπορεί να περιέχει server scripts, που περικλείονται από τους οριοθέτες (delimiters) &lt;% και %&gt;. Τα server scripts εκτελούνται στον server και μπορούν να περιέχουν οποιεσδήποτε εκφράσεις, εντολές, διαδικασίες ή τελεστές που είναι έγκυροι για τη γλώσσα συγγραφής που χρησιμοποιούμε.</p><h1><strong>Το Αντικείμενο </strong><strong>Response</strong></h1><p>Η μέθοδος Write του αντικειμένου Response της ASP χρησιμοποιείται για να σταλεί περιεχόμενο (content) στον φυλλομετρητή. Για παράδειγμα, η επόμενη εντολή στέλνει το κείμενο <em>Hello</em><em> </em><em>World</em> στον φυλλομετρητή :</p><pre name="code" class="html">
Response.Write("Hello World")
</pre><p><strong> </strong></p><h1><strong>Η </strong><strong>VBScript</strong></h1><p>Στην ASP μπορούμε να χρησιμοποιήσουμε διάφορες γλώσσες συγγραφής (scripting languages). Η προκαθορισμένη είναι η γλώσσα VBScript, όπως φαίνεται στο επόμενο παράδειγμα :</p><pre name="code" class="html">
&lt;html&gt;
&lt;body&gt;
&lt;%
response.write("Hello World!")
%&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre><p>Το παράδειγμα αυτό χρησιμοποιεί τη συνάρτηση <em>response</em><em>.</em><em>write</em> για να εμφανίσει το μήνυμα <em>Hello</em><em> </em><em>World</em><em>!</em> στο τμήμα &lt;body&gt; του HTML εγγράφου.</p><h1><strong>Η </strong><strong>JavaScript</strong></h1><p>Για να χρησιμοποιήσουμε την JavaScript σαν την προκαθορισμένη γλώσσα συγγραφής, εισάγουμε την εξής εντολή (language specification) στην κορυφή της σελίδας :</p><pre name="code" class="html">
&lt;%@ language="javascript" %&gt;
&lt;html&gt;
&lt;body&gt;
&lt;%
Response.Write("Hello World!")
%&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre><p>Πρέπει να έχουμε υπόψη μας ότι σ’ αντίθεση με την VBScript, η JavaScript ξεχωρίζει τα πεζά από τα κεφαλαία γράμματα (case sensitive). Ετσι, θα πρέπει να γράψουμε τον ASP κώδικα με κεφαλαία ή πεζά γράμματα ανάλογα με τις απαιτήσεις της γλώσσας.</p><p><strong> </strong></p><h1><strong>Αλλες Γλώσσες Συγγραφής (</strong><strong>Scripting</strong><strong> </strong><strong>Languages</strong><strong>)</strong></h1><p>Η ASP δίνεται με τις γλώσσες συγγραφής VBScript και JavaScript. Αν θέλουμε να γράψουμε κώδικα σε μια άλλη γλώσσα, όπως Perl, REXX ή Python, θα πρέπει να εγκαταστήσουμε τις αντίστοιχες μηχανές συγγραφής (scripting engines). Επειδή τα scripts εκτελούνται στον server, ο φυλλομετρητής που ζητάει το αρχείο ASP δεν είναι ανάγκη να υποστηρίζει scripting.</p> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/introduction-to-asp/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>PHP και MySQL</title><link>http://greektuts.net/php-and-mysql/</link> <comments>http://greektuts.net/php-and-mysql/#comments</comments> <pubDate>Tue, 25 May 2010 06:30:10 +0000</pubDate> <dc:creator>cn92</dc:creator> <category><![CDATA[+]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[cnet92]]></category> <category><![CDATA[Nikos]]></category> <category><![CDATA[sql]]></category> <category><![CDATA[Xatzidakis]]></category> <category><![CDATA[βάσεις δεδομένων]]></category> <category><![CDATA[βάση]]></category> <category><![CDATA[δεδομένων]]></category> <category><![CDATA[Νίκος Χατζηδάκης]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=3863</guid> <description><![CDATA[Σε αυτό το πολύ αναλυτικό βοήθημα, από τον Νίκο Χατζηδάκη, θα δούμε πως μπορούμε να χρησιμοποιήσουμε την PHP και να γράψουμε κώδικα και εντολές, ώστε να συνδεθούμε με μία βάση δεδομένων, να προσθέσουμε εγγραφές, να επεξεργαστούμε εγγραφές, και τέλος πως να αφαιρέσουμε και να προβάλουμε τις εγγραφές της.]]></description> <content:encoded><![CDATA[<h1>Σύνδεση με βάση δεδομένων</h1><p>Δημιουργούμε ένα αρχείο dbconn.php με τον παρακάτω κώδικα</p><pre name="code" class="php">
&lt;?php
function dbconnect() {
// Σύνδεση με διακομιστή
$db_connect = mysql_connect("localhost", "db_user", "db_password")
or die ("Αποτυχία σύνδεσης στον διακομιστή");
// Αν χρησιμοποιείτε κωδικοποίηση utf8 και δεν σας εμφανίζει σωστά τα
ελληνικά
// mysql_query("SET NAMES 'utf8'", $db_connect);
// Επιλογή βάσης δεδομένων
$db_select = mysql_select_db("db_name", $db_connect)
or die ("Αποτυχία επιλογής βάσης δεδομένων");
}
?&gt;
</pre><p>Με το παρακάτω, συνδεόμαστε στην mysql</p><pre name="code" class="php">
mysql_connect("localhost", "db_user", "db_password")
</pre><p>Μην ξεχάσετε να αντικαταστήσετε τα localhost ο host της βάσης db_user το όνομα του χρήστη της βάσης db_password ο κωδικός του χρήστη της βάσης db_name το όνομα της βάσης. or die (&#8220;Αποτυχία σύνδεσης στον διακομιστή&#8221;); Αν για κάποιο λόγο παρουσιαστεί πρόβλημα, εμφανίζεται το μήνυμα &#8220;Αποτυχία σύνδεσης στον διακομιστή&#8221;. Κάποιες φορές, όταν η βάση είναι κωδικοποιημένη σε utf8, τα ελληνικά γράμματα εμφανίζονται με ερωτηματικά. Για να το διορθώσουμε, εισάγουμε το παρακάτω:</p><pre name="code" class="php">
mysql_query("SET NAMES 'utf8'", $db_connect);
</pre><p>Τέλος επιλέγουμε το όνομα της βάσης</p><pre name="code" class="php">
$db_select = mysql_select_db("db_name", $db_connect)
</pre><p>Διευκολύνει να έχουμε την παραπάνω συνάρτηση σε ξεχωριστό αρχείο, και όποτε τη χρειαζόμαστε να το εισάγουμε. Έτσι, αν θέλουμε να αλλάξουμε για παράδειγμα τον κωδικό ή τον χρήστη, το κάνουμε σε ένα αρχείο. Για να εισάγουμε το αρχείο της συνάρτησης σε ένα άλλο αρχείο php χρησιμοποιούμε την εντολή include() ως εξής:</p><pre name="code" class="php">
&lt;?php
// Εισαγωγή του αρχείου με την συνάρτηση
include(“dbconn.php”);
// Καλούμε την συνάρτηση
dbconnect();
</pre><h2>ΕΝΤΟΛΕΣ</h2><pre name="code" class="php">
// Αποσύνδεση απο τον διακομιστή
/mysql_close($db_connect);
?&gt;
</pre><p>Αν και δεν είναι απαραίτητο να κάνουμε αποσύνδεση, καλό θα ήταν να μην το ξεχνάμε.</p><h1>Προσθήκη και ενημέρωση εγγραφών σε βάση δεδομένων</h1><p>Έστω ο πίνακας clients (id, name, surname) με το id ρυθμισμένο σε auto_increment ώστε να αυξάνεται μόνο του με κάθε εγγραφή που προσθέτουμε. Αρχικά δημιουργούμε ένα αρχείο add.php ή update.php και καλούμε τη συνάρτηση που δημιουργήσαμε πριν, ώστε να συνδεθούμε στη βάση δεδομένων.</p><pre name="code" class="php">
&lt;?php
// Εισαγωγή του αρχείου με την συνάρτηση
include(“dbconn.php”);
// Καλούμε την συνάρτηση
dbconnect();
…
// Αποσύνδεση απο τον διακομιστή
/mysql_close($db_connect);
?&gt;
</pre><p>Στη συνέχεια με τον παρακάτω κώδικα δηλώνουμε τι θέλουμε να εισάγουμε και που.</p><pre name="code" class="php">
// Προσθήκη δεδομένων
$qAdd = mysql_query("INSERT INTO clients (id, name, surname)
VALUES ('', 'Νίκος', 'Παπανικολάου')") or die
("Παρουσιάστηκε πρόβλημα κατά την εισαγωγή των αρχείων."));
if ($qAdd)
{
echo "Τα δεδομένα προστέθηκαν.";
}
</pre><p>Ενώ με τον παρακάτω τι θέλουμε να αλλάξουμε/επεξεργαστούμε.</p><pre name="code" class="php">
// Ενημέρωση δεδομένων
$qUpdate=mysql_query("UPDATE clients SET name = 'name', surname =
'surname' WHERE id='1' ");
if ($qUpdate)
{
echo "Τα δεδομένα ενημερώθηκαν.";
}
</pre><p>Έτσι το αρχείο add.php παίρνει την παρακάτω μορφή,</p><pre name="code" class="php">
&lt;?php
// Εισαγωγή του αρχείου με την συνάρτηση
include(“dbconn.php”);
// Καλούμε την συνάρτηση
dbconnect();
// Προσθήκη δεδομένων
$qAdd = mysql_query("INSERT INTO clients (id, name, surname)
VALUES ('', 'Νίκος', 'Παπανικολάου')") or die
("Παρουσιάστηκε πρόβλημα κατά την εισαγωγή των αρχείων."));
if ($qAdd)
{
echo "Τα δεδομένα προστέθηκαν.";
}
// Αποσύνδεση απο τον διακομιστή
/mysql_close($db_connect);
?&gt;
</pre><p>Ενώ το update.php την παρακάτω:</p><pre name="code" class="php">
&lt;?php
// Εισαγωγή του αρχείου με την συνάρτηση
include(“dbconn.php”);
// Καλούμε την συνάρτηση
dbconnect();
// Ενημέρωση δεδομένων
$qUpdate=mysql_query("UPDATE clients SET name = 'name', surname =
'surname' WHERE id='1' ");
if ($qUpdate)
{
echo "Τα δεδομένα ενημερώθηκαν.";
}
// Αποσύνδεση απο τον διακομιστή
/mysql_close($db_connect);
?&gt;
</pre><h1>Εμφάνιση εγγραφών από βάση δεδομένων</h1><p>Αρχικά δημιουργούμε ένα αρχείο index.php και καλούμε τη συνάρτηση που δημιουργήσαμε πριν, ώστε να συνδεθούμε στη βάση δεδομένων.</p><pre name="code" class="php">
&lt;?php
// Εισαγωγή του αρχείου με την συνάρτηση
include(“dbconn.php”);
// Καλούμε την συνάρτηση
dbconnect();
…
// Αποσύνδεση απο τον διακομιστή
/mysql_close($db_connect);
?&gt;
</pre><p>Στη συνέχεια με τον παρακάτω κώδικα «τραβάμε» τα αποτελέσματα από την βάση μας.</p><pre name="code" class="php">
// Ερώτημα προς την βάση
$q=mysql_query("SELECT * FROM clients ");
$num = mysql_num_rows($q);
// Αν υπάρχουν αποτελέσματα
if ($num &gt; 0 ) {
$i=0;
while ($i &lt; $num) {
// Δημιουργία σύντομων ονομάτων μεταβλητών
$name = mysql_result($q,$i,"name");
$surname = mysql_result($q,$i,"surname");
// Εκτύπωση μεταβλητών
echo "Όνομα: $name&lt;br /&gt;";
echo "Επώνυμο: $surname &lt;br /&gt;";
// Αν δεν υπάρχουν αποτελέσματα
++$i; } } else { echo "Δεν έχουν καταχωρηθεί δεδομένα για εσάς ακόμα."; }
</pre><p>Έτσι το αρχείο παίρνει την παρακάτω μορφή.</p><pre name="code" class="php">
&lt;?php
// Εισαγωγή του αρχείου με την συνάρτηση
include(“dbconn.php”);
// Καλούμε την συνάρτηση
dbconnect();
// Ερώτημα προς την βάση
$q=mysql_query("SELECT * FROM clients ");
$num = mysql_num_rows($q);
// Αν υπάρχουν αποτελέσματα
if ($num &gt; 0 ) {
$i=0;
while ($i &lt; $num) {
// Δημιουργία σύντομων ονομάτων μεταβλητών
$name = mysql_result($q,$i,"name");
$surname = mysql_result($q,$i,"surname");
// Εκτύπωση μεταβλητών
echo "Όνομα: $name&lt;br /&gt;";
echo "Επώνυμο: $surname &lt;br /&gt;";
// Αν δεν υπάρχουν αποτελέσματα
++$i; } } else { echo "Δεν έχουν καταχωρηθεί δεδομένα για εσάς ακόμα."; }
// Αποσύνδεση απο τον διακομιστή
/mysql_close($db_connect);
?&gt;
</pre><p>Μπορούμε να συμπεριλάβουμε και διάφορα κριτίρια στην αναζήτησή μας, όπως αν το όνομα είναι «Νίκος». Αυτό γίνεται προστέτοντας στο mysql query το WHERE name=’Νίκος’</p><pre name="code" class="php">
$q=mysql_query("SELECT * FROM clients WHERE name=’Νίκος’");
</pre><h1>Διαγραφή εγγραφών από βάση δεδομένων</h1><p>Αρχικά δημιουργούμε ένα αρχείο delete.php και καλούμε τη συνάρτηση που δημιουργήσαμε πριν, ώστε να συνδεθούμε στη βάση δεδομένων.</p><pre name="code" class="php">
&lt;?php
// Εισαγωγή του αρχείου με την συνάρτηση
include(“dbconn.php”);
// Καλούμε την συνάρτηση
dbconnect();
…
// Αποσύνδεση απο τον διακομιστή
/mysql_close($db_connect);
?&gt;
</pre><p>Στη συνέχεια με τον παρακάτω κώδικα δηλώνουμε τι θέλουμε να διαγράψουμε.</p><pre name="code" class="php">
// Αφαίρεση δεδομένων
$qRemove = mysql_query("DELETE FROM clients WHERE id='1' ");
if ($qRemove)
{
echo "Τα δεδομένα αφαιρέθηκαν.";
}
Έτσι το αρχείο παίρνει την παρακάτω μορφή.
&lt;?php
// Εισαγωγή του αρχείου με την συνάρτηση
include(“dbconn.php”);
// Καλούμε την συνάρτηση
dbconnect();
// Αφαίρεση δεδομένων
$qRemove = mysql_query("DELETE FROM clients WHERE id='1' ");
if ($qRemove)
{
echo "Τα δεδομένα αφαιρέθηκαν.";
}
// Αποσύνδεση απο τον διακομιστή
/mysql_close($db_connect);
?&gt;
</pre><p>Στα επόμενα βοηθήματα, θα δημιουργήσουμε φόρμες εισαγωγής, επεξεργασίας, προβολής και διαγραφής εγγραφών, και θα ασχοληθούμε με την επαλήθευση των δεδομένων που μας δίνει ο χρήστης.</p><p><strong><p
style="text-align: center; font-weight: bold;"><br><img
src="http://greektuts.net/images/GTMemberAccess.png" alt="Member Area" /> <br>Άν είστε ήδη συνδρομητής κάντε login με τα στοιχεία σας. Για να γίνετε συνδρομητής πατήστε <a
href="/wp-login.php?action=register">εδώ</a></p></strong></p> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/php-and-mysql/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> </channel> </rss>
