18 de fev. de 2010

Novo blog

Boa noite pessoal!!!
Gostaria de esclarecer porque estou sem blogar todo esse tempo. Bom, primeiramente teve o carnaval né? E ninguém é de ferro, fui curtir um pouco. Hehehe... E também estou trabalhando no novo blog!!! Isso mesmo, estou fazendo um blog decente num host de verdade.
O tempo está meio curto, mas estou me esforçando. Em breve estarei blogando novamente, prometo que desse final de semana não passa.
Bom, por hoje minha intensão era só divulgar o novo blog. Até a próxima.
Abraços!!!

10 de fev. de 2010

Sobrecarga e Python

Boa noite pessoal!!!
Sobrecarga é uma palavra/conceito muito usado por programadores de linguagens OO. Existem dois tipos de sobrecarga, de métodos e operadores, e cada linguagem tem seu suporte. Java, por exemplo, suporta apenas sobrecarga de método:

private int soma(int x, int y){
 return x+y;
}

private int soma(float x, float y){
 return x+y;
}

O C# suporta subrecarga de métodos e operadores. A sobrecarga de métodos do C# é igual a do Java, e já foi mostrada acima. Sobrecarga de operadores consiste, falando de maneira grossa, em dar um novo meio de interpretação a um operador matemático. Veja o exemplo:

public class Cliente{
 public int x = 0;
 public int y = 0;
 public Cliente() : this(0,0){}

 public Cliente(int x, int y){
  this.x = x;
  this.y = y;
 }

 public static Cliente operator+(Cliente a, Cliente b){
  return new Cliente(a.x*a.y,b.x*b.y); //Fazer isso é perigo, pode causar confusões
 }
}

OK, já falei de Java e de C# mas, e o Python? Pois é meu amigo, o Python essa histórinha é um pouco diferente, alias não existe sobrecarga no Python, isso mesmo não existe ^^. "Pow, mas uma vez eu vi num site dizendo que: era só eu implementar o método __add__ na minha classe. Ai, quando eu fizesse x + y, ele ia fazer o que eu implementei". Bom, realmente, isso não está errado porém, isso não é sobrecarga e por motivos simples. O Python é completamente OO, então tudo no Python é a execução de métodos de objetos. Na expressão x + y está ocorrendo a execução do método __add__ sim, da seguinte forma:

type(x).__add__(y)

Logo, quando você cria um método __add__ na sua classe, O Python executa o método que foi definido nele. Vou exemplificar, do mesmo modo que foi exemplificado a mim quando estava estudando:

class A:
    def abc(self):
        pass

class B(A):
    pass 

b = B()

Como podem ver, B não tem o método "abc" definido em seu escopo, ele está em A. Então, quando fazemos uma chamada ao método abc em B, o interpretador primeiramente vai verificar se b tem o método abc, sendo a resposta negativa, o próximo passo é verificar B que, como foi dito anteriormente, não tem o método. Por último ele verifica A, que é o possuidor do método abc, e encontra o método e em seguida o executa. Caso você defina um método abc em B esse mesmo processo é executado, porém quando o interpretador verificar se B tem o atributo abc, ele vai achar e executar, sem tocar no abc que está em A. O metodo de A não foi sobrecarregado, nem sobrescrito, ele continua lá, como sempre foi. Meio complicado mesmo, vou tentar resumir.

Não há sobrecarga de operadores no Python pois, a chamada x + y na realidade é uma outra forma de se fazer "type(x).__add__(y)" então, quando você implementa o metodo __add__ na sua classe, o Python apenas deixa de chamar o __add__ normal e passa a chamar o da sua classe. Por isso há uma falsa impressão de sobrecarga.

Bom pessoal, isso é a pontinha do iceberg, isso gera um papo longo, que vou explorar mais pra frente(quando eu estiver entendendo 100%, rsrs). Mas podemos dizer que: "Sobrecarga no Python é apenas um engano de conceitos".

Espero que estejam gostando de tudo. Estou sempre à disposição de vocês para dúvidas/sugestões/críticas ok?

Abraços!!!

9 de fev. de 2010

Polimorfismo e o Python

Boa noite pessoal. Peço desculpas por esses dias sem postar, tive alguns problemas, infelizmente.

Bom, a partir de hoje irei abordar a OOP(Object-Oriented Programming) do Python.

Polimorfismo consiste em classes mais abstratas que representam o comportamento das classes concretas que referenciam. Um exemplo em Java:

public abstract class OperacaoMatematica {
   public abstract double calcular(double x, double y);
}
public class Soma extends OperacaoMatematica {
   public double calcular(double x, double y) {
      return x+y;
   }
}
 
public class Subtracao extends OperacaoMatematica {
   public double calcular(double x, double y) {
      return x-y;
   }
}
public class Contas {
   public static void mostrarCalculo(OperacaoMatematica operacao, double x, double y) {
       System.out.println("O resultado é: " + operacao.calcular(x, y));
   }
 
   public static void main(String args[]) {
        //Primeiro calculamos uma soma
        Contas.mostrarCalculo(new Soma(), 5, 5); //Imprime o resultado é: 10
        //Depois uma subtração
        Contas.mostrarCalculo(new Subtracao(), 5, 5); //Imprime o resultado é: 0
   }
}

Como podem ver, existe duas implementações do metodo calcular e uma classe que as encara de forma abstrata. Na classe “Contas” o metodo “mostrarCalculo” recebe como parâmetro um objeto da classe “OperacaoMatematica”. "Nossa! Mas espera aí! Não se instância classes abstratas". É verdade, mas aí que está o trunfo, veja que as classes que implementam o método “calcular” extendem a classe abstrata. Com isso, é possível que “um objeto do tipo OperacaoMatematica seja criado” a partir da classe Subtracao/Soma. Acho que podemos dizer que, o método calcular pode se transformar de acordo com o contexto.

No Python a grande sacada é o tipo do dado, graças a tipagem dinâmica. Polimorfismo no Python rola a solta, pense bem quantas funções admitem diversos tipos de dados diferentes. Vou dar um exemplo aqui:

#Metodo extraido do livro Learning Python
def intersect(seq1, seq2):

     res = []

     for x in seq1:

         if x in seq2:

             res.append(x)

     return res


Isso mesmo, só isso. Sem aquela porrada de classes: classe abstrata, duas classes para implementar o método e, finalmente, uma classe para usar essa abstração. No Python, como dito antes, a abstração é feita no tipo de dado. Teste essa classe passando diversas coisas, por exemplo, strings, tuples, list e etc. Vou colocar alguns exemplos de chamadas e retorno:

>>> intersect("SPAM", "SCAM")

['S', 'A', 'M']

>>> intersect([1,6,3,9], (1,4,5,9))

[1, 9]


Se você ainda não sabia como o polimorfismo funcionava, com certeza agora você pode confirmar um boato que tem por aí. Dizem que o entendimento do polimorfismo através do Python é mais rápido. Bom, comigo foi assim =].

Espero que tenham gostado do post, espero por comentários/dúvidas/sugestões enfim.

Abraços!!!

4 de fev. de 2010

Conceitos Básicos do Python

Boa noite pessoal, o post de hoje é sobre a estrutura do Python, isto é, seus tipos de dados, operadores lógicos e matemáticos, loops e condicionais. Neste post vou presumir que você já tenha visto/trabalhado com esses conceitos, pois irei apenas mostrar como eles são no Python. Para uma explicação mais detalha, aconselho uma pesquisa mais minuciosa no Google. Let's see it!

Tipos de Dados

Como foi tido em posts anteriores, a tipagem do Python é forte, ou seja, o Python se importa com o tipo de dado que a variável está guardando e não permite qualquer tipo de coerção. Os tipos de dados nativos são: str, list, tuple, set, frozenset, dict, int, float, complex e bool. Existem ainda os tipos próprios, que consiste nas instâncias de classes. Abaixo coloquei-os em ação no modo interativo.



Operadores

Bom, aqui não tem muito mistério não é mesmo? Apenas curiosidades. No Python é permitido comparações em cadeia, na qual esta tem o mesmo significado básico da matemática, ou seja, as comparações são feitas na ordem: a < b < c. Sendo que, se a < b for falso, a expressão b < c não é verificada. Existem ainda os operadores lógicos 'and' e 'or', que, para quem conhece outras linguagens, são análogos ao && e ||, respectivamente.

Operador

Descrição

Exemplo

==

igual

a == b

!=

diferente

a != b

<

menor que

a < b

>

maior que

a > b

>=

maior ou igual a

a >= b

<=

menor ou igual a

a <= b



Loops


Como disse no início do post, minha não é minha intenção explicar o funcionamento, mas sim, como utilizá-los. No caso dos loops são eles for e while:





Condições

A única curiosidade na sintaxe de controle de fluxo do Python, é que o termo 'else if' foi “contraído” para 'elif'.



Indentação

Fácil leitura e visual agradável, foram alguns dos conceitos base usados para a criação do Python. Mas não só por isso, a indentação no Python é de suma importância, é tão importante que a indentação, com espaços em branco, é obrigatória. É com a indentação que o Python determina inicio e fim dos blocos.

Bom galera, por hoje é só. Espero que o post seja de grande ajuda a você que está iniciando. Mas além do post, vou divulgar aqui uma lista de exercícios do site do Python no Brasil.
Como sempre, qualquer dúvida podem postar um comentário, ou marcar presença no canal irc (#python-br).

Daqui pra frente vou focar mais em divulgação de códigos, problemas frequentes e etc. Por isso, aceito sugestões para os próximos posts.

Abraços!!!

2 de fev. de 2010

Ambiente Python no Windows

Boa noite pessoal,
Depois de alguns pedidos do pessoal do canal #python-br do freenode (frequentem!!!), por conta do número de usuários com dificuldades no Windows. Portanto, vou falar como configurar um ambiente de desenvolvimento do Windows.

Vamos lá, o primeiro passo é fazer o download do instalador no site do Python. A instalação é bem simples, famoso “Next-Next-Next-Finish”.

Geralmente, o path é configurado automaticamente. Mas, por motivos de cultura, vou detalhar. Vamos ao passo a passo:

1.) Clique com o botão direito no ícone do “Meu Computador”.



2.) Em seguida, clique na aba “Avançado



3.) Clique no botão “Variáveis de Ambiente



4.) No quadro “Variáveis do sistema”, procure na lista a variável “Path”. E clique em “Editar



5.) Vá no fim do campo “Valor da variável”, coloque “;CAMINHO_DA_PASTA_DO_PYTHON



6.)Agora abra o prompt de comando do Windows, e digite “python”. Se o resultado for o modo interativo (como na imagem abaixo), tudo ocorreu bem. Agora, se o resultado for negativo, refaça atentamente os passos anteriores.




Pronto, o python está instalado e configurado. Neste ponto, é perfeitamente possível o desenvolvimento das suas aplicações. Mas, neste post, vou mostrar como configurar o notepad++ para desenvolver e rodar seus programas.

Baixe e instale o NotePad++. Ele já possui suporte a diversas linguagens, inclusive o Python, mas é necessária uma certa configuração para que você possa executar seus programas diretamente dele.

Feita a instalação, vá na pasta do Python (no meu caso, o caminho é: C:\Python26) e crie um arquivo chamado executar.py. E cole o código descrito abaixo:

#Colaboração do companheiro Nosklo
import os, sys, subprocess
arquivo = sys.argv[1]
caminho, programa = os.path.split(arquivo)
saida = subprocess.call([sys.executable, programa], cwd=caminho)
raw_input('Programa terminado com codigo: %d\nPressione ' % saida)



Abra o notepad++ e escreva seu código Python e salve-o, onde preferir.



Agora vá em “Executar” no menu, e em seguida clique em “Executar”, ou simplesmente aperte F5.





No combobox, escreva o seguinte comando: C:\Python26\python.exe -i C:\Python26\executar.py “$(FULL_CURRENT_PATH)”. Clique em “Salvar”, escolha um nome para seu atalho e, por fim, escolha uma tecla de atalho.





Agora vem a explicação daquele programinha “executar.py”. A variável FULL_CURRENT_PATH guarda o caminho completo do documento que está sendo editado no notepad++, porém se você executar o programa diretamente no python, o diretório de trabalho será o do notepad++. E o código cedido pelo nosso amigo Nosklo contorna isso.
Agora, execute seu programa apertando a tecla de atalho que você escolheu anteriormente.



Bom pessoal, é isso aí. Espero que tenha sido claro, qualquer coisa estamos à disposição no canal do irc(#python-br).
Aguardo o feedback de vocês. Forte abraço.