Μάθημα : Γ ΤΑΞΗ - ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΑΡΧΕΣ ΤΗΣ ΕΠΙΣΤΗΜΗΣ ΤΩΝ Η/Υ

Κωδικός : T266205

T266205 - ΧΙΟΝΑΣ ΠΑΠΑΔΟΠΟΥΛΟΣ

Ενότητες μαθήματος

ΚΕΦΑΛΑΙΟ 1 - Προγραμματισμός στην PYTHON

από 6/4/20 

Σχεδίαση και συγγραφή κώδικα

 

Online editor της Python κάντε τις ασκήσεις σε αυτό το περιβάλλον χωρίς εγκατάσταση

https://www.online-python.com/

Πληκτρολογείται κάθε φορά μια εντολή και εκτελείται. Το prompt (σύμβολο) για το ξεκίνημα πληκτρολόγησης μιας νέας εντολής είναι συνήθως τα τρία σύμβολα «>>>». Στο τέλος μιας εντολής πατάμε το RUN για να εκτελεστεί η εντολή. Ακριβώς από κάτω, εμφανίζεται το αποτέλεσμά της, π.χ. Πληκτρολογούμε: print “Welcome to the Python world!” και μετά RUN. Στην οθόνη (στην πραγματικότητα,όταν αναφερόμαστε στην οθόνη, εννοούμε στο παράθυρο του διερμηνευτή) θα εμφανιστεί:

>>> print "Welcome to the Python world!"

Welcome to the Python world!

Μόλις γράψαμε μια εντολή (statement) σε Python. Χρησιμοποιήθηκε η ενσωματωμένη συνάρτηση print (εκτύπωσε), για να εμφανιστεί στην οθόνη μια τιμή που της δίνουμε (στην έννοια της συνάρτησης θα αναφερθούμε αναλυτικότερα σε επόμενη παράγραφο). Εδώ είναι ένα μήνυμα. Με το RUN δίνεται η έξοδος (output) της εντολής άμεσα στην επόμενη γραμμή της οθόνης. Η έξοδος εδώ είναι η εμφάνιση του μηνύματος στο όρισμα της print.

Δείτε τις εργασίες και τις ασκήσεις που υπάρχουν για αυτή την ενότητα.

Ασκήσεις

Φύλλο Πληροφοριών 1

ΠΡΟΣΟΧΗ:

  • Στη γλώσσα Python υπάρχει διαφορά ανάμεσα σε μικρά και κεφαλαία (υπάρχει η εντολή print αλλά δεν υπάρχει η εντολή PRint)
  • Όταν ξεκινάω να γράψω μία νέα γραμμή τα κενά έχουν σημασία (προς το παρόν δεν αφήνω κενό)
  • Μπορώ να χρησιμοποιώ Αντιγραφή και επικόλληση με δεξί κλικ (copy & paste)
  • Πατήστε ανά διαστήματα File –> save και αποθηκεύστε το πρόγραμμα με το όνομα 1.py στο δικό σας φάκελο. ΟΛΑ ΤΑ ΠΡΟΓΡΑΜΜΑΤΑ ΣΤΗ ΓΛΩΣΣΑ PYTHON ΕΧΟΥΝ ΤΗΝ ΚΑΤΑΛΗΞΗ .py
  • Όλες οι μεταβλητές μπορεί να έχουν για όνομα γράμματα του λατινικού αλφαβήτου (a,b,c…)αριθμούς και κάτω παύλα_αλλά απαγορεύεται να ξεκινάνε από αριθμό.(όλα τα άλλα σύμβολα απαγορεύονται και τα κενά επίσης)

Αντιστοίχιση εντολών ψευδοκώδικα με εντολές Python

Εργασίες

Γλώσσα προγραμματισμού python

Eγκαταστήστε την python στον Η/Υ σας

Η γλώσσα αυτή γράφτηκε από τον Ολλανδό προγραμματιστή Guido van Rossum στα τέλη της δεκαετίας 1980-90. Η έκδοση 2.0 δημοσιεύτηκε στις 16 Οκτωβρίου 2000 και η έκδοση 3.0, η οποία δεν είναι, εν γένει, σύμφωνη (compatible) με τις προηγούμενες εκδόσεις, στις 3 Δεκεμβρίου 2008. Για τις ανάγκες του μαθήματος θα χρησιμοποιήσουμε την έκδοση 3.5.

Η python είναι μία γλώσσα <<υψηλού επιπέδου>> (άλλα παραδείγματα τέτοιων γλωσσών είναι η FORTRAN, C, Java κλπ). Ο κώδικας μία τέτοιας γλώσσας πρέπει να μετατραπεί σε <<γλώσσα μηχανής>> ώστε να εκτελεστεί από τον Η/Υ. Η επεξεργασία αυτή γίνεται από διερμηνευτές (interpreters) και μεταγλωττιστές (compilers). Στην περίπτωση της python η επεξεργασία γίνεται από διερνηνευτή.

Η Python είναι μια γλώσσα προγραμματισμού με απλό συντακτικό, εξαιρετική αναγνωσιμότητα, φορητότητα (portability) και μοντέρνα χαρακτηριστικά που την κάνουν κατάλληλη ως πρώτη γλώσσα προγραμματισμού. Η επιτυχία της οφείλεται σε μεγάλο βαθμό στο γεγονός ότι είναι ερμηνευόμενη γλώσσα (interpreted language). Αυτό σημαίνει ότι ο μεταγλωττιστής της Python παράγει ενδιάμεσο κώδικα (bytecode) ο οποίος μπορεί να εκτελεστεί από τον διερμηνέα (interpreter) σε πολλά διαφορετικά υπολογιστικά περιβάλλοντα. Διερμηνείς για τη γλώσσα Python υπάρχουν για όλα τα δημοφιλή λειτουργικά συστήματα (Windows, Linux, MacOS). Αν ο προσωπικός σας υπολογιστής χρησιμοποιεί το λειτουργικό σύστημα Linux ή το MacOS τότε η Python είναι ήδη εγκατεστημένη (βεβαιωθείτε όμως ότι έχετε τον διερμηνέα για την Python 3 γράφοντας python3 στη γραμμή εντολών). Διαφορετικά, μπορείτε να εγκαταστήσετε το περιβάλλον εργασίας Python με το όνομα Canopy από την ιστοσελίδα της Enthought.

Οι ελεύθερα προσβάσιμοι υπολογιστές του Τμήματος χρησιμοποιούν το λειτουργικό σύστημα Linux και έχουν, φυσικά, εγκατεστημένο το διερμηνέα για την Python 3. Περιέχουν επίσης, το κέλυφος IDLE, δηλαδή έναν διαδραστικό διερμηνέα της Python με ενσωματωμένο κειμενογράφο. Τα εργαστήρια του μαθήματος θα γίνονται σε αυτά τα υπολογιστικά συστήματα, αλλά μπορείτε να χρησιμοποιείτε τον δικό σας φορητό υπολογιστή.

Έχουμε επιλέξει την python για να μάθουμε προγραμματισμό διότι είναι:

 

  • Γλώσσα ανοικτού κώδικα (διαθέσιμη στη διεύθυνση http://python.org).
  • Γενικής χρήσης, υψηλού επιπέδου γλώσσα προγραμματισμού.
  • Εύκολη στην εκμάθηση (απλό συντακτικό).
  • Με δυνατότητες σε διάφορες κατευθύνσεις (ισχυρή γλώσσα προγραμματισμού).
  • Κατάλληλη για αρχάριους και για έμπειρους προγραμματιστές.
  • Αντικειμενοστραφής.
  • Υπάρχουν αρκετά πακέτα υποστήριξης (βιβλιοθήκες).

Μεταβλητές

Πράξεις με αριθμούς

Θα δώσουμε πολλαπλασιασμό και διαίρεση αριθμών και θα πάρουμε το αποτέλεσμα:

 


>>> 3*4
12
>>> 3.0*4.0
12.0
>>> 3.0*4
12.0
>>> 1/2
0.5
>>> 4/2
2.0
>>> 2/3
0.6666666666666666


Στο online περιβάλλον στο τρίτο πλαίσιο με το μαυρο χρώμα μπορείτε να δοκιμάσετε τα παραδείγματα.

Τύποι μεταβλητών

  1. int (ακέραιος)
  2. float (κινητής υποδιαστολής)
  3. bool (λογική μεταβλητή: παίρνει τις τιμές True ή False)
  4. NoneType (παίρνει την τιμή None, δηλώνει απουσία τιμής)

Παράδειγμα. Θα δώσουμε τιμές σε μεταβλητές (κινητής υποδιαστολής) με ονόματα: pi, a.


>>> pi = 3.14
>>> a = 10.0

Κάνουμε πράξεις με μεταβλητές και παίρνουμε το αποτέλεσμα σε νέα μεταβλητή.


>>> emvado = pi*a**2
>>> print (emvado)

Βρήκαμε το εμβαδό δίσκου με ακτίνα ίση με 10. Χρειάστηκε να υψώσουμε στο τετράγωνο (a**2) και να κάνουμε πολλαπλασιασμό (με το σύμβολο *). Τελικά εκχωρήσαμε το αποτέλεσμα του π a2 στη νέα μεταβλητή area.

Τελεστές.

  • 10+4 --> 14 (Πρόσθεση)
  • 10-4 --> 6 (Αφαίρεση)
  • 10*4 --> 40 (Πολλαπλασιασμός)
  • 10**4 --> 10000 (Ύψωση σε δύναμη)
  • 10/4 --> 2.5 (Διαίρεση)
  • 10//4 --> 2 (Ακέραια διαίρεση)
  • 10%4 --> 2 (Υπόλοιπο ακέραιας διαίρεσης)

 

Παράδειγμα. Δίνουμε τιμές σε μεταβλητές:


>>> a = 3
>>> b = 3.14
>>> d = True
>>> n = None

Με την εντολή type μπορούμε να ελέγξουμε τον τύπο των μεταβλητών οι οποίες ήδη έχουν ορισθεί (έχουν τιμές).


>>> type(a)
<class 'int'>
>>> type(b) <class 'float'>
>>> type(d) <class 'bool'>
>>> type(n) <class 'NoneType'>

 

Άσκηση. Έχουμε 800 εγγεγραμμένους μαθητές στο σχολείο μας. Αν οι βαθμολογίες των μαθημάτων καταχωρηθούν με την βοήθεια της python, τι τύπων και πόσες μεταβλητές  χρειαζόμαστε για να καλύψουμε την βαθμολογία και των 800 μαθητών;

 

Άσκηση. Αναφέρετε περιπτώσεις όπου ο τύπος NoneType θα ήταν χρήσιμος.

Ονόματα μεταβλητών

  • Μπορούν να περιέχουν γράμματα και αριθμούς (αλφαριθμητικούς χαρακτήρες),
  • αλλά πρέπει να ξεκινούν με ένα γράμμα.
  • Τα πεζά διακρίνονται από τα κεφαλαία.
  • Μπορεί να περιέχεται το underscore (_).
Παραδείγματα

>>> natural_number = 3
>>> to_pi = 3.14
>>> greeting = 'hallo there!'
>>> protasi = True
>>> bathmos = None
>>> Bathmos = 10

 

Μη αποδεκτά ονόματα μεταβλητών:

  • 1number - αρχίζει με αριθμό.
  • number! - περιέχει το !
  • class - είναι λέξη-κλειδί.

 

Λέξεις κλειδιά

Είναι δεσμευμένες λέξεις με ειδική σημασία. Για να τις δούμε όλες:

 


>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

Εντολές

Έχουμε ήδη δει μερικές εντολές της python: print, type, int, float, str.

Παραδείγματα:

>>> print(a)
3
>>> print(d)
True
>>> print(a,b)
3 3.14
>>> int(b)
3
>>> float(a)
3.0
>>> str(3.14159)
'3.14159'
>>> print(greeting)
hallo there!

'Αλλα παραδείγματα:


>>> print(a,b,greeting)
3 3.14 hallo there!

Άσκηση Γράψτε εντολές με τις οποίες θα δίνονται τιμές σε δύο μεταβλητές (π.χ. 3 και 3.14 αντίστοιχα) και μετά θα τυπώνεται το εξής
The value is: 3
The value is: 3.14

Πακέτα

Έχουμε δει επίσης την εντολή import η οποία μας επιτρέπει πρόσβαση σε προκαθορισμένες μεταβλητές, συναρτήσεις κλπ. Το πακέτο math περιέχει χρήσιμες μαθηματικές σταθερές και μαθηματικές συναρτήσεις.


>>> import math
>>> print(math.pi)
3.141592653589793
>>> math.sqrt(2.0)
1.4142135623730951
>>> math.sqrt(2)
1.4142135623730951
>>> math.exp(1)
2.718281828459045

Σφάλματα

Συντακτικό σφάλμα. Ας δούμε τα εξής


>>> print c
SyntaxError: Missing parentheses in call to 'print'
>>> print(c,Nick)
Traceback (most recent call last):
  File "<pyshell#32>", line 1, in 
    print(c,Nick)
NameError: name 'Nick' is not defined
</pyshell#32>

H πρώτη εντολή έχει συντακτικό λάθος το οποίο η Python ονομάζει SyntaxError. Η δεύτερη εντολή έχει ένα λάθος το οποίο η Python ονομάζει NameError. Ο διερνηνευτής (interpreter) μας δίνει πληροφορία σχετικά με το κάθε λάθος.

Σφάλμα σημαντικής. Ας δούμε επίσης


>>> print(3,2)
3 2

 

Τυπώσαμε δύο αριθμούς. Δεν φαίνεται να υπάρχει κανένα λάθος στο παραπάνω. Εάν όμως ο σκοπός μας ήταν να τυπώσουμε τον αριθμό 3.2 τότε έχουμε κάνει ένα λάθος σημαντικής (semantic error). Δηλαδή, η εντολή δίνει μεν ένα αποτέλεσμα, αλλά δεν είναι αυτό που θέλαμε.

 

Μελέτη

Τοπικές ιστοσελίδες
  1. Ιστοσελίδα μαθήματος "Γλώσσα Προγραμματισμού Ι", 2016 (Μιχ. Πλεξουσάκης)
  2. Ιστοσελίδα μαθήματος "Γλώσσα Προγραμματισμού Ι", 2015
Βιβλιογραφία
  1. An Informal Introduction to Python: variables, strings
  2. Δ. Καρολίδης, Μαθαίνετε εύκολα python.
  3. Κ. Μαγκούτης, Χ. Νικολάου, Εισαγωγή στον αντικειμενοστραφή προγραμματισμό με Python, (Αποθετήριο "Κάλλιπος", 2016) - Δείτε τα κεφάλαια 1. Εισαγωγή στην Python, 2. Τιμές, τύποι, μεταβλητές, λέξεις κλειδιά, εντολές, 3. Εκφράσεις, τελεστές, σχόλια.
Εργαλεία
  • Cloud coding environment.
  • Μπορείτε να τρέξετε python στον φυλλομετρητή: Codeskulptor.
  • Μπορείτε να τρέξετε python στον φυλλομετρητή: CodeAcademy.
  • idle3: Είναι ένα ολοκληρωμένο περιβάλλον για την ανάπτυξη και εκτέλεση προγραμμάτων python.
  • Μπορείτε να τρέξετε python στο κινητό σας τηλέφωνο (εφαρμογή QPython3).
Εργασίες

Ανακύκλωση

Η εντολή while

Η εντολή αναλύκλωσης while περιγράφει μία επαναληπτική διαδικασία και το συντακτικό της είναι:


while expression:
    statements

Οι εντολές statements εκτελούνται εφόσον η έκφραση expression είναι αληθής. Ο τρόπος ομαδοποίησης των εντολών ανακύκλωσης statements είναι πάλι η εσοχή (tab).

Παράδειγμα. Εισάγετε έναν ακέραιο m και τυπώστε σε διαδοχικές γραμμές τους ακεραίους από το 0 έως τον m.


max = int(input("Give a positive integer: "))
i = 0
while i <= max:
    print(i)
    i = i + 1

Παράδειγμα. Θα βελτιώσουμε ένα προηγούμενο πρόγραμμά μας ώστε να βρούμε την κυβική ρίζα τέλειου κύβου με τη μέθοδο της εξαντλητικής απαρίθμησης.


perfect_cube = 216   # this is a perfect cube
x = 0
while x**3 < perfect_cube:
    x = x + 1
    if x**3 < perfect_cube:
	print("No,", x,"is not the cubic root of",perfect_cube)
    elif x**3 == perfect_cube:
	print("Yes, indeed!", x,"is the cubic root of",perfect_cube)

Παράδειγμα. Εύρεση ρίζας θετικού αριθμού με τον αλγόριθμο του Ήρωνα.


x = input("Give a number")
x = float(x)
g = 1.0                # first approximation
while abs(g*g - x) > 1.0e-5:
    g = (g+x/g)/2.0
print("The square root of",x,"is approximately",g)

Συμβολοσειρές. Μπορούμε να εξαγάγουμε έναν-έναν τους χαρακτήρες μιας συμβολοσειράς.


s = input("Give a string: ")
i = 0
while i < len(s):
    print(i,"character is",s[i])
    i = i + 1

Παρατήρηση: η εντολή i += 1 είναι ισοδύναμη με την i = i + 1. Γενικότερα, η x += y είναι ισοδύναμη με την x = x + y. Επίσης υπάρχουν και οι τελεστές -=, *=, /=, //=. **= με ανάλογες σημασίες. Το προηγούμενο πρόγραμμα γράφεται ως


s = input("Give a string: ")
i = 0
while i < len(s):
    print(i,"character is",s[i])
    i += 1

Εντολή break

Μπορούμε να τερματίσουμε μία ανακύκλωση πρόωρα με την εντολή break.


s = input("Give a string: ")

i = 0
while i < len(s):
    if s[i] == 'o':
	print("The character o is in position",i)
    i = i + 1
if i == len(s):
    print("There is no o in the word", s)

Μπορούμε να παραγάγουμε ατέρμονη ανακύκλωση αν στη θέση της συνθήκης για την while βάλουμε την boolean σταθερά True. Η εντολή break είναι απαραίτητη στις ατέρμονες ανακυκλώσεις.

Παράδειγμα. Θα ζητήσουμε από τον χρήστη να εισάγει έναν αριθμό από το 1 έως το 100 και θα επαναλαμβάνουμε την προτροπή εάν ο χρήστης δίνει αριθμούς εκτός αυτού του διαστήματος.


while True:
    x = int(input("Input a number between 1 and 100: "))
    if  x >= 1 and x <= 100:
	break
print("Well done!")

Εντολή continue

Οι εντολές της ανακύκλωσης δεν εκτελούνται και η ανακύκλωση επαναλαμβάνεται όταν στη ροή του προγράμματος συναντήσουμε την εντολή continue.

 

Παράδειγμα. Θα εισαγάγουμε αριθμούς στο πρόγραμμα και θα βρούμε το άθροισμα των πρώτων 10 θετικών αριθμών (αγνοώντας τους αρνητικούς).


iter = 0
summ = 0
while iter < 10:
    x = int(input('Enter a positive integer: '))
    if x <= 0:
        continue
    summ = summ + x
    iter = iter + 1
print('The sum of the positive numbers is', sum)

Ανακύκλωση με την εντολή for

Έχουμε χρησιμοποιήσει ορισμένες φορές ανακύκλωση όπου μία μεταβλητή (μετρητής) παίρνει τιμές από μια ακολουθία ακεραίων.

Η εντολή for μπορεί να χρησιμοποιηθεί για να σαρώσουμε επαναληπτικά μία ακολουθία ακεραίων (η μία οποιαδήποτε ακολουθία). Για παράδειγμα, θα μπορούμε να τυπώσουμε τα τετράγωνα των ακεραίων από το 1 έως το 10.


for i in range(1,11):
    print('The square of', i, 'is', i**2)

Η μεταβλητή i που εμφανίζεται μετά τη λέξη-κλειδί for λαμβάνει διαδοχικά τις τιμές της ακολουθίας range(1,11) και η εντολή print(i) εκτελείται. Η διαδικασία επαναλαμβάνεται μέχρι να εξαντληθούν οι τιμές της ακολουθίας.

Το συντακτικό της εντολής for είναι


for variable in sequence:
    statements

Ο τελεστής in δίνει στη μεταβλητή variable της τιμές που περιέχονται στην ακολουθία sequence με σειριακό τρόπο (την μία μετά την άλλη). Οι εντολές statements εκτελούνται για κάθε τιμή της variable και η διαδικασία επαναλαμβάνεται μέχρι να εξαντληθούν οι τιμές της ακολουθίας. Εάν θελήσουμε να τερματήσουμε πρόωρα την ανακύκλωση μπορούμε να το κάνουμε με την εντολή break (όπως είδαμε και στην while).

Παράδειγμα. Για την εύρεση κυβικής ρίζας (τέλειου κύβου, έστω pc) με εξαντλητική απαρίθμηση σαρώσαμε μία σειρά ακεραίων από το 1 έως το πολύ pc.


pc = int(input("Give an integer: "))
for x in range(0,pc+1):
    if x**3 == abs(pc):
	print("The cubic root of",pc,"is",x)
        break

Μία βελτίωση του παραπάνω προγράμματος είναι η ακόλουθη (σκεφτείτε γιατί αυτό αποτελεί βελτίωση).


pc = int(input("Give an integer: "))
for x in range(0,abs(pc)+1):
    if x**3 >= abs(pc):
       break

if x**3 != abs(pc):
   print(pc,"is not a perfect cube")
else:
   if pc < 0:
	x = -x
   print("The cubic root of",pc,"is",x)

Σάρωση λιστών και συμβολοσειρών

Παράδειγμα. Ας βρούμε το άθροισμα των στοιχείων μίας λίστας (της οποίας τα στοιχεία είναι αριθμοί).


L = [1,2,3,4,5,6,8,9]

sumL = 0
for num in L:
    sumL += num

print(sumL)

Παράδειγμα. Μία λίστα λέγεται παλινδρομική αν η σειρά των στοιχείων της είναι η ίδια είτε διαβάζεται από αριστερά προς τα δεξιά είτε αντίστροφα. Ας ελέγξουμε αν μία λίστα είναι παλινδρομική.


n = len(L)
flag = True
for i in range(0,n//2):
    if L[i] != L[n-i-1]: 
	flag = False
	break

print(flag)
  • Μέσα στην ανακύκλωση ελέγχουμε αν το στοιχείο το οποίο βρίσκεται i θέσεις μετά το πρώτο (δηλαδή, το L[i]) είναι ίδιο με αυτό που βρίσκεται i θέσεις πριν το τελευταίο (δηλαδή, το L[n-1-i]).
  • Αρκεί να διατρέξουμε τη λίστα μέχρι την μέση (n//2) αφού πάντα κάνουμε συγκρίσεις ενός στοιχείου στο πρώτο μισό με στοιχείο στο δεύτερο μισό της λίστας. Αν η λίστα έχει περιττό αριθμό στοιχείων δεν χρειάζεται να γίνει έλεγχος στο μεσαίο στοιχείο.
  • Χρησιμοποιήσαμε μία λογική μεταβλητή flag η οποία παίρνει την τιμή False αν έστω και δύο αντίστοιχα γράμματα δεν είναι ίδια. Η flag διετηρεί την αρχική τιμή της True αν ποτέ δεν πάρει την τιμή False εντός του for.

Ερώτηση. Πώς θα μπορούσαμε να ελέγξουμε αν μία λίστα είναι παλινδρομική με χρήση της μεθόδου reverse;

strings ως ακολουθίες χαρακτήρων. Οι μεταβλητές τύπου string είναι ακολουθίες χαρακτήρων και μπορούμε να γράψουμε εντολές ανακύκλωσης που σαρώνουν τους χαρακτήρες μιας ακολουθίας χαρακτήρων:

Παράδειγμα. Ας τυπώσουμε έναν-έναν με τη σειρά τούς χαρακτήρες μίας συμβολοσειράς.


s = 'Nick Papadakis'
for c in s:
    print(c)

Μπορούμε επίσης να διατρέξουμε την συμβολοσειρά χρησιμοποιώντας τους δείκτες των χαρακτήρων.


s = 'Nick Papadakis'
for i in range(len(s)):
    print('The',i,'th character is',c)

Παράδειγμα. Θα διατρέξουμε (σαρώσουμε) τη λίστα colors, θα αφαιρέσουμε τα χρώματα που δεν μας αρέσουν και θα προσθέσουμε ορισμένα που μας αρέσουν.


colors = ['red','green','blue','cyan','magenta','yellow','black']

colors1 = colors[:]
for c in colors1:
    yesno = input("Should I keep " + c + "? (y/n) ")
    if yesno == 'n': colors.remove(c)

while True:
    newColor = input("Should I add a new color? (color/n) ")
    if newColor != 'n':
        colors.append(newColor)
    else:
        break

print("Your new list of colors is\n",colors)

Παράδειγμα. Γράψτε ένα πρόγραμμα το οποίο ελέγχει αν δυο λίστες έχουν τουλάχιστον ένα κοινό στοιχείο. Εδώ θα χρειαστεί να ελέγχουμε τα στοιχεία της δεύτερης λίστας, ενώ διατρέχουμε την πρώτη λίστα. Αυτό θα το πετύχουμε με την χρήση δύο ενθυλακωμένων for.


L1 = [1,2,3,4,5,6]
L2 = [5,6,7,8,9]

flag = False
for e1 in L1:
    for e2 in L2:
	 if e1 == e2: 
           flag = True
           break

if flag: print('Yes')
else: print('No')

Η python μας προσφέρει έναν απλό τρόπο για να ελέγχουμε αν ένα στοιχείο υπάρχει σε μία λίστα. Γράφουμε για στοιχείο e σε λίστα L την έκφραση: e in L. Η έκφραση αυτή παίρνει τις τιμές True, False. Το προηγούμενο πρόγραμμα γράφεται με απλούστερο τρόπο ως εξής:


L1 = [1,2,3,4,5,6]
L2 = [5,6,7,8,9]

flag = False
for e in L1:
    if e in L2:
	flag = True
	break

if flag: print('Yes')
else: print('No')

Παράδειγμα. Μια Πυθαγόρεια τριάδα είναι ένα σύνολο τριών φυσικών αριθμών a<b<c

τέτοιων ώστε a2+b2=c2. Για παράδειγμα, το σύνολο {3,4,5} είναι μια Πυθαγόρεια τριάδα γιατί 32+42=52. Γράψτε ένα πρόγραμμα το οποίο θα βρίσκει τις Πυθαγόρειες τριάδες για 1<a,b<20

 


import math

m = 20
counter = 0
for a in range(1,m+1):
    for b in range(a+1,m+1):
        c2 = a**2 + b**2
        c  = math.sqrt(c2)
        if int(c) == c:
           counter += 1
           c = int(c)
           print(a,b,c)

print("I found",counter,"Pythagorean triads")

Πιο εκτεταμένα προβλήματα

Εύρεση κυβικής ρίζας τέλειου κύβου με εξαντλητική απαρίθμηση (μία σημαντική βελτίωση παλαιότερου κώδικα).


perfect_cube = int(input("Give an integer: "))
x = 0

while x**3 < abs(perfect_cube):
    x = x + 1

if x**3 != perfect_cube:
    print(perfect_cube,"is not a perfect cube")
else:
    if perfect_cube < 0:
       x = -x
    print("The cubic root of", perfect_cube,"",x)

 

Μέθοδος διχοτόμησης [Δείτε J.V. Guttag (Παράγραφος 3.3)]. Για την αναζήτηση προσέγγισης τατραγωνικής ρίζας αριθμού. Έστω x>1

τότε γνωρίζουμε ότι 1<x<x. Θα αρχίσουμε περιορίζοντας τη λύση στο διάστημα [0,x]

και θα διχοτομούμε το διάστημα ώσπου να πετύχουμε μία συγκεκριμένη ακρίβεια της προσέγγισης (epsilon).


x = 2;             # θα βρούμε την τετραγωνική ρίζα του 2
epsilon = 1.0e-3   # η ακρίβεια του αποτελέσματος
numGuesses = 0     # μετρητής για τις επαναλήψεις που θα γίνουν

low = 1; high = x;      # το αποτέλεσμα θα είναι στο διάστημα [low,high]
mid = (low + high)/2.0

while abs(x - mid**2) >= epsilon:
    print('low =', low, 'high =', high, 'Approximation =', mid)
    numGuesses += 1
    if mid**2 < x:
        low = mid
    else:
        high = mid
    mid = (low + high)/2.0

print('Number of iterations = ',numGuesses)
print('The square root of',x,'is approximately', mid)

Κρεμάλα. Φτιάξτε ένα πρόγραμμα με το οποίο μπορούμε να παίξουμε το παιχνίδι Κρεμάλα.

  • Κώδικας, σε μία αρχική μορφή με αρκετές ελλείψεις.
  • Κώδικας, ο οποίος κάνει κάποιους ελέγχους και τυπώνει καλύτερα της κρεμάλα.
  • Πλήρης κώδικας, στον οποίο όμως πρέπει να δίνετε εσείς τη ζητούμενη λέξη μέσα στο πρόγραμμα.
  • Πλήρης κώδικας, ο οποίος διαβάζει μία τυχαία λέξη από αρχείο.

Μελέτη

Βιβλιογραφία
  1. J.V. Guttag, Υπολογισμοί και προγραμματισμός με την python, (Κεφάλαιο 3).
  2. Κ. Μαγκούτης, Χ. Νικολάου, Εισαγωγή στον αντικειμενοστραφή προγραμματισμό με Python, (Αποθετήριο "Κάλλιπος", 2016) - Κεφάλαιο 5. Επανάληψη με την εντολή while.
Εργασίες

Λίστες

Σειρά στοιχείων

Μία σειρά στοιχείων (αριθμών, συμβολοσειρών κλπ) μπορούν να οργανωθούν σε μία δομή η οποία ονομάζεται λίστα. Η σειρά των στοιχείων ορίζεται από ορθογώνιες παρενθέσεις και τα στοιχεία χωρίζονται μεταξύ τους με κόμμα. Παραδείγματα:


>>> rgb = ['red','green','blue']
>>> cities = ['Agios','Heraklion','Rethymno','Chania']
>>> digits = [0,1,2,3,4,5,6,7,8,9]

Ο αριθμός των στοιχείων μίας λίστας μπορεί να βρεθεί με χρήση της συνάρτησης len:


>>> len(digits)
10

Μπορούμε να ανακτήσουμε ένα από τα στοιχεία της λίστας χρησιμοποιώντας τον δείκτη του. Η δεικτοδότηση είναι ακριβώς όπως στις συμβολοσειρές.


>>> rgb[1]
'green'
>>> rgb[-1]
'blue'

Τεμαχισμός (slicing): Μπορούμε να ανακτήσουμε ένα τμήμα της λίστας χρησιμοποιώντας ένα εύρος δεικτών. Το αποτέλεσμα είναι μία νέα λίστα.


>>> digits[1:3]
[1,2]
>>> digits[7:]
[7,8,9]

Βλέπουμε ότι η σύνταξη είναι όμοια με αυτή που χρησιμοποιήσαμε στον τεμαχισμό συμβολοσειρών.

Βασικές λειτουργίες

Μπορούμε να χρησιμοποιήσουμε τo σύμβολo της πρόσθεσης (+) για λίστες. Από την πρόσθεση δύο λιστών προκύπτει μία μέα λίστα η οποία περιέχει όλα τα στοιχεία των δύο λιστών. Για παράδειγμα:


>>> cmyk = ['cyan','magenta','yellow','black']
>>> colors = rgb + cmyk
>>> colors
['red','green','blue','cyan','magenta','yellow','black']

Μπορούμε να χρησιμοποιήσουμε τo σύμβολo του πολλαπλασιασμού (*) μεταξύ ακεραίου n και λίστας L:


>>> 2*rbg
['red','green','blue','red','green','blue']
>>> 2*[0,1]
[0,1,0,1]

Η n*L δίνει μία νέα λίστα η οποία περιέχει n φορές τα στοιχεία της L σε διαδοχική σειρά.

Μέθοδοι

Σε μία υπάρχουσα λίστα μπορούμε να προσθέσουμε ένα στοιχείο. Για παράδειγμα:


>>> colours.append('white')
>>> colors
['red','green','blue','cyan','magenta','yellow','black','white']

L.append(e): Έχουμε χρησιμοποιήσει μία μέθοδο η οποία ονομάζεται append και αυτή επέδρασε στη λίστα colors. Προστέθηκε ένα στοιχείο ('white') στην λίστα. Το όρισμα e της μεθόδου append προστίθεται ως τελευταίο στοιχείο στη λίστα L και η υπάρχουσα λίστα μεγαλώνει κατά ένα στοιχείο.

Η γενική σύνταξη για μία μέθοδο είναι λιστα.μεθοδος(ορισμα). Ας δούμε τώρα μερικές χρήσιμες μεθόδους για λίστες.

L.remove(e): Αφαιρεί το στοιχείο e από την λίστα L. Για παράδειγμα:


>>> colors.remove('white')
>>> colors
['red', 'green', 'blue', 'cyan', 'magenta', 'yellow', 'black']

L.pop(): Αφαιρεί το τελευταίο στοιχείο λίστας L (και το επιστρέφει). Επίσης μπορούμε να αφαιρέσουμε στοιχείο με συγκεκριμένο δείκτη.


>>> colors.pop()
'white'
>>> colors
['red','green','blue','cyan','magenta','yellow', 'black']]

>>> colors.pop(1)
'green'
>>> colors
['red','blue','cyan','magenta','yellow', 'black']

Μπορούμε να ελέγξουμε αν ένα στοιχείο υπάρχει σε λίστα:


>>> 'white' in colors
False

Θα μπορούσαμε να προσθέσουμε στην λίστα στοιχεία εφόσον αυτά δεν υπάρχουν ήδη:


>>> if 'white' not in colors: colors.append('white')

Παράδειγμα.


# Create lists with the countries of the continents
Europe = ['greece','italy','france','norway','denmark','the netherlands']
Asia = ['china','india','korea','nepal','thailand','iran']
America = ['USA','perou','canada','mexico']

# ask the user for the name of a country
country = input('Give the name of a country: ')

# Initialize an auxiliary variable 
newCountry = ''

# check whether the given country is included in a list
if country in Europe:
	print(country,'is in Europe')
elif country in Asia:
	print(country,'is in Asia')
elif country in America:
	print(country,'is in America')
else:
	newCountry = input('Does this country belong to Europe, Asia or America? ')


# Add the new country to one of the lists
if newCountry == 'Europe':
	Europe.append(country)
elif newCountry == 'Asia':
	Asia.append(country)
elif newCountry == 'America':
	America.append(country)

# Print the content of the lists
print(Europe)
print(Asia)
print(America)

Παρατήρηση. Μία λίστα είναι δυνατόν να μεταβληθεί και αυτό μπορεί να συμβεί, π.χ., με μία μέθοδο. Λέμε ότι οι λίστες είναι μεταλλάξιμες.

Παράδειγμα. Εισάγετε μία ημερομηνία (ημέρα, μήνας, έτος) και βρείτε (και τυπώστε) την ημερομηνία της επόμενης ημέρας.


import sys     # Εισάγει εντολές και συναρτήσεις του interpreter

months31 = [1,3,5,7,8,10,12]        # Μήνες με 31 ημέρες
months30 = [4,6,9,11]               # Μήνες με 30 ημέρες

# Εισάγουμε ημερομηνία
day   = int(input("Give day: "))
month = int(input("Give month: "))
year  = int(input("Give year: "))

if 1 <= month <= 12:                # Ο μήνας πρέπει να είναι από 1 έως 12
   print("You entered the date {}-{}-{}".format(day,month,year))
else:
   print("There is no such month")
   sys.exit()                       # Τερματίζεται η εκτέλεση του προγράμματος

if month in months31:               # Βρίσκουμε την τελευταία ημέρα του μήνα
   lastday = 31
elif month in months30:
   lastday = 30
elif month == 2:
   lastday = 28
else:                                # Θα συμβεί αν δεν έχουμε προβλέψει πόσες ημέρες έχει ο μήνας
   print("Month has no days!")
   sys.exit()                  

# Βρίσκουμε την επόμενη ημερομηνία: ημέρα, μήνα, έτος
if 0 < day < lastday:
   day = day + 1
elif day == lastday:
   day = 1
   if month == 12:
      month = 1
      year = year + 1
   else:
      month = month + 1
else:
   print("There is no such day!")
   sys.exit()

# Τυπώνουμε το αποτέλεσμα
print("Next date is {}-{}-{}".format(day,month,year))

Άσκηση. Εισάγετε μία ημερομηνία (ημέρα, μήνας, έτος) και βρείτε (και τυπώστε) την ημερομηνία της επόμενης ημέρας. Λάβετε υπόψιν την περίπτωση να είναι το έτος δίσεκτο.

Άλλες μέθοδοι

L.index(e). Επιστρέφει το δείκτη της πρώτης παρουσίας του στοιχείου e στη λίστα L.

L.count(e). Επιστρέφει τον αριθμό φορών που εμφανίζεται το στοιχείο e στη λίστα L.

L.reverse(). Αναστρέφει τη σειρά των στοιχείων στη λίστα L.

L.sort(). Ταξινομεί τα στοιχεία της λίστας L σε αύξουσα σειρά.

L.insert(i,e). Το στοιχείο e τοποθετείται στη θέση i της λίστας L.

Παράδειγμα. Ας δημιουργήσουμε μία λίστα, μετά θα αντιστρέψουμε τη σειρά των στοιχείων της.


>>> L = ['a','b','c','d','e','f']
>>> L.reverse()
>>> L
['f', 'e', 'd', 'c', 'b', 'a']

Παρατήρηση. Δείτε ότι η εντολή L.reverse (καθώς και αρκετές άλλες μέθοδοι: sort, insert κλπ) μεταλλάσσει την ίδια τη λίστα (και δεν δημιουργεί μία καινούρια για να βάλει το αποτέλεσμα της μεθόδου).

Παράδειγμα. Ας δημιουργήσουμε μία λίστα για την οποία μετά θα ανακατέψουμε τα στοιχεία της με τυχαίο τρόπο και τέλος θα εντοπίσουμε ένα συγκεκριμένο στοιχείο της.


import random
L = ['a','b','c','d','e','f']
random.shuffle(L)
print(L.index('a'))

Ειδικότερα είδη λιστών

Παρατήρηση. Μία λίστα μπορεί να περιέχει στοιχεία διαφορετικών τύπων:


>>> exampleList = ['father',30,'son',3]

Παρατήρηση. Μία λίστα μπορεί να περιέχει λίστες:


>>> exampleList = [[1,2,3],['a','b','c']]

Παράδειγμα. (Άρτιες μεταθέσεις τριών αριθμών.) Ξεκινούμε με μία άδεια λίστα []. Ακολούθως, της επεκτείνουμε βάζοντας μία-μία τις άρτιες μεταθέσεις τριών αριθμών. Κάθε μία από τις μεταθέσεις είναι λίστα τριών αριθμών.


>>> permute = []
>>> permute.append([1,2,3])
>>> permute.append([2,3,1])
>>> permute.append([3,1,2])
>>> permute
[[1, 2, 3], [2, 3, 1], [3, 1, 2]]

Παράδειγμα.

Θα δούμε την πρόσβαση στα στοιχεία μίας λίστας L1 η οποία είναι στοιχείο άλλης λίστας L. Αυτό μπορεί να γίνει με δύο τρόπους: είτε μέσω της αρχικής λίστας L1 είτε μέσω του αντίστοιχου στοιχείου της μεγαλύτερης λίστας L.

 


>>> L1 = ['a','b','c']
>>> L2 = [1,2,3]
>>> L = [L1,L2]
>>> L
[['a', 'b', 'c'], [1, 2, 3]]
L1.append('d')
>>> L
[['a', 'b', 'c', 'd'], [1, 2, 3]]
>>> L[0].append('e')
>>> L
[['a', 'b', 'c', 'd', 'e'], [1, 2, 3]]
>>> L1
['a', 'b', 'c', 'd', 'e']

Ακολουθία range()

Η εντολή range(n,m) δημιουργεί μία ακολουθία ακεραίων από τον n έως τον m-1.


>>> range(1,10)
range(1, 10)

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


>>> list(range(1,10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

Παραδείγματα. (α) Αν παραλήψουμε το πρώτο όρισμα τότε αυτό θεωρείται ότι είναι το 0. (β) Ως τρίτο όρισμα μπορούμε να βάλουμε το βήμα για την ακολουθία των παραγόμενων αριθμών.


>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(0,10,2))
[0, 2, 4, 6, 8]

Η γενική μορφή της συνάρτησης είναι range(start,end,step) και κατασκευάζει την αριθμητική πρόοδο start, start+step, start+2*step,...,start+n*step.

  • Αν step>0 τότε στην παραπάνω ακολουθία ο start+n*step είναι ο μεγαλύτερος ακέραιος μικρότερος από τον end.
  • Αν step<0 τότε ο start+n*step είναι ο μικρότερος ακέραιος μεγαλύτερος από τον end.
  • Αν το start παραληφθεί τότε start=0. Αν το step παραληφθεί τότε step=1.

 

Μελέτη

Βιβλιογραφία

  1. J.V. Guttag, Υπολογισμοί και προγραμματισμός με την python (Κεφάλαιο 5).
  2. Δημήτριος Καρολίδης, Μαθαίνετε εύκολα python (Παράγραφοι 4.1, 4.2) (Εκδόσεις Καρολίδη, 2016).
Εργασίες

Λογικές εκφράσεις και μεταβλητές

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

Παραδείγματα. (Λογικές εκφράσεις.)


>>> x = 5     # assign a value to the variable x
>>> y = 7     # assign a value to the variable y
>>> x == y    # check if x is equal to y
False
>>> x < y     # check if x is smaller than y, etc
True
>>> x <= y
True
>>> x > y
False
>>> x >= y
False
>>> x != y    # check if x is not equal to y
True

 

Μπείτε στο online περιβάλλον της python https://repl.it/repls/BeneficialExternalRotation και δοκιμάστε στο μαύρο παράθυρο τις εντολές.

Τα ολοκληρωμένα προγράμματα στο κάτω μέρος της σελίδας θα πρέπει να τα τρέξετε στο μεσαίο παράθυρο main.py και μετά πατήστε RUN.

Δείτε και τις ασκήσεις του βιβλίου απο τη σελίδα 20 και μετά.

 

Παράδειγμα. (Λογικές μεταβλητές.) Η μεταβλητή cond είναι μία λογική μεταβλητή (bool) και περιέχει το αποτέλεσμα μίας λογικής έκφρασης. Η cond μπορεί να πάρει τις τιμές True ή False.


>>> cond = (x == y)
>>> cond
False
>>> type(cond)
<class 'bool'>

Παράδειγμα. Είναι το φετινό έτος δίσεκτο;


>>> year = 2017
>>> isleap = year%4 == 0
>>> print(isleap)

Σημείωση: η παραπάνω συνθήκη χρειάζεται βελτίωση για να είναι πλήρως σωστή (θα το δούμε αργότερα).

Εντολές ελέγχου

Εκτέλεση υπό συνθήκη (εντολή if)

Η εντολή if ακολουθείται από μία λογική έκφραση και το σύμβολο : (άνω-κάτω τελεία). Εάν η λογική έκφραση είναι True τότε εκτελούνται όλες οι εντολές οι οποίες ακολουθούν την if και βρίσκονται σε μία εσοχή ως προς την if.

Παράδειγμα.


>>> x = 5
>>> if x>0:
	print("x is positive")
	print("x =",x)

Παρατήρηση: Προσέξτε τη σημασία της εσοχής στην if (και γενικότερα στην python). Όλες οι εντολές που ακολουθούν την if και εξαρτώνται από αυτήν ξεκινούν από την ίδια ακριβώς στήλη (είναι ευθυγραμμισμένες στα αριστερά).

if - else: Εάν η λογική έκφραση η οποία ακολουθεί την if έχει τιμή False τότε δεν εκτελούνται οι εντολές που ακολουθούν (εντός της εσοχής) την if. Έχουμε όμως τη δυνατότητα να εκτελέσουμε κάποιες εντολές, εκείνες που ακολουθούν (εντός εσοχής) την νέα εντολή else.

Παράδειγμα.


>>> x = 5
>>> if x%2==0:
	print(x,'is even')
    else:
	print(x,'is odd')

Για τις εντολές if - else η γενική μορφή της σύνταξης είναι


if expression:
    statements_true
else:
    statements_false

Εδώ, expression δηλώνει οποιαδήποτε έκφραση η οποία η τιμή της οποίας είναι True ή False, ενώ statements_true και statements_false δηλώνουν μία ή περισσότερες εντολές Python. Παρατηρήστε την άνω και κάτω τελεία που ακολουθεί τόσο την έκφραση expression όσο και τη λέξη else. Προσέξτε και πάλι ότι οι εντολές statements_true και statements_false έχουν μετακινηθεί (κατά μια εσοχή) προς τα δεξιά.

if - elif - else: Μπορεί να συμβαίνει να θέλουμε να ελέγξουμε διαφορετικές περιπτώσεις, δηλαδή, το αποτέλεσμα διαφορετικών λογικών εκφράσεων. Είναι δυνατόν να ισχύουν ταυτοχρόνως περισσότερες από μία λογικές εκφράσεις (δηλαδή να έχουν την τιμή True), να ισχύει μόνο η μία ή να μην ισχύει καμμία.

Παράδειγμα.


>>> x = 5
>>> y = 7
>>> if x>y:
	print(x,'is greater than',y)
    elif x<y:
	print(x,'is less than',y)
    else:
	print(x,'and',y,'are equal')

Παράδειγμα. Είναι το φετινό έτος δίσεκτο;


>>> year = 2017
>>> isleap = year%4 == 0
>>> if isleap:
	print("Year",year,"is leap year")
    else:
	print("Year",year,"is not leap year")

Η συνθήκη που χρησιμοποιήσαμε στο παραπάνω παράδειγμα χρειάζεται βελτίωση:


>>> year = 2017
>>> isleap = (year%4 == 0) and (year%100 != 0)
>>> print(isleap)

Έχουμε χρησιμοποιείσει δύο λογικές εκφράσεις και τις έχουμε ενώσει με την λέξη and. Η λογική έκφραση που προκύπτει είναι αληθής μόνο στην περίπτωση που και οι δύο επιμέρους λογικές εκφράσεις είναι αληθείς.

Η συνθήκη που χρησιμοποιήσαμε στο παραπάνω παράδειγμα χρειάζεται επιπλέον βελτίωση:


>>> year = 2017
>>> isleap = (year%4 == 0) and (year%100 != 0) or (year%400 == 0)
>>> print(isleap)

Τελεστές για λογικές μεταβλητές b, c (κατά σειρά χαμηλότερης προτεραιότητας)

  • b or c (είναι αληθής εάν η a ή η b είναι αληθής)
  • b and c (είναι αληθής εάν η a και η b είναι αληθής)
  • not b (είναι αληθής εάν η a είναι ψευδής)

 

Παράδειγμα. Η παραπάνω εντολή if για τα δίσεκτα έτη είναι ισοδύναμη με την


>>> isleap = (year%4 == 0 and year%100 != 0) or (year%400 == 0)

 

Άσκηση. Υπάρχει κάποιο λάθος στις παρακάτω εντολές; Τι νομίζετε ότι προσπαθούσε να γράψει ο προγραμματιστής;


a == 1
if a = 1:
   print('a is one')

 

Φωλιασμένες εντολές if

Εντολές ελέγχου if-elif-else μπορούν να είναι μέρος εντολών οι οποίες εκτελούνται υπό μία συνθήκη.

Παράδειγμα. Οι παρακάτω εντολές επιλέγουν τον μέγιστο μεταξύ των τριών αριθμών x, y, z :


if x >= y:
    if x >= z:
        print('x is largest')
    else:
        print('z is largest')
else:
    if y >= z:
        print('y is largest')
    else:
        print('z is largest')

Μια κομψότερη, ίσως, λύση (η οποία μπορεί εύκολα να γενικευθεί σε μεγαλύτερο πλήθος αριθμών) είναι η ακόλουθη:

a = 1
y = 6
z = 4
if y > a:
a = y
if z > a:
a = z
print('largest number is', a)

Παράδειγμα. Εισάγετε τρεις πραγματικούς αριθμούς x, y, z και τυπώστε τους κατά αύξουσα σειρά.


x = float(input("Give a number: "))
y = float(input("Give a number: "))
z = float(input("Give a number: "))

if y > z:
   a = z; z = y; y = a
if x > z:
   a = z; z = x; x = a
if x > y:
   a = y; y = x; x = a

print("{} {} {}".format(x,y,z))

Παρατηρήστε ότι μπορούμε να γράψουμε σε μία γραμμή περισσότερες από μία εντολές, τις οποίες χωρίζουμε με το semicolon (;).

Παρατηρήστε ότι για να εναλλάξουμε τις τιμές δύο μεταβλητών χρησιμοποιήσαμε μία βοηθητική μεταβλητή (a).

Παράδειγμα. Θα βρούμε τις ρίζες του τριωνύμου ax2+bx+c=0


a = float(input("Δώστε το συντελεστή a: "))   # Διαβάζουμε τους συντελεστές του τριωνύμου
b = float(input("Δώστε το συντελεστή b: "))
c = float(input("Δώστε το συντελεστή c: "))

D = b*b-4*a*c                               # Διακρίνουσα
if D<0:
    print("Δεν υπάρχει λύση.")
else:
    if D>0:                                 # Αν η διακρίνουσα είναι θετική 
        sqD = math.sqrt(D)
        x1 = (-b-sqD)/(2*a)                 # έχουμε δύο ρίζες: x1,x2
        x2 = (-b+sqD)/(2*a)
        print("Οι ρίζες είναι η {} και η {}".format(x1, x2)) # τυπώνουμε το αποτέλεσμα
    else:                                   # Η διακρίνουσα είναι 0, άρα το τριώνυμο έχει μια διπλή ρίζα
        x = -b/(2*a)
        print("Διπλή ρίζα {}".format(x))

Αλγόριθμοι

Παράδειγμα. (Εύρεση κυβικής ρίζας τέλειου κύβου.) Η κυβική ρίζα κάποιων αριθμών είναι ακέραιος. Μπορούμε να βρούμε την κυβική ρίζα του a=216

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


perfect_cube = 216   # this is a perfect cube

print("Try to guess the cubic root of",perfect_cube)
x = input("Give an integer: ")
x = int(x)

if x**3 == perfect_cube:
    print("Yes, indeed!", x,"is the cubic root of",perfect_cube)
elif x**3 < perfect_cube:
     print("You need a larger number")
elif x**3 > perfect_cube:
     print("You need a smaller number")
  •  

Ο αλγόριθμος του Ήρωνα υλοποιείται με τον κώδικα:


x = 2.0
prompt = "Give a number close to the root of "+str(x)+": "
g = input(prompt)
g = float(g)

print("The square of",g,"is:",g*g)
g = (g+x/g)/2.0
print("g =",g,"is a better approximation: g*g =",g*g)

Παράδειγμα. (Εύρεση ρίζας εξίσωσης με διχοτόμηση διαστήματος.) Θεωρούμε ένα κυβικό πολυώνυμο a0+a1x+a2x2+a3x3

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


# coefficients of cubic polynomial
a0 = 1.0; a1 = 2.0; a2 = 0.0; a3 = 3.0

# input x and find f(x), at two points x=x1, x=x2
x1 = float(input("Give x1: "))
fx1 = a0 + a1*x1 + a2*x1**2 + a3*x1**3

x2 = float(input("Give x2: "))
fx2 = a0 + a1*x2 + a2*x2**2 + a3*x2**3

print("f(x1) =",fx1,"\nf(x2) =",fx2)

# Check if a root of the polynomial is in the interval [x1,x2].
# Try to go closer to the root.
if fx1*fx2 <= 0:
    print("A root is between",x1,"and",x2)
    x = (x1+x2)/2.0
    fx = a0 + a1*x + a2*x**2 + a3*x**3
    print("It may be close to",x,"where f =",fx)
else:
    print("I cannot locate a root of the polynomial")

 

Άσκηση. Εφαρμόστε την παραπάνω μέθοδο (διχοτόμησης) για τη συνάρτηση asin(x)+bcos(x)

(όπου a,b

είναι σταθερές).

Πληροφορία.

  • Μπορεί να μας δωθεί υπό τη μορφή μίας πρότασης. Π.χ., η τετραγωνική ρίζα αριθμού x είναι ένας y τέτοιος ώστε y*y=x.
  • Μπορεί να προκύπτει στο τέλος μίας διαδικασίας. Δηλαδή, μπορεί να μας δωθεί μία ακολουθία οδηγιών στο τέλος των οποίων προκύπτει η πληροφορία. Ένα παράδειγμα είναι η μέθοδος εύρεσης τετραγωνικής ρίζας αριθμού του Ήρωνα.

 

Ένας αλγόριθμος αποτελείται από βήματα υπολογισμών τα οποία εφαρμόζονται σε κάποια αρχικά δεδομένα και, αφού εξελιχθούν μέσω διαφόρων καταστάσεων, δίνουν κάποια τελικά δεδομένα (δηλαδή, ένα αποτέλεσμα).

Για να εφαρμόσουμε έναν αλγόριθμο χρειαζόμαστε μία γλώσσα προγραμματισμού. Μία γλώσσα προγραμματισμού δίνει εντολές στον υπολογιστή ώστε να πραγματοποιηθούν οι πράξεις, οι οποίες αποτελούν τα βήματα οποιουδήποτε αλγορίθμου.

Μελέτη

Βιβλιογραφία
  1. Δ. Καρολίδης, Μαθαίνετε εύκολα python.
  2. Κ. Μαγκούτης, Χ. Νικολάου, Εισαγωγή στον αντικειμενοστραφή προγραμματισμό με Python, (Αποθετήριο "Κάλλιπος", 2016) - Κεφάλαιο 4. Συναρτήσεις και εκτέλεση υπό συνθήκη.
  3. J.V. Guttag, Υπολογισμοί και προγραμματισμός με την python (Παράγραφοι 2.2, 3.1).
Εργασίες

Μπορούμε να γράψουμε ακολουθίες χαρακτήρων, τα όρια των οποίων καθορίζονται από απλές (') ή διπλές (") αποστρόφους. Αυτές θα τις ονομάζουμε συμβολοσειρές (strings). Ορίζουμε μεταβλητές οι οποίες περιέχουν συμβολοσειρές.


>>> a = 'Akis'
>>> b = 'Papadopoulos'

Παραδείγματα. Mπορούμε να εφαρμόσουμε σε συμβολοσειρές τους τελεστές πρόσθεσης (+) και πολλπλασιασμού (*).


>>> onoma = a + b
>>> print(onoma)
AkisPapadopoulos
>>> onoma = a + " " + b
>>> print(onoma)
Akis Papadopoulos
>>> 2*a
'AkisAkis'
>>> year_in = 2020
>>> print(onoma,"came to Evosmos in",year_in)
Akis Papadopoulos came to Evosmos in 2020

Μπείτε στο online περιβάλλον της python https://repl.it/repls/BeneficialExternalRotation και δοκιμάστε στο μαύρο παράθυρο τις εντολές

Mπορούμε να βρούμε το μήκος της συμβολοσειράς.


>>> len(onoma)
16

Κάθε χαρακτήρας σε μία συμβολοσειρά έχει αριθμό θέσης (δείκτη, index). Η αρίθμηση ξεκινάει από το 0 και ο τελευταίος χαρακτήρας μιας συμβολοσειράς με μήκος n έχει δείκτη n-1.


>>> len(onoma)
16
>>> onoma[0]
'A'
>>> onoma[13]
'u'
>>> onoma[1]
'k'

Τεμαχισμός (Slicing): επιλέγουμε ένα τμήμα της συμβολοσειράς. Ο συμβολισμός onoma[start:end] αναφέρεται σε ένα τμήμα της αρχικής συμβολοσειράς, ειδικότερα στους χαρακτήρες της συμβολοσειράς onoma που βρίσκονται στις θέσεις start, start+1,..., end-1.


>>> onoma[0:4]
'Akis'
>>> onoma[1:4]
'kis'

Η θέση κάθε χαρακτήρα θέσης μπορεί επίσης να καθορισθεί μετρώντας από το τέλος της συμβολοσειράς (string). Αν το μήκος της συμβολοσειράς είναι n τότε η αρίθμηση ξεκινάει από το -n. Η συνολική συμβολοσειρά μπορεί να αναφερθεί ως s[-n:].


>>> s = 'Akis'
>>> s[-4:-1]
'Aki'
>>> s[-4:]
'Akis'

Μπορούμε να γράψουμε [start:end:step] για να αναφερθούμε στις θέσεις μεταξύ start και end-1 με βήμα step.


>>> s1 = 'Take'
>>> s2 = 'Make'
>>> s3 = 'Fake'
>>> s = s1 + s2 + s3
>>> s
'TakeMakeFake'
>>> len(s)
12
>>> s[0:12:4]
'TMF'

Είσοδος δεδομένων.

Η είσοδος δεδομένων (από το πληκτρολόγιο) γίνεται με τη συνάρτηση input. Το (προαιρετικό) όρισμα της συνάρτησης τυπώνεται στην οθόνη κατά την εκτέλεση του προγράμματος ως μια προτροπή (prompt) στο χρήστη να εισαγάγει δεδομένα. Οτιδήποτε εισάγει ο χρήστης αποθηκεύεται ως ακολουθία χαρακτήρων και εκχωρείται στη μεταβλητή αριστερά του ίσον (=).


>>> name = input('What is your name? ')
What is your name? Maria Antuaneta
>>> print('Hello,', name)
Hello, Maria Antuaneta
>>> age = input('How old are you? ')
How old are you? 23
>>> print(age)
23
>>> type(age)
<class 'str'>

Παρατηρήστε ότι ο τύπος της μεταβλητής name αλλά και της age είναι str, δηλαδή ακολουθία χαρακτήρων (και όχι int που ίσως να περίμενε κάποιος). Μπορούμε όμως να μετατρέψουμε τη μεταβλητή age σε ακέραιο γράφοντας int(age) και με αυτό τον τρόπο αυτή μπορεί να χρησιμοποιηθεί σε αριθμητικές εκφράσεις:


>>> age = input('How old are you? ')
How old are you? 23
>>> my_age = 18
>>> print('You are', int(age)-my_age, 'years older than I am!')
You are 5 years older than I am!

Μπορούμε επίσης να περάσουμε το αποτέλεσμα της input απ' ευθείας σε μία άλλη συνάρτηση, π.χ., στην float.


>>> price = float(input('How much for the apples? '))
How much for the apples? 1.79
>>> type(price)
<class 'float'>
>>> kilos = 4.5
>>> cost = price * kilos

Εντολή eval. Η python διαθέτει την εντολή eval η οποία μετατρέπει το αποτέλεσμα της input στον τύπο που αναμένουμε.

Παράδειγμα. Στο επόμενο παράδειγμα εισάγουμε δεδομένα με την input ως συμβολοσειρά την οποία στη συνέχεια η eval μετατρέπει σε float.


>>> x = input("Give data: ")
Give data: 1.1
>>> type(x)
<class 'str'>
>>> x = eval(x)
>>> type(x)
<class 'float'>
>>> print(x)
1.1

Παράδειγμα. H eval μπορεί να αναγνωρίσει ότι μία συμβολοσειρά περιέχει δεδομένα υπό μορφή λίστας και να μετατρέψει την συμβολοσειρά σε λίστα.


>>> x = input("Give data: ")
Give data: [1,3,5,7]
>>> x = eval(x)
>>> print(x)
[1, 3, 5, 7]

Η εντολή eval αναγνωρίζει επίσης και αριθμητικές πράξεις, τις οποίες εκτελεί και δίνει το αποτέλεσμα:


>>> x = eval(input("Give a number: "))
Give a number: 1+2.4
>>> print(x)
3.4

>>> x = eval(input("Give a number: "))
Give a number: 3/4
>>> print(x)
0.75

Μελέτη

Βιβλιογραφία

  1. Δ. Καρολίδης, Μαθαίνετε εύκολα python.
  2. An Informal Introduction to Python: variables, strings
Εργασίες

Συναρτήσεις

Εντολή def

Εισαγωγή. Τα περισσότερα προγράμματα τα οποία φτιάξαμε μέχρι τώρα θα μπορούσαμε να τα δούμε και ως ολοκληρωμένες μεθόδους οι οποίες αποτελούνται από τα εξής μέρη: (1) εισάγονται δεδομένα, (2) γίνονται υπολογισμοί και (3) εξάγεται και τυπώνεται ένα αποτέλεσμα. Για παράδειγμα, μπορούμε να βρούμε τον μεγαλύτερο μεταξύ δύο αριθμών ως εξής:

 


x = 5.0
y = 6.0

if x >= y:
   maxx = x
else
   maxx = y

print(maxx)

Το τμήμα του παραπάνω προγράμματος το οποίο κάνει τον υπολογισμό του μεγίστου μπορούμε να το διαχωρίσουμε ως εξής:


def maximum(x,y):
   if x >= y:
      maxx = x
   else
      maxx = y
   return maxx

Η λέξη def είναι δεσμευμένη, δηλαδή, είναι μία εντολή της python και ορίζει μία συνάρτηση.

  • Η πρώτη γραμμή περιέχει το όνομα της συνάρτησης (η παραπάνω λέγεται maximum), επίσης τα ορίσματα σε παρένθεση και η γραμμή τελειώνει με την άνω-κάτω τελεία. Το όνομα μιας συνάρτησης ακολουθεί τους συνηθισμένους κανόνες της Python για τα ονόματα μεταβλητών.
  • Όλες τις εντολές που περιέχονται στη συνάρτηση βρίσκονται σε εσοχή (tab).
  • Η συνάρτηση τελειώνει με την εντολή return η οποία καθορίζει ποιά είναι η τιμή της συνάρτησης.

Το πρόγραμμά μας τώρα θα αποτελείται από τις γραμμές που ορίζουν την συνάρτηση και επίσης από τις παρακάτω εντολές:

 


result = maximum(5.0,6.0)
print(result)

Οι δύο παραπάνω εντολές αποτελούν το κύριο πρόγραμμα. Δείτε ότι το πρόγραμμά μας αποτελείται τώρα από δύο τμήματα: τη συνάρτηση και το κύριο πρόγραμμα (το οποίο ακολουθεί τη συνάρτηση και περιέχει μία γραμμή για τη χρήση της συνάρτησης.)

Ας δούμε τι ακριβώς συμβαίνει όταν στο πρόγραμμά μας περιέχεται μία συνάρτηση (π.χ. maximum) και γράφουμε maximum(a,b).

 

  • Λέμε ότι η συνάρτηση maximum καλείται με τις πραγματικές παραμέτρουςορίσματα) a,b. Αυτές μπορεί να είναι αριθμοί (π.χ., maxx=maximum(5.0,6.0)) αλλά μπορεί να είναι και μεταβλητές οι οποίες έχουν τιμές (π.χ., a=3.0; b=4.0; maxx=maximum(a,b)).
  • Με την κλήση της συνάρτησης συμβαίνουν δύο πράγματα: Οι τυπικές παράμετροι της συνάρτησης παίρνουν τιμές (x=5.0; y=6.0 είτε x=a; y=b) και το πρόγραμμα συνεχίζει με τις εντολές εντός της συνάρτησης.
  • Όταν βρεθεί εντολή return ο έλεγχος επιστρέφει στο κύριο πρόγραμμα.
  • Η τιμή της μεταβλητής που βρίσκεται δίπλα στην return (δηλαδή, maxx) είναι η τιμή της συνάρτησης. Αυτή δίδεται στο κύριο πρόγραμμα (στη μεταβλητή result) αριστερά της ισότητας στην κλήση της συνάρτησης.
  • Ο έλεγχος έχει τώρα επιστρέψει στο κύριο πρόγραμμα και εκτελούνται οι εντολές μετά της κλήση της συνάρτησης.
  • Η τελευταία εντολή του κυρίου προγράμματος τυπώνει το αποτέλεσμα που πήραμε από την εκτέλεση της συνάρτησης.

Παράδειγμα. Γράψτε μία συνάρτηση η οποία να υπολογίζει την τιμή του πολυωνύμου f(x)=x22x+1

. Καλέστε την από το κύριο πρόγραμμα για μία τιμή του x και τυπώστε τα x,f(x)

.


def f(x):
    fvalue = x**2 - 2*x + 1
    return fvalue

x = 3.0
result = f(x)
print(x,result)

Παράδειγμα. Γράψτε μία συνάρτηση η οποία να ελέγχει αν το όνομά μας τελειώνει σε "ακης" (akis). Σε αυτή την περίπτωση η τιμή της θα είναι True, αλλιώς η τιμή της συνάρτησης θα είναι False.


def name_end(s):
    if s[-4:] == 'akis':
        return True
    else:
        return False

name = input("Give a name: ")
print(name_end(name))

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

Παράδειγμα. [Πηγή: Σημειώσεις Μ. Πλεξουσάκη.] Ας ορίσουμε μία συνάρτηση η οποία τυπώνει το μήνυμα Hello! όποτε κληθεί:


def sayHello():
    print('Hello!')

Ας την καλέσουμε:


>>> sayHello()
Hello!

Αν όμως είχαμε γράψει print(sayHello(), 'Maria') θα βλέπαμε το μήνυμα None Maria γιατί None είναι η τιμή η οποία επιστρέφει η συνάρτηση sayHello. Δείτε ακόμα ότι η συνάρτηση αυτή δεν έχει τυπικά ορίσματα και γι' αυτό η λίστα των τυπικών ορισμάτων της είναι κενή, αλλά η κλήση της συνάρτησης διατηρεί την κενή λίστα των ορισμάτων.

Παρατήρηση. Το κεντρικό πλεονέκτημα των συναρτήσεων είναι ότι μπορούμε να τις καλούμε επανειλημμένα από το κύριο πρόγραμμα. Ο κώδικας που περιέχεται στη συνάρτηση εκτελείται σε κάθε κλήση της από το κύριο πρόγραμμα.

Γραφική επανάληψη

Function form
Σχήμα. Η γενική μορφή μιας συνάρτησης και η κλήση της από το κύριο πρόγραμμα.

Ενσωματωμένες συναρτήσεις (built-in functions)

Πρέπει να παρατηρήσουμε ότι έχουμε ήδη δει συναρτήσεις σε προηγούμενα μαθήματα, όπως αυτές τις οποίες παρέχει το πακέτο math.

  • math.sin(x), math.cos(x), math.abs(x), etc.

Παρατηρήστε ότι όλες οι παραπάνω παίρνουν ένα όρισμα και επιστρέφουν μία τιμή, όπως ακριβώς οι συναρτήσεις που ορίζονται με την εντολή def.

Επίσης, έχουμε δει ενσωματωμένες συναρτήσεις της python.

  • type(a), print(), len(s) etc.

Παρατήρηση. Η χρήση συναρτήσεων είναι ιδαίτερα διαδεδομένη σε μία γλώσσα προγραμματισμού (όπως η python). Αυτό ισχύει και για τις ενσωματωμένες συναρτήσεις και για αυτές τις οποίες γράφει ο προγραμματιστής. Και τα δύο είδη συναρτήσεων χρησιμοποιούνται με τον ίδιο τρόπο, όπως είδαμε.

Μελέτη

Βιβλιογραφία

  1. Δημήτριος Καρολίδης, Μαθαίνετε εύκολα python (Εκδόσεις Καρολίδη, 2016).
  2. Κ. Μαγκούτης, Χ. Νικολάου, Εισαγωγή στον αντικειμενοστραφή προγραμματισμό με Python, (Αποθετήριο "Κάλλιπος", 2016) - Κεφάλαιο 4. Συναρτήσεις και εκτέλεση υπό συνθήκη.
Ασκήσεις