Questão 18: Crie uma função primeiro_negativo(lista) que retorne o índice do primeiro número negativo na lista. Se não houver nenhum, retorne -1 .
Exemplo: primeiro_negativo([5, 10, -3, 8]) deve retornar 2 .

Passo 1

O enunciado pede: criar uma função chamada primeiro_negativo(lista) que retorne o índice do primeiro número negativo na lista. Se não houver nenhum número negativo, a função deve retornar -1. Exemplo dado: primeiro_negativo([5, 10, -3, 8]) deve retornar \,2.
Informações relevantes fornecidas: a entrada é uma lista (pode conter inteiros ou floats), o índice pedido deve seguir a convenção usual de índices em Python (começando em \,0), e o valor de retorno quando não houver negativos é \,-1.

Passo 2

Entendimento claro do que queremos fazer (sem ainda programar): precisamos “olhar” os elementos da lista, um por um, na ordem em que aparecem, e assim que encontrarmos um elemento menor que zero (ou seja, negativo), devolvemos o índice desse elemento. Se atravessarmos toda a lista sem achar nenhum elemento negativo, devolvemos \,-1. Isso descreve um procedimento linear que verifica cada elemento uma vez.

Passo 3

Explicando conceitos importantes que usaremos:
  • Índice: em Python, o primeiro elemento tem índice \,0, o segundo tem índice \,1, etc. Então, no exemplo, o elemento -3 é o terceiro elemento, logo tem índice \,2.
  • Percorrer uma lista: vamos usar uma estrutura que nos dá simultaneamente o índice e o valor — em Python isso é feito com enumerate(lista). enumerate gera pares (índice, valor) começando do índice \,0 por padrão.
  • Condição de negatividade: um número x é negativo se satisfaz x < 0.
  • Complexidade: o algoritmo que percorre a lista até encontrar o primeiro negativo tem custo de tempo proporcional ao tamanho da lista no pior caso, ou seja, \,O(n), onde n é o número de elementos. Ocupa espaço adicional constante, \,O(1).

Passo 4

Esboço do algoritmo em pseudocódigo (passo a passo lógico):
  1. Para cada par (i, x) obtido de enumerate(lista):
    a) Se x < 0 então retorne i.
  2. Se terminar o laço sem retornar, retorne -1.
    Isto traduz diretamente a ideia: percorrer e parar no primeiro negativo.

Passo 5

Agora vamos escrever a implementação em Python e explicar cada linha. Código:
def primeiro_negativo(lista):
    for i, x in enumerate(lista):
        if x < 0:
            return i
    return -1
Explicação linha a linha:
  • def primeiro_negativo(lista): declara a função com parâmetro lista (que é a lista que vamos inspecionar).
  • for i, x in enumerate(lista): aqui enumerate(lista) produz pares (i, x) onde i é o índice (começando em \,0) e x é o valor naquele índice. Percorremos esses pares um a um.
  • if x < 0: verifica a condição de negatividade (ou seja, se x satisfaz x < 0).
  • return i imediatamente devolve o índice do primeiro x negativo encontrado. A função termina aqui quando encontra o primeiro negativo.
  • return -1 é executado apenas se o laço terminar sem encontrar nenhum número negativo; devolve \,-1 conforme pedido.

Passo 6

Tratamento de casos especiais e exemplos de teste (com o que esperar):
  • Lista vazia []: o laço não executa nenhuma iteração, a função retorna -1.
  • Primeiro elemento negativo: [-5, 1, 2] devolve \,0.
  • Nenhum negativo: [0, 1, 2] devolve -1.
  • Exemplo do enunciado: [5, 10, -3, 8] devolve \,2.

Passo 7

Uma alternativa compacta (estilo “Pythonic”) usando next e um gerador, com mesma lógica e mesmo custo:
def primeiro_negativo(lista):
    return next((i for i, x in enumerate(lista) if x < 0), -1)
Explicação: (i for i, x in enumerate(lista) if x < 0) gera índices i só quando x é negativo; next(..., -1) pega o primeiro índice gerado ou retorna -1 se o gerador não produzir nada. Semântica e complexidade idênticas ao laço explícito.

Passo 8

Resumo prático para a prova (o que decorar e o que praticar):
  • Decore a ideia: "percorrer com índice e retornar o índice ao achar x < 0".
  • Em Python, use enumerate para ter índice + valor.
  • Lembre que o índice começa em \,0 e que o retorno padrão quando não achar é -1.
  • Pratique escrevendo a versão com for e, se quiser, a versão com next(...).

Resposta

def primeiro_negativo(lista):
    for i, x in enumerate(lista):
        if x < 0:
            return i
    return -1

Exercícios relacionados