Python - Batteries Included

Secção dedicada à linguagem de programação favorita dos quarkianos: Python!

Python - Batteries Included

Mensagempor Bruno Oliveira em Quinta Jul 21, 2011 6:51 pm

Este tutorial irá abordar um dos aspectos mais "pitónicos" do Python, e servirá para dar a conhecer aos iniciados na linguagem, algumas das grandes ferramentas que o Python tem para tratamento de strings, que fazem com que a resolução de problemas aparentemente dificeis, se torne trivial.

Apesar de a expressão "batteries included" se referir a tratamento de strings, facilidade em construir aplicações para a web, GUIs, entre outras coisas, vou focar-me essencialmente nos métodos de string que podem dar jeito para resolver de forma pitónica alguns problemas.

Métodos de string

Os métodos de string, são essencialmente built-in functions que operam sobre strings, alterando-as, copiando-as ou explorando certas propriedades das mesmas. Isto pode ser útil se soubermos, que podemos tratar números como strings ou mais correctamente, converter tipos de dados destinados a representar números, para strings e vice-versa.

Consideremos por exemplo o problema (já aqui discutido) de ver se um número é um não um número automórfico.

Diz-se que um número é automórfico, se a representação decimal do quadrado desse número (representação do número na base 10) terminar no próprio número.

5 é um número automórfico, pois 5^2 = 25.

A ideia é escrever uma função booleana que nos retorne True caso o número seja automórfico e False caso contrário. Como é óbvio, existe a maneira matemática de resolver a questão, sem sequer recorrer a strings, e existe a maneira mais pitónica que consiste em utilizar strings para resolver o problema :)

A maneira matemática, baseia-se em usar o operador % e em construir uma função que nos retorne o comprimento de um número (o equivalente à função len, para uma string). Para a função que retorne o comprimento de um número, podemos tirar partido do facto da divisão entre inteiros ser truncada para baixo. Lembrar que 125/10 é 12 e que 125.0/10 é 12.5. Colocando esta ideia em código, basta criar um acumulador e ir fazendo divisões até n ser 0:

Código: Seleccionar Todos
def len_number(n):
    comp = 0
    while n > 0:
        n /= 10
        comp += 1
    return comp


Tendo esta função, escrever a condição para um número ser automórfico é mesmo muito fácil, basta que (Quadrado do número a testar)%(10**len_number(número a testar)) seja igual a (número a testar).

Assim, o script completo fica:

Código: Seleccionar Todos
def len_number(n):
    comp = 0
    while n > 0:
        n /= 10
        comp += 1
    return comp

def automorfico(n):
    if (n**2)%(10**len_number(n)) == n:
        return True
    else:
        return False


Esta é a maneira matemática de resolver o problema, que como vês, não usa strings. Por um lado, esta maneira é genérica, no sentido em que pode ser implementada numa linguagem que não tenha as funcionalidades do Python.

Por outro, estando nós a usar Python, porque não fazer uso das ferramentas para tratamento de strings que temos no nosso arsenal?

Olhando para a condição para um número ser automórfico, é apenas necessário que o número n^2 termine no número n. O método de string, endswith, permite-nos especificar isto de forma muito mais fácil:

Código: Seleccionar Todos
def automorfico(n):
    if str(n**2).endswith(`n`):
        return True
    else:
        return False


Isto mostra-nos mais uma vez que conhecer bem as potencialidades de uma linguagem pode fazer a diferença entre termos um código eficiente, ou um código não tão eficiente (ou neste caso, não tão pitónico).

Outra instrução que pode dar jeito conhecer (este exemplo pode ter aplicações por exemplo na Biologia), é a instrução in que serve para verificar se uma dada substring está contida numa string maior. Por exemplo:

Considerem-se duas strings:

Código: Seleccionar Todos
>>> string = 'ACTGCTGCTAGCTCAG'
>>> sub = 'TAG'


Para vermos se sub é uma substring de string, basta-nos fazer:

Código: Seleccionar Todos
>>> string = 'ACTGCTGCTAGCTCAG'
>>> sub = 'TAG'
>>> sub in string
True
>>>
última vez editado por Bruno Oliveira s Domingo Jul 24, 2011 1:06 am, editado 14 vezes no total
e^{ix}=cos x + i\,sin x
Avatar do utilizador
Bruno Oliveira
top-Quark!
top-Quark!
 
Mensagens: 1553
Registado: Quarta Nov 14, 2007 10:19 pm
Localização: Lisboa

Re: Python - Batteries Included

Mensagempor filipematos em Quinta Jul 21, 2011 10:16 pm

Esqueceste-te de pôr o tuturial :?
"If I have seen further than others, it is by standing upon the shoulders of giants" - Isaac Newton

“We build too many walls and not enough bridges.” - Isaac Newton
filipematos
down-Quark!
down-Quark!
 
Mensagens: 280
Registado: Sábado Jun 25, 2011 4:48 pm
Localização: Lisboa

Re: Python - Batteries Included

Mensagempor Bruno Oliveira em Quinta Jul 21, 2011 11:36 pm

Está em edição ainda, Filipe, tenho de ver mais alguns exemplos ainda, mas estou a ir aprendendo à medida que o estou a fazer, amanhã completo-o mais um pouco. :wink:
e^{ix}=cos x + i\,sin x
Avatar do utilizador
Bruno Oliveira
top-Quark!
top-Quark!
 
Mensagens: 1553
Registado: Quarta Nov 14, 2007 10:19 pm
Localização: Lisboa

Re: Python - Batteries Included

Mensagempor Bruno Oliveira em Terça Out 11, 2011 9:28 pm

Informo aqui, que tentarei, assim que o meu tempo o permita, completar este tutorial. :)

Peço desculpa pela ausência forçada :?
e^{ix}=cos x + i\,sin x
Avatar do utilizador
Bruno Oliveira
top-Quark!
top-Quark!
 
Mensagens: 1553
Registado: Quarta Nov 14, 2007 10:19 pm
Localização: Lisboa


Voltar para Pitónica

Quem está ligado

Utilizadores a navegar neste fórum: Yahoo [Bot] e 1 visitante