Casa dos Bugs
Parabéns. Você é o Chefe de Tecnologia da Crooked Orbit, uma pequena e levemente caótica empresa de logística espacial gerenciada por uma tripulação de astronautas questionáveis com código ainda mais questionável.
O salário é decente. A base de código não é...
Seu trabalho é resolver os problemas: bugs, funções quebradas, coisas que tecnicamente rodam mas realmente não deveriam.
#1: Formatador de nomes
.capitalize() em cada um, dá pra ver ali no loop. Não entendo. Pode dar uma olhada, por favor? def format_name(full_name):
parts = full_name.split()
for part in parts:
part = part.capitalize()
return " ".join(parts)
print(format_name("ana van den berg"))Esperado: Ana Van Den Berg
Obtido: ana van den berg
O que está dando errado e como você conserta?
Dica
Pense no que realmente acontece quando você reatribui uma variável dentro de um loop for. Mudar part afeta a lista de onde ela veio?
Uma forma de consertar
Quando você escreve for part in parts, o Python te dá cada item da lista um de cada vez. part é apenas uma variável temporária que guarda o item atual. Não é uma conexão direta com a própria lista.
Então quando você escreve part = part.capitalize(), você está substituindo para onde part aponta. Mas parts ainda contém as strings originais. Você nunca alterou a lista de verdade.
Aqui está uma forma de visualizar isso claramente:
parts = ["ana", "van", "den", "berg"]
for part in parts:
part = part.capitalize()
print(parts)
# ['ana', 'van', 'den', 'berg'] # nada mudouPara consertar, você precisa construir uma nova lista com os valores capitalizados. Uma list comprehension faz isso de forma limpa:
def format_name(full_name):
parts = full_name.split()
return " ".join(part.capitalize() for part in parts)
print(format_name("ana van den berg"))
# Ana Van Den Bergpart.capitalize() for part in parts passa por cada nome, capitaliza, e junta os resultados em uma nova lista. Então .join() os une novamente com espaços.
#2: Maior pontuação
None? Toda vez. Já passei pelo loop tipo cinco vezes, a lógica parece ok pra mim. As pontuações estão definitivamente lá. Não sei o que está acontecendo 😅 def highest_score(scores):
best = 0
for score in scores:
if score > best:
best = score
results = [45, 92, 78, 88, 65]
print(f"Top score: {highest_score(results)}")Esperado: Top score: 92
Obtido: Top score: None
O que está dando errado e como você conserta?
Dica
O que uma função retorna se você nunca escreve uma instrução return?
Uma forma de consertar
O loop está ok. A lógica está ok. O problema é que highest_score nunca devolve nada. Ela encontra a melhor pontuação e depois não faz nada com ela.
No Python, se uma função não tem uma instrução return, ela retorna None automaticamente. É isso que você está imprimindo.
A correção é uma linha no final:
def highest_score(scores):
best = 0
for score in scores:
if score > best:
best = score
return best
results = [45, 92, 78, 88, 65]
print(f"Top score: {highest_score(results)}")
# Top score: 92Isso aparece muito. A função parece completa porque toda a lógica está lá, mas sem return, o resultado simplesmente desaparece quando a função termina.
#3: Verificação de orçamento
def check_budget(threshold):
spent = input("How much have you spent? ")
if spent >= threshold:
print("Over budget!")
else:
print("You're within budget.")
check_budget(500.0)Erro:
TypeError: '>=' not supported between instances of 'str' and 'float'O que está dando errado e como você conserta?
Dica
Que tipo o input() sempre retorna, independente do que o usuário digita?
Uma forma de consertar
input() sempre retorna uma string. Não importa que o usuário tenha digitado um número. O Python não sabe disso. Ele apenas devolve o que foi digitado como texto.
Então quando o código tenta comparar spent >= threshold, está comparando uma string com um float, e o Python se recusa a fazer isso. Esse é o TypeError.
A correção é converter a entrada para um número antes de compará-la. Use float() para lidar com valores decimais:
def check_budget(threshold):
spent = float(input("How much have you spent? "))
if spent >= threshold:
print("Over budget!")
else:
print("You're within budget.")
check_budget(500.0)
# How much have you spent? 620
# Over budget!Envolver input() com float() converte a string em um número imediatamente, então a comparação funciona como esperado.
Essa é uma das fontes mais comuns de confusão no Python: input() parece estar lendo um número, mas sempre te dá uma string. Você precisa convertê-la você mesmo.
#4: Etiqueta de carga
def cargo_label(item, weight):
label = "Item: " + item + " | Weight: " + weight + "kg"
return label
print(cargo_label("Moon rocks", 42))Erro:
TypeError: can only concatenate str (not "int") to strO que está dando errado e como você conserta?
Dica
O operador + do Python não converte números em strings automaticamente. O que você precisa fazer antes de poder juntá-los?
Uma forma de consertar
Quando você usa + para juntar strings no Python, todo valor precisa ser uma string. weight é um inteiro, então o Python não sabe como anexá-lo ao texto ao redor. Ele se recusa em vez de adivinhar.
A correção é converter weight para string com str():
def cargo_label(item, weight):
label = "Item: " + item + " | Weight: " + str(weight) + "kg"
return label
print(cargo_label("Moon rocks", 42))
# Item: Moon rocks | Weight: 42kgUma f-string costuma ser mais limpa para esse tipo de coisa, já que ela cuida da conversão para você:
def cargo_label(item, weight):
return f"Item: {item} | Weight: {weight}kg"
print(cargo_label("Moon rocks", 42))
# Item: Moon rocks | Weight: 42kgDentro de {}, o Python converte automaticamente o valor para sua representação em string, então você não precisa de str().
#5: Manifesto de passageiros
def build_manifest(name, passengers=[]):
passengers.append(name)
return passengers
flight_1 = build_manifest("Pip")
flight_2 = build_manifest("Zee")
flight_3 = build_manifest("Orla")
print(flight_1)
print(flight_2)
print(flight_3)Esperado:
['Pip']
['Zee']
['Orla']Obtido:
['Pip']
['Pip', 'Zee']
['Pip', 'Zee', 'Orla']O que está dando errado e como você conserta?
Dica
Valores de argumentos padrão no Python são avaliados uma vez, quando a função é definida. Não a cada vez que a função é chamada. O que isso significa para um objeto mutável como uma lista?
Uma forma de consertar
Essa é uma das surpresas mais conhecidas do Python. Quando você escreve passengers=[] como argumento padrão, o Python cria essa lista uma vez quando a função é definida. Toda chamada que usa o padrão está compartilhando exatamente o mesmo objeto de lista. Então adicionar a ela em uma chamada afeta todas as chamadas futuras.
A correção padrão é usar None como padrão e criar uma lista nova dentro da função:
def build_manifest(name, passengers=None):
if passengers is None:
passengers = []
passengers.append(name)
return passengers
flight_1 = build_manifest("Pip")
flight_2 = build_manifest("Zee")
flight_3 = build_manifest("Orla")
print(flight_1) # ['Pip']
print(flight_2) # ['Zee']
print(flight_3) # ['Orla']Agora cada chamada que não passa uma lista recebe uma novinha em folha.
Isso se aplica a qualquer padrão mutável: listas, dicionários, conjuntos. Se você quer um novo a cada vez, não coloque na assinatura. Use None e crie dentro.

