2013-01-17 3 views

ответ

5
>>> statement = "%s you are so %s at %s" % tuple(words) 
'John you are so nice at skateboarding' 
2

Две вещи неправильны:

  • Вы не можете создать выражение генератора без круглых скобок вокруг него. Простое размещение w for w in words является недопустимым синтаксисом для python.

  • Оператор форматирования строки % требует ввода кортежа, сопоставления или одного значения (то есть не кортежа или отображения) в качестве входных данных. Генератор не является кортежем, он будет рассматриваться как одно значение. Еще хуже то, что выражение генератор не будет повторяться в течение:

    >>> '%s' % (w for w in words) 
    '<generator object <genexpr> at 0x108a08730>' 
    

Так следующее будет работать:

statement = "%s you are so %s at %s" % tuple(w for w in words) 

Обратите внимание, что ваше выражение генератор на самом деле не превратить слова или сделать выбор из списка words, поэтому он лишний. Так проще всего, это просто бросить список в tuple вместо:

statement = "%s you are so %s at %s" % tuple(words) 
+1

'кортеж (вес для ш в словах)' является излишеством :) видеть мой ответ. –

+0

@ Алексей Качаев: Конечно, но есть еще кое-что. Я, может быть, предстал слишком рано; обновлено. –

6

Вы также можете использовать новую строку .format стиля форматирования с «знак» оператора:

>>> words = ['John', 'nice', 'skateboarding'] 
>>> statement = "{0} you are so {1} at {2}".format(*words) 
>>> print (statement) 
John you are so nice at skateboarding 

Это работает, даже если вы передаете генератор:

>>> statement = "{0} you are so {1} at {2}".format(*(x for x in words)) 
>>> print (statement) 
John you are so nice at skateboarding 

Хотя, в этом случае нет необходимости передавать генератор, когда вы можете передать words непосредственно.

Одна окончательная форма, которую я думаю, что это довольно изящная является:

>>> statement = "{0[0]} you are so {0[1]} at {0[2]}".format(words) 
>>> print statement 
John you are so nice at skateboarding 
Смежные вопросы