Треки
/
Python
Python
/
Вправи
/
Виставити оцінки
Виставити оцінки

Виставити оцінки

Навчальна вправа

Вступ

Python має дві конструкції для циклів. Цикли while слугують для неозначеної (непідрахованої) ітерації, а цикли for призначені для означеної (підрахованої) ітерації. Ключові слова break, continue та else допомагають налаштувати поведінку циклу. range() та enumerate() допомагають із підрахунком й індексацією в циклі.

Цикл while

Цикли while продовжують виконуватися, доки loop expression або «тест» обчислюється як 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 loop у Python краще описувати як for each, який перебирає значення будь-якого обʼєкта, який можна перебрати, і завершується, коли виклик 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 на екзамені.

Якщо в student_info немає оцінок 100, потрібно повернути порожній список [].

>>> 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 вправ та справжнє наставництво від людей, і все це безкоштовно.