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 .
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 ), e o valor de retorno quando não houver negativos é
.
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
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
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
. 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
, o segundo tem índice , etc. Então, no exemplo, o elemento é o terceiro elemento, logo tem índice . - Percorrer uma lista: vamos usar uma estrutura que nos dá simultaneamente o índice e o valor — em Python isso é feito com
enumerate(lista).enumerategera pares(índice, valor)começando do índicepor padrão. - Condição de negatividade: um número
é negativo se satisfaz . - 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,
, onde é o número de elementos. Ocupa espaço adicional constante, .
Passo 4
Esboço do algoritmo em pseudocódigo (passo a passo lógico):
- Para cada par
(i, x)obtido deenumerate(lista):
a) Sex < 0então retornei. - 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âmetrolista(que é a lista que vamos inspecionar).for i, x in enumerate(lista):aquienumerate(lista)produz pares(i, x)ondeié o índice (começando em) e xé o valor naquele índice. Percorremos esses pares um a um.if x < 0:verifica a condição de negatividade (ou seja, sexsatisfaz). return iimediatamente devolve o índice do primeiroxnegativo 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; devolveconforme 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. - Primeiro elemento negativo:
[-5, 1, 2]devolve. - Nenhum negativo:
[0, 1, 2]devolve. - Exemplo do enunciado:
[5, 10, -3, 8]devolve.
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
enumeratepara ter índice + valor. - Lembre que o índice começa em
e que o retorno padrão quando não achar é . - Pratique escrevendo a versão com
fore, se quiser, a versão comnext(...).
Resposta
def primeiro_negativo(lista):
for i, x in enumerate(lista):
if x < 0:
return i
return -1