Sam & Max » join http://sametmax.com Du code, du cul Sat, 07 Nov 2015 10:56:13 +0000 en-US hourly 1 http://wordpress.org/?v=4.1 Pourquoi ','.join en Python ? 8 http://sametmax.com/pourquoi-join-en-python/ http://sametmax.com/pourquoi-join-en-python/#comments Thu, 02 Aug 2012 14:30:09 +0000 http://sametmax.com/?p=1467 PHP:

implode(" ",  array("Fulguro", "Poing"))

Perl:

join(" ", qw(Astero Hache))

Ruby:

%w(Planitron Cornofulgur).join(' ')

Et…

Python:

' '.join(['pouet', 'pouet'])
Rage comic : "Python, Y NO MAKE SENSE"

C'est un des rares rage comics qui me fasse marrer

Mais pourquoi, mon Dieu, pourquoi ?

A cause du duck typing: on se branle du type et de sa capacité à joiner, on est juste intéressé par le fait qu’il soit itérable.

Ainsi, join() accepte n’importe quel itérable:

>>> '-'.join('azerty') # une string
'a-z-e-r-t-y'
>>> '-'.join(['a', 'b', 'c']) # une liste/un dico/un tuple/un set
'a-b-c'
>>> '-'.join((str(x ** x) for x in range(10))) # un expression génératrice
'1-1-4-27-256-3125-46656-823543-16777216-387420489'
>>> '-'.join(open('/etc/fstab'))[:100] # un fichier (et tout file like object)
"# /etc/fstab: static file system information.\n-#\n-# Use 'blkid -o value -s UUID' to print the univer"
>>> def generator(l): # et n'importe quel générateur custo
    count = 1
    for x in l:
        yield x * count
        count = count * (count + 1)
...         
>>> '-'.join(generator('pouet'))[:100]
'p-oo-uuuuuu-eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-ttttttttttttttttttttttttttttttttttttttttttttt'
>>> class LaClasse(object): # VRAIMENT n'importe quel itérable
    def __iter__(self):
        import datetime
        for x in xrange(10):
            yield datetime.datetime.now().strftime('%f')
...             
>>> '-'.join(LaClasse())
'902564-902628-902641-902650-902659-902667-902674-902682-902692-902710'
>>> # et même une chaîne batarde d'itérables improbables :-)
>>> list(iter(chain(LaClasse(), (str(x) for x in xrange(10))).next, '5'))
['043498', '043546', '043557', '043567', '043575', '043584', '043592', '043600', '043608', '043616', '0', '1', '2', '3', '4']

Et accessoirement ça permet de faire des trucs comme ça:

>>> join_coma = ",".join
>>> join_dash = "-".join
>>> join_coma('pouet')
'p,o,u,e,t'
>>> join_dash('pouet')
'p-o-u-e-t'
]]>
http://sametmax.com/pourquoi-join-en-python/feed/ 8