Introdução à Linguagem Python
Introdução à Linguagem Python
Python é uma linguagem de programação poderosa e fácil de aprender. Conta com estruturas
de dados eficientes e de alto nível e uma abordagem simples, mas eficaz, para a programação
orientada a objetos. A elegante sintaxe do Python e seu tipagem dinâmica, junto com seu
natureza interpretada, fazem deste um linguagem ideal para scripting e desenvolvimento rápido de
aplicações em diversas áreas e sobre a maioria das plataformas.
O interpretador Python pode ser facilmente estendido com novas funcionalidades e tipos de
dados implementados em C ou C++ (ou outras linguagens acessíveis a partir de C). Python também
pode ser usado como uma linguagem de extensões para aplicações personalizáveis.
O que é Python?
Python é uma linguagem de programação criada por Guido van Rossum no início dos
anos 90 cujo nome está inspirado no grupo de comediantes inglês “Monty Python”. É um
linguagem semelhante ao Perl, mas com uma sintaxe muito limpa e que favorece um código legível.
Trata-se de uma linguagem interpretada ou de script, com tipagem dinâmica, fortemente tipada,
multiplataforma e orientado a objetos.
Linguagem interpretada ou de script
Uma linguagem interpretada ou de script é aquela que é executada utilizando um programa
intermediário chamado intérprete, em vez de compilar o código para linguagem de máquina que possa
compreender e executar diretamente um computador (linguagens compiladas).
A vantagem das linguagens compiladas é que sua execução é mais rápida. No entanto, os
linguagens interpretadas são mais flexíveis e mais portáveis.
Python tem, no entanto, muitas das características das linguagens compiladas, por isso
que se poderia dizer que é semi interpretado. Em Python, como em Java e muitos outros
linguagens, o código-fonte é traduzido para um pseudo código máquina intermediário chamado
bytecode a primeira vez que é executado, gerando arquivos .pyc ou .pyo (bytecode
otimizado), que são os que serão executados em sucessivas ocasiões.
Tipagem dinâmica
A característica de tipagem dinâmica refere-se ao fato de que não é necessário declarar o tipo de dado
que vai conter uma determinada variável, mas seu tipo será determinado em tempo de
execução de acordo com o tipo de valor ao qual é atribuído, e o tipo dessa variável pode mudar se
se lhe atribui um valor de outro tipo.
Fortemente tipado
Não é permitido tratar uma variável como se fosse de um tipo diferente do que tem, é necessário
converter explicitamente essa variável para o novo tipo previamente. Por exemplo, se
temos uma variável que contém um texto (variável do tipo string) não poderemos
tratar ela como um número (somar a cadeia "9" e o número 8). Em outras linguagens o tipo de
a variável mudaria para se adaptar ao comportamento esperado, embora isso seja mais
propenso a erros.
Multiplataforma
O intérprete do Python está disponível em múltiplas plataformas (UNIX, Solaris, Linux,
DOS, Windows, OS/2, Mac OS, etc.) portanto, se não utilizarmos bibliotecas específicas de cada
plataforma nosso programa poderá rodar em todos esses sistemas sem grandes mudanças.
A orientação a objetos é um paradigma de programação no qual os conceitos do mundo
os reais relevantes para o nosso problema são transferidos para classes e objetos em nosso programa. A
A execução do programa consiste em uma série de interações entre os objetos.
Python também permite a programação imperativa, programação funcional e
programação orientada a aspectos.
Por que Python?
Python é uma linguagem que todo mundo deveria conhecer. Sua sintaxe é simples, clara e fácil;
o tipagem dinâmica, o gerenciador de memória, a grande quantidade de bibliotecas disponíveis e a
potência da linguagem, entre outros, fazem com que desenvolver uma aplicação em Python seja
sencillo, muito rápido e, o que é mais importante, divertido.
A sintaxe do Python é tão simples e próxima da linguagem natural que os programas
elaborados em Python parecem pseudocódigo. Por este motivo se trata além de um dos
melhores linguagens para começar a programar.
Python não é adequado, no entanto, para programação de baixo nível ou para aplicações
em que o desempenho é crítico.
Alguns casos de sucesso no uso do Python são Google, Yahoo, a NASA, Indústrias Light
& Magic, e todas as distribuições Linux, nas quais o Python representa cada vez mais uma parte
por cento maior de os programas disponíveis.
Instalação do Python
Jython, IronPython, PyPy, etc. CPython é a mais utilizada, a mais rápida e a mais madura.
Quando as pessoas falam sobre Python, normalmente se referem a esta implementação. Neste caso
tanto o intérprete quanto os módulos estão escritos em C. Jython é a implementação em Java.
de Python, enquanto IronPython é sua contrapartida em C# (.NET). Seu interesse reside em
que utilizando estas implementações se podem utilizar todas as bibliotecas disponíveis para
os programadores de Java e .NET. PyPy, por fim, como vocês devem ter adivinhado pelo nome,
trata-se de uma implementação em Python de Python.
Ferramentas básicas
Existem duas maneiras de executar código Python. Podemos escrever linhas de código no
intérprete e obter uma resposta do intérprete para cada linha (sessão interativa) ou bem
podemos escrever o código de um programa em um arquivo de texto e executá-lo.
Na hora de realizar uma sessão interativa, é aconselhável instalar e utilizar o iPython, em vez de
da console interativa do Python. Pode ser encontrado em[Link]
conta com características adicionais muito interessantes, como o autocompletamento ou o operador
?. (para ativar o recurso de preenchimento automático no Windows é necessário instalar
PyReadline, que pode ser baixado de[Link] moin/PyReadline/Intro)
COLEÇÕES
Nesta parte veremos alguns tipos de coleções de dados: listas, tuplas e dicionários.
Listas
A lista é um tipo de coleção ordenada. Seria equivalente ao que em outras linguagens se
conhece por arrays, ou vetores.
As listas podem conter qualquer tipo de dado: números, cadeias, booleanos, ... e também
listas.
Criar uma lista é tão simples quanto indicar entre colchetes e separados por vírgulas os
valores que queremos incluir na lista:
l = [22, True, "uma lista", [1, 2]]
Podemos acessar cada um dos elementos da lista escrevendo o nome da lista e
indicando o índice do elemento entre colchetes. Tenha em mente, no entanto, que o índice
do primeiro elemento da lista é 0, e não 1:
l = [11, False]
mi_var = l[0] # mi_var vale 11
Se quisermos acessar um elemento de uma lista incluída dentro de outra lista, teremos que
utilizar duas vezes este operador, primeiro para indicar a que posição da lista exterior
queremos acessar, e o segundo para selecionar o elemento da lista interna:
l = [“una lista”, [1, 2]]
mi_var vale 1
O uso de colchetes para acessar e modificar os elementos de uma lista é comum em
muitos idiomas, mas Python nos reserva várias surpresas muito agradáveis.
Uma curiosidade sobre o operador [] do Python é que podemos usar também números.
negativos. Se um número negativo for utilizado como índice, isso se traduz em que o índice
comece a contar do final para a esquerda; ou seja, com [-1] acessaríamos o último
elemento da lista, com [-2] ao penúltimo, com [-3] ao antepenúltimo, e assim por diante.
Tuplas
Tudo o que se aplica às listas pode ser utilizado também às tuplas, exceto pela
forma de defini-la, para o que se utilizam parênteses em lugar de colchetes.
t = (1, 2, True, “python”)
Na verdade, o construtor da tupla é a vírgula, não o parêntese, mas o intérprete mostra
os parênteses, e nós deveríamos utilizá-los, por clareza.
> t = 1, 2, 3
>>> tipo(t)
tipo 'tupla'
Além disso, é necessário adicionar uma vírgula para tuplas de um só.
elemento, para diferenciá-lo de um elemento entre parênteses.
(1)
>>> tipo(t) tipo "int"
>>> t = (1,)
>>> tipo(t)
tipo "tupla"
Para nos referirmos a elementos de uma tupla, como em uma lista, usa-se o operador []:
t[0] # mi_var é 1
(1, 2)
Podemos utilizar o operador [] porque as tuplas, assim como as listas, fazem parte
de um tipo de objetos chamados sequências.
olá mundo
c[0] # h
mundo
c[::3] # hauo
Voltando ao tema das tuplas, sua diferença em relação às listas reside no fato de que as tuplas não possuem
esses mecanismos de modificação através de funções tão úteis das quais falávamos ao
final da seção anterior.
Além disso, são imutáveis, ou seja, seus valores não podem ser modificados uma vez criados; e têm
um tamanho fixo.
Dicionários
Os dicionários, também chamados de matrizes associativas, devem seu nome ao fato de que são
coleções que relacionam uma chave e um valor. Por exemplo, vamos ver um dicionário de
filmes e diretores
Richard Curtis
Matar Bil
Jean-Pierre Jeunet
O primeiro valor refere-se à chave e o segundo ao valor associado à chave. Como chave
podemos utilizar qualquer valor imutável: poderíamos usar números, strings, booleanos,
tuplas, … mas não listas ou dicionários, uma vez que são mutáveis. Isso ocorre porque os diccionários
Cenários são implementados como tabelas hash, e na hora de introduzir um novo par chave-valor
no dicionário, calcula-se o hash da chave para depois poder encontrar a entrada
correspondente rapidamente. Se o objeto chave fosse modificado depois de ter sido
introduzido no dicionário,
A principal diferença entre dicionários e listas ou tuplas é que os valores
armazenados em um dicionário, acessa-se não pelo seu índice, porque na verdade eles não têm
ordem, exceto por sua chave, utilizando novamente o operador [].
Richard Curtis
Assim como em listas e tuplas, este operador também pode ser usado para reatribuir valores.
Quentin Tarantino
No entanto, neste caso não é possível utilizar slicing, entre outras coisas porque os
dicionários não são sequências, e sim mapeamentos (mapeados, associações).
CONTROLE DE FLUXO
Nesta seção, vamos ver os condicionais e os loops.
Sentenças condicionais
Se
A forma mais simples de um estado condicional é um if (do inglês if) seguido de uma
condição a avaliar, dois pontos (:) e na linha seguinte, indentado, o código a executar em
caso de que se cumpra essa condição.
[Link]
se (if) fav é igual a “[Link]”
se fav == "[Link]":
Você tem bom gosto!
print "Obrigado"
É importante garantir que o código seja indentado exatamente como foi feito no exemplo, ou seja,
certifiquem-se de pressionar Tabulação antes dos dois comandos print, uma vez que esta é a forma de
Python saber que a sua intenção é que os dois print sejam executados apenas no caso
de que se cumpra a condição, e não a de que se imprima a primeira cadeia se se cumpre a
condição e a outra sempre, coisa que se expressaria assim:
se fav == "[Link]":
Você tem bom gosto!
Obrigado
Em outras linguagens de programação, os blocos de código são determinados ao serem encerrados entre
chaves, e o indentá-los não é mais do que uma boa prática para que seja mais simples
seguir o fluxo do programa com um só golpe de vista.
se … senão
O que faríamos se quiséssemos que certas ordens fossem executadas no caso de que a
condição não se cumprisse? Sem dúvida poderíamos adicionar outro if que tivesse como condição a
negação do primeiro:
se fav == "[Link]":
Você tem bom gosto!
print "Obrigado"
se fav != "[Link]":
Vá, que pena
mas o condicional tem uma segunda construção muito mais útil:
se fav == "[Link]":
Você tem bom gosto!
print "Obrigado"
senão:
Vá, que pena
Vemos que a segunda condição pode ser substituída por um else
se … senão se … senão se … caso contrário
se numero < 0:
print "Negativo"
elif numero > 0:
imprimir "Positivo"
senão:
Cero
elif é uma contração de else if, portanto elif numero > 0 pode ser lido como “se não, se
número é maior que 0”. Ou seja, primeiro se avalia a condição do if. Se for verdadeira, se
executa seu código e continua executando o código posterior à condição; se não for cumprida,
a condição do elif é avaliada. Se a condição do elif for verdadeira, seu código é executado e
continua executando o código posterior à condição; se não for cumprido e houver mais de um elif
continua com o seguinte na ordem de aparição. Se a condição do if não for cumprida nem de
nenhum dos elif, o código do else é executado.
A se C else B
Também existe uma construção semelhante ao operador ? de outros idiomas, que não é mais que
uma forma compacta de expressar um if else. Nesta construção, avalia-se o predicado C e
retorna A se for verdadeiro ou B se não for: A se C, caso contrário B. Vamos ver um exemplo:
par
Laços
Enquanto os condicionais nos permitem executar diferentes fragmentos de código
dependendo de certas condições, os loops nos permitem executar o mesmo fragmento
de código um certo número de vezes, enquanto uma determinada condição for atendida.
Enquanto
O loop while (enquanto) executa um fragmento de código enquanto uma condição for verdadeira.
edad = 0
enquanto idade < 18:
idade = idade + 1
print "Felicidades, tienes " + str(edad)
A variável idade começa valendo 0. Como a condição de que idade é menor que 18 é
certa (0 é menor que 18), entra-se no loop. A idade é aumentada em 1 e a mensagem é impressa
informando que o usuário completou um ano. Lembre-se de que o operador + para as
cadenas funciona concatenando ambas cadenas. É necessário utilizar a função str (destring,
cadeia) para criar uma cadeia a partir do número, dado que não podemos concatenar números
y cadeias.
Outra palavra-chave que podemos encontrar dentro dos loops é continue (continuar).
Como vocês devem ter adivinhado, não faz outra coisa senão passar diretamente para a próxima iteração do
bucle.
edad = 0
enquanto idade < 18:
idade = idade + 1
se idade % 2 == 0:
continuar
print "Felicidades, tienes " + str(edad)
para … em
Em Python, for é utilizado como uma forma genérica de iterar sobre uma sequência. E como tal
tenta facilitar seu uso para este fim.
secuencia = [“uno”, “dos”, “tres”]
para elemento em sequência:
imprimir elemento
Como dissemos, os for são utilizados em Python para percorrer sequências, por isso vamos
Utilizar um tipo de sequência, como é a lista.
36
FUNÇÕES
Uma função é um fragmento de código com um nome associado que realiza uma série de
tarefas e retorna um valor. Para os fragmentos de código que têm um nome associado e não
valores de retorno geralmente são chamados de procedimentos. Em Python, não existem os procedimentos-
tos, já que quando o programador não especifica um valor de retorno a função devolve o
valor None (nada), equivalente ao null do Java.
Em Python, as funções são declaradas da seguinte forma:
def minha_função(param1, param2):
imprimir param1
imprimir param2
ORIENTAÇÃO A OBJETOS
Classes e objetos
Para entender este paradigma primeiro temos que compreender o que é uma classe e o que é um
objeto. Um objeto é uma entidade que agrupa um estado e uma funcionalidade relacionadas. O
o estado do objeto é definido através de variáveis chamadas atributos, enquanto que a
a funcionalidade é modelada através de funções a que se conhece pelo nome de
métodos do objeto.
Em Python, as classes são definidas pela palavra-chave class seguida pelo nome da
clase, dois pontos (:) e a seguir, indentado, o corpo da classe. Como no caso de
as funções, se a primeira linha do corpo for uma string de texto, essa será a string
de documentação da classe ou docstring.
O primeiro que chama a atenção no exemplo anterior é o nome tão curioso que tem.
o método __init__. Este nome é uma convenção e não um capricho. O método __init__,
com uma dupla barra baixa no início e no final do nome, é executado logo após criar um
novo objeto a partir da classe, processo que é conhecido pelo nome de instanciação. O
o método __init__ serve, como sugere seu nome, para realizar qualquer processo de
inicialização que seja necessário. Como vemos o primeiro parâmetro de __init__ e do resto de
métodos. da classe é sempre self.
Este mecanismo é necessário para poder acessar os atributos e métodos do objeto
diferenciando, por exemplo, uma variável local mi_var de um atributo do objeto self.mi_var.
Herança
Há três conceitos que são básicos para qualquer linguagem de programação orientada a
objetos: o encapsulamento, a herança e o polimorfismo.
Em uma linguagem orientada a objetos, quando fazemos uma classe (subclasse) herdar de outra
classe (superclasse) estamos fazendo com que a subclasse contenha todos os atributos e métodos
que tinha a superclasse. No entanto, ao ato de herdar de uma classe também se chama a
menudo “extender uma classe”.
Para indicar que uma classe herda de outra, coloca-se o nome da classe da qual se herda
entre parênteses depois do nome da classe:
Herança múltipla
Em Python, ao contrário de outras linguagens como Java ou C#, é permitida a herança múltipla.
ou seja, uma classe pode herdar de várias classes ao mesmo tempo. Por exemplo, poderíamos ter uma
classe Jacaré que herdará da classe Terrestre, com métodos como andar() e atributos
como velocidade_andar e da classe Aquático, com métodos como nadar() e atributos como
velocidade_nadar. Basta enumerar as classes das quais se herda, separando-as por vírgulas:
Polimorfismo
A palavra polimorfismo, do grego poly morphos (várias formas), refere-se à habilidade
de objetos de distintas classes responderem à mesma mensagem. Isso pode ser conseguido a
através da herança: um objeto de uma classe derivada é ao mesmo tempo um objeto de a
classe pai, de forma que onde se requerir um objeto da classe pai também se pode
utilizar um da classe filha.
Python, por ser de tipagem dinâmica, não impõe restrições aos tipos que podem ser passados.
a uma função, por exemplo, além de que o objeto se comporte como se espera: se vai a
chamar um método f() do objeto passado como parâmetro, por exemplo, evidentemente o
o objeto terá que contar com esse método. Por esse motivo, ao contrário de linguagens de tipagem
estático como Java ou C++, o polimorfismo em Python não é de grande importância.
Encapsulamento
A encapsulação refere-se a impedir o acesso a determinados métodos e atributos de
objetos estabelecendo assim o que pode ser utilizado de fora da classe.
Isso é conseguido em outras linguagens de programação como Java utilizando modificadores de
acesso que definem se qualquer um pode acessar essa função ou variável (público) ou se está
restringido o acesso à própria classe (privado).
Em Python não existem modificadores de acesso, e o que geralmente se faz é que o acesso a
uma variável ou função é determinado pelo seu nome: se o nome começa com dois
guiones bajos (e não termina também com dois guiones bajos) se trata de uma variável ou função
privada, caso contrário é pública.
Módulos e Pacotes
Módulos
Para facilitar a manutenção e a leitura, os programas muito longos podem ser divididos.
em módulos, agrupando elementos relacionados. Os módulos são entidades que permitem
uma organização e divisão lógica do nosso código. Os arquivos são sua contraparte física:
cada arquivo Python armazenado no disco equivale a um módulo.
Vamos a criar nosso primeiro módulo, então criando um pequeno arquivo [Link] com
o seguinte conteúdo:
Pacotes
Se os módulos servem para organizar o código, os pacotes servem para organizar os
módulos. Os pacotes são tipos especiais de módulos (ambos são do tipo módulo) que
permitam agrupar módulos relacionados. Enquanto os módulos correspondem a nível físico
com os arquivos, os pacotes são representados por diretórios.
Para fazer com que o Python trate um diretório como um pacote, é necessário criar um arquivo
__init__.py nesta pasta. Neste arquivo, podem ser definidos elementos que pertencem a
dicho pacote, como uma constante DRIVER para o pacote bbdd, embora normalmente se
tratará de um arquivo vazio. Para fazer com que um certo módulo esteja dentro de um
pacote, basta copiar o arquivo que define o módulo para o diretório do pacote.
Como os módulos, para importar pacotes também se utiliza import e from-import e o
caracter . para separar pacotes, subpacotes e módulos.
Entrada/Saída e Ficheiros
Entrada padrão
A forma mais simples de obter informações do usuário é por meio da função
entrada_bruta
Saída padrão
A forma mais simples de mostrar algo na saída padrão é por meio do uso da sentença
imprimir, como hemos visto multitud de veces en ejemplos anteriores. En su forma más básica a
a palavra-chave print é seguida por uma string, que será exibida na saída padrão ao ser executada
o estamento.
Os especificadores mais simples são formados pelo símbolo % seguido de uma letra que
indica o tipo com o qual formatar o valor Por exemplo:
Arquivos
Os arquivos em Python são objetos do tipo file criados através da função open (abrir). Este
a função toma como parâmetros uma string com o caminho para o arquivo a ser aberto, que pode ser relativo
o absoluta; uma cadeia opcional indicando o modo de acesso (se não for especificado, acessa-se
em modo leitura) e, por fim, um inteiro opcional para especificar um tamanho de buffer
distinto do utilizado por padrão.
O modo de acesso pode ser qualquer combinação lógica dos seguintes modos:
r’• : ler, leitura. Abre o arquivo em modo leitura. O arquivo deve existir
previamente, caso contrário, será lançada uma exceção do tipo IOError.
'w'• : escrever, escrita. Abra o arquivo no modo de escrita. Se o arquivo não existir, ele
cria. Se existir, sobrescreva o conteúdo.
'a': anexar, adicionar. Abre o arquivo em modo de escrita. Difere do modo 'w' em
que neste caso não se sobrepõe o conteúdo do arquivo, mas sim se começa
a escrever ao final do arquivo.
binário
'+'• : permite leitura e escrita simultâneas.
‘U’• : newline universal, saltos de linha universais. Permite trabalhar com arquivos que
tenha um formato para as quebras de linha que não coincide com o da plataforma
atual (no Windows usa-se o caractere CR LF, no Unix LF e no Mac OS CR).
Leitura de arquivos
Para a leitura de arquivos, são utilizados os métodos read, readline e readlines.
Escrita de arquivos
Para a escrita de arquivos, são utilizados os métodos write e writelines. Enquanto o
primeiro funciona escrevendo em um arquivo uma cadeia de texto que é tomada como
parâmetro, o segundo usa como parâmetro uma lista de cadeias de texto indicando
as linhas que queremos escrever no arquivo.
CONCLUSÕES
1. Linguagem muito parecida com Pseudocódigo, bastante limpa com uma sintaxe legível por sua
gran parecido ao linguagem natural.
2. Recomendado para começar a programar
3. É uma linguagem de muito alto nível que pode ser utilizada em diferentes plataformas e para
diferentes tipos de aplicações.
4. Linguagem fácil de entender, distribuir mesmo em uso comercial.