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.

31 de jan de 2010

Mão na massa!!!

Hello World!


Hehe... tentei uma piadinha..rsrs
Me desculpem pessoal, esse post teve de ser editado no domingo, e não pude recolocá-lo durante o dia. Hoje vou apresentar para vocês o modo interativo do Python.  E como esse post eu escrevi domingo, o artigo vai ser menorzinho.
Vamos lá, primeiramente vamos instalar o Python. Se você estiver num Linux (Deus queira que esteja), o Python é nativo =D. Agora, se você estiver naquele programinha que começa com W, vamos ter que instalar mesmo. Vá no site do Python e baixe a versão 2.6.4, depois os passos são simples “Next-Next-Next-Finish”.
Se tudo ocorreu bem, digite “python” no terminal de comando para começar a brincadeira.


Se for necessário a adição do Python nas variáveis de ambiente do SO, clique nos links a seguir de acordo com o seu SO: Linux  | Windows

O modo interativo não é exclusividade do Python, mas é um recurso muito legal, principalmente para teste e estudos. Tudo o que é feito nele se limita apenas àquela instância do interpretador. Isso mesmo, assim que o terminal/prompt for fechado, tudo será destruído.
Agora é sua vez, abra o modo interativo e digite “print 'Hello World'”. Com isso, você acaba de criar seu primeiro programa em Python! O que aconteceu aqui foi a chamada do comando “print”.

No Python 3 o print é uma função, metodo, como preferir. Nas versões anteriores o print é uma palavra reservada, ou seja, como mencionado acima, é um comando do Python. Falando nas palavras reservadas vou dar uma breve passada nesse assunto.

O Python 2.5.2 conta com 31 palavras reservadas. E elas são:
and        del        from        not        while
as         elif       global      or         with
assert     else       if          pass       yield
break      except     import      print
class      exec       in          raise
continue   finally    is          return
def        for        lambda      try
Brinque a vontade, faça muitos prints e muitas operações matemáticas. Por enquanto, seria legal que você pegasse familiaridade com o modo interativo. Agora, se você achou feio e queria usar aquele seu amado editor de texto ou, até mesmo, aquela sua IDE preferida, basta você criar um arquivo e salvar com a extensão .py. Com isto, você poderá escrever seu código Python e apenas compilá-lo no seu terminal, com o seguinte comando:

python NomeDoSeuArquivo.py


Bom pessoal, sei que foi simples, mas como eu disse dominguera... complicado rsrsrs....
Na próxima vou falar mais da sintaxe do Python. Espero que tenham gostado, como sempre espero por críticas e sugestões.

Abraços!!!

30 de jan de 2010

Características

Boa noite pessoal!


Hoje vou falar um pouco das características do Python. Um pouco de conceito nunca faz mal a ninguém, não é verdade?

As principais características do Python são:
  • É uma linguagem de alto nível;
  • É orientada a objetos;
  • Tipagem dinâmica e forte;
  • Possui um interpretador invez de compilador (quer dizer ela também é compilada... vou explicar calma).

Como dito no post anterior, um dos motivos da criação do Python foi o aumento da produtividade dos desenvolvedores. Logo, a syntax dele é bastante clara, o que favorece a legibilidade e diminui a curva de aprendizagem.

Linguagem multiplataforma, isso mesmo roda no nossos SOs baseados em Unix (nativo =D) e naquele outro programinha lá, aquele que começa com W.
Diversos conceitos(paradigmas) foram utilizados no seu projeto, ou seja, Python é multiparadigma. Ele abrange o paradigma funcional, modular e a famosa orientação a objetos.

Agora o lance da interpretação/compilação. O Python é interpretado através do bytecode pela VM(Virtual Machine) do próprio Python. Isso ai bytecode, começou a entender? Vamos lá, imagine uma linha do tempo, você acaba de codificar seu programa e salva seu arquivo no formato .py, neste momento ele já está prontinho para funcionar.

"Nossa!!! Cadê toda aquela parte de interpretador, bytecode, compilador, blá blá blá... ". Sim, sim, existe toda essa parte, ela começa agora. Toda vez que você poe o seu arquivo .py para trabalhar, ele é compilado gerando um bytecode. Basicamente, esse passo é executado porque
bytecode roda mais rápido que o source code(o que você escreveu). Esse processo não é completamente escondido de você, quando o seu arquivo .py é compilado um novo arquivo .pyc é criado.

A próxima vez que você rodar o seu .py, o Python irá pular a compilação e vai rodar direto. O processo de compilação só será repetido se você alterar o source code. “Ah, mas como o Python sabe que deve pular ou não a compilação?”. Simples, timestamps. Outra curiosidade é que, se o Python não puder gravar o arquivo .pyc na máquina, o seu programa continua funcionando. Ele grava em memória e libera logo após o fim da execução. Lindo, não é mesmo?

A tipagem do Python é forte, ou seja, ele se importa com o tipo de dado que a variável está guardando. Por exemplo, se você atribuir uma string a uma variável e depois tentar somar um número, o Python vai reclamar dizendo: “TypeError: cannot concatenate 'str' and 'int' objects”. Quanto ao dinamismo, o Python permite a declaração de variáveis sem a especificação do tipo, ou seja, tipo implícito. Se uma variável for inicializada com uma string e depois ela receber um valor inteiro, ou qualquer outro, o Python permitirá.

Bom pessoal, encerro por aqui.
Espero que tenham gostado. Estou sujeito a dicas ou criticas.
Queria agradecer aos amigos do canal do irc, nosklo e rodfersou. Eles me ajudam quando podem, Valeu povo.
Para quem quiser conhece-los, basta conectar no canal #python-br do freenode.
Amanhã vou mostrar um “Hello World!” básico, hehehe. Abraços e obrigado.


Fontes: Python para Desenvolvedores, 2ª edição
             Learning Python, 3ª edição

28 de jan de 2010

Um pouco de história

Vou começar falando da historia,depois entrarei na filosofia, estrutura, etc. Enfim vou fazer um overview, um joguinho de datas. Nada que você mesmo não consiga com uma simples pesquisa no google =D

O berço do Python foi o Instituto de Pesquisa Nacional para Matemática e Ciência da Computação(CWI), em 1989 nos Países Baixos mais precisamente. O nome do cérebro por trás é Guido van Rossum.

A idéia inicial era um sucessor do ABC que tivesse tratamento de exceções, uma comunicação através de scripts com o Amoeba SO e aumentar a produtividade dos programadores. Isso por que a linguagem ABC não tinha importantes funcionalidades, que o pessoal da CWI estava precisando.

Em 1991 foi publicada a primeira versão(0.9.0), na qual já abrangia classes com herança, tratamento de exceções, funções e tipos de dados (list, dict, str, etc).

Em 1994 foi formado o principal fórum de discussão do Python. No mesmo ano, a versão 1,0 foi lançada. Nela já estava incluída os recursos lambda, map, filter e reduce.

Em 1995 foi incorporado os parâmetros nomeados, suporte a números complexos e uma forma de encapsulamento.

Na versão 2.0 foram implementados list comprehension e garbage collection.

Após algumas mudanças na licença, na versão 2.1, toda a especificação era da Python Software Foundation(PSF). E isso incluiu a mudança na especificação para suportar escopo aninhado.

Em 2002 foram unificados os tipos de Python (escritos em C e classes escritas em Python). O que deixou o modelo de objetos do Python fortemente orientado a objetos. Generator também foi incluso nesta versão.

A biblioteca padrão e as escolhas sintáticas foram influenciadas pelo Java. Alguns casos são: o pacote logging (versão 2.3), o analisador sintático SAX (versão 2) e a sintaxe de decoradores que usam '@' (versão 2.4).

Em 2008 foi lançada a versão 2.6, mas com o olho na versão 3.0. Nesta versão foram incluídos multiprocessamento, JSON, I/O e uma nova formatação de cadeias de caracteres. No final do mesmo ano, a versão 3 saiu, apelidada Python 3000. Esta nova versão teve a compatibilidade quebrada com as versões 2.x. Motivo simples, corrigir falhas e fazer uma limpeza das versões mais antigas.

As principais mudanças, da versão 3.0, foram: mudança da palavra reservada 'print', que agora é função (No Pyhton 2.6, isso era possível assim: from __future__ import print_function) e a mudança para Unicode de todas as cadeias de caracteres.

Fonte: http://pt.wikipedia.org/wiki/Python#Hist.C3.B3ria


Bom pessoal, por hoje é isso. Espero que tenham gostado.

Como é minha primeira experiência com esse tipo de trabalho, gostaria muito de criticas. Pois creio que o ser humano só pode evoluir se for criticado.

Apresentação

Boa noite pessoal, estou estreando nessa onda de blogs.

O motivo principal da criação do blog foi exclusivamente didático. Hehe, isso mesmo, achei que escrevendo para vocês, eu memorizaria muito mais rápido.

Inicialmente, pensei em fazer um blog mais genérico, porem vou fazer "por partes". Vou me especializar em uma linguagem especifica e ,com o decorrer da minha necessidade, irei trocando. Como gosto muito de assuntos de gerência, analise e administração de projetos, também colocarei alguma coisinha.

Escolhi o Python para ser a primeira pois, é uma linguagem que está há muito tempo na boca do povo, e também por ser umas das linguagens mais "poderosas", e isso sem uma grande "ajuda" por trás como o Java, por exemplo.

Bom, vou fechar esse post com essa introdução, vou deixa a parte técnica para os próximos posts.

Até a próxima...