Python é uma linguagem de programação ágil, com tipo determinado dinamicamente, expressiva de software livre que pode ser livremente instalada em diversas plataformas (consulte Recursos). O código Python é interpretado. Se você estiver mais familiarizado com o ciclo de edição, construção, execução, isso parece ser simplista. Mas não se engane: os programas Python podem ser scripts simples ou programas grandes complexos. Na verdade, a própria natureza do interpretador Python incentiva a exploração e simplifica o processo de aprendizado. Se precisar de prova, componha o programa clássico Hello World! em Python:
- Dispare o interpretador Python. (Em sistemas UNIX, incluindo o Mac OS X, iniciar o interpretador
geralmente envolve digitar
pythonno prompt de comandos; nos sistemas Microsoft® Windows® , você pode ativar um shell de comando Python). - No prompt do Python, denotado por três símbolos de maior (
>>>), insira print 'Hello World!' e pressione Enter. - É isso, não há terceira etapa. A Lista 1 mostra a saída desse comando.
Lista 1. Saída de "Hello World" em Python
rb% python Python 2.4 (#1, Mar 29 2005, 12:05:39) [GCC 3.3 20030304 (Apple Computer, Inc. build 1495)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> print 'Hello World!' Hello World! |
como pode ver, estou usando o Python V2.4 em um sistema Apple OS X. Mas os fundamentos são os mesmos, independentemente do sistema operacional e, neste caso, a versão real do Python que você está usando. Não sei para você, mas esse exercício Hello World! foi muito mais fácil do que os exercícios comparáveis que fiz quando aprendi C, C++ ou até a linguagem Java™ . Essa simplicidade demonstra um dos principais benefícios de usar o interpretador Python. Um desenvolvedor pode tentar uma ideia rapidamente e explorar as propriedades de um objeto ou diferentes algoritmos sem precisar compilar, executar e testar nenhum código.
Uma das lições mais importantes a aprender ao fazer a transição para a linguagem de programação Python de outra linguagem é que tudo em Python é um objeto. Isso pode não parecer fora do comum, principalmente se você estiver familiarizado com uma linguagem orientado a objetos, como C++, Java ou C#. Mas a filosofia orientada a objetos da Python vai além da de outras linguagens, conforme evidenciado por duas diferenças simples. Primeiro, todos os valores dos dados na Python são encapsulados em classes de objetos relevantes. Segundo, tudo em um programa Python é um objeto acessível a partir de seu programa, mesmo o código que você escreve.
As linguagens de programação mais populares têm diversos tipos de dados integrados e a Python não é nada
diferente em relação a isso. Por exemplo, a linguagem de programação C possui tipos de número inteiro e ponto
flutuante. Considerando a linhagem das mesmas, não é surpreendente que a linguagem Java e C# também possuam.
Isso significa que em um programa C, você pode escrever int i = 100 para criar e
inicializar uma variável de número inteiro. O mesmo é possível na linguagem Java e C#, e, com seus recursos
de caixa automática, ambas as linguagens podem transformar esse tipo integrado em um objeto
Integer quando necessário.
Python, por outro lado, não possui tipos simples como int -- somente tipos de objetos. Se precisar de um
valor de número inteiro na Python, você simplesmente designa um valor de número inteiro para a variável
apropriada, como i = 100. Por trás, a Python cria um objeto integer e designa a
variável para fazer referência ao novo objeto. Agora vem a verdadeira surpresa: a Python é uma linguagem com
tipo determinado dinamicamente, de forma que você não precise declarar um tipo de variável. Na verdade, um
tipo de variável pode realmente ser alterado (diversas vezes) durante um único programa.
Uma maneira fácil de visualizar como a determinação de tipo dinâmica funciona é imaginar uma única classe
base chamada PyObject a partir da qual todos os outros tipos de objetos em Python
são herdados. Neste modelo, qualquer variável criada faz referência a um objeto que foi criado a partir da
hierarquia de classe geral. Se você também tiver a classe PyObject , registre o
tipo real ou o nome da classe-filha, que é criada e designada à variável, um programa Python pode
determinar de forma apropriada as etapas necessárias a serem executadas durante a execução do programa.
A figura mental apresentada no parágrafo anterior que descreve o modelo orientado a objetos da Python é realmente uma aproximação bastante boa de como a Python realmente funciona. Além disso, a Python facilita determinar um tipo de variável, usando a função de tipo. (Este exemplo também mostra como usar um comentário sequencial com o caractere #.)
Lista 2. Demonstrando os Tipos Simples Python
>>> i = 100 # Crie um objeto int cujo valor seja 100 >>> type(i) <type 'int'> >>> f = 100.0 >>> type(f) <type 'float'> |
Você pode classificar todas as classes Python abaixo da classe PyObject em suas
quatro principais categorias que o interpretador do tempo de execução da Python usa:
- Tipos simples -- Os blocos de construção básicos, como
intefloat - Tipos de contêiner -- Contêm outros objetos
- Tipos de código -- Encapsulam os elementos de seu programa Python
- Tipos internos -- Usados durante a execução do programa
Ao final desta série, terei apresentado todas as diferentes categorias. Mas, neste primeiro artigo, eu foco os tipos simples.
Python possui cinco tipos simples integrados: bool, int ,
long, float e complex. Esses tipos são
imutáveis, o que significa que quando um objeto integer é criado, seu valor não pode ser alterado. Em vez
disso, um novo objeto de tipo simples é criado e designado à variável. Usando a função id
da Python, você pode ver como a identificação da PyObject subjacente é alterada:
Lista 3. Usando a Função
id de Python>>> i = 100 >>> id(i) 8403284 >>> i = 101 >>> id(i) 8403296 |
Agora, isso pode parecer como uma maneira fácil de perder objetos, o que resultaria em uma fuga de memória. Python, como C# e a linguagem Java, no entanto, emprega um coletor de lixo que libera memória usada para conter objetos que não são mais referidos, como o objeto integer que contém 100 no exemplo anterior.
O tipo integrado mais simples na Python é o tipo bool , que pode conter somente
um de dois possíveis objetos: True ou False:
Lista 4. O Tipo
bool >>> b = True >>> type(b) <type 'bool'> >>> id(b) 1041552 |
Como há somente dois valores possíveis, o tipo booleano é exclusivo. O interpretador Python fornece os
dois únicos objetos bool necessários: True e
False. A qualquer tempo, esses objetos são necessários em um programa Python, a variável simplesmente
faz referência a um, conforme apropriado. A Lista 3 mostra como a variável bb
tem o mesmo id se você designa um valor a ela da variável b
diretamente ou somente o objeto True diretamente.
Lista 5. Valor da Variável
bb >>> b = True >>> id(b) 1041552 >>> bb = b >>> id(bb) 1041552 >>> bb = True >>> id(bb) 1041552 |
As letras maiúsculas ou minúsculas para o nome do objeto booleano são importantes, porque true (e false) é indefinido:
Lista 6. True e False Indefinidos
>>> b = true Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: name 'true' is not defined |
Neste ponto, um tipo bool pode não parecer muito útil. No entanto, as
expressões booleanas, como seus nomes sugerem, dependem dele, como você vê aqui:
Lista 7. Expressões Booleanas
>>> b = 100 < 101 >>> print b True |
Muitos programas utilizam expressões booleanas e Python fornece o intervalo completo de operações de comparação booleana e lógicas, conforme detalhado nas tabelas 1 e 2, respectivamente.
Tabela 1. Os Operadores de Comparação Booleana em Python
| Operador | Descrição | Exemplo |
| < | menor que | i < 100 |
| <= | menor que ou igual a | i <= 100 |
| > | maior que | i > 100 |
| >= | maior que ou igual a | i >= 100 |
| == | igualdade | i == 100 |
| != | diferente de (também <>) | i != 100 |
Para serem completos, os operadores listados na Tabela 1 têm igual prioridade e, a menos que você coloque as expressões entre parênteses, são aplicados da esquerda para a direita.
Tabela 2. Os Operadores Lógicos em Python
| Operador | Descrição | Exemplo |
not | negação lógica | not b |
and | e lógico | (i <=
100) and (b == True) |
or | ou lógico | (i <
100) or (f > 100.1) |
Os operadores lógicos têm prioridade inferior aos operadores de comparação individuais, o que faz sentido, pois a comparação precisa ser avaliada antes do operador lógico poder ser avaliado. A prioridade real dos operadores lógicos é fornecida pela ordem que esses operadores são apresentados na Tabela 2.
Um ponto interessante sobre os operadores lógicos or e and
na Python é que são ambos operadores de atalho. Em termos simples, isso significa que considerando
x ou y, y é avaliado somente se
x for False. De forma semelhante, considerando a expressão
x e y, y é avaliado somente se
x for True. Apesar de essa funcionalidade poder melhorar o desempenho de
avaliação de expressão -- principalmente para expressões longas ou complexas -- também pode enganar
programadores usados a diferentes regras aprendidas de outras linguagens.
Os outros quatro tipos simples integrados na Python são todos tipos numéricos: int ,
long, float e complex. Os tipos numéricos são
comuns em programas, independentemente da linguagem usada. Python fornece suporte integral para operações
aritméticas, incluindo soma, subtração, multiplicação e divisão (consulte a Tabela 3).
Tabela 3. Operados Aritméticos em Python
| Operador | Descrição | Exemplo |
| * | multiplicação | i * 100 |
| / | divisão | i / 100 |
| // | divisão de número inteiro | i // 100 |
| % | resto da divisão | f % 100 |
| + | soma | i + 100 |
| - | subtração | i - 100 |
Os operadores de multiplicação e divisão (os quatro primeiros listados na Tabela 3) têm prioridade mais alta do que os operadores de soma e subtração. E como antes, é possível agrupar subexpressões e dar a elas prioridade mais alta, usando parênteses para separá-las.
Diferentemente da linguagem Java, que define formalmente o intervalo permitido de tipos numéricos, Python
é mais semelhante a C em que o intervalo de tipos é dependente da plataforma. Você usa os tipos
int e long para conter valores de números inteiros, as diferenças sendo
que um int é um valor de número inteiro de 32 bits. Portanto, limita-se a conter valores (em muitas
plataformas) de -232 a 232 - 1. Em contraste, o tipo de número inteiro longo tem
precisão ilimitada, sujeita a limitações de memória de seu computador. Para indicar à Python que um número
inteiro deve ser tratado como longo, simplesmente anexe um L ao final do número, como 100L.
Valores com ponto flutuante em Python são sempre feitos em precisão dupla; portanto, os tipos
float de Python correspondem a duplos em uma linguagem semelhante à C.
Dois outros pontos importantes relacionados aos tipos numéricos são literais, que são simplesmente números expressados explicitamente, como 100 nos exemplos anteriores e operações bit. Programadores geralmente trabalham com o sistema decimal (ou base 10). Mas, às vezes, outros sistemas são mais úteis, principalmente considerando a natureza binária dos computadores. Python fornece suporte para números octais (base 8) e hexadecimais (base 16). Para indicar à Python que um número deve ser tratado como um literal numérico octal, simplesmente anexe um zero à frente. Anexar um zero e um x na frente de um número indica à Python para tratar o número como um literal numérico hexadecimal, como o código a seguir mostra:
Lista 8. Indicando à Python para Tratar o Número como um Literal Numérico Hexadecimal
>>> print 127 # Usando literal decimal 127 >>> print 0177 # Usando literal octal 127 >>> print 0x7F # Usando literal hexadecimal 127 |
Quando há uma maneira fácil de expressar literais numéricos, principalmente em hexadecimal, você pode construir facilmente sinalizadores que correspondem a etapas de teste específicas, que é um truque de programação comum. Por exemplo, um número inteiro de 32 bits pode armazenar 32 valores de sinalizadores. Usando testes de bit, é possível testar facilmente sinalizadores específicos em uma variável de sinalizador. A lista completa de operações bit em Python é apresentada na Tabela 4.
Tabela 4. Operadores Bit em Python
| Operador | Descrição | Exemplo |
| ~ | complemento bit a bit | ~b |
| << | deslocar bits à esquerda | b << 1 |
| >> | deslocar bits à direita | b >> 1 |
| & | e bit a bit | b & 0x01 |
| ^ | ou bit a bit exclusivo | b ^ 0x01 |
| | | ou bit a bit | b | 0x01 |
Agora, você está provavelmente imaginando o que ocorre quando os diferentes tipos numéricos são misturados
em uma única expressão. A resposta simples é que Python converte todos os operandos em uma expressão para o
ripo do operando mais complexo, conforme necessário. A ordem de complexidade é int ,
long, float e complex (sem a intenção de nenhum
trocadilho), que é mostrada facilmente por um exemplo:
Lista 9. Conversão Python de Todos os Operandos para o Tipo do Operando Mais Complexo
>>> 1 / 3 0 >>> 1.0 / 3 0.33333333333333331 >>> 1.0 // 3 0.0 >>> 1 % 3 1 >>> 1.0 % 3 1.0 |
Enquanto Python converterá os operandos conforme você pode esperar, a linguagem não converte operandos com base no operador, conforme mostrado no exemplo 1/3, que avalia para um número inteiro. Se quiser forçar um resultado de ponto flutuante, certifique-se de que pelo menos um dos operandos seja um tipo de ponto flutuante.
O tipo final, complex, provavelmente não é tão reconhecível para a maioria dos programadores, pois não é um tipo de dados integrado comum em outras linguagens de programação. Para engenheiros e cientistas, números complexos são um conceito familiar. Formalmente, um número complexo tem um componente real e um imaginário, ambos representados por tipos float em Python. Um número imaginário é um múltiplo da raiz quadrada de menos um, que é denotada por i ou j -- dependendo de se você foi treinado como um cientista ou um engenheiro. Em Python, o componente imaginário de um número complexo é indicado por um j:
Lista 10. Componente Imaginário de um Número Complexo
>>> c = 3.0 + 1.2j >>> print c (3+1.2j) >>> print c.real, c.imag 3.0 1.2 |
Esse exemplo é um número complexo que possui um componente real 3.0 e um componente imaginário 1.2. Observe que você pode acessar as diferentes partes do número complexo usando os atributos real e imag do objeto complexo.
Até aqui, disse que Python lida somente com tipos de objetos, apesar disso, os exemplos não parecem realmente ter objetos. Todavia, onde estão os construtores? para os tipos de dados simples integrados, Python realiza muito trabalho para você. Mas os construtores ainda estão lá -- seus nomes são idênticos ao nome do tipo de dados relevante -- e se você preferir pode usá-los diretamente, conforme mostrado abaixo:
Lista 11. Construtores de Python
>>> b = bool(True) >>> i = int(100) >>> l = long(100) >>> f = float(100.1) >>> c = complex(3.0, 1.2) >>> print b, i, l, f, c True 100 100 100.1 (3+1.2j) |
Python é uma linguagem incrivelmente simples, mas poderosa. A barreira de entrada é extremamente baixa,
principalmente para um programador que tem experiência com uma linguagem semelhante à C. Este artigo
introduziu a linguagem de programação Python e os tipos de dados integrados: bool,
int , long, float e complex.
Se ainda não tiver feito isso, dispare um interpretador Python e tente algumas das ideias discutidas. Você
ficará satisfeito em fazer isso.
- Faça download de Python.
- Após ter um interpretador Python funcional, o Tutorial de
Python é um ótimo local para começar a aprender a linguagem.
- IBM developerWorks publicou muitos artigos sobre Python, incluindo os artigos avançados na
Charming Python column de David Mertz.
- Se preferir usar um IDE, leia
Python development with Eclipse and Ant de Ron Smith, que mostra como usar o Eclipse para escrever código
Python.
- O Manual de Referência de Python fornece uma discussão sobre a
natureza de objeto de Python.
- O Manual de Referência de Python fornece também os detalhes legais para
literais de números inteiros e literais de
pontos flutuantes.
- Números complexos não são apenas para cientistas e engenheiros. Também podem ser usados para trabalho
gráfico, como a simplificação da
rotação de objetos em uma GUI.
- Envolva-se com a comunidade do developerWorks participando de
Blogs do developerWorks.
