Прежде всего, обратите внимание, что «сопоставление с образцом» функциональных языков и назначение упомянутых вами кортежей на самом деле не очень похоже. В функциональных языках шаблоны используются для частичного определения функции. Таким образом, f (x : s) = e
не означает, что нужно взять голову и хвост аргумента f
и вернуть e
, используя их, но это означает, что , если аргумент f
, имеет форму x : s
(для некоторых x
и s
) , тогда f (x : s)
равно e
.
Назначение python больше похоже на множественное назначение (я подозреваю, что это было его первоначальное намерение). Таким образом, вы пишете, например, x, y = y, x
, чтобы поменять местами значения в x
и y
без необходимости использования временной переменной (как это было бы с простым оператором присваивания). Это не имеет ничего общего с сопоставлением с образцом, так как это в основном сокращение для «одновременного» выполнения x = y
и y = x
. Хотя python допускает произвольные последовательности вместо разделенных запятыми списков, я бы не советовал называть этот шаблон соответствующим. При сопоставлении с образцом вы проверяете, соответствует ли что-либо шаблону; в назначении Python вы должны убедиться, что последовательности на обеих сторонах одинаковы.
Чтобы делать то, что вам, кажется, нужно, вы обычно (также на функциональных языках) используете либо вспомогательную функцию (как упоминалось другими), либо что-то похожее на конструкции let
или where
(которые вы можете рассматривать как анонимные функции). Например:
(head, tail) = (x[0], x[1:]) where x = my_func()
Или в реальном питоне:
(head, tail) = (lambda x: (x[0], x[1:]))(my_func())
Обратите внимание, что это, по сути, то же самое, что и решения, предоставленные другими с вспомогательной функцией, за исключением того, что вы хотели одну строку. Это, однако, не обязательно лучше, чем отдельная функция.
(Извините, если мой ответ немного зашкаливает. Я просто думаю, что важно прояснить различие.)