[Tutor] Pythonify this code!
Alan Gauld
alan.gauld at btinternet.com
Mon Jul 13 12:30:43 CEST 2009
"Muhammad Ali" <ali.jan at gmail.com> wrote
> I tried my hand at steganography
Never heard of it before!
> #The code starts here:
>
> def separate(num, base):
> li = []
> while num / base > 0:
> li.insert(0, num % base)
> num = num / base
>
> li.insert(0,num)
> return li
>
> def combine(tup, base):
> num = 0
> mul = pow(base, len(tup) - 1)
> for i in tup:
> num = num + i * mul
> mul = mul / base
A general comment is that you can use the operator shortcuts
num /= base
mul /= base
same for the incrementing below.
> return num
> import Image
>
> def encode(img, text):
> ...
> for c in text:
> li = separate(ord(c), 10)
> ...
>
> r, g, b = pix[x, y]
>
> r = r - (r % 10) + li[0]
> if (r > 255):
> r = r - 10
>
> g = g - (g % 10) + li[1]
> if (g > 255):
> g = g - 10
>
> b = b - (b % 10) + li[2]
> if (b > 255):
> b = b - 10
The 3 sections above are nearly identical, you could create
a helper function to do the work.
def f(item, aList, index)
r = f(r,li,0)
g = f(g,li,1)
b = f(b,li,2)
Just think of a descriptive name for f()!
> pix[x,y] = (r,g,b)
>
> if y == width - 1:
> y = 0
> x = x + 1
> else:
> y = y + 1
>
> img.save(img.filename)
>
> def decode(img):
> x = 0
> y = 0
> text = ""
> c = ""
> height, width = img.size
> pix = img.load()
> while 1:
While 1 is now deprecated inf favour of while True
> r, g, b = pix[x, y]
> if (c == '~') and chr(combine([r % 10, g % 10, b % 10], 10)) ==
> '~':
> return text[:len(text) - 1]
This could be:
return text[:-2]
> c = chr(combineUnits([r % 10, g % 10, b % 10], 10))
> text = text + c
>
> if y == width - 1:
> y = 0
> x = x + 1
> else:
> y = y + 1
Again, this is repeated code so could go in a helper function.
I didn't notice anything that would be v3 specific. Also I can't
comment on the algorithm since I don't really know what its
doing!
HTH,
--
Alan Gauld
Author of the Learn to Program web site
http://www.alan-g.me.uk/
More information about the Tutor
mailing list