Python

De ROMHackingWiki

Python é uma linguagem de programação interpretada, interativa, orientada a objetos, de tipagem dinâmica e forte.

A linguagem combina uma sintaxe concisa e clara com os recursos poderosos de sua biblioteca padrão e por módulos e frameworks desenvolvidos por terceiros.

Tabela de conteúdo

História

A linguagem foi criada por Guido van Rossum em 1990 na Holanda como uma linguagem de scripts para o sistema operacional distribuído Amoeba a partir da linguagem ABC, que tinha um foco em usuários como físicos, engenheiros e lingüistas.

Hoje é usada em diversas áreas, como servidores de aplicação e computação gráfica. Está disponível como linguagem script em aplicações como OpenOffice (Python UNO Bridge) e pode ser utilizado em Stored Procedures no banco de dados PostgreSQL (PL/Python).

O nome Python teve a sua origem no grupo humorístico britânico Monty Python, criador do programa Monty Python's Flying Circus, embora muitas pessoas façam associação com o réptil do mesmo nome (em português, Píton).

Características

  • Tipos dinâmicos de variáveis, retornos de funções e parâmetros, que são inferidos pelo interpretador. A tipagem tambem é forte, pois os valores e objetos têm tipos bem definidos e não sofrem coerções como em linguagem C ou Perl.
  • Orientada a objetos ainda que suporte outros paradigmas, como a programação funcional e modular.
  • Coletor de lixo automático, gerência de memória pelo interpretador, semelhante como Ruby, Perl e Tcl.
  • Portável, disponível para praticamente qualquer sistema operacional.
  • Extensível para implementação em conjunto com outras linguagens, como C.

Interpretador interativo

O interpretador interativo é uma característica diferencial da linguagem, porque há a possibilidade de testar e modificar o código de um programa antes de iniciar a compilação ou incluí-las nos programas, por exemplo:

Ao incluir uma função, o interpretador já nos gera o resultado:

...
>>> 1+1
>>> 2
>>>
>>> a = 1+1
>>> print a
>>> 2

Análise léxica

Arquivo:Python script.svg
Exemplo de script

No capítulo 2 do Manual de Referência da Linguagem Python diz que a análise léxica é uma análise do interpretador em sí, os programas são lidos por um parser, que divide o código em tokens.

Todo programa é dividido em linhas lógicas que é separada pelo token NEWLINE ou NOVA LINHA, as linhas físicas são trechos de código divididos pelo caracter ENTER. Linhas lógicas não podem ultrapassar linhas físicas com exceção de junção de linhas, por exemplo:

if resultado > 2 \
and 1 <= 5 \
and 2 < 5
print ('Resultado: %f') % (d)

ou

meses_do_ano = ['janeiro', 'fevereiro', 'março',
                'abril',   'maio',      'junho',
                'julho',   'agosto',    'setembro',
                'outubro', 'novembro',  'dezembro']

Para a delimitação de blocos de códigos os delimitadores são colocados em uma pilha e diferenciados por INDENT e DEDENT. Iniciando a pilha com valor 0 (zero) e colocando valores maiores que os anteriores na pilha. Para cada começo de linha, o nível de endentação é comparado com o valor do topo da pilha, se o número da linha for igual ao topo da pilha, a pilha não é alterada, se o valor for maior a pilha recebe o nível de endentação da linha e o nome INDENT (empilhamento) se o nível de endentação for menor, então é desempilhado até chegar a um nível de endentação recebendo o nome DEDENT (desempilhamento) e se não encontrar nenhum valor é gerado um erro de endentação.

Abaixo um exemplo de permutação, retirado do capítulo 2.1 sobre Estrutura de linhas na Análise léxica do Manual de Referência da linguagem (Language Reference Manual):

         def perm(l):                   NOVA LINHA
INDENT        if len(l) <= 1:           NOVA LINHA
INDENT           return[1]              NOVA LINHA
DEDENT        r = [ ]                   NOVA LINHA
              for i in range(len(l)):   NOVA LINHA
INDENT            s = l[:i] + l[i+1:]   NOVA LINHA
                  p = perm(s)           NOVA LINHA
DEDENT        for x in p:               NOVA LINHA
INDENT            r.append(l[i:i+1]+x)  NOVA LINHA
DEDENT            return r

Indentação

indentar [Do ingl. (to) indent < fr. endenter (v. endentar).] Verbo transitivo direto. 1.Fazer depressão, ou chanfradura em forma de dente, em. 2.Espacejar linha, parágrafo, etc. da margem esquerda para a direita em (folha a ser impressa, dactilografada, etc.). A Indentação endentação é uma característica peculiar na linguagem, os blocos são delimitados explicitamente em Linguagem C, Pascal e PHP por chaves e em Fortran pelo then e endif.

Em Python, blocos de código são delimitados por espaços formando uma endentação visual, não existem símbolos de "abre" e "fecha", mas requer uma tabulação padronizada de espaços, em outras linguagens como C/C++ ou JavaScript, a endentação não é necessária devido os delimitadores de blocos, utiliza-se somente para melhor visualização, enquanto em Python, a endentação é obrigatória.

Usando um editor de texto comum é muito fácil existir erros de endentação, o recomendado é configurar o editor conforme a análise léxica do Python ou utilizar uma IDE. Todas as IDE’s Python fazem endentação automática.

Exemplo:

  • Indentação correta:
def valor1(self):
     try:
        self.c = input('Primeiro Valor: ')
        c = self.c
        return c
     except:
        print 'Inválido!'
        self.valor1()
  • Indentação incorreta:
def valor1(self):
try:
self.c = input('Primeiro Valor: ')
c = self.c
return c
except:
print 'Inválido! '
self.valor1()

O código está correto para os dois exemplos, mas o analisador léxico irá verificar se o INDENT e o DEDENT estão coerentes, o analisador reconhecerá os keywords "def", "try", "exception", "self", "return", "print", "input" e as strings entre aspas simples e a endentação, se não houver problemas o programa irá rodar normalmente, senão apresentará a exceção: "Seu programa está com erro no bloco de endentação".

Compilador de bytecode

A linguagem de muito alto-nível como já dito, mas ela também pode compilar seus programas para que a próxima vez que o executar não precise compilar novamente o programa, reduzindo o tempo de carga na execução.

Utilizando o interpretador interativo não é necessário a criação do arquivo de Python compilado, os comandos são executados interativamente. Porém quando um programa ou um módulo é evocado, o interpretador realiza a análise léxica e sintática, compila o código de alto-nível se necessário e executá-lo na máquina virtual Python.

O bytecode é armazenado em arquivos com extensão .pyc ou .pyo (bytecode otimizado)

O bytecode da linguagem também é de alto-nível, ou seja, é mais legível aos seres humanos que o código de byte do C, por exemplo. Para descompilar um código de byte é utilizado o módulo dis da biblioteca padrão da linguagem e existem módulos de terceiros que tornam o bytecode mais confuso, tornando a descompilação ineficaz.

Normalmente, o Python trabalha com dois grupos de arquivos:

  1. Os módulos do núcleo da linguagem, sua biblioteca padrão e os módulos independentes, criados pelo usuário.
  2. No núcleo do interpretador existe o analisador léxico, o analisador sintático que utiliza Estruturas de Objetos (tempo de execução), o Compilador que aloca memória (tempo de execução) e depois do Avaliador de código que modifica o estado atual do programa (tempo de execução), mostrando resultado para o usuário.

Orientação a objeto

  • Classes: Criamos o objeto classe com “class nome:”, ela é composta de atributos que representam este objeto. Quando a classe é atribuída a outro objeto, este objeto é chamado de instância da classe. Os métodos, que também são definidos para programação orientada a objetos, são funções dentro de uma classe. Todos os métodos ou atributos da classe são obrigados a passar por parâmetro ou argumento a palavra self antes de tudo, isso é convencionado pelo próprio desenvolvedor, por padrão se chama self, que foi convencionado nos parâmetros dos métodos e atributos devido a filosofia da linguagem de estar tudo explícito, especificar de onde o valor vem. Assim os métodos são chamados objeto.metodo(argumento1, argumento2, ...) são definidos iguais a uma função. Os atributos da classe (ou variável da classe) podem ser instanciados em qualquer lugar da classe, e os atributos de instância (ou variável de instância) devem ser declarados dentro dos métodos utilizando o parâmetro self.

Exemplo:

class A:
   a = 1 # atributo publico
   __b = 2 # atributo privado a class A

class B(A):
   __c = 3 # atributo privado
   
   def __init__(self):
     print self.a
     print self.__c

a = A()
print isinstance(a, B) # ''Objeto a'' é uma instância da ''classe B''? Falso.

a = B() # Instancía o ''objeto a'' na ''classe B'' e imprime os atributos da classe.
print isinstance(a, B) # ''Objeto a'' é uma instância da ''classe B''?Verdadeiro.

b = B() # Instancía o ''objeto b'' na ''classe B'' e imprime os atributos da classe.
print isinstance(b, B) # ''Objeto b'' é uma instância da ''classe B''? Verdadeiro.

b = A() # Instancía o ''objeto b'' na ''classe A''.
print isinstance(b, A) # ''Objeto b'' é uma instância da ''classe A''? Verdadeiro.
  • Encapsulamento: Encapsulamento é a proteção dos atributos ou métodos de uma classe, em Python existem somente o public e o private e eles são definidos no próprio nome do atributo ou método. Atributos ou métodos iniciados por no máximo dois sublinhados e terminados por um sublinhado são privados e todas as outras formas são públicas.

Exemplo:

class A:
   a = 1 # atributo publico
   __b = 2 # atributo privado a class A

class B(A):
   __c = 3 # atributo privado a B
   
   def __init__(self):
     print self.a
     print self.__c

a = A()
print a.a # imprime 1

b = B()
print b.__b # Erro, pois __b é privado a classe A.
print b.__c # Erro, __c é um atributo privado, somente chamado pela classe.

print b._B__c # Imprime __c = 3, muito pouco utilizada, mas existe.
  • Herança: Deitel em "Programando em Java" diz que "quando utilizamos herança para criar uma classe a partir da classe existente, a nova classe herda os atributos e comportamentos dessa classe existente, podendo adicionar atributos e comportamentos para solucionar nossas necessidades".
  • O polimorfismo condiz com a reutilização de código, funções semelhantes em várias partes do software é fato que ocorram então definimos esta função como uma biblioteca, e todas as outras funções que precisarem desta, a chamam sem a necessidade de reescrevê-la.

Exemplo:

class Pessoa:

    def __init__(self, nome ='', idade=0):
       self.nome = nome
       self.idade = idade

    def getIdade(self):
       return self.idade

class PessoaCPF(Pessoa):
    
    def __init__(self, CPF, nome=’’, idade=0):
       Pessoa.__init__(self, nome, idade)
       self.CPF = CPF


a = Pessoa()
Pessoa.__init__(a, 'Leonardo', 22)

b = PessoaCPF('122.333.332-1', nome='', idade=0)

print a.nome   # imprime Leonardo
print a.idade  # imprime 22
print b.CPF    # imprime 122.333.332-1

Plataformas disponíveis

Está disponível para as mais diversas plataformas, desde Unix (Linux, FreeBSD, Solaris, MacOS X etc.), Windows, .NET, versões antigas de MacOS até consoles de videogames ou mesmo alguns celulares, como a série 60 da Nokia e palmtops.

Para algum Sistema Operacional não suportado, basta que exista um compilador C disponível e gerar o Python a partir do fonte.

O código fonte é traduzido pelo interpretador para o formato bytecode, que é multiplataforma e pode ser executado e distribuído sem fonte original.

Exemplos de código

Uma das características mais marcantes da linguagem, a sintaxe do Python é clara, concisa e elegante, o que facilita a manutenção e garante a produtividade.

Exemplos:

  • O tradicional "Hello, world":
print 'Olá, mundo!'
  • Imprimindo uma lista ordenada com os itens com a primeira letra em maiúscula:
lista = ['laranja', 'banana', 'uva']
lista.sort()

for item in lista:
    print item.capitalize()
  • Contando palavras em um arquivo:
arquivo = file('text.txt')
palavras = arquivo.read().split()
unicas = set(palavras)

print 'Palavras: %d. Tirando as repetidas: %d' % (len(palavras), len(unicas))
  • Enviando e-mail:
import smtplib
server = smtplib.SMTP('mail.xx.net')

# Envio de e-mail da conta @xy para a conta @xx

server.sendmail('leonardo@xy.com', 'leonardo@xx.net',
"""To: leonardo@xx.net
From: leonardo@xy.com
Subject: Teste de envio de email
Estou lhe enviando este email como um teste.
""")

server.quit()
print 'Envio OK'
  • Cálculos matemáticos:
>>> from math import *
>>> x = 5
>>> sqrt(x)
2.2360679774997898

>>> sin(x)
-0.95892427466313845

>>> log(x)
1.6094379124341003

>>> cos(x)
0.28366218546322625

Implementações

Python possui diversas implementações. Entre elas estão:

Licença

Python possui uma licença Open Source aprovada pela OSI e compatível com a GPL, porém menos restritiva. Sua licença prevê (entre outras coisas) que binários da linguagem sejam distribuídos sem a necessidade de fornecer o código-fonte junto. Para maiores detalhes, visite Python Software Foundation License.

Módulos e Frameworks

Ao longo do tempo têm sido desenvolvidos pela comunidade de programadores muitas bibliotecas de funções especializadas (módulos) que permitem expandir as capacidades base da linguagem. Entre estes módulos especializados destacam-se:

  • Twisted - Framework para o desenvolvimento de aplicações de rede. Inclui módulos para servidor Web, de Aplicações, SSH e diversos outros protocolos (twistedmatrix.com)
  • SQLObject - Mapeador objeto-relacional: traduz estruturas relacionais para objetos Python e manipula o banco de dados de forma transparente (sqlobject.org)

Interfaces gráficas

GUI é uma forma de interagir com um computador através de uma metáfora de manipulação direta de imagens e sinais gráficos (ícones, botões, janelas e outros), exemplos de bibliotecas GUI disponíveis para Python:

IDEs

Existem vários ambientes integrados de desenvolvimento (IDE (software)) disponíveis para Python:

Referências bibliográficas

Aplicações

  • Google - Mecanismo de pesquisa de sites na Internet que possui partes (crawlers) de seu software desenvolvido em Python (www.google.com)
  • Blender - Programa de modelagem 3D e animação que permite a criação de scripts para automatização de tarefas em Python (www.blender.org)
  • Plone - Gerenciador de conteúdo (ou CMS, de content management system) desenvolvido em Python e Zope (plone.org)
  • Industrial Light & Magic, produz filmes da série Star Wars, usando extensivamente Python para computação gráfica nos processos de produção dos filmes.
  • Yahoo! usa Python para o site de grupos.
  • Red Hat Linux usa Python para instalação, configuração e gerenciamento de pacotes.
  • NASA usa Python em muitos dos seus projetos, incluindo um sistema CAD/CAM e um módulo gráfico usado em missões de planejamento do espaço.

Links externos

Ferramentas pessoais