Объявления переменных Python - PullRequest
0 голосов
/ 11 августа 2011

Я наткнулся на этот кусок кода и мне интересно, что он означает:

typ, dat = imap_conn.search(None, search_string)

Что именно означает typ, dat часть строки?

Ответы [ 7 ]

7 голосов
/ 11 августа 2011

Это распаковка кортежей, см. Документация Python . Если ваша функция возвращает кортеж, вы всегда можете распаковать его, используя синтаксис, подобный a, b = func().

Кроме того, вы можете использовать кортежи на лету, например a, b = b, a можно использовать для замены двух значений.

3 голосов
/ 11 августа 2011

typ, dat - это кортеж.При использовании в левой части задания a, b = x это эквивалентно:

a = x[0]
b = x[1]

В вашем примере typ, dat = imap_conn.search(None, search_string) эквивалентно:

search_res = imap_conn.search(None, search_string)
typ = search_res[0]
dat = search_res[1]

Этот методзапись кортежа в левой части задания называется распаковкой кортежа.

2 голосов
/ 11 августа 2011

В Python вы можете присваивать и / или возвращать более одного значения согласно следующему коду:

def fn ():
    return (7, 2)

(seven, two) = fn()
print seven
print two
print fn()

Это выводит:

7
2
(7, 2)

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

0 голосов
/ 11 августа 2011

Синтаксис для назначений дан в http://docs.python.org/reference/simple_stmts.html#assignment-statements

assignment_stmt ::=  (target_list "=")+ (expression_list | yield_expression)
target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" target_list ")"
                     | "[" target_list "]"
                     | attributeref
                     | subscription
                     | slicing

В левой части назначения содержится один или несколько target_list, которые являются отдельными запятыми целями.Последовательность справа распаковывается в каждую цель.Обратите внимание, что определение является рекурсивным, поэтому вы можете даже делать такие вещи, как:

a, [b, c, [d, e]], f = 1, (2, 3, (4, 5)), 6

, но на каждом уровне количество элементов и вложенность должны совпадать.Если вы используете Python 3, то есть опция для включения *target в target_list, и это поглотит переменное количество аргументов.

0 голосов
/ 11 августа 2011

Это то, что называется «распаковка», я считаю, что метод imap_conn.search(None, search_string возвращает 2 значения (вероятно, кортеж), эта запись позволяет вам назначить их 2 переменным за один выстрел.

Это эквивалентно:

return_val = imap_conn.search(None, search_string)
typ = return_val[0]
dat = return_val[1]
0 голосов
/ 11 августа 2011

Зависит от того, что поиск возвращается. Вы можете распаковать результат, используя этот синтаксис. Так, например:

>>>x, y = (1,2)
>>>x
1
>>>y
2
>>> x, y =[(1,2), [1,2,3,(1,2)]]
>>> x
(1, 2)
>>> y
[1, 2, 3, (1, 2)]
0 голосов
/ 11 августа 2011
typ, dat = imap_conn.search(None, search_string)

Выражение в правой части возвращает два значения, которые назначены двум переменным в левой части.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...