domingo, 4 de outubro de 2009

Visões

A linguagem Python tem um conjunto de módulos adicionais que permitem aumentar muito o seu poder expressivo. Hoje quero falar-vos de um bastante pequeno mas que permite brincar com coisas sérias. Baseia-se na ideia de uma tartaruga que se passeia sob nosso controlo, podendo deixar um rasto visível. Para isso tem uma caneta. Sempre que a caneta está em baixo e a tartaruga caminha, lá aparece o rasto. Existem por isso comandos para baixar a caneta, levantar a caneta, rodar para a esquerda ou para a direita, etc.


Existem variantes deste módulo. Quando instala o Python fica com a possibilidade de importar de imediato o módulo turtle. Outras possibilidades são o xturtle ou a sua versão mais completa cTurtle . É este último que iremos explorar.

Comecemos com um exemplo simples que nos permite desenhar um quadrado.


import cTurtle

def quadrado(lado):
"""
Desenha um quadrado.
"""
cTurtle.showturtle()
#-----------
cTurtle.fd(lado)
cTurtle.rt(90)
cTurtle.fd(lado)
cTurtle.rt(90)
cTurtle.fd(lado)
cTurtle.rt(90)
cTurtle.fd(lado)
cTurtle.rt(90)
#----------
cTurtle.hideturtle()


quadrado(100)


Executando este código obtém-se o desenho:





O código acima não é brilhante! Basta ver que repetimos 4 vezes o mesmo par de instruções. É por isso que existem estruturas de controlo repetitivas em todas as linguagens de alto nível. Para este caso em que o número de repetições é fixo e conhecido previamente vamos usar um ciclo for.


import cTurtle

def quadrado(lado):
"""
Desenha um quadrado.
"""
cTurtle.showturtle()
#-----------
for i in range(4):
cTurtle.fd(lado)
cTurtle.rt(90)

#----------
cTurtle.hideturtle()


quadrado(100)


Alguns comentários. Em primeiro lugar, usamos a notação normal para o uso de funções que estão definidas num módulo que foi importato com import módulo. Em segundo lugar, o mesmo comando pode ter mais do que um nome. Assim, por exemplo,podemos abreviar forward por fd.Em terceiro lugar, existem neste programa quatro comandos, cujos nomes em inglês são claros.


Continuemos esta breve exploração. Agora vamos desenhar um pentágono, um polígono regular de 5 lados. Com pouco esforço chegamos ao seguinte código:


import cTurtle
def pentagono(lado):
"""
Desenha um pentágono.
"""
cTurtle.showturtle()
#-----------
for i in range(5):
cTurtle.fd(lado)
cTurtle.rt(72)

#----------
cTurtle.hideturtle()


pentagono(100)


Executado o código obtemos agora a figura:





Fixemo-nos nos dois programas. Quais são as suas únicas diferenças? Claro: o valor do número de lados (repetições) e o ângulo. Mas há alguma relação entre eles? Claro que sim, uma vez mais. Num polígono regular o produto entre o número de lados e o ângulo interno dá sempre 360 graus. Com base nisso podemos generalizar o código, escrevendo um programa que dá para qualquer polígono regular.


import cTurtle
def poligono_regular(comp_lado,num_lados):
"""
Desenha um polígono.
"""
cTurtle.showturtle()
angulo_viragem = 360 /num_lados
#-----------
for i in range(num_lados):
cTurtle.forward(comp_lado)
cTurtle.right(angulo_viragem)

#----------
cTurtle.hideturtle()

poligono_regular(50,8)


Pode experimentar.

Mas será que só dá para isto? Claro que não. Isto é apenas um começo. Quando dominar o módulo vai ser capaz de desenhar um linda árvore inclinada para a esquerda devido ao vento.


3 comentários:

  1. Permita-me uma pergunta lateral, mas relacionada:
    O cturtle nao vem com o package inicial do python 2.6.2 (nao sei se vem com o 3, pois nao o instalei..)
    Ora, eu encontrei-o na web, so a forma de um ficheiro ".py". Como faco para o instalar? Colocá-lo na pasta conhecida pelo Python basta? Vejo nessa pasta tres versoes de cada biblioteca e modulo usado pelo pytho, .py, .pyc e .pyo... Uso o Mac OSX..
    Agradecia se me pudesse tirar esta duvida.
    Tiago Roldão

    ResponderEliminar
  2. O Python tem uma versão simples deste módulo. Se fizer import turtle (sem o "c"!!) verá que não dáerro e pode usar os comandos básicos. Mas vou explicar-lhe o que me perguntou.

    1. Os ficheiro em Python podem ter extensão .py (ficheiros fonte), .pyc (compilados para byte code), ou ainda .pyo (compilados de modo optimizado).

    Os ficheiros .py são aqueles que o programador escreve usando um editor de texto qualquer. Quando se executa um programa contido num ficheiro .py é automaticamente gerado um ficheiro .pyc. Enquanto não modificarmos o original sempre que executarmos o programa é agora o ficheiro .pyc que é carregado. Se executarmos o programa a partir da linha de comando com o indicador (flag) -o o código gerado é ligeiramente optimizado (se possível ...). Se criou um ficheiro toto.py, executá-lo a partir da linha de comando é feito com algo como python -O toto.py .

    2. Onde colocar os módulos que queremos acrescentar à linguagem de modo a que sua importação seja fácil? Nalgumas situações o módulo vem com um instalador e você não tem que se preocupar com o problema. Não é o caso do módulo cTurtle. Nestes casos a solução normal é colocar o módulo dentro da pasta de nome site-packages. Onde está a dita pasta? Isso depende do sistema operativo e do local onde onde a versão do Python está instalada. Como sei qual é a versão instalada? Fácil. abra uma janela do terminal e lance o comando which python e saberá a resposta.

    Se usa o Mac OS X e instalou você o Python, então está na directoria:
    /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages. Se está a usar a versão pré-instalada então estará em /usr/local/lib/python2.5/site-packages se for a versão 2.5.

    Espero ter respondido. Bons desenhos!
    EC

    ResponderEliminar
  3. Esta resposta também me deu um jeitão (Mac noob here).
    B
    em hajam.

    ResponderEliminar