Trilhas
/
Python
Python
/
Exercícios
/
Atribuindo notas
Atribuindo notas

Atribuindo notas

Exercício de aprendizagem

Introdução

Python tem duas construções de laço. Laços while para iteração indefinida (não contada) e laços for para iteração definida (contada). As palavras-chave break, continue e else ajudam a personalizar o comportamento do laço. range() e enumerate() ajudam com a contagem e a indexação no laço.

While

Os laços while vão continuar executando enquanto a loop expression ou "teste" for avaliada como True em um boolean context, terminando quando for avaliada como 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

O for loop básico do Python é melhor descrito como um for each, que percorre os valores de qualquer objeto iterável, terminando quando não há mais valores retornados pela chamada de 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.'

Objeto de sequência range()

Quando não há um iterable específico informado, a sequência especial range() é usada como contador do laço. range() exige um int onde a sequência deve stop, e pode opcionalmente receber os parâmetros start e step. Se nenhum número start for informado, a sequência começará em 0. Objetos range() são preguiçosos (os valores são gerados sob demanda), suportam todas as operações comuns de sequência e ocupam uma quantidade fixa de memória, não importa o tamanho da sequência especificada.

# 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.'

Valores e índices com enumerate()

Se você precisar tanto dos valores quanto dos índices, a função embutida enumerate(<iterable>) retorna pares (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.'

Alterando o comportamento do laço

A palavra-chave continue pode ser usada para avançar até a próxima iteração:

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.'

A palavra-chave break (como em muitas linguagens da família C) pode ser usada para parar a iteração e "sair" do loop mais interno que a envolve:

>>>  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.'

Instruções

Você é um assistente de ensino corrigindo provas de estudantes. Acompanhar os resultados manualmente está ficando tedioso e sujeito a erros. Você decide tornar as coisas um pouco mais interessantes montando algumas funções para contar e calcular os resultados da turma.

1. Arredondar as notas

Você pode dar "crédito parcial" nas questões da prova, mas as notas gerais precisam ser ints. Então, antes de fazer qualquer outra coisa com as notas da turma, você precisa percorrer as notas e transformar qualquer nota float em int. Para sua sorte, o Python tem a função embutida round() que você pode usar.

Crie a função round_scores(student_scores) que recebe uma list de student_scores. Essa função deve consumir a list de entrada e return uma nova lista com todas as notas convertidas para ints. A ordem das notas na list resultante não é importante.

>>> 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. Estudantes que não passaram

Enquanto você corrigia a prova, percebeu que alguns estudantes não tiveram um desempenho tão bom quanto você esperava. Mas você se distraiu e esqueceu de anotar exatamente quantos estudantes.

Crie a função count_failed_students(student_scores) que recebe uma list de student_scores. Essa função deve contar o número de estudantes que não têm notas suficientes para passar e retornar essa contagem como um número inteiro. Um estudante precisa de uma nota maior que 40 para atingir a média de aprovação na prova.

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

3. O "melhor"

O professor que você está auxiliando quer encontrar o grupo de estudantes que tiveram "o melhor" desempenho nesta prova. O que qualifica como "o melhor" varia, então você precisa encontrar as notas dos estudantes que são maiores ou iguais ao limite atual.

Crie a função above_threshold(student_scores, threshold) recebendo student_scores (uma list de notas) e threshold (o limite de "nota mais alta") como parâmetros. Essa função deve retornar uma list com todas as notas que são >= a threshold.

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

4. Calculando conceitos por letra

O professor que você está auxiliando gosta de atribuir conceitos por letra além das notas numéricas. Como os estudantes raramente tiram 100 em uma prova, os limites inferiores do "conceito por letra" são calculados com base na maior nota alcançada e aumentam de forma uniforme entre a maior nota e o limite de reprovação de <= 40.

Crie a função letter_grades(highest) que recebe a maior nota ("highest") da prova como argumento e retorna uma list de limites inferiores de nota para cada intervalo de conceito "no estilo americano": ["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. Associar nomes às notas

Você tem uma lista de notas de prova em ordem decrescente, e outra lista de nomes de estudantes também ordenada de forma decrescente pelas notas da prova. Você gostaria de associar cada nome de estudante à sua nota da prova e imprimir um ranking geral da turma.

Crie a função student_ranking(student_scores, student_names) com os parâmetros student_scores e student_names. Associe cada nome de estudante na list student_names à sua nota da list student_scores. Você pode assumir que cada list de argumento estará ordenada da maior nota para a menor nota. A função deve retornar uma list de strings com o formato <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. Uma nota "perfeita"

Embora uma nota "perfeita" de 100 seja rara em uma prova, é interessante saber se pelo menos um estudante conseguiu alcançá-la.

Crie a função perfect_score(student_info) com o parâmetro student_info. student_info é uma list de listas contendo o nome e a nota de cada estudante: [["Charles", 90], ["Tony", 80]]. A função deve return o primeiro par [<name>, <score>] do estudante que tirou 100 na prova.

Se nenhuma nota 100 for encontrada em student_info, deve ser retornada uma lista vazia [].

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

>>> perfect_score(student_info=[["Charles", 90], ["Tony", 80]])
[]
Editar via GitHub O link abre em uma nova janela ou aba
Python Exercism

Tudo pronto para começar Atribuindo notas?

Crie sua conta no Exercism para aprender e dominar Python com 17 conceitos146 exercícios e mentoria humana de verdade, tudo de graça.