ΚΕΝΤΡΟ ΠΛΗ.ΝΕ.Τ. Ν. ΦΛΩΡΙΝΑΣ

Η Γλώσσα Προγραμματισμού Python - Προχωρημένα Θέματα

 

Η Εντολή If

Η εντολή If συντάσσεται ως εξής : 

if x > 0:

print "Ο αριθμός x είναι θετικός"

Η λογική έκφραση που βρίσκεται μετά από την εντολή if είναι γνωστή ως συνθήκη (condition) και αν είναι αληθής (true), τότε εκτελείται η εντολή που βρίσκεται σε εσοχή. Αν είναι ψευδής (false), δεν συμβαίνει τίποτα.

Η εντολή If αποτελείται από μια επικεφαλίδα (header) και ένα μπλοκ εντολών :

ΕΠΙΚΕΦΑΛΙΔΑ:

ΠΡΩΤΗ ΕΝΤΟΛΗ

...

ΤΕΛΕΥΤΑΙΑ ΕΝΤΟΛΗ

Η επικεφαλίδα ξεκινάει σε μια καινούργια γραμμή και τελειώνει με το σύμβολο : (colon). Οι εντολές που ακολουθούν και που βρίσκονται σε εσοχή αποκαλούνται μπλοκ (block). Η πρώτη εντολή που βρίσκεται εκτός εσοχής σημαίνει το τέλος του μπλοκ εντολών της εντολής If.

 

Η Εντολή If … Else

Μια άλλη μορφή της εντολής if είναι ο συνδυασμός της με την εντολή else, όπου έχουμε και ένα άλλο μπλοκ εντολών που εκτελείται όταν η συνθήκη είναι ψευδής. Η σύνταξη είναι ως εξής :

if x%2 == 0:

print x, " είναι άρτιος"

else:

print x, " είναι περιττός"

Αν το υπόλοιπο της διαίρεσης του x με το 2 είναι 0, τότε ο αριθμός x είναι άρτιος και το πρόγραμμα εμφανίζει ένα ανάλογο μήνυμα. Αν η συνθήκη είναι ψευδής (false), δηλ. αν ο αριθμός είναι περιττός, τότε εκτελείται το δεύτερο σύνολο εντολών. Μπορούμε να ενσωματώσουμε τον παραπάνω κώδικα προγράμματος σε μια συνάρτηση (function) και να την καλούμε όποτε θέλουμε να μάθουμε αν ένας αριθμός είναι άρτιος ή περιττός, όπως :

def printParity(x):

if x%2 == 0:

                                    print x, " είναι άρτιος"

else:

print x, " είναι περιττός"

Όταν καλούμε τη συνάρτηση printParity, μπορούμε να της δώσουμε ως όρισμα (argument) μια οποιαδήποτε ακέραια έκφραση, όπως :

printParity(17)

printParity(y+1)

 

Η Εντολή If … Elif … Else

Υπάρχουν περιπτώσεις που σε μια συνθήκη χρειαζόμαστε περισσότερα από δύο μπλοκ εντολών προς εκτέλεση, οπότε σ’ αυτήν την περίπτωση πρέπει να παρεμβάλλουμε και την εντολή elif, ως εξής :

if x < y:

print x, " είναι μικρότερο από το ", y

elif x > y:

print x, " είναι μεγαλύτερο από το ", y

else:

print x, " και ", y, " είναι ίσα"

Το elif είναι μια σύντμηση του "else if". Και εδώ, ένα μόνο μπλοκ εντολών θα εκτελεσθεί. Δεν υπάρχει περιορισμός στον αριθμό των εντολών elif που μπορούμε να γράψουμε αλλά επιτρέπεται μόνο μία εντολή else, η οποία πρέπει να είναι και η τελευταία εντολή, όπως : 

if choice == 'A':

functionA()

elif choice == 'B':

functionB()

elif choice == 'C':

functionC()

else:

print "Λάθος επιλογή"

Η κάθε συνθήκη ελέγχεται με τη σειρά της. Αν η πρώτη είναι ψευδής (false), τότε ελέγχεται η επόμενη κοκ. Αν κάποια βρεθεί αληθής (true), τότε εκτελείται το αντίστοιχο μπλοκ εντολών και η εντολή If τελειώνει. Ακόμα και στην περίπτωση που είναι αληθείς περισσότερες από μία συνθήκες, εκτελείται μόνο η πρώτη στη σειρά.

 

Οι Ένθετες Εντολές If

Μια συνθήκη μπορεί επίσης να περιέχεται μέσα σε μια άλλη συνθήκη και θα μπορούσαμε να γράψουμε το παραπάνω παράδειγμα και ως εξής :

if x == y:

print x, " και ", y, " είναι ίσα"

else:

if x < y:

print x, " είναι μικρότερο από το ", y

else:

print x, " είναι μεγαλύτερο από το ", y

Η εξωτερική συνθήκη περιέχει δύο κλάδους. Ο πρώτος κλάδος περιέχει μια απλή εντολή εξόδου και ο δεύτερος κλάδος περιέχει μια άλλη εντολή if, η οποία έχει δύο δικούς της κλάδους. Αυτοί οι δύο κλάδοι είναι εντολές εξόδου αν και θα μπορούσαν να ήταν κι αυτές εντολές υπό συνθήκη. Θα μπορούσαμε να γράψουμε και το εξής :

if 0 < x:

if x < 10:

print "το x είναι ένα θετικό ψηφίο"

Η εντολή print εκτελείται μόνο αν είναι αληθείς και οι δύο συνθήκες, έτσι μπορούμε να χρησιμοποιήσουμε τον λογικό τελεστή and :

if 0 < x and x < 10:

print "το x είναι ένα θετικό ψηφίο"

Η Python παρέχει και μια άλλη σύνταξη που θυμίζει πιο πολύ τα μαθηματικά :

if 0 < x < 10:

print "το x είναι ένα θετικό ψηφίο"

 

Η Εντολή Return

Με την εντολή return μπορούμε να τελειώσουμε την εκτέλεση μιας συνάρτησης πριν φθάσουμε στο τέλος της, όπως στην περίπτωση που εντοπιστεί κάποια λάθος καταχώρηση του χρήστη :

import math

def printLogarithm(x):

if x <= 0:

print "Μόνο θετικοί αριθμοί γίνονται δεκτοί"

return

result = math.log(x)

print "Ο λογάριθμος του x είναι : ", result

Η συνάρτηση printLogarithm έχει μια παράμετρο με όνομα x και το πρώτο πράγμα που κάνει είναι ότι ελέγχει αν το x είναι μικρότερο ή ίσο από το 0, όπου στην περίπτωση αυτή εμφανίζει ένα μήνυμα λάθους και μετά χρησιμοποιεί την εντολή return για να τελειώσει η εκτέλεση της συνάρτησης. Η ροή της εκτέλεσης επιστρέφει στο κομμάτι του προγράμματος που κάλεσε την συνάρτηση και έτσι δεν εκτελούνται οι υπόλοιπες εντολές της συνάρτησης.

 

Η Αναδρομή (Recursion)

Μια συνάρτηση μπορεί να καλεί μια άλλη συνάρτηση ή και τον ίδιο τον εαυτό της, όπως η παρακάτω συνάρτηση :

def countdown(n):

if n == 0:

print "Τέλος!"

else:

print n

countdown(n-1)

Η συνάρτηση countdown περιμένει η παράμετρος n να είναι ένας θετικός ακέραιος αριθμός και αν είναι ίσος με 0, τότε εμφανίζει το μήνυμα "Τέλος!", αλλιώς εμφανίζει το ίδιο το n και μετά καλεί την ίδια την συνάρτηση countdown και της μεταβιβάζει το όρισμα n-1. Θα δούμε τώρα τι θα συμβεί αν καλέσουμε την συνάρτηση αυτή με όρισμα το 3, ως εξής :

countdown(3)

Η εκτέλεση της συνάρτησης countdown ξεκινά με n=3 και εφόσον το n δεν είναι ίσο με το 0, εμφανίζει την τιμή 3 και μετά καλεί τον εαυτό της. Η εκτέλεση της συνάρτησης countdown ξεκινά με n=2 και εφόσον το n δεν είναι ίσο με το 0, εμφανίζει την τιμή 2 και μετά καλεί τον εαυτό της. Η εκτέλεση της συνάρτησης countdown ξεκινά με n=1 και εφόσον το n δεν είναι ίσο με το 0, εμφανίζει την τιμή 1 και μετά καλεί τον εαυτό της. Η εκτέλεση της συνάρτησης countdown ξεκινά με n=0 και εφόσον το n είναι ίσο με το 0, εμφανίζει το μήνυμα "Τέλος!" και τελειώνει.

3

2

1

Τέλος!

Η διαδικασία όπου μια συνάρτηση καλεί τον εαυτό της αποκαλείται αναδρομή (recursion) και οι συναρτήσεις αυτού του είδους είναι γνωστές με τον όρο αναδρομικές (recursive).

 

Μορφοποίηση της Εκτύπωσης

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

Υπάρχουν δύο τρόποι για να μορφοποιήσουμε την έξοδο, όπου ο πρώτος είναι να χρησιμοποιήσουμε συναρτήσεις strings και ο δεύτερος είναι να χρησιμοποιήσουμε τον γνωστό από τη γλώσσα C τελεστή %. Για να μετατρέψουμε μια τιμή σε string, μπορούμε να την μεταβιβάσουμε σε μια από τις συναρτήσεις repr() ή str() ή να γράψουμε την τιμή ανάμεσα στα αντίστροφα εισαγωγικά (``), που είναι το ίδιο με την συνάρτηση repr()).

Ακολουθούν παραδείγματα :

s = 'Florina per sempre'

str(s)

'Florina per sempre'

`s`

"'Florina per sempre'"

 

x = 10 * 3.25

y = 200 * 200

s = 'Η τιμή του x είναι ' + `x` + ' και η τιμή του y είναι ' + `y` + ' ...'

print s

Η τιμή του x είναι 32.5 και η τιμή του y είναι 40000 ...

Ακολουθούν δύο παραδείγματα κώδικα για το πώς μπορούμε να εμφανίσουμε τις τιμές των τετραγώνων και των κύβων, δηλ. τις δεύτερες και τις τρίτες δυνάμεις, των ακεραίων αριθμών από το 1 έως και το 10 :

import string

for x in range(1, 11):

...     print string.rjust(`x`, 2), string.rjust(`x*x`, 3),

...     print string.rjust(`x*x*x`, 4)

...

1   1    1

2   4    8

3   9   27

4  16   64

5  25  125

6  36  216

7  49  343

8  64  512

9  81  729

10 100 1000

 

for x in range(1, 11):

...     print '%2d %3d %4d' % (x,  x*x, x*x*x)

...

1   1    1

2   4    8

3   9   27

4  16   64

5  25  125

6  36  216

7  49  343

8  64  512

9  81  729

10 100 1000

Πρέπει να έχουμε υπόψη μας ότι η εντολή print προσθέτει πάντα ένα κενό ανάμεσα στα ορίσματά της. Η συνάρτηση string.rjust() στοιχίζει στα δεξιά ένα string σ’ ένα δεδομένο πλάτος και γεμίζει με κενά στα αριστερά. Υπάρχουν και οι αντίστοιχες συναρτήσεις string.ljust() και string.center().

Υπάρχει και η συνάρτηση string.zfill(), η οποία γεμίζει από αριστερά ένα αριθμητικό string με μηδενικά, όπως :

import string

string.zfill('12', 5)

'00012'

 

Διάβασμα από και Γράψιμο σε Αρχεία

Η συνάρτηση open() επιστρέφει ένα αντικείμενο του τύπου file (αρχείο) και χρησιμοποιείται συνήθως με δύο ορίσματα (arguments), ως εξής :

"open(filename, mode)"

f=open('/tmp/workfile', 'w')

print f

<open file '/tmp/workfile', mode 'w' at 80a0960>

Το πρώτο όρισμα είναι ένα string που περιέχει το όνομα του αρχείου (filename), ενώ το δεύτερο όρισμα είναι ένα άλλο string που περιέχει κάποιους χαρακτήρες που καθορίζουν τον τρόπο που θα χρησιμοποιηθεί το αρχείο (mode).

Το mode μπορεί να είναι ίσο με 'r' όταν το αρχείο θα ανοίξει μόνο για διάβασμα (read) ή ίσο με 'w' όταν το αρχείο θα ανοίξει μόνο για να γράψουμε σ’ αυτό (writing), που σημαίνει ότι αν υπάρχει ήδη ένα αρχείο με το ίδιο όνομα αυτό θα διαγραφεί και τέλος το 'a' ανοίγει το αρχείο για προσθήκη δεδομένων (append) στο τέλος του. Το 'r+' ανοίγει το αρχείο για διάβασμα και για γράψιμο. Πρέπει να έχουμε υπόψη μας ότι το όρισμα mode είναι προαιρετικό και αν δεν χρησιμοποιηθεί, λαμβάνεται εξ ορισμού το 'r'.

 

Οι Μέθοδοι του Αντικειμένου File

Για τα παραδείγματα που θα δούμε εδώ, υποθέτουμε ότι έχει δημιουργηθεί ένα αντικείμενο του τύπου file με όνομα f. Για να διαβάσουμε τα περιεχόμενα ενός αρχείου, καλούμε τη συνάρτηση f.read(size), η οποία διαβάζει κάποια ποσότητα δεδομένων και τα επιστρέφει με τη μορφή string. Το size είναι ένα προαιρετικό αριθμητικό όρισμα (argument).

Όταν το size παραλείπεται ή είναι αρνητικό, θα διαβασθούν όλα τα περιεχόμενα του αρχείου. Αλλιώς, διαβάζονται τόσα bytes όσο είναι το size. Αν φθάσουμε στο τέλος του αρχείου, η f.read() θα επιστρέψει ένα κενό string ("").

f.read()

'Αυτά είναι όλα τα περιεχόμενα του αρχείου.\n'

f.read()

Η συνάρτηση f.readline() διαβάζει μία μόνο γραμμή από το αρχείο και ένας χαρακτήρας νέας γραμμής (\n) τοποθετείται στο τέλος του string. Αν η f.readline() επιστρέψει ένα κενό string, αυτό σημαίνει ότι έχουμε φθάσει στο τέλος του αρχείου (end of the file), ενώ μια κενή γραμμή παριστάνεται με το '\n', δηλ. με τον χαρακτήρα νέας γραμμής (newline).

f.readline()

'Αυτή είναι η πρώτη γραμμή του αρχείου.\n'

f.readline()

'Αυτή είναι η δεύτερη γραμμή του αρχείου.\n'

f.readline()

Η συνάρτηση f.tell() επιστρέφει έναν ακέραιο που μας δίνει την τρέχουσα θέση του αντικειμένου file στο αρχείο, η οποία μετριέται σε bytes από την αρχή του αρχείου. Για να αλλάξουμε αυτή τη θέση, χρησιμοποιούμε τη συνάρτηση f.seek(offset, from_what). Η θέση που θέλουμε να πάμε μέσα στο αρχείο υπολογίζεται προσθέτοντας το offset σε κάποιο σημείο αναφοράς (reference point), το οποίο σημείο αναφοράς καθορίζεται από την τιμή που έχει το όρισμα from_what.

Μια τιμή του from_what ίση με 0 μετράει από την αρχή του αρχείου, η τιμή 1 χρησιμοποιεί την τρέχουσα θέση του αρχείου και η τιμή 2 χρησιμοποιεί το τέλος του αρχείου ως σημείο αναφοράς. Η τιμή του from_what μπορεί να παραλειφθεί και να είναι ίση με 0 εξ ορισμού.

f=open('/tmp/workfile', 'r+')

f.write('0123456789abcdef')

f.seek(5)         # Πήγαινε στο 6ο byte του αρχείου

f.read(1)

'5'

f.seek(-3, 2)    # Πήγαινε στο 3ο byte από το τέλος του αρχείου

f.read(1)

'd'

Όταν τελειώσουμε την εργασία μας με κάποιο αρχείο, πρέπει να καλέσουμε τη συνάρτηση f.close() για να το κλείσουμε και να απελευθερώσουμε τους πόρους του συστήματος που δεσμεύει.

f.close()

  

back.gif (9867 bytes)

Επιστροφή