Revisão de Funções Simples e Tratamento de Exceções

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Neste laboratório, você aprenderá como revisar a definição de funções simples em Python e explorar o tratamento de exceções. Funções são um conceito fundamental em programação que permite estruturar o código em segmentos reutilizáveis. O tratamento de exceções, por outro lado, é um método para lidar com erros e circunstâncias imprevistas em seus programas.

Os principais objetivos deste laboratório são revisar o processo de definição de funções simples e aprender sobre o tratamento de exceções em Python. O arquivo que será modificado é pcost.py.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 90%. Recebeu uma taxa de avaliações positivas de 97% dos estudantes.

Definindo uma Função

Nesta etapa, vamos aprender como criar uma função. Uma função em Python é um bloco de código organizado e reutilizável que é usado para executar uma única ação relacionada. Aqui, nossa função lerá dados de portfólio de um arquivo e calculará o custo total. Isso é útil porque, uma vez que temos essa função, podemos usá-la várias vezes com diferentes arquivos de portfólio, evitando escrever o mesmo código repetidamente.

Entendendo o Problema

No laboratório anterior, você pode ter escrito algum código para ler dados de portfólio e calcular o custo total. Mas esse código provavelmente foi escrito de uma forma que não pode ser facilmente reutilizada. Agora, vamos converter esse código em uma função reutilizável.

Os arquivos de dados do portfólio têm um formato específico. Eles contêm informações na forma de "Símbolo Ações Preço". Cada linha no arquivo representa uma participação acionária. Por exemplo, em um arquivo chamado portfolio.dat, você pode ver linhas como esta:

AA 100 32.20
IBM 50 91.10
...

Aqui, a primeira parte (como "AA" ou "IBM") é o símbolo da ação, que é um identificador único para a ação. A segunda parte é o número de ações que você possui dessa ação, e a terceira parte é o preço por ação.

Criando a Função

Vamos criar um arquivo Python chamado pcost.py no diretório /home/labex/project. Este arquivo conterá nossa função. Aqui está o código que colocaremos no arquivo pcost.py:

def portfolio_cost(filename):
    """
    Computa o custo total (ações*preço) de um arquivo de portfólio

    Args:
        filename: O nome do arquivo de portfólio

    Returns:
        O custo total do portfólio como um float
    """
    total_cost = 0.0

    ## Abre o arquivo e lê cada linha
    with open(filename, 'r') as f:
        for line in f:
            fields = line.split()
            ## Extrai os dados (símbolo, ações, preço)
            shares = int(fields[1])
            price = float(fields[2])
            ## Adiciona o custo ao nosso total acumulado
            total_cost += shares * price

    return total_cost

## Chama a função com o arquivo portfolio.dat
if __name__ == '__main__':
    cost = portfolio_cost('/home/labex/project/portfolio.dat')
    print(cost)

Neste código, primeiro definimos uma função chamada portfolio_cost que recebe um filename como argumento. Dentro da função, inicializamos uma variável total_cost para 0.0. Em seguida, abrimos o arquivo usando a função open no modo de leitura ('r'). Usamos um loop for para percorrer cada linha do arquivo. Para cada linha, dividimos em campos usando o método split(). Em seguida, extraímos o número de ações e o convertemos em um inteiro, e o preço e o convertemos em um float. Calculamos o custo para essa participação acionária multiplicando o número de ações pelo preço e adicionando-o ao total_cost. Finalmente, retornamos o total_cost.

A parte if __name__ == '__main__': é usada para chamar a função quando o script é executado diretamente. Passamos o caminho para o arquivo portfolio.dat para a função e imprimimos o resultado.

Testando a Função

Agora, vamos executar o programa para ver se ele funciona. Precisamos navegar até o diretório onde o arquivo pcost.py está localizado e, em seguida, executar o script Python. Aqui estão os comandos para fazer isso:

cd /home/labex/project
python3 pcost.py

Após executar esses comandos, você deverá ver a saída:

44671.15

Essa saída representa o custo total de todas as ações no portfólio.

Entendendo o Código

Vamos detalhar o que nossa função faz passo a passo:

  1. Ele recebe um filename como um parâmetro de entrada. Isso nos permite usar a função com diferentes arquivos de portfólio.
  2. Ele abre o arquivo e o lê linha por linha. Isso é feito usando a função open e um loop for.
  3. Para cada linha, ele divide a linha em campos usando o método split(). Este método divide a linha em uma lista de strings com base em espaços em branco.
  4. Ele converte o número de ações em um inteiro e o preço em um float. Isso é necessário porque os dados lidos do arquivo estão em formato de string, e precisamos realizar operações aritméticas neles.
  5. Ele calcula o custo (ações * preço) para cada participação acionária e o adiciona ao total acumulado. Isso nos dá o custo total do portfólio.
  6. Ele retorna o custo total final. Isso nos permite usar o resultado em outras partes do nosso programa, se necessário.

Esta função agora é reutilizável. Podemos chamá-la com diferentes arquivos de portfólio para calcular seus custos, o que torna nosso código mais eficiente e fácil de manter.

Adicionando Tratamento de Erros

Ao trabalhar com dados do mundo real, é muito comum encontrar inconsistências ou erros. Por exemplo, os dados podem ter valores ausentes, formatos incorretos ou outros problemas. Python oferece mecanismos de tratamento de exceções para lidar com essas situações de forma elegante. O tratamento de exceções permite que seu programa continue sendo executado mesmo quando encontra um erro, em vez de travar abruptamente.

Entendendo o Problema

Vamos dar uma olhada no arquivo portfolio3.dat. Este arquivo contém alguns dados sobre um portfólio, como o símbolo da ação, o número de ações e o preço por ação. Para visualizar o conteúdo deste arquivo, podemos usar o seguinte comando:

cat /home/labex/project/portfolio3.dat

Ao executar este comando, você notará que algumas linhas no arquivo têm traços (-) em vez de números para as ações. Aqui está um exemplo do que você pode ver:

AA 100 32.20
IBM 50 91.10
C - 53.08
...

Se tentarmos executar nosso código atual neste arquivo, ele travará. A razão é que nosso código espera converter o número de ações em um inteiro, mas não pode converter um traço (-) em um inteiro. Vamos tentar executar o código e ver o que acontece:

python3 -c "import sys; sys.path.append('/home/labex/project'); from pcost import portfolio_cost; print(portfolio_cost('/home/labex/project/portfolio3.dat'))"

Você verá uma mensagem de erro como esta:

ValueError: invalid literal for int() with base 10: '-'

Este erro ocorre porque o Python não pode converter o caractere - em um inteiro quando tenta executar int(fields[1]).

Introdução ao Tratamento de Exceções

O tratamento de exceções do Python usa blocos try e except. O bloco try contém o código que pode gerar uma exceção. Uma exceção é um erro que ocorre durante a execução de um programa. O bloco except contém o código que será executado se uma exceção ocorrer no bloco try.

Aqui está um exemplo de como os blocos try e except funcionam:

try:
    ## Código que pode gerar uma exceção
    result = risky_operation()
except ExceptionType as e:
    ## Código para lidar com a exceção
    print(f"Ocorreu um erro: {e}")

Quando o Python executa o código no bloco try, se uma exceção ocorrer, a execução salta imediatamente para o bloco except correspondente. O ExceptionType no bloco except especifica o tipo de exceção que queremos tratar. A variável e contém informações sobre a exceção, como a mensagem de erro.

Modificando a Função com Tratamento de Exceções

Vamos atualizar nosso arquivo pcost.py para lidar com erros nos dados. Usaremos os blocos try e except para pular as linhas com dados ruins e mostrar uma mensagem de aviso.

def portfolio_cost(filename):
    """
    Computa o custo total (ações*preço) de um arquivo de portfólio
    Lida com linhas com dados ruins, ignorando-as e mostrando um aviso.

    Args:
        filename: O nome do arquivo de portfólio

    Returns:
        O custo total do portfólio como um float
    """
    total_cost = 0.0

    ## Abre o arquivo e lê cada linha
    with open(filename, 'r') as f:
        for line in f:
            fields = line.split()
            try:
                ## Extrai os dados (símbolo, ações, preço)
                shares = int(fields[1])
                price = float(fields[2])
                ## Adiciona o custo ao nosso total acumulado
                total_cost += shares * price
            except ValueError as e:
                ## Imprime um aviso para linhas que não podem ser analisadas
                print(f"Não foi possível analisar: '{line}'")
                print(f"Motivo: {e}")

    return total_cost

## Chama a função com o arquivo portfolio3.dat
if __name__ == '__main__':
    cost = portfolio_cost('/home/labex/project/portfolio3.dat')
    print(cost)

Neste código atualizado, primeiro abrimos o arquivo e o lemos linha por linha. Para cada linha, dividimos em campos. Em seguida, tentamos converter o número de ações em um inteiro e o preço em um float. Se essa conversão falhar (ou seja, ocorrer um ValueError), imprimimos uma mensagem de aviso e ignoramos essa linha. Caso contrário, calculamos o custo das ações e o adicionamos ao custo total.

Testando a Função Atualizada

Agora, vamos executar o programa atualizado com o arquivo problemático. Primeiro, precisamos navegar até o diretório do projeto e, em seguida, podemos executar o script Python.

cd /home/labex/project
python3 pcost.py

Você deve ver uma saída como esta:

Não foi possível analisar: 'C - 53.08
'
Motivo: invalid literal for int() with base 10: '-'
Não foi possível analisar: 'DIS - 34.20
'
Motivo: invalid literal for int() with base 10: '-'
44671.15

O programa agora faz o seguinte:

  1. Ele tenta processar cada linha do arquivo.
  2. Se uma linha contiver dados inválidos, ele captura o ValueError.
  3. Ele imprime uma mensagem útil sobre o problema.
  4. Ele continua processando o restante do arquivo.
  5. Ele retorna o custo total com base nas linhas válidas.

Essa abordagem torna nosso programa muito mais robusto ao lidar com dados imperfeitos. Ele pode lidar com erros de forma elegante e ainda fornecer resultados úteis.

Experimentação Interativa

Python oferece um modo interativo que permite executar código imediatamente. Isso é super útil para testar seu código e experimentar coisas novas. Nesta etapa, aprenderemos como chamar uma função diretamente do interpretador Python.

Executando Python no Modo Interativo

Para executar um script Python e, em seguida, entrar no modo interativo, você pode usar a flag -i. Essa flag informa ao Python para continuar sendo executado em um estado interativo após a execução do script. Veja como você faz isso:

cd /home/labex/project
python3 -i pcost.py

Vamos detalhar o que este comando faz:

  1. Primeiro, cd /home/labex/project altera o diretório atual para /home/labex/project. É aqui que nosso script pcost.py está localizado.
  2. Em seguida, python3 -i pcost.py executa o script pcost.py. Após a conclusão da execução do script, o Python permanece no modo interativo.
  3. No modo interativo, você pode digitar comandos Python diretamente no terminal.

Após executar o comando, você verá a saída do script pcost.py, seguido pelo prompt do Python (>>>). Este prompt indica que você agora pode inserir comandos Python.

Chamando Sua Função Interativamente

Depois de estar no modo interativo, você pode chamar a função portfolio_cost() com diferentes nomes de arquivos. Isso permite que você veja como a função se comporta com várias entradas. Aqui está um exemplo:

>>> portfolio_cost('/home/labex/project/portfolio.dat')
44671.15
>>> portfolio_cost('/home/labex/project/portfolio2.dat')
19908.75
>>> portfolio_cost('/home/labex/project/portfolio3.dat')
Couldn't parse: 'C - 53.08
'
Reason: invalid literal for int() with base 10: '-'
Couldn't parse: 'DIS - 34.20
'
Reason: invalid literal for int() with base 10: '-'
44671.15

Usando essa abordagem interativa, você pode:

  • Testar sua função com diferentes entradas para ver se ela funciona como esperado.
  • Experimentar o comportamento da função em várias condições.
  • Depurar seu código em tempo real, vendo os resultados imediatos de suas chamadas de função.

Benefícios do Modo Interativo

O modo interativo tem vários benefícios:

  1. Você pode testar rapidamente diferentes cenários sem ter que executar o script inteiro toda vez.
  2. Você pode inspecionar variáveis e resultados de expressões imediatamente, o que ajuda a entender o que está acontecendo em seu código.
  3. Você pode testar pequenos pedaços de código sem criar um programa completo. Isso é ótimo para aprender e experimentar novas ideias.
  4. É uma excelente maneira de aprender e experimentar com Python porque você recebe feedback instantâneo.

Saindo do Modo Interativo

Quando terminar de experimentar, você pode sair do modo interativo de duas maneiras:

  • Digite exit() e pressione Enter. Esta é uma maneira direta de encerrar a sessão interativa.
  • Pressione Ctrl+D (no Unix/Linux). Este é um atalho que também sai do modo interativo.

Ao longo de sua jornada de programação em Python, a técnica de definir funções e testá-las interativamente será extremamente valiosa para desenvolvimento e depuração. Ele permite que você itere rapidamente em seu código e encontre e corrija problemas.

Resumo

Neste laboratório, você aprendeu vários conceitos-chave de programação em Python. Primeiro, você aprendeu como definir e usar funções, o que torna seu código reutilizável. Em segundo lugar, você dominou a implementação do tratamento de exceções, aprimorando a robustez de seus programas. Por fim, você descobriu como usar o Python no modo interativo para testes e experimentação.

Essas habilidades são fundamentais para escrever programas Python confiáveis. As funções ajudam a organizar e reutilizar código, o tratamento de exceções permite o tratamento elegante de situações inesperadas e o modo interativo oferece um ambiente poderoso para testes e depuração. À medida que você avança em seu aprendizado de Python, esses conceitos provarão ser cada vez mais valiosos para o desenvolvimento de aplicações maiores e mais complexas.