Skip to content
This page has been auto-translated and may contain errors.View in English

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

Pip Ei, então eu escrevi esse formatador de nomes e ele simplesmente... não está fazendo nada? 😭 Tipo, roda direitinho, sem erros, mas os nomes continuam todos em minúsculas. Estou chamando .capitalize() em cada um, dá pra ver ali no loop. Não entendo. Pode dar uma olhada, por favor?
python
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:

python
parts = ["ana", "van", "den", "berg"]

for part in parts:
    part = part.capitalize()

print(parts)
# ['ana', 'van', 'den', 'berg']  # nada mudou

Para consertar, você precisa construir uma nova lista com os valores capitalizados. Uma list comprehension faz isso de forma limpa:

python
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 Berg

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

Zee Ok, isso é vergonhoso, mas eu tenho essa função que deveria encontrar a maior pontuação em uma lista e ela simplesmente... imprime 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 😅
python
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:

python
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: 92

Isso 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

Orla Ok, então estou construindo esse pequeno rastreador de orçamento e ele trava toda vez que eu digito um número. Tipo, nem chega a fazer nada com ele, simplesmente explode imediatamente com um TypeError. Conferi a lógica e parece ok pra mim? O limite é um float, a entrada é um número... do que ele está reclamando... ajuda por favor
python
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:

python
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

Dex Estou gerando etiquetas de carga para o manifesto e ele fica travando nessa linha. O nome do item é uma string, o peso é um número, parece ok pra mim? Mas o Python está fazendo o maior drama com a concatenação 😩
python
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 str

O 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():

python
def cargo_label(item, weight):
    label = "Item: " + item + " | Weight: " + str(weight) + "kg"
    return label

print(cargo_label("Moon rocks", 42))
# Item: Moon rocks | Weight: 42kg

Uma f-string costuma ser mais limpa para esse tipo de coisa, já que ela cuida da conversão para você:

python
def cargo_label(item, weight):
    return f"Item: {item} | Weight: {weight}kg"

print(cargo_label("Moon rocks", 42))
# Item: Moon rocks | Weight: 42kg

Dentro 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

Cass Está acontecendo uma coisa muito estranha. Tenho essa função que monta uma lista de passageiros para cada voo, e o primeiro voo parece ok. Mas no terceiro o manifesto tem todo mundo dos voos anteriores também? Eu não estou compartilhando nenhum dado entre as chamadas, cada uma é completamente separada. Sinceramente não tenho ideia do que está acontecendo 😰
python
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:

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