Professional Documents
Culture Documents
Μάθημα 1
In [3]:
Hello world!
Κατάσταση πληκτρολόγησης, όπου ο κέρσορας είναι σε κάποιο κελί και πληκτρολογούμε κώδικα
Κατάσταση περιήγησης, όπου δεν εμφανίζεται κέρσορας πουθενά, αλλά κάποιο κελί είναι επιλεγμένο
Για να βγούμε από την κατάσταση πληκτρολόγησης στην κατάσταση περιήγησης, έχουμε τρεις τρόπους:
Πατάμε το Esc
Κάνουμε κλικ οπουδήποτε στον κενό χώρο εκτός των κελιών
Τρέχουμε το κελί στο οποίο βρισκόμαστε.
Για να μεταβούμε από κατάσταση περιήγησης σε κατάσταση πληκτρολόγησης, έχουμε δύο τρόπους:
Δημιουργούμε νέα κελιά είτε πιέζοντας τα πλήκτρα Α ή Β από κατάσταση περιήγησης, ή μέσω της γραμμής
εργαλείων (το σηματάκι +).
Παρακάτω βλέπυμε πώς αποθηκεύουμε κείμενο σε μια μεταβλητή, και γράφοντας το όνομα της μεταβλητής και
εκτελώντας το κελί, εμφανίζονται τα περιεχόμενά της.
In [4]:
text
Out[4]:
'this is'
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 1/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
In [5]:
print(text)
print(text2)
print(text3)
this is
a text
to print
Όταν γράφουμε τα ονόματα πολλών μεταβλητών σε διαφορετικές γραμμές, εμφανίζονται τα περιεχόμενα μόνο
της τελευταίας
In [6]:
text
text2
text3
Out[6]:
'to print'
Εμφανίζονται όλες όταν τις γράφουμε στην ίδια σειρά και τις χωρίζουμε με κόμμα.
In [7]:
text,text2,text3
Out[7]:
In [8]:
3 + 4
Out[8]:
In [9]:
x = 5
x * 8
Out[9]:
40
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 2/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
In [10]:
x = 5
y = x ** 2
Out[10]:
25
Operator Description
+ Addition (e.g., 1 + 1 = 2 )
- Subtraction (e.g., 3 - 2 = 1 )
* Multiplication (e.g., 2 * 3 = 6 )
** Exponentiation (e.g., 2 ** 3 = 8 )
% Modulus/remainder (e.g., 9 % 4 = 1 )
Mεταβλητές
In [18]:
In [17]:
price *= rating
price
Out[17]:
4100.625
Λίστες
In [33]:
n = [2,4,6,8,10]
n
Out[33]:
[2, 4, 6, 8, 10]
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 3/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
Η εντολή len(όνομα λίστας) μας δίνει τον αριθμό των στοιχείων της λίστας.
In [20]:
len(n)
Out[20]:
Μπορούμε να διαλέγουμε ποια στοιχεία της λίστας θέλουμε, χρησιμοποιώντας indexing. To index ξεκινάει απ'το
0, δηλαδή το πρώτο στοιχείο της λίστας βρίσκεται στην θέση 0.
In [21]:
n[0]
Out[21]:
In [22]:
n[1:3]
Out[22]:
[4, 6]
In [6]:
a = [0,1,2,3,4,5,6,7,8,9,10,11]
print ("a is ", a)
print ("first two elements of a are ", a[0:2])
print ("all elements are ", a[0:])
print ("equivalently ", a[:])
print ("all elements but the first are", a[1:])
print ("all elements up to the fifth are ", a[:5]) # the last is NOT included
print ("all elements but the last two are ", a[:-2])
print (" all elements but the fifth are ", a[:5] + a[6:])
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 4/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
In [34]:
n.append(12)
n
Out[34]:
Συνθήκες if
In [31]:
if n[0] == 5:
print('five')
else:
print('not five')
not 5
For loops
Η εντολή range(αριθμός) χρησιμοποιείται στις for loops για να μας δώσει ένα βρόχο επαναλήψεων ίσο με τον
αριθμό εντός παρενθέσεως της range.
In [38]:
for i in range(3):
print(i)
0
1
2
Για να προσπελάσουμε τα στοιχεία μιας λίστας μέσω βρόχου, έχουμε δύο τρόπους:
In [37]:
for i in range(len(n)):
print(n[i])
2
4
6
8
10
12
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 5/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
In [36]:
for element in n:
print(element)
2
4
6
8
10
12
In [35]:
greater = 0
for element in n:
if element > 5: greater += 1
greater
Out[35]:
Ανακεφαλαίωση.
Είδαμε:
αριθμητικές πράξεις
μεταβλητές, και πράξεις με μεταβλητές
λίστες
μήκος λίστας
χρησιμοποιώντας το index για τις λίστες
εντολή append για προσθήκη στοιχείων στις λίστες
συνθήκη if
for loop
Εφαρμογή 1
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 6/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
Σε ένα meeting στην εταιρία όπου δουλεύεις, κοιτάτε τα έσοδα και τα έξοδα της εταιρίας τους τελευταίους 6
μήνες.
In [39]:
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 7/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
In [42]:
gain = 0
loss = 0
good_months = []
for i in range(len(costs)):
else:
loss += 1
Out[42]:
'Aσκηση
Έχουμε μηνιαία έσοδα και έξοδα.
In [43]:
costs = [6.4, 5.2, 7.9, 2.4, 3.3, 7.7, 4.6, 2.3, 6.8, 6.2, 1.4]
profits = [5.4, 6.8, 7.6, 5.3, 1.7, 6.3, 8.3, 6.9, 8.6, 7.7, 6.7]
Θέλουμε μηνιαίο απολογισμό (monthly balance), δηλαδή μια λίστα που δείχνει τί κέρδος ή ζημία είχαμε ανά
μήνα. (Ξεκινάμε με μια άδεια λίστα και κάνουμε append την διαφορά μεταξύ των εσόδων και εξόδων του
κάθε μήνα)
Θέλουμε το τελικο κέρδος, αφού αφαιρεθεί ο φόρος ΦΠΑ 18%. (Δηλαδή μια μεταβλητή με τιμή μηδέν, όπου
θα προστίθεται είτε η ζημία (όταν έχουμε ζημία), είτε το κερδος * 82/100 (όταν έχουμε κέρδος)
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 8/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
In [46]:
monthly_balance = []
summa = 0
for i in range(len(costs)):
monthly_balance.append(profits[i] - costs[i])
if monthly_balance[i] > 0:
summa += monthly_balance[i]*82/100
else: summa += monthly_balance[i]
monthly_balance, summa
Out[46]:
([-1.0,
1.5999999999999996,
-0.3000000000000007,
2.9,
-1.5999999999999999,
-1.4000000000000004,
3.700000000000001,
4.6000000000000005,
1.7999999999999998,
1.5,
5.300000000000001],
13.248000000000001)
Συναρτήσεις
In [7]:
def square(number):
return number**2
In [9]:
a = 5
square(a)
Out[9]:
25
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 9/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
In [10]:
gain = 0
loss = 0
good_months = []
for i in range(len(costs)):
else:
loss += 1
In [11]:
accounting(c,p)
Out[11]:
In [12]:
In [15]:
good_months
Out[15]:
[0, 2, 3, 4]
'Aσκηση
Μετατρέψτε σε συνάρτηση τον κώδικα που γράψατε προηγουμένως. Ορίσματα: έσοδα, έξοδα, ΦΠΑ.
Ο ΦΠΑ θα είναι ένας αριθμός από 0 έως 1, πχ για ΦΠΑ 18%, θα δίνουμε στο όρισμα τιμή 0.18. Άρα, σε μήνες
που σημειώθηκε κέρδος, το κερδος μετά τον φόρο θα υπολογίζεται ως: κέρδος ∗ (1 − ΦΠΑ)
Τρέξτε την συνάρτηση χρησιμοποιώντας ως ορίσματα τις παρακάτω τιμές. Κάνετε copy-paste τον κώδικα και τα
αποτελέσματα στο αρχειάκι notepad.
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 10/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
In [20]:
In [21]:
monthly_balance = []
summa = 0
for i in range(len(costs)):
monthly_balance.append(profits[i] - costs[i])
if monthly_balance[i] > 0:
summa += monthly_balance[i]*(1-fpa)
else: summa += monthly_balance[i]
In [22]:
accounting2(profits,costs, fpa)
Out[22]:
Numpy
Η βιβλιοθήκη που χρησιμοποιούμε για μαθηματικές πράξεις και για πράξεις με πίνακες και διανύσματα.
Το εισάγουμε ως εξής
In [4]:
import numpy as np
Η δομή δεδομένων που χρησιμοποιεί είναι το numpy array. Σε αρχική φάση, τα arrays που θα
χρησιμοποιήσουμε θα είναι μονοδιάστατα, δηλαδή διανύσματα και όχι πίνακες, και μοιάζουν με τις λίστες που
έχουμε ήδη δει.
In [17]:
x = np.array([0,1,2,3,4,5,6,7,8,9])
x
Out[17]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 11/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
Ισχύουν κάποιες λειτουργίες που είδαμε στις λίστες, όπως το indexing και η εντολή len.
In [5]:
x[0:3]
Out[5]:
array([0, 1, 2])
In [3]:
len(x)
Out[3]:
In [6]:
np.sum(x)
Out[6]:
36
In [7]:
np.mean(x)
Out[7]:
4.0
In [9]:
np.max(x), np.min(x)
Out[9]:
(8, 0)
In [11]:
l = [9,8,7,6,5,4,3,2,1,0]
l
Out[11]:
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 12/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
In [13]:
l = np.array(l)
l
Out[13]:
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
Μπορούμε να προσθέσουμε, ή να αφαιρέσουμε, κλπ, arrays μεταξύ τους, αρκεί να έχουν το ίδιο μήκος.
In [18]:
x+l
Out[18]:
array([9, 9, 9, 9, 9, 9, 9, 9, 9, 9])
In [22]:
Out[22]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Μπορούμε να προσ΄θεσουμε όλα τα στοιχεία του array με έναν αριθμό, ή να πολλπλασιάσουμε array με τον
εαυτό του (δηλαδή κάθε στοιχείο εις το τετράγωνο)
In [22]:
x+3
Out[22]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [23]:
x**2
Out[23]:
In [69]:
a = np.zeros(3)
a
Out[69]:
Η array.copy() χρησιμοποιείται όταν αντιγράφουμε arrays και δεν θέλουμε οι μετατροπές που θα κάνουμε στο
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 13/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
In [69]:
a = np.zeros(3)
a
Out[69]:
In [71]:
b = a
b += 3
b
Out[71]:
In [72]:
Out[72]:
In [74]:
a = np.zeros(3)
b = a.copy()
b += 3
a
Out[74]:
Operator Description
Εφαρμογή
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 14/20
φ ρμ γή
4/5/2022 1_Intro_to_Python - Jupyter Notebook
Αεροδρόμιο, αριθμός εντός δεν πρέπει, για λόγους ασφαλείας, να υπερβεί κάποιο όριο, σε σχέση με το πόσοι
υπάλληλοι ασφαλείας βρίσκονται εκεί.
Φωτοκύτταρο ενεργοποιείται όταν κάποιος μπαίνει ή βγαίνει, κρατώντας κατάλογο πόσοι άνθρωποι υπάρχουν
μέσα ανά πάσα στιγμή.
Παρακάτω καταγράφονται, για 12 στιγμές κατά την διάρκεια της ημέρας, πόσοι άνθρωποι βρίσκονταν εντός, και
πόσοι υπάλληλοι ασφαλείας.
In [5]:
people = [56, 11, 89, 59, 106, 50, 58, 28, 83, 22, 22, 27]
security = [3, 5, 11, 11, 6, 10, 9, 3, 11, 6, 7, 7]
Είσαι operations manager, και σε καλεί το αεροδρόμιο ως εξωτερικό συνεργάτη, να αξιολογήσεις κατά πόσον η
κίνηση των πελατών αντιστοιχεί με τον αριθμό των υπαλλήλων ασφαλείας.
Σκοπός είναι το ελάχιστο κόστος μισθοδοσίας, δηλαδή να απασχολούνται όσο το δυνατόν λιγοτεροι υπάλληλοι,
αλλά και να καλύπτονται πάντα οι ανάγκες του αεροδρομίου, δηλαδή ποτέ να μην απασχολούνται λιγότεροι
υπάλληλοι από όσο πρέπει.
Η απαιτούμενη σχέση μεταξύ πελατών και υπαλλήλων ασφαλείας, διέπεται από δύο κανόνες:
μια λίστα με το πόσοι υπάλληλοι θα χρειαζόντουσαν κατά την διάρκεια της ημέρας
μια λίστα με το πόσους υπαλλήλους είχε περισσότερο ή λιγότερο από όσο ήταν απολύτως αναγκαίο
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 15/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
έναν αριθμό που εκφράζει πόσους, κατά μέσο όρο, υπαλλήλους απασχολούσε λιγότερο ή περισσότερο
από το απολύτως αναγκαίο.
Στην λίστα με το πόσοι υπάλληλοι θα χρειαζόντουσαν κατά την διάρκεια της ημέρας, θα διαιρέσουμε τον αριθμό
των ανθρώπων δια του 10 ή του 15, ανάλογα την περίσταση. Το πρόβλημα είναι ότι θέλουμε ακέραιο
αποτέλεσμα, αλλά η διαίρεση μας δίνει αποτελέσματα του στυλ:
In [2]:
45/10
Out[2]:
4.5
In [33]:
45//10
Out[33]:
In [6]:
Out[6]:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
In [7]:
for i in range(len(people)):
if people[i] < 50: needed[i] = people[i]//10
if people[i] > 50: needed[i] = 2*people[i]//15
print(people)
print(needed)
[56, 11, 89, 59, 106, 50, 58, 28, 83, 22, 22, 27]
[ 7 1 11 7 14 0 7 2 11 2 2 2]
Προσθέτουμε και τους 3 που είναι επιπλέον και απαραίτητοι, και το πρώτο ερώτημα είναι έτοιμο.
In [8]:
needed += 3
needed
Out[8]:
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 16/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
Τώρα θέλουμε μια λίστα με το πόσους υπαλλήλους είχε περισσότερο ή λιγότερο από όσο ήταν απολύτως
αναγκαίο.
In [9]:
Out[9]:
Τέλος, θέλουμε έναν αριθμό που εκφράζει πόσους, κατά μέσο όρο, υπαλλήλους απασχολούσε λιγότερο ή
περισσότερο από το απολύτως αναγκαίο.
In [10]:
mean = np.mean(deviation)
np.around(mean)
Out[10]:
-1.0
In [64]:
int(mean)
Out[64]:
-1
'Ασκηση
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 17/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
Σε ένα γεωγραφικό διαμέρισμα υπάρχουν πλήθος δασικές εκτάσεις, που το ερχόμενο καλοκαίρι αντιμετωπίζουν
κίνδυνο πυρκαγιάς. Οι αρχές ζητούν την συμβουλή σου, ως operations manager, στο πως να κάνουν
αποδοτικότερη πρόληψη. Έχεις στην διάθεσή σου τα εξής δεδομένα:
In [25]:
areas = np.array([191.54, 130.94, 32.99, 80. , 189.87, 134.3 , 81.2 , 204.41, 162.01, 1
distances = np.array([ 6.7, 29.8, 18. , 6.5, 15.4, 29.9, 27.8, 18.7, 14.6, 25.1])#km
firetrucks = np.array([6, 8, 6, 4, 2, 2, 7, 9, 3, 3])
Θα προβούμε σε μια μικρή εξερεύνηση των δεδομένων, απαντώντας σε μερικά απλά ερωτήματα:
In [16]:
np.min(areas), np.max(areas)
Out[16]:
(32.99, 204.41)
In [19]:
water_needed = areas*188
water_needed
Out[19]:
Πόσα οχήματα θα χρειαζόταν για να σβήσει η φωτιά κάθε περιοχής; (Κάθε όχημα χωράει 5700 λίτρα νερό)
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 18/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
In [20]:
water_needed/5700
Out[20]:
H παραπάνω απάντηση δεν είναι αποδεκτή. Δεν γίνεται μια βάση να έχει 6,31 οχήματα. Αν η διαίρεση
επιστρέψει πχ 6,31 αυτό σημαίνει πως 6 οχήματα δεν φθάνουν και θα χρειαστεί και έβδομο. Οπότε η
στρογγυλοποίση θα είναι πάντοτε προς τα πάνω.
In [27]:
trucks_needed = ((water_needed/5700)+1).astype('int')
trucks_needed
Out[27]:
array([7, 5, 2, 3, 7, 5, 3, 7, 6, 4])
In [31]:
Out[31]:
Για κάθε ένα από τα απαιτούμενα δρομολόγια το κόστος θα είναι 2 ∗ 𝑑𝑖𝑠𝑡𝑎𝑛𝑐𝑒 ∗ 𝑔𝑎𝑠𝑝𝑟𝑖𝑐𝑒. (Πολλαπλασιάζουμε
επί δύο γιατί το όχημα θα κάψει καύσιμα όταν θα επιστρέφει στην βάση)
H τιμή πετρελαίου ανά χιλιόμετρο βρίσκεται πολλαπλασιάζοντας την τιμή πετρελαίου ανά λίτρο (1.2 ευρώ) επί
πόσα λίτρα καίει το όχημα ανά χιλιόμετρο (0.475 λίτρα).
In [36]:
Out[36]:
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 19/20
4/5/2022 1_Intro_to_Python - Jupyter Notebook
Καλό είναι οι πυρκαγιές να σβηστούν όσο το δυνατόν γρήγορα. Πρέπει να ξέρουμε ποιες περιοχές έχουν
αρκετά διαθέσιμα πυροσβεστικά οχήματα για να σβηστεί η πυρκαγία με ένα μόνο δρομολόγιο.
Γράψτε κώδικα που να δίνει μια δυαδική λίστα, δηλαδή μια λίστα που τα στοιχεία της θα είναι είτε 0 είτε 1, όπου
το 0 θα συμβολίζει ότι αυτή η περιοχή δεν έχει έλλειψη σε οχήματα, και 1 να συμβολίζει ότι η περιοχή έχει
έλλειψη.
In [43]:
shortages = np.zeros(len(areas),dtype='int')
for i in range(len(trucks_needed)):
if firetrucks[i] < trucks_needed[i]:
shortages[i] = 1
shortages
Out[43]:
array([1, 0, 0, 0, 1, 1, 0, 0, 1, 1])
Περισσότερα
Τα παρακάτω δύο links αναπέμπουν σε δύο διαλέξεις στο youtube, που αφορούν το προγραμματιστικό
υπόβαθρο που θα χρειαστούμε σε αυτό το μάθημα.
Οι δύο διαλέξεις αυτές είναι επιλεγμένες με κριτήριο το ότι είναι ευκολοκατανόητες, ιδανικές για αρχαρίους,
μικρής χρονικής διάρκειας, πολύ ενδιαφέρουσες, και καλύπτουν ακριβώς την ύλη που θέλουμε χωρίς
παραπανίσια πράγματα.
http://localhost:8889/notebooks/python%20projects/optimization/1_Intro_to_Python.ipynb 20/20