37 ΛΑΜΒΑΝΟΝΤΑΣ ΑΠΟΦΑΣΕΙΣ 1. Εκτέλεση υπό συνθήκη if x >0: print('x is positive') x > = 0 print( x is positive ) Σχήμα: Η λογική του if then Στο διερμηνευτή Python, προσοχή στη στοίχιση, διότι γίνεται από το χρήστη:
38 2. If με δύο δυνατότητες (if else) # if even odd.py x=2 if x%2 == 0 : print(x, ' is even') else : print(x, ' is odd') x=3 if x%2 == 0 : print(x, ' is even') else : print(x, ' is odd') RESTART: C:/Users/User/AppData/Local/Programs/Python/Python36 32/if even odd.py 2 is even 3 is odd print(x, ' is even') x%2 == x print(x, ' is odd') Σχήμα: Η λογική του if then else
39 ΕΦΑΡΜΟΓΗ ΣΤΟ SHELL ΛΟΓΙΚΕΣ ΕΚΦΡΑΣΕΙΣ (Boolean expression) Python 3.6.2 (v3.6.2:5fd33b5, Jul 8 2017, 04:14:34) [MSC v.1900 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. 5 ==5 True 5==6 False type(true) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'true' is not defined type(true) <class 'bool'> x=3 y=4 x>5 and y>5 False 17 and True True ΕΚΤΕΛΕΣΗ ΥΠΟ ΣΥΝΘΗΚΗ if x>0: print('x is positive') x is positive if x<10: print ('pass') pass ΕΝΑΛΛΑΚΤΙΚΗ ΕΚΤΕΛΕΣΗ if x%2 == 0: print ('x is even') else: print ('x is odd') x is odd
40 ΑΛΥΣΙΔΩΤΗ ΣΥΝΘΗΚΕΣ if x<y: print ('x less than y') elif x>y: print ('x greater than y') else: print ('x equal y') x less than y ΚΥΒΩΤΙΣΜΕΝΕΣ ΣΥΝΘΗΚΕΣ if x==y: print ('x=y') else: if x<y: print ('x<y') else: print ('x>y') x<y if 0<x: if x<10: print('x positive single digit') x positive single digit if 0<x and x <10: print('x positive single digit') x positive single digit
41 ΕΠΑΝΑΛΗΨΕΙΣ, ITERATIONS, LOOPS 1. for loop for it in range(4): print(it) 0 1 2 3 for it in range(4): it = it +1 print(it) 1 2 3 4 for it in range(4): it *=2 print(it) 0 2 4 6 for it in range(4): it = it**2 print(it) 0 1 4 9 sum = 0 for it in range(4): sum = sum + it print (it," ",sum) 0 0 1 1 2 3
42 3 6 for it in range(4,9): print(it) 4 5 6 7 8 y = 9 for it in range(4,y): print(it) 4 5 6 7 8 myrange = [1,3,5,7,11,13,17,19] for i in myrange: print (i) 1 3 5 7 11 13 17 19 friends = ['Γιάννης', 'Νίκος', 'Θωμάς', 'Vicky'] for friend in friends: print ('Καλημέρα ', friend) Καλημέρα Γιάννης Καλημέρα Νίκος Καλημέρα Θωμάς Καλημέρα Vicky myrange = [1,3,5,7,11,13,17,19] count = 0 for it in myrange: count = count + 1
43 print ('Count= ',count) Count= 8 Total= 0 total = 0 for it in myrange: total = total + it print('total=',total) Total= 76 # For i = 34.7 To 43.8 Step 0.1 # s = s + i for x in range( 347, 438, 1): print (x/10) RESTART: C:/Users/User/AppData/Local/Programs/Python/Python36 32/for loops.py 34.7 34.6 34.5 34.4 43.4 43.5 43.6 43.7 # For i = 34.7 To 43.8 Step 0.1 # s = s + i for x in range( 347, 439, 1): print(x/10) RESTART: C:/Users/User/AppData/Local/Programs/Python/Python36 32/for loops.py 34.7 34.6 34.5 34.4 43.4 43.5
44 43.6 43.7 43.8 for i in range(256): print (i,chr(i)) Τυπώνει τους χαρακτήρες ASCII. Πχ print (65,chr(65)), τυπώνει A. Μέρος από τη λίστα των 256 χαρακτήρων που τυπώνει το πρόγραμμα είναι το εξής: 0 29 Χαρακτήρες ελέγχου και άλλοι χαρακτήρες 30 31 32 33! 34 " 35 # 36 $ 37 % 38 & 39 ' 40 ( 41 ) 42 * 43 + 44, 45 46. 47 / 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63? 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w 120 x 121 y 122 z 123 { 124 125 } 126 ~ 127 128 129 130 131 ƒ 132 133 134 135 136 ˆ 137 138 Š 139 140 Œ 141 142 143 144 145 146 147 148 149 150 151 152 153 154 š 155 156 œ 157 158 159 Ÿ 160 161 162 163 164 165 166 167 168 169 170 ª 171 «172 173 174 175 ˉ 176 177 ± 178 ² 179 ³ 180 181 µ 182 183 184 185 ¹ 186 º 187» 188 ¼ 189 ½ 190 ¾ 191 192 À 193 Á 194  195 à 196 Ä 197 Å 198 Æ 199 Ç 200 È 201 É 202 Ê 203 Ë 204 Ì 205 Í 206 Î 207 Ï 208 Ð 209 Ñ 210 Ò 211 Ó 212 Ô 213 Õ 214 Ö 215 216 Ø 217 Ù 218 Ú 219 Û 220 Ü 221 Ý 222 Þ 223 ß 224 à 225 á 226 â 227 ã 228 ä 229 å 230 æ 231 ç 232 è 233 é 234 ê 235 ë 236 ì 237 í 238 î 239 ï 240 ð 241 ñ 242 ò 243 ó 244 ô 245 õ 246 ö 247 248 ø 249 ù 250 ú 251 û 252 ü 253 ý 254 þ 255 ÿ
45 None Η None είναι μια ειδική σταθερά που την αποθηκεύομε σε μια μεταβλητή για να σημειώσομε τη μεταβλητή ως «κενή». a = None print(a) None Ανακυκλώσεις για μέγιστο και ελάχιστο #maximum.py myrange = [3, 14, 21, 9, 73, 25] largest = None print('before: ', largest) for it in myrange: if largest is None or it > largest: largest = it print ('Εντός ανακύκλωσης: ', it, largest) print ('Εκτός ανακύκλωσης largest= ', largest) RESTART: C:/Users/User/AppData/Local/Programs/Python/Python36-32/maximum.py Before: None Εντός ανακύκλωσης: 3 3 Εντός ανακύκλωσης: 14 14 Εντός ανακύκλωσης: 21 21 Εντός ανακύκλωσης: 9 21 Εντός ανακύκλωσης: 73 73 Εντός ανακύκλωσης: 25 73 Εκτός ανακύκλωσης largest= 73 Άσκηση Ο κώδικας για να βρούμε την ελάχιστη τιμή στη λίστα είναι παρόμοιος. Αναπτύξτε.
46 Μια function για την εύρεση της μέγιστης τιμής #maximum-function.py def maximum(myrange): largest = None for it in myrange: if largest is None or it > largest: largest = it print ('largest from function= ', largest) return largest def main(): # Ορισμός driver myrange = [3, 14, 21, 9, 73, 25] large = maximum(myrange) # Κλήση function print ('largest from driver= ', large) main() RESTART: C:/Users/User/AppData/Local/Programs/Python/Python36-32/maximumfunction.py largest from function= 73 largest from driver= 73 Μια μικρή τροποποίηση της εντολής return #maximum-function.py def maximum(myrange): largest = None for it in myrange: if largest is None or it > largest: largest = it print ('largest from function= ', largest) return largest, ' is the largest' def main(): # Ορισμός driver myrange = [3, 14, 21, 9, 73, 25] large = maximum(myrange) # Κλήση function print ('largest from driver= ', large) main() RESTART: C:\Users\User\AppData\Local\Programs\Python\Python36-32\maximumfunction.py largest from function= 73 largest from driver= (73, ' is the largest')
47 Άσκηση Ο κώδικας για μια function που θα δίνει την ελάχιστη τιμή στη λίστα είναι παρόμοιος. Αναπτύξτε. Ασκήσεις 1. Αναπτύξτε μια function που βρίσκει το άθροισμα των τιμών μιας λίστας. 2. Αναπτύξτε μια function που βρίσκει τη μέση τιμή των τιμών μιας λίστας. 3. Αναπτύξτε μια function που βρίσκει το άθροισμα των τετραγώνων των τιμών μιας λίστας. 4. Αναπτύξτε μια function που βρίσκει τη διακύμανση των τιμών μιας λίστας.
48 2. while loop #while-prog1.py n = 5 while n > 0: print(n) n = n - 1 print('ektos loop') RESTART: C:/Users/User/AppData/Local/Programs/Python/Python36-32/while-prog1.py 5 4 3 2 1 Ektos loop #while-prog2.py # # Βρίσκει την πρώτη δύναμη του 2 # που είναι μεγαλύτερη του 100 # n = 2 while n <= 100: n = 2 * n print(n) print('πρώτη δύναμη του 2 > 100 είναι ', n) RESTART: C:/Users/User/AppData/Local/Programs/Python/Python36-32/while-prog2.py 4 8 16 32 64 128 Πρώτη δύναμη του 2 > 100 είναι 128
49 Ατέρμων ανακύκλωση # infinite_loop.py ατέρμων ανακύκλωση # j = 1 while True: print (j) j = j + 1 Αν κάνετε το λάθος και τρέξετε αυτό το πρόγραμμα, θα μάθετε πολύ γρήγορα πώς να τερματίζετε μια διαδικασία Python που τρέχει ή θα πατήσετε το πλήκτρο τερματισμού του υπολογιστή σας. Ωστόσο, υπάρχει τρόπος τερματισμού με χρήση του break. Παραδείγματος χάριν, # infinite_loop_break.py ανακύκλωση με διακοπή, break # j = 1 while True: print (j) j = j + 1 line = input(">") # μήνυμα για το χρήστη if line == "s": # αν ο χρήστης πληκτρολογήσει s, τότε break # το πρόγραμμα διακόπτεται print (line) print("s") RESTART: C:\Users\User\AppData\Local\Programs\Python\Python36-32\infinite_loop.py 1 > 2 > 3 > 4 > 5 > 6 >s s Το πρόγραμμα αυτό δίνει ένα υπόδειγμα για την ανάπτυξη χρήσιμων ανακυκλώσεων σε μεγαλύτερα προγράμματα.
50 Ατέρμων ανακύκλωση και break, password #while-prog3-break-infinite.py # # Λαμβάνει input από το χρήστη μέχρι # να τυπώσει τη λέξη done # while True: line = input('>') if line == 'done': break print(line) print('done') RESTART: C:/Users/User/AppData/Local/Programs/Python/Python36-32/while-prog2.py >hi hi >pass pass >done Done Ως εφαρμογή για την εισαγωγή password σε ένα πρόγραμμα: #while-prog3-break-infinite.py # # Λαμβάνει input από το χρήστη μέχρι # να τυπώσει τη λέξη done # while True: line = input('γράψε το password > ') if line == 'done': break print(line) print('done') RESTART: C:/Users/User/AppData/Local/Programs/Python/Python36-32/while-prog2.py Γράψε το password > tria tria Γράψε το password > pass pass Γράψε το password > hi hi Γράψε το password > done Done
51 Ασκήσεις 1. Γράψτε ένα πρόγραμμα που τυπώνει διαδοχικές δυνάμεις του 2 και τερματίζει μετά τη 2 10. 2. Αναπτύξτε πρόγραμμα που θα βρίσκει το γινόμενο Ν! για Ν=10. Αυξείστε σταδιακά το Ν και βρείτε ποια είναι η μεγαλύτερη τιμή του Ν για την οποία ο υπολογιστής σας επιτρέπει την εύρεση του Ν!. 3. Αναπτύξτε πρόγραμμα που θα βρίσκει το άθροισμα 1 + 1/2 + 1/3 + + 1/10. 4. Αναπτύξτε πρόγραμμα που θα βρίσκει το απαραίτητο Ν, ώστε το αρμονικό άθροισμα 1 + 1/2 + 1/3 + + 1/Ν να γίνει μεγαλύτερο ή ίσο δοθέντος αριθμού limit. 5. Αναπτύξτε πρόγραμμα που εισάγει αριθμούς από το πληκτρολόγιο έως ότου δοθεί ένας αριθμός μεγαλύτερος του 30. 6. Να αναπτυχθεί πρόγραμμα καταμέτρησης αριθμών (πχ ηλικιών ενηλίκων) μεταξύ 18 και 65. 7. Να αναπτυχθεί πρόγραμμα που εισάγει ακέραιους αριθμούς από το πληκτρολόγιο και βρίσκει το άθροισμα των αρτίων και των περιττών. Το πρόγραμμα να τερματίζει μόλις εισαχθεί ο χαρακτήρας q. 8. Να αναπτυχθεί πρόγραμμα που εισάγει Ν αριθμούς από το πληκτρολόγιο και υπολογίζει το μέσο και τη διακύμανση αυτών. 9. Να αναπτυχθεί πρόγραμμα που υπολογίζει για x=1,2,3,4,5,6,7,8,9,10 την τιμή της συνάρτησης 2 2 f( x) ( x 3x 8) [( x 3)( x 2x 3)]. Επίσης να τυπώνει κατάλληλο μήνυμα κάθε φορά που δεν είναι δυνατόν να υπολογιστεί μια τιμή για την f(x).
52 Τετραγωνική ρίζα Επαναλήψεις χρησιμοποιούντα σε προγράμματα για να υπολογίσουν αριθμητικά αποτελέσματα αρχίζοντας από μια προσεγγιστική τιμή και σταδιακά βελτιώνοντας το αποτέλεσμα. Παραδείγματος χάριν για να υπολογίσομε τετραγωνικές ρίζες αριθμών χρησιμοποιούμε τη μέθοδο του Newton, η οποία εργάζεται ως εξής. Θεωρούμε ένα μη αρνητικό αριθμό a και έστω x μια αρχική προσέγγιση του a. Τότε μια καλύτερη προσέγγιση δίνεται από τον τύπο / 2 Παραδείγματος χάριν, αν a=4 και x=3, τότε δοκιμάζομε Python 3.6.2 (v3.6.2:5fd33b5, Jul 8 2017, 04:14:34) [MSC v.1900 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. a=4.0 x=3.0 y=(x+a/x)/2 2.1666666666666665 x=y y=(x+a/x)/2 print(y) 2.0064102564102564 x=y y=(x+a/x)/2 print(y) 2.0000102400262145 x=y y=(x+a/x)/2 print(y) 2.0000000000262146 Αν συνεχίσομε έτσι μετά από μερικές επαναλήψεις, η προσέγγιση θα είναι σχεδόν ακριβής. Οι παραπάνω επαναλήψεις μπορούν να γραφούν υπό τη μορφή του ακόλουθου προγράμματος.
53 #program-square-root-of-2.py from math import sqrt a=2 #The number x=2 #Initial estimation of the square root of number while True: print(x) y = (x + a/x) / 2 if y == x: #Αν συνθήκη αληθής, τότε τερματίζει break x = y print(x) print('intrinsic square root of ', a,' is ', sqrt(a)) RESTART: C:/Users/User/AppData/Local/Programs/Python/Python36-32/program-squareroot-of-2.py 2 1.5 1.4166666666666665 1.4142156862745097 1.4142135623746899 1.414213562373095 1.414213562373095 Intrinsic square root of 2 is 1.4142135623730951 Το πρόγραμμα έδωσε λύση αλλά είναι κακά σχεδιασμένο, διότι ελέγχει την ισότητα των πραγματικών αριθμών ως εάν να ήταν ακέραιοι. Ο σωστός έλεγχος ισότητας πραγματικών πρέπει να γίνεται εντός προκαθορισμένης ακρίβειας: if abs(y-x) < eps: break όπου eps μπορεί να έχει την τιμή 0.0000001 ή eps = 0.5e10-14, η οποία προσδιορίζει πόσο κοντά είναι οι αριθμοί. Ασκήσεις 1. Τροποποιείστε το παραπάνω πρόγραμμα με την εισαγωγή του if. 2. Γενικεύσατε το πρόγραμμα ώστε να βρίσκει την τετραγωνική ρίζα οπουδήποτε θετικού αριθμού θα δίνει ο χρήστης με input. 3. Να γράψετε το πρόγραμμα αυτό υπό τη μορφή μιας function που θα ονομάσετε square_root, η οποία θα λαμβάνει το a ως παράμετρο και θα επιστρέφει την τετραγωνική ρίζα του a. Να γράψετε έναν driver που θα τρέχει την square_root.
54 ΛΥΣΗ 1 #program-square-root-of-2-eps.py from math import sqrt eps = 0.00000000000001 print(eps) a=2 #The number x=2 #Initial estimation of the square root of number while True: print(x) y = (x + a/x) / 2 if abs(y-x) < eps: break x = y print(x) print('intrinsic square root of ', a,' is ', sqrt(a)) RESTART: C:/Users/User/AppData/Local/Programs/Python/Python36-32/program-squareroot-of-2_eps.py 1e-14 2 1.5 1.4166666666666665 1.4142156862745097 1.4142135623746899 1.414213562373095 1.414213562373095 Intrinsic square root of 2 is 1.4142135623730951 ΛΥΣΗ 2 #program-square-root-of-number_eps.py from math import sqrt eps = 0.00000000000001 print(eps) a=float(input('number:? ')) #The number x=a #Initial estimation of sqrt it=0 #Number of iterations while True: print(x) y = (x + a/x) / 2 it = it + 1
55 if abs(y-x) < eps: break x = y print(x) print('number of iterations =',it) print('intrinsic square root of ', a,' is ', sqrt(a)) RESTART: C:/Users/User/AppData/Local/Programs/Python/Python36-32/program-squareroot-of-number_eps.py 1e-14 number:? 3 3.0 2.0 1.75 1.7321428571428572 1.7320508100147274 1.7320508075688772 1.7320508075688772 Intrinsic square root of 3.0 is 1.7320508075688772 RESTART: C:/Users/User/AppData/Local/Programs/Python/Python36-32/program-squareroot-of-number_eps.py 1e-14 number:? 18567.789 18567.789 9284.3945 4643.197196146192 2323.5980596741897 1165.7945119564515 590.8608330964777 311.1429058180837 185.40949300701544 142.7771260210372 136.41224543589593 136.2637554497746 136.2636745431685 136.26367454314448 136.26367454314448 Intrinsic square root of 18567.789 is 136.26367454314448 RESTART: C:/Users/User/AppData/Local/Programs/Python/Python36-32/program-squareroot-of-number_eps.py 1e-14 number:? 1879345.4567 1879345.4567 939673.22835 469837.6141744679
56 234920.80708191296 117464.40349626067 58740.20138632183 29386.097790654163 14725.025673429578 7426.327511757807 3839.6963827879986 2164.573980798136 1516.401387359304 1377.8735165767398 1370.9098980904698 1370.8922120330235 1370.8922119189385 1370.8922119189385 Number of iterations = 16 Intrinsic square root of 1879345.4567 is 1370.8922119189385 Φαίνεται ότι το πρόγραμμα δουλεύει καλά.
57 ΛΥΣΗ 3 #program-square-root-function.py from math import sqrt eps = 0.00000000000001 print(eps) def square_root(a): # Ορισμός Function x=a # Initial estimation of sqrt it=0 # Number of iters while True: print(x) y = (x + a/x) / 2 it = it + 1 if abs(y-x) < eps: break x = y return 'root and iters: ',x,it def main(): # Driver a = float(input('number:? ')) # Input number sqroot = square_root(a) print ('square root of ', a,' is ', sqroot) #print('number of iterations =',it) print('intrinsic square root of ', a,' is ', sqrt(a)) main() Προσέξτε ότι εντολή eps = 0.00000000000001 είναι εκτός driver, δηλαδή η eps έχει καθολική ισχύ, σε driver και function. Προσοχή επίσης στην εντολή return της function return 'root and iters: ',x,it και στις εντολές sqroot = square_root(a) print ('square root of ', a,' is ', sqroot) RESTART: C:/Users/User/AppData/Local/Programs/Python/Python36-32/program-square-root-ofnumber_function.py 1e-14 number:? 3 3.0 2.0 1.75 1.7321428571428572 1.7320508100147274 1.7320508075688772 square root of 3.0 is ('root and iters: ', 1.7320508075688772, 6)
58 Intrinsic square root of 3.0 is 1.7320508075688772 Ακόμη ένα παράδειγμα, 1e-14 number:? 10 10.0 5.5 3.659090909090909 3.196005081874647 3.16245562280389 3.162277665175675 3.162277660168379 square root of 10.0 is ('root and iters: ', 3.162277660168379, 7) Intrinsic square root of 10.0 is 3.1622776601683795 Τετραγωνίζομε τον εκτιμητή της ρίζας και βλέπομε ότι είναι ακριβής σε 14 δεκαδικά ψηφία: 3.1622776601683795**2 10.000000000000002
59 Γενίκευση του προγράμματος που βρίσκει την τετραγωνική ρίζα. Η μέθοδος NEWTON RAPHSON Θα αναπτύξομε ένα πρόγραμμα που βρίσκει τις ρίζες μιας εξίσωσης 0 δηλαδή βρίσκει τιμές της x που ικανοποιούν την εξίσωση. Η υποκείμενη ιδέα είναι ότι αν έχομε μια εκτίμηση της ρίζας, η κλίση της συνάρτησης f(x) μπορεί να χρησιμοποιηθεί για να βρει μια καλύτερη εκτίμηση. Αν δίνεται το σημείο x=a, αν f είναι η τιμή της συνάρτησης στο σημείο αυτό και αν k είναι η κλίση, τότε αποδεικνύεται ότι μια καλύτερη τιμή θα είναι στο σημείο b, όπου b = a f / k Επομένως, αρκεί να υπολογίσομε την κλίση της f(x), η οποία δίνεται από την παράγωγο f (x). Η μέθοδος αυτή καλείται μέθοδος των Newton-Raphson. Ως εφαρμογή της μεθόδου, να αναπτυχθεί πρόγραμμα προσέγγισης της τετραγωνικής ρίζας ενός μη αρνητικού αριθμού number με τη μέθοδο Newton-Raphson ως εξής: Αν app είναι μια προσέγγιση του number, τότε (number/app + app)/2 είναι καλύτερη προσέγγιση. Χρησιμοποιείστε ως κριτήριο τερματισμού των επαναλήψεων τη συνθήκη number 1 10 2 app 6 eps. Tο κριτήριο τερματισμού Μια ανακύκλωση της μορφής repeat-until είναι αυτό που ταιριάζει στο πρόβλημα. Προσέξτε ότι το κριτήριο τερματισμού μπορεί να γραφεί ως εξής: number 1 eps 1 eps 2 app ή 2 2 (1 eps) app number (1 eps) app ή καθώς το eps τείνει στο μηδέν, 2 number app, αυτό δηλαδή που θέλομε να δείξομε. Επειδή όμως στον υπολογιστή έχομε υπολογιστική ανακρίβεια, χρησιμοποιούμε αυτή την ανωτέρω ισότητα υπό προσεγγιστική μορφή, πράγμα που δίνει το κριτήριο τερματισμού. Na αναπτύξετε ένα πρόγραμμα που βρίσκει μια ρίζα της εξίσωσης.