(sin asunto)
Chema Cortes
pych3m4 en gmail.com
Sab Oct 21 05:04:27 CEST 2006
Estoy de acuerdo contigo que no se debería ayudar a quien demuestra
que no se ha esforzado nada. De todos modos, quisiera comentarte
algunas mejoras de tu código:
El 2006/10/20, Christian Huelmo <chuelmo en montevideo.com.uy> escribió:
> Muy rapidito y sin control de errores me quedó esto:
>
> def dec2bin(decimal):
> binario = []
> while decimal > 1:
> binario.append(decimal % 2)
> decimal /= 2
> binario.append(decimal)
> return binario
>
> p = dec2bin(33)
> p.reverse()
> print p --> [1, 0, 0, 0, 0, 1]
En python tenemos operaciones en binario que pueden aprovecharse:
def dec2bin(n):
b=[]
while n:
n,r=n>>1,n&1
b.insert(0,r)
return b
De modo similar, pero usando la función 'divmod':
def dec2bin(n):
b=[]
while n:
n,r=divmod(n,2)
b.insert(0,r)
return b
Todavía más elegante, si cabe, son las versiones recursivas:
def dec2bin(n):
if n>1:
return dec2bin(n>>1)+[n&1]
else:
return [n]
def dec2bin(n):
if n>1:
n,r=divmod(n,2)
return dec2bin(n)+[r]
else:
return [n]
Con unos pocos cambios, también serviría para octal y hexadecimal:
def dec2oct(n):
if n:
return dec2oct(n>>3)+[n&7]
else:
return []
También se podría hacer una versión genérica (con clausura):
def dec2bin(n,pos=1):
mask=2**pos-1
def _dec2bin(n):
if n:
return _dec2bin(n>>pos)+[n&mask]
else:
return []
return _dec2bin(n)
from functools import partial #python 2.5
dec2oct=partial(dec2bin,pos=3)
dec2hex=partial(dec2bin,pos=4)
Como curiosidad, una versión publicada en esta misma lista hace tres años:
def dec2bin(n):
oct2binl=["000","001","010","011","100","101","110","111"]
return "".join([l[int(c)] for c in "%o"%n])
La misma cosa, pero en sólo una línea ("inliner"):
dec2bin=lambda x: "".join([
["000","001","010","011","100","101","110","111"][int(c)]
for c in "%o"%long(x)] )
En fin, seguro que hay más formas. Sólo es cuestión de ponerse a pensar un rato.
Más información sobre la lista de distribución Python-es