Что такое правило синтаксиса для наличия запятых в определениях кортежей?

В случае одного элемента кортежа требуется конечная запятая.

a = ('foo',) 

Как насчет кортежа с несколькими элементами? Кажется, что существуют ли конечные запятые или нет, они оба действительны. Это верно? С моей точки зрения, редактирование запятой проще для редактирования. Это плохой стиль кодирования?

 a = ('foo1', 'foo2') b = ('foo1', 'foo2',) 

Во всех случаях, кроме пустого кортежа, важна запятая. Скобки необходимы только тогда, когда это требуется для других синтаксических причин: различать кортеж из набора аргументов функции, приоритета оператора или разрешать разрывы строк.

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

 a = [ "a", "b" "c" ] 

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

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

 (1) # the number 1 (the parentheses are wrapping the expression `1`) (1,) # a 1-tuple holding a number 1 

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

например,

 someBigTuple = ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, #... 10000000000, ) 

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

Еще одно преимущество конечных запятых состоит в том, что он делает различия более приятными. Если вы начали с

 a = [ 1, 2, 3 ] 

и изменил его на

 a = [ 1, 2, 3, 4 ] 

Разница будет выглядеть так:

  a = [ 1, 2, - 3 + 3, + 4 ] 

Если вы начали с запятой, например,

 a = [ 1, 2, 3, ] 

Тогда разность будет просто

  a = [ 1, 2, 3, + 4, ] 

Это необязательно: см. Вики Python .

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

Также рассмотрите ситуацию, в которой вы хотите:

 >>> (('x','y'))*4 # same as ('x','y')*4 ('x', 'y', 'x', 'y', 'x', 'y', 'x', 'y') #Expected = (('x', 'y'), ('x', 'y'), ('x', 'y'), ('x', 'y')) 

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

 >>> (('x','y'),)*4 (('x', 'y'), ('x', 'y'), ('x', 'y'), ('x', 'y')) 

Трейлинг-запятая требуется только для одноэлементных кортежей. Наличие конечной запятой для больших кортежей является вопросом стиля и не требуется. Его наибольшее преимущество – чистые различия в файлах с многострочными большими кортежами, которые часто изменяются (например, конфигурационные кортежи).

Другая причина, по которой это происходит, заключается в том, что упрощает __repr__ генерации кода и функций __repr__ . Например, если у вас есть объект, построенный как obj(arg1, arg2, ..., argn) , тогда вы можете просто написать obj.__repr__ as

 def __repr__(self): l = ['obj('] for arg in obj.args: # Suppose obj.args == (arg1, arg2, ..., argn) l.append(repr(arg)) l.append(', ') l.append(')') return ''.join(l) 

Если конечная запятая не была разрешена, в последнем случае вам придется использовать специальный аргумент. Фактически, вы могли бы написать выше в одной строке, используя понимание списка (я написал его дольше, чтобы упростить его чтение). Было бы не так легко сделать это, если бы у вас был специальный случай с последним термином.

Это простой ответ.

a = (“s”) является строкой

а также

a = (“s”,) является кортежем с одним элементом.

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

Например, попробуйте это на консоли python:

a = (“s”)

a = a + (1,2,3)

Traceback (последний последний вызов):

Файл stdin, строка 1, в модуле

TypeError: не может конкатенировать объекты ‘str’ и ‘tuple’

Стиль кодирования – это ваш вкус. Если вы считаете, что стандартное кодирование имеет значение PEP-8, это может вам помочь.

Что вы думаете о результате следующего выражения?

 x = (3) x = (3+2) x = 2*(3+2) 

Да, x – просто число.

  • Как передать функцию в качестве параметра в C?
  • Что такое ключевое слово open в Swift?
  • #import с помощью угловых скобок и кавычек ""
  • Разбор (разделение) строки в C ++ с использованием разделителя строк (стандартный C ++)
  • Вопросительный знак и двоеточие в JavaScript
  • Как избежать одиночных кавычек в одиночных кавычках?
  • Что делает ключевое слово `forall` в Haskell / GHC?
  • В C, какой правильный синтаксис для объявления указателей?
  • Почему некоторые люди предпочитают «T const &» над «const T &»?
  • Какие символы разрешены для операторов haskell?
  • Что это означает, когда числовая константа в C / C ++ имеет префикс с 0?
  • Давайте будем гением компьютера.