[gull] Troll: Perl vs Python (was: Transtypage en Perl)

Christian Kaenzig christian at becool.ch
Thu Jun 25 00:15:49 CEST 2009


On Wednesday 24 June 2009 21:11:08 Félix Hauri wrote:
> On Wed, Jun 24, 2009 at 07:52:38PM +0200, Christian Kaenzig wrote:
> > >>> int("1000101101110",2)
> >
> > 4462
>
> Vouis, a condition que la chaine binaire soit présentée du bit fort au bit
> faible, 

C'est comme ça que j'écris un nombre en général :)

> comment présentes tu une chaine inversée?
>
> $ perl -e 'printf "%s\n", unpack("S", pack("b16","0111011010001000"));'
> 4462
> $ perl -e 'printf "%s\n", unpack("S", pack("B16","0110111000010001"));'
> 4462

Je ne connais pas de fonction qui ces transformations automatiquement, 
faudrait le faire à la main:

>>> int("0111011010001000"[::-1],2)
4462
>>> int(''.join(["0110111000010001"[x*8:x*8+8] for x in range(1,-1,-1)]),2)
4462

> Je dois dire que je n'apprécie pas toujours les contractions qui font
> que sur ta ligne tu ne mentionne ni commande (say ou print), ni

C'est l'habitude d'utiliser le shell de l'interpréteur python pour tester des 
bouts de codes. On met une expression et il affiche ce que ça retourne. C'est 
pas un raccourci du language, dans le sens où on ne peut pas mettre juste une 
expression dans une ligne de script python, mais pour tester, c'est très 
pratique.

> methode de translation (little-endian, big-endian), ni d'ailleur
> comment complêter ta string à 8,16 ou 32 bits, ni enfin si
> la completion se fait à gauche ou à droite...
>
> Bref, cela semble plus simple en python, comme ça, mais c'est lourd
> de sous-entendus (ou manipulation tacites)...

La fonction int() interprète des chaines de caractères représentant des 
nombres en int, et on peut choisir la base (d'où le ,2). Donc on ne peut pas 
spécifier différentes interprétations. On aurait pas non plus l'idée d'écrire un 
nombre en base 10 avec le chiffre de poids fort à droite...

C'est donc pas la même optique que les fonctions pack et unpack de perl.

> Enfin, comment fait un pythoniste pour lancer python en ligne de commande
> et executer un truc tout simple comme:
>
> $ perl -e 'printf "%s\n",join "\n",unpack("(B8)* ","RADIONUMÉRIQUE")'

python -c 'print "\n".join(map(lambda c:bin(ord(c))[2:].zfill(8), 
"RADIONUMÉRIQUE"))'

ou

python -c 'print "\n".join([bin(ord(c))[2:].zfill(8) for c in 
"RADIONUMÉRIQUE"])'

Un poil plus compliqué parce que la chaine binaire sortie par bin() parce que 
ça la sort sous forme 0b1001001 (comme ça sortirait 0x49 pour une chaine 
hexa).


Bye, a+,
Christian

-- 
Christian Kaenzig
http://chrisk.name/


More information about the gull mailing list