Η συνάρτηση Random Η γεννήτρια ψευδοτυχαίων αριθμών της python χρησιμοποιεί τη μέθοδο Mersenne Twister, η οποία παράγει αριθμούς κινητής υποδιαστολής με ακρίβεια 53 bit και έχει περίοδο 2 19937 1. Η συνάρτηση random παράγει τυχαίους αριθμούς [0.0,1.0]. Για να χρησιμοποιήσουμε τη συνάρτηση πρέπει να κάνουμε Import τη μονάδα random : import random Συνάρτηση seed([a]) Περιγραφή Αρχικοποιεί τη γεννήτρια τυχαίων αριθμών. Χωρίς το όρισμα χρησιμοποιεί το ρολόϊ του συστήματος. Αν το όρισμα είναι μια σταθερά παράγεται η ίδια ακολουθία ψευδοτυχαίων random() Επιστρέφει έναν τυχαίο αριθμό κινητής υποδιαστολής στο διάστημα [0.0,1.0] randint(a,b) randrange(stop) Επιστρέφει έναν τυχαίο ακέραιο στο διάστημα [a,b] Επιστρέφει έναν τυχαίο ακέραιο με μέγιστη τιμή stop sample(population,k) gauss(mu,sigma) Επιστρέφει μια λίστα με k μοναδικά στοιχεία από την ακολουθία population. Κατανομή Gauss, το mu αντιστοιχεί στο μέσο όρο και sigma στην τυπική απόκλιση
Παράδειγμα import random print (random.seed()) #αρχικοπoίηση γεννήτριας print (random.random()) #δεκαδικό στο [0.0,1.0] print (random.randrange(10)) #ακέραιο απο 0 9 print (random.randrange(1,20,2)) #περιττό ακέραιο 1 εως 19 print (random.sample('christos drosos',3)) #3 στοιχεία από το δείγμα print (random.gauss(0,1)) #μέση τιμή 0 και απόκλιση 1
Λίγος κώδικας Να γραφεί πρόγραμμα σε Python το οποίο θα διαβάζει από το πληκτρολόγιο 3 ακέραιους συντελεστές μιας δευτεροβάθμιας εξίσωσης και θα υπολογίζει τις 2 ρίζες της, υποθέτοντας ότι η διακρίνουσα είναι θετική import math a=input('δώσε τον 1 αριθμό') b=input('δώσε τον 2 αριθμό') c=input('δώσε τον 3 αριθμό') a=int(a); b=int(b); c=int(c); #γιατι αλλιώς θα θεωρήσει τα a,b,c αλφαρηθμιτικά d=b**2-4*a*c print (d) d=math.sqrt(d) print ('η πρωτη ρίζα είναι', (-b+d)/(2*a)) print ('η δεύτερη ρίζα είναι', (-b-d)/(2*a))
Η εντολή if Η εντολή if χρησιμοποιείται όταν θέλουμε να εκτελείται μια σειρά εντολών εφόσον ισχύει μια συνθήκη x = int(input("please enter an integer: ")) if x < 0: x = 0 print('negative changed to zero') elif x == 0: print('zero') elif x == 1: else: print('single') print('more') Η εντολή «elif» μπορεί και να παραληφθεί και η εντολή «else» είναι προαιρετική. Η Ακουλουθία των if elif elif είναι κάτι αντίστοιχο της εντολής «case» που υπάρχει σε άλλες γλώσσες.
Η εντολή for Η εντολή for στη Python διαφέρει λίγο σε σχέση με τη C++, καθώς το εύρος των επαναλήψεων αφορά το εύρος μιας ακολουθίας (λίστας ή αλφαριθμητικών) words = ['cat', 'window', 'defenestrate'] for w in words: print(w, len(w))
Η εντολή for for w in words[:]: # φτιάχνεται ένα αντίγραφο της λιστας για χρηση απο τη for. if len(w) > 6: words.insert(0, w) print (words) #θα τυπώσει τη νεα λίστα (['defenestrate', 'cat', 'window', 'defenestrate'])
Η εντολή for Εάν θέλουμε η εντολή for να εκτελεστεί για μια σειρά αριθμών τότε χρησιμοποιούμε και τη συνάρτηση range() : for i in range(5): print(i) Οι επαναλήψεις ξεκινάνε από i=0 μέχρι i=4, επίσης μπορούμε να μεταβάλουμε το εύρος και το βήμα των τιμών παίρνει το I στη συνάρτηση range(): range(5, 10) 5 through 9 range(0, 10, 3) 0, 3, 6, 9 range(-10, -100, -30) -10, -40, -70
Η εντολή for Αν θέλουμε να επιδράσουμε πάνω στους δείκτες μιας ακολουθίας τότε συνδυάζουμε τη range() με τη len(): for i in range(5): print(i) a = ['Mary', 'had', 'a', 'little', 'lamb'] for i in range(len(a)): print(i, a[i])
Η εντολή for Τι θα γίνει αν δώσετε την εντολή : print(range(10)) Θα σας δώσει ως αποτέλεσμα: range(0, 10) μπορεί να θεωρηθεί ότι το αντικείμενο range() είναι μια λίστα, αλλά στη πραγματικότητα δεν είναι. Είναι ένα αντικείμενο που επιστρέφει τα διαδοχικά στοιχεία της επιθυμητής ακολουθίας όταν το ζητάτε χωρίς να είναι μια πραγματική τη λίστα, εξοικονομώντας έτσι χώρο. Λέμε ότι ένα τέτοιο αντικείμενο είναι επαναληπτικό, ουσιαστικά δίνει είσοδο σε κάποια function για να παραχθεί μια έξοδος, εκτός από τη for η range() λειτουργεί σαν είσοδος και στην εντολή list η οποία δημιουργεί λίστες από τις επαναλήψεις. Η εντολή list(range(5)) θα δώσει σαν έξοδο: [0, 1, 2, 3, 4]
Η εντολή while Η εντολή επανάληψης while χρησιμοποιείται όταν θέλουμε να επαναλάβουμε μια εντολή ή μια συστάδα εντολών εφόσον ισχύει μια συνθήκη. Η σύνταξή της είναι η εξής: While <έκφραση> : εντολή Παράδειγμα: i=0 while i<30: print (i); i+=1 # i=i+1 Αν τρέξουμε το παραπάνω πρόγραμμα θα τυπώσει τα νούμερα από το 0 μέχρι το 29
Break, Continue και η εντολή else Η εντολή break στη python λειτουργεί όπως και στη C, διακόπτοντας ένα loop for ή ένα loop while πριν ολοκληρωθεί ο αριθμός των επαναλήψεων ή πάψει να ισχύει η συνθήκη Παράδειγμα: for n in range(2, 10): for x in range(2, n): else: if n % x == 0: print(n, 'equals', x, '*', n//x) break # η εντολή else χρησιμοποιείται μαζί με το for και θα εκτελεστή όταν δεν εκτελείται το break print(n, 'is a prime number')
Break, Continue και η εντολή else Η εντολή continue λειτουργεί και αυτή όπως στη c++ for num in range(2, 10): if num % 2 == 0: print("βρήκα έναν ζυγό αριθμό", num) continue print("βρήκα ένα μονό αριθμό", num)
pass Η εντολή pass δεν κάνει απολύτως τίποτα, συνήθως τη χρησιμοποιούμε σε κομμάτια κώδικα τα οποία δεν έχουμε ολοκληρώσει ακόμη έτσι ώστε να μην παίρνουμε μήνυμα σφάλματος κατά την μεταγλώττιση του υπόλοιπου προγράμματος : def initlog(*args): pass # Θυμήσου να το τελειώσεις
Εξαιρέσεις Όταν ξεκινάμε τον προγραμματισμό είναι φυσιολογικό να κάνουμε λάθη, τα συντακτικά λάθη τα αναγνωρίζει εύκολα ο διερμηνευτής της python βγάζοντάς μας ένα μήνυμα λάθους. Εκτός όμως από τα συντακτικά λάθη υπάρχουν και λάθη που συμβαίνουν κατ εξαίρεση με αποτέλεσμα το πρόγραμμα μας να καταρρέει, τέτοια λάθη είναι πχ η διαίρεση με το 0. Για αυτά τα λάθη που ονομάζονται εξαιρέσεις (exception) η Python έχει ένα πολύ καλό μηχανισμό για να τα αντιμετωπίζει. Ο χειρισμός γίνεται με την εντολή try-except: try: εντολές που μπορούν να προκαλέσουν εξαίρεση except τύπος_εξαίρεσης 1: εντολές χειρισμού εξαίρεσης 1 except τύπος εξαίρεσης 2: εντολές χειρισμού εξαίρεσης 2
Εξαιρέσεις Παράδειγμα : try: 1/0 except ZeroDivisionError: print ('προσοχη διαίρεση με το 0') Ο τύπος ZeroDivisionError αποτελεί την πρότυπη εξαίρεση για τη διαίρεση με το 0
Εξαιρέσεις Εξαίρεση TypeError ValueError OverflowError ImportError KeyboardInterrupt IndexError FloatingPointError OSError Συμβαίνει όταν Μια λειτουργία εφαρμόζεται σε λάθος τύπο δεδομένων Σε μια λειτουργία ο τύπος δεδομένων είναι μεν σωστός, η τιμή όμως είναι ακατάλληλη Σφάλμα υπερχείλισης. Το αποτέλεσμα μιας αριθμητικής πράξης είναι πολύ μεγάλο για να αναπαρασταθεί Η εντολή Import δεν μπόρεσε να εντοπίσει τη μονάδα προς εισαγωγή Ο χρήστης πάτησε το πλήκτρο διακοπής (Ctrl+c) Ο αριθμός δεικτοδότησης μιας ακολουθίας είναι εκτός επιτρεπτών ορίων Σφάλμα σε λειτουργία αριθμών κινητής υποδιαστολής Σφάλμα συστήματος πχ δίσκος γεμάτος, δεν βρέθηκε ο δισκος
Εξαιρέσεις try: Η εντολή try-except διαθέτει και αυτή ένα προαιρετικό τμήμα else, οι εντολές του οποίου εκτελούνται μόνο όταν δεν συμβεί κάποια εξαίρεση. Είναι προφανές ότι το τμήμα αυτό πρέπει έπεται όλων των εξαιρέσεων: num = int(input( Δώσε έναν ακέραιο: ')) print(num) except KeyboardInterrupt: print('\nγιατί πάτησες [Ctrl]+[C]?') except: else: print( Αναπάντεχο σφάλμα') print('thanx.')
Εξαιρέσεις try: Η εντολή try-except διαθέτει ένα ακόμη προαιρετικό τμήμα finally, το οποίο εκτελείται σε κάθε περίπτωση ανεξάρτητα αν συμβεί κάποια εξαίρεση ή όχι: x = float(input('give the dividend: ')) y = float(input('and the divisor: ')) result = x / y except ZeroDivisionError: print('division by zero!') except (ValueError, TypeError, NameError): print('invalid data!') except: else: print('trouble!!!') print('%.2f / %.2f is %.2f' % (x, y, result)) finally: print('cleaning up: This is the end my friend.') #3 εξαιρέσεις αν συμβεί μια θα εκτελεστή η από κάτω print
Εξαιρέσεις Η εντολή raise μας δίνει τη δυνατότητα να προκαλέσουμε εμείς δυναμικά μια εξαίρεση, μεταβιβάζοντάς της δυναμικά και ορίσματα για να διευκρινίσουμε τα τι ακριβώς προκάλεσε την εξαίρεση: x = -10 try: if x <= 0: raise Exception('I said only positive numbers!') except Exception as ex: print('error:', ex)
Παραδείγματα - Κώδικα (3.19) Να γραφεί πρόγραμμα το οποίο θα διαβάζει από το πληκτρολόγιο αριθμούς και έναν αριθμητικό τελεστή ως χαρακτήρα και θα εκτελεί τις 4 βασικές αριθμητικές πράξεις: invalid_op = False print("enter two numbers and an operator in ") print("the format 'number1 operator number2':") n1, op, n2 = input('').split() # με τη συνάρτηση input γίνεται η εισαγωγή των δεδομένων, η μέθοδος split() διαχωρίζει τα δεδομένα που πληκτρολογεί ο χρήστης με βάση το χαρακτήρα n1 = float(n1) # που τις δίνεται ως όρισμα, αν δεν δοθεί χρησιμοποιούνται οι λευκοί χαρκατήρες ( το κενό ή ο στηλοθέτης) n2 = float(n2) # μετατροπή σε πραγματικούς if op == '*': result = n1 * n2 elif op == '/': result = n1 / n2 elif op == '+': result = n1 + n2 elif op == '-': result = n1 - n2 else: invalip_op = True if invalid_op == True: print('invalid operator.') else: print('%.2f %s %.2f is %.2f' % (n1, op, n2, result))
Παραδείγματα - Κώδικα Να γραφεί πρόγραμμα που θα διαβάζει ένα θετικό ακέραιο από το πληκτρολόγιο και θα τυπώνει τα τετράγωνα όλων των προηγούμενων ακεραίων. # 3-20.py num = int(input('enter an positive integer: ')) #διαβάζουμε από το πληκτρολόγιο και τη μετατρέπουμε σε ακέραια if num >= 0: else: for n in range(num): #χρησιμοποιούμε τη range για να πάρουμε τη λίστα όλων των προηγούμενων αριθμών print('{0:3d} squared is {1:5d}'.format(n, n*n)) #με τη μέθοδο format κάνουμε στοίχιση δεξιά την πρώτη τιμή print('that\'s not a positive integer.') # {0} με ελάχιστο πλάτος 3 θέσεις και τη δεύτερη τιμή {1} με πλάτος 5 θέσεις
Παραδείγματα - Κώδικα Να γραφεί πρόγραμμα το οποίο να διαβάζει συνεχώς ακέραιους αριθμούς από το πληκτρολόγιο μέχρι να δοθεί η τιμή 0. Το πρόγραμμα θα μετράει και θα εμφανίζει το πλήθος των περιττών και άρτιων αριθμών που πληκτρολογήθηκαν: # 3-21.py odd = even = 0 print('enter integers, 0 to quit.') while True: num = int(input('give:')) #δημιουργούμε ένα βρόγχο που τρέχει συνεχώς if num == 0: #έλεγχος αν πατήθηκε το 0 break elif num % 2 == 1: #ελέγχουμε το υπόλοιπο της διαίρεσης αν είναι 1 έχουμε περιττό odd += 1 elif num % 2 == 0: even += 1 print('%d odd and %d even numbers entered.' % (odd, even)) #ο προσδιοριστής %d υποδηλώνει ακέραιες τιμές
Παραδείγματα - Κώδικα Να γραφεί πρόγραμμα το οποίο θα διαβάζει συνεχώς έναν χαρακτήρα από το πληκτρολόγιο και θα ελέγχει αν είναι κεφαλαίο λατινικό γράμμα: # 3-22.py while True: ch = input('enter only uppercase letters:') if ch not in "ABCDEFGHIJKLMNOPQRSTUVWXYZ": print("that's not an uppercase letter.") break
Παραδείγματα - Κώδικα Να γραφεί πρόγραμμα το οποίο θα διαβάζει από το πληκτρολόγιο μια λίστα δυαδικών αριθμών χωρισμένους με κόμμα και θα εμφανίζει στη δεκαδική τους μορφή μόνο όσους διαιρούνται με το 5 # 3-23.py data = input('enter comma separated binaries: ') for b in data.split(','): #η μέθοδος split() τεμαχίζει το αλφαριθμητικό με αναφορά το χαρακτήρα, number = int(b, 2) # base is 2 if not number % 5: print(number, end=' ') # η for μετατρέπει κάθε τμήμα του που αποτελείται από Δυαδικά ψηφία #στο δεκαδικό σύστημα #αν το υπόλοιπο είναι μηδέν τότε με τη προσθήκη του not η συνθήκη γίνεται αληθής
Παραδείγματα - Κώδικα Να γραφεί πρόγραμμα το οποίο να διαβάζει ένα αλφαριθμητικό και έναν χαρακτήρα και θα ελέγχει αν υπάρχει ο χαρακτήρας σε αυτό. Να δημιουργηθεί ένα νέο αλφαριθμητικό στο οποίο οι χαρακτήρες που δεν ταυτίζονται να αντικατασταθούν με τη κάτω παύλα: # 3-24.py string = input('enter a string: ') ch = input('enter a character to search: ') found = False output = '' for x in string: if x == ch: else: if found: else: output += ch found = True output += '_' print(output) # blank string for output #ελέγχουμε κάθε στοιχείο του αλφαριθμητικού με το χαρακτήρα print('character "%s" is not in "%s".' % (ch, string))
Παραδείγματα - Κώδικα Να γραφεί πρόγραμμα το οποίο να εμφανίζει τους πρώτους αριθμούς μέχρι τον αριθμό 30. # 3-25.py i = 1 print('the prime numbers until 30 are:') while i <= 30: c = 0; j = 1 while j < i: if i % j == 0: c += 1 j += 1 if c == 1: print(i, end=' ') i += 1
Παραδείγματα - Κώδικα Να γραφεί πρόγραμμα το οποίο να ζητάει από το χρήστη να μαντέψει ένα τυχαίο αριθμό από το 1 έως το 10 με 3 το πολύ προσπάθειες: # 3-26.py import random times = 1 rnum = random.randint(1, 10) #δημιουργία ενός τυχαίου ακέραιου από το 1 μέχρι το 10 while times <= 3: else: num = input('guess a number between 1 and 10: ') if rnum == num: print('correct!') break print('that\'s not my number') times += 1 print('blnt') # Better Luck Next Time ;-)
Παραδείγματα - Κώδικα Ο προηγούμενος κώδικας επιδέχεται βελτίωσης: # 3-26.py import random times = 1 rnum = random.randint(1, 10) while times <= 3: num = int(input('guess a number between 1 and 10: ')) if rnum == num: print('correct!') break if rnum > num: print('έδωσες μικρότερο αριθμό') if rnum < num: print('έδωσες μεγαλύτερο αριθμό') times += 1 else: print('o αριθμός είναι:',rnum) print('blnt') # Better Luck Next Time ;-)
Παραδείγματα - Κώδικα Να γραφεί ένα πρόγραμμα που θα μετατρέπει έναν ακέραιο στον αντίστοιχο δυαδικό. Το πρόγραμμα να μη δέχεται αρνητικούς αριθμούς και να χειρίζεται τις κατάλληλες εξαιρέσεις: # 3-27.py binary = '' try: number = int(input('enter a number to convert: ')) if number < 0: raise Exception('Positive integer please!') #αν ο χρήστης δώση αρνητικό αριθμό η raise εγείρει μια εξαίρεση elif number == 0: binary = '00000000' else: while number > 0: digit = str(number % 2) # 0 or 1 #Χρησιμοποιώντας το τελεστή υπολοίπου ακεραίας διαίρεσης με 2 εξάγουμε κάθε φορά το δεξιότερο δυαδικό ψηφίο binary = digit + binary # append digit #το οποίο και κάνουμε προσθήκη από τα αριστερά στο νέο αλφαρηθμιτικό number = number // 2 # integral division #Στη συνέχεια εκτελούμε ακέραια διαίρεση με το 2 για να υπολογίσουμε τον αριθμό που υπολείπεται αν αφαιρέσουμε το δεξιότερο bit if len(binary) < 8: # at last 8 digits for i in range(8 - len(binary)): binary = '0' + binary print('the binary representation is %s' % binary) except (ValueError, TypeError, ArithmeticError): print('that\'s not a valid input.') except Exception as ex: print(ex) #ελέγχουμε για τις εξαιρέσεις λάθος τιμής, λάθος τύπος, και η ArithmeticError είναι βασική εξαίρεση για τις αριθμητικές πράξεις #(OverflowError, ZeroDivisionError και FloatingPointError)
Παραδείγματα - Κώδικα Να γραφεί πρόγραμμα το οποί θα δημιουργήσει μια εξαίρεση του τύπου OverflowError: # 3-28.py try: x = 10.0 for i in range(1, 100): x = x ** I #υψώνοντας τη μεταβλητή x κάθε φορά στην επόμενη τιμή του I σύντομα θα συμβεί υπερχείλιση print(i, x) except OverflowError: print('overflowed after', x)
Παραδείγματα - Κώδικα Εγκατάλειψη ε φωλιασμένων βρόγχων προκαλώντας μια εξάιρεση: # 3-29.py band1 = 'Camel' band2 = 'Procol Harum' try: for char1 in band1.upper(): #ψάχνουμε να βρούμε το πρώτο κοινό χαρακτήρα των 2 for char2 in band2.upper(): #αλφαριθμητικών μόλις των βρούμε προκαλούμε μια εξαίρεση if char2 == char1: raise StopIteration() # raise exception except StopIteration: print('first common character is', char2)