quinta-feira, 3 de novembro de 2011

Funções em Python

Funções em Python são definidas com a palavra def, seguidas pelo seu nome, além de parênteses. Dentro dos parênteses, existe a possibilidade de se incluir uma lista de parâmetros. No início do corpo da função, é uma boa prática fazer um comentário, chamado de docstrings. Usando docstrings, ferramentas podem utilizar o comentário para a documentação do sistema. Funções em Python podem ter a opção de retornar algum valor, uma lista, um objeto, etc ou podem não retornar nada, se portando como um procedimento.
>>> def fib(n): 
...     """Imprime uma série de Fibonacci para o parâmetro n."""
...     a, b = 0, 1
...     while a < n:
...         print a,
...         a, b = b, a+b
...
>>> # Chamando a função
... fib(2000)

>>> def fib2(n): 
...     """Returnondo uma lista contendo uma série de Fibonacci para n."""
...     result = []
...     a, b = 0, 1
...     while a < n:
...         result.append(a)   
...         a, b = b, a+b
...     return result
...
>>> f100 = fib2(100) 
Podemos ter um variável número de argumentos na lista, com valores default ou não. Para valores default, não existe a necessidade de se passar esse valor para a função. Além disso, não é necessário passar os argumentos para a função na ordem dos parâmetros, desde que utilizemos um par nome=valor.
>>> def funcaoComArgumento(arg1, arg2="valor_default", arg3="valor_default")
       ...

      #chamadas a função
      funcaoComArgumento(100)
      funcaoComArgumento(arg2="qualquercoisa", arg1=100)
      # ocorrerá um erro para a chamada a seguir pois não existe um valor default para arg1 
      funcaoComArgumento(arg2="qualquercoisa")  
Finalizando, parâmetros com a forma **name recebem um dicionário e com a forma *name recebem tuplas. Os parâmetros que recebem dicionários devem, obrigatoriamente serem os últimos parâmetros da função.
def cheeseshop(kind, *arguments, **keywords):
    print "-- Do you have any", kind, "?"
    print "-- I'm sorry, we're all out of", kind
    for arg in arguments:
        print arg
    print "-" * 40
    keys = sorted(keywords.keys())
    for kw in keys:
        print kw, ":", keywords[kw]

cheeseshop("Limburger", "It's very runny, sir.",
           "It's really very, VERY runny, sir.",
           shopkeeper='Michael Palin',
           client="John Cleese",
           sketch="Cheese Shop Sketch")

-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch

sábado, 22 de outubro de 2011

Mais Estruturas de Controle através de exemplos

Como estruturas de controle são praticamente parecidas nas linguagens, abaixo encontram-se exemplos e pequenas observações sobre o assunto:

1 - If:
>>> x = int(raw_input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
...      x = 0
...      print 'Negative changed to zero'
... elif x == 0:
...      print 'Zero'
... elif x == 1:
...      print 'Single'
... else:
...      print 'More'
...
More
2 - For:
>>> a = ['cat', 'window', 'defenestrate']
>>> for x in a:
...     print x, len(x)
Abaixo, um exemplo que altera a lista enquanto ocorre o loop:
>>> a = ['cat', 'window', 'defenestrate'] 
...for x in a[:]: # utilizando uma cópia da lista
...    if len(x) > 6: a.insert(0, x)
...
>>> a
['defenestrate', 'cat', 'window', 'defenestrate']
3 - Função Range:

Itera sobre uma sequência de números.
>>> range(5, 10)
[5, 6, 7, 8, 9]
>>> range(0, 10, 3) # entre 0 e 10, de 3 em 3
[0, 3, 6, 9]
>>> range(-10, -100, -30) # entre -10 e -100, de -30 em -30
[-10, -40, -70]
Utilizando a função em um for:
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
...     print i, a[i]
4 - Break e Else:
>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print n, 'equals', x, '*', n/x
...             break
...     else:
...         print n, 'is a prime number'
.
5 - Continue:
>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             continue'
.
6 - Pass:
>>> while True:
...     pass  # aguarda por interrupção  (Ctrl+C)
...
>>> class MyEmptyClass:
...     pass
No próximo post, falaremos sobre funções em Python.

Até lá.

quinta-feira, 20 de outubro de 2011

Listas e Estruturas de Controle em Python

Python possui algumas estruturas usadas para agrupar tipos e List é o mais versátil deles, não sendo necessário que uma lista possua tipos iguais.

>>> a = ['spam', 'eggs', 100, 1234]
>>> a
['spam', 'eggs', 100, 1234]

Como strings, listas também utilizam índices, porém, são mutáveis:

>>> a[0]
'spam'
>>> a[3]
1234
>>> a[-2]
100
>>> a[1:-1]
['eggs', 100]
>>> a[:2] + ['bacon', 2*2]
['spam', 'eggs', 'bacon', 4]
>>> 3*a[:3] + ['Boo!']
['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boo!']
>>> a[:]
['spam', 'eggs', 100, 1234]
>>> a[2] = a[2] + 23
>>> a
['spam', 'eggs', 123, 1234]
>>> # Substituir alguns itens:
... a[0:2] = [1, 12]
>>> a
[1, 12, 123, 1234]
>>> # Remover alguns:
... a[0:2] = []
>>> a
[123, 1234]
>>> # Inserir alguns:
... a[1:1] = ['bletch', 'xyzzy']
>>> a
[123, 'bletch', 'xyzzy', 1234]
>>> # Inserir a própria lista:
>>> a[:0] = a
>>> a
[123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]
>>> # Limpar a lista:
>>> a[:] = []
>>> a
[]

Também temos a funão len():

>>> a = ['a', 'b', 'c', 'd']
>>> len(a)
4

Para mostrar como listas em Python é versátil, também podemos criar listas contendo outras listas:

>>> q = [2, 3]
>>> p = [1, q, 4]
>>> len(p)
3
>>> p[1]
[2, 3]
>>> p[1][0]
2
>>> p[1].append('xtra')     # See section 5.1
>>> p
[1, [2, 3, 'xtra'], 4]
>>> q
[2, 3, 'xtra']

Fluxo de Controle

>>> # Fibonacci series:
... # the sum of two elements defines the next
... a, b = 0, 1
>>> while a < 10:
...     print a
...     a, b = b, a+b
A primeira estrutura que veremos é o While.
Em Python, zero é considerado como falso e outros números é considerado verdadeiro. A condição a ser testada pelo loop pode ser também uma string ou uma lista, qualquer sequência. Podemos utilizar <, >, ==, <=, >=, != para realizar o teste da condição.
A primeira linha do loop, que é a linha de teste, é finalizado com dois pontos(:). O corpo do loop é identado e pode-se utilizar tab ou espaços para identar a linha. Identação em Python é a forma que o ele possui para agrupar comandos. As linhas dentro do bloco precisam ficar identadas com o mesmo número de espaços ou tabs e o Python é rígico com esta questão. Quando utilizamos o ambiente interativo, é necessário uma linha em branco para indicar o fim do corpo do loop. O comando print imprime o valor na saída padrão. Strings são impressas sem aspas e espaço é inserido entre items:
>>> i = 256*256
>>> print 'The value of i is', i
The value of i is 65536
A vírgula no final do comando print evita imprimir em uma nova linha:
>>> a, b = 0, 1
>>> while a < 1000:
...     print a,
...     a, b = b, a+b
...
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

No próximo post, continuaremos falando sobre outras estruturas de controle.

Primeiros Passos em Python

Para início, é muito interessante utilizar uma shell para invocar o interpretador do Python e digitar alguns comandos básicos da linguagem. Para isso, apenas se faz necessário digitar, na shell, o comando python. Como no Linux, o Python costuma vir instalado e configurado, não é necessário fazer nada. Porém, se estiver usando o Windows, é importante colocar o caminho da pasta onde o Python foi instalado no path.

Para trabalhar com números, temos os operadores +, -, *, /, como em qualquer outra linguagem.
Podemos atribuir um número a uma variável utilizando o sinal = e podemos associar um número a várias variáveis ao mesmo tempo.

>>> width = 20
>>> height = 5*9
>>> width * height
900

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0

Assim como números, temos as strings:

>>> 'spam eggs'
'spam eggs'
>>> 'doesn\'t'
"doesn't"
>>> "doesn't"
"doesn't"
>>> '"Yes," he said.'
'"Yes," he said.'
>>> "\"Yes,\" he said."
'"Yes," he said.'
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'

Podemos ter strings por mais de uma linha de duas formas:

hello = "This is a rather long string containing\n\
several lines of text just as you would do in C.\n\
    Note that whitespace at the beginning of the line is\
 significant."

print hello

print """
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
"""

Strings podem ser contatenadas com o operador + e repetida com *. Podemos trabalhar com Strings utilizando índices:

>>> word = 'Help' + 'A'
>>> word
'HelpA'
>>> '(' + word*5 + ')'
'(helpahelpahelpahelpahelpa)'

>>> word[4]
'A'
>>> word[0:2]
'He'
>>> word[2:4]
'lp'

>>> word[:2]    # Os primeiros dois caracteres
'He'
>>> word[2:]    # Tudo menos os primeiros dois caracteres
'lpA'

>>> word[-1]     # O último caracter
'A'
>>> word[-2]     # O penúltimo caracter
'p'
>>> word[-2:]    # Os últimos dois caracteres
'pA'
>>> word[:-2]    # Tudo menos os dois caracteres
'Hel'

Também temos a função len():

>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)

No próximo post, estarei falando sobre estruturas de controle em Python.

sábado, 5 de fevereiro de 2011

O que é Ruby on Rails e Instalação

Ruby on Rails é um framewok que é fácil para desenvolver, fazer deploy e manter aplicações web.

Tem sido escolhido por muitos para desenvolvimentos para a Web 2.0.

Rails implementa uma arquitetura MVC, cria automaticamente stubs para testes, é fácil para testar aplicações.

Rails é escrito em Ruby, uma linguagem moderna, de scripts e OO. Em Ruby, pode-se expressar idéias naturalmente e com um código limpo. Porém, Rails estendeu a linguagem, para uma programação ainda mais fácil.

Um exemplo de uma classe Modelo chamada Project.

class Project < ActiveRecord::Base
  belongs_to :portfolio
  has_one :project_manager
  has_many :milestones
  has_many :deliverables, :through => :milestones

  validates :name, :description, :presence => true
  validates :non_disclosure_agreement, :acceptance => true
  validates :short_name, :uniqueness => true
end

A filosofia do Rails é: convenção sobre configuração, DRY (Don't repeat yourself) e Rest.

Além disso, Rails é Agil. Ele segue as práticas dessa metodologia.

Instalação

Aqui será explicado como instalar o Rails no Ubuntu 10.10, que possui um pouco mais de detalhes. Para instalar no Windows, siga as orientações encontradas em http://rubyonrails.org/download.

execute os comandos abaixo no terminal:

sudo apt-get install build-essential libopenssl-ruby libfcgi-dev
sudo apt-get install ruby irb rubygems ruby1.8-dev
sudo apt-get install sqlite3 libsqlite3-dev
sudo gem install rails
sudo gem install sqlite3-ruby

A versão do Rails que está executando por default pode ser verificada com o comando:

rails -version

Se não for encontrado, execute o seguinte comando:

export PATH=/var/lib/gems/1.8/bin:$PATH

Com o comando abaixo, é possível verificar quais versões estão instaladas:

gem list --local rails

Pode-se instalar outra versão do Rails, através do comando abaixo. Existem situações onde isso possa ser necessário.

gem install rails -- version 3.0.1

Agora é possível verificar as versões instaladas:

gem list --local rails
rails _3.0.1_ --version

sexta-feira, 21 de janeiro de 2011

Por onde começar no Ruby

Após as orientações de instalação das linguagens, encontradas no post sobre linguagens dinâmicas - Ruby e Python, precisamos de material e livros para estudar e aprofundarmos nessas linguagens. Se você, como eu, tem esse interesse e está um pouco perdido, vou deixar algumas dicas abaixo.

Sobre Ruby, existe bons materiais na internet e, por isso, não vou ficar aqui reinventando a roda, se já escreveram para nós, vamos poupar tempo e digitação.

Mas, antes de tudo, Ruby é
Uma linguagem dinâmica, open source com foco na simplicidade e na produtividade. Tem uma sintaxe elegante de leitura natural e fácil escrita.
Esta é a definição encontrada em http://www.ruby-lang.org/pt/

No livro Why's (Poignant) Guide to Ruby, existe uma citação interessante que demonstra a simplicidade (não significa que não seja poderosa) da linguagem, em comparaçao ao Java:
Na livraria perto de casa, existe uma enorme estante cheia de livros de Java só esperando para tombar e cair em cima de mim algum dia. E um dia isto vai acontecer. Da forma como as coisas estão indo, um dia esta estante será tão grande que se tombar vai esmagar todos nós. Pode até mesmo dar a volta ao mundo várias vezes, esmagando as edições anteriores dos mesmos livros de Java, e as novas edições atropelando estas também.
.

Aprenda a Programar

Este é um bom material, básico sobre o Ruby, e com uma versão em português, para quem se sentir mais a vontade para ler na nossa língua. O legal que a tradução foi feita por profissionais da área, que conhecem a linguagem, como Fabio Akita. Então, você não vai encontrar traduções bizonhas, sem sentido. Tudo foi feito com cuidado. Vale a pena começar por aqui. É uma leitura agradável e rápida e já lhe dá uma visão global da linguagem.

Para quem optar pela versão em inglês, pode acessar aqui.


O Guia (comovente) de Ruby do Why

É um material diferente, divertido e você vai se aprofundar mais na linguagem. Também vale a leitura.

Para ler o material em inglês, clique aqui.

Ruby 101 – O básico de Ruby para poder utilizar tanto o Rails quanto o Cucumber

Este é um tutorial recente e muito bom encontrado no blog do Urubatan. É um tutorial extenso, mas vale muito a pena. Recomendo.

Livros

Minha dica em livros são essas:

Para a versão 1.8 do Ruby:
- Programming Ruby (2nd edition): The Pragmatic Programmers' Guide

Para a versão 1.9 do Ruby:
- Programming Ruby 1.9 (3rd edition): The Pragmatic Programmers' Guide

Esses livros, conhecidos como Pickaxe book, devido a uma imagem de uma ferramenta na capa, é considerado o guia definitivo da linguagem. O único problema que vejo é que ele traz a referência da linguagem em quase metade do livro. Porém, até chegar lá, você já terá lido mais de 400 páginas. Então, entendo esse guia como um plus.

O importante neste estudo é você aprender e ter uma base de Ruby antes de estudar Ruby on Rails. O livro pode ser utilizado como um livro de consulta, se preferir.

Cursos

Recomendo o curso da Caelum. para quem mora numa cidade que tem uma filial ou parceiro. Já fiz alguns cursos de Java, na Caelum Rio e foram ótimos. Tem dois cursos, na grade, sobre Ruby on Rails.

terça-feira, 18 de janeiro de 2011

Linguagens Dinâmicas - Ruby e Python

Ano passado, tive meu primeiro contato profissional com linguagens dinâmicas. Na época, tive a oportunidade de dar manutenção em uma aplicação Ruby on Rails. No começo, sofri um pouco com os novos paradigmas, até conseguir fazer alguma coisa útil. Depois desse breve contato, eu acabei ficando um tempo só trabalhando e estudando Java.

Porém, no final de 2010, voltei a me dedicar ao estudo dessas linguagens e tenho dedicado meu tempo a duas dessas linguagens: Python e Ruby. Claro que o tempo é escasso, mas tenho focado para tirar o melhor proveito eme aprofundar cada dia mais.

Ruby e Python tem se tornado um grande vício em minha vida. Da mesma forma que o pessoal vai pra casa a noite para ficar horas jogando, estou me viciando de ir pra casa estudar Ruby e Python que, para mim, é uma grande diversão. Fico fascinado com a facilidade de, por exemplo, lidar com listas, iteraçoes, etc. Creio que essas duas linguagens, com seus frameworks web Rails e Django, vieram para ficar.

Então, quero compartilhar com aqueles que desejam , sobre essa apaixonante viagem. Claro que não vou ficar aqui detalhando sobre as linguagens, mas dando algumas dicas que achei interessante e onde estudar, afinal, material na internet não falta.


Para começar, você pode me perguntar: Ruby ou Python? Sinceramente, ainda não consegui nenhuma resposta. As duas, para mim, são ótimas. Já ouvi algumas pessoas defendendo uma em detrimento da outra, mas, no meu caso, não cheguei a nenhuma conclusão, quer dizer, cheguei sim: as duas. Pode ser que no futuro eu tenha uma escolha ou resposta.

Iniciando ...

A primeira coisa que precisamos fazer, é claro, instalar o interpretador para essas linguagens.


Python no Linux
Se você tem o privilégio de usar uma distro Linux, como Ubuntu, então, o python já está instalado.

Python no Windows

Usuários do Windows precisam fazer o download do Python e instalá-lo.
Visite a página de downloads do Python em http://www.python.org/download/ e escolha o instalador para sua arquitetura, além de escolher a versão do Python desejada, no caso, existe a possibilidade de instalar a versão 2.7.1 ou 3.1.3.

Neste momento, tanto faz qual versão você vai instalar, porém, o framework web Django, ainda não foi atualizado para a versão 3.1.3 do Python.


Ruby no Linux
No Linux, como super usuário, instale o Ruby.
No ubuntu faça:

sudo bash
apt-get install ruby-full



Ruby no Windows
Acesse http://www.ruby-lang.org/pt/downloads/ e siga as orientações em Ruby em Windows.


Sugiro utilizar a versão do Linux. Caso não conheça o Linux, recomendo instalar a versão 10.10 do Ubuntu e aprender a usar esse sistema operacional.


Nos próximos posts, vamos nos aprofundar nessas linguagens.
A idéia é após detalhar sobre elas, falar um pouco sobre Rails e Django.