Publicado por: hugolt | junho 29, 2008

Nova era: Python

Nova era: Python

Desde o mês passado estou numa nova era. Agora trabalho de verdade e estou usando uma linguagem de programação que eu tinha alguns preconceitos por não conhece-la muito bem e achar que tudo deveria ser escrito em C.
Agora vejo o mundo com outros olhos. Tudo que puder ser simples, que seja. Cada coisa tem sua aplicação. Os colegas de trabalho são excelentes, o ambiente é muito bom e nada a reclamar.

Bem, vou tentar fazer umas comparações entre C e Python e mostrar algumas das grandes facilidades que Python provê como uma linguagem moderna.

Python é orientado a objetos, porém, pode ser escrito código procedurial/imperativo e até mesmo algumas coisas de programação funcional em Python.

Para quem está acostumado a escrever estruturas de dados e funções para trabalharem com elas, Python traz muitas coisas prontas e adequáveis a muitas situações.
Em C os tipos mais básicos são int, char, float e double. Em python temos int, str, float, list, dict, tuple, set e mais outros primitivos.
Bem, de cara dá pra notar a ampla variedade.

Uma coisa muito comum é querer pegar um inteiro e converte-lo pra string. Em C você escreveria uma função no estilo “itoa“ ou usaria essa itoa mesmo. Em Python basta usar uma função, que é como se fosse um cast em C: str(123) e te retorna “123”. Simples, não?

Bem, vamos avançar um pouco, imagine que você tem que criar uma estrutura de dados do tipo lista. Python já tem isso pronto! O tipo é `list`. E além do mais, como linguagem orientada a objetos moderna, provê por padrão alguns métodos para trabalhar com listas, como pop.
Exemplo em python interativo:

>>> minhaLista = ["hugo", 16, 3.1415]
>>> print minhaLista[0]
hugo
>>> ultimoElemento = minhaLista.pop()
>>> print ultimoElemento
3.1415
>>> print minhaLista
['hugo', 16]
>>>

Agora imagine que você quer uma tupla, um tipo de lista imutável. Python já tem isso pronto! O tipo é `tuple`.
Exemplo em python interativo:

>>> minhaTupla = ("hugo", "geek", "python", 6, 6, 6)
>>> print minhaTupla
('hugo', 'geek', 'python', 6, 6, 6)
>>> print minhaTupla[1]
'geek'
>>>

Notaram o qual simples é? Agora vamos para algo mais avançado, você precisa de implementar um dicionário e usar algoritmo de hash pra fazer busca dentro do seu dicionário. Python já tem isso pronto! O tipo é `dict`.
Exemplo em python interativo:

>>> meuDict = {"nome":"Hugo", "idade":16, "linguagem":"Python"}
>>> print meuDict["nome"], "tem", meuDict["idade"], "anos e programa em", meuDict["linguagem"]
Hugo tem 16 anos e programa em Python
>>>

Vamos a mais uma coisinha. Imagine que você quer criar um conjunto (igual ao da matemática, porém não quer ficar restrito a somente ter números). Python já tem isso pronto! O tipo é `set`.
Exemplo em python interativo:

>>> meuConjunto1 = set() # instanciando, set é uma classe
>>> meuConjunto1.add("numero 1")
>>> print meuConjunto
set(['numero 1'])
>>> meuConjunto2 = set() # instanciando novo objeto
>>> meuConjunto2.add("numero 2")
>>> print meuConjunto2
set(['numero 2'])
>>> uniao = a.union(b)
>>> print uniao
set(['numero 1', 'numero 2'])
>>>

Vou ficar por aqui com os tipos de dados só pra deixar com água na boca …

As funções em python são definidas como segue:
def FUNCAO( parametros ):
    corpo da funcao

Em python não há begin e end como em pascal e nem chaves pra delimitar blocos, ela usa indentação
Exemplo em python interativo:

>>> def helloWorld():
...    print "hello",
...    print "world"

>>> print helloWorld()
hello world
>>>

Se você quiser retornar algo, basta por um ‘return VALOR’ ou somente return que retorna None (seria um NULL da vida).

O elemento principal da orientação a objetos é o criador de classe. Em python ele se chama “class”. Para definir o que vai ser executado na hora da instanciação, define-se um método chamado __init__ que tem que ter como argumento pelo menos o objeto (pode ser qualquer nome, mas geralmente usa-se ‘self’). A difernça básica entre métodos e funções definidos em uma classe é que o método sempre vai ter como primeiro argumento o objeto e a função normal não. Vamos a um exemplo:

>>> class Pessoa:
...    def __init__(self, nome, idade, telefone):
...        self.nome = nome
...        self.idade = idade
...        self.telefone = telefone
...
>>> hugo1 = Pessoa("Hugo #1", 16, 123467)
>>> hugo2 = Pessoa("hugo #2", 16.5, "1234678") # note que nao há verificacao de tipos!
>>> print hugo1.nome, hugo1.idade, hugo1.telefone
'Hugo #1 16 123467'
>>> print hugo2.nome, hugo2.idade, hugo2.telefone
'Hugo #2 16 1234678'
>>>

Agora vamos um pouco mais além, o tipo `int` por exemplo, tem por padrao alguns métodos privados como __add__, __sub__, __div__, __mult__, entre outros.
O __add__ define o que fazer quando for usado uma operacao de adição sobre o objeto, o __sub__ define subtracao, __div__ divisão e __mult__ multiplicacao.

Uma coisa que vale mostrar aqui é que o tipo `str` suporta multiplicação, quando é usada multiplicação sobre uma string, ela é repetida X vezes.
Exemplo:

>>> "Hugo" * 3
'HugoHugoHugo'
>>>

Agora, suponhamos que vamos criar uma classe que armazena informações funcionários de uma empresa – nome, salário, endereço, telefone.

>>> class Funcionarios:
...    def __init__(self):
...        self.listaDeFuncionarios = [] # lista vazia
...
...    def __add__(self, tupla):
...        novoFuncionario = {"nome": tupla[0], "salario" : tupla[1], "endereco": tupla[2], "telefone": tupla[3]}
...        self.listaDeFuncionarios.append(novoFuncionario)
...        return "Funcionario %s adicionado!" % tupla[0]
...
...    def __sub__(self, nome):
...        funcionario = self.acharFuncionario(nome)
...        if funcionario == None:
...            return "Funcionario %s nao encontrado!" % nome
...        else:
...            self.listaDeFuncionarios.remove(funcionario)
...            return "Funcionario %s removido!" % nome
...
...    def acharFuncionario(self, nome):
...        for funcionario in self.listaDeFuncionarios:
...            if funcionario["nome"] == nome:
...                return funcionario
...        return None
...
...    def aumentarSalario(self, nome, aumento):
...        funcionario = self.acharFuncionario(nome)
...        if funcionario == None:
...            return "Funcionario %s nao encontrado!" % nome
...        funcionario.salario += aumento
...
...    def __mostrar(self, funcionario):
...        if funcionario != None:
...            return "Nome: %s, Telefone: %s, Endereco: %s, Salario: %f" % \
...             (funcionario.nome, funcionario.telefone,funcionario.endereco, funcionario.salario)
...        else:
...            return "Funcionario nao encontrado!"
...
...    def mostrarFuncionario(self, nome):
...        funcionario = self.acharFuncionario(nome)
...        return self.__mostrar(funcionario) + '\n'
...
...    def mostrarTodos(self):
...        for funcionario in self.listaDeFuncionarios:
...            print __mostrar(funcionario)
...        print '\n'
...
>>> funcionarios = Funcionarios()
>>> funcionarios + ("hugo", 10000.00, "Rua tal tal", "1234678")
>>> funcionarios + ("joao", 1.50, "sem endereco", "sem tel")
>>> funcionarios + ("ze", "50.25", "rua da margura", "123456789")
>>> funcionarios.mostrarTodos()
Nome: hugo, Telefone: 1234678, Endereco: Rua tal tal, Salario: 10000.000000
Nome: joao, Telefone: sem tel, Endereco: sem endereco, Salario: 1.500000
Nome: ze, Telefone: 123456789, Endereco: rua da margura, Salario: 50.250000

>>> funcionarios.aumentarSalario("joao", 500)
>>> funcionarios.mostrarTodos()
Nome: hugo, Telefone: 1234678, Endereco: Rua tal tal, Salario: 10000.000000
Nome: joao, Telefone: sem tel, Endereco: sem endereco, Salario: 501.500000
Nome: ze, Telefone: 123456789, Endereco: rua da margura, Salario: 50.250000

>>> print funcionarios - "hugo"
Funcionario hugo removido!
>>> funcionarios.mostrarTodos()
Nome: joao, Telefone: sem tel, Endereco: sem endereco, Salario: 501.500000
Nome: ze, Telefone: 123456789, Endereco: rua da margura, Salario: 50.250000

>>>

Acabou ficando grandinha a classe, mas comparada ao seu poder está pequena🙂

PS.: O pessoal no trabalho me xingaria e acharia POG fazer lista de dicionários, mas ficou bem simples e didático para esse texto.
(Não garanto que o código acima vá funcionar, eu escrevi na unha)

Se você quiser conhecer mais da linguagem, recomendo ir ao site da própria (www.python.org) tem uma área de documentação muito boa!


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Categorias

%d blogueiros gostam disto: