У Python элементы кортэжа або спісу могуць быць пашыраны і прызначаны для некалькіх зменных. Гэта называецца распакаванне паслядоўнасці або распакаванае прызначэнне.
Наступныя падрабязнасці апісаны тут.
- Распакоўванне асноў картэжаў і спісаў
- Укладзеныя картэжы, распакаваныя спісы
- Распакоўка з дапамогай падкрэслення:
_
- Распакоўка з зорачкамі:
*
Глядзіце наступны артыкул для інфармацыі аб выкарыстанні зорачак для пашырэння і перадачы картэжаў, спісаў і слоўнікаў у якасці аргументаў функцыі.
Распакоўванне асноў картэжаў і спісаў
Калі зменныя запісваюцца з левага боку, праз коскі, кожнай зменнай прысвойваецца элемент картэжа або спісу з правага боку. Гэта аднолькава як для картэжаў, так і для спісаў (наступныя прыклады напісаны ў выглядзе картэжа).
t = (0, 1, 2)
a, b, c = t
print(a)
print(b)
print(c)
# 0
# 1
# 2
l = [0, 1, 2]
a, b, c = l
print(a)
print(b)
print(c)
# 0
# 1
# 2
Звярніце ўвагу, што, паколькі ў картэжах можна апускаць круглыя дужкі, гэта можна выкарыстоўваць для прысваення некалькіх значэнняў некалькім зменным у адным радку наступным чынам.
a, b = 0, 1
print(a)
print(b)
# 0
# 1
Калі колькасць зменных не адпавядае колькасці элементаў, узнікае памылка.
# a, b = t
# ValueError: too many values to unpack (expected 2)
# a, b, c, d = t
# ValueError: not enough values to unpack (expected 4, got 3)
Калі колькасць зменных меншая за колькасць элементаў, астатнія элементы можна прызначыць у выглядзе спісу, дадаўшы зорачку да назвы зменнай (гл. ніжэй).
Укладзеныя картэжы, распакаваныя спісы
Укладзеныя картэжы і спісы таксама можна распакаваць. Калі вы таксама хочаце распакаваць змесціва, уключыце зменную ў адно з наступных
()
[]
t = (0, 1, (2, 3, 4))
a, b, c = t
print(a)
print(b)
print(c)
# 0
# 1
# (2, 3, 4)
print(type(c))
# <class 'tuple'>
a, b, (c, d, e) = t
print(a)
print(b)
print(c)
print(d)
print(e)
# 0
# 1
# 2
# 3
# 4
Распакавана з _падкрэсленнем_.
У Python, не толькі распакаваныя, значэнні, якія не патрэбныя, умоўна прысвойваюцца знаку падкрэслення (падкрэслення) _. Асаблівага граматычнага значэння няма; яны проста прысвойваюцца зменнай з імем _.
t = (0, 1, 2)
a, b, _ = t
print(a)
print(b)
print(_)
# 0
# 1
# 2
Распакоўка з зорачкамі
Калі колькасць зменных меншая за колькасць элементаў, зорачка ў назве зменнай прывядзе да таго, што элементы будуць прысвоены разам у выглядзе спісу.
Гэты сінтаксіс быў рэалізаваны з Python 3 і недаступны ў Python 2.
Элементы прысвойваюцца ад пачатку і канца зменным без зорачак, а астатнія элементы прысвойваюцца ў выглядзе спісу зменным з зорачкамі.
t = (0, 1, 2, 3, 4)
a, b, *c = t
print(a)
print(b)
print(c)
# 0
# 1
# [2, 3, 4]
print(type(c))
# <class 'list'>
a, *b, c = t
print(a)
print(b)
print(c)
# 0
# [1, 2, 3]
# 4
*a, b, c = t
print(a)
print(b)
print(c)
# [0, 1, 2]
# 3
# 4
Напрыклад, калі вы хочаце прысвоіць зменнай толькі першыя два элементы картэжа або спісу, вы можаце выкарыстоўваць прыведзенае вышэй падкрэсліванне для частак, якія не патрэбныя.
a, b, *_ = t
print(a)
print(b)
print(_)
# 0
# 1
# [2, 3, 4]
Тое ж самае можна запісаць і наступным чынам
a, b = t[0], t[1]
print(a)
print(b)
# 0
# 1
Можна прымацаваць толькі адну зорачку. Калі ёсць некалькі зменных, пазначаных зорачкай, прывядзе да памылкі SyntaxError, таму што немагчыма вызначыць, колькі элементаў прысвоена кожнай зменнай.
# *a, b, *c = t
# SyntaxError: two starred expressions in assignment
Звярніце ўвагу, што нават адзін элемент, прызначаны зменнай, пазначанай зорачкай, прызначаецца ў якасці спісу.
t = (0, 1, 2)
a, b, *c = t
print(a)
print(b)
print(c)
# 0
# 1
# [2]
print(type(c))
# <class 'list'>
Калі лішніх элементаў няма, прысвойваецца пусты спіс.
a, b, c, *d = t
print(a)
print(b)
print(c)
print(d)
# 0
# 1
# 2
# []