Διαδρομές
/
Python
Python
/
Ασκήσεις
/
Βάζοντας βαθμούς
Βάζοντας βαθμούς

Βάζοντας βαθμούς

Άσκηση εκμάθησης

Εισαγωγή

Η Python έχει δύο δομές επανάληψης. Τους βρόχους while για αόριστη (μη μετρημένη) επανάληψη και τους βρόχους for για ορισμένη (μετρημένη) επανάληψη. Οι λέξεις-κλειδιά break, continue και else βοηθούν να προσαρμόσεις τη συμπεριφορά του βρόχου. Οι range() και enumerate() βοηθούν στη μέτρηση και στις θέσεις των στοιχείων μέσα σε έναν βρόχο.

While

Οι βρόχοι while συνεχίζουν να εκτελούνται όσο η loop expression ή το "test" αξιολογείται σε True μέσα σε ένα boolean context και σταματούν όταν αυτό αξιολογείται σε False:


# Lists are considered "truthy" in a boolean context if they
# contain one or more values, and "falsy" if they are empty.

>>> placeholders = ["spam", "ham", "eggs", "green_spam", "green_ham", "green_eggs"]

>>> while placeholders:
...     print(placeholders.pop(0))
...
'spam'
'ham'
'eggs'
'green_spam'
'green_ham'
'green_eggs'

For

Ο βασικός βρόχος for στην Python περιγράφεται καλύτερα ως ένα for each που διατρέχει τις τιμές οποιουδήποτε αντικειμένου iterable και σταματά όταν δεν επιστρέφονται άλλες τιμές από την κλήση της next():


>>> word_list = ["bird", "chicken", "barrel", "bongo"]

>>> for word in word_list:
...    if word.startswith("b"):
...        print(f"{word.title()} starts with a B.")
...    else:
...        print(f"{word.title()} doesn't start with a B.")
...
'Bird starts with a B.'
'Chicken doesn\'t start with a B.'
'Barrel starts with a B.'
'Bongo starts with a B.'

Αντικείμενο ακολουθίας range()

Όταν δεν δίνεται κάποιο συγκεκριμένο iterable, η ειδική ακολουθία range() χρησιμοποιείται ως μετρητής βρόχου. Η range() απαιτεί ένα int όπου θα stop η ακολουθία και μπορεί προαιρετικά να πάρει παραμέτρους start και step. Αν δεν δοθεί αριθμός start, η ακολουθία ξεκινά από το 0. Τα αντικείμενα range() είναι τεμπέλικα (οι τιμές παράγονται κατ' απαίτηση), υποστηρίζουν όλες τις κοινές πράξεις ακολουθίας και καταλαμβάνουν σταθερή ποσότητα μνήμης, ανεξάρτητα από το μήκος της ακολουθίας που ορίζεται.

# Here we use range to produce some numbers, rather than creating a list of them in memory.
# The values will start with 1 and stop *before* 7

>>> for number in range(1, 7):
...    if number % 2 == 0:
...       print(f"{number} is even.")
...    else:
...       print(f"{number} is odd.")
'1 is odd.'
'2 is even.'
'3 is odd.'
'4 is even.'
'5 is odd.'
'6 is even.'

# range() can also take a *step* parameter.
# Here we use range to produce only the "odd" numbers, starting with 3 and stopping *before* 15.

>>> for number in range(3, 15, 2):
...    if number % 2 == 0:
...       print(f"{number} is even.")
...    else:
...       print(f"{number} is odd.")
...
'3 is odd.'
'5 is odd.'
'7 is odd.'
'9 is odd.'
'11 is odd.'
'13 is odd.'

Τιμές και θέσεις με τη enumerate()

Αν χρειάζεσαι και τις τιμές και τις θέσεις τους, η ενσωματωμένη enumerate(<iterable>) επιστρέφει ζεύγη (index, value):


>>> word_list = ["bird", "chicken", "barrel", "apple"]

# *index* and *word* are the loop variables.
# Loop variables can be any valid python name.

>>> for index, word in enumerate(word_list):
...    if word.startswith("b"):
...        print(f"{word.title()} (at index {index}) starts with a B.")
...    else:
...        print(f"{word.title()} (at index {index}) doesn't start with a B.")
...
'Bird (at index 0) starts with a B.'
'Chicken (at index 1) doesn\'t start with a B.'
'Barrel (at index 2) starts with a B.'
'Apple (at index 3) doesn\'t start with a B.'


# The same method can be used as a "lookup" for pairing items between two lists.
# Of course, if the lengths or indexes don't line up, this doesn't work.

>>> word_list = ["cat", "chicken", "barrel", "apple", "spinach"]
>>> category_list = ["mammal", "bird", "thing", "fruit", "vegetable"]

>>> for index, word in enumerate(word_list):
...    print(f"{word.title()} is in category: {category_list[index]}.")
...
'Cat is in category: mammal.'
'Chicken is in category: bird.'
'Barrel is in category: thing.'
'Apple is in category: fruit.'
'Spinach is in category: vegetable.'

Αλλαγή της συμπεριφοράς του βρόχου

Η λέξη-κλειδί continue μπορεί να χρησιμοποιηθεί για να παρακάμψεις και να προχωρήσεις στον επόμενο κύκλο επανάληψης:

word_list = ["bird", "chicken", "barrel", "bongo", "sliver", "apple", "bear"]

# This will skip *bird*, at index 0
for index, word in enumerate(word_list):
    if index == 0:
        continue
    if word.startswith("b"):
        print(f"{word.title()} (at index {index}) starts with a b.")

'Barrel (at index 2) starts with a b.'
'Bongo (at index 3) starts with a b.'
'Bear (at index 6) starts with a b.'

Η λέξη-κλειδί break (όπως σε πολλές γλώσσες συγγενικές με τη C) μπορεί να χρησιμοποιηθεί για να σταματήσει η επανάληψη και να "σπάσεις" τον πιο εσωτερικό loop που την περιβάλλει:

>>>  word_list = ["bird", "chicken", "barrel", "bongo", "sliver", "apple"]

>>> for index, word in enumerate(word_list):
...    if word.startswith("b"):
...        print(f"{word.title()} (at index {index}) starts with a B.")
...    elif word == "sliver":
...       break
...    else:
...       print(f"{word.title()} doesn't start with a B.")
... print("loop broken.")
...
'Bird (at index 0) starts with a B.'
'Chicken doesn\'t start with a B.'
'Barrel (at index 2) starts with a B.'
'Bongo (at index 3) starts with a B.'
'loop broken.'

Οδηγίες

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

1. Στρογγυλοποίηση βαθμών

Ενώ μπορείς να δώσεις "μερική μοριοδότηση" στις ερωτήσεις του διαγωνίσματος, οι συνολικοί βαθμοί του διαγωνίσματος πρέπει να είναι τύπου int. Έτσι, πριν κάνεις οτιδήποτε άλλο με τους βαθμούς της τάξης, πρέπει να περάσεις από όλους τους βαθμούς και να μετατρέψεις όσους είναι float σε int. Ευτυχώς για σένα, η Python έχει την ενσωματωμένη συνάρτηση round() που μπορείς να χρησιμοποιήσεις.

Δημιούργησε τη συνάρτηση round_scores(student_scores) που δέχεται μια list με student_scores. Αυτή η συνάρτηση πρέπει να καταναλώνει τη list εισόδου και να επιστρέφει (return) μια νέα λίστα με όλους τους βαθμούς μετατρεγμένους σε int. Η σειρά των βαθμών στη list που προκύπτει δεν έχει σημασία.

>>> student_scores = [90.33, 40.5, 55.44, 70.05, 30.55, 25.45, 80.45, 95.3, 38.7, 40.3]
>>> round_scores(student_scores)
...
[40, 39, 95, 80, 25, 31, 70, 55, 40, 90]

2. Μαθητές που δεν περνούν

Καθώς διόρθωνες το διαγώνισμα, παρατήρησες ότι κάποιοι μαθητές δεν τα πήγαν τόσο καλά όσο ήλπιζες. Αλλά αποσπάστηκες και ξέχασες να σημειώσεις ακριβώς πόσοι μαθητές ήταν.

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

>>> count_failed_students(student_scores=[90,40,55,70,30,25,80,95,38,40])
5

3. Οι "καλύτεροι"

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

Δημιούργησε τη συνάρτηση above_threshold(student_scores, threshold) που δέχεται ως παραμέτρους το student_scores (μια list με βαθμούς) και το threshold (το κατώφλι της "κορυφαίας βαθμολογίας"). Αυτή η συνάρτηση πρέπει να επιστρέφει μια list με όλους τους βαθμούς που είναι >= το threshold.

>>> above_threshold(student_scores=[90,40,55,70,30,68,70,75,83,96], threshold=75)
[90,75,83,96]

4. Υπολογισμός βαθμών με γράμματα

Ο δάσκαλος που βοηθάς θέλει να δίνει βαθμούς με γράμματα, εκτός από αριθμητικούς βαθμούς. Επειδή οι μαθητές σπάνια πιάνουν 100 σε ένα διαγώνισμα, τα κατώτερα όρια του "βαθμού με γράμμα" υπολογίζονται με βάση την υψηλότερη βαθμολογία που επιτεύχθηκε και αυξάνονται ομοιόμορφα ανάμεσα στην υψηλότερη βαθμολογία και το όριο αποτυχίας του <= 40.

Δημιούργησε τη συνάρτηση letter_grades(highest) που δέχεται ως όρισμα τον "υψηλότερο" βαθμό του διαγωνίσματος και επιστρέφει μια list με τα κατώτερα όρια βαθμολογίας για κάθε διάστημα βαθμών "αμερικανικού τύπου": ["D", "C", "B", "A"].

"""Where the highest score is 100, and failing is <= 40.
       "F" <= 40
 41 <= "D" <= 55
 56 <= "C" <= 70
 71 <= "B" <= 85
 86 <= "A" <= 100
"""

>>> letter_grades(highest=100)
[41, 56, 71, 86]


"""Where the highest score is 88, and failing is <= 40.
       "F" <= 40
 41 <= "D" <= 52
 53 <= "C" <= 64
 65 <= "B" <= 76
 77 <= "A" <= 88
"""

>>> letter_grades(highest=88)
[41, 53, 65, 77]

5. Αντιστοίχιση ονομάτων με βαθμούς

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

Δημιούργησε τη συνάρτηση student_ranking(student_scores, student_names) με παραμέτρους student_scores και student_names. Αντιστοίχισε κάθε όνομα μαθητή στη list student_names με τον βαθμό του από τη list student_scores. Μπορείς να υποθέσεις ότι κάθε list ορίσματος θα είναι ταξινομημένη από τον υψηλότερο βαθμό στον χαμηλότερο. Η συνάρτηση πρέπει να επιστρέφει μια list από συμβολοσειρές με τη μορφή <rank>. <student name>: <student score>.

>>> student_scores = [100, 99, 90, 84, 66, 53, 47]
>>> student_names =  ['Joci', 'Sara','Kora','Jan','John','Bern', 'Fred']
>>> student_ranking(student_scores, student_names)
...
['1. Joci: 100', '2. Sara: 99', '3. Kora: 90', '4. Jan: 84', '5. John: 66', '6. Bern: 53', '7. Fred: 47']

6. Ένας "τέλειος" βαθμός

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

Δημιούργησε τη συνάρτηση perfect_score(student_info) με παράμετρο student_info. Το student_info είναι μια list από λίστες που περιέχουν το όνομα και τον βαθμό κάθε μαθητή: [["Charles", 90], ["Tony", 80]]. Η συνάρτηση πρέπει να επιστρέφει (return) το πρώτο ζεύγος [<name>, <score>] του μαθητή που πήρε 100 στο διαγώνισμα.

Αν δεν βρεθεί κανένας βαθμός 100 στο student_info, πρέπει να επιστραφεί μια κενή λίστα [].

>>> perfect_score(student_info=[["Charles", 90], ["Tony", 80], ["Alex", 100]])
["Alex", 100]

>>> perfect_score(student_info=[["Charles", 90], ["Tony", 80]])
[]
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Python Exercism

Έτοιμος να ξεκινήσεις την άσκηση Βάζοντας βαθμούς;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Python με 17 έννοιες146 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.