Форматирование строки Python

Я изучаю код проекта с открытым исходным кодом. Код написан на питоне, и, к сожалению, я не очень в этом разбираюсь. Я нашел много утверждений в коде, например:

print "the string is %s" % (name_of_variable, )

Я знаю, что, как и в языке c, это способ правильного форматирования вывода, но я действительно не понимаю, что означает запятая сразу после «name_of_variable» в скобках.

Я просмотрел документацию по Python, но ничего не нашел об этом заявлении. Кто-нибудь знает, в чем его смысл?


person user3098549    schedule 11.11.2014    source источник


Ответы (7)


Завершающая запятая — это способ создать кортеж из одного элемента. Обычно вы создаете кортеж, перечисляя набор значений или переменных в круглых скобках, разделенных запятой:

my_tuple = (1, 2, 3)

Однако скобки на самом деле не нужны. Вы можете создать такой кортеж:

my_tuple = 1, 2, 3

Конечно, это вызывает проблему с одноэлементными кортежами. Если вы опустите круглые скобки, вы просто присваиваете переменную одной переменной:

my_tuple = 1    # my_tuple is the integer 1, not a one-element tuple!

Но использование круглых скобок неоднозначно, поскольку заключение значения в круглые скобки абсолютно законно:

my_tuple = (1)    # my_tuple is still the integer 1, not a one-element tuple

Таким образом, вы указываете кортеж из одного элемента, добавляя запятую в конце:

my_tuple = 1,
# or, with parentheses
my_tuple = (1,)

Форматирование строк принимает кортеж в качестве аргументов, поэтому, если вы используете кортеж из одного элемента, вы должны поставить запятую в конце. (Конечно, форматирование строк имеет специальную обработку для случаев, когда вы передаете только одну переменную для форматирования — в таких случаях вы можете просто использовать значение вместо кортежа.)

person mipadi    schedule 11.11.2014

Если name_of_variable является кортежем, то

print "the string is %s" % (name_of_variable)

выкинет TypeError.

В результате вам придется использовать print "the string is %s" % (name_of_variable, ) для его печати.

person Dhruv    schedule 11.11.2014
comment
это не ошибка. - person Vishnu Upadhyay; 11.11.2014
comment
В [21]: tup = (1,2) В [22]: напечатайте строку %s % (tup) TypeError Traceback (последний последний вызов) ‹ipython-input-22-894879fef188› в ‹module›() 1 вывести строку %s % (tup) TypeError: не все аргументы преобразуются при форматировании строки - person Dhruv; 11.11.2014
comment
это случай кортежей. в любом другом случае работает - person Vishnu Upadhyay; 11.11.2014
comment
Я упомянул, что если переменная, которую он пытается напечатать, является кортежем, то будет выброшена только ошибка, иначе все будет работать нормально. - person Dhruv; 11.11.2014

Запятая используется, когда у вас есть более одной переменной. например

print "the string is %s %s" % (name_of_variable1, name_of_variable2)

Более подробная информация находится здесь https://stackoverflow.com/a/5082482/2382792.

person ρss    schedule 11.11.2014

Неважно, есть у вас запятая или нет, когда вы используете только одну переменную, вам также не нужны круглые скобки только с одной переменной.

Здесь используется кортеж (круглые скобки и запятая), чтобы соответствовать ситуациям с несколькими переменными.

И если у вас нет запятой в кортеже из одного элемента, это уже не кортеж.

Например, a = (1) type(a) # <type 'int'>

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

person Rikka    schedule 11.11.2014

Это синтаксис для создания кортежа из одного элемента. См., например, эту ссылку. Здесь это не обязательно, так как print также будет принимать одну переменную, но в целом (x) эквивалентно x, поэтому единственный способ заставить его интерпретироваться как синтаксис tuple — это странная форма. Обратите внимание на разницу:

>>> x = 0
>>> (x)
0
>>> (x,)
(0,)
>>> type((x))
<type 'int'>
>>> type((x,))
<type 'tuple'>
>>>

Кроме того, скобки не нужны:

>>>x,
>>>(0,)

Вы также можете прочитать об %-formatting синтаксис.

person BartoszKP    schedule 11.11.2014

Запятая в (x,) указывает Python, что скобки заключают в себе кортеж, как в отличие от формы в скобках подвыражения с одним значением (чаще всего используется для изменения приоритета оператора, например, (a+b) * 2 отличается от a + b*2). Оператор форматирования строки довольно хорошо угадывает, когда отдельное значение не должно быть последовательностью, но если вы передадите кортеж вместо строки, он будет развернут:

>>> mytup=("Hello world!",)
>>> print "%s"%(mytup)
Hello world!
>>> print "%s"%(mytup,)
('Hello world!',)
>>> mytup=("Hello world!","Yoo-hoo, big summer blow-out!")
>>> print "%s"%(mytup)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting

Оператор пытается походить на вызов функции, где список аргументов всегда передается как кортеж (и, возможно, словарь для именованных аргументов). Это несоответствие исчезает при вызове str.format в качестве кортежа. -формирующие круглые скобки являются частью синтаксиса вызова метода.

person Yann Vernier    schedule 11.11.2014

Здесь , не является конкретным, поскольку вы используете только одну переменную.

In [96]: print "the string is %s" % (name_of_variable, )
the string is assdf

In [97]: print "the string is %s" % name_of_variable
the string is assdf

Выход такой же.

но если name_of_variable является tuple, то необходимо использовать , в операторе печати

In [4]: tup = (1,2,)
In [6]:  print ("the string is %s" % (tup))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-fb9ef4de3ac3> in <module>()
----> 1 print ("the string is %s" % (tup))

TypeError: not all arguments converted during string formatting

In [7]:  print ("the string is %s" % (tup,))
the string is (1, 2)
person Vishnu Upadhyay    schedule 11.11.2014
comment
Вам также не нужны скобки. - person Vincent Beltman; 11.11.2014
comment
Итак, почему вы думаете, что тот, кто написал код, использовал запятые? Я нашел это во многих утверждениях, поэтому кажется странным, что это опечатка. - person user3098549; 11.11.2014
comment
@user3098549 user3098549 Это просто питонический способ писать. , частей, когда вы создаете кортеж из одного элемента. t = 1, создает кортеж, а t = 1 просто целое число. - person Vishnu Upadhyay; 11.11.2014
comment
Поскольку кортеж необходим для ›1 аргумента, существует сильная тенденция использовать кортеж и для одного аргумента; его просто проще расширить на случай дополнительных аргументов в будущем. - person guidot; 11.11.2014
comment
@guidot да, я знал это, но спасибо, что исправили меня здесь, но в вопросе пользователь не указал, что ввод является кортежем, я просто пытаюсь проиллюстрировать. - person Vishnu Upadhyay; 11.11.2014