4 Funções
Funções são blocos de código que resolvem tarefas específicas. Pense em função como uma “máquina”: você envia uma entrada, ela processa e devolve uma saída. Elas nos ajudam a organizar programas grandes em partes menores, reutilizáveis e mais fáceis de testar.
4.1 Definindo e invocando funções
Uma função é criada com def, recebe um nome, pode receber parâmetros e pode retornar um valor. Sintaxe:
def nome_da_funcao(parametro):
# bloco da função
return valorExemplos Práticos:
(quadrado.py): Exemplo mais simples do capítulo. A função calcula a área de uma placa quadrada a partir do lado. O programa principal apenas chama a mesma função para três peças diferentes.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Crie um programa para calcular a area de placas quadradas usando funcao.
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma funcao chamada calcular_area_placa_quadrada que receba o lado
# de uma placa quadrada e retorne sua area.
# 2. No fluxo principal, defina tres medidas de lado para pecas diferentes.
# 3. Chame a funcao para cada medida e exiba as areas calculadas.
#
# Casos especiais:
# 1. Considere que as medidas fornecidas no programa sao validas e positivas.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Esta funcao recebe o lado de uma placa quadrada e devolve sua area.
def calcular_area_placa_quadrada(lado):
return lado * lado
# Cada variavel representa o lado de uma peca quadrada diferente.
lado_sensor = 0.25
lado_tampa = 0.4
lado_base = 1.2
# O programa reutiliza a mesma funcao para calcular a area de tres pecas.
print(f"Area da placa do sensor: {calcular_area_placa_quadrada(lado_sensor)} m2")
print(f"Area da tampa: {calcular_area_placa_quadrada(lado_tampa)} m2")
print(f"Area da base: {calcular_area_placa_quadrada(lado_base)} m2")(saudacao_com_nome.py): Um passo acima: o programa lê o nome de um operador e usa uma função para montar a mensagem de liberação para a medição. O foco continua sendo separar entrada, processamento e saída.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Desenvolva um programa para montar uma mensagem de identificacao de operador.
# O programa deve solicitar ao usuario as seguintes informacoes:
# 1. O nome do operador (texto).
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma funcao chamada montar_identificacao_operador que receba o nome.
# 2. A funcao deve retornar uma frase informando que o operador foi liberado
# para iniciar a medicao.
# 3. No script principal, leia o nome, chame a funcao e exiba a mensagem.
#
# Casos especiais:
# 1. Considere que o usuario sempre digitara um nome valido.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# A funcao recebe o nome e devolve a frase pronta para exibicao.
def montar_identificacao_operador(nome):
return f"Operador {nome} liberado para iniciar a medicao."
# Entrada de dados no script principal.
nome = input("Digite o nome do operador: ")
# Chamada da funcao para gerar a mensagem final.
mensagem = montar_identificacao_operador(nome)
# Exibicao do retorno produzido pela funcao.
print(mensagem)(trace_chamadas.py): Exemplo mais elaborado. Ele mostra a ordem de execução em uma rotina de inspeção: o programa abre a rotina, chama uma função para iniciar o teste, chama outra para avaliar a leitura e então encerra o processo. Rastreie a saída linha a linha.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Implemente um programa para observar a ordem de chamadas entre funcoes.
#
# O programa nao precisa solicitar entradas do usuario.
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma funcao chamada iniciar_teste que exiba uma mensagem de inicio
# e retorne uma temperatura fixa.
# 2. Defina uma funcao chamada avaliar_temperatura que receba a temperatura,
# exiba a leitura recebida e retorne "Faixa segura" se a temperatura for
# menor ou igual a 30, ou "Faixa de alerta" caso contrario.
# 3. No script principal, exiba uma mensagem de abertura, chame as funcoes em
# ordem, mostre o resultado da avaliacao e encerre a rotina.
#
# Casos especiais:
# 1. Como a temperatura ja esta definida no programa, nao ha tratamento extra
# de entrada invalida.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Esta funcao simula o inicio do teste e devolve uma leitura fixa.
def iniciar_teste():
print("Iniciando teste de temperatura...")
return 28.5
# Esta funcao recebe a leitura e decide se ela esta em faixa segura.
def avaliar_temperatura(temperatura):
print(f"Leitura recebida: {temperatura} C")
# A decisao usa um if simples para classificar a leitura.
if temperatura <= 30:
return "Faixa segura"
return "Faixa de alerta"
# O script principal mostra a sequencia completa de execucao.
print("Abrindo rotina de inspecao")
temperatura_medida = iniciar_teste()
status = avaliar_temperatura(temperatura_medida)
print(f"Resultado da avaliacao: {status}")
print("Encerrando rotina")4.2 Parâmetros e argumentos
Parâmetros são as variáveis que a função declara. Argumentos são os valores que passamos na chamada. O código da função não muda — só mudam os dados que ela recebe.
Exemplos Práticos:
(area_retangulo.py): Exemplo mais simples: calcular a área de um piso a partir do comprimento e da largura. Dois parâmetros entram, um resultado sai.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Implemente um programa para calcular a area de um piso retangular.
# O programa deve solicitar ao usuario as seguintes informacoes:
# 1. O comprimento do piso em metros (numero decimal).
# 2. A largura do piso em metros (numero decimal).
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma funcao chamada calcular_area_piso que receba comprimento e
# largura.
# 2. A funcao deve retornar a area calculada por comprimento * largura.
# 3. No script principal, leia os dados, chame a funcao e exiba o resultado.
#
# Casos especiais:
# 1. Considere que o usuario informara medidas validas e positivas.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Funcao pura: recebe as medidas e devolve apenas o valor calculado.
def calcular_area_piso(comprimento, largura):
return comprimento * largura
# Leitura das dimensoes informadas pelo usuario.
comprimento = float(input("Digite o comprimento do piso em metros: "))
largura = float(input("Digite a largura do piso em metros: "))
# Chamada da funcao para obter a area total do piso.
area = calcular_area_piso(comprimento, largura)
# Exibicao do resultado final.
print(f"Area do piso: {area} m2")(teste_argumentos.py): Intermediário: a mesma função calcula o consumo de energia de equipamentos diferentes. Primeiro com valores fixos, depois com dados informados pelo usuário. O código da função não muda; só mudam os argumentos.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Crie um programa para calcular consumo de energia com diferentes argumentos.
# O programa deve solicitar ao usuario as seguintes informacoes:
# 1. A potencia do equipamento em kW (numero decimal).
# 2. O tempo de uso em horas (numero decimal).
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma funcao chamada calcular_consumo_energia que receba potencia e
# horas de uso.
# 2. A funcao deve retornar o consumo calculado por potencia * horas.
# 3. No fluxo principal, faca chamadas com valores fixos para equipamentos
# diferentes e exiba os resultados.
# 4. Depois, leia os dados digitados pelo usuario, chame a mesma funcao e
# mostre o consumo estimado.
#
# Casos especiais:
# 1. Considere que os valores digitados sao validos e nao negativos.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# A funcao calcula o consumo total em kWh a partir da potencia e do tempo.
def calcular_consumo_energia(potencia_kw, horas):
return potencia_kw * horas
# Testes com argumentos fixos para mostrar reutilizacao da funcao.
print(f"Bomba A em 3 h: {calcular_consumo_energia(2.5, 3)} kWh")
print(f"Bomba B em 6 h: {calcular_consumo_energia(4.0, 6)} kWh")
print(f"Ventilador em 8 h: {calcular_consumo_energia(0.8, 8)} kWh")
# Entrada informada pelo usuario para um novo equipamento.
potencia = float(input("Digite a potencia do equipamento em kW: "))
horas = float(input("Digite o tempo de uso em horas: "))
# A mesma funcao e usada novamente com argumentos diferentes.
consumo = calcular_consumo_energia(potencia, horas)
print(f"Consumo estimado: {consumo} kWh")(calcular_preco_final.py): Mais avançado: um orçamento de sensores usa três parâmetros ao mesmo tempo, combinando quantidade, preço unitário e desconto do fornecedor.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Desenvolva um programa para calcular o custo final de um lote de sensores.
# O programa deve solicitar ao usuario as seguintes informacoes:
# 1. A quantidade de sensores no lote (inteiro).
# 2. O preco unitario de cada sensor (numero decimal).
# 3. O desconto negociado com o fornecedor em porcentagem (numero decimal).
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma funcao chamada calcular_preco_final que receba quantidade,
# preco_unitario e desconto_percentual.
# 2. Dentro da funcao, calcule o subtotal por quantidade * preco_unitario.
# 3. Calcule o valor do desconto aplicando o percentual ao subtotal.
# 4. Retorne o valor final depois de subtrair o desconto.
# 5. No script principal, leia os dados, chame a funcao e exiba o custo final.
#
# Casos especiais:
# 1. Considere que o percentual informado ja esta em formato de porcentagem,
# como 5 para 5%.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# A funcao agrupa todo o calculo financeiro do lote.
def calcular_preco_final(quantidade, preco_unitario, desconto_percentual):
# Primeiro, calcula o valor total sem desconto.
subtotal = quantidade * preco_unitario
# Depois, calcula quanto sera abatido do subtotal.
desconto = subtotal * (desconto_percentual / 100)
# O retorno final e o subtotal menos o desconto obtido.
return subtotal - desconto
# Entrada dos dados do pedido.
quantidade = int(input("Quantidade de sensores no lote: "))
preco = float(input("Preco unitario de cada sensor: R$ "))
desconto = float(input("Desconto negociado com o fornecedor (%): "))
# Chamada da funcao para calcular o custo final.
total = calcular_preco_final(quantidade, preco, desconto)
print(f"Custo final do lote: R$ {total:.2f}")4.3 Retorno com return e composição de funções
Quando uma função retorna um valor, podemos usar esse retorno como entrada de outra função. Isso se chama composição: a saída de uma função vira entrada da próxima.
Exemplos Práticos:
(composicao_simples.py): Exemplo mais simples de composição: uma função calcula a área da base e outra usa esse resultado para calcular o volume de um tanque retangular.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Crie um programa para calcular o volume de um tanque por composicao de funcoes.
#
# O programa nao precisa solicitar entradas do usuario.
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma funcao chamada calcular_area_base que receba comprimento e
# largura e retorne a area da base.
# 2. Defina uma funcao chamada calcular_volume_tanque que receba a area da base
# e a altura do tanque, retornando o volume.
# 3. No script principal, use o retorno da primeira funcao como argumento da
# segunda e exiba o volume final.
#
# Casos especiais:
# 1. Considere que as medidas fixas usadas no programa sao validas.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# A primeira funcao calcula a area da base retangular.
def calcular_area_base(comprimento, largura):
return comprimento * largura
# A segunda funcao usa a area da base para encontrar o volume total.
def calcular_volume_tanque(area_base, altura):
return area_base * altura
# Aqui acontece a composicao: o retorno de calcular_area_base vira argumento
# de calcular_volume_tanque.
volume = calcular_volume_tanque(calcular_area_base(3.0, 2.0), 1.5)
print(f"Volume do tanque: {volume} m3")(rastreamento_composicao.py): Intermediário: a vazão da bomba é convertida de litros por minuto para volume por hora, depois para volume por turno e, por fim, para metros cúbicos. Desfaça a composição de dentro para fora.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Implemente um programa para calcular o volume bombeado em um turno.
# O programa deve solicitar ao usuario as seguintes informacoes:
# 1. A vazao da bomba em litros por minuto (numero decimal).
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma funcao chamada calcular_volume_por_hora que receba a vazao em
# litros por minuto e retorne o volume bombeado em uma hora.
# 2. Defina uma funcao chamada calcular_volume_por_turno que receba o volume por
# hora e retorne o volume de um turno de 8 horas.
# 3. Defina uma funcao chamada converter_litros_para_m3 que receba um volume em
# litros e retorne o mesmo valor em metros cubicos.
# 4. No script principal, leia a vazao, componha as tres funcoes e exiba o
# resultado final.
#
# Casos especiais:
# 1. Considere que a vazao informada e valida e positiva.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Converte a vazao de litros por minuto para litros por hora.
def calcular_volume_por_hora(vazao_litros_minuto):
return vazao_litros_minuto * 60
# Multiplica o volume horario pela duracao de um turno de 8 horas.
def calcular_volume_por_turno(volume_hora):
return volume_hora * 8
# Converte litros para metros cubicos dividindo por 1000.
def converter_litros_para_m3(volume_litros):
return volume_litros / 1000
# Leitura da vazao fornecida pelo usuario.
vazao = float(input("Digite a vazao da bomba em litros por minuto: "))
# As funcoes sao chamadas de dentro para fora em uma unica expressao.
resultado = converter_litros_para_m3(
calcular_volume_por_turno(calcular_volume_por_hora(vazao))
)
print(f"Volume bombeado em um turno: {resultado} m3")(composicao_encadeada.py): Mais avançado: um orçamento de materiais calcula o subtotal, aplica uma margem de perda e formata o valor final em uma única expressão composta.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Desenvolva um programa para montar um orcamento de materiais com composicao.
#
# O programa nao precisa solicitar entradas do usuario.
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma funcao chamada calcular_subtotal_materiais que receba a massa
# em kg e o preco por kg, retornando o subtotal.
# 2. Defina uma funcao chamada aplicar_margem_perda que receba o subtotal e
# retorne o valor com acrescimo de 8%.
# 3. Defina uma funcao chamada formatar_orcamento que receba o valor final e
# devolva uma mensagem textual pronta para exibicao.
# 4. No script principal, componha as tres funcoes em uma unica expressao e
# exiba a mensagem final.
#
# Casos especiais:
# 1. Considere que os valores fixos usados no programa sao validos.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Calcula o custo inicial do lote a partir de massa e preco por kg.
def calcular_subtotal_materiais(massa_kg, preco_por_kg):
return massa_kg * preco_por_kg
# Acrescenta uma margem de perda ao subtotal calculado.
def aplicar_margem_perda(subtotal):
return subtotal * 1.08
# Transforma o valor numerico em uma frase pronta para exibicao.
def formatar_orcamento(valor_final):
return f"Orcamento estimado do lote: R$ {valor_final:.2f}"
# Cada retorno alimenta a proxima funcao ate formar a mensagem final.
print(formatar_orcamento(aplicar_margem_perda(calcular_subtotal_materiais(850, 6.4))))4.4 Decisão e repetição dentro de funções
Funções podem conter if, elif, else e laços. Em vez de espalhar regras no script principal, colocamos a lógica dentro de funções bem nomeadas. O programa principal diz o que fazer; a função diz como fazer.
Exemplos Práticos:
(classificar_nota.py): Exemplo mais simples: uma função classifica a temperatura medida em um equipamento como normal ou acima do limite.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Crie um programa para classificar a temperatura de um equipamento.
# O programa deve solicitar ao usuario as seguintes informacoes:
# 1. A temperatura medida em C (numero decimal).
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma funcao chamada classificar_temperatura que receba a leitura.
# 2. A funcao deve retornar "Operacao normal" se a temperatura for menor ou
# igual a 80.
# 3. Caso contrario, a funcao deve retornar "Acima do limite".
# 4. No script principal, leia a temperatura, chame a funcao e exiba a
# classificacao retornada.
#
# Casos especiais:
# 1. Considere que a leitura fornecida pelo usuario e valida.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# A funcao recebe a temperatura e decide a situacao do equipamento.
def classificar_temperatura(temperatura):
# Se a leitura estiver dentro do limite, retorna operacao normal.
if temperatura <= 80:
return "Operacao normal"
# Qualquer valor acima do limite cai neste retorno final.
return "Acima do limite"
# Entrada da leitura feita pelo usuario.
temperatura = float(input("Digite a temperatura medida em C: "))
# Chamada da funcao para obter a classificacao.
situacao = classificar_temperatura(temperatura)
print(f"Situacao do equipamento: {situacao}")(simulacao_acumulador.py): Intermediário: o programa lê várias leituras de vazão, armazena em uma lista e usa uma função com for e if para somar apenas as leituras válidas.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Implemente um programa para somar leituras de vazao validas.
# O programa deve solicitar ao usuario as seguintes informacoes:
# 1. Leituras de vazao em L/min, uma por vez (numero decimal).
# 2. O valor 0 deve ser usado para encerrar a entrada de dados.
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma funcao chamada somar_leituras_validas que receba uma lista de
# leituras.
# 2. Dentro da funcao, percorra a lista com um laco for.
# 3. Some apenas os valores maiores que zero.
# 4. No script principal, use um while para ler varias entradas, armazenar as
# leituras em uma lista e parar quando o usuario digitar 0.
# 5. Depois, chame a funcao e exiba a soma obtida.
#
# Casos especiais:
# 1. Leituras menores ou iguais a zero nao devem entrar na soma final.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# A funcao percorre a lista e acumula apenas leituras positivas.
def somar_leituras_validas(leituras):
soma = 0
# Cada leitura da lista e analisada individualmente.
for leitura in leituras:
# Apenas valores positivos sao adicionados ao acumulador.
if leitura > 0:
soma += leitura
return soma
# A lista comeca vazia e vai recebendo as leituras digitadas.
leituras = []
leitura = float(input("Digite uma leitura de vazao em L/min (0 para parar): "))
# O while continua lendo dados ate o usuario digitar 0.
while leitura != 0:
leituras.append(leitura)
leitura = float(input("Digite uma leitura de vazao em L/min (0 para parar): "))
# Depois da coleta, a funcao calcula a soma das leituras validas.
resultado = somar_leituras_validas(leituras)
print(f"Soma das leituras validas: {resultado} L/min")(decisor_desconto.py): Mais avançado: uma função decide o desconto de um pedido de materiais conforme o valor da compra, e o script principal calcula desconto obtido e valor final.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Desenvolva um programa para decidir o desconto de um pedido de materiais.
# O programa deve solicitar ao usuario as seguintes informacoes:
# 1. O valor do pedido de materiais em reais (numero decimal).
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma funcao chamada definir_percentual_desconto que receba o valor
# do pedido.
# 2. Se o valor for menor que 500, a funcao deve retornar 0.03.
# 3. Se o valor for menor ou igual a 2000, a funcao deve retornar 0.06.
# 4. Para valores acima de 2000, a funcao deve retornar 0.1.
# 5. No script principal, calcule o valor do desconto e o valor final do pedido.
# 6. Exiba o percentual negociado, o desconto obtido e o valor final.
#
# Casos especiais:
# 1. Considere que o valor informado pelo usuario e valido e nao negativo.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Esta funcao concentra as regras de desconto por faixa de valor.
def definir_percentual_desconto(valor_compra):
if valor_compra < 500:
return 0.03
# O segundo teste cobre os valores entre 500 e 2000.
if valor_compra <= 2000:
return 0.06
# Valores acima da segunda faixa recebem o maior desconto.
return 0.1
# Entrada do valor total do pedido.
valor_compra = float(input("Digite o valor do pedido de materiais: R$ "))
# O percentual calculado e usado para derivar desconto e valor final.
percentual = definir_percentual_desconto(valor_compra)
valor_desconto = valor_compra * percentual
valor_final = valor_compra - valor_desconto
print(f"Percentual negociado: {percentual * 100}%")
print(f"Desconto obtido: R$ {valor_desconto:.2f}")
print(f"Valor final do pedido: R$ {valor_final:.2f}")4.5 Decomposição de problemas com funções
Decompor significa dividir um problema grande em etapas menores. Cada etapa vira uma função com responsabilidade única.
Na engenharia, fazemos isso o tempo todo: estimar materiais, separar custos e consolidar um orçamento. Em programação, cada etapa pode virar uma função.
Exemplos Práticos:
(decomposicao_retangulo.py): Exemplo mais simples: duas funções calculam a área de uma laje e o comprimento total da viga de borda. O script principal coordena as chamadas.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Crie um programa para calcular area de laje e comprimento de viga de borda.
# O programa deve solicitar ao usuario as seguintes informacoes:
# 1. O comprimento da laje em metros (numero decimal).
# 2. A largura da laje em metros (numero decimal).
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma funcao chamada calcular_area_laje que receba comprimento e
# largura e retorne a area.
# 2. Defina uma funcao chamada calcular_viga_borda que receba comprimento e
# largura e retorne o perimetro da laje.
# 3. No script principal, leia os dados, chame as duas funcoes e exiba os
# resultados calculados.
#
# Casos especiais:
# 1. Considere que as medidas digitadas pelo usuario sao validas.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Esta funcao calcula a area da laje.
def calcular_area_laje(comprimento, largura):
return comprimento * largura
# Esta funcao calcula o comprimento total da viga de borda.
def calcular_viga_borda(comprimento, largura):
return 2 * (comprimento + largura)
# Leitura das dimensoes fornecidas pelo usuario.
comprimento = float(input("Comprimento da laje em metros: "))
largura = float(input("Largura da laje em metros: "))
# Cada resultado e calculado por uma funcao diferente.
area = calcular_area_laje(comprimento, largura)
perimetro = calcular_viga_borda(comprimento, largura)
print(f"Area da laje: {area} m2")
print(f"Comprimento total da viga de borda: {perimetro} m")(rastreamento_decomposicao.py): Intermediário: o orçamento de uma tubulação é dividido em custo dos tubos, custo de instalação e total. Rastreie o valor retornado por cada função intermediária.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Implemente um programa para orcar uma tubulacao por decomposicao de funcoes.
# O programa deve solicitar ao usuario as seguintes informacoes:
# 1. O comprimento da tubulacao em metros (numero decimal).
# 2. O preco do tubo por metro em reais (numero decimal).
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma funcao chamada calcular_custo_tubos que receba comprimento e
# preco por metro, retornando o custo dos tubos.
# 2. Defina uma funcao chamada calcular_custo_instalacao que receba o
# comprimento e retorne o custo de instalacao usando 12 reais por metro.
# 3. Defina uma funcao chamada calcular_orcamento_total que chame as duas
# funcoes anteriores e retorne a soma dos custos.
# 4. No script principal, leia os dados, chame a funcao principal e exiba o
# orcamento total.
#
# Casos especiais:
# 1. Considere que os dados digitados sao validos e positivos.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Calcula o custo apenas do material da tubulacao.
def calcular_custo_tubos(comprimento_metros, preco_por_metro):
return comprimento_metros * preco_por_metro
# Calcula o custo de instalacao usando uma taxa fixa por metro.
def calcular_custo_instalacao(comprimento_metros):
return comprimento_metros * 12
# Esta funcao de mais alto nivel combina os dois custos parciais.
def calcular_orcamento_total(comprimento_metros, preco_por_metro):
tubos = calcular_custo_tubos(comprimento_metros, preco_por_metro)
instalacao = calcular_custo_instalacao(comprimento_metros)
return tubos + instalacao
# Entrada dos dados do problema.
comprimento = float(input("Comprimento da tubulacao em metros: "))
preco_por_metro = float(input("Preco do tubo por metro: R$ "))
# O programa delega o calculo completo a uma funcao principal.
total = calcular_orcamento_total(comprimento, preco_por_metro)
print(f"Orcamento total da tubulacao: R$ {total:.2f}")(estimador_orcamento_viagem.py): Mais avançado: uma visita técnica é decomposta em combustível, hospedagem e alimentação, produzindo um orçamento detalhado.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Desenvolva um programa para estimar o custo de uma visita tecnica.
# O programa deve solicitar ao usuario as seguintes informacoes:
# 1. A distancia total da visita em km (numero decimal).
# 2. O custo estimado por km em reais (numero decimal).
# 3. A quantidade de dias da visita (inteiro).
# 4. O valor da diaria em reais (numero decimal).
# 5. O custo total de alimentacao em reais (numero decimal).
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma funcao chamada calcular_combustivel que receba distancia e
# custo por km, retornando o gasto com deslocamento.
# 2. Defina uma funcao chamada calcular_hospedagem que receba dias e diaria,
# retornando o gasto com hospedagem.
# 3. Defina uma funcao chamada calcular_total que receba combustivel,
# hospedagem e alimentacao, retornando a soma final.
# 4. No script principal, leia os dados, chame as funcoes e exiba o
# detalhamento do orcamento.
#
# Casos especiais:
# 1. Considere que os valores digitados sao validos e nao negativos.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Calcula o custo de deslocamento com base na distancia percorrida.
def calcular_combustivel(distancia_km, custo_por_km):
return distancia_km * custo_por_km
# Calcula o custo total de hospedagem da visita.
def calcular_hospedagem(dias, diaria):
return dias * diaria
# Soma todos os componentes do orcamento.
def calcular_total(combustivel, hospedagem, alimentacao):
return combustivel + hospedagem + alimentacao
# Entrada dos dados principais da visita tecnica.
distancia = float(input("Distancia total da visita tecnica em km: "))
custo_por_km = float(input("Custo estimado por km: R$ "))
dias = int(input("Quantidade de dias da visita: "))
diaria = float(input("Valor da diaria: R$ "))
alimentacao = float(input("Custo total de alimentacao: R$ "))
# Cada parcela e calculada separadamente para deixar o programa organizado.
combustivel = calcular_combustivel(distancia, custo_por_km)
hospedagem = calcular_hospedagem(dias, diaria)
total = calcular_total(combustivel, hospedagem, alimentacao)
print(f"Combustivel: R$ {combustivel:.2f}")
print(f"Hospedagem: R$ {hospedagem:.2f}")
print(f"Alimentacao: R$ {alimentacao:.2f}")
print(f"Total da visita tecnica: R$ {total:.2f}")4.6 Escopo: variável local e variável global
Variáveis criadas dentro da função são locais — só existem durante a execução da função. Variáveis fora da função são globais. Entender escopo evita erros como esperar que uma variável local exista fora da função.
Atenção: Usar o mesmo nome em escopos diferentes pode confundir. A variável local “esconde” a global dentro da função.
Exemplos Práticos:
(escopo_variaveis.py): Exemplo mais simples: um limite de temperatura definido dentro da função não altera o limite configurado fora dela.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Crie um programa para observar escopo local e escopo global.
#
# O programa nao precisa solicitar entradas do usuario.
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma variavel global chamada limite_temperatura com valor 80.
# 2. Defina uma funcao chamada demonstrar_escopo que crie uma variavel local
# com o mesmo nome e valor 65.
# 3. Dentro da funcao, exiba o valor da variavel local.
# 4. Fora da funcao, exiba o valor da variavel global para comparar.
#
# Casos especiais:
# 1. O objetivo do programa e apenas mostrar que a variavel local nao altera a
# variavel global automaticamente.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Esta e a variavel global, visivel fora da funcao.
limite_temperatura = 80
# Dentro da funcao, uma nova variavel com o mesmo nome e criada localmente.
def demonstrar_escopo():
limite_temperatura = 65
print(f"Dentro da funcao: limite usado no teste = {limite_temperatura} C")
# Primeiro, a funcao mostra o valor local.
demonstrar_escopo()
# Depois, o programa mostra que o valor global permaneceu igual.
print(f"Fora da funcao: limite configurado no sistema = {limite_temperatura} C")(escopo_parametro_local.py): Intermediário: a função recebe uma pressão como parâmetro, monta um relatório e mostra que a variável global continua igual antes e depois da chamada.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Implemente um programa para observar escopo de parametro e variavel global.
#
# O programa nao precisa solicitar entradas do usuario.
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma variavel global chamada pressao com valor 12.
# 2. Defina uma funcao chamada montar_relatorio que receba um parametro tambem
# chamado pressao.
# 3. Dentro da funcao, monte uma mensagem com o valor recebido e retorne essa
# mensagem.
# 4. No script principal, mostre o valor global antes da chamada, exiba o
# retorno da funcao e mostre novamente o valor global.
#
# Casos especiais:
# 1. O objetivo e didatico: mostrar que o parametro da funcao nao altera a
# variavel global com o mesmo nome.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Variavel global definida no inicio do programa.
pressao = 12
# O parametro pressao existe apenas dentro da funcao.
def montar_relatorio(pressao):
status = f"Leitura analisada: {pressao} bar"
return status
# Antes da chamada, o programa mostra o valor global.
print(f"Pressao global antes: {pressao} bar")
# A funcao e chamada com outro valor, sem alterar a variavel global.
resultado = montar_relatorio(18)
print(resultado)
# Depois da chamada, o valor global continua o mesmo.
print(f"Pressao global depois: {pressao} bar")(escopo_variaveis_avancado.py): Mais avançado: três variáveis com o nome vazao aparecem em escopos diferentes. Rastreie os valores e escreva o que cada print vai exibir antes de executar.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Desenvolva um programa para rastrear variaveis com o mesmo nome em escopos diferentes.
#
# O programa nao precisa solicitar entradas do usuario.
#
# O programa deve funcionar da seguinte maneira:
# 1. Defina uma variavel global chamada vazao com valor 120.
# 2. Defina uma funcao chamada calcular_vazao_pico que crie uma variavel local
# chamada vazao com valor 150 e retorne esse valor.
# 3. Defina uma funcao chamada aplicar_reducao que receba um parametro chamado
# vazao, subtraia 20 e retorne o resultado.
# 4. No script principal, chame as duas funcoes e exiba os retornos e o valor
# da vazao global.
#
# Casos especiais:
# 1. Antes de executar, tente prever qual valor cada print vai mostrar.
# -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
# Esta e a vazao global do sistema.
vazao = 120
# Esta funcao cria uma vazao local independente da global.
def calcular_vazao_pico():
vazao = 150
return vazao
# Aqui, vazao e apenas um parametro local da funcao.
def aplicar_reducao(vazao):
vazao = vazao - 20
return vazao
# Cada chamada usa seu proprio escopo e produz um resultado especifico.
vazao_pico = calcular_vazao_pico()
vazao_ajustada = aplicar_reducao(95)
# Os tres prints permitem comparar os valores vindos de escopos diferentes.
print(f"Vazao de pico local: {vazao_pico} L/min")
print(f"Vazao apos reducao: {vazao_ajustada} L/min")
print(f"Vazao base do sistema: {vazao} L/min")