Introdução à estrutura de dados com Python

Propaganda
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.
Download