Capítulo 4: Controle de Fluxo e Números Aleatórios#
Estruturas de Decisão Aninhadas#
🎙️ Ouça a explicação sobre condicionais (if-elif-else):
As estruturas condicionais permitem que o programador controle o fluxo do programa, executando diferentes blocos de código de acordo com condições específicas. Vamos revisar as estruturas mais utilizadas:
if
: Avalia uma condição e executa um bloco de código se a condição for verdadeira.elif
: Avalia uma condição e executa um bloco de código se a condição for verdadeira, mas somente se a condição anterior for falsa.else
: Executa um bloco de código se todas as condições anteriores forem falsas.
Cadeias de Comparação:
Python permite cadeias de comparação, que são uma maneira concisa de expressar múltiplas comparações. Por exemplo, if a < b < c:
é equivalente a if a < b and b < c:
.
Aninhamento de Estruturas Condicionais:
O poder real das estruturas condicionais reside na capacidade de aninhá-las, criando lógica complexa para lidar com diferentes cenários.
Exemplo: Verificação de Maioridade e Sexo
idade = 25
sexo = "Feminino"
if idade >= 18:
print("Você é maior de idade.")
if sexo == "Feminino":
print("E também do sexo feminino.")
else:
print("Você é menor de idade.")
Saída do Código:
Você é maior de idade.
E também do sexo feminino.
Neste exemplo, verificamos a idade e o sexo da pessoa. Se a pessoa for maior de idade, verificamos o sexo e imprimimos uma mensagem adicional se for feminino.
Exemplo: Classificação de Notas com Cadeias de Comparação
nota = 75
if 90 <= nota < 100:
print("Parabéns! Você obteve uma nota A.")
elif 80 <= nota < 90:
print("Ótimo! Sua nota é B.")
elif 70 <= nota < 80:
print("Bom trabalho! Sua nota é C.")
else:
print("Infelizmente, você não atingiu a nota mínima. Sua nota é D.")
Saída do Código:
Bom trabalho! Sua nota é C.
Neste exemplo, a nota do aluno é comparada em intervalos usando cadeias de comparação. O código verifica a qual faixa de notas a nota pertence e imprime uma mensagem correspondente. Como a nota é 75, a condição 70 <= nota < 80
é satisfeita, e o programa imprime que o aluno obteve uma nota C.
Estrutura de Repetição for
#
O loop for
é amplamente utilizado em Python para realizar iterações sobre coleções de dados como listas, tuplas, dicionários e até strings.
Mas antes de explorarmos a estrutura do for
, é importante entender dois conceitos fundamentais: a função range()
e o operador in
.
A Função range()
#
A função range()
é utilizada para gerar sequências numéricas. Ela pode ser configurada para definir o início, o fim e o intervalo entre os números da sequência, utilizando a seguinte sintaxe:
range(início, fim, passo)
, onde:início
: O primeiro número da sequência (inclusivo). O valor padrão é 0.fim
: O último número da sequência (exclusivo).passo
: A diferença entre os números consecutivos. O valor padrão é 1.
Por exemplo:
# Gera uma lista com os números de 0 a 4
lista_numeros = list(range(5))
print(lista_numeros)
Saída do Código:
[0, 1, 2, 3, 4]
Neste exemplo, a função range(5)
gera uma sequência de números de 0 a 4, e usamos list()
para transformar essa sequência em uma lista visível.
Outro exemplo com incremento de 2:
# Gera uma lista com números pares de 0 a 10
pares = list(range(0, 11, 2))
print(pares)
Saída do Código:
[0, 2, 4, 6, 8, 10]
Aqui, range(0, 11, 2)
gera uma sequência de números pares de 0 a 10 com incrementos de 2.
O Operador in
#
O operador in
é usado para verificar se um valor está presente em uma sequência, e no contexto do loop for
, ele indica que o loop deve iterar sobre cada elemento dessa sequência.
Por exemplo:
if 3 in [1, 2, 3, 4, 5]:
print("3 está presente na lista")
Saída do Código:
3 está presente na lista
Aqui, o operador in
verifica se o número 3 está dentro da lista. Ele retorna True
se o valor estiver presente e False
caso contrário.
O Loop for
#
Agora que entendemos range()
e o operador in
, podemos introduzir o loop for
. Ele permite iterar sobre cada elemento de uma sequência (lista, string, tupla, etc.) e executar um bloco de código para cada elemento:
for variavel in sequencia:
# Bloco de código a ser repetido
A variável assume, em cada iteração, o valor de um elemento da sequência, e o bloco de código é executado para cada um desses valores.
Exemplo Prático: Iterando Sobre uma Sequência Numérica#
Com base no que aprendemos sobre range()
, podemos agora utilizar um loop for
para iterar sobre a sequência de números:
for i in range(5):
print(i)
Saída do Código:
0
1
2
3
4
Aqui, o loop for
itera sobre a sequência gerada por range(5)
, imprimindo os números de 0 a 4.
Iterando Sobre uma String#
Podemos usar o loop for
para iterar sobre os caracteres de uma string:
palavra = "Python"
for letra in palavra:
print(letra)
Saída do Código:
P
y
t
h
o
n
Nesse caso, o loop for
percorre cada letra da string "Python"
e as imprime individualmente.
Iterando Sobre uma Lista de Números#
Podemos também usar o loop for
para percorrer uma lista de números e realizar cálculos:
numeros = [10, 20, 30, 40, 50]
for num in numeros:
print(f"O dobro de {num} é {2 * num}.")
Saída do Código:
O dobro de 10 é 20.
O dobro de 20 é 40.
O dobro de 30 é 60.
O dobro de 40 é 80.
O dobro de 50 é 100.
Nesse exemplo, iteramos sobre cada número na lista numeros
e imprimimos o seu dobro.
Executando um Número Específico de Vezes#
Se quisermos executar um bloco de código um número fixo de vezes, podemos usar o for
com range()
:
for _ in range(3):
print("Olá, mundo!")
Saída do Código:
Olá, mundo!
Olá, mundo!
Olá, mundo!
O uso de _
como variável (também chamado de placeholder) indica que não estamos interessados no valor da variável durante a iteração, apenas no número de vezes que o loop será executado.
Iterando Sobre um Dicionário#
Podemos usar o loop for
para percorrer as chaves e valores de um dicionário:
aluno_notas = {"João": 8.5, "Maria": 9.0, "Pedro": 7.8}
for nome, nota in aluno_notas.items():
print(f"{nome} obteve nota {nota}.")
Saída do Código:
João obteve nota 8.5.
Maria obteve nota 9.0.
Pedro obteve nota 7.8.
Aqui, o método .items()
permite iterar tanto pelas chaves quanto pelos valores do dicionário, imprimindo o nome do aluno e sua respectiva nota.
Entendendo o for
Aninhado#
Em alguns casos, pode ser necessário usar loops aninhados, ou seja, um loop for
dentro de outro. Um exemplo prático seria iterar sobre uma matriz (ou tabela) de números:
matriz = [
[1, 2, 3], # Primeira linha
[4, 5, 6], # Segunda linha
[7, 8, 9] # Terceira linha
]
for linha in matriz:
for numero in linha:
print(numero, end=' ') # Mantém os números da mesma linha juntos
print() # Pula para a próxima linha
Saída do Código:
1 2 3
4 5 6
7 8 9
Aqui, usamos um loop externo para percorrer cada linha da matriz, e um loop interno para percorrer cada número dentro da linha. A combinação de loops permite navegar em estruturas mais complexas como essa.
Outro Exemplo de for
Aninhado#
Vamos usar um for
aninhado para gerar todas as combinações possíveis entre dois grupos de elementos. Imagine que você tem duas listas, uma de cores e outra de tamanhos, e quer combinar cada cor com cada tamanho.
cores = ["vermelho", "azul", "verde"]
tamanhos = ["P", "M", "G"]
for cor in cores:
for tamanho in tamanhos:
print(f"{cor} - {tamanho}")
Saída do Código:
vermelho - P
vermelho - M
vermelho - G
azul - P
azul - M
azul - G
verde - P
verde - M
verde - G
Nesse exemplo, o loop externo itera sobre cada cor e o loop interno itera sobre cada tamanho, gerando todas as combinações possíveis de cor e tamanho. Este é um exemplo clássico de como o for
aninhado pode ser útil para resolver problemas envolvendo múltiplos conjuntos de dados.
Estrutura de Repetição while
#
O loop while
é Utilizado para repetir um bloco de código enquanto uma condição especificada for verdadeira, proporcionando controle preciso sobre o fluxo de execução.
A estrutura do loop while
é composta por duas partes. Sua sintaxe básica é:
while condicao:
# Bloco de código a ser repetido
Condição: Uma expressão booleana que determina se o loop deve continuar ou parar.
Bloco de Código: As instruções que serão executadas enquanto a condição for verdadeira.
Exemplo de um contador simples para contar até 5 usando o loop while
:
contador = 1
while contador <= 5:
print(contador)
contador += 1
Saída do Código:
1
2
3
4
5
Explicando o código:
contador
é inicializado com 1.A condição
contador <= 5
é avaliada. Se forTrue
, o bloco de código é executado.print(contador)
imprime o valor atual decontador
.contador += 1
incrementacontador
em 1.O loop repete enquanto a condição for
True
, até quecontador
seja maior que 5.
Imprimindo os Números Pares de 1 a 10:
numero = 1
while numero <= 10:
if numero % 2 == 0:
print(numero)
numero += 1
Saída do Código:
2
4
6
8
10
O loop itera de 1 a 10.
A condição
numero % 2 == 0
verifica senumero
é par.Se for par,
print(numero)
imprime o número.numero += 1
incrementanumero
em 1.
Usando o while not#
Durante o while not
, o loop continua enquanto a condição, por exemplo, da variável flag
for False
.
flag = False
while not flag:
resposta = input("Você deseja sair? (sim/não): ")
if resposta.lower() == 'sim':
flag = True
print("Você saiu do loop.")
Explicando o código:
flag
é inicializada comoFalse
.O loop
while not
continua enquantoflag
forFalse
.O usuário é solicitado a responder se deseja sair.
Se o usuário digitar “sim”,
flag
se tornaTrue
.Quando
flag
éTrue
, o loop termina e imprime “Você saiu do loop.”
While dentro de outro while: Exemplo de aninhamento de loops while
.
x = 0
while x < 3:
y = 0
while y < 2:
print(f"Valor de x: {x}, Valor de y: {y}")
y += 1
x += 1
Saída do Código:
Valor de x: 0, Valor de y: 0
Valor de x: 0, Valor de y: 1
Valor de x: 1, Valor de y: 0
Valor de x: 1, Valor de y: 1
Valor de x: 2, Valor de y: 0
Valor de x: 2, Valor de y: 1
Aqui, x
varia de 0 a 2 e y
de 0 a 1. Para tornar o exemplo mais interessante, podemos adicionar uma condição para destacar quando x
e y
são iguais:
x = 0
while x < 3:
y = 0
while y < 2:
if x == y:
print(f"X e Y são iguais e valem: {x}!")
else:
print(f"Valor de x: {x}, Valor de y: {y}")
y += 1
x += 1
Saída do Código:
X e Y são iguais e valem: 0!
Valor de x: 0, Valor de y: 1
Valor de x: 1, Valor de y: 0
X e Y são iguais e valem: 1!
Valor de x: 2, Valor de y: 0
Valor de x: 2, Valor de y: 1
For dentro de um while#
Também é possível aninhar estruturas diferentes, como um loop for
dentro de um loop while
.
x = 0
while x < 3:
for i in range(3):
print(f"Valor de x: {x}, Valor de i: {i}")
x += 1
Saída do Código:
Valor de x: 0, Valor de i: 0
Valor de x: 0, Valor de i: 1
Valor de x: 0, Valor de i: 2
Valor de x: 1, Valor de i: 0
Valor de x: 1, Valor de i: 1
Valor de x: 1, Valor de i: 2
Valor de x: 2, Valor de i: 0
Valor de x: 2, Valor de i: 1
Valor de x: 2, Valor de i: 2
No último exemplo, x
é incrementado após cada ciclo do loop for
, até que atinja o valor 3 e o loop while
seja interrompido.
Compreensões de Listas (List Comprehensions)#
Uma das características mais poderosas do Python é a capacidade de simplificar operações complexas em poucas linhas de código, e as compreensões de listas são um exemplo perfeito disso.
As compreensões de listas fornecem uma maneira concisa de criar listas. Aplicações comuns incluem gerar novas listas em que cada elemento é o resultado de alguma operação aplicada a cada membro de outra sequência ou iterável, ou criar uma subsequência de elementos que atendem a uma determinada condição.
Sintaxe Básica#
A sintaxe básica de uma compreensão de lista é:
[expressão for item in iterável if condição]
expressão: A operação que será realizada em cada item, como uma operação matemática ou chamada de função.
item: Representa cada elemento da sequência ou coleção que está sendo percorrida.
iterável: Uma sequência (lista, tupla, etc.) ou coleção (conjunto, dicionário, etc.) sobre a qual você deseja iterar.
condição (opcional): Um filtro que inclui apenas os elementos onde a condição for verdadeira.
Exemplo: Elevando Números ao Quadrado#
Suponha que você queira elevar ao quadrado cada número em uma lista. Veja como isso pode ser feito usando uma compreensão de lista:
numeros = [1, 2, 3, 4, 5]
quadrados = [x ** 2 for x in numeros]
print(quadrados)
Saída do Código:
[1, 4, 9, 16, 25]
Exemplo: Filtrando e Elevando ao Quadrado Apenas Números Pares#
Agora, suponha que você queira elevar ao quadrado apenas os números pares de uma lista. Para isso, você pode adicionar uma condição if
na compreensão de lista. Veja o exemplo:
numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
quadrados_pares = [x ** 2 for x in numeros if x % 2 == 0]
print(quadrados_pares)
Saída do Código:
[4, 16, 36, 64, 100]
Nesse exemplo, a lista resultante contém apenas os quadrados dos números pares, pois o if x % 2 == 0
filtra os elementos da lista original, garantindo que apenas os pares sejam elevados ao quadrado.
Compreensão de Lista vs. Estrutura Convencional#
Para ver o quanto as compreensões de listas podem simplificar o código, compare a filtragem de números pares e a elevação ao quadrado com e sem o uso de compreensão de listas.
Sem Compreensão de Lista (Modo Convencional)
numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
quadrados_pares = []
for x in numeros:
if x % 2 == 0:
quadrados_pares.append(x ** 2)
print(quadrados_pares)
Nesse caso, o código exige várias linhas para definir a lista resultante, iterar sobre a lista original, aplicar a condição e adicionar os resultados.
Com Compreensão de Lista
numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
quadrados_pares = [x ** 2 for x in numeros if x % 2 == 0]
print(quadrados_pares)
Aqui, a compreensão de lista condensa a lógica em uma única linha, mantendo o código mais direto e legível.
Ao usar compreensões de listas, você pode reduzir significativamente o número de linhas de código, facilitando a leitura e a manutenção. Isso torna o código mais “Pythonic” e é especialmente útil para operações que envolvem filtragem e mapeamento de dados, como no exemplo acima, onde o código foi reduzido de cinco linhas para apenas uma.
Controle de Fluxo com exit()
e break
#
Python oferece várias formas de controlar o fluxo de execução em seu código. Duas dessas possibilidades são exit()
e break
, utilizadas para interromper a execução do programa ou de loops.
A função exit()
é usada para encerrar a execução do programa completamente. Se chamada dentro de um loop, exit()
interrompe o loop e encerra o programa, e nenhum código subsequente é executado.
Exemplo de uso do exit()
em um loop for
#
frutas = ["maçã", "uva", "morango", "banana", "abacaxi"]
for fruta in frutas:
if fruta == "banana":
print("Encontrei uma banana! Saindo do programa.")
exit()
print(f"Estou processando a fruta {fruta}.")
print("Estou fora do Loop.") # Esta linha não será executada.
Saída do Código:
Estou processando a fruta maçã.
Estou processando a fruta uva.
Estou processando a fruta morango.
Encontrei uma banana! Saindo do programa.
Quando “banana” é encontrada, exit()
é chamado e o programa é encerrado imediatamente, sem executar o restante do código, incluindo a linha após o loop for
.
Exemplo de uso do exit()
em um loop while
#
contador = 1
while True:
print(f"Contagem: {contador}")
if contador == 10:
print("Contagem chegou a 10. Saindo do programa.")
exit()
contador += 1
Neste exemplo, o loop while
repete indefinidamente até que contador
chegue a 10. Nesse ponto, exit()
é chamado, encerrando o programa.
break
para Sair do Loop Atual#
A função break
, por outro lado, é usada para interromper apenas o loop atual, permitindo que o restante do código seja executado após o loop.
Exemplo de uso do break
em um loop for
#
frutas = ["maçã", "uva", "morango", "banana", "abacaxi"]
for fruta in frutas:
if fruta == "banana":
print("Encontrei uma banana! Saindo do loop.")
break
print(f"Estou processando a fruta {fruta}.")
print("Estou fora do Loop.")
Saída do Código:
Estou processando a fruta maçã.
Estou processando a fruta uva.
Estou processando a fruta morango.
Encontrei uma banana! Saindo do loop.
Estou fora do Loop.
Neste caso, o break
interrompe apenas o loop for
, e o programa continua executando o código subsequente, incluindo a linha print("Estou fora do Loop.")
.
Exemplo de uso do break
em um loop while
#
while True:
opcao = input("Digite uma opção (a/b/c/sair): ")
if opcao == "sair":
print("Saindo do programa.")
break
elif opcao == "a":
print("Executando ação relacionada à opção 'a'")
elif opcao == "b":
print("Executando ação relacionada à opção 'b'")
else:
print("Opção inválida. Tente novamente.")
Neste exemplo, o loop while
repete indefinidamente até que a opção “sair” seja escolhida, momento em que break
é chamado para encerrar o loop, permitindo a continuidade do programa.
Resumo das Diferenças#
exit()
: Interrompe todo o programa, parando a execução imediatamente, mesmo que chamado dentro de um loop.break
: Encerra apenas o loop atual, permitindo que o código fora do loop continue a ser executado.
Esses exemplos mostram como exit()
e break
podem ser aplicados para controlar o fluxo de execução de maneira efetiva e precisa, de acordo com a necessidade.
Números Aleatórios#
O módulo random
em Python facilita a geração de números aleatórios, fornecendo uma interface simples e direta. Este módulo implementa geradores de números pseudoaleatórios, que produzem sequências de números que aproximam a aleatoriedade verdadeira para uma variedade de distribuições estatísticas.
Para comparação, números verdadeiramente aleatórios podem ser gerados a partir de fenômenos físicos, como os disponíveis no site random.org, que utiliza ruído atmosférico para isso.
Módulos em Python#
Módulos em Python são arquivos contendo definições e instruções Python que podem ser reutilizados em outros programas. Para utilizá-los, você precisa importá-los no seu código. Isso é feito usando a instrução import
, seguida pelo nome do módulo.
Por exemplo, para importar o módulo random
, que é responsável pela geração de números aleatórios, você pode usar:
import random
Depois de importar o módulo, você pode acessar suas funções e classes usando a notação de ponto, como random.random()
, random.randint()
e random.sample()
.
Métodos Comuns do Módulo random
#
Método |
Descrição |
Exemplo |
---|---|---|
|
Retorna um número flutuante aleatório entre 0 e 1 |
|
|
Retorna um número inteiro aleatório entre |
|
|
Retorna um elemento aleatório de uma sequência |
|
|
Retorna uma amostra de |
|
|
Embaralha a sequência original |
|
Exemplos de Uso#
Aqui estão alguns exemplos de como você pode gerar números aleatórios utilizando o módulo random
:
import random
# Gerar um número flutuante aleatório entre 0 e 1
random_float = random.random()
print(f"Número flutuante aleatório entre 0 e 1: {random_float}")
# Gerar um número inteiro aleatório entre 1 e 10
random_integer = random.randint(1, 10)
print(f"Número inteiro aleatório entre 1 e 10: {random_integer}")
# Escolher aleatoriamente de uma lista
lista = ['maçã', 'banana', 'cereja']
escolha_aleatoria = random.choice(lista)
print(f"Escolha aleatória de uma lista: {escolha_aleatoria}")
# Amostra aleatória de elementos de uma lista
amostra_aleatoria = random.sample(lista, 2)
print(f"Amostra aleatória de 2 elementos da lista: {amostra_aleatoria}")
Saída do Código (exemplo):
Número flutuante aleatório entre 0 e 1: 0.08329587492346713
Número inteiro aleatório entre 1 e 10: 8
Escolha aleatória de uma lista: maçã
Amostra aleatória de 2 elementos da lista: ['banana', 'cereja']
Definindo uma Semente#
Definir uma semente antes de gerar números aleatórios pode ser útil quando você precisa reproduzir resultados específicos em diferentes execuções do seu programa. Ao definir uma semente, a sequência de números gerada será sempre a mesma, garantindo a reprodução dos resultados.
Aqui está um exemplo com a geração de números aleatórios após a inicialização de uma semente fixa:
import random
# Define uma semente para reproduzibilidade
random.seed(123)
# Agora, a sequência de números aleatórios será sempre a mesma
for i in range(3):
print(f"Número aleatório {i+1}: {random.randint(1, 100)}")
Saída do Código (exemplo):
Número aleatório 1: 7
Número aleatório 2: 34
Número aleatório 3: 27
Inicialização da Semente com o Tempo Atual#
Para garantir que a sequência de números aleatórios seja diferente a cada execução, você pode inicializar a semente usando o tempo atual, utilizando o módulo time
:
import random
import time
# Define a semente com o tempo atual
random.seed(time.time())
# Exemplo de geração de números aleatórios
for i in range(3):
print(f"Número aleatório {i+1}: {random.randint(1, 100)}")
A função time.time()
retorna o tempo atual em segundos (com frações) desde 1º de janeiro de 1970. Como esse valor muda constantemente, ele permite gerar sementes diferentes a cada execução, garantindo variedade na sequência de números aleatórios.
Saída do Código (exemplo):
Número aleatório 1: 43
Número aleatório 2: 77
Número aleatório 3: 23
Exemplo de Jogo com Dados#
Vamos criar um exemplo simples de um jogo onde dois jogadores jogam um dado, e o primeiro a obter um 6 ganha o jogo.
import random
# Simulação do jogo
jogador1_vitorias = 0
jogador2_vitorias = 0
for i in range(1, 11): # Simular 10 rodadas
jogador1_resultado = random.randint(1, 6)
jogador2_resultado = random.randint(1, 6)
print(f"Rodada {i}: Jogador 1 tirou {jogador1_resultado}, Jogador 2 tirou {jogador2_resultado}")
if jogador1_resultado == 6 and jogador2_resultado == 6:
print("Empate nesta rodada!")
elif jogador1_resultado == 6:
jogador1_vitorias += 1
print("Jogador 1 ganhou esta rodada!")
elif jogador2_resultado == 6:
jogador2_vitorias += 1
print("Jogador 2 ganhou esta rodada!")
else:
print("Nenhum jogador ganhou esta rodada.")
print()
if jogador1_vitorias > jogador2_vitorias:
print("Jogador 1 Venceu!")
print(f"Jogador 1 venceu {jogador1_vitorias} rodadas.")
print(f"Jogador 2 venceu {jogador2_vitorias} rodadas.")
elif jogador2_vitorias > jogador1_vitorias:
print("Jogador 2 venceu!")
print(f"Jogador 1 venceu {jogador1_vitorias} rodadas.")
print(f"Jogador 2 venceu {jogador2_vitorias} rodadas.")
else:
print("Empate no total de rodadas!")
print(f"Jogador 1 venceu {jogador1_vitorias} rodadas.")
print(f"Jogador 2 venceu {jogador2_vitorias} rodadas.")
Exemplo de Saída do Código:
Rodada 1: Jogador 1 tirou 4, Jogador 2 tirou 2
Nenhum jogador ganhou esta rodada.
Rodada 2: Jogador 1 tirou 6, Jogador 2 tirou 3
Jogador 1 ganhou esta rodada!
Rodada 3: Jogador 1 tirou 2, Jogador 2 tirou 6
Jogador 2 ganhou esta rodada!
Rodada 4: Jogador 1 tirou 1, Jogador 2 tirou 5
Nenhum jogador ganhou esta rodada.
...
Empate no total de rodadas!
Jogador 1 venceu 1 rodadas.
Jogador 2 venceu 1 rodadas.
Neste exemplo, dois jogadores lançam um dado, e o primeiro a tirar um 6 ganha a rodada. O programa simula 10 rodadas e conta quantas cada jogador ganhou. Defina uma semente caso queira garantir que os resultados sejam reproduzíveis.
Exercícios#
Antes de começar os exercícios, vamos aprender mais um pouco sobre a leitura dos dados de entrada. Desta vez sobre a função map()
, que é usada para aplicar uma função específica a todos os elementos de uma sequência (como listas ou tuplas), retornando um iterador com os resultados. Ela recebe dois argumentos: a função a ser aplicada e a sequência de entrada.
Por exemplo, quando queremos converter a entrada do usuário em números de ponto flutuante, usamos map()
juntamente com a função float()
:
nota1, nota2, nota3 = map(float, input().split())
Neste código, o input()
recebe três notas separadas por espaços. O método .split()
divide a entrada em uma lista de strings. Em seguida, map(float, ...)
aplica a função float()
a cada elemento da lista, convertendo as strings em números de ponto flutuante. Finalmente, os valores convertidos são atribuídos às variáveis nota1
, nota2
e nota3
.
Outro exemplo é quando queremos converter a entrada do usuário em uma lista de números de ponto flutuante. Podemos fazer isso da seguinte maneira:
notas = list(map(float, input().split()))
Neste caso, o input()
recebe várias notas separadas por espaços. O método .split()
divide a entrada em uma lista de strings. Em seguida, map(float, ...)
aplica a função float()
a cada elemento da lista, convertendo as strings em números de ponto flutuante. Finalmente, a função list()
transforma o objeto map em uma lista de números de ponto flutuante, que é atribuída à variável notas
.
Agora sim, vamos aos Exercícios.
Classificação Etária: Desenvolva um programa que recebe várias idades de usuários na entrada, todas separadas por espaços. Para cada idade, o programa deve imprimir a categoria correspondente de acordo com a seguinte escala:
Categoria |
Faixa Etária |
---|---|
Menor de idade |
Menos de 13 anos |
Adolescente |
De 13 a 17 anos |
Maior de idade |
De 18 a 59 anos |
Idoso |
60 anos ou mais |
# Teste
Entrada: 12 15 20 16 21 60 22 14 23 65
Saída:
Menor de idade
Adolescente
Maior de idade
Adolescente
Maior de idade
Idoso
Maior de idade
Adolescente
Maior de idade
Idoso
Verificação de Palíndromo: Faça um programa que receba uma lista de palavras e verifique se cada palavra é um palíndromo. Um palíndromo é uma palavra que permanece a mesma quando lida de trás para frente. O programa deve imprimir “Sim” para palíndromos e “Não” para não palíndromos. Utilize
end=' '
no comando print para que os resultados sejam exibidos na mesma linha, separados por espaços.
# Teste
Entrada: arara python reviver código osso casa radar programa mussum piloto
Saída: Sim Não Sim Não Sim Não Sim Não Sim Não
Contagem Regressiva: Escreva uma contagem regressiva de 10 a 1, com um intervalo de 1 segundo entre cada número. Para isso, pesquise e utilize o módulo
time
para pausar a execução do programa por 1 segundo antes de imprimir cada número.
Lembre-se de importar o módulo time e usar a função time.sleep(1)
para criar o atraso desejado. Você pode encontrar mais informações sobre o módulo time
na documentação oficial do Python.
# Teste
Entrada: Sem entrada
Saída: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
Análise de Desempenho de uma Turma com até 100 Alunos: Analise o desempenho de uma turma com até 100 alunos em uma disciplina de linguagem de programação. Seu programa deve receber como entrada uma lista de até 100 números entre 0 e 10, representando as notas finais de cada aluno.
Para cada nota na lista, o programa deve:
Adicionar a nota à uma soma total (para posterior cálculo da média da turma).
Verificar se a nota é maior ou igual a 5. Se for, incrementar o contador de alunos aprovados.
Se a nota for menor que 5, incrementar o contador de alunos reprovados.
Após processar todas as notas, o programa deve calcular e imprimir as seguintes informações: Número de Alunos Aprovados, Número de Alunos Reprovados e Média da Turma.
Obs: Considere utilizar essa sintaxe para o armazenamento das notas em uma lista: list(map(float, input().split(',')))
# Teste 1
Entrada: 1.3, 2.8, 8.1, 5.6, 8.1, 6.9, 9.7, 0.7, 0.7, 1.1, 10.0, 1.7, 8.5, 3.3, 2.4, 6.9, 2.5, 0.3, 8.8, 3.1, 8.1, 9.2, 1.4, 4.6, 4.6, 0.6, 10.0, 1.4, 4.3, 7.9, 3.9, 2.4, 5.4, 5.6, 4.4, 3.5, 0.5, 7.4, 2.7, 2.1, 3.5, 6.3, 3.6, 0.0, 7.7, 0.8, 7.7, 9.7, 1.6, 0.3, 6.5, 4.2, 1.2, 4.3, 4.5, 8.9, 5.8, 7.5, 9.7, 8.2, 1.5, 9.2, 6.1, 9.7, 6.7, 0.5, 7.1, 3.4, 7.8, 8.1, 4.5, 4.1, 5.8, 3.4, 0.3, 10.0, 7.7, 0.2, 9.9, 2.3, 7.8, 5.6, 3.6, 1.3, 9.5, 1.2, 6.4, 3.2, 9.1, 8.6, 6.2, 7.9, 4.9, 7.3, 1.2, 5.1, 9.2, 7.6, 0.3, 7.4
Saída:
Número de Alunos Aprovados: 50
Número de Alunos Reprovados: 50
Média da Turma: 5.06
# Teste 2
Entrada: 7.0, 8.5, 9.0, 4.5, 6.0, 3.0, 2.5, 8.0, 9.5, 5.0
Saída:
Número de Alunos Aprovados: 7
Número de Alunos Reprovados: 3
Média da Turma: 6.30
# Teste 3
Entrada: 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0
Saída:
Número de Alunos Aprovados: 10
Número de Alunos Reprovados: 0
Média da Turma: 10.00
# Teste 4
Entrada: 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
Saída:
Número de Alunos Aprovados: 0
Número de Alunos Reprovados: 10
Média da Turma: 0.00
Cálculo do Fatorial: Escreva um programa que receba uma lista de números inteiros, e obedecendo alguns critérios, calcule e imprima o fatorial de cada um deles. O fatorial de um número é o produto de todos os números inteiros de 1 até o próprio número.
Aqui estão as etapas e critérios para implementar seu programa:
Receba e armazene uma lista de números inteiros.
Verifique se cada número é válido (ou seja, maior ou igual a zero e menor do que 15).
Calcule o fatorial de cada número usando um loop
for
ouwhile
.Exiba o resultado do fatorial para cada um dos números. Se não for possível calcular o fatorial (por exemplo, para números não válidos), escreva um
X
.Mostre a quantidade de números para os quais não foi possível calcular o fatorial.
# Teste 1
Entrada: 7, 6, -1, 14, 1, 12, 0, 18, 15, 12, 5, 9, 10, 0, 12, 17, 2, 15, 12, 2, 16, 19, 5, 4, 10
Saída: 5040, 720, X, 87178291200, 1, 479001600, 1, X, X, 479001600, 120, 362880, 3628800, 1, 479001600, X, 2, X, 479001600, 2, X, X, 120, 24, 3628800
Quantidade de números inválidos: 7
# Teste 2
Entrada: 3, 9, 12, 15, 12, 0, 8, 15, 12, 5, 9, 10, 0, 12, 17, 2, 15, 12, 2, 16, 19, 5, 4, 10, 3, 13
Saída: 6 362880 479001600 X 479001600 1 40320 X 479001600 120 362880 3628800 1 479001600 X 2 X 479001600 2 X X 120 24 3628800 X 6227020800
Quantidade de números inválidos: 6
Lembre-se de tratar casos especiais. Zero possui fatorial 1 e um número negativo não possui fatorial.
6. Jogo da Adivinhação (Jogador vs Computador): O objetivo é desenvolver um jogo interativo de adivinhação de números no qual o jogador compete contra o computador. O jogo deve seguir as seguintes regras:
No início do jogo, o programa deve gerar um número aleatório secreto entre 1 e 100. Este será o número que o jogador e o computador tentarão adivinhar.
Tanto o jogador quanto o computador têm um número limitado de tentativas para adivinhar o número. Por exemplo, pode-se limitar a 20 tentativas.
Em cada rodada, o jogador e o computador fazem um palpite. O programa deve então fornecer uma dica para ambos, indicando se o número secreto é maior ou menor que os palpites.
Se o jogador ou o computador adivinhar o número corretamente, o programa deve parabenizá-lo e informar o número de tentativas que foram necessárias para adivinhar o número. Se ambos adivinharem o número na mesma rodada, o jogo termina em empate.
Se o jogador e o computador esgotarem todas as suas tentativas sem adivinhar o número, o programa deve informar que o jogo terminou e revelar o número secreto.
7. Exercício de Padrão de Asteriscos: Escreva um programa em Python que imprima um triângulo de asteriscos. O programa deve receber na entrada o número de linhas do triângulo e o tipo de triângulo a ser impresso (tipo1 ou tipo2). Em seguida, o programa deve imprimir o triângulo de asteriscos com o número de linhas especificado e no formato escolhido.
Tipo 1: Cada linha começa com um asterisco e aumenta o número de asteriscos à medida que descemos.
Tipo 2: O número máximo de asteriscos aparece na primeira linha e à medida que avançamos para a direita, este número vai diminuindo.
# Teste 1
Entrada: tipo1, 3
Saída:
*
**
***
# Teste 2
Entrada: tipo1, 5
Saída:
*
**
***
****
*****
# Teste 3
Entrada: tipo2, 4
Saída:
****
***
**
*
8. Identificação de Números Primos em uma Lista: Desenvolva um programa que identifique todos os números primos presentes em uma lista fornecida na entrada. Um número primo é um número maior que 1 que não possui divisores positivos além de 1 e si próprio. Siga as Instruções a seguir:
Leia uma lista de números inteiros.
Para cada número na lista, verifique se ele é um número primo.
Se o número for primo, adicione-o a uma nova lista.
Após verificar todos os números na lista original, exiba a nova lista contendo apenas os números primos.
# Teste 1
Entrada: -23, 15, -7, 49, -35, 21, -2, 30, -14, 8, -50, 44, -29, 17, -3, 34, -9, 25, -40, 12, 5, -28, 37, -16, 10, -4, 42, -33, 18, -6, 27, -13, 39, -22, 11, -1, 31, -19, 20, -36, 14, -8, 26, -45, 9, -24, 32, -10, 23, -5
Saída: 17, 5, 37, 11, 31, 23
# Teste 2
Entrada: -18, 33, -12, 27, -6, 42, -30, 21, -3, 39, -24, 15, -9, 36, -15, 12, -1, 45, -27, 18, -7, 30, -21, 9, -33, 24, -13, 6, -42, 36, -19, 3, -39, 30, -10, 0, 48, -25, 16, -4, 41, -28, 22, -5, 38
Saída: 3, 41
9. Loteria de 5 números: Desenvolva um programa que simule uma loteria onde são sorteados 5 números distintos entre 1 e 50. O programa deve gerar aleatoriamente jogos de 5 números até que um jogo corresponda exatamente à combinação sorteada. O objetivo é determinar quantos jogos são necessários até que haja um ganhador. Siga as instruções a seguir:
Receba na entrada um inteiro correspondente à semente para geração pseudoaleatória de números.
Gere uma combinação vencedora de 5 números únicos entre 1 e 50 usando
random.sample
.Converta a combinação vencedora em um conjunto (set) para facilitar a comparação.
Crie um loop que simule jogos de 5 números únicos entre 1 e 50, também usando
random.sample
.Após cada jogo, converta a combinação de números gerada em um conjunto (set) e verifique se ela corresponde à combinação vencedora.
Conte o número de jogos realizados até que um jogo corresponda exatamente à combinação vencedora.
Exiba o número total de jogos necessários para encontrar um ganhador.
# Teste 1
Entrada: 1
Saída: Número de jogos necessários: 24836
# Teste 2
Entrada: 2
Saída: Número de jogos necessários: 622164
# Teste 3
Entrada: 11
Saída: Número de jogos necessários: 807045
10. O “Velho” Fibonacci: A sequência de Fibonacci é uma série infinita de números inteiros em que cada número é a soma dos dois anteriores. Ela começa com os números 1 e 1:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
Para calcular o próximo número na sequência, somamos os dois números anteriores. Por exemplo:
O terceiro número é 1 + 1 = 2.
O quarto número é 1 + 2 = 3.
O quinto número é 2 + 3 = 5.
E assim por diante.
Veja a imagem ilustrativa a seguir:

Agora, vamos criar um programa que gere a sequência de Fibonacci até o n-ésimo termo. O usuário fornecerá o valor de n.
Inicializamos as variáveis
ultimo
epenultimo
com os valores 1, pois os dois primeiros termos da sequência são 1.Usamos um laço de repetição (como um
for
ouwhile
) para calcular os próximos termos. Salvando os valores em uma lista.A cada iteração, somamos
ultimo
epenultimo
para obter o próximo termo.Atualizamos as variáveis
ultimo
epenultimo
para os valores corretos.Repetimos o processo até chegarmos ao n-ésimo termo.
Por fim, todos os números da sequência, armazenados em uma lista, devem ser impressos.
# Teste 1
Entrada: 10
Saída: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
# Teste 2
Entrada: 19
Saída: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181
# Teste 3
Entrada: 23
Saída: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657
11. Gerador de Senhas Aleatórias
Você foi contratado para desenvolver um sistema simples que gere senhas seguras para usuários. Cada senha deve conter letras maiúsculas, letras minúsculas e números. Para facilitar a criação de várias senhas, o sistema deve gerar um conjunto de senhas automaticamente.
Importante: a semente deve ser definida com
random.seed(42)
antes de qualquer chamada a funções comorandom.choices()
ourandom.shuffle()
. Isso garante que todos os alunos gerem exatamente as mesmas senhas.
Requisitos:
Cada senha deve conter:
3 letras maiúsculas
3 letras minúsculas
3 dígitos
A senha deve ter 9 caracteres no total, dispostos em ordem aleatória.
Utilize um laço de repetição para gerar a quantidade (
qtd
) de senhas desejada.Use o módulo
random
e defina a semente comrandom.seed(42)
antes de gerar qualquer senha.
Dicas:
import string
pode ser útilUse
string.ascii_uppercase
,string.ascii_lowercase
estring.digits
para acessar letras e números.Use
random.choices(..., k=3)
para sortear 3 caracteres de uma lista.Por fim, use
random.shuffle(lista)
para embaralhar a ordem dos caracteres da senha.
# Teste 1
Entrada: 3
Saída: rfH4t80AQ wl74S1SKh Gl0I9J2bd
# Teste 2
Entrada: 5
Saída: rfH4t80AQ wl74S1SKh Gl0I9J2bd W6l37evJW ft8R8YHi0
# Teste 3
Entrada: 8
Saída: rfH4t80AQ wl74S1SKh Gl0I9J2bd W6l37evJW ft8R8YHi0 5LKgg8Xo2 pDrE45kW2 19gC5LLyw
12. Batalha de Números Primos
Dois jogadores entraram em uma batalha matemática! Cada um receberá 15 números aleatórios entre 1 e 1000. O objetivo é simples: quem tiver mais números primos vence a partida.
Para garantir que os testes possam ser reproduzidos de forma idêntica, o programa deve receber duas sementes de números aleatórios — uma para cada jogador.
Requisitos
Receba dois números inteiros como entrada: eles serão usados como sementes (
random.seed()
) — uma para cada jogador.Após definir a semente, sorteie 15 números entre 1 e 1000 para cada jogador.
Verifique quais desses números são primos.
Mostre:
Os 15 números sorteados para cada jogador
Quantos números primos cada jogador recebeu
Declare o vencedor com base em quem teve mais primos. Em caso de empate, informe: “Empate!”
# Teste 1
Entrada: 123 456
Saída:
JOGADOR 1
[54, 275, 90, 788, 418, 273, 111, 859, 923, 896, 40, 389, 550, 576, 341]
Número de Primos: 2
JOGADOR 2
[767, 461, 990, 478, 446, 400, 814, 911, 664, 42, 633, 749, 843, 921, 809]
Número de Primos: 3
Vencedor: Jogador 2
# Teste 2
Entrada: 111 222
Saída esperada:
JOGADOR 1
[848, 972, 218, 944, 966, 324, 506, 199, 408, 427, 632, 832, 174, 645, 199]
Número de Primos: 2
JOGADOR 2
[798, 111, 241, 291, 314, 33, 30, 494, 229, 456, 758, 738, 452, 464, 77]
Número de Primos: 2
Vencedor: Empate
# Teste 3
Entrada: 42 99
Saída:
JOGADOR 1
[655, 115, 26, 760, 282, 251, 229, 143, 755, 105, 693, 759, 914, 559, 90]
Número de Primos: 2
JOGADOR 2
[414, 390, 205, 614, 184, 236, 255, 137, 779, 89, 258, 747, 393, 544, 701]
Número de Primos: 3
Vencedor: Jogador 2