terça-feira, 10 de novembro de 2009

Flutuantes rangeres...

Em tempos recentes, uma foi hoje, fui questionado sobre a existência de um comando tipo range que funcione com números em vírgula flutuante e com incrementos fraccionários. Pré definido não há, mas podemos nós fazê-lo. Mete ao barulho conceitos que não deram ainda e são bizarros, por isso o melhor é agarrarem-se aos vossos assentos.

Comecemos pela solução.


def float_range(n1,n2=None,n3=1.0):
"""
Range para funcionar com números em vírgula flutuante.
Pode ser chamado como:
float_range(n)
float_range(n1,n2)
float_range(n1,n2,n3)
O significado é o mesmo do range normal.
"""

if n2 == None:
n2 = float(n1)
n1 = 0.0
proximo = n1
while (n3 >= 0.0 and proximo <= n2) or (n3 < 0.0 and proximo >= n2):
yield proximo
proximo = proximo + n3

Código estranho, não e? Sobretudo aquela instrução yield. O programa que escrevemos produz um objecto do tipo gerador. Cada vez que lhe peço, isto é chamo o comando, dá-me o próximo elemento de uma dada sequência. Neste caso, o próximo número da sequência entre n1 e n2, com incrementos de n3. Além disso, os parâmetros formais da definição têm valores por defeito! Assim, funciona para os três casos que conhecemos. Executando o código:


print 'Forma geral'
for i in float_range(1.0, 2.6,0.3):
print i
print 'Forma geral inversa'
for i in float_range(2.6, 1.0,-0.3):
print i
print 'Forma Simples'
for i in float_range(4.3):
print i
print 'Forma intermédia'
for i in float_range(2.5,4.3):
print i


obtemos como resultado:

Forma geral
1.0
1.3
1.6
1.9
2.2
2.5
Forma geral inversa
2.6
2.3
2.0
1.7
1.4
1.1
Forma Simples
0.0
1.0
2.0
3.0
4.0
Forma intermédia
2.5
3.5


Como vemos podemos usar o novo comando em ciclos for. Mas, e se quisermos os elementos em bloco, numa lista por exemplo. Uma solução fácil é a seguinte:


def float_range_lista(n1,n2=None,n3=1.0):
"""
Baseia-se em float_range
"""
x = float_range(n1,n2,n3)
y = list(x)
return y

Experimente agora fazer:

print float_range_lista(1.0,2.6,0.3)


e veja o que acontece. Espero que não tenha pesadelos. Mas se quiser sonhar, tente usar este princípio para gerar os números da sequência de Fibonacci. Se não sabe o que é ... procure através do Google!

3 comentários:

  1. José de Alencar, obrigado pelo seu comentário. O blogue tem andado um pouco ... morto. A partir de finais de Setembro espero poder retomar a escrita.

    ResponderEliminar
  2. Muito bom, estarei esperando novidades vlw

    ResponderEliminar