words = [\'John\', \'nice\', \'skateboarding\']
statement = \"%s you are so %s at %s\" % w for w in words
produces
File \"
Two things are wrong:
You cannot create a generator expression without parenthesis around it. Simply putting w for w in words
is invalid syntax for python.
The %
string formatting operator requires a tuple, a mapping or a single value (that is not a tuple or a mapping) as input. A generator is not a tuple, it would be seen as a single value. Even worse, the generator expression would not be iterated over:
>>> '%s' % (w for w in words)
'<generator object <genexpr> at 0x108a08730>'
So the following would work:
statement = "%s you are so %s at %s" % tuple(w for w in words)
Note that your generator expression doesn't actually transform the words or make a selection from the words
list, so it is redundant here. So the simplest thing is to just cast the list to a tuple
instead:
statement = "%s you are so %s at %s" % tuple(words)
You could also use the new .format
style string formatting with the "splat" operator:
>>> words = ['John', 'nice', 'skateboarding']
>>> statement = "{0} you are so {1} at {2}".format(*words)
>>> print (statement)
John you are so nice at skateboarding
This works even if you pass a generator:
>>> statement = "{0} you are so {1} at {2}".format(*(x for x in words))
>>> print (statement)
John you are so nice at skateboarding
Although, in this case there is no need to pass a generator when you can pass words
directly.
One final form which I think is pretty nifty is:
>>> statement = "{0[0]} you are so {0[1]} at {0[2]}".format(words)
>>> print statement
John you are so nice at skateboarding
>>> statement = "%s you are so %s at %s" % tuple(words)
'John you are so nice at skateboarding'