Si c'est dans les parenthèses, mais pas entre parenthèses, il est techniquement un générateur d'expression. Générateur d'expressions ont été d'abord introduit en Python 2.4.
http://wiki.python.org/moin/Generators
La partie après le rejoindre, ( str(_) for _ in xrange(10) )
est, par elle-même, un générateur d'expression. Vous pourriez faire quelque chose comme:
mylist = (str(_) for _ in xrange(10))
''.join(mylist)
et ça veut dire exactement la même chose que vous avez écrit dans le deuxième cas ci-dessus.
Les générateurs de certaines des propriétés très intéressantes, et non la moindre, est qu'ils ne finissent pas l'allocation de l'ensemble de la liste lorsque vous n'en avez pas besoin. Au lieu de cela, une fonction comme join "pompes" les éléments du générateur d'expression, un à un, de son travail sur les petites parties intermédiaires.
Dans vos exemples, la liste et le générateur n'est probablement pas effectuer terriblement différemment, mais en général, je préfère utiliser le générateur d'expressions (et même générateur de fonctions) dès que je peux, surtout parce que c'est extrêmement rare pour un générateur à être plus lent que d'une liste complète matérialisation.