Este artigo é a parte 1 de 3 na série Python

A algum tempo estou montando uma série de tutoriais com a intenção divulgar o binding PyQt. No entanto, recebi alguns pedidos para escrever algum texto introdutório para a linguagem. Diante da diversidade de material livre na internet, confesso que relutei muito em pegar o projeto, mas a necessidade em preparar um curso de Python para a instituição em que trabalho, me levou a este caminho.

Nesta série de artigos sobre Python, pretendo criar algum diferencial com respeito aos textos disponíveis, fazendo uma abordagem mais detalhada da linguagem, sem me preocupar com o ensino da programação em si. Por este motivo, alguns conhecimentos em programação podem ser necessários ao longo dos artigos. No entanto, procuro ser profundo onde o conteúdo me permite, sem me exceder em detalhes muito técnicos.

Outros textos de muita boa qualidade estão disponíveis na rede como o livro “Python na Prática”, de Christian Robottom Reis, além de vários outros.

Sumário

1. Uma breve Introdução ao Python

Neste primeiro artigo vou fazer uma abordagem bem superficial da linguagem de programação Python, mostrando mais seus aspectos técnicos e funcionais, com o intuito de passear pelas particularidades da linguagem.

1.1. Linguagem Interpretada

O Python é uma linguagem interpretada, ou seja, seu código é executado por um interpretador e não compilado para uma linguagem de máquina, para então ser executada no sistema, como acontece nas linguagens C, C++, entre outras.

Embora seja interpretado, o Python faz uso de tipos bem balanceados que no geral permitem um ótimo desempenho. Processamentos mais pesados, como a renderização de imagens, são realizadas por bibliotecas especializadas, geralmente escritas em C ou C++, com trechos em assemble, quando alto desempenho é necessário. Com isto, tais processamentos não pesam num programa Python, muito mais do que pesariam em outras linguagens compiladas.

Uma grande vantagem em uma linguagem interpretada é a possibilidade de se testar partes do código em um interpretador, sem ter que criar um código e compilá-lo, para então testá-lo. Isto agiliza em muito o desenvolvimento de aplicativos.

O Interpretador Python é chamado pelo aplicativo python, ou pela IDE simplificada idle:

python
Python 2.6.2 (r262:71600, Jun  9 2009, 14:36:10)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> _

Abaixo a janela da IDE idle, distribuída juntamento com o Python.

python-01

1.2. Tipagem Dinâmica

Embora o Python não possua definição de tipo, ele trabalha com Tipagem Dinâmica. Isto significa que uma variável possuirá características de um tipo específico, de sua primeira declaração, até ser re-declarada, veja abaixo,

>>> a = 5
>>> type(a)
<type 'int'>
>>> a = 'rudson'
>>> type(a)
<type 'str'>
>>> a = 5.505
>>> type(a)
<type 'float'>
>>> a = [5, 'albert', 6.25]
>>> type(a)
<type 'list'>
>>> z = 2.5 - 3.33j
>>> type(z)
<type 'complex'>

Uma grande vantagem da tipagem dinâmica, é a flexibilidade e simplicidade no código gerado nas funções e classes do Python, reduzindo significativamente a quantidade de código para se tratar as diferentes entradas em uma função.

1.3. Controle de bloco por indentação

No Python não existe delimitador de bloco como chaves, colchetes ou begins/ends. O controle de bloco é feito por indentação por espaços ou tabulação. Além de reduzir o tamanho do código, a indentação obrigatória força o programador a manter o código organizado, uma vez que uma indentação indevida gera um ‘IndentationError’ na execução.

Como exemplo, experimente adicionar alguns espaços antes de um comando e observe o erro gerado,

>>> a = 5
>>> b = a+2
>>>   c = b + 2
  File "<stdin>", line 1
    c = b + 2
    ^
IndentationError: unexpected indent

No caso, um erro IndentationError é gerado pois o bloco de comando aplicado não necessita de indentação. Nas linhas abaixo, é utilizado um comando de laço for para gerar os oito segundos números da série de Fibonacci.

>>> a, b = 0, 1
>>> for i in range(8):
...   a, b = b, a + b
...   print b,
...
1 2 3 5 8 13 21 34

Neste caso os comandos de atribuição e o print, serão executados dentro do laço for, pois estão indentados com dois espaços.

1.4. Tipos de alto nível

Além dos tipos básico, como inteiro, float e booleanos, o Python possui outros tipos especiais como:

  • listas – são listas definidas entre colchetes e com os elementos mutáveis, separados por vírgula;
  • >>> a = [ 1, 2, 'alberto', 12.65, True ]
    
  • tuplas – são como listas, mas definidos entre parenteses e os seus elementos são imutáveis (constantes);
  • >>> a = ( 1, 2, 'alberto', 12.65, True )
    >>> a[1]
    2
    
  • dicionários – são como listas com índices imutáveis, de tipos variados. Dicionários são definidos entre chaves;
  • >>> a = { 'nome': 'Alberto', 'idade': 36, 'Sexo': 'M', 'Cardiaco': False }
    >>> a['idade']
    36
    
  • strings – no Python, uma string é uma sequência de caracteres imutáveis, alocada dinamicamente e sem restrição de tamanho;
  • arquivo – o Python possui um tipo pré-definido para manipular arquivos;
  • classes e instâncias – estruturas especiais para trabalhar com Orientação a Objetos.

Estes tipos serão abordados com detalhes nas seções seguintes.

1.5. Orientação a Objetos

Orientação a Objetos está no âmago do Python. Todas as variáveis definidas em Python são objetos, com seus atributos e métodos embutidos, mesmo os tipos básicos. Por exemplo, uma string possui métodos para levantar, abaixar e capitular texto, alem de vários outros métodos úteis.

>>> nome = 'alberto santos dumont'
>>> nome.upper()
'ALBERTO SANTOS DUMONT'
>>> nome.lower()
'alberto santos dumont'
>>> nome.title()
'Alberto Santos Dumont'
>>> nome.__len__()
21

1.6. Documentação embutida

Um forte argumento em prol do Python e a documentação. Além dos muitos aficionados que enche a rede de informações, e de toda a documentação disponível na página oficial e distribuído com o Python, existe ainda uma documentação embutida, chamada de “docstring“.

É de praxe, adicionar docstrings nas funções e classes do Python. Este help embutido é muito prático, pois não necessita gastar horas pesquisando manuais ou a internet, para se ter uma informação rápida da funcionalidade de um comando. Para acessar o conteúdo de uma docstrings, basta imprimir o conteúdo em .__doc__ da função/método.

>>> print nome.replace.__doc__
S.replace (old, new[, count]) -> string

Return a copy of string S with all occurrences of substring
old replaced by new.  If the optional argument count is
given, only the first count occurrences are replaced.
>>>
>>> nome.replace('santos', 'palmeiras')
'alberto palmeiras dumont'

Nada pessoal, apenas os dois são paulistas.

1.7. Tempo de mudanças no Python

O Python está em um momento de mudança. A versão 3 traz várias mudanças de sintaxe e outras estruturais, que em alguns casos leva a uma quebra total de compatibilidade com as versões 2.5 e anteriores. Isto pode parecer inconveniente, mas por outro lado enfatiza o dinamismo da linguagem, buscando se aprimorar.

No momento atual, desenvolver em Python 3 não é aconselhável pois vários módulos da linguagem ainda não foram portados. Mas, por outro lado é necessário se prepara para as mudanças que virão.

A versão 2.6 é uma versão de transição. Ela suporta algumas das sintaxes da 3, sempre que for possível não gerar incompatibilidade extremas com a sintaxe da 2.5 e anteriores. A prioridade desta versão é a 2.5 e anteriores, preparando o código para a 3.

>>> print 'Alberto'    # 2.6 e anterior
Alberto
>>> print('Alberto')   # o print se torna uma função nas versões 3 e superior
Alberto

Para se ter uma ideia dos ventos que tocam a implantação das mudanças para a versão 3, vale uma leitura do artigo do Jonathan Corbet, com uma tradução de Roberto Bechtlufft, no Guia do Hardware. De qualquer forma, o melhor no momento é continuar na série 2, com a versão 2.6 e se quiser, experimentar os sabores da versão 3.

A equipe que mantem o binding do Qt, PyQt, pretende se adaptar ao Python 3 apenas na versão 4.4 do KDE, o que deve acontecer mais para o final do ano.

Não vou me estender por demais neste assunto, pois a grande parte das mudanças são mais técnicas e complexas para uma discussão ao nível iniciante. Por hora vou me ater ao Python 2.5 e 2.6.

Conclusão

Acredito que já deu para conhecer algumas das características principais do Python. No próximo texto, apresento mais sobre as estruturas de dados no Python, onde será possível explorar mais profundamente algumas das características apresentadas acima.