﻿<?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; Python</title> <atom:link href="http://greektuts.net/category/programming/python/feed/" rel="self" type="application/rss+xml" /><link>http://greektuts.net</link> <description>Ελληνικά Βοηθήματα</description> <lastBuildDate>Fri, 27 Apr 2012 09:31:40 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.2</generator> <item><title>Μαθαίνοντας Python – Μέρος 7ο (γ)</title><link>http://greektuts.net/python-part7c/</link> <comments>http://greektuts.net/python-part7c/#comments</comments> <pubDate>Thu, 17 Mar 2011 07:51:40 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[krap]]></category> <category><![CDATA[part 7]]></category> <category><![CDATA[απόστολος]]></category> <category><![CDATA[απόστολος κρητικός]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[μέρος 7γ]]></category> <category><![CDATA[μέρος 7ο]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=4800</guid> <description><![CDATA[Συνεχίζοντας το 7ο μέρος του οδηγού μας είμαστε έτοιμοι να δούμε ακόμη μια θεμελιώδη δομή δεδομένων, την ουρά. Για όσους έφθασαν στο άρθρο κατά τύχη, ακολουθεί μικρή περίληψη του αντικειμένου του 7ου μέρους του οδηγού καθώς και μικρή αναφορά στην δομή του άρθρου.]]></description> <content:encoded><![CDATA[<p>Εν γένει, στην συγκεκριμένη κατηγορία εμπίπτουν διάφορα θέματα τα σημαντικότερα από τα οποία συνοψίζονται στα εξής:</p><ul><li>Λίστες      (Lists)</li><li>Πλειάδες      και ακολουθίες (Tuples      &amp; Sequences)</li><li>Σετ (Sets)</li><li>Λεξικά      (Dictionaries)</li></ul><p>Και κάποια εξεζητημένα ζητήματα όπως:</p><ul><li>Τεχνικές      επανάληψης (Looping      Techniques)</li><li>Συνθήκες      επιλογής (Conditions)      – προχωρημένα θέματα –</li></ul><p><strong>Προαπαιτούμενα</strong></p><p><a
href="../../../../../category/programming/python/">Μαθαίνοντας Python</a></p><p><strong>Πριν ξεκινήσουμε…</strong></p><p>… θα ήθελα να επισημάνω ένα – δύο πρακτικά ζητήματα.</p><p>Στη συνέχεια παρουσιάζεται ο τρόπος για να επιτευχθούν οι στόχοι που περιγράψαμε στην εισαγωγή. Θα παρατηρήσετε ότι το άρθρο ακολουθεί τη δομή:</p><div><blockquote><p><em>Μικρή περιγραφή του τι θέλουμε να επιτύχουμε (+ επιπλέον σχόλια)</em></p></blockquote><pre name="code" class="py">
Παράδειγμα κώδικα
</pre></div><p>Για να τα χρησιμοποιήσετε, αντιγράφετε το εκάστοτε παράδειγμα σε ένα νέο αρχείο python και το εκτελείτε (βλ. <a
title="Permanent Link to Μαθαίνοντας Python – Μέρος 1ο" href="../../../../../archives/1571">Μαθαίνοντας Python – Μέρος 1ο</a> ). Τα παραδείγματα είναι φτιαγμένα με τέτοιον τρόπο ώστε να τυπώνουν τα αποτελέσματα στην οθόνη ώστε να μπορείτε να πιστοποιήσετε εύκολα τη λειτουργικότητά τους. Για διευκόλυνσή σας έχουμε χωρίσει τα παραδείγματα με σχόλια που δίνουν μια μικρή περιγραφή του τι επιχειρούμε κάθε φορά.</p><p>Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</p><h1><strong>( ΒΛΕΠΟΝΤΑΣ ΤΙΣ ΛΙΣΤΕΣ ΜΕ «ΑΛΛΟ ΜΑΤΙ» )</strong></h1><p><strong><em> </em></strong></p><p>Στο σημερινό άρθρο θα μας απασχολήσουν πιο προχωρημένα θέματα που έχουν να κάνουν με λίστες.</p><p><span
style="text-decoration: underline;">Χρησιμοποιώντας τις λίστες σαν ουρές</span></p><p>Αδυνατώ να φανταστώ κάποιον αναγνώστη που να μην είναι εξοικειωμένος με την έννοια της ουράς. Αν συμφωνήσουμε ότι αφήνουμε απ’ έξω την έννοια της ουράς ως λειτουργικό τμήμα του σώματος ενός ζώου, μας μένει το στερεότυπο μιας σειράς ανθρώπων που, ο ένας πίσω από τον άλλον περιμένουν κάτι. Να  πάρουν λεφτά από κάποιο μηχάνημα αυτόματης ανάληψης, να εξυπηρετηθούν σε κάποια δημόσια υπηρεσία (!), να πληρώσουν στο ταμείο κάποιου καταστήματος, να πάρουν φαγητό.</p><p>Μια ουρά δηλαδή, είναι ένα σύνολο αντικειμένων στοιχισμένα το ένα πίσω από το άλλο. Κάθε νέο αντικείμενο που προστίθεται στην ουρά καταλαμβάνει την τελευταία θέση (μπαίνει πίσω από κάθε άλλο προϋπάρχον στοιχείο). Επίσης, όταν πάρουμε ένα αντικείμενο από την ουρά, θα  είναι το στοιχείο που βρίσκεται στην πρώτη θέση. Η παραπάνω σκέψη μας οδηγεί στο συμπέρασμα ότι μια ουρά λειτουργεί με τη λογική «το πρώτο στοιχείο που εισάγουμε, είναι το πρώτο που εξάγουμε». Στη βιβλιογραφία αυτή η διαπίστωση και, κατ’ επέκταση η φύση λειτουργίας της ουράς, ως δομή δεδομένων, αναφέρεται ως &#8220;FIRST IN, FIRST OUT&#8221; ή, εν συντομία, “FIFO”.</p><p>Πως το υλοποιούμε σε Python όμως;</p><p>Σε αντίθεση με την δομή δεδομένων της στοίβας, με την οποία ασχοληθήκαμε στο προηγούμενο άρθρο μας, η Python περιλαμβάνει κάποιες εντολές που βολεύουν ιδιαίτερα για την υλοποίηση της ουράς. Ας τις δούμε αναλυτικά:</p><pre name="code" class="py">
&gt;&gt;&gt; from collections import deque
</pre><p>Εδώ χρειάζεται  μια μικρή προσοχή μιας και την παραπάνω εντολή την συναντούμε για πρώτη φορά στον οδηγό μας. Ο αναγνώστης που έχει εμπειρία στον προγραμματισμό αναγνωρίζει απευθείας ότι η παραπάνω εντολή «φορτώνει» μία βιβλιοθήκη, κάνει δηλαδή δυνατή τη χρήση μιας βιβλιοθήκης από το πρόγραμμά μας.</p><blockquote><p><span
style="text-decoration: underline;">TIP</span>: Ο όρος “collections” συναντάται σε πολλές γλώσσες προγραμματισμού. Συνήθως αποτελεί μια συλλογή από δομές δεδομένων υλοποιημένες για την εκάστοτε γλώσσα.</p></blockquote><p>Τώρα που γνωρίζουμε τα παραπάνω μπορούμε εύκολα να αντιληφθούμε ότι η εντολή που μόλις πληκτρολογήσαμε «φορτώνει» από την βιβλιοθήκη «collections» τη δομή «deque» – η οποία αποτελεί προφανώς υλοποίηση της ουράς –.</p><p>Ο λόγος που αυτή τη φορά δεν χρησιμοποιούμε εντολές της Python για να «κατασκευάσουμε» τη δική μας ουρά αλλά χρησιμοποιούμε κάτι έτοιμο είναι ο εξής. Το να κάνουμε προσθήκες και ανακτήσεις στο τέλος μιας λίστας (δείτε <em>Μαθαίνοντας </em><em>Python – Μέρος 7<sup>ο</sup> (β)</em>) είναι γενικά μια διαδικασία που δεν κοστίζει πολύ από άποψη πόρων. Δυστυχώς όμως, η δομή της ουράς εμπλέκει το  τέλος της λίστας. Οι διαδικασίες της προσθήκης και ανάκτησης στο τέλος της λίστας είναι πράξεις που κοστίζουν στη γλώσσα Python.</p><p>Ας δούμε τώρα τι δυνατότητες διαχείρισης μας προσφέρονται.</p><pre name="code" class="py">
&gt;&gt;&gt; myQueue = deque(["The tale of Sir Robin", "The tale of Sir Lancelot", "The tale of Sir Bedevir"])
</pre><p>Με την εντολή deque(LIST) δημιουργούμε μια ουρά. Παρατηρήστε ότι το όρισμα που δέχεται η deque είναι μια λίστα (η οποία μπορεί να περιέχει όλα όσα έχουμε δει ότι μπορεί να περιέχει μια λίστα σε προηγούμενα άρθρα μας).</p><p>Η συγκεκριμένη εντολή δημιουργεί μία ουρά με αντικείμενα, τα αντικείμενα της λίστας που έχουμε δώσει σαν όρισμα (στην συγκεκριμένη περίπτωση LIST).</p><p>Οι διαδικασίες εισαγωγής και ανάκτησης γίνονται με τον ίδιο τρόπο που συναντήσαμε όταν μελετούσαμε τη δομή στοίβας (stuck). Αναλυτικότερα:</p><pre name="code" class="py">
&gt;&gt;&gt; myQueue.append("The tail of Sir Arthur")
</pre><p>Με την εντολή αυτή ένα νέο στοιχείο εισέρχεται στην ουρά (δηλαδή καταλαμβάνει την τελευταία θέση).</p><p>Όσων αφορά την υλοποίηση της ανάκτησης, θα χρησιμοποιήσουμε μια παραλλαγή της γνωστής μας, από την υλοποίηση της στοίβας, pop().</p><pre name="code" class="py">
&gt;&gt;&gt; myQueue.popleft()
</pre><p>Εκτελώντας την παραπάνω εντολή, η κονσόλα μας επιστρέφει:</p><p>&#8220;The tale of Sir Robin&#8221;</p><p>… που είναι το πρώτο στοιχείο που εισήχθηκε στη λίστα. Επαληθεύουμε με:</p><pre name="code" class="py">
&gt;&gt;&gt; myQueue
</pre><p>και παίρνουμε:</p><p>["The tale of Sir Lancelot", "The tale of Sir Bedevir"]</p><p>Εκτελώντας ξανά</p><pre name="code" class="py">
&gt;&gt;&gt; myQueue.popleft()
</pre><p>(σωστά μαντεύετε)</p><p>&#8220;The tale of Sir Lancelot&#8221;</p><p>και έτσι η ουρά μας έχει πλέον τη μορφή:</p><pre name="code" class="py">
&gt;&gt;&gt; myQueue
["The tale of Sir Bedevir"]
</pre><p>Η ουρά, όπως και η στοίβα αποτελούν μια από τις βασικότερες δομές δεδομένων στον τομέα της Πληροφορικής. Πολλοί προγραμματιστές βρίσκουν της δομές αυτές πλέον ξεπερασμένες. Η αλήθεια είναι ότι στις σύγχρονες σουίτες προγραμματισμού, δομές όπως η στοίβα ή η ουρά προσφέρονται μέσω κάποιων βιβλιοθηκών.</p><p>Το ίδιο ακριβώς συναντήσαμε στο σημερινό μας άρθρο. Η δομή της ουράς, για την Python, υπάρχει υλοποιημένη σε μία κλάση που  ονομάζεται deque και εμπεριέχεται μέσα στην βιβλιοθήκη collections. Αυτή η υλοποίηση, επιτρέπει στον προγραμματιστή, να μπορεί να χρησιμοποιεί τη δομή της ουράς, αφενός χωρίς να χρειάζεται να μπει στον κόπο να την υλοποιήσει από το μηδέν και αφετέρου, του δίνει τη διαπίστευση ότι η υλοποίηση της εν λόγω δομής, έχει γίνει με τέτοιο τρόπο ώστε να επιτυγχάνει την μέγιστη λειτουργικότητα και αποτελεσματικότητα.</p><p>Μένουν ελάχιστα ακόμη πράγματα που πρέπει να εξετάσουμε όσον αφορά τα προχωρημένα θέματα που αφορούν τη χρήση λιστών στην Python. Θα τα δούμε στο επόμενο άρθρο μας.</p><p>Μέχρι τότε, να μην ξεχνάτε…</p><p><em><span
style="text-decoration: underline;">να είστε καλά και να φροντίζεται τον εαυτό σας</span></em>.</p> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/python-part7c/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Μαθαίνοντας Python – Μέρος 7ο (β2)</title><link>http://greektuts.net/python-part7b2/</link> <comments>http://greektuts.net/python-part7b2/#comments</comments> <pubDate>Fri, 25 Feb 2011 09:20:45 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[krap]]></category> <category><![CDATA[part 7]]></category> <category><![CDATA[απόστολος]]></category> <category><![CDATA[απόστολος κρητικός]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[μέρος 7β]]></category> <category><![CDATA[μέρος 7ο]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=4723</guid> <description><![CDATA[Στο έβδομο μέρος του οδηγού θα ασχοληθούμε με δομές δεδομένων. Η αλήθεια είναι ότι κάποια από τα πράγματα τα οποία θα μας απασχολήσουν τα έχουμε ήδη δει εξ απαλών ονύχων σε περασμένα άρθρα. Τώρα ήρθε η ώρα να εμβαθύνουμε και να εμπλουτίσουμε με νέα στοιχεία και λειτουργικότητες. ]]></description> <content:encoded><![CDATA[<p>Εν γένει, στην συγκεκριμένη κατηγορία εμπίπτουν διάφορα θέματα τα σημαντικότερα από τα οποία συνοψίζονται στα εξής:</p><ul><li>Λίστες      (Lists)</li><li>Πλειάδες      και ακολουθίες (Tuples      &amp; Sequences)</li><li>Σετ (Sets)</li><li>Λεξικά      (Dictionaries)</li></ul><p>Και κάποια εξεζητημένα ζητήματα όπως:</p><ul><li>Τεχνικές      επανάληψης (Looping      Techniques)</li><li>Συνθήκες      επιλογής (Conditions)      – προχωρημένα θέματα –</li></ul><p>Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</p><p><strong>( ΒΛΕΠΟΝΤΑΣ ΤΙΣ ΛΙΣΤΕΣ ΜΕ ΑΛΛΟ ΜΑΤΙ )</strong></p><p><strong><em> </em></strong></p><p>Στο σημερινό άρθρο θα μας απασχολήσουν πιο προχωρημένα θέματα που έχουν να κάνουν με λίστες.</p><p>Χρησιμοποιώντας τις λίστες σαν στοίβες</p><p>Η έννοια της στοίβας είναι βασική όσων αφορά το αντικείμενο των δομών δεδομένων και αποτελεί συνήθως το εισαγωγικό μάθημα στο εν λόγω αντικείμενο σε μια σχολή Πληροφορικής.  Η στοίβα, ως δομή δεδομένων, δε διαφέρει ιδιαίτερα από την κοινή στοίβα που συναντούμε στην καθημερινή μας ζωή (μια στοίβα βιβλία, μια στοίβα CD ή DVD,  η στοίβα με τα άπλυτα, κλπ.).</p><p>Ας συμφωνήσουμε ότι μια στοίβα είναι ένα σύνολο αντικειμένων το ένα πάνω στο άλλο. Κάθε νέο αντικείμενο που προστίθεται στην στοίβα καταλαμβάνει την ανώτερη θέση. Επίσης όταν πάρουμε ένα αντικείμενο από τη στοίβα, μοιραία θα  είναι το στοιχείο που βρίσκεται στην ανώτερη θέση. Η παραπάνω σκέψη μας οδηγεί στο συμπέρασμα ότι μια στοίβα λειτουργεί με τη λογική «το τελευταίο στοιχείο που εισάγουμε, είναι το πρώτο που εξάγουμε». Στη βιβλιογραφία αυτή η διαπίστωση και, κατ’ επέκταση η φύση λειτουργίας της στοίβας ως δομή δεδομένων, αναφέρεται ως &#8220;LAST IN, FIRST OUT&#8221; ή, εν συντομία, “LIFO”.</p><p>Μετά τη σύντομη εισαγωγή στη σχετική με τις στοίβες θεωρία, ας περάσουμε σε πιο διασκεδαστικά αντικείμενα όπως, πως το υλοποιούμε σε Python.</p><p>Εάν είστε σαν και εμένα, σε αυτό το σημείο θα πρέπει να περιμένετε να δείτε ποιες είναι οι ειδικές εντολές τις Python που υλοποιούν τη λειτουργικότητα μιας στοίβας. Η πικρή αλήθεια είναι πως δεν υπάρχουν ειδικές εντολές. Η λειτουργικότητα της στοίβας υλοποιείται με τη χρήση εντολών Python που ήδη έχουμε μάθει.</p><p>Ας υποθέσουμε ότι έχουμε την παρακάτω λίστα στοιχείων (<span
style="text-decoration: underline;">πληκτρολογούμε τον κώδικα απευθείας στην κονσόλα</span>).</p><pre name="code" class="py">
&gt;&gt;&gt; myStack = [‘Monty Python and the holy grail’, ‘The life of Brian’, ‘The meaning of life’]
</pre><p>Σε αυτό το σημείο θα ήθελα να επικαλεστώ την φαντασία σας. Σκεφτείτε το παραπάνω σετ στοιχείων ως στοίβα… οπτικά θα έμοιαζε κάπως έτσι:</p><p>‘The meaning of life’<br
/> ‘The life of Brian’<br
/> ‘Monty Python and the holy grail’</p><p>Σωστά;</p><p>Ας υλοποιήσουμε τώρα την εισαγωγή ενός καινούριου στοιχείου στη στοίβα. Σύμφωνα με τη θεωρία κάθε νέο στοιχείο που εισέρχεται στη στοίβα καταλαμβάνει την ανώτερη θέση. Θέλουμε δηλαδή το νέο στοιχείο που θα προστεθεί στην παραπάνω στοίβα που δημιουργήσαμε, να τοποθετηθεί πάνω από το ‘The meaning of life’. Θυμάστε την append(); Αν όχι, ανατρέξτε σε προηγούμενα άρθρα του οδηγού και θυμηθείτε την γιατί είναι η λύση στο πρόβλημά μας <img
src='http://greektuts.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><pre name="code" class="py">
&gt;&gt;&gt; myStack.append(‘And now for something completely different’)
</pre><p>η στοίβα μας έχει τώρα  την ακόλουθη μορφή:</p><p>‘And now for something completely different’<br
/> ‘The meaning of life’<br
/> ‘The life of Brian’<br
/> ‘Monty Python and the holy grail’</p><p>Φυσικά η Python δεν μπορεί να απεικονίσει την στοίβα με τον παραπάνω τρόπο. Για την Python μια στοίβα θα είναι πάντοτε μια λίστα. Επομένως αν δώσουμε στην κονσόλα…</p><pre name="code" class="py">
&gt;&gt;&gt; myStack
</pre><p>…θα δούμε</p><p>[‘Monty Python and the holy grail’, ‘The life of Brian’, ‘The meaning of life’, ‘And now for something completely different’]</p><p>(σε μία γραμμή – γιατί πρέπει να χρησιμοποιώ πάντα τόσο μεγάλα παραδείγματα; <img
src='http://greektuts.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> – )</p><p>Ομοίως:</p><pre name="code" class="py">
&gt;&gt;&gt; myStack.append(‘Brazil’)
</pre><p>και η στοίβα μας έχει πάρει τη μορφή:</p><p>‘Brazil’<br
/> ‘And now for something completely different’<br
/> ‘The meaning of life’<br
/> ‘The life of Brian’<br
/> ‘Monty Python and the holy grail’</p><p>ή</p><p>[‘Monty Python and the holy grail’, ‘The life of Brian’, ‘The meaning of life’, ‘And now for something completely different’, ‘Brazil’]</p><p>Τώρα ήρθε η ώρα να υλοποιήσουμε το δεύτερο κομμάτι λειτουργικότητας που αποτελεί την ανάκτηση των στοιχείων της λίστας. Όπως είπαμε, «πρώτο στοιχείο» σε μια στοίβα θεωρείται το στοιχείο που βρίσκεται στην κορυφή σωστά μαντεύετε, στην συγκεκριμένη περίπτωση είναι το ‘Brazil’). Πως το υλοποιούμε όμως σε Python;</p><p>Θα χρησιμοποιήσουμε μία ακόμη γνωστή μας εντολή:</p><pre name="code" class="py">
&gt;&gt;&gt; myStack.pop()
</pre><p>…η κονσόλα μας επιστρέφει:</p><p>‘Brazil’</p><p>Ο κύβος ερρίφθη <img
src='http://greektuts.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>Ας σιγουρευτούμε ότι όλα πήγαν κατ’ ευχήν βλέποντας την τρέχουσα κατάσταση στην οποία έχει περιέλθει η λίστα μας:</p><pre name="code" class="py">
&gt;&gt;&gt; myStack
</pre><p>[‘Monty Python and the holy grail’, ‘The life of Brian’, ‘The meaning of life’, ‘And now for something completely different’]</p><p>Ομοίως…</p><pre name="code" class="py">
&gt;&gt;&gt; myStack.pop()
</pre><p>…και η κονσόλα μας επιστρέφει:</p><p>‘And now for something completely different’</p><pre name="code" class="py">
&gt;&gt;&gt; myStack
</pre><p>[‘Monty Python and the holy grail’, ‘The life of Brian’, ‘The meaning of life’]</p><p>Πολλοί από εσάς θα παρατήρησαν ότι στο  σημερινό άρθρο δεν δουλέψαμε πάνω σε κάποιο Python script, όπως συνήθως. Αντίθετα χρησιμοποιήσαμε εντολές απ’ ευθείας στην κονσόλα. Αυτό συμβαίνει διότι σήμερα δεν μάθαμε κάτι καινούριο. Χρησιμοποιήσαμε προϋπάρχουσα γνώση για να μπορέσουμε να υλοποιήσουμε μία από τις πιο θεμελιώδεις δομές δεδομένων στην θεωρία της Πληροφορικής. Τη στοίβα.</p><p>Αν το συγκεκριμένο άρθρο σας φάνηκε άχρηστο, ξανασκεφθείτε το. Στο σημερινό άρθρο παρουσιάσαμε κάτι πολύ σημαντικό. Καμία γνώση δεν αποκτάται για να χρησιμοποιείται ακριβώς όπως τη γνωρίζουμε. Η αγορά εργασίας απαιτεί από τον προγραμματιστή να είναι εφευρετικός. Το να μπορεί κανείς να βρει εναλλακτικούς τρόπους χρήσης παλαιάς γνώσης… είναι αν μη τι άλλο εφευρετικότητα. Μείνετε συντονισμένοι γιατί στο επόμενο άρθρο θα υλοποιήσουμε μια ακόμη σημαντική δομή δεδομένων. Την ουρά.</p><p>Μέχρι τότε, να μην ξεχνάτε…</p><p><span
style="text-decoration: underline;">να είστε καλά και να φροντίζεται τον εαυτό σας</span>.</p> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/python-part7b2/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Μαθαίνοντας Python – Μέρος 7ο (β)</title><link>http://greektuts.net/python-part7b/</link> <comments>http://greektuts.net/python-part7b/#comments</comments> <pubDate>Thu, 02 Dec 2010 07:37:52 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[krap]]></category> <category><![CDATA[part 7]]></category> <category><![CDATA[απόστολος]]></category> <category><![CDATA[απόστολος κρητικός]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[μέρος 7β]]></category> <category><![CDATA[μέρος 7ο]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=4493</guid> <description><![CDATA[Στο δεύετερο κομμάτι του έβδομου μέρος του οδηγού θα ασχοληθούμε με δομές δεδομένων. Η αλήθεια είναι ότι κάποια από τα πράγματα τα οποία θα μας απασχολήσουν τα έχουμε ήδη δει εξ απαλών ονύχων σε περασμένα άρθρα. Τώρα ήρθε η ώρα να εμβαθύνουμε και να εμπλουτίσουμε με νεά στοιχεία και λειτουργικότητες.]]></description> <content:encoded><![CDATA[<p>Εν γένει, στην συγκεκριμένη κατηγορία εμπίπτουν διάφορα θέματα τα σημαντικότερα από τα οποία συνοψίζονται στα εξής:</p><ul><li>Λίστες      (Lists)</li><li>Πλειάδες      και ακολουθίες (Tuples      &amp; Sequences)</li><li>Σετ (Sets)</li><li>Λεξικά      (Dictionaries)</li></ul><p>Και κάποια εξεζητημένα ζητήματα όπως:</p><ul><li>Τεχνικές      επανάληψης (Looping      Techniques)</li><li>Συνθήκες      επιλογής (Conditions)      – προχωρημένα θέματα –</li></ul><p><strong>Προαπαιτούμενα</strong></p><p><a
href="http://greektuts.net/category/programming/python/">Μαθαίνοντας Python</a></p><p><strong>Πριν ξεκινήσουμε…</strong><br
/> … θα ήθελα να επισημάνω ένα – δύο πρακτικά ζητήματα.</p><p>Στη συνέχεια παρουσιάζεται ο τρόπος για να επιτευχθούν οι στόχοι που περιγράψαμε στην εισαγωγή. Θα παρατηρήσετε ότι το άρθρο ακολουθεί τη δομή:</p><blockquote><p>Μικρή περιγραφή του τι θέλουμε να επιτύχουμε (+ επιπλέον σχόλια)</p></blockquote><pre name="code" class="py">
Παράδειγμα κώδικα</em>
</pre><p>Στο τέλος του αρχείου θα βρείτε συνημμένο ένα python script που περιέχει συγκεντρωμένα όλα τα παραδείγματα.</p><p>Για να τα χρησιμοποιήσετε, αντιγράφετε το εκάστοτε παράδειγμα σε ένα νέο αρχείο python και το εκτελείτε (βλ. <a
title="Permanent Link to Μαθαίνοντας Python – Μέρος 1ο" href="http://greektuts.net/python-part-1/">Μαθαίνοντας Python – Μέρος 1ο</a> ). Τα παραδείγματα είναι φτιαγμένα με τέτοιον τρόπο ώστε να τυπώνουν τα αποτελέσματα στην οθόνη ώστε να μπορείτε να πιστοποιήσετε εύκολα τη λειτουργικότητά τους. Για διευκόλυνσή σας έχουμε χωρίσει τα παραδείγματα με σχόλια που δίνουν μια μικρή περιγραφή του τι επιχειρούμε κάθε φορά.</p><p>Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</p><p><strong>( ΦΡΕΣΚΑΡΟΝΤΑΣ ΤΑ ΒΑΣΙΚΑ… )</strong></p><p>Στο σημερινό άρθρο θα μας απασχολήσουν και πάλι θέματα που έχουν να κάνουν με λίστες. Ας θυμηθούμε τα βασικά:</p><p><span
style="text-decoration: underline;">Ορισμός Λίστας</span></p><pre name="code" class="py">
myList = ['monty', 'python', 999, 222]
</pre><p><span
style="text-decoration: underline;">Επιλογή Στοιχείου Λίστας</span></p><pre name="code" class="py">
myList[0]
myList[-1]
</pre><p><span
style="text-decoration: underline;">Εισαγωγή Στοιχείου σε Λίστα</span></p><pre name="code" class="py">
myList[3] = 'foo'
</pre><p><span
style="text-decoration: underline;">Διαγραφή Στοιχείου από Λίστα</span></p><pre name="code" class="py">
myList[2] = []
</pre><p><span
style="text-decoration: underline;">Καθαρισμός Λίστας</span></p><pre name="code" class="py">
myList[:] = []
</pre><p><span
style="text-decoration: underline;">Μέγεθος Λίστας</span></p><pre name="code" class="py">
Len(myList)
</pre><p>Αφού θυμηθήκαμε τα βασικά, μπορούμε να προχωρήσουμε σε μια σειρά από προχωρημένες λειτουργίες που αφορούν λίστες.</p><p><span
style="text-decoration: underline;">Προσθήκη στοιχείου στο τέλος της λίστας</span></p><pre name="code" class="py">
myList.append("Team")
</pre><p>εδώ προστίθεται το στοιχείο Team στην τελευταία θέση</p><p><span
style="text-decoration: underline;">Επέκταση μιας λίστας με τα στοιχεία μιας άλλης</span></p><pre name="code" class="py">
anotherList = ['foo', 'foo2']
myList.extend( anotherList )
</pre><p>Η λίστα myList επεκτείνεται με τα στοιχεία της λίστας anotherList τα οποία και τοποθετούνται στο τέλος της myList</p><p><span
style="text-decoration: underline;">Εισαγωγή στοιχείου σε συγκεκριμένη θέση της λίστας</span></p><pre name="code" class="py">
myList.insert(0, 'inserted')
</pre><p>Εδώ το στοιχέιο &#8216;inserted&#8217; θα εισαχθεί στη θέση 0 (δηλαδή την πρώτη)</p><p><span
style="text-decoration: underline;">Αφαίρεση στοιχείου με συγκεκριμένη τιμή</span></p><pre name="code" class="py">
myList.remove('inserted')
</pre><p>Εδώ θα αφαιρεθεί το στοιχείο με τιμή &#8216;inserted&#8217;</p><p><span
style="text-decoration: underline;">Ανάγνωση του τελευταίου στοιχείου της λίστας</span></p><pre name="code" class="py">
print(myList.pop())
</pre><p>Εδώ θα επιστραφεί το τελευταίο στοιχείο της λίστας και θα διαγραφεί ταυτόχρονα από αυτή</p><p><span
style="text-decoration: underline;">Ανάγνωση του στοιχείου στη θέση </span><span
style="text-decoration: underline;">X</span></p><pre name="code" class="py">
print(myList.pop(0))
</pre><p>Εδώ θα επιστρέφει το στοιχείο στη θέση 0 και θα διαγραφεί από αυτήν</p><p><span
style="text-decoration: underline;">Εύρεση της θέσης στοιχείου με τιμή ‘τιμή’</span></p><pre name="code" class="py">
print(myList.index('Monty'))
</pre><p>Εδώ θα επιστραφεί η θέση του στοιχείου με τιμή &#8216;Monty&#8217;</p><p><span
style="text-decoration: underline;">Ταξινόμηση λίστας</span><br
/> <span
style="text-decoration: underline;">numList = [1, 15, 25, 2, 8, 19, 1012, 3]</span></p><pre name="code" class="py">
numList.sort()
</pre><p>Εδώ ταξινομούνται τα στοιχεία της λίστας σε αύξουσα σειρά</p><p><span
style="text-decoration: underline;">Αντιστροφή λίστας σε επίπεδο στοιχείων</span></p><pre name="code" class="py">
numList.reverse()
</pre><p>Εδώ η λίστα θα αντιστραφεί (αν η λίστα δεν είναι ταξινομημένη εξ’ αρχής, η λίστα που θα προκύψει θα είναι απλά η ανάστροφη της αρχικής).</p><p>Για την καλύτερη κατανόηση των παραπάνω ειδικών λειτουργιών με λίστες σας συμβουλεύουμε να ανατρέξετε στο παράδειγμα κώδικα που θα βρείτε στο τέλος του άρθρου.</p><p>Σε αυτό το άρθρο ξεκινούμε να γνωρίζουμε πιο προχωρημένα θέματα της γλώσσας Python. Μείνετε μαζί μας και θα ανακαλύψετε πολύ σύντομα ότι τη δύναμη της συγκεκριμένης γλώσσας προγραμματισμού είναι μεγαλύτερη από όσο φανταζόσασταν.</p><p>Μέχρι την επόμενη φορά ωστόσο, να μην ξεχνάτε…<br
/> <em><span
style="text-decoration: underline;">να είστε καλά και να φροντίζεται τον εαυτό σας</span></em></p><blockquote><p
style="text-align: center;"><em><strong>Μπορείτε να κατεβάσετε τα αρχεία του βοηθήματος εδώ</strong></em></p><p
style="text-align: center;"><em><strong><a
href="http://static.greektuts.net/uploads3/2010/12/py_tuts_part_7b.zip" ><img
src="../wp-content/uploads/2009/10/membersdownload1.png" alt="download" width="200" height="200" /></a></strong></em></p></blockquote> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/python-part7b/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Μαθαίνοντας Python – Παράγοντας Ποιοτικό Κώδικα (α)</title><link>http://greektuts.net/python-part7/</link> <comments>http://greektuts.net/python-part7/#comments</comments> <pubDate>Wed, 17 Nov 2010 07:31:07 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[krap]]></category> <category><![CDATA[part7]]></category> <category><![CDATA[απόστολος]]></category> <category><![CDATA[απόστολος κρητικός]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[Μέρος 7]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=4469</guid> <description><![CDATA[Έχοντας αρχίσει να γράφουμε μεγάλα τμήματα κώδικα σε Python είναι απαραίτητο να μάθουμε να παράγουμε ποιοτικό κώδικα. Για τον λόγο αυτό, αποφασίσαμε να κάνουμε ένα διάλειμμα από τα τεχνικά χαρακτηριστικά και να δούμε κάποια πολύ βασικά πράγματα που πρέπει να προσέχει ένας Python προγραμματιστής.]]></description> <content:encoded><![CDATA[<h1><strong>Τι είναι «ποιοτικός κώδικας»;</strong></h1><p>Όταν μιλούμε για ποιοτικό κώδικα εννοούμε, στην γενική περίπτωση, κώδικα ο οποίος κάνει σωστά και αποτελεσματικά αυτό για το οποίο προορίζεται, ενώ παράλληλα είναι ευανάγνωστος, καλογραμμένος και σωστά τεκμηριωμένος.</p><p>Στα πλαίσια του οδηγού που εκκινεί το συγκεκριμένο άρθρο θα μας απασχολήσει το κομμάτι που αφορά κυρίως το πόσο καλογραμμένος, ευανάγνωστο και καλά τεκμηριωμένος είναι ο κώδικάς μας. Με γνώμονα αυτό θα δώσουμε κάποια προγραμματιστικά τρικ που βοηθούν στο να επιτευχθούν οι παραπάνω στόχοι.</p><h1><strong>Προαπαιτούμενα;</strong></h1><p><strong> </strong></p><p>Η καλή συγγραφή κώδικα είναι κάτι το οποίο αφορά όλες τις γλώσσες προγραμματισμού. Αυτό σημαίνει ότι πολλά από τα τρικ που θα παρουσιάσουμε εδώ αποτελούν καλές πρακτικές είτε προγραμματίζουμε σε Python, είτε σε οποιαδήποτε άλλη γλώσσα.</p><p>Ωστόσο, επειδή ορισμένες συμβουλές αφορούν σε συγκεκριμένα χαρακτηριστικά της γλώσσας Python, είναι καλό να γνωρίζει κανείς τα βασικά. Συνοψίζοντας, η πληροφορία που θα παρουσιαστεί στον εν λόγω οδηγό είναι γενικής φύσης και αφορά όλους όσους σκέπτονται να ασχοληθούν ή ήδη ασχολούνται με τον προγραμματισμό, ωστόσο προτείνεται να έχετε δει (έστω και εν τάχει) όλα τα άρθρα της σειράς «Μαθαίνοντας την Python» για να επιτύχετε το μέγιστο δυνατό κέρδος.</p><h1><strong>ΟΚ με έπεισες… Ποιος υπογράφει τα τρικ;</strong></h1><p><strong> </strong></p><p>Προσπαθώντας να μεταφέρουμε κόλπα και τεχνικές από επαγγελματίες που γνωρίζουν το αντικείμενο στο μεγαλύτερο δυνατό βαθμό αποφασίσαμε να ακολουθήσουμε τον <a
href="http://www.python.org/dev/peps/pep-0008/">οδηγό συγγραφής κώδικα Python</a> που φιλοξενείται online στην επίσημη ιστοσελίδα της Python.</p><p>Το link που δώσαμε εξυπηρετεί στο να μπορέσει να διαβάσει, όποιος ενδιαφέρεται, το πλήρες αγγλικό κείμενο του οδηγού. Εμείς θα κάνουμε ένα φιλτράρισμα της πληροφορίας περιλαμβάνοντας μόνον έννοιες που έχουμε καλύψει ως τώρα, ακολουθώντας το ύφος και την οργάνωση του προαναφερθέντα οδηγού.</p><p>Εφόσον είστε έτοιμοι να ανακαλύψετε τις καλές πρακτικές συγγραφής Python κώδικα, βεβαιωθείτε ότι το μάτι της κουζίνας είναι κλειστό, ετοιμάστε μια κούπα καφέ ή τσάι… και ξεκινάμε.</p><h1><strong>Ζήτημα 1<sup>ο</sup> – Πότε πρέπει να ακολουθώ τους κανόνες συγγραφής και πότε όχι;</strong></h1><p><strong> </strong></p><p>Εν γένει είναι καλό να ακολουθούνται πάντοτε οι κανόνες συγγραφείς. Ωστόσο αν αυτό τύγχανε καθολικής αποδοχής τότε δεν θα είχε ποτέ δημιουργηθεί η φράση «οι κανόνες υπάρχουν για να παραβιάζονται». Όσο ριζοσπαστικό και αν ακούγεται αυτό σαν φράση εμπεριέχει μια μεγάλη αλήθεια. Οι κανόνες, τουλάχιστον σε ότι αφορά τον προγραμματισμό, έχουν δημιουργηθεί ώστε να λύνουν δύο μεγάλα προβλήματα:</p><ul><li>Να      παρέχουν μια κοινή γραμμή σε όλους τους προγραμματιστές μιας ομάδας (είτε      πρόκειται για παρέα, είτε για εταιρικό σχήμα, είτε για ομάδα φοιτητών)</li><li>Να      προλαμβάνουν κοινά προγραμματιστικά λάθη (ναι, η μη συμμόρφωση με τους      κανόνες μπορεί να καταλήξει σε προγραμματιστικά λάθη)</li></ul><p>Ένας πιο σημαντικός όμως λόγος, για να ακολουθήσει κάποιος του κανόνες συγγραφής κώδικα, είναι η πειθαρχία στην παραγωγή καλογραμμένου και άρα εν μέρει, ποιοτικού κώδικα.</p><p>Είπαμε τους λόγου για τους οποίους είναι καλό αν  ακολουθούμε τους κανόνες. Ας δούμε τώρα πότε επιτρέπεται, αν όχι επιβάλλεται, να τους σπάμε (είμαι σίγουρος ότι οι περισσότεροι πρόκειται να το διαβάσετε αυτό).</p><ol><li><em>Όταν το να εφαρμόσουμε τον κανόνα κάνει      το αποτέλεσμα λιγότερο ευανάγνωστο, ακόμη και για κάποιον που έχει      συνηθίσει να γράφει κώδικα ακολουθώντας τους κανόνες.</em></li><li><em>Για να είναι ο κώδικάς μας συμβατός με      άλλον, περιβάλλοντα κώδικα που επίσης δεν ακολουθεί κανόνες συγγραφείς –      αν και αυτή η περίπτωση αποτελεί μια καλή ευκαιρία να διορθώσουμε «παλιές      αμαρτίες». </em></li></ol><p>Εν γένει οι κανόνες καλής συγγραφής είναι καλό να ακολουθούνται. Ωστόσο, σε κάποιες περιπτώσεις είναι καλύτερο να αποφεύγονται. Η διάκριση μεταξύ των δύο περιπτώσεων είναι, τις περισσότερες φορές θέμα διαισθητικό και καθώς ο προγραμματιστής κερδίζει όλο και μεγαλύτερη εμπειρία, γίνεται όλο και πιο ξεκάθαρο το τι πρέπει να κάνει και πότε.</p><h1><strong>Ζήτημα 2<sup>ο</sup> – Αν πρόκειται να γράψεις κώδικα, κάντο με στυλ!</strong></h1><p>Ας δούμε μερικά απλά, αλλά σημαντικά θέματα που αφορούν στο στυλ του κώδικα όταν γράφουμε Python.</p><h2>Στοίχιση</h2><p><em> </em></p><p>Όπως έχουμε τονίσει από το πρώτο κιόλας άρθρο μας για την Python, η στοίχιση των εντολών αποτελεί ένα από τα σημαντικότερα «βίτσια» της γλώσσας. Η οδηγία λέει ότι στοιχίζουμε κάθε μπλοκ κώδικα κατά έναν <em>αριθμό κενών χαρακτήρων</em> πιο μέσα από το μπλοκ κώδικα στο οποίο περιέχεται.</p><p>Πόσοι όμως πρέπει να είναι αυτοί οι χαρακτήρες; Εδώ υπάρχουν δύο σχολές σκέψεις:</p><ul><li>Τέσσερις      (4). Αυτό σημαίνει ότι κάθε φορά που πάμε να γράψουμε ένα μπλοκ κώδικα που      περιέχεται μέσα σε ένα άλλο, κάθε εντολή του νέου μπλοκ θα γράφεται      τέσσερις χαρακτήρες πιο μέσα από ότι το εξωτερικό.</li><li>Ένα TAB κενοί      χαρακτήρες (δηλαδή 8). Αυτό σημαίνει ότι αντί να αφήνουμε 4 κενά, όπως      είπαμε παραπάνω για κάθε νέα εσοχή, αφήνουμε ένα TAB (το οποίο παράγεται με τον      πλήκτρο TAB). Όπως      ήδη τονίσαμε, αυτό ισοδυναμεί με 8 κενούς χαρακτήρες.</li></ul><p>Υποθέτω ότι οι περισσότεροι θα βρήκατε τον δεύτερο τρόπο ευκολότερο και πιο συμφέρον από τον πρώτο. Σε αυτήν την περίπτωση κάνατε λάθος. Αν και αμφότεροι οι τρόποι είναι σωστοί, σύμφωνα με τον οδηγό καλής συγγραφής κώδικα που αναφέραμε στην εισαγωγή του άρθρου ο καλύτερος τρόπος αντιμετώπισης είναι ο πρώτος. Ο ίδιος οδηγός προτείνει την πολιτική των TABs ως συμφέρουσα μόνον όταν δουλεύουμε πάνω σε κώδικα που έχει φτιαχτεί εξ’ αρχής (και προφανώς από κάποιον άλλο) με τη χρήση TABs. Σε κάθε περίπτωση που ξεκινούμε να φτιάχνουμε δικό μας κώδικα, προτείνεται η χρήση των 4 κενών χαρακτήρων.</p><blockquote><p><strong><span
style="text-decoration: underline;">ΠΡΟΣΟΧΗ</span></strong>: Οι παραπάνω δυο πολιτικές είναι αμφότερες σωστές. Η μίξη τους ωστόσο, δηλαδή η χρήση άλλοτε τεσσάρων κενών χαρακτήρων και άλλοτε TABs <strong>απαγορεύεται αυστηρα</strong>.</p></blockquote><h2>Μέγιστο μήκος γραμμής</h2><p>Αυτό είναι κάτι που οι περισσότεροι προγραμματιστές (τόσο νέοι όσο και παλαιοί) συνήθως αγνοούν ή έχουν ξεχάσει με τον καιρό. Στην Python, αλλά και στις περισσότερες γλώσσες προγραμματισμού εφαρμόζονται όρια στο μήκος γραμμής κώδικα. Αυτό σημαίνει ότι κάθε γραμμή δεν πρέπει να ξεπερνά συγκεκριμένο αριθμό χαρακτήρων.</p><p>Σύμφωνα με τον οδηγό που ακολουθούμε, αυτό το όριο για την Python είναι οι 79 χαρακτήρες.</p><p>Ανάλογα λοιπόν με τον επεξεργαστή κειμένου που χρησιμοποιείται θα πρέπει να ρυθμίσετε (εφόσον το υποστηρίζει) να αλλάζει γραμμή όταν η εντολή σας υπερβεί τους 79 χαρακτήρες. Εάν αυτό δεν υποστηρίζεται από τον κειμενογράφο σας θα πρέπει να έχετε το νου σας και να το κάνετε με το χέρι. Μην πανικοβάλλεστε! Ακόμη και στη δεύτερη περίπτωση τα πράγματα δεν είναι τραγικά. Όλοι οι κειμενογράφοι έχουν δύο μετρητές, έναν για τις γραμμές και έναν για τις στήλες (δηλαδή τους χαρακτήρες ανά γραμμή). Επομένως το μόνο που έχετε να κάνετε είναι καθώς γράφετε κώδικα να παρατηρείτε τον μετρητή των στηλών και μόλις φθάσει τους 79 χαρακτήρες να αλλάξετε γραμμή.</p><p>Η επίσημη αιτιολογία ύπαρξης του παραπάνω κανόνα είναι ότι ακόμη υπάρχουν μηχανήματα που δεν μπορούν να προβάλλουν γραμμές με περισσότερους των 80 χαρακτήρες, ωστόσο η πρακτική αξία του κανόνα είναι ο πηγαίος κώδικας να μην περιλαμβάνει πολύ μακριές γραμμές υποχρεώνοντας τον προγραμματιστή να χρησιμοποιεί τον οριζόντιο κέρσορα για να τις παρακολουθεί από την αρχή ως το τέλος.</p><p>Ακολουθεί ένα δείγμα κώδικα που ακολουθεί την πολιτική των 80 χαρακτήρων παρμένο από τον οδηγό που αναφέραμε στην αρχή του άρθρου. Δε χρειάζεται να τον καταλάβετε, απλά δείτε πως είναι δομημένος.</p><pre name="code" class="py">
class Rectangle(Blob):
       def __init__(self, width, height,
              color='black', emphasis=None, highlight=0):
       if width == 0 and height == 0 and \
              color == 'red' and emphasis == 'strong' or \
              highlight &gt; 100:
               raise ValueError("sorry, you lose")
       if width == 0 and height == 0 and (color == 'red' or
                                                     emphasis is None):
              raise ValueError("I don't think so -- values are %s, %s" %
                                   (width, height))
       Blob.__init__(self, width, height,
                            color, emphasis, highlight)
</pre><p>Στο παραπάνω δείγμα κώδικα η μεγαλύτερη γραμμή φθάνει τους 74 χαρακτήρες. Παρατηρήστε επίσης ότι οι πολύ μακριές γραμμές χωρίζονται με τον χαρακτήρα ‘\’.</p><h2>Κενές γραμμές</h2><ul><li>Οι      κλάσεις πρέπει να χωρίζονται μεταξύ τους με δύο κενές γραμμές</li><li>Η πρώτη      μέθοδος μιας κλάσης πρέπει να χωρίζεται από τα χαρακτηριστικά της κλάσης      με δύο κενές γραμμές</li><li>Έξτρα      κενές γραμμές μπορούν να χρησιμοποιηθούν σε μεγάλες (σε μέγεθος      συναρτήσεις) ώστε να χωρίζουν τη λογική της συνάρτησης σε τμήματα.</li></ul><h1><strong>Κωδικοποίηση χαρακτήρων (</strong><strong>encoding)</strong></h1><p><strong> </strong></p><p>Ο κώδικας του πυρήνα της διανομής της Python πρέπει υποχρεωτικά να είναι κωδικοποιημένος σε ASCII Latin-1 κωδικοποίηση χαρακτήρων (ISO-8859-1). Για εκδόσεις της Python από 3.0 και επάνω, η κωδικοποίηση χαρακτήρων UTF-8 προτιμάται τις Latin-1. Για περισσότερες πληροφορίες σχετικά με την οδηγία για την κωδικοποίηση χαρακτήρων μπορείτε να ανατρέξετε στο <a
href="http://www.python.org/dev/peps/pep-3120">PEP 3120</a> που βρίσκεται στο επίσημο site της Python.</p><p>Σε αυτό το άρθρο πήραμε μια πρώτη γεύση μερικών από τους κανόνες που αφορούν τον προγραμματισμό σε Python. Μείνετε συντονισμένοι για την συνέχεια του οδηγού καλής συγγραφής κώδικα.</p><p>Μέχρι την επόμενη φορά…</p><p><em><span
style="text-decoration: underline;">να είστε καλά και να φροντίζεται τον εαυτό σας</span></em>.</p> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/python-part7/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Μαθαίνοντας Python – Μέρος 6ο (γ)</title><link>http://greektuts.net/python-part-6c/</link> <comments>http://greektuts.net/python-part-6c/#comments</comments> <pubDate>Thu, 11 Nov 2010 10:00:22 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[krap]]></category> <category><![CDATA[απόστολος]]></category> <category><![CDATA[απόστολος κρητικός]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=4458</guid> <description><![CDATA[Με το σημερινό άρθρο ολοκληρώνουμε το κεφάλαιο των συναρτήσεων σε Python. Σε μια προσπάθεια να καλύψουμε όσο πιο σφαιρικά το αντικείμενο μπορούμε θα ασχοληθούμε με κάποια θέματα που έχουν απομείνει και θα κλείσουμε με τον τρόπο με τον οποίο τεκμηριώνουμε μια συνάρτηση σε Python γράφοντας σχόλια.]]></description> <content:encoded><![CDATA[<p>Αναλυτικότερα λοιπόν σήμερα θα μάθουμε:</p><ul><li>Να δημιουργήσουμε ανώνυμες συναρτήσεις τύπου lambda</li><li>Να τεκμηριώνουμε σωστά τις συναρτήσεις μας</li></ul><p><strong>Προαπαιτούμενα</strong></p><p><strong> </strong></p><p>Μαθαίνοντας Python:  <a
href="../python-part-1/" target="_blank">Μέρος Ι</a>, <a
href="../python-part-2/" target="_blank">Μέρος  ΙΙ</a>, <a
href="../python-part-3/" target="_blank">Μέρος ΙΙΙ</a>, <a
href="../python-part-4/" target="_blank">Μέρος IV</a>, <a
href="../python-part5/" target="_blank">Μέρος V</a>, <a
href="../python-part-6a/" target="_blank">Μερος VI  (α)</a><a
href="../../../../../python-part-6a/"></a>, <a
href="http://greektuts.net/python-part-6b/" target="_blank">Μερος VI  (β)</a></p><p><strong>Πριν ξεκινήσουμε…</strong></p><p><strong> </strong></p><p>… θα ήθελα να επισημάνω ένα – δύο πρακτικά ζητήματα.</p><p>Στη συνέχεια παρουσιάζεται ο τρόπος για να επιτευχθούν οι στόχοι που περιγράψαμε στην εισαγωγή. Θα παρατηρήσετε ότι το άρθρο ακολουθεί τη δομή</p><blockquote><p><em>Μικρή περιγραφή του τι θέλουμε να επιτύχουμε (+ επιπλέον σχόλια)</em></p></blockquote><pre name="code" class="py">
<em>Παράδειγμα κώδικα</em>
</pre><p>Στο τέλος του αρχείου θα βρείτε συνημμένο ένα python script που περιέχει συγκεντρωμένα όλα τα παραδείγματα.</p><p>Για να τα χρησιμοποιήσετε, αντιγράφετε το εκάστοτε παράδειγμα σε ένα νέο αρχείο python και το εκτελείτε (βλ. <a
title="Permanent Link to Μαθαίνοντας Python – Μέρος 1ο" href="http://greektuts.net/python-part-1/">Μαθαίνοντας Python – Μέρος 1ο</a> ). Τα παραδείγματα είναι φτιαγμένα με τέτοιον τρόπο ώστε να τυπώνουν τα αποτελέσματα στην οθόνη ώστε να μπορείτε να πιστοποιήσετε εύκολα τη λειτουργικότητά τους. Για διευκόλυνσή σας έχουμε χωρίσει τα παραδείγματα με σχόλια που δίνουν μια μικρή περιγραφή του τι επιχειρούμε κάθε φορά.</p><p>Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</p><p>( ΦΡΕΣΚΑΡΟΝΤΑΣ ΤΑ ΒΑΣΙΚΑ… )</p><p><strong><em>Σύνταξη μιας συνάρτησης</em></strong></p><pre name="code" class="py">
def triangle_area(a, b):
area = a * b / 2
print("Το εμβαδό του τριγώνου είναι:", area)
</pre><p><strong><em>Καλώντας μια συνάρτηση</em></strong></p><pre name="code" class="py">
triangle_area(66, 2010)
</pre><p>και χωρίς παραμέτρους αν χρειαστεί…</p><pre name="code" class="py">
def no_params_function():
print("Αυτή η συνάρτηση δε δέχεται παραμέτρους...")
</pre><p>Έχοντας στο μυαλό μας τα παραπάνω πάμε να δούμε τις περαιτέρω λειτουργίες που μπορεί να προσφέρει μια συνάρτηση γραμμένη σε γλώσσα Python.</p><p><strong>Lambda </strong><strong>forms</strong></p><p><strong> </strong></p><p>Ο όρος “Lambda form” προέρχεται από παλαιότερες συναρτησιακές γλώσσες (όπως η Lisp) και φαίνεται πως οι δημιουργοί της Python θεώρησαν καλό να την συμπεριλάβουν σαν δυνατότητα και στην δική τους γλώσσα προγραμματισμού.</p><p>Μια Lambda form δεν είναι τίποτε άλλο από μια mini <strong>ανώνυμη </strong>συνάρτηση που ορίζεται μέσα σε μία μεγαλύτερη ώστε  να επιτελεί κάποια συγκεκριμένη, απλή συνήθως διαδικασία.</p><p>Ας δούμε μαζί το ακόλουθο παράδειγμα</p><pre name="code" class="py">
def counter(n):
return lambda x: x + n
</pre><p>με το οποίο, αν μη τι άλλο απομυθοποιείται η φήμη του ότι οι lambda forms είναι κάτι το περίπλοκο. Η παραπάνω συνάρτηση (counter) δέχεται σαν όρισμα έναν αριθμό n και επιστρέφεται (μέσω μιας lambda form που ορίζεται στο σώμα της counter) ο αριθμός n αυξημένος κατά x.</p><p>Ας το δούμε στην πράξη.</p><p>Για να χρησιμοποιήσουμε την συνάρτηση counter θα πρέπει με κάποιο τρόπο να καταφέρουμε να ζητήσουμε από τον χρήστη την τιμή της παραμέτρου x. Επομένως…</p><pre name="code" class="py">
myCounter = counter(5)
</pre><p>αναθέτουμε μια κλήση της συνάρτησης counter με παράμετρο 5 (για το συγκεκριμένο παράδειγμα) σε μια μεταβλητή που ονομάζουμε myCounter.</p><blockquote><p><strong><em>?: </em></strong><em>Υπενθυμίζουμε σε αυτό το σημείο ότι οι μεταβλητές της </em><em>Python </em></p></blockquote><ul><li><em>Δεν έχουν τύπο </em></li><li><em>Μπορούν να φιλοξενήσουν υπό μορφήν      τιμής ακόμη  και ολόκληρες      συναρτήσεις</em></li></ul><p>Έτσι πλέον μπορούμε να καλούμε την myCounter με όρισμα κάποιον αριθμό (ο οποίος, αν επιστρέψουμε στον ορισμό της counter, θα αντιπροσωπεύει τον x).</p><pre name="code" class="py">
print( myCounter( 1 ) )
</pre><p>η παραπάνω κλήση έχει σαν αποτέλεσμα η συνάρτηση myCounter να εκτελέσει εσωτερικά την συνάρτηση counter με x = 1 και n = 5 (το n έχει οριστεί απαξ στο σημείο που αναθέσαμε στην myCounter το counter(5)).</p><p>Έτσι το αποτέλεσμα της παραπάνω κλήσης θα είναι το x το οποίο μέσα στην lambda form ορίζεται ως x: x + n άρα x: 1 + 5. Δηλαδή η παραπάνω κλήση θα εκτυπώσει στην οθόνη 6.</p><pre name="code" class="py">
print( myCounter( 30 ) )
</pre><p>Όμοια η κλήση αυτή θα δώσει… (αφήνεται ως άσκηση στον αναγνώστη).</p><p><strong>Τεκμηρίωση / σχολιασμός συναρτήσεων</strong></p><p><strong> </strong></p><p>Οι συναρτήσει αποτελούν ένα πολύ δυνατό χαρακτηριστικό της γλώσσας Python. Όπως όμως συμβαίνει με όλα τα δυνατά εργαλεία είναι άχρηστες αν κάποιος δεν γνωρίζει πώς να τις χρησιμοποιεί. Όταν γράφουμε κομμάτια κώδικα που επιτελούν συγκεκριμένες διαδικασίες είναι πολύ πιθανό να συμβεί ένα από τα παρακάτω σενάρια.</p><ol><li>Κατασκευάζουμε      το κομμάτι κώδικα που επιτελεί μια συγκεκριμένη διαδικασία χωρίς λάθη.      Χρησιμοποιούμε για ένα διάστημα των κώδικα αυτό και στη συνέχεια τον      εγκαταλείπουμε για λίγο. Αν ο κώδικάς μας δεν είναι καλά ή καθόλου      τεκμηριωμένος υπάρχει πολύ μεγάλη πιθανότητα, όταν τον ανοίξουμε μετά από      μερικούς μήνες να μην μπορούμε να θυμηθούμε τι ακριβώς κάνει.</li><li>Κατασκευάζουμε      το κομμάτι κώδικα που επιτελεί μια συγκεκριμένη διαδικασία χωρίς λάθη. Στη      συνέχεια μας ζητά τον κώδικα αυτόν κάποιος συνεργάτης. Αν ο κώδικάς μας      δεν είναι τεκμηριωμένος υπάρχει πολύ μεγάλη πιθανότητα ο συνεργάτης να μην      καταλάβει περί τίνος πρόκειται και, είτε να χάσει σημαντικό χρόνο      προσπαθώντας να τον ερμηνεύσει, είτε να μην ασχοληθεί και να επιλέξει να      τον ξαναγράψει από το μηδέν.</li></ol><p>Η τεκμηρίωση των συναρτήσεών, όπως και κάθε γραμμής κώδικα, είναι σημαντικότατη. Ας δούμε πως το κάνουμε σε Python.</p><pre name="code" class="py">
def hello():
""" Αυτή είναι μια απλή hello world συνάρτηση... """
print('Hello world')
</pre><p>Όπως εύκολα αντιλαμβάνεστε, το μόνο που χρειάζεται να κάνετε είναι να περικλείεται τα σχόλιά σας σε τριπλά διπλά εισαγωγικά J “”” … “””.</p><p>Χωρίς να βλέπω ιδιαίτερη χρησιμότητα, οφείλω να πω ότι υπάρχει τρόπος (με κώδικα) να εμφανίζεται τα σχόλια των συναρτήσεών σας.</p><pre name="code" class="py">
hello()
print("Σχόλια: '" + hello.__doc__ + "'")
</pre><p>Η πρώτη γραμμή είναι η κλήση της συνάρτησης hello() ενώ η δεύτερη εκτυπώνει στην κονσόλα τα σχόλια της συνάρτησης hello.</p><p>Στην γενική της μορφή η εντολή εμφάνισης των σχολίων είναι η ακόλουθη:</p><pre name="code" class="py">
&lt;ΟΝΟΜΑ_ΣΥΝΑΡΤΗΣΗΣ&gt;.__doc__
</pre><p>Με αυτό το άρθρο ολοκληρώσαμε το οδοιπορικό μας στον χώρο των συναρτήσεων σε Python. Πριν περάσουμε στο επόμενο αντικείμενο θα ξοδέψουμε λίγο χρόνο για ένα ειδικό θέμα.</p><p>Μέχρι τότε να μην ξεχνάτε…</p><p><em><span
style="text-decoration: underline;">να είστε καλά και να φροντίζεται τον εαυτό σας</span></em>.</p><blockquote><p
style="text-align: center;"><em><strong>Μπορείτε να κατεβάσετε τα       αρχεία του βοηθήματος εδώ</strong></em></p><p
style="text-align: center;"><em><strong><a
href="http://static.greektuts.net/uploads3/2010/11/py_tuts_part_6c.zip" ><img
src="../wp-content/uploads/2009/10/membersdownload1.png" alt="download" width="200" height="200" /></a></strong></em></p></blockquote> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/python-part-6c/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Μαθαίνοντας Python – Μέρος 6ο  (β)</title><link>http://greektuts.net/python-part-6b/</link> <comments>http://greektuts.net/python-part-6b/#comments</comments> <pubDate>Mon, 01 Nov 2010 07:55:16 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[krap]]></category> <category><![CDATA[απόστολος]]></category> <category><![CDATA[απόστολος κρητικός]]></category> <category><![CDATA[Γλώσσα Προγραμματισμού]]></category> <category><![CDATA[Προγραμματισμός]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=4387</guid> <description><![CDATA[Αν και ελαφρώς καθυστερημένα (apologies!) ήρθε η στιγμή να προχωρήσουμε στο κεφάλαιο των συναρτήσεων σε Python. Την τελευταία φορά είδαμε τα βασικά όσον αφορά στη δημιουργία και κλήση συναρτήσεων ενώ προχωρήσαμε και σε διάφορα ενδιαφέροντα «τρικ» όπως χρήση μιας συνάρτησης σαν παράμετρο με μία άλλη συνάρτηση.]]></description> <content:encoded><![CDATA[<p><strong> </strong></p><p>Αναλυτικότερα λοιπόν σήμερα θα μάθουμε:</p><ul><li>Να ορίσουμε συναρτήσεις με παραμέτρους που αποτελούν λέξεις &#8211; κλειδιά</li><li>Να ορίσουμε συναρτήσεις με λίστες για παραμέτρους</li></ul><h1><strong>Προαπαιτούμενα</strong></h1><p><strong> </strong></p><p>Μαθαίνοντας Python:  <a
href="http://greektuts.net/python-part-1/" target="_blank">Μέρος Ι</a>, <a
href="http://greektuts.net/python-part-2/" target="_blank">Μέρος  ΙΙ</a>, <a
href="http://greektuts.net/python-part-3/" target="_blank">Μέρος ΙΙΙ</a>, <a
href="http://greektuts.net/python-part-4/" target="_blank">Μέρος IV</a>, <a
href="http://greektuts.net/python-part5/" target="_blank">Μέρος V</a>, <a
href="http://greektuts.net/python-part-6a/" target="_blank">Μερος VI (α)</a></p><h1><strong>Πριν ξεκινήσουμε…</strong></h1><p><strong> </strong></p><p>… θα ήθελα να επισημάνω ένα – δύο πρακτικά ζητήματα.</p><p>Στη συνέχεια παρουσιάζεται ο τρόπος για να επιτευχθούν οι στόχοι που περιγράψαμε στην εισαγωγή. Θα παρατηρήσετε ότι το άρθρο ακολουθεί τη δομή:</p><p><em>Μικρή περιγραφή του τι θέλουμε να επιτύχουμε (+ επιπλέον σχόλια)</em></p><pre name="code" class="python">
Παράδειγμα κώδικα
</pre><p>Στο τέλος του αρχείου θα βρείτε συνημμένο ένα python script που περιέχει συγκεντρωμένα όλα τα παραδείγματα.</p><p>Για να τα χρησιμοποιήσετε, αντιγράφετε το εκάστοτε παράδειγμα σε ένα νέο αρχείο python και το εκτελείτε (βλ. <a
title="Permanent Link to Μαθαίνοντας Python – Μέρος 1ο" href="http://greektuts.net/python-part-1/">Μαθαίνοντας Python – Μέρος 1ο</a> ). Τα παραδείγματα είναι φτιαγμένα με τέτοιον τρόπο ώστε να τυπώνουν τα αποτελέσματα στην οθόνη ώστε να μπορείτε να πιστοποιήσετε εύκολα τη λειτουργικότητά τους. Για διευκόλυνσή σας έχουμε χωρίσει τα παραδείγματα με σχόλια που δίνουν μια μικρή περιγραφή του τι επιχειρούμε κάθε φορά.</p><p>Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</p><p>( ΦΡΕΣΚΑΡΟΝΤΑΣ ΤΑ ΒΑΣΙΚΑ… )</p><h1><strong>Σύνταξη μιας συνάρτησης</strong></h1><pre name="code" class="python">
def triangle_area(a, b):
area = a * b / 2
print("Το εμβαδό του τριγώνου είναι:", area)
</pre><h1><strong>Καλώντας μια συνάρτηση</strong></h1><pre name="code" class="python">
triangle_area(66, 2010)
</pre><p>και χωρίς παραμέτρους αν χρειαστεί…</p><pre name="code" class="python">
def no_params_function():
print("Αυτή η συνάρτηση δε δέχεται παραμέτρους...")
</pre><p>Έχοντας στο μυαλό μας τα παραπάνω πάμε να δούμε τις περαιτέρω λειτουργίες που μπορεί να προσφέρει μια συνάρτηση γραμμένη σε γλώσσα Python.</p><h1><strong>Ορίζοντας προεπιλεγμένες τιμές στις παραμέτρους μιας συνάρτησης</strong></h1><p>Πολλές φορές η πληροφορία που ζητούμε από τον χρήστη μπορεί να είναι ελλιπείς (δηλαδή ο χρήστης να μη γνωρίζει τι πρέπει να δώσει σαν τιμή σε κάποιο από τα ζητούμενα). Συνήθως οι εφαρμογές απαιτούν να δοθεί τιμή σε όλες τις μεταβλητές και, αν αυτό δε συμβεί, εμφανίζουν προειδοποιητικά μηνύματα στον χρήστη μέχρις ότου να «γεμίσει» όλα τα πεδία με τιμές.</p><p>Στην Python, όπως και σε άλλες γλώσσες προγραμματισμού δίνεται η δυνατότητα στον προγραμματιστή να καθορίσει προεπιλεγμένες τιμές σε κάποιες από τις παραμέτρους της συνάρτησης έτσι ώστε:</p><ul><li>Αν ο      χρήστης δώσει τιμή, το σύστημα θα αναγνώσει και θα χρησιμοποιήσει την τιμή      αυτή.</li><li>Αν ο      χρήστης δε δώσει τιμή, το σύστημα θα χρησιμοποιήσει την τιμή που έχει      οριστεί ως προεπιλογή.</li></ul><p>Στην πράξη αυτό συμβαίνει ως εξής:</p><pre name="code" class="python">
def dbConnect(username, password, database, server='localhost', port='3306'):
print('Το string σύνδεσης για την MySQL είναι: ')
print()
print('driver={MySQL};server=' + server + ':port=' + port + ';uid=' + username + ';pwd=' + password + ';database=' + database + ';')
</pre><blockquote><p><strong><em>?:</em></strong><em> Η συνάρτηση </em><em>dbConnect</em><em> αναλαμβάνει να κατασκευάσει ενα </em><em>MySQL</em><em> </em><em>connection</em><em> </em><em>string</em><em> ζητώντας μια σειρά από παραμέτρους από τον χρήστη. Όπως εύκολα μπορεί να δει κανείς, κάποιες από τις παραμέτρους έχουν λάβει προεπιλεγμένες τιμές.</em></p></blockquote><p>Το σώμα της συνάρτησης δεν περιλαμβάνει κάτι διαστημικό. Δομεί ένα αλφαριθμητικό με βάση τις τιμές που παίρνει σαν παραμέτρους και το τυπώνει στην οθόνη. Η αξία του παραδείγματος στην πραγματικότητα έγκειται στην λίστα των παραμέτρων. Ας δούμε μερικά παραδείγματα  χρήσης για να αποσαφηνίσουμε την κατάσταση:</p><pre name="code" class="python">
dbConnect('akritiko', '123456', 'myDB', '127.0.0.1', '3333')
</pre><p>Εδώ, κατά την κλήση της συνάρτησης, δίνονται τιμές για όλες τις παραμέτρους της. Σε αυτήν την περίπτωση η Python θα αγνοήσει τελείως τις προεπιλεγμένες τιμές.</p><pre name="code" class="python">
dbConnect('akritiko', '123456', 'myDB', '127.0.0.1')
</pre><p>Εδώ, κατά την κλήση της συνάρτησης, δίνονται τιμές για κάποιες μόνον από τις παραμέτρους της. Σε αυτήν την περίπτωση η Python θα αγνοήσει τις προεπιλεγμένες τιμές για τις παραμέτρους για τις οποίες δίδονται τιμές κατά την κλήση της και θα χρησιμοποιήσει τις προεπιλεγμένες για τις υπόλοιπες.</p><pre name="code" class="python">
dbConnect('akritiko', '123456', 'myDB')
</pre><p>Εδώ, κατά την κλήση της συνάρτησης, δίνονται τιμές μόνον για τις παραμέτρους που δεν έχουν προεπιλεγμένες τιμές. Όπως και πάνω, για τις παραμέτρους για τις οποίες δεν δίνονται τιμές, θα χρησιμοποιηθούν οι προεπιλεγμένες.</p><pre name="code" class="python">
dbConnect('akritiko', '123456', 'myDB', port = '3333')
</pre><p>Εδώ, κατά την κλήση της συνάρτησης, θέλουμε να δώσουμε τιμή, εκτός των παραμέτρων που δεν έχουν προεπιλεγμένες τιμές και στην παράμετρο port. Είναι προφανές ότι αν γράφαμε</p><pre name="code" class="python">
dbConnect('akritiko', '123456', 'myDB', '3333')
</pre><p>η τιμή 3333 θα καταχωρούνταν στην παράμετρο server εφόσον προηγείται της port. Επομένως θα πρέπει με κάποιον τρόπο να δώσουμε στην Python να καταλάβει για ποια παράμετρο μιλάμε. Αυτό συμβαίνει χρησιμοποιώντας τη λέξη κλειδί (keyword) της παραμέτρου, που στην προκειμένη περίπτωση είναι το port, στη συνέχεια τον τελεστή ‘=’ και τέλος την επιθυμητή τιμή.</p><h1><strong>Προεπιλεγμένες τιμές και δυναμικά εξελισσόμενες παράμετροι</strong></h1><p>Είδαμε τι συμβαίνει με τις προεπιλεγμένες τιμές στις παραμέτρους – ορίσματα μιας συνάρτησης. Τι συμβαίνει όμως αν οι παράμετροι αυτοί είναι περισσότεροι πολύπλοκες (ως τύποι;). Ας ρίξουμε μια ματιά στον παρακάτω κώδικα:</p><pre name="code" class="python">
def wishlist(item, Wishlist=[]):
Wishlist.append(item)
return Wishlist
</pre><p>Πρόκειται για μια συνάρτηση η οποία προσθέτει αντικείμενα σε μία Wishlist (λειτουργία που μπορείτε να βρείτε – σε μία ομολογουμένως πιο εξεζητημένη υλοποίηση <img
src='http://greektuts.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> – στο Amazon.com). Εν ολίγοις ο κώδικας απλά παίρνει σαν παραμέτρους το αντικείμενο (item) και την λίστα (Wishlist) και κάθε φορά που εκτελείται συμπεριλαμβάνει το εκάστοτε αντικείμενο στην λίστα.</p><blockquote><p><strong><em>?: </em></strong><em>Παρατηρήστε ότι η </em><em>Wishlist έχει προεπιλεγμένη τιμή την κενή λίστα ( [] ). </em></p></blockquote><p><em> </em></p><p>Ας δούμε τώρα μια σειρά εκτελέσεων:</p><ol><li>print(wishlist(&#8216;Nokia N8&#8242;))</li><li>print(wishlist(&#8216;Harry Potter      and the Deathly Hallows&#8217;))</li><li>print(wishlist(&#8216;Monty Python      and The Holy Grail Blu-Ray Edition&#8217;))</li></ol><p>Σε κάθε εκτέλεση η λίστα διαμορφώνεται ως ακολούθως</p><ol><li>['Nokia N8']</li><li>['Nokia N8', 'Harry Potter and      the Deathly Hallows']</li><li>['Nokia N8', 'Harry Potter and      the Deathly Hallows', 'Monty Python and The Holy Grail Blu-Ray Edition']</li></ol><p>Παρατηρούμε λοιπόν ότι παρόλο που η λίστα έχει σαν προεπιλεγμένη τιμή την κενή λίστα καθώς συμβαίνουν διαδοχικές εκτελέσεις τα αντικείμενα προστίθενται κανονικά. Αυτό συμβαίνει γιατί η προεπιλεγμένη τιμή ισχύει μόνον για την πρώτη εκτέλεση.</p><p>Επιπλέον, αξίζει να σημειωθεί ότι παρότι σε κάθε κλήση εκτελείται εκ νέου η συνάρτηση, η κατάσταση της λίστας διατηρείται. Καταλαβαίνουμε λοιπόν ότι η φύση των δυναμικών παραμέτρων δεν επηρεάζεται από τις προεπιλεγμένες τιμές.</p><p>Στο επόμενο άρθρο θα κλείσουμε το κεφάλαιο των συναρτήσεων σε Python. Μείνετε συντονισμένοι γιατί το τρίτο μέρος του οδηγού σχετικά με συναρτήσεις στην Python πρόκειται να συνοδεύεται από πρακτικές καλής συγγραφής συναρτήσεων.</p><p>Μέχρι την ερχόμενη φορά λοιπόν…</p><p><em><span
style="text-decoration: underline;">να είστε καλά και να φροντίζεται τον εαυτό σας</span></em>.</p><blockquote><p
style="text-align: center;"><em><strong>Μπορείτε να κατεβάσετε τα      αρχεία του βοηθήματος εδώ</strong></em></p><p
style="text-align: center;"><a
href="http://static.greektuts.net/uploads3/2010/11/py_tuts_part_6b.zip" target="_blank"><em><strong><img
class="aligncenter" style="border: 0pt none;" src="../wp-content/uploads/2009/10/membersdownload1.png" alt="download" width="200" height="200" /></strong></em></a></p></blockquote><div
id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;"><!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:TargetScreenSize>800&#215;600</o:TargetScreenSize> </o:OfficeDocumentSettings> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EL</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:EnableOpenTypeKerning /> <w:DontFlipMirrorIndents /> <w:OverrideTableStyleHps /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val="&#45;-" /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="0" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="0" Name="Body Text" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman","serif";} --> <!--[endif]--></p><p
class="MsoBodyText" style="text-align: right;">30/10/2010</p><p
class="MsoNormal" style="text-align: justify;"><strong><span
style="font-size: 14pt;">Μαθαίνοντας </span></strong><strong><span
style="font-size: 14pt;" lang="EN-US">Python</span></strong><strong><span
style="font-size: 14pt;"> – Μέρος 6<sup>ο</sup> (β)</span></strong></p><p
class="MsoNormal" style="text-align: justify;"><strong><span
style="font-size: 14pt;"> </span></strong></p><p
class="MsoNormal" style="text-align: justify;">«<span
lang="EN-US">title</span>.<span
lang="EN-US">png</span>» <strong><span
style="font-size: 14pt;"></span></strong></p><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US"> </span></p><p
class="MsoNormal" style="text-align: justify;">Αν και ελαφρώς καθυστερημένα (<span
lang="EN-US">apologies</span>!) ήρθε η στιγμή να προχωρήσουμε στο κεφάλαιο των συναρτήσεων σε <span
lang="EN-US">Python</span>. Την τελευταία φορά είδαμε τα βασικά όσον αφορά στη δημιουργία και κλήση συναρτήσεων ενώ προχωρήσαμε και σε διάφορα ενδιαφέροντα «τρικ» όπως χρήση μιας συνάρτησης σαν παράμετρο με μία άλλη συνάρτηση.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Αναλυτικότερα λοιπόν σήμερα θα μάθουμε:</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoListParagraphCxSpFirst" style="text-align: justify; text-indent: -18pt;"><!--[if !supportLists]--><span
style="font-family: Symbol;"><span>·<span
style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"> </span></span></span><!--[endif]-->Να ορίσουμε συναρτήσεις με παραμέτρους που αποτελούν λέξεις &#8211; κλειδιά</p><p
class="MsoListParagraphCxSpLast" style="text-align: justify; text-indent: -18pt;"><!--[if !supportLists]--><span
style="font-family: Symbol;"><span>·<span
style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"> </span></span></span><!--[endif]-->Να ορίσουμε συναρτήσεις με λίστες για παραμέτρους</p><p
class="MsoNormal" style="text-align: justify;"><strong>Προαπαιτούμενα</strong></p><p
class="MsoNormal" style="text-align: justify;"><strong> </strong></p><p
class="MsoNormal">Μαθαίνοντας Python: <span> </span><a
href="../archives/1571">Μέρος Ι</a>, <a
href="../archives/1713">Μέρος<span> </span>ΙΙ</a>, <a
href="../archives/1838">Μέρος ΙΙΙ</a>, <a
href="../archives/1930">Μέρος <span
lang="EN-US">IV</span></a>, <a
href="../python-part5/">Μέρος <span
lang="EN-US">V</span></a>, <a
href="../python-part-6a/">Μερος <span
lang="EN-US">VI</span> (α)</a></p><p
class="MsoNormal"><p
class="MsoNormal"><p
class="MsoNormal"><strong>Πριν ξεκινήσουμε…</strong></p><p
class="MsoNormal"><strong> </strong></p><p
class="MsoNormal" style="text-align: justify;">… θα ήθελα να επισημάνω ένα – δύο πρακτικά ζητήματα.</p><p
class="MsoNormal" style="text-align: justify;">Στη συνέχεια παρουσιάζεται ο τρόπος για να επιτευχθούν οι στόχοι που περιγράψαμε στην εισαγωγή. Θα παρατηρήσετε ότι το άρθρο ακολουθεί τη δομή:</p><p
class="MsoNormal" style="text-align: justify;"><div
style="border: 1pt solid windowtext; padding: 1pt 4pt;"><p
class="MsoNormal" style="border: medium none; padding: 0cm;"><em>Μικρή περιγραφή του τι θέλουμε να επιτύχουμε (+ επιπλέον σχόλια)</em></p><p
class="MsoNormal" style="border: medium none; padding: 0cm;"><em>Παράδειγμα κώδικα</em></p></div><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Στο τέλος του αρχείου θα βρείτε συνημμένο ένα <span
lang="EN-US">python</span><span
lang="EN-US"> </span><span
lang="EN-US">script</span><span
lang="EN-US"> </span>που περιέχει συγκεντρωμένα όλα τα παραδείγματα.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Για να τα χρησιμοποιήσετε, αντιγράφετε το εκάστοτε παράδειγμα σε ένα νέο αρχείο <span
lang="EN-US">python</span><span
lang="EN-US"> </span>και το εκτελείτε (βλ. <a
title="Permanent Link to Μαθαίνοντας Python – Μέρος 1ο" href="../archives/1571">Μαθαίνοντας Python – Μέρος 1ο</a> ). Τα παραδείγματα είναι φτιαγμένα με τέτοιον τρόπο ώστε να τυπώνουν τα αποτελέσματα στην οθόνη ώστε να μπορείτε να πιστοποιήσετε εύκολα τη λειτουργικότητά τους. Για διευκόλυνσή σας έχουμε χωρίσει τα παραδείγματα με σχόλια που δίνουν μια μικρή περιγραφή του τι επιχειρούμε κάθε φορά.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Βεβαιωθείτε ότι δεν ξεχάσατε το μάτι της κουζίνας ανοικτό, ετοιμάστε μία κούπα καφέ ή τσάι, βάλτε απαλή μουσική και ξεκινάμε…</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">( ΦΡΕΣΚΑΡΟΝΤΑΣ ΤΑ ΒΑΣΙΚΑ… )</p><p
class="MsoNormal" style="text-align: justify;"><strong><em> </em></strong></p><p
class="MsoNormal" style="text-align: justify;"><strong><em>Σύνταξη μιας συνάρτησης</em></strong></p><p
class="MsoNormal" style="text-align: justify;"><strong><em> </em></strong></p><p
class="MsoNormal" style="text-align: justify;"><em><span
lang="EN-US">def</span><span
lang="EN-US"> </span></em><em><span
lang="EN-US">triangle</span>_</em><em><span
lang="EN-US">area</span>(</em><em><span
lang="EN-US">a</span>, </em><em><span
lang="EN-US">b</span>):<span> </span></em></p><p
class="MsoNormal" style="text-align: justify;"><em><span> </span>area = a * b / 2</em></p><p
class="MsoNormal" style="text-align: justify;"><em><span> </span>print(&#8220;Το εμβαδό του τριγώνου είναι:&#8221;, area)</em></p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><strong><em>Καλώντας μια συνάρτηση</em></strong></p><p
class="MsoNormal" style="text-align: justify;">triangle_area(66, 2010)</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">και χωρίς παραμέτρους αν χρειαστεί…</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">def no_params_function():</p><p
class="MsoNormal" style="text-align: justify;"><span> </span>print(&#8220;Αυτή η συνάρτηση δε δέχεται παραμέτρους&#8230;&#8221;)</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Έχοντας στο μυαλό μας τα παραπάνω πάμε να δούμε τις περαιτέρω λειτουργίες που μπορεί να προσφέρει μια συνάρτηση γραμμένη σε γλώσσα <span
lang="EN-US">Python</span>.<span
lang="EN-US"></span></p><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US"> </span></p><p
class="MsoNormal" style="text-align: justify;"><strong>Ορίζοντας προεπιλεγμένες τιμές στις παραμέτρους μιας συνάρτησης</strong></p><p
class="MsoNormal" style="text-align: justify;"><strong> </strong></p><p
class="MsoNormal" style="text-align: justify;">Πολλές φορές η πληροφορία που ζητούμε από τον χρήστη μπορεί να είναι ελλιπείς (δηλαδή ο χρήστης να μη γνωρίζει τι πρέπει να δώσει σαν τιμή σε κάποιο από τα ζητούμενα). Συνήθως οι εφαρμογές απαιτούν να δοθεί τιμή σε όλες τις μεταβλητές και, αν αυτό δε συμβεί, εμφανίζουν προειδοποιητικά μηνύματα στον χρήστη μέχρις ότου να «γεμίσει» όλα τα πεδία με τιμές.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Στην <span
lang="EN-US">Python</span>, όπως και σε άλλες γλώσσες προγραμματισμού δίνεται η δυνατότητα στον προγραμματιστή να καθορίσει προεπιλεγμένες τιμές σε κάποιες από τις παραμέτρους της συνάρτησης έτσι ώστε:</p><p
class="MsoNormal" style="text-align: justify;"><ul
style="margin-top: 0cm;" type="disc"><li
class="MsoNormal" style="text-align: justify;">Αν ο      χρήστης δώσει τιμή, το σύστημα θα αναγνώσει και θα χρησιμοποιήσει την τιμή      αυτή.</li><li
class="MsoNormal" style="text-align: justify;">Αν ο      χρήστης δε δώσει τιμή, το σύστημα θα χρησιμοποιήσει την τιμή που έχει      οριστεί ως προεπιλογή.</li></ul><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Στην πράξη αυτό συμβαίνει ως εξής:</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal"><span
lang="EN-US">def dbConnect(username, password, database, server=&#8217;localhost&#8217;, port=&#8217;3306&#8242;):</span></p><p
class="MsoNormal"><span
lang="EN-US"><span> </span>print</span><span>(&#8216;Το </span><span
lang="EN-US">string</span><span> σύνδεσης για την </span><span
lang="EN-US">MySQL</span><span> είναι: &#8216;)</span></p><p
class="MsoNormal"><span><span> </span></span><span
lang="EN-US">print</span><span>()</span></p><p
class="MsoNormal"><span><span> </span></span><span
lang="EN-US">print</span><span>(&#8216;</span><span
lang="EN-US">driver</span><span>={</span><span
lang="EN-US">MySQL</span><span>};</span><span
lang="EN-US">server</span><span>=&#8217; + </span><span
lang="EN-US">server</span><span> + &#8216;:</span><span
lang="EN-US">port</span><span>=&#8217; + </span><span
lang="EN-US">port</span><span> + &#8216;;</span><span
lang="EN-US">uid</span><span>=&#8217; + </span><span
lang="EN-US">username</span><span> + &#8216;;</span><span
lang="EN-US">pwd</span><span>=&#8217; + </span><span
lang="EN-US">password</span><span> + &#8216;;</span><span
lang="EN-US">database</span><span>=&#8217; + </span><span
lang="EN-US">database</span><span> + &#8216;;&#8217;)</span><span
lang="EN-US"></span></p><p
class="MsoNormal" style="text-align: justify;"><strong><em><span>?:</span></em></strong><em><span> Η συνάρτηση </span></em><em><span
lang="EN-US">dbConnect</span></em><em><span> αναλαμβάνει να κατασκευάσει ενα </span></em><em><span
lang="EN-US">MySQL</span></em><em><span
lang="EN-US"> </span></em><em><span
lang="EN-US">connection</span></em><em><span
lang="EN-US"> </span></em><em><span
lang="EN-US">string</span></em><em><span> ζητώντας μια σειρά από παραμέτρους από τον χρήστη. Όπως εύκολα μπορεί να δει κανείς, κάποιες από τις παραμέτρους έχουν λάβει προεπιλεγμένες τιμές.</span></em></p><p
class="MsoNormal" style="text-align: justify;"><em> </em></p><p
class="MsoNormal" style="text-align: justify;">Το σώμα της συνάρτησης δεν περιλαμβάνει κάτι διαστημικό. Δομεί ένα αλφαριθμητικό με βάση τις τιμές που παίρνει σαν παραμέτρους και το τυπώνει στην οθόνη. Η αξία του παραδείγματος στην πραγματικότητα έγκειται στην λίστα των παραμέτρων. Ας δούμε μερικά παραδείγματα<span> </span>χρήσης για να αποσαφηνίσουμε την κατάσταση:</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">dbConnect(&#8216;akritiko&#8217;, &#8217;123456&#8242;, &#8216;myDB&#8217;, &#8217;127.0.0.1&#8242;, &#8217;3333&#8242;)</span></p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Εδώ, κατά την κλήση της συνάρτησης, δίνονται τιμές για όλες τις παραμέτρους της. Σε αυτήν την περίπτωση η <span
lang="EN-US">Python</span><span
lang="EN-US"> </span>θα αγνοήσει τελείως τις προεπιλεγμένες τιμές.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">dbConnect(&#8216;akritiko&#8217;, &#8217;123456&#8242;, &#8216;myDB&#8217;, &#8217;127.0.0.1&#8242;)</span></p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Εδώ, κατά την κλήση της συνάρτησης, δίνονται τιμές για κάποιες μόνον από τις παραμέτρους της. Σε αυτήν την περίπτωση η <span
lang="EN-US">Python</span><span
lang="EN-US"> </span>θα αγνοήσει τις προεπιλεγμένες τιμές για τις παραμέτρους για τις οποίες δίδονται τιμές κατά την κλήση της και θα χρησιμοποιήσει τις προεπιλεγμένες για τις υπόλοιπες.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">dbConnect(&#8216;akritiko&#8217;, &#8217;123456&#8242;, &#8216;myDB&#8217;)</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Εδώ, κατά την κλήση της συνάρτησης, δίνονται τιμές μόνον για τις παραμέτρους που δεν έχουν προεπιλεγμένες τιμές. Όπως και πάνω, για τις παραμέτρους για τις οποίες δεν δίνονται τιμές, θα χρησιμοποιηθούν οι προεπιλεγμένες.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">dbConnect(&#8216;akritiko&#8217;, &#8217;123456&#8242;, &#8216;myDB&#8217;, port = &#8217;3333&#8242;)</span></p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Εδώ, κατά την κλήση της συνάρτησης, θέλουμε να δώσουμε τιμή, εκτός των παραμέτρων που δεν έχουν προεπιλεγμένες τιμές και στην παράμετρο <span
lang="EN-US">port</span>. Είναι προφανές ότι αν γράφαμε</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">dbConnect(&#8216;akritiko&#8217;, &#8217;123456&#8242;, &#8216;myDB&#8217;, &#8217;3333&#8242;)</span></p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">η τιμή 3333 θα καταχωρούνταν στην παράμετρο <span
lang="EN-US">server</span><span
lang="EN-US"> </span>εφόσον προηγείται της <span
lang="EN-US">port</span>. Επομένως θα πρέπει με κάποιον τρόπο να δώσουμε στην <span
lang="EN-US">Python</span><span
lang="EN-US"> </span>να καταλάβει για ποια παράμετρο μιλάμε. Αυτό συμβαίνει χρησιμοποιώντας τη λέξη κλειδί (<span
lang="EN-US">keyword</span>) της παραμέτρου, που στην προκειμένη περίπτωση είναι το <span
lang="EN-US">port</span>, στη συνέχεια τον τελεστή ‘=’ και τέλος την επιθυμητή τιμή.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><strong>Προεπιλεγμένες τιμές και δυναμικά εξελισσόμενες παράμετροι</strong></p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Είδαμε τι συμβαίνει με τις προεπιλεγμένες τιμές στις παραμέτρους – ορίσματα μιας συνάρτησης. Τι συμβαίνει όμως αν οι παράμετροι αυτοί είναι περισσότεροι πολύπλοκες (ως τύποι;). Ας ρίξουμε μια ματιά στον παρακάτω κώδικα:</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">def wishlist(item, Wishlist=[]):</span></p><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US"><span> </span>Wishlist.append(item)</span></p><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US"><span> </span></span>return Wishlist</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Πρόκειται για μια συνάρτηση η οποία προσθέτει αντικείμενα σε μία <span
lang="EN-US">Wishlist</span><span
lang="EN-US"> </span>(λειτουργία που μπορείτε να βρείτε – σε μία ομολογουμένως πιο εξεζητημένη υλοποίηση :<span
lang="EN-US">P</span><span
lang="EN-US"> </span>– στο <span
lang="EN-US">Amazon</span>.<span
lang="EN-US">com</span>). Εν ολίγοις ο κώδικας απλά παίρνει σαν παραμέτρους το αντικείμενο (<span
lang="EN-US">item</span>) και την λίστα (<span
lang="EN-US">Wishlist</span>) και κάθε φορά που εκτελείται συμπεριλαμβάνει το εκάστοτε αντικείμενο στην λίστα.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><strong><em>?: </em></strong><em>Παρατηρήστε ότι η </em><em><span
lang="EN-US">Wishlist</span><span
lang="EN-US"> </span>έχει προεπιλεγμένη τιμή την κενή λίστα ( [] ). </em></p><p
class="MsoNormal" style="text-align: justify;"><em><span
lang="EN-US"> </span></em></p><p
class="MsoNormal" style="text-align: justify;">Ας δούμε τώρα μια σειρά εκτελέσεων:</p><p
class="MsoNormal" style="text-align: justify;"><ol
style="margin-top: 0cm;" type="1"><li
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">print(wishlist(&#8216;Nokia N8&#8242;))</span></li><li
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">print(wishlist(&#8216;Harry Potter      and the Deathly Hallows&#8217;))</span></li><li
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">print(wishlist(&#8216;Monty Python      and The Holy Grail Blu-Ray Edition&#8217;)) </span></li></ol><p
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US"> </span></p><p
class="MsoNormal" style="text-align: justify;">Σε κάθε εκτέλεση η λίστα διαμορφώνεται ως ακολούθως</p><p
class="MsoNormal" style="text-align: justify;"><ol
style="margin-top: 0cm;" type="1"><li
class="MsoNormal" style="text-align: justify;">[<span
lang="EN-US">'Nokia N8'</span>]</li><li
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">['Nokia N8', 'Harry Potter and      the Deathly Hallows']</span></li><li
class="MsoNormal" style="text-align: justify;"><span
lang="EN-US">['Nokia N8', 'Harry Potter and      the Deathly Hallows', 'Monty Python and The Holy Grail Blu-Ray Edition']</span></li></ol><p
class="MsoNormal" style="text-align: justify;">Παρατηρούμε λοιπόν ότι παρόλο που η λίστα έχει σαν προεπιλεγμένη τιμή την κενή λίστα καθώς συμβαίνουν διαδοχικές εκτελέσεις τα αντικείμενα προστίθενται κανονικά. Αυτό συμβαίνει γιατί η προεπιλεγμένη τιμή ισχύει μόνον για την πρώτη εκτέλεση.</p><p
class="MsoNormal" style="text-align: justify;">Επιπλέον, αξίζει να σημειωθεί ότι παρότι σε κάθε κλήση εκτελείται εκ νέου η συνάρτηση, η κατάσταση της λίστας διατηρείται. Καταλαβαίνουμε λοιπόν ότι η φύση των δυναμικών παραμέτρων δεν επηρεάζεται από τις προεπιλεγμένες τιμές.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Στο επόμενο άρθρο θα κλείσουμε το κεφάλαιο των συναρτήσεων σε <span
lang="EN-US">Python</span>. Μείνετε συντονισμένοι γιατί το τρίτο μέρος του οδηγού σχετικά με συναρτήσεις στην <span
lang="EN-US">Python</span><span
lang="EN-US"> </span>πρόκειται να συνοδεύεται από πρακτικές καλής συγγραφής συναρτήσεων.</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;">Μέχρι την ερχόμενη φορά λοιπόν…</p><p
class="MsoNormal" style="text-align: justify;"><p
class="MsoNormal" style="text-align: justify;"><em><span
style="text-decoration: underline;">να είστε καλά και να φροντίζεται τον εαυτό σας</span></em>.</p></div> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/python-part-6b/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Γιατί η Python μοιάζει με τον Chuck Norris</title><link>http://greektuts.net/why-python-is-like-chuck-norris/</link> <comments>http://greektuts.net/why-python-is-like-chuck-norris/#comments</comments> <pubDate>Thu, 01 Jul 2010 07:20:02 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[Άρθρα]]></category> <category><![CDATA[apostolos]]></category> <category><![CDATA[apostolos kritikos]]></category> <category><![CDATA[chuck norris]]></category> <category><![CDATA[krap]]></category> <category><![CDATA[kritikos]]></category> <category><![CDATA[python and chuck norris]]></category> <category><![CDATA[απόστολος]]></category> <category><![CDATA[Γιατί η Python μοιάζει με τον Chuck Norris]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=4020</guid> <description><![CDATA[Ο οδηγός Python αποτελεί τον πιο ανεπτυγμένο, από άποψη περιεχομένου οδηγό, που έχω καταθέσει στο GreekTuts.net. Οι έμπειροι προγραμματιστές εντοπίζουν εύκολα πότε μια γλώσσα προγραμματισμού αξίζει της προσοχής τους. Με βάση αυτό το σκεπτικό ξεκίνησα να γράφο τον οδηγό της Python χωρίς να σκεφθώ ότι για κάποιους, η δύναμη της Python μπορεί να είναι ασαφής ή ακόμη και άγνωστη.]]></description> <content:encoded><![CDATA[<p>Μία πρόσφατη κουβέντα που είχα με μερικούς φίλους κατέληξε, ούτε λίγο ούτε πολύ στο εξής. «Γιατί να αρχίσεις έναν οδηγό για Python;». Φαίνεται πως η απάντησή μου «γιατί πήρε  το όνομά της από ταινία των Monty Python» δεν ήταν αρκετή. «Ε και; Θα χρειαστούν καλύτερα επιχειρήματα από αυτό για να πείσεις κάποιον να διαβάσει τον οδηγό σου!».</p><p>Όπως είπα παραπάνω, ο έμπειρος προγραμματιστής έχει μια σειρά τρόπων για να κατανοεί τη σπουδαιότητα μιας γλώσσας προγραμματισμού. Ένα πολύ πρακτικός τρόπος, που αποτελεί και γενική πρακτική, είναι η αξιολόγηση των εφαρμογών που έχουν υλοποιηθεί κάνοντας χρήση της γλώσσας αυτής.</p><h1><strong>Ο </strong><strong>Chuck </strong><strong>Norris και η </strong><strong>Python</strong></h1><p><strong> </strong></p><blockquote><p
style="text-align: center;"><img
class="size-full wp-image-4021 aligncenter" src="http://static.greektuts.net/uploads3/2010/07/chuckthon.png" alt="" width="342" height="348" /></p></blockquote><p>Ο Chuck Norris αποτελεί πλέον persona – φαινόμενο χάρη στο διαδικτυακό καλαμπούρι που ξεκίνησε στις τάξεις των geeks του διαδικτύου (<a
href="http://www.chucknorrisfacts.com/">http://www.chucknorrisfacts.com/</a>). Αποτελεί δηλαδή ένα παράδειγμα χαρακτήρα που, ενώ η πρωταρχική του ιδιότητα θα μπορούσε να χαρακτηρισθεί αδιάφορη, η χρήση του σε ένα πετυχημένο (και παράλληλα έξυπνο) project, όχι μόνον τον έφερε και πάλι στο προσκήνιο, αλλά εκτίναξε και το «κασέ» του, στα ύψη.</p><p>Με παρόμοιο τρόπο η Python αντλεί μεγάλη δύναμη μέσα από τις εφαρμογές για την υλοποίηση των οποίων έχει χρησιμοποιηθεί. Προφανώς η Python, σαν γλώσσα προγραμματισμού, έχει κάποια δυνατά σημεία και κάποιες αδυναμίες. Και οι δύο αυτές κατηγορίες σημείων όμως, κατά την προσωπική μου άποψη, περιλαμβάνουν ζητήματα υποκειμενικά. Μία εφαρμογή αντίθετα, χαρακτηρίζεται από χαρακτηριστικά όπως λειτουργικότητα, ορθότητα (ύπαρξη κατά το δυνατό λιγότερων λαθών), φορητότητα (υποστήριξη διαφορετικών λειτουργικών συστημάτων, κλπ. Αυτά τα χαρακτηριστικά, όντας εύληπτα από τους περισσότερους χρήστες, έμπειρους και μη, διευκολύνουν την αξιολόγηση της ίδιας της γλώσσας προγραμματισμού (κρίση δια του αποτελέσματος) μέσα από μία, θεωρώ, αντικειμενικότερη ματιά.</p><p>Αν λοιπόν η επιτυχία του Chuck Norris εκτινάχθηκε στα ύψη από την δημοσιοποίηση ενός καλοστημένου project σκεφθείτε που πρέπει να κατατάξουμε την γλώσσα Python μετά την παρουσίαση όχι μιας, ούτε δύο αλλά 4 + 1 εκπληκτικών εφαρμογών.</p><p>Έχετε δίπλα σας την κούπα με τον αγαπημένο καφέ ή τσάι; Ας ξεκινήσουμε…</p><h1><strong>Mercurial: Δουλέψτε ευκολότερα, δουλέψτε ταχύτερα</strong></h1><p>Αποτελεί εργαλείο που απευθύνεται κυρίως σε ανθρώπους που ασχολούνται με την ανάπτυξη λογισμικού. Πρόκειται για μια εφαρμογή ανοικτού λογισμικού (δηλαδή ο κώδικας διατίθεται ελεύθερα προς χρήση και τροποποίηση) η οποία λειτουργεί σε Windows, Mac OS X και στα περισσότερα συστήματα τύπου UNIX. Αποστολή του είναι η ομαδική ανάπτυξη ενός έργου λογισμικού με ταυτόχρονη παρακολούθηση, καταγραφή και τήρηση ιστορικού των αλλαγών που γίνονται από τους προγραμματιστές που συμμετέχουν στο έργο. Παρακολουθούνται αρχεία τύπου text αλλά και binary αρχεία.</p><p>Η εφαρμογή διατίθεται κάτω από άδεια GNU GPL ενώ ο δημιουργός και κύριος προγραμματιστής του έργου είναι ο Matt Mackall. Η υλοποίησή της βασίζεται στις γλώσσες Python και C.</p><p><span
style="text-decoration: underline;">Επίσημη ιστοσελίδα</span>: <a
href="http://mercurial.selenic.com/">http://mercurial.selenic.com/</a></p><h1><strong>Gwibber: </strong><strong>Microblogging Freedom</strong></h1><p><strong> </strong></p><blockquote><p
style="text-align: center;"><img
class="size-full wp-image-4022 aligncenter" src="http://static.greektuts.net/uploads3/2010/07/gwibber.png" alt="" width="580" height="197" /></p></blockquote><p>Η εφαρμογή gwibber αποτελεί μια δωρεάν εφαρμογή πελάτη για τη διαχείριση γνωστών ιστοσελίδων κοινωνικής δικτύωσης (Twitter, Identi.ca, StatusNet, Facebook, FriendFeed, Digg, Flickr, Qaiku). Είναι φτιαγμένη για εμφανίζει στον χρήστη, ανά πάσα στιγμή, διαφορετικές ροές. Απευθύνεται σε λειτουργικά συστήματα Linux (είναι μάλιστα προεγκατεστημένη στην έκδοση 10.04 της διανομής Ubuntu).</p><p><span
style="text-decoration: underline;">Επίσημη ιστοσελίδα</span>: <a
href="http://gwibber.com/">http://gwibber.com/</a></p><h1><strong>Emesen: An IM for the WLM<sup>TM</sup> network</strong></h1><p>Πρόκειται για μία από τις αγαπημένες μου εφαρμογές για λειτουργικά συστήματα Linux. Αντικαθιστά επάξια το MSN των Windows.</p><p>Αποστολή του είναι να «αντιγράψει» τις ιδιότητες του MSN προσφέροντας στον χρήστη Linux Λειτουργικών συστημάτων ένα εύχρηστο αλλά παράλληλα οικείο περιβάλλον αποστολής προσωπικών μηνυμάτων.</p><p>Λειτουργεί άψογα με λογαριασμούς Microsoft και φυσικά διατίθεται δωρεάν με άδεια GNU GPL.</p><p>Όπως και πριν, το Emesen είναι γραμμένο σε Python.</p><p><span
style="text-decoration: underline;">Επίσημη ιστοσελίδα</span>: <a
href="http://www.emesene.org/">http://www.emesene.org/</a> <strong> </strong></p><h1><strong>Trac: Integrated SCM &amp; Project Management</strong></h1><p><strong> </strong></p><blockquote><p
style="text-align: center;"><img
class="size-full wp-image-4023 aligncenter" src="http://static.greektuts.net/uploads3/2010/07/traclogo.png" alt="" width="512" height="512" /></p></blockquote><p>Ακόμη ένα εξαιρετικό εργαλείο για ανάπτυξη και εκσφαλμάτωση λογισμικού γραμμένο αποκλειστικά σε Python. Διατίθεται δωρεάν και αποτελεί λογισμικό ανοικτού κώδικα. Η αρχική του ονομασία ήταν svntrac λόγω της ικανότητάς του να συνεργάζεται με το Subversion.</p><p><span
style="text-decoration: underline;">Επίσημη ιστοσελίδα</span>: <a
href="http://trac.edgewall.org/">http://trac.edgewall.org/</a></p><h1><strong>(+1) </strong><strong>Django: </strong><strong>Web </strong><strong>framework για τελειομανείς με </strong><strong>deadlines</strong></h1><p><strong> </strong></p><blockquote><p
style="text-align: center;"><img
class="size-full wp-image-4024 aligncenter" src="http://static.greektuts.net/uploads3/2010/07/django.jpg" alt="" width="350" height="122" /></p></blockquote><p>Το Jango αποτελεί στην κυριολεξία ένα trend της εποχής. Πρόκειται για ένα Web Framework που διατίθεται δωρεάν κάτω από BSD License και φυσικά ο κώδικάς του είναι ανοικτός. Η μυστήρια ονομασία του προέρχεται από τον τσιγγάνο κιθαρίστα <a
title="Django  Reinhardt" href="http://en.wikipedia.org/wiki/Django_Reinhardt">Django Reinhardt</a>. Είναι γραμμένο εξ’ ολοκλήρου σε Python.</p><p><span
style="text-decoration: underline;">Επίσημη ιστοσελίδα</span>: <a
href="http://www.djangoproject.com/">http://www.djangoproject.com</a></p><p>Για όσους από εσάς λοιπόν δεν είναι ξεκάθαρο το πόσο σημαντική γλώσσα είναι η Python, οι παραπάνω εφαρμογές έρχονται να «ξεκαθαρίσουν» το τοπίο, κάνοντας σαφές με τον καλύτερο τρόπο ότι κάποιος που γνωρίζει καλά Python, μπορεί να υλοποιήσει μια μεγάλη γκάμα πραγμάτων, που εμπίπτουν σε ποικιλία τεχνολογιών.</p><p>Μέχρι την επόμενη λοιπόν φορά που θα τα πούμε…</p><p><em><span
style="text-decoration: underline;">…να είστε καλά και να προσέχετε τον εαυτό σας</span>.</em></p> ]]></content:encoded> <wfw:commentRss>http://greektuts.net/why-python-is-like-chuck-norris/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>Μαθαίνοντας Python – Μέρος 5ο</title><link>http://greektuts.net/python-part5/</link> <comments>http://greektuts.net/python-part5/#comments</comments> <pubDate>Mon, 16 Nov 2009 17:15:29 +0000</pubDate> <dc:creator>krap</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[Pyhton part 5]]></category> <category><![CDATA[Python – Μέρος 5ο]]></category> <guid
isPermaLink="false">http://greektuts.net/?p=2098</guid> <description><![CDATA[Στο σημερινό μας άρθρο θα ασχοληθούμε με μερικά ειδικά θέματα που αφορούν τον έλεγχο της ροής των προγραμμάτων σε Python. Επειδή πρόκειται για ένα θέμα που βασανίζει τους αρχάριους προγραμματιστές δε θα σας κουράσω με κάποιο άλλο θέμα σε αυτό το μέρος. Θα σας κουράσω όμως με ένα προαιρετικό διαγωνισμό, τον οποίο θα βρείτε στο τέλος του άρθρου.]]></description> <content:encoded><![CDATA[<p>Μετά το ευχάριστο διάλειμμα της προηγούμενης εβδομάδας, ήρθε η στιγμή να συνεχίσουμε το οδοιπορικό μας στην γλώσσα Python.</p><p>Στο τέλος του σημερινού οδηγού θα μπορούμε:</p><ul><li>Να επεμβαίνουμε στην εκτέλεση των βρόγχων for, while, κλπ. χρησιμοποιώντας τα break, continue, else, pass.</li></ul><h2><strong>Προαπαιτούμενα</strong></h2><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></p><h2><strong>Πριν ξεκινήσουμε…</strong></h2><p><strong> </strong></p><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><strong>break</strong></h2><p><strong> </strong></p><p>Για όσους από εσάς γνωρίζουν C / C++ η λειτουργία της δήλωση break πρέπει να είναι προφανής (λειτουργεί με τον ίδιο ακριβώς τρόπο και στην Python). Τοποθετώντας μια δήλωση break σε κάποιο σημείο ενός βρόγχου (for ή while) επιβάλλεται στον Διερμηνευτή της Python να διακόψει την λειτουργία του πλησιέστερου βρόγχου και να εξέλθει από αυτόν.</p><pre name="code" class="python">
for i in range(10):
    if i == 5:
        break
    print(i)
</pre><p>Όπως παρατηρείτε στην οθόνη των αποτελεσμάτων σας έχετε νούμερα μέχρι κι το 4. Αυτό συμβαίνει διότι μόλις ο Διερμηνευτής της Python συνάντησε τον αριθμό 5, η εντολή break διέκοψε το βρόγχο.</p><p><strong> </strong></p><h2><strong>H δήλωση </strong><strong>continue</strong></h2><p><strong> </strong></p><p>Αντίθετα με την break, η δήλωση continue, περνάει στο επόμενο βήμα του βρόγχου, αγνοώντας τις εντολές για το τρέχον βήμα.</p><p><strong> </strong></p><pre name="code" class="python">
for i in range(10):
    if i == 5:
        continue
    print(i)
</pre><p>Τρέχοντας το παραπάνω παράδειγμα θα διαπιστώσετε ότι στην οθόνη των αποτελεσμάτων σας εμφανίζονται όλοι οι αριθμοί εκτός του 5. Αυτό συμβαίνει διότι όταν ο βρόγχος φθάσει στον αριθμό 5 (έκτο βήμα του βρόγχου), αγνοεί, λόγω της continue την εντολή print(i) με αποτέλεσμα ο αριθμός 5 να μην τυπώνεται ποτέ.</p><p><strong> </strong></p><h2><strong>Η δήλωση </strong><strong>else (για έναν βρόγχο </strong><strong>for)</strong></h2><p><strong> </strong></p><p>Η εμφάνιση μιας δήλωσης else σε βρόγχους είναι κάτι καινούριο. Ενεργοποιείται σε έναν βρόγχο τύπου for όταν η λίστα αντικειμένων τελειώσει ή, αντίστοιχα, σε έναν βρόγχο τύπου while, όταν η συνθήκη γίνει ψευδής.</p><pre name="code" class="python">
myCellar = ['apples', 'pork', 'cranberries', 'oil', 'wine', 'retsina']
productsInDemand = ['retsina', 'ouzo']
for demand in productsInDemand:
    for supply in myCellar:
        if demand == supply:
            print("we do have ", demand)
            break
else:
    print("we ran out of ", demand)
</pre><p>Ας δούμε ένα παράδειγμα που συνδυάζει τη χρήση break και else σε βρόγχους τύπου for. Στο παραπάνω παράδειγμα υποθέτουμε ότι έχουμε ένα κελάρι με προϊόντα. Το απεικονίζουμε με μια λίστα myCellar στην οποία είναι παρόντα μόνον όσα προϊόντα υπάρχουν (ανεξαρτήτου ποσότητας) στο κελάρι. Μια δεύτερη λίστα (productsInDemand) περιλαμβάνει προϊόντα που μας ζητά κάποιος και εμείς πρέπει να ψάξουμε αν είναι διαθέσιμα στο κελάρι.</p><p>Το εξωτερικό for loop διατρέχει τα προϊόντα που ζητήθηκαν και, για κάθε ένα ζητούμενο, το εσωτερικό for τσεκάρει αν το ζητούμενο προϊόν υπάρχει στο κελάρι. Αν βρεθεί, τυπώνεται μήνυμα επιτυχίας της αναζήτησης και ο εσωτερικός βρόγχος σταματά να εκτελείται. Στην περίπτωση που τα στοιχεία της λίστας που διατρέχει ο εσωτερικός βρόγχος (myCellar)  εξαντληθούν, εκτελούνται οι εντολές του else, δηλαδή τυπώνεται μήνυμα αποτυχίας.</p><p><strong> </strong></p><h2><strong>H δήλωση </strong><strong>pass</strong></h2><p><strong> </strong></p><p>Η δήλωση pass, είναι μια εξαιρετικά ενδιαφέρουσα δήλωση, ίσως η πιο χρήσιμη για έναν προγραμματιστή. Όταν ο Διερμηνευτής τη συναντήσει, δεν κάνει απολύτως τίποτε.</p><pre name="code" class="python">
while True:
    pass
</pre><p>Ο συγκεκριμένος κώδικας (υπάρχει και στο παράδειγμα του σημερινού οδηγού) θα προκαλέσει έναν ατέρμονα βρόγχο (δηλ έναν βρόγχο που θα απασχολεί αιώνια τον διερμηνευτή σας). Μην αγχωθείτε, ανά πάσα στιγμή τον διακόπτετε πατώντας την ακολουθία πλήκτρων ctrl + c</p><p>Γιατί είναι κάτι τέτοιο χρήσιμο; Θα αναρωτηθείτε εύλογα. Σκεφτείτε ότι έχετε να κατασκευάσετε ένα μεγάλο πρόγραμμα κάνοντας χρήση αντικειμενοστρεφούς σχεδίασης. Ο αντικειμενοστρέφής προγραμματισμός, όπως ίσως να ξέρετε, κάνει χρήση αντικειμένων (θα δούμε αναλυτικά το θέμα των αντικειμένων σε μεταγενέστερους οδηγούς). Ας υποθέσουμε λοιπόν ότι σχεδιάζεται ένα σκελετό του προγράμματός σας που αποτελείτε από τα αντικείμενα vehicle, car, human.</p><p>Κάνοντας αυτό:</p><pre name="code" class="python">
class Vehicle:
    pass
class Car:
    pass
class Human:
    pass
</pre><p>μπορείτε να έχετε τις κλάσεις που αποφασίσατε να δημιουργήσετε, κενές, ώστε σιγά – σιγά να υλοποιείτε το σύστημά σας, γνωρίζοντας πάντα όλα όσα έχετε να κάνετε.</p><p>Σκεφτείτε το και θα δείτε ότι θα κάνει τη ζωή σας ευκολότερη…</p><h2><strong><span
style="color: #ff0000">Mini Διαγωνισμός</span><br
/> </strong></h2><p>Κατασκευάστε ένα πρόγραμμα σε Python το οποίο, δεδομένου ενός ονόματος (δωσμένο με λατινικούς χαρακτήρες), να εμφανίζει μόνον τα σύμφωνα.</p><ul><blockquote><li>Υποθέστε      ότι έχουμε να κάνουμε με ονόματα στα λατινικά (John, Mary, Aristides, Isocrates, κλπ.), όχι Greeklish (Kwstas, Evgenia)</li><li>Το      όνομα μπορεί να περιέχει κεφαλαίους και πεζούς χαρακτήρες (Christine, Apostolos)</li><li>Τα      φωνήεντα στο αγγλικό αλφάβητο είναι τα a, o,      e, i, u, y</li><li>Να      γίνει χρήση break και else δηλώσεων</li></blockquote></ul><p>Μπορείτε να στείλετε τις απαντήσεις σας στο προσωπικό μου email (<a
href="mailto:akritiko@gmail.com">akritiko@gmail.com</a>) με θέμα «GreekTuts: Διαγωνισμός Python». <strong>Οι 3 καλύτερες λύσεις (που δουλεύουν) μέχρι τέλος Δεκεμβρίου κερδίζουν από μια Basic συνδρομή ενός μηνός για την ιστοσελίδα μας.</strong></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/uploads/2009/11/py_tuts_part_5.rar" target="_self"><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-part5/feed/</wfw:commentRss> <slash:comments>4</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>
