Descobrir Python, Parte 1: Tipos Numéricos Integrados da Python

Introdução à Python, uma poderosa linguagem de script orientada a objetos

A natureza flexível da linguagem de programação Python suporta diversas filosofias de programação, incluindo programação processual, orientada a objetos e funcional. Mas o mais importante, programar em Python é divertido. A linguagem suporta, em vez de atrapalhar, o processo de desenvolvimento. Este artigo, o primeiro de uma série de programação em Python, introduz Python e seus tipos numéricos integrados.

Robert Brunner, Research Scientist, National Center for Supercomputing Applications

Robert BrunnerRobert J. Brunner é um cientista pesquisador do National Center for Supercomputing Applications e professor assistente de astronomia na Universidade de Illinois, Urbana-Champaign. Publicou diversos livros, assim como muitos artigos e tutoriais, sobre vários tópicos.



03/Mai/2005

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:

  1. Dispare o interpretador Python. (Em sistemas UNIX, incluindo o Mac OS X, iniciar o interpretador geralmente envolve digitar python no prompt de comandos; nos sistemas Microsoft® Windows® , você pode ativar um shell de comando Python).
  2. No prompt do Python, denotado por três símbolos de maior (>>>), insira print 'Hello World!' e pressione Enter.
  3. É 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.

A Hierarquia de Tipos Python

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 int e float
  • 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.


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 Booleano

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
OperadorDescriçãoExemplo
<menor quei < 100
<=menor que ou igual ai <= 100
>maior quei > 100
>=maior que ou igual ai >= 100
==igualdadei == 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
OperadorDescriçãoExemplo
notnegação lógicanot b
ande 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 Tipos Numéricos

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
OperadorDescriçãoExemplo
*multiplicaçãoi * 100
/divisãoi / 100
//divisão de número inteiroi // 100
%resto da divisãof % 100
+somai + 100
-subtraçãoi - 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
OperadorDescriçãoExemplo
~complemento bit a bit~b
<<deslocar bits à esquerdab << 1
>>deslocar bits à direitab >> 1
&e bit a bitb & 0x01
^ou bit a bit exclusivob ^ 0x01
|ou bit a bitb | 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 Complexo

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.

São Mesmo Objetos?

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)

Resumo

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.

Recursos

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre, Linux
ArticleID=382636
ArticleTitle=Descobrir Python, Parte 1: Tipos Numéricos Integrados da Python
publish-date=05032005