Introdução à estrutura de dados com Python CLEIBSON APARECIDO DE ALMEIDA UFPR – Universidade Federal do Paraná PPGMNE – Programa de Pós Graduação em Métodos Numéricos em Engenharia Centro Politécnico – CEP 81.531-980 Curitiba (PR) [email protected] Resumo: Este material é uma breve apresentação sobre a utilização da linguagem Python para a criação de programas autônomos utilizados em pesquisas científicas. São apresentados os principais conceitos da linguagem com a solução de exemplos objetivando facilitar o entendimento do leitor em relação ao uso dos operadores, controle de fluxo, tipos de dados e manipulação de arquivos de texto. Detalhes avançados da linguagem podem ser encontrados no site oficial do Python. Palavras Chaves: programação, computadores, Python. 1 Introdução O Python é uma linguagem de programação de computadores de fonte aberta, orientada a objetos e de uso geral. É geralmente utilizada em programas autônomos, assim como para aplicações de script, em uma grande variedade de domínios e por centenas de milhares de programadores [Lutz, (2006)]. Apesar de ser uma linguagem de programação poderosa, o Python é de fácil aprendizado. Sua principal característica é uma estrutura de dados alto-nível eficientes onde tudo é um objeto e aquilo que não existe na estrutura padrão da linguagem pode ser facilmente importado. Sua sintaxe elegante e tipagem dinâmica, em adição à sua natureza interpretada, tornam o Python ideal para programar métodos matemáticos para funcionar na maiorias dos sistemas operacionais existentes no mercado. O interpretador de Python e sua extensa biblioteca padrão podem ser obtidas gratuitamente no site HTTP://www.python.org e outras extensões podem ser encontradas na internet, sendo estas disponibilizadas por programadores de diversas localidades do mundo. Neste paper será apresentado uma introdução à estrutura de dados e exemplos utilizando os comandos de controle de fluxo, uso de dicionários e leitura de dados. 1.1 Recursos utilizados Na criação deste material foram utilizados os seguintes recursos computacionais: • Sistema Operacional Windows Xp; • Aptana Studio 1.2: Conforme figura 1, o Aptana Studio é uma plataforma para programação em diversas linguagens. Para programar em Python é necessário instalar o complemento PyDev e também o PyDev Extensions. Usuários do Linux podem utilizar os mesmos recursos com a plataforma Eclipse; • Interpretador Python 2.6: O interpretador do Python pode ser adquirido gratuitamente na seção downloads do site WWW.python.org. Além do interpretador você poderá fazer downloads de editores, manuais e referência e acessar dicas online sobre programação. Figura 1: Interface da plataforma Aptana Studio 2 Estrutura de Dados Programas em Python são digitados em um editor de texto e interpretados/executados via prompt de comandos do sistema operacional. Outra forma de criar programas é utilizar alguma IDE com suporte à interpretação e execução dos programas em Python. O Python é diferente de outras linguagens devido a alguns aspectos: 2.1 • Os blocos de comandos são delimitados por indentação 1 . Em outras linguagens os blocos são geralmente delimitados por chaves { } ou outro caractere, indicando inicio e fim do comando. • Um programa em Python não precisa ser compilado para execução, ou seja, o programa é interpretado em tempo de execução. Os resultados das rotinas, bem como os erros provenientes dos erros de programação são exibidos diretamente na tela durante sua execução. • Programas em Python não são organizados em cabeçalho e corpo, ou seja, as variáveis podem ser declaradas em qualquer ponto do programa desde que sejam utilizadas após a sua declaração. Sintaxe da Linguagem As regras gerais para escrever programas em Python resumem-se aos comentários, declaração das variáveis, fluxo de controle, blocos, instruções e exibição dos dados. Comentários: Os comentários começam com # e se expandem até o fim da linha, ignorando o que está escrito após a presença do caractere #. Declaração das variáveis: Variáveis numéricas são diretamente declaradas após o caractere ( = ) e variáveis de texto (strings) são declaradas da mesma forma, porém entre aspas duplas ( “ ). Outras formas de declaração serão mostradas no tópico seguinte onde serão apresentados tipos de dados especiais como listas e dicionários. Fluxo de controle: As instruções executam-se uma após a outra, a menos que sejam utilizadas estruturas de fluxo como (if, while, for, etc). Estruturas de controle de fluxo são facilmente notadas através da indentação do código. Blocos: Um bloco é delimitado através da indentação de todas as suas instruções pela mesma quantidade, com espaços ou tabulações. Uma tabulação conta espaços suficientes para mover a coluna para um múltiplo de 8. Os blocos podem aparecer na mesma linha de um cabeçalho de instrução, se forem instruções simples. Instruções: Uma instrução termina no fim de uma linha, mas pode continuar por diversas linhas se uma linha física terminar com /, ( ) aberto, [ ] ou um par de { }, ou uma string com três aspas abertas. Diversas instruções simples podem aparecer em uma linha, se forem separadas por ponto e vírgula ( ; ). 1 Indentação: É um espaçamento utilizado para dar visibilidade aos comandos pertencentes a um bloco de execução em programas de computadores. Exibição dos dados: Para exibir o valor de uma variável é utilizado o comando print sucedido pelo nome da variável. A concatenação entre variáveis e textos informativos é feita utilizando o caractere %d para valores numéricos e %s para textos. Exemplo: Crie um programa onde são informadas duas variáveis numéricas e uma string. Após isso as variáveis numéricas serão comparadas entre si e será exibido na tela o resultado dessa comparação e a soma entre elas. Depois deverá ser exibido o texto contido na string. Solução: # coding: latin-1 # A linha acima é utilizada para a correta exibição dos acentos num1=40;num2=30 string1="FELICIDADE" if num1<num2:#A linha abaixo deverá ser indentada print 'O primeiro número informado é %d e é menor que %d. A soma entre elas é %d.' %(num1, num2, num1+num2) #Perceba a concatenação else: print 'O primeiro número informado é %d e não é menor que %d. A soma entre elas é %d.' %(num1, num2, num1+num2) print 'O texto informado é %s.' % (string1) 2.2 Tipos de Dados Basicamente os tipos de dados em Python resumem-se em tipos simples (numérico e texto) e tipos compostos (lista, tupla e dicionário). O Python utiliza checagem dinâmica de dados, isto é, uma variável pode conter valores de diversos tipos em diferentes momentos da execução do programa. Por este motivo não há necessidade de declarar o tipo de variável durante a declaração. O interpretador Python se encarregará de definir qual é o tipo da variável, verificando seu conteúdo em tempo de execução. Ainda assim é possível fazer uma conversão explicita do tipo de variável utilizando casting. Exemplo: Crie uma variável que implicitamente o Python definirá como tipo inteiro e faça casting para exibir na tela a mesma variável no tipo float. Faça o mesmo para que uma variável implitamente definida como float seja exibida como tipo inteiro. Solução: num3=90 print float(num3)#Esta é uma conversão por casting (inteiro para float) num4=34.90 print int(num4)#Esta é uma conversão por casting (float para inteiro) Tipo numérico: Tipos numéricos representam valores numéricos. Em Python há alguns tipos numéricos pré-definidos: inteiros (int), números de ponto flutuante (float), booleanos (bool) e complexos (complex). Estes tipos suportam as operações matemáticas comuns como adição, subtração, multiplicação e divisão, e podem ser convertidos entre si. Exemplo: var1=10 #valor inteiro var2=10.15 #valor float (ponto flutuante) var3=3+9j #valor complexo var4=True #valor booleano var5=0X66 #valor hexadecimal Tipo texto (string): O tipo texto é uma sequencia imutável utilizado para armazenar uma cadeias de caracteres. Na definição da uma string, a cadeia de caracteres pode ser delimitada por aspas simples ( ‘ ) ou por aspas duplas ( “ ). Exemplo: texto1='Esse material está acabando com minhas noites' texto2="Estou com muito sono" Listas: A lista é uma seqüência de dados: um conjunto linear (similar ao vetor em outras linguagens) de valores indexados por um número inteiro. Os índices começam em zero e são atribuídos seqüencialmente um a um à partir deste. A lista pode conter quaisquer valores, incluindo valores de tipos mistos, e até outras listas. Para criar uma lista, usamos colchetes e vírgulas para enumerar os valores. Exemplo: lista1 = [1, 2, 3, 4] #lista de números lista2 = ["aceito", "recusado", "pendente", "na"] #lista de strings lista3 = [93, 94, 95, 96, 97, "Corsa", "Astra"] #lista mista lista4 = [lista1, lista2] #lista de listas Tuplas: A tupla é um tipo especial de lista com o objetivo de armazenar um conjunto de elementos acessíveis por um índice inteiro. As tuplas, assim como as strings são tipos de dados imutáveis (não se altera) e pode ser utilizada para indexar elementos de um dicionário, listar argumentos de uma função e em alguns casos criar uma lista com elementos fixos. Exemplo: tupla1= 24, 25, 26 #tupla com números tupla2= tupla1, ("Joao","Maria","Jose") #tupla aninhada Dicionários: Os dicionários são também chamados de “vetores de associação” e diferenciam-se das listas por não serem indexados por inteiros, ou seja, os dicionários são indexados por chaves (Keys). As principais operações realizadas com esse tipo de estrutura são o armazenamento e a recuperação de informações a partir dessas chaves. Os dicionários são delimitados pelo caractere chaves { } e a chave de acesso é separada do seu conteúdo pelo caractere dois pontos ( : ). Exemplo: dic1={'marca1':'renault', 'marca2':'ford', 'marca3':'fiat'} dic2={'marca1':'megane', 'marca2':'fokus', 'marca3':'siena', 'marca3':'punto'} 2.3 Operadores No Python existem várias categorias de operadores, porém neste material serão apresentados os operadores aritméticos, operadores de atribuição, operadores aritméticos de atribuição, operadores de comparação e operadores lógicos. Nas tabelas abaixo serão listadas cada uma dessas categorias. Tabela 1: Operadores aritméticos Operador + * / % ** Descrição Soma dois valores numéricos Subtrai dois valores numéricos Multiplica dois valores numéricos Divide dois valores numéricos Exibe o resto de uma divisão Calcula a potência no formato xy Exemplo 20 + 90 = 110 90 – 20 = 70 2 * 8 = 16 8/2=4 8%3=2 2 ** 3 = 8 Tabela 2: Operadores de atribuição Operador Descrição = Atribui valor em uma variável Exemplo var = 23 Tabela 3: Operadores aritméticos de atribuição Operador += -= *= /= Descrição Soma e atribui valor em uma variável Subtrai e atribui valor em uma variável Multiplica e atribui valor em uma variável Divide e atribui valor em uma variável Exemplo var1 += var2 var1 -= var2 var1 *= var2 var1 /= var2 Tabela 4: Operadores de comparação Operador Descrição == Compara igualdade entre duas variáveis <= Verifica se uma variável é menor ou igual a outra >= Verifica se uma variável é maior ou igual a outra < Verifica se uma variável é menor que outra > Verifica se uma variável é maior que outra != Compara diferença entre duas variáveis Exemplo var1 == var2 var1 <= var2 var1 >= var2 var1 < var2 var1 > var2 var1 != var2 Tabela 5: Operadores lógicos Operador Descrição and Verifica se x é verdadeiro, caso seja, y também é verdadeiro or Verifica se x é verdadeiro, caso seja, y é falso is Verifica a integridade do conteúdo de uma variável (retorno correto) is not Verifica se a integridade do conteúdo de uma variável está corrompida not Verifica a falsa integridade do conteúdo de uma variável (retorno invertido) && Verifica se uma condição e outra são atendidas || Verifica se uma condição ou outra são atendidas Exemplo x and y x or y var1 is 10 var1 is not 10 not var1 var1==2 && var2==3 var1==2 || var2==3 2.4 Controle de fluxo Toda linguagem, e o Python não é diferente, necessita de mecanismos para controlar o fluxo do programa, sem os quais seria impossível implementar uma lógica qualquer de forma rápida e sem necessidade de recursos avançados com algoritmos. Aqui serão abordadas as instruções if-else, while e for e serão apresentados exemplos com soluções para cada um desses itens. Instrução if-else: A instrução if é uma das mais importantes em qualquer linguagem de programação, pois permite que grupos de comandos sejam executados conforme o resultado de uma expressão ou de múltiplas expressões. Sintaxe: if condição: comandos else: comandos Exemplo: Crie um programa para verificar a idade dos freqüentadores de uma discoteca. Caso a idade seja menor que 18 anos, o usuário receberá a mensagem de que a entrada é proibida. Solução: idade=20 if idade<18: print "Sua entrada está proibida porque você é menor de idade." else: print "Você tem mais de 18 anos. Pode entrar." Instrução while: A estrutura while (também conhecida como laço de repetição) executa um grupo de comandos repetidas vezes, enquanto uma determinada condição for verdadeira. Quando for detectado o rompimento da veracidade desta condição, o fluxo dentro da estrutura while é interrompido e a execução do programa retorna na próxima linha após o fim deste laço de repetição. Sintaxe: while condição: comandos else: comandos Exemplo: Crie um programa que mostre todos os números pares menores que 100 e maiores que um número informado pelo usuário. Solução: inicio=20 while inicio<=100: if inicio%2==0: print inicio inicio=inicio+1 else: print "O numero inicial é maior que 100" Instrução for: A estrutura for realiza repetições (loops) de forma mais complexa do que o while, porém sua sintaxe é resumida facilitando o trabalho do programador. Sintaxe: for alvo in sequencia: comandos else: comandos Exemplo: Crie um programa que mostre todos os números ímpares menores que 100 e maiores que um número inicial informado na sequência delimitadora do laço. Solução: for comeco in range(20,100):#perceba que o laço inicia em 20 e vai até 100 if comeco%2!=0: print comeco comeco=comeco+1 else: print "O número inicial é maior que 100" 3 Manipulação de arquivos A função predefinida open cria um objeto de arquivo para manipulação dentro dos programas em Python. Dessa forma essa função permite abrir um arquivo externo, realizar modificações, executar cálculos com as informações carregadas e gravar os resultados em um outro arquivo posteriormente. 3.1 Arquivos de entrada Você pode abrir e usar arquivos para leitura e escrita criando um objeto da classe file e usando seus métodos read, readline ou write para ler ou escrever no arquivo. A técnica para ler ou escrever no arquivo dependem do modo especificado quando os arquivos são lidos. Para fechar um arquivo deve ser utilizado o método close. A seguir serão mostrados cada um dos objetos utilizados para abrir arquivos no Python. open(‘arquivo.txt’, ‘r’): Cria um arquivo de entrada (‘r’ indica que a leitura será permitida). A string de nome do arquivo ‘arquivo.txt’ mapeia para o diretório ativo, a menos que seja utilizado o prefixo completo do endereço do arquivo (‘c:\\python\\arquivo.txt). read(): Lê o arquivo inteiro, retornando seu conteúdo como uma string simples. Em modo de leitura (‘r’), os fins de linha são entendidos como ‘\n’, ou seja, será lido a linha inteira e a seguir irá pular para a próxima linha automaticamente. readline(): Lê a próxima linha. readlines(): Lê o arquivo inteiro numa lista de strings de linha. close(): Fecha o arquivo. Exemplo: Considere o conjunto de dados da Tabela 6. Há o interesse no cálculo do IMC (índice de massa corporal) de cada um dos indivíduos. Faça este cálculo e exiba os resultados na tela. Tabela 6: Peso e altura de indivíduos Amostra 1 2 3 4 5 6 7 8 9 Peso(kg) 80 78 67 79 92 69 87 75 71 Altura(cm) 178 171 157 173 198 167 177 170 167 10 82 190 Solução: # coding: latin-1 f = open('dados.txt', 'r') # abre para leitura ('r'eader) for line in f: print line[0]+line[1] #exibe na tela as coluna 0 e 1 (numero da amostra) peso = line[3]+line[4] #grava em peso as colunas 3 e 4 (peso) altura = line[6]+line[7]+line[8] #grava em altura as colunas 6, 7 e 8 (altura) peso = float(peso) #conversão por casting, pois os dados lidos são strings altura = float(altura) #conversão por casting, pois os dados lidos são strings altura = altura/100 #transformação da altura cm -> mt imc = peso / altura**2 #calculo do imc print imc #exibição do resultado na tela f.close() 3.2 Arquivos de saída Para trabalhar com arquivos de saída são utilizados os mesmos métodos utilizados anteriormente, porém com algumas diferenças em seus argumentos. open (‘c:\\temp’, ‘w’): Cria um arquivo de saída no diretório setado no primeiro argumento e o argumento ‘w’ indica que poderão ser gravadas modificações no arquivo. write(dados): Grava a string dados para o arquivo, na posição atual ou ao final do arquivo, dependendo do modo de abertura. Esta função falha se o arquivo foi aberto com modo (`r'). Exemplo: Escreva um texto qualquer e salve-o em um arquivo no formato txt utilizando Pyhton. Solução: # coding: latin-1 dadosgravados="Teste de gravação" # texto que será gravado f = file('dadosgravados.txt', 'w') # abre para escrita ('w'riting) f.write(dadosgravados) # escreve no arquivo f.close() # fecha o arquivo f = file('dadosgravados.txt') # se nenhum modo é especificado, o modo de # escrita ('r'ead) é assumido por padrão while True: line = f.readline() if len(line) == 0: # Zero indica fim de arquivo (EOF) break print line, # Observe a vírgula para evitar a adição automática # de um caractere de nova linha f.close() # fecha o arquivo 4 Referências Lutz, M. “Guia de Programação Python”. Alta Books, 2006. Lutz, M. & Ascher, D. “Aprendendo Python”. Bookman, 2001. Lutz, M. & Ascher, D. “Programing Python”. Bookman, 2001. Rossum. G. V. “The Python Tutorial”. Python Software Foundation, 2005.