﻿<?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/%ce%b3%ce%bb%cf%8e%cf%83%cf%83%ce%b1-%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%ce%bf%cf%8d/feed/" rel="self" type="application/rss+xml" /><link>http://greektuts.net</link> <description>Ελληνικά Βοηθήματα</description> <lastBuildDate>Mon, 30 Jan 2012 13:52:21 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</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>Μαθαίνοντας 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>Eiσαγωγή στην PHP Μέρος 2</title><link>http://greektuts.net/php-part-2/</link> <comments>http://greektuts.net/php-part-2/#comments</comments> <pubDate>Thu, 13 May 2010 12:01:17 +0000</pubDate> <dc:creator>Pantso</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[άρθρο]]></category> <category><![CDATA[βοήθημα]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[Εισαγωγη στην PHP]]></category> <category><![CDATA[Μέρος 2]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=3723</guid> <description><![CDATA[Στο πρώτο μέρος της εισαγωγής στην PHP κάναμε τα πρώτα μας βήματα σε αυτήν την γλώσσα προγραμματισμού Σε αυτό το άρθρο θα δούμε το δεύτερο μέρος της εισαγωγής στην PHP, συνέχίζοντας από εκεί που είχαμε μείνει. Θα μιλήσουμε για τα Regular Expressions, για την μορφωποίηση των κειμένων, τις παραγράφους και τους υπερσύνδεσμους.]]></description> <content:encoded><![CDATA[<h1>Οι Κανονικές Εκφράσεις (Regular Expressions)</h1><p>Μια κανονική έκφραση (regular expression) είναι ένα κομμάτι (string) κειμένου που περιέχει ειδικούς κωδικούς που του δίνουν τη δυνατότητα να μπορεί να χρησιμοποιηθεί με κάποιες συναρτήσεις της PHP για εντοπισμό και διαχείριση κειμένου. Για να μπορέσουμε να χρησιμοποιήσουμε μια κανονική έκφραση, πρέπει να είμαστε εξοικειωμένοι με τις συναρτήσεις των κανονικών εκφράσεων που υπάρχουν στην PHP. Η ereg() είναι η βασικότερη απ’ αυτές και μπορεί να χρησιμοποιηθεί για να καθορίσουμε αν μια κανονική έκφραση ικανοποιείται από ένα συγκεκριμένο string κειμένου. Ας δούμε τον επόμενο κώδικα :</p><pre name="code" class="php">
$text = "Κανόνες της PHP!";
if (ereg("PHP", $text)) {
echo( '$το κείμενο περιέχει το string "PHP".' );
} else {
echo( '$το κείμενο δεν περιέχει το string "PHP".' );
}
</pre><p>Σ’ αυτό το παράδειγμα, η κανονική έκφραση ικανοποιείται επειδή το string που είναι αποθηκευμένο στη μεταβλητή $text περιέχει το PHP. Ο παραπάνω κώδικας θα εξάγει συνεπώς τα εξής :</p><blockquote><p>$το κείμενο περιέχει το string &#8220;PHP&#8221;.</p></blockquote><p>Δεν πρέπει να ξεχνάμε όταν τα μονά εισαγωγικά αποτρέπουν την PHP από το να εμφανίσει την τιμή της μεταβλητής $text.<br
/> Η eregi() είναι μια συνάρτηση που συμπεριφέρεται σχεδόν παρόμοια με την ereg(), εκτός από το ότι αγνοεί τα πεζά και τα κεφαλαία γράμματα όταν αναζητά ταιριάσματα :</p><pre name="code" class="php">
$text = "Τι είναι η Php;";
if (eregi("PHP", $text)) {
echo( '$το κείμενο περιέχει το string "PHP".' );
} else {
echo( '$το κείμενο δεν περιέχει το string "PHP".' );
}
</pre><p>Αυτό εμφανίζει πάλι το ίδιο μήνυμα :</p><blockquote><p> $το κείμενο περιέχει το string &#8220;PHP&#8221;.</p></blockquote><p>Θα δούμε μερικά παραδείγματα για να μάθουμε τη βασική σύνταξη των κανονικών εκφράσεων. Πρώτα απ’ όλα, το σύμβολο caret () μπορεί να χρησιμοποιηθεί για να δείξει την αρχή ενός string, ενώ το σύμβολο του δολαρίου ($) χρησιμοποιείται για να δείξει το τέλος :</p><blockquote><p>PHP                // Ταιριάζει με το &#8220;What is PHP?&#8221;<br
/> PHP             // Ταιριάζει με το &#8220;PHP rules!&#8221;, όχι με το &#8220;What is PHP?&#8221;<br
/> PHP$              // Ταιριάζει με το &#8220;I love PHP&#8221;, όχι με το &#8220;What is PHP?&#8221;<br
/> PHP$           // Ταιριάζει με το &#8220;PHP&#8221; και τίποτα άλλο</p></blockquote><p>Προφανώς, θα υπάρχουν φορές που θα θέλουμε να χρησιμοποιήσουμε τα σύμβολα ^, $ ή και άλλους ειδικούς χαρακτήρες για να συμπεριλάβουμε τον αντίστοιχο χαρακτήρα στο string αναζήτησης. Για να αφαιρέσουμε το ειδικό νόημα ενός χαρακτήρα, προτάσσουμε τον χαρακτήρα \ (backslash), ως εξής :</p><pre name="code" class="php">
\$\$\$  // Ταιριάζει με το "Show me the $$$!"
</pre><p>Οι αγκύλες μπορούν να χρησιμοποιηθούν για να ορίσουν ένα σύνολο χαρακτήρων που μπορεί να ταιριάξει. Για παράδειγμα, η ακόλουθη κανονική έκφραση ταιριάζει μ’ ένα μόνο από τα ψηφία 1 έως 5.</p><blockquote><p> [12345]   // Ταιριάζει με το &#8220;1&#8243; και το &#8220;3&#8243;, αλλά όχι με το &#8220;a&#8221; ή το &#8220;12&#8243;</p></blockquote><p>Μπορούμε να καθορίσουμε και περιοχές αριθμών ή γραμμάτων.</p><blockquote><p>[1-5]               // Το ίδιο όπως προηγουμένως<br
/> [a-z]               // Ταιριάζει μ’ ένα οποιοδήποτε πεζό γράμμα<br
/> [0-9a-zA-Z]   // Ταιριάζει μ’ ένα οποιοδήποτε γράμμα ή ψηφίο</p></blockquote><p>Οι χαρακτήρες ?, + και * έχουν επίσης ειδικό νόημα. Συγκεκριμένα, το ? σημαίνει ότι ο προηγούμενος χαρακτήρας είναι προαιρετικός, το + σημαίνει έναν ή περισσότερους από τους προηγούμενους χαρακτήρες και το * σημαίνει κανέναν ή έναν από τους προηγούμενους χαρακτήρες.</p><blockquote><p> bana?na        // Ταιριάζει με τα &#8220;banana&#8221; και &#8220;banna&#8221;,<br
/> // αλλά όχι με το &#8220;banaana&#8221;<br
/> bana+na        // Ταιριάζει με τα &#8220;banana&#8221; και &#8220;banaana&#8221;,<br
/> // αλλά όχι με το &#8220;banna&#8221;<br
/> bana*na        // Ταιριάζει με τα &#8220;banna&#8221;, &#8220;banana&#8221; και &#8220;banaaana&#8221;,<br
/> // αλλά όχι με το &#8220;bnana&#8221;<br
/> [a-zA-z]+$  // Ταιριάζει μ’ ένα οποιοδήποτε string που έχει έναν<br
/> // τουλάχιστον χαρακτήρα</p></blockquote><p>Οι παρενθέσεις μπορούν να χρησιμοποιηθούν για να ομαδοποιήσουμε strings και να εφαρμόσουμε τα ?, + ή * σ’ αυτά σαν σύνολο.</p><blockquote><p>ba(na)+na     // Ταιριάζει με τα &#8220;banana&#8221; και &#8220;banananana&#8221;,<br
/> // αλλά όχι με το &#8220;bana&#8221; ή το &#8220;banaana&#8221;</p></blockquote><p>Ακολουθούν μερικοί κωδικοί για να μπορέσουμε να ταιριάξουμε τους ειδικούς χαρακτήρες στις κανονικές εκφράσεις :</p><blockquote><p>\n         // Ταιριάζει μ’ έναν χαρακτήρα νέας γραμμής (newline character)<br
/>          // Ταιριάζει μ’ έναν οποιονδήποτε χαρακτήρα εκτός από τον<br
/> // χαρακτήρα νέας γραμμής<br
/> \r         // Ταιριάζει μ’ έναν χαρακτήρα carriage return<br
/> \t          // Ταιριάζει με τον χαρακτήρα tab</p></blockquote><h1>Αντικατάσταση Strings με Κανονικές Εκφράσεις</h1><p>Χρησιμοποιώντας την ereg() ή την eregi() με τη σύνταξη των κανονικών εκφράσεων που μόλις είδαμε, μπορούμε να εντοπίσουμε εύκολα την παρουσία tags σ’ ένα δεδομένο string κειμένου. Αυτό που πρέπει να κάνουμε, όμως, είναι να σημειώσουμε με ακρίβεια αυτά τα tags και να τα αντικαταστήσουμε με κατάλληλα HTML tags.<br
/> Για να γίνει αυτό, πρέπει να δούμε μερικές ακόμα συναρτήσεις κανονικών εκφράσεων που υπάρχουν στην PHP :</p><pre name="code" class="php">
 ereg_replace()
</pre><pre name="code" class="php">
eregi_ replace().
</pre><p>Η ereg_replace(), σαν την ereg(), δέχεται μια κανονική έκφραση και ένα string κειμένου και προσπαθεί να ταιριάξει την κανονική έκφραση με το string. Επιπλέον, όμως, η ereg_replace() δέχεται ένα δεύτερο string κειμένου και αντικαθιστά κάθε ταίριασμα της κανονικής έκφρασης σ’ αυτό το string. Η σύνταξη της ereg_replace() είναι ως εξής :</p><pre name="code" class="php">
$newstring = ereg_replace(, ,
);
</pre><p>όπου η  είναι η  κανονική έκφραση και το  είναι το string που θα αντικαταστήσει τα ταιριάσματα στην  όπου υπάρχει το<br
/> . Η συνάρτηση επιστρέφει το νέο string που προκύπτει από τη λειτουργία της αντικατάστασης. Στην παραπάνω πρόταση, αυτό απoθηκεύεται στη μεταβλητή $newstring.<br
/> Η eregi_replace(), όπως είναι αναμενόμενο, είναι παρόμοια με την ereg_replace(), εκτός από το ότι δεν ελέγχει τα πεζά/κεφαλαία όταν κάνει αναζήτηση για ταιριάσματα.<br
/> Είμαστε τώρα έτοιμοι να αρχίσουμε να δημιουργούμε τη δική μας προσαρμοσμένη γλώσσα σήμανσης (custom markup language).</p><h1>Έντονο και Πλάγιο Κείμενο</h1><p>Θα ξεκινήσουμε υλοποιώντας tags για να δημιουργήσουμε έντονο και πλάγιο κείμενο. Ας υποθέσουμε ότι θέλουμε το [B] να ξεκινάει το έντονο κείμενο (bold text) και το [EB] να τελειώνει το έντονο κείμενο. Προφανώς, θα πρέπει να αντικαταστήσουμε το [B] με το <strong> και το [EB] με το </strong>.<br
/> Η λειτουργία αυτή αποτελεί μια απλή εφαρμογή της συνάρτησης eregi_replace() :</p><pre name="code" class="php">
$joketext = eregi_replace("\[b]", "<strong>", $joketext);
$joketext = eregi_replace("\[eb]", "</strong>", $joketext);
</pre><p>Εφόσον το [ κανονικά δείχνει την αρχή ενός συνόλου αποδεκτών χαρακτήρων σε μια κανονική έκφραση, τοποθετούμε τον χαρακτήρα \ (backslash) πριν απ’ αυτόν για να αφαιρέσουμε το ειδικό νόημα που έχει. Χωρίς ένα αντίστοιχο [, το ] χάνει το ειδικό νόημα που έχει και δεν χρειάζεται συνεπώς έναν χαρακτήρα backslash, αν και θα μπορούσαμε να τοποθετήσουμε ένα backslash μπροστά του επίσης.<br
/> Παρατηρούμε επίσης, ότι, εφόσον χρησιμοποιούμε τη συνάρτηση eregi_replace(), η οποία δεν ξεχωρίζει τα πεζά από τα κεφαλαία γράμματα (case insensitive), το [B] και το [b] θα εργάζονται σαν tags στη δική μας προσαρμοσμένη γλώσσα σήμανσης (custom markup language).<br
/> Το πλάγιο κείμενο μπορεί να γίνει με τον ίδιο τρόπο :</p><pre name="code" class="php">
$joketext = eregi_replace("\[i]", "<em>", $joketext);
$joketext = eregi_replace("\[ei]", "</em>", $joketext);
</pre><h1>Οι Παράγραφοι</h1><p>Ενώ μπορούμε να δημιουργήσουμε tags για παραγράφους όπως ακριβώς κάναμε για το έντονο και πλάγιο κείμενο, υπάρχει και μια πιο απλή λύση. Εφόσον ο χρήστης θα καταχωρήσει το περιεχόμενο σ’ ένα πεδίο φόρμας (form field) που θα του δίνει τη δυνατότητα να μορφοποιήσει το κείμενο χρησιμοποιώντας το πλήκτρο enter, θα ορίσουμε το linefeed (\n) να δείχνει μια αλλαγή γραμμής (line break) και το διπλό linefeed (\n\n) να δείχνει μια νέα παράγραφο. Φυσικά, εφόσον τα PC&#8217;s παριστάνουν τις νέες γραμμές σαν ένα ζευγάρι του linefeed με το carriage return (\n\r) θα πρέπει πρώτα να αφαιρέσουμε τα carriage returns. Ο κώδικας γι’ όλα αυτά είναι ο εξής :</p><pre name="code" class="php">
// Αφαιρεί τα carriage returns
$joketext = ereg_replace("\r", "", $joketext);
// Χειρισμός των παραγράφων
$joketext = ereg_replace("\n\n", "
", $joketext);
// Χειρισμός των αλλαγών γραμμής (line breaks)
$joketext = ereg_replace("\n", "
", $joketext);
</pre><p>Το κείμενο θα εμφανίζεται τώρα σε παραγράφους όπως θα ανέμενε ο χρήστης και δεν χρειάζεται να μάθει να δημιουργεί προσαρμοσμένα tags για να το κάνει.</p><h1>Οι Υπερσύνδεσμοι (Hyperlinks)</h1><p>Ενώ μπορεί να φανεί ανόητο το να υποστηρίζουμε τους υπερσυνδέσμους (hyperlinks) στο κείμενο των jokes, αυτό το χαρακτηριστικό έχει νόημα σ’ άλλες εφαρμογές. Οι υπερσύνδεσμοι είναι λίγο περισσότερο πολύπλοκοι από την απλή μετατροπή ενός κώδικα σ’ ένα HTML tag. Πρέπει να μπορούμε να εξάγουμε ένα URL όπως και το κείμενο που πρέπει να εμφανίζεται σαν ο σύνδεσμος (link).<br
/> Ένα άλλο χαρακτηριστικό των συναρτήσεων ereg_replace() και eregi_replace() θα φανεί εδώ. Περιβάλλοντας ένα τμήμα της κανονικής έκφρασης με παρενθέσεις, μπορούμε να αποσπάσουμε το αντίστοιχο τμήμα του κειμένου που ταιριάζει και να το χρησιμοποιήσουμε στο string αντικατάστασης με τον κώδικα \\n, όπου το n είναι 1 για το πρώτο τμήμα της κανονικής έκφρασης που βρίσκεται σε παρενθέσεις, 2 για το δεύτερο και έως 9 για το ένατο. Ας δούμε το ακόλουθο παράδειγμα :</p><pre name="code" class="php">
$text = "banana";
$text = eregi_replace("(.*)(nana)", "\\2\\1", $text);
echo($text);               // εμφανίζει "nanaba"
</pre><p>Στο παραπάνω, το \\1 αντικαθίσταται με το ba στο string αντικατάστασης, το οποίο αντιστοιχεί στο (.*) (κανένας ή περισσότεροι χαρακτήρες διάφοροι της νέας γραμμής, new line) στην κανονική έκφραση. Το \\2 αντικαθίσταται με το nana, το οποίο αντιστοιχεί στο (nana) στην κανονική έκφραση.<br
/> Η ίδια αρχή μπορεί να χρησιμοποιηθεί για να δημιουργήσουμε τους υπερσυνδέσμους μας (hyperlinks). Θα ξεκινήσουμε με μια απλή φόρμα ενός link, όπου το κείμενο του link είναι το ίδιο με το URL. Θέλουμε να υποστηρίξουμε την εξής σύνταξη :</p><pre name="code" class="php">
Visit [L]http://www.php.net/[EL].
</pre><p>Ο αντίστοιχος HTML κώδικας είναι ο εξής :</p><pre name="code" class="html">
Visit <a href="http://www.php.net/"> http://www.php.net/ </a>
</pre><p>Πρώτα, χρειαζόμαστε μια κανονική έκφραση που θα ταιριάζει με τους συνδέσμους (links) αυτής της φόρμας, ως εξής :</p><pre name="code" class="php">
\[L][-_./a-zA-Z0-9!&amp;%#?,'=:~]+\[EL]
</pre><p>Ξανά, έχουμε τοποθετήσει backslashes μπροστά από τις αγκύλες στα [L] και [EL] για να δείξουμε ότι θα τα αντιμετωπίσουμε κυριολεκτικά. Χρησιμοποιούμε μετά αγκύλες (square brackets) για να εμφανίσουμε όλους τους χαρακτήρες που θέλουμε να δεχθούμε σαν μέρος του URL. Τοποθετούμε ένα + μετά από τις αγκύλες για να δείξουμε ότι το URL θα αποτελείται από έναν ή περισσότερους χαρακτήρες που παίρνονται από τη λίστα.<br
/> Για να εξάγουμε το link, θα πρέπει να βρούμε το URL και να το εξάγουμε σαν το HREF attribute του tag Α καθώς και σαν το κείμενο του link. Για να βρούμε το URL, περιβάλλουμε το αντίστοιχο τμήμα της κανονικής έκφρασης με παρενθέσεις :</p><pre name="code" class="php">
\[L]([-_./a-zA-Z0-9!&amp;%#?,'=:~]+)\[EL]
</pre><p>Έτσι, κάνουμε τη μετατροπή link με τον εξής κώδικα :</p><pre name="code" class="php">
$joketext = ereg_replace(
"\[L]([-_./a-zA-Z0-9!&amp;%#?,'=:~]+)\[EL]",
"<a href="\">\\1</a>", $joketext);
</pre><p>Έπρεπε να τοποθετήσουμε backslashes μπροστά από τα διπλά εισαγωγικά στον HTML κώδικα για να μην τα μπερδέψει η PHP με τα εισαγωγικά που περιβάλλουν το string αντικατάστασης. Το \\1 αντικαθίσταται με το URL για το link και η έξοδος είναι η αναμενόμενη.<br
/> Θα θέλαμε επίσης να υποστηρίξουμε τα hyperlinks που περιέχουν κείμενο link που διαφέρει από τα δικά τους URL. Ας υποθέσουμε ότι η μορφή του link μας είναι ως εξής :</p><pre name="code" class="php">
Check out [L=http://www.php.net/]PHP[EL].
</pre><p>Ακολουθεί η κανονική έκφραση :</p><pre name="code" class="php">
\[L=([-_./a-zA-Z0-9!&amp;%#?,'=:~]+)]([-_./a-zA-Z0-9 !&amp;%#?,'=:~]+)\[EL]
</pre><p>Το παραπάνω κάνει αυτό ακριβώς που θέλουμε, καθώς βρίσκει και το URL (\\1) και το κείμενο (\\2) για το link. Ο PHP κώδικας για να γίνει η αντικατάσταση είναι ο εξής :</p><pre name="code" class="php">
$joketext = ereg_replace(
"\[L=([-_./a-zA-Z0-9!&amp;%#?,'=:~]+)]".
"([-_./a-zA-Z0-9 !&amp;%#?,'=:~]+)\[EL]",
"<a href="\">\\2</a>", $joketext);
</pre>]]></content:encoded> <wfw:commentRss>http://greektuts.net/php-part-2/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Μαθαίνοντας Python – Μέρος 4ο</title><link>http://greektuts.net/python-part-4/</link> <comments>http://greektuts.net/python-part-4/#comments</comments> <pubDate>Tue, 27 Oct 2009 08:19:26 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[Μαθαίνοντας Python – Μέρος 4ο]]></category> <category><![CDATA[Μέρος 4]]></category> <category><![CDATA[Προγραμματσμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=1930</guid> <description><![CDATA[Σε προηγούμενα βοηθήματα κάναμε την εισαγωγή στην Γλώσσα προγραμματισμού Python, και είδαμε όλα τα βασικά θέματα της γλώσσας Python. Στο σημερινό μας άρθρο θα ασχοληθούμε με τον έλεγχο της ροής των προγραμμάτων σε Python. Αυτό σημαίνει ότι θα μάθουμε να εκτελούμε εντολές υπό συνθήκη αλλά και βρόγχους επαναλήψεων.]]></description> <content:encoded><![CDATA[<p>Στο τέλος του σημερινού οδηγού θα μπορούμε:</p><ul><li>Να εκτελούμε εντολές υπό συνθήκη με την εντολή if</li><li>Να δημιουργούμε βρόγχους επαναλήψεων κάνοντας χρήση των εντολών<ul><li>For</li><li>While</li><li>Να δημιουργούμε ακολουθίες αριθμών με την συνάρτηση range()</li></ul></li></ul><h2><strong>Προαπαιτούμενα</strong></h2><p>Μαθαίνοντας Python:  <a
href="../archives/1571">Μέρος Ι</a>, <a
href="../archives/1713">Μέρος  ΙΙ</a>, <a
href="../archives/1838">Μέρος ΙΙΙ</a></p><h2><strong>Πριν ξεκινήσουμε…</strong></h2><p>… θα ήθελα να επισημάνω ένα – δύο πρακτικά ζητήματα.</p><p>Στη συνέχεια παρουσιάζεται ο τρόπος για να επιτευχθούν οι στόχοι που περιγράψαμε στην εισαγωγή. Θα παρατηρήσετε ότι το άρθρο ακολουθεί τη δομή:</p><blockquote><p><em>Μικρή περιγραφή του τι θέλουμε να επιτύχουμε (+ επιπλέον σχόλια)</em></p><p><em>Παράδειγμα κώδικα</em></p></blockquote><p>Στο τέλος του άρθρου θα βρείτε συνημμένο ένα python script που περιέχει συγκεντρωμένα όλα τα παραδείγματα.</p><p>Για να τα χρησιμοποιήσετε, αντιγράφετε το εκάστοτε παράδειγμα σε ένα νέο αρχείο python και το εκτελείτε (βλ. <a
title="Permanent Link to Μαθαίνοντας Python – Μέρος 1ο" href="../archives/1571">Μαθαίνοντας Python – Μέρος 1ο</a> ). Τα παραδείγματα είναι φτιαγμένα με τέτοιον τρόπο ώστε να τυπώνουν τα αποτελέσματα στην οθόνη ώστε να μπορείτε να πιστοποιήσετε εύκολα τη λειτουργικότητά τους. Για διευκόλυνσή σας έχουμε χωρίσει τα παραδείγματα με σχόλια που δίνουν μια μικρή περιγραφή του τι επιχειρούμε κάθε φορά.</p><p>Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</p><h2><strong>Εντολές υπό συνθήκη</strong></h2><p>Στην Python, όπως και στις περισσότερες γλώσσες υψηλού επιπέδου οι εντολές υπό συνθήκη πραγματοποιούνται κάνοντας χρήση της δήλωσης if.</p><p>Η σύνταξή της είναι η ακόλουθη:</p><pre name="code" class="python">
if συνθήκη1:
    εντολή1
    εντολή2
    …
elif συνθήκη2:
    εντολή3
    εντολή4
    …
else:
    εντολή5
    εντολή6
    …
</pre><p><span
style="text-decoration: underline;">Παρατηρήσεις</span>:</p><ul><li>Το τμήμα if … θα πρέπει να εμφανίζεται αυστηρά μία μόνον φορά σε μια δήλωση if</li><li>Το τμήμα elif… μπορεί να εμφανίζεται καμία, μία, ή περισσότερες φορές</li><li>Το τμήμα else μπορεί να εμφανιστεί καμία ή μία φορά</li><li>Τα τμήματα if και elif πρέπει να ακολουθούνται υποχρεωτικά από μία συνθήκη και το σύμβολο ‘:’</li><li>Το τμήμα else ακολουθείται μόνον από το σύμβολο ‘:’ (χωρίς συνθήκη)</li><li>Οι εντολές στο σώμα<sup>1</sup> κάθε τμήματος πρέπει να εισέχουν ένα tab απόσταση από το αντίστοιχο τμήμα τους (If, elif, else)</li></ul><p>[1] Σώμα ενός τμήματος καλούμε την εντολή ή τις εντολές που αφορούν το τμήμα αυτό. Στην Python ένα σώμα κειμένου διακρίνεται με τις εσοχές. Κάθε σύνολο εντολών που εισέχουν αποτελούν σώμα της αμέσως προηγούμενης γραμμής, που η δήλωσής της ξεκινά μία εσοχή αριστερότερα.</p><p>Ας δούμε ένα παράδειγμα:</p><pre name="code" class="python">
number = int(input("Please enter an integer: "))
if number < 0:
    print("The number is a negative")
elif number > 0:
    print("The number is a positive")
else:
    print("The number is a zero")
</pre><p>Σας υποσχέθηκα ότι από αυτή τη φορά θα αρχίσουμε να γράφουμε mini προγράμματα και διατείνομαι ότι είμαι άνθρωπος που κρατά τον λόγο του. Στον παραπάνω κώδικα η πρώτη γραμμή ζητά έναν ακέραιο αριθμό από τον χρήστη. Επειδή όπως είπαμε η Python δεν έχει τύπους ουσιαστικά ζητούμε από τον χρήστη μια ροή χαρακτήρων με την input(“Please enter an integer: ”) και περικλείουμε την εντολή αυτή στην int( ) ώστε οι χαρακτήρες που δίνει ο χρήστης να μετατραπούν σε ακέραιο. Προφανώς δεν γίνεται κανένας έλεγχος για το αν πράγματι ο χρήστης έδωσε ακέραιο αλλά δεδομένου ότι ο σημερινός οδηγός έχει σαν θέμα τον έλεγχο ροής θα θεωρήσουμε δεδομένο ότι οι τιμές που θα δοθούν θα είναι ακέραιοι (αν θέλετε να δείτε τι γίνεται αν δώσετε κάποια άκυρη τιμή, π.χ. αλφαριθμητικό, δοκιμάστε το, απλά για πειραματισμό).</p><p>Αφότου ο χρήστης δώσει η τιμή, χρησιμοποιώντας μία δήλωση if ελέγχουμε αν η τιμή είναι αρνητική, θετική, ή μηδέν και σε κάθε περίπτωση εμφανίζουμε το αντίστοιχο μήνυμα.</p><h2><strong>Δημιουργία βρόγχων επαναλήψεων (</strong><strong>for)</strong></h2><p>Μία άλλη κλασική προγραμματιστική ανάγκη είναι η δημιουργία βρόγχων, τμημάτων δηλαδή που επαναλαμβάνονται έναν αριθμό Ν φορών , ανάλογα με τις ανάγκες της εκάστοτε εφαρμογής. Η δήλωση for κάνει ακριβώς αυτό.</p><p>Η σύνταξή της είναι η ακόλουθη:</p><pre name="code" class="python">
for μεταβλητή in ακολουθία:
    εντολή1
    εντολή2
    …
</pre><p><span
style="text-decoration: underline;">Παρατηρήσεις</span>:</p><ul><li>Με τον όρο “ακολουθία” στην Python εννοούμε τα αλφαριθμητικά και τις λίστες</li><li>Η “μεταβλητή” μπορεί να ονομάζεται όπως θέλετε και το μόνο που κάνει είναι να παίρνει σαν τιμή, με τη σειρά, την τιμή κάθε ενός από τα στοιχεία που απαρτίζουν την ακολουθία</li></ul><p>Για παράδειγμα:</p><pre name="code" class="python">
fruits = ['apple', 'orange', 'strawbery', 'pineapple', 'cranberries']
for fruit in fruits:
    print(fruit)
</pre><p>Έχουμε την λίστα fruits που αποτελείται από τα στοιχεία που μπορείτε να δείτε στην πρώτη γραμμή του κώδικά μας. Δημιουργούμε ένα for (δηλαδή έναν βρόγχο επανάληψης) στον οποίο η μεταβλητή fruit θα πάρει μία – μία τις τιμές των στοιχείων της λίστας fruits και όπως ορίζει η εντολή στο σώμα της δήλωσης for, θα τις εκτυπώσει. Έτσι το αποτέλεσμά σας θα μοιάζει κάπως έτσι:</p><pre name="code" class="python">
apple
orange
strawbery
pineapple
cranberries
</pre><h2><strong>Δημιουργία βρόγχων επαναλήψεων (</strong><strong>while)</strong></h2><p>Με τον ίδιο ακριβώς τρόπο συντάσσεται δήλωση while.</p><pre name="code" class="python">
while συνθήκη:
    εντολή1
    εντολή2
    …
</pre><p>με τη μόνη διαφορά ότι αντί για μια μεταβλητή που διαβάζει διαδοχικά τα στοιχεία μιας ακολουθίας, εξετάζουμε αν μια συνθήκη επαληθεύεται. Όσο αυτή η συνθήκη είναι αληθής, θα εκτελούνται οι εντολές που βρίσκονται στο σώμα της while. Αν κάποια στιγμή η συνθήκη γίνει ψευδής, ο βρόγχος επαναλήψεων θα τερματιστεί.</p><p>Ας ρίξουμε μια ματιά στον παρακάτω κώδικα:</p><pre name="code" class="python">
number = 500
current, next = 0, 1
while next &lt; number:
    print(current, end=' ')
        current, next = next, current + next
</pre><p>Για όσους δεν τον αναγνώρισαν πρόκειται για τον αλγόριθμο υπολογισμού της ακολουθίας Fibonacci. Στην ακολουθία αυτή τα δύο πρώτα στοιχεία είναι τα 0 και 1 ενώ κάθε επόμενο στοιχείο αποτελεί το άθροισμα των δύο προηγούμενων στοιχείων. Έχουμε δηλαδή:</p><pre name="code" class="python">
0
1
1 + 0 = 1
1 + 1 = 2
3 + 2 = 3
2 + 3 = 5
κλπ.
</pre><p>Στο παράδειγμά μας ορίζουμε σαν όριο τον αριθμό 500 δηλαδή ζητούμε τους αριθμούς Fibonacci που είναι μικρότεροι του 500. Στην δεύτερη γραμμή αναθέτουμε τις τιμές 0, 1 στις μεταβλητές current και next αντιστοίχως.</p><p>Ακολουθεί η δήλωση while στο σώμα της οποίας βρίσκεται ουσιαστικά όλη η ουσία του αλγορίθμου (παραμείνετε ψύχραιμοι, δεν είναι κάτι δύσκολο).</p><p>Όσο η μεταβλητή next είναι μικρότερη από τη μεταβλητή number (το όριο δηλαδή που θέσαμε στην αρχή), εκτελείτε το σώμα του while. Δηλαδή:</p><ul><li>Τυπώνεται ο αριθμός current</li><li>Γίνονται δύο ταυτόχρονες αναθέσεις τιμών<ul><li>Current γίνεται ο αριθμός next</li><li>Ο next παίρνει την τιμή current + next</li></ul></li></ul><p>Αν νιώθετε μπερδεμένοι, είναι λογικό και φταίει η Python για αυτό. Στην Python υπάρχει η «ψυχεδελική» ανάθεση μεταβλητών (π.χ. a, b = 5, 12 ). Οι τιμές όμως των μεταβλητών αλλάζουν πραγματικά από την αμέσως επόμενη εντολή.</p><p>Έτσι, στο παράδειγμα μας τα αποτελέσματα της εντολής current, next = next, current + next θα ισχύσουν από την επόμενη γραμμή κώδικα. Ας παρακολουθήσουμε τώρα κάτι το παρανοϊκό:</p><p>Η μεταβλητή current θα πάρει την τιμή next αφότου τελειώσει η εντολή current, next = next, current + next. Έτσι για την ανάθεση τιμής στην next (που βρίσκεται στην ίδια εντολή) η current έχει ακόμη την παλιά της τιμή.</p><p>Την πρώτη φορά που εισερχόμαστε στο while η μεταβλητή current έχει την τιμή 0 και η next την τιμή 1. Αφότου τυπωθεί 0 (η τιμή της current δηλαδή) η μεταβλητή current ΘΑ πάρει την τιμή την μεταβλητής next. Στην ίδια εντολή η μεταβλητή next θα πάρει την τιμή του αθροίσματος current + next (δηλαδή 0 + 1 αφού η ανάθεση της τιμής στην current δεν έχει ισχύ ακόμη εφόσον δεν άλλαξε η εντολή). Έτσι μετά την εκτέλεση της μυστήριας αυτής ανάθεσης, η μεταβλητή current έχει γίνει 1 και η next (0+1=) 1.</p><p>Για όσους προβληματίστηκαν με την εντολή print(current, end=&#8217; &#8216;), το end=’ ‘ ουσιαστικά επιβάλει τις τιμές να εκτυπώνονται η μία δίπλα στην άλλη διαχωριζόμενες από τον κενό χαρακτήρα ‘ ‘. Αν στην θέση της βάλετε print(current) θα διαπιστώσετε ότι οι τιμές της ακολουθίας Fibonacci σας θα εμφανίζονται κατακόρυφα.</p><h2><strong>Η συνάρτηση </strong><strong>range()</strong></h2><p><strong> </strong>Η συνάρτηση range() δημιουργεί ακολουθίες αριθμών. Έχει διάφορες μορφές:</p><ul><li>range(number) : Δημιουργείται μια ακολουθία αριθμών από το 0 ως την προηγούμενη ακέραια τιμή της μεταβλητής number</li><li>range(from, to) : Δημιουργείται μια ακολουθία αριθμών από την τιμή της μεταβλητής from μέχρι την προηγούμενη ακέραια τιμή της μεταβλητής to</li><li>range(from, to, step) : Δημιουργείται μια ακολουθία αριθμών από την τιμή της μεταβλητής from μέχρι την προηγούμενη ακέραια τιμή της μεταβλητής to με βήμα step.</li></ul><p><span
style="text-decoration: underline;">Στην πράξη</span>:</p><pre name="code" class="python">
for iterator in range(10):
    print(iterator, end=' ')
</pre><p>Θα δώσει σαν αποτέλεσμα: 0 1 2 3 4 5 6 7 8 9</p><pre name="code" class="python">
for iterator in range(4, 10):
    print(iterator, end=' ')
</pre><p>Θα δώσει σαν αποτέλεσμα: 4 5 6 7 8 9</p><pre name="code" class="python">
for iterator in range(1, 11, 2):
    print(iterator, end=' ')
</pre><p>Θα δώσει σαν αποτέλεσμα: 1 3 5 7 9</p><p>Η συνάρτηση range() αν συνδυαστεί με την συνάρτηση len() μπορεί να μας δώσει έναν πολύ ωραίο τρόπο να απαριθμούμε τα αποτελέσματα που τυπώνονται μέσα σε έναν βρόγχο επανάληψης.</p><p>Έχουμε το ακόλουθο πρόγραμμα που τυπώνει στην οθόνη τις 10+2 εντολές αγοράς gadget.</p><pre name="code" class="python">
commandments = ["Thou shalt use a standard plug (preferably USB)",
    "Thou shalt have good battery life",
    "Thou shalt give nothing unneeded in the box, but always give necessary items",
    "Thou shalt offer accessories, or at least help partners to",
    "Thine gadgetry shall make sense",
    "Thou shalt have a reasonable price for the life of thine gadget",
    "Thou shalt not package crap software",
    "Thou shalt allow thine gadgetry to be hacked",
    "Thou shalt make thine gadgetry easy to interface",
    "Thou shalt allow thine gadgetry to be acted upon by standard OS means",
    "Thou shalt not cripple thine feature set",
    "Thou shalt allow thine gadget to do whatever it needs to on its own"]
print("The 10+2 commandments of Geek Gadgetry")
print()
for iterator in range(len(commandments)):
    print(iterator, commandments[iterator])
</pre><p>Δέχομαι την κατηγορία ότι ο ορισμός της λίστας των 10+2 εντολών πιάνει περισσότερο χώρο από το πρόγραμμα αυτό κάθε αυτό (μία δήλωση for των δύο γραμμών) αλλά πρέπει να παραδεχθείτε ότι είναι cool εντολές…</p><p>Μετά λοιπόν τη δήλωση της λίστας και την εκτύπωση ενός τίτλου (για αισθητικούς περισσότερο λόγους) έχουμε την δήλωση for.</p><p>Ο iterator είναι η μεταβλητή που θα πάρει την τιμή των στοιχείων που βρίσκονται μέσα στην λίστα commandments. Ωστόσο αντί να πούμε for iterator in commandments (πράγμα που θα ήταν απόλυτα σωστό) περικλείουμε το commandments σε μία συνάρτηση len() που θα μας επιστρέψει τον αριθμό τον στοιχείων της λίστας commandments. Η len() με τη σειρά της περικλείεται σε μια συνάρτηση range() η οποία θα μας επιστρέψει μια ακολουθία αριθμών με τόσα στοιχεία όσα και αυτά της λίστας commandments.</p><p>Στη συνέχεια η εντολή print τυπώνει:</p><ul><li>Τον αριθμό της θέσης του στοιχείου στη λίστα (0, 1, 2, 3). Υπενθυμίζουμε ότι στην Python η πρώτη θέση πινάκων και λιστών θεωρείται η θέση 0.</li><li>Το στοιχείο που βρίσκεται στην εκάστοτε θέση της λίστας, στην περίπτωσή μας δηλαδή κάθε μία από τις 10 + 2 εντολές.</li></ul><p>Αν όλα πήγαν καλά το αποτέλεσμά σας πρέπει να μοιάζει με το παρακάτω:</p><pre name="code" class="python">
0 Thou shalt use a standard plug (preferably USB)
1 Thou shalt have good battery life
2 Thou shalt give nothing unneeded in the box, but always give necessary items
3 Thou shalt offer accessories, or at least help partners to
4 Thine gadgetry shall make sense
5 Thou shalt have a reasonable price for the life of thine gadget
6 Thou shalt not package crap software
7 Thou shalt allow thine gadgetry to be hacked
8 Thou shalt make thine gadgetry easy to interface
9 Thou shalt allow thine gadgetry to be acted upon by standard OS means
10 Thou shalt not cripple thine feature set
11 Thou shalt allow thine gadget to do whatever it needs to on its own
</pre><p>Σε αυτό το σημείο ο σημερινός μας οδηγός έφθασε στο τέλος του και αισίως έχετε γράψει τα πρώτα σας mini προγράμματα σε Python. Σας αξίζει λοιπόν μία δεύτερη κούπα από τον αγαπημένο σας καφέ ή τσάι. Στον επόμενο οδηγό μας θα ασχοληθούμε με συναρτήσεις στην Python αφού δούμε κάποια συμπληρωματικά στοιχεία σε όσα έχουμε ήδη πει.</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/uploads/2009/10/py_tuts_part_4.rar" target="_blank"><em><strong><img
class="alignnone" src="../wp-content/uploads/2009/10/membersdownload1.png" alt="download" width="200" height="200" /></strong></em></a></p></blockquote> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/python-part-4/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
