Γλώσσες Προγραμματισμού Εφαρμογών - ΜΕΠΒ20 Διάλεξη 4 Ανακυκλώσεις Παπαϊωάννου Αθανάσιος Π.Μ.Σ. «Εφαρμοσμένη Πληροφορική» Χειμερινό Εξάμηνο 20 16-20 17
Συναρτήσεις: Παράμετρος key/value Μπορούμε να περάσουμε ένα όρισμα dictionary σε μια συνάρτηση. Παίρνουμε την τιμή κάθε παραμέτρου με το key του. def bar(first, second, third, **options): if options.get("action") == "sum": print "The sum is: %d" % (first + second + third)
Βρόγχοι n = 5 Εξοδος: No n > 0? Ye s n = 5 while n > 0 : print n 5 4 print n n = n 1 print('blastoff!') 3 2 n = n -1 print(n) 1 Blastoff! 0 print 'Blastoff' Loops (Βρόγχοι): έχουν μεταβλητές επανάληψης που αλλάζουν κάθε φορά. Συχνά, αυτές οι μεταβλητές επανάληψης περνούν από μια ακολουθία αριθμών.
Βρόγχος επ άπειρο n = 5 No n > 0? Ye s print 'Lather' n = 5 while n > 0 : print('lather') print('rinse') print('dry off!') print 'Rinse' print 'Dry off!' Ποιό είναι το σφάλμα σε αυτό τον βρόγχο;
Άλλος ένας βρόγχος n = 0 No n > 0? Yes print 'Lather' n = 0 while n > 0 : print('lather') print('rinse') print('dry off!') print 'Rinse' Τί έξοδο δίνει αυτός ο βρόγχος; print 'Dry off!'
Έξοδος από ένα βρόγχο Η εντολή break τερματίζει τον τρέχοντα βρόγχο και μεταβαίνει στην κατάσταση αμέσως μετά το βρόγχο Είναι σαν ένας βρόγχος ελέγχου που μπορεί να συμβεί οπουδήποτε στο σώμα του βρόγχου while True: line = input('> ') if line == 'done' : break print(line) print('done!') > hello there hello there > finished finished > done Done!
Έξοδος από ένα βρόγχο Η εντολή break τερματίζει τον τρέχοντα βρόγχο και μεταβαίνει στην κατάσταση αμέσως μετά το βρόγχο Είναι σαν ένας βρόγχος ελέγχου που μπορεί να συμβεί οπουδήποτε στο σώμα του βρόγχου while True: line = input('> ') if line == 'done' : break print(line) print('done!') > hello there hello there > finished finished > done Done!
while True: line = input('> ') if line == 'done' : break print(line) print('done!') No True? Ye s... break... print 'Done' http:/ / en.wikipedia.org/ wiki/ Transporter_(Star_Trek)
Τελειώνοντας μια επανάληψη με συνέχεια Η δήλωση continue τελειώνει την τρέχουσα επανάληψη και επιστρέφει στην κορυφή του βρόγχου, όπου και αρχίζει την επόμενη επανάληψη while True: line = input('> ') if line == '#' : continue if line == 'done' : break print(line) print('done!') > hello there hello there > # don't print this > print this! print this! > done Done!
Τελειώνοντας μια επανάληψη με συνέχεια Η δήλωση continue τελειώνει την τρέχουσα επανάληψη και επιστρέφει στην κορυφή του βρόγχου, όπου και αρχίζει την επόμενη επανάληψη while True: line = input('> ') if line[0] == '#' : continue if line == 'done' : break print(line) print('done!') > hello there hello there > # don't print this > print this! print this! > done Done!
No True? while True: line = input('> )... if line[0] == '#' : continue if line == 'done' : break print(line) print('done!')... Ye s continue print 'Done'
Εντολή pass Μια «κενή» εντολή μπορεί να δοθεί με την εντολή pass. Χρήσιμη όπου απαιτείται εντολή αλλά δεν θέλουμε να δώσουμε, π.χ. n = 0 while n > 0 : pass print('dry off!')
Αόριστοι Βρόγχοι Οι βρόγχοι while ονομάζονται «αόριστοι βρόγχοι" επειδή συνεχίζουν μέχρι μια λογική κατάσταση να γίνει Ψευδής (False). Οι βρόγχοι που έχουμε δει μέχρι τώρα είναι αρκετά εύκολο να εξεταστούν για να δούμε αν θα τερματίσουν ή αν θα είναι «αόριστοι βρόγχοι. Μερικές φορές είναι δυσκολότερο να δούμε εάν θα τερματίσει ο βρόγχος ή όχι.
Definite Loops (Πεπερασμένοι Βρόγχοι) Αρκετά συχνά έχουμε μια λίστα με τα στοιχεία των γραμμών σε ένα αρχείο - ουσιαστικά ένα πεπερασμένο σύνολο από πράγματα. Μπορούμε να γράψουμε ένα βρόγχο για να τρέξει το βρόγχο μια φορά για κάθε ένα από τα στοιχεία σε ένα σύνολο, χρησιμοποιώντας το όρισμα for της Python για την κατασκευή. Οι βρόγχοι αυτοί ονομάζονται definite loops επειδή εκτελούνται με συγκεκριμένο αριθμό επαναλήψεων. Οι definite loops επαναλαμβάνονται μέσω των μελών ενός συνόλου.
Ένα απλό Definite Loop for i in [5, 4, 3, 2, 1] : print i print('blastoff!') 5 4 3 2 1 Blastoff!
Ένας Definite Loop με Συμβολοσειρές friends = ['Joseph', 'Glenn', 'Sally'] for friend in friends : print('happy New Year:', friend) print('done!') Happy New Year: Joseph Happy New Year: Glenn Happy New Year: Sally Done!
Ένα απλό Definite Loop Yes Done? No Move i ahead print i for i in [5, 4, 3, 2, 1] : print(i) print('blastoff!') 5 4 3 2 1 Blastoff! print 'Blast off!' Οι Definite loops (for loops) έχουν σαφείς μεταβλητές επανάληψης που αλλάζουν κάθε φορά μέσω ενός βρόγχου. Αυτές οι μεταβλητές επανάληψης κινούνται μέσω της ακολουθίας ή σετ.
Μια ματιά στο in... Η μεταβλητή επανάληψης "επαναλαμβάνει" μέσω της ακολουθίας (διατεταγμένο σύνολο). Μεταβλητή επανάληψης Ακολουθία πέντε στοιχείων Το block (Σώμα) του κώδικα εκτελείται μια φορά για κάθε τιμή μέσα στην ακολουθία. for i in [5, 4, 3, 2, 1] : print(i) Η μεταβλητή επανάληψης κινείται μέσα από όλες τις τιμές στην ακολουθία.
Ye s Done? No Move i ahead Η μεταβλητή επανάληψης "επαναλαμβάνει" μέσω της ακολουθίας (διατεταγμένο σύνολο). print i Το block (Σώμα) του κώδικα εκτελείται μια φορά για κάθε τιμή μέσα στην ακολουθία. for i in [5, 4, 3, 2, 1] : print(i) Η μεταβλητή επανάληψης κινείται μέσα από όλες τις τιμές στην ακολουθία.
i = 5 print i Ye s Done? No Move i ahead i = 4 print i i = 3 print i print i i = 2 print i for i in [5, 4, 3, 2, 1] : print(i) i = 1 print i
Πεπερασμένοι Βρόγχοι (Definite Loops) Αρκετά συχνά έχουμε μια λίστα με τα στοιχεία των γραμμών σε ένα αρχείο - ουσιαστικά ένα πεπερασμένο σύνολο από πράγματα. Μπορούμε να γράψουμε ένα βρόγχο για να τρέξει το βρόγχο μια φορά για κάθε ένα από τα στοιχεία σε ένα σύνολο, χρησιμοποιώντας το for για την κατασκευή. Αυτoί οι βρόγχοι ονομάζονται «πεπερασμένοι βρόγχοι», επειδή θα εκτελεστούν για ενα ακριβή αριθμό επαναλήψεων. Λέμε ότι «ο πεπερασμένος βρόγχος μετακινείται μέσα από τα μέλη ενός συνόλου».
Ιδιωματισμοί Βρόγχων: Τι κάνουμε με τους Βρόγχους Σημείωση: Ακόμα κι αν αυτά τα παραδείγματα είναι απλά, τα πρότυπα εφαρμόζονται σε όλα τα είδη των βρόγχων
Δημιουργώντας «έξυπνους» βρόγχους Το κόλπο είναι να "γνωρίζετε" κάτι για ολόκληρο το βρόγχο όταν είστε "κολλημένοι" γράφοντας κώδικα που βλέπει μόνο μία είσοδο τη φορά. Ορίστε μερικές μεταβλητές στις αρχικές τιμές Για το αντικείμενο στα δεδομένα: Ψάξτε για κάτι ή κάνετε κάτι για κάθε είσοδο ξεχωριστά, και ενημερώστε την μεταβλητή Κοιτάξτε τις μεταβλητές
Βρόγχος μέσα σε σύνολο print('before') for thing in [9, 41, 12, 3, 74, 15] : print(thing) print('after') $ python basicloop.py Before 9 41 12 3 74 15 After
Ποιός είναι ο μεγαλύτερος αριθμός;
Ποιός είναι ο μεγαλύτερος αριθμός; 3 41 12 9 74 15 l ar gest _so _f ar -1
Έυρεση Μέγιστης τιμής largest_so_far = -1 print('before', largest_so_far) for the_num in [9, 41, 12, 3, 74, 15] : if the_num > largest_so_far : largest_so_far = the_num print(largest_so_far, the_num) print('after', largest_so_far) $ python largest.py Before -1 9 9 41 41 41 12 41 3 74 74 74 15 After 74 Δημιουργούμε μια μεταβλητή που περιέχει τη μεγαλύτερη τιμή που έχουμε δει μέχρι τώρα. Εάν ο τρέχων αριθμός που εξετάζουμε είναι μεγαλύτερος, θα είναι η νέα μέγιστη τιμή που έχουμε δει μέχρι τώρα.
Αρίθμηση σε βρόγχο counter = 0 print('before', counter) for thing in [9, 41, 12, 3, 74, 15] : counter = counter + 1 print(counter, thing) print('after', counter) $ python countloop.py Before 0 1 9 2 41 3 12 4 3 5 74 6 15 After 6 Για να μετρήσουμε πόσες φορές έχουμε εκτελέσει έναν βρόγχο, εισάγουμε μια μεταβλητή - μετρητή που ξεκινά από το 0 και προσθέτουμε ένα σε αυτό κάθε φορά μέσω του βρόγχου.
Άθροισμα σε βρόγχο sum = 0 print('before', sum) for thing in [9, 41, 12, 3, 74, 15] : sum = sum + thing print(sum, thing) print('after', sum) $ python countloop.py Before 0 9 9 50 41 62 12 65 3 139 74 154 15 After 154 Για να προσθέσουμε μια τιμή που συναντάμε σε έναν βρόγχο, έχουμε εισαγάγει ένα μεταβλητό ποσό που ξεκινά από το 0 και προσθέτουμε την αξία με το άθροισμα κάθε φορά μέσω του βρόγχου.
Εύρεση Μέσου Όρου σε βρόγχο count = 0 sum = 0 print('before', count, sum) for value in [9, 41, 12, 3, 74, 15] : count = count + 1 sum = sum + value print(count, sum, value) print('after', count, sum, sum / count) $ python averageloop.py Before 0 0 1 9 9 2 50 41 3 62 12 4 65 3 5 139 74 6 154 15 After 6 154 25 Ο μέσος όρος (average) συνδιάζει τα πρότυπα αρίθμηση (counting) και σύνολο (sum) και διαιρεί όταν ο βρόγχος ολοκληρωθεί.
Φιλτράροντας ένα βρόγχο print('before') for value in [9, 41, 12, 3, 74, 15] : if value > 20: print('large number',value) print('after') $ python search1.py Before Large number 41 Large number 74 After Χρησιμοποιούμε μια δήλωση if στο loop για να εντοπίσουμε ή να φιλτράρουμε τα αποτελέσματα
Αναζήτηση με χρήση μεταβλητής Boolean found = False print('before', found) for value in [9, 41, 12, 3, 74, 15] : if value == 3 : found = True print(found, value) print('after', found) $ python search1.py Before False False 9 False 41 False 12 True 3 True 74 True 15 After True Αν απλά θέλουμε να αναζητήσουμε και να μάθουμε αν βρέθηκε μια τιμή, χρησιμοποιούμε μια μεταβλητή που ξεκινά ως False και μεταβάλλεται σε True μόλις βρούμε αυτό που ψάχνουμε.
Ποιός είναι ο μικρότερος αριθμός;
Ποιός είναι ο μικρότερος αριθμός; 9 41 12 3 74 15 smallest_so_far -1
Ποιός είναι ο μικρότερος αριθμός; 9 41 12 3 74 15 smallest_so_far None
Εύρεση της μικρότερης τιμής smallest = None print('before') for value in [9, 41, 12, 3, 74, 15] : if smallest is None : smallest = value elif value < smallest : smallest = value print(smallest, value) print('after', smallest) $ python smallest.py Before 9 9 9 41 9 12 3 3 3 74 3 15 After 3 Εχουμε ακόμα μια μεταβλητή που είναι η μικρότερη μέχρι στιγμής. Την πρώτη φορά που τρέχει η loop, η τιμή της smallest είναι None, οπότε λαμβάνουμε την value ορισμένη ως μικρότερη.
range() και slice copy : range(5) = 0, 1, 2, 3, 4 range(1,3) = 1, 2 range(0,9,3) = 0, 3, 6 words = ['cat', 'window', 'defenestrate'] for w in words[:]: # Loop over a slice copy of the entire list. if len(w) > 6: words.insert(0, w) words
Πρώτο Παράδειγμα Ταξινόμησης l = [34,5,6,7,2,90,23,87] flag = False # not sorted BubbleSort while not flag : flag = True # sorted for i in range(len(l)-1): if l[i] > l[i+1]: #swap tmp = l[i+1] l[i+1] = l[i] l[i] = tmp flag = False # not sorted
Βρόγχοι με else Η Python υποστηρίζει else σε βρόγχο ανακύκλωσης. Αν η εντολή else χρησιμοποιείται για το βρόγχο for, το else εκτελείται όταν ο βρόγχος εξαντλεί την επισκεψιμότητα της λίστας. Αν η εντολή else χρησιμοποιείται σε while, το else εκτελείται όταν η συνθήκη γίνεται False. for num in range(10,20): #to iterate between 10 to 20 for i in range(2,num): #to iterate on the factors of the number if num%i == 0: #to determine the first factor j=num/i #to calculate the second factor print('%d equals %d * %d' % (num,i,j)) break #to move to the next number, the #first FOR # else part of the loop else: print(num, 'is a prime number')
Οι χειριστές is και is not smallest = None print('before') for value in [3, 41, 12, 9, 74, 15] : if smallest is None : smallest = value elif value < smallest : smallest = value print(smallest, value) print('after', smallest) Η Python έχει τον χειριστή is που μπορεί να χρησιμοποιηθεί σε λογικές εκφράσεις. Σημαίνει είναι το ίδιο με αλλά συγκρίνει αντικείμενα όχι μόνο τιμές. Παρόμοιο σε λειτουργία, αλλά ισχυρότερο απο το == Το is not είναι επίσης λογικός χειριστής.
Περίληψη Βρόγχοι While (indefinite) Βρόγχοι Infinite Χρήση του break Χρήση του continue Βρόγχοι For (definite) Μεταβλητές επανάληψης Ιδιωματισμοί των Loop Μεγαλύτερο ή Μικρότερο