2.1. Unpack Assignment¶
a = 1
- Assignmenta, b = 1, 2
- Unpacking assignmenta = b = 1
- Multi assignment_
is regular variable name, not a special Python syntax_
by convention is used for data we don't want to access in future
Assignment:
>>> a = 1
Unpacking assignment:
>>> a, b = 1, 2
Multi assignment:
>>> a = b = 1
Multi unpacking assignment:
>>> a, b = c, d = 1, 2
2.1.1. Assignment¶
Scalar Assignment
identifier = object
a = 1
a = 1, 2
>>> a = 1
>>>
>>> print(f'{a=}')
a=1
>>> a = 1, 2
>>>
>>> print(f'{a=}')
a=(1, 2)
2.1.2. Unpacking Assignment¶
iterable[identifier] = iterable[object]
a, b = 1, 2
a, b, c = 1, 2, 3
Vector Assignment
Sequence Assignment
Iterable Assignment
Length at right and left side must be the same
>>> a, b = 1, 2
>>>
>>> print(f'{a=}, {b=}')
a=1, b=2
>>> a, b = 1, 2
>>> a, b, c = 1, 2, 3
>>> a, b, c, d = 1, 2, 3, 4
>>> a, b, c, d, e = 1, 2, 3, 4, 5
2.1.3. Multi Assignment¶
identifier1 = identifier2 = object
a = b = 1
a = b = c = 1
>>> a = b = 1
>>>
>>> print(f'{a=}, {b=}')
a=1, b=1
>>> a = b = 1
>>> a = b = c = 1
>>> a = b = c = d = 1
>>> a = b = c = d = e = 1
2.1.4. Multi Unpacking Assignment¶
iterable[identifier] = iterable[identifier] = iterable[object]
>>> a, b = c, d = 1, 2
>>> print(f'{a=}, {b=}, {c=}, {d=}')
a=1, b=2, c=1, d=2
>>> a, b = c, d = 1, 2
>>>
>>> print(f'{a=}, {c=}')
a=1, c=1
>>>
>>> c = 0
>>> print(f'{a=}, {c=}')
a=1, c=0
2.1.5. Right-Side Brackets¶
Scalar assignments:
>>> a = 1, 2
>>> a = (1, 2)
>>> a = [1, 2]
>>> a = {1, 2}
Unpacking assignments:
>>> a, b = 1, 2
>>> a, b = (1, 2)
>>> a, b = [1, 2]
>>> a, b = {1, 2}
Rationale:
>>> a, b = 1, 2
>>> a, b = (1, 2)
2.1.6. Left-Side Brackets¶
>>> (a) = (1)
>>>
>>> print(a)
1
>>> (a, b) = 1, 2
>>> (a, b) = (1, 2)
>>> (a, b, c) = (1, 2, 3)
>>> (a, b, c) = (1, 2, 3)
>>> (a, b, c) = [1, 2, 3]
>>> [a, b, c] = [1, 2, 3]
>>> [a, b, c] = (1, 2, 3)
2.1.7. Errors¶
>>> a, b, c = 1, 2, 3, 4
Traceback (most recent call last):
ValueError: too many values to unpack (expected 3)
>>> a, b, c = 1, 2
Traceback (most recent call last):
ValueError: not enough values to unpack (expected 3, got 2)
>>> {a, b, c} = {1, 2, 3}
Traceback (most recent call last):
SyntaxError: cannot assign to set display here. Maybe you meant '==' instead of '='?
>>> {a, b, c} = 1, 2, 3
Traceback (most recent call last):
SyntaxError: cannot assign to set display here. Maybe you meant '==' instead of '='?
2.1.8. Unpacking¶
>>> data = [1, 2, 3]
>>> a, b, c = data
>>>
>>> print(f'{a=}, {b=}, {c=}')
a=1, b=2, c=3
>>> line = 'Mark,Watney,40'
>>> firstname, lastname, age = line.split(',')
>>>
>>> print(f'{firstname=}, {lastname=}, {age=}')
firstname='Mark', lastname='Watney', age='40'
>>> data = ['Mark', 'Watney', ('mwatney@nasa.gov', 'mwatney@gmail.com')]
>>> firstname, lastname, emails = data
>>>
>>> print(f'{firstname=}\n{lastname=}\n{emails=}')
firstname='Mark'
lastname='Watney'
emails=('mwatney@nasa.gov', 'mwatney@gmail.com')
2.1.9. Nested¶
>>> a, (b, c) = [1, (2, 3)]
>>>
>>> print(f'{a=}, {b=}, {c=}')
a=1, b=2, c=3
>>> data = ['Mark', 'Watney', ('mwatney@nasa.gov', 'mwatney@gmail.com')]
>>> firstname, lastname, (email_work, email_home) = data
>>>
>>> print(f'{firstname=}\n{lastname=}\n{email_work=}\n{email_home=}')
firstname='Mark'
lastname='Watney'
email_work='mwatney@nasa.gov'
email_home='mwatney@gmail.com'
2.1.10. Skipping Values¶
_
is regular variable name, not a special Python syntax_
by convention is used for data we don't want to access in future
>>> _ = 'Mark Watney'
>>>
>>> print(_)
Mark Watney
>>> line = 'Mark,Watney,40'
>>> firstname, lastname, _ = line.split(',')
>>>
>>> print(f'{firstname=}, {lastname=}')
firstname='Mark', lastname='Watney'
>>> line = 'Mark,Watney,40,185,75.5'
>>> firstname, lastname, _, _, _ = line.split(',')
>>>
>>> print(f'{firstname=}, {lastname=}')
firstname='Mark', lastname='Watney'
2.1.11. Use Case - 0x01¶
>>> a, b, c = range(0, 3)
>>> a, b, c, d, e = range(0, 5)
2.1.12. Use Case - 0x02¶
Skip
>>> a, b, _ = 1, 2, 3
>>> a, _, _ = 1, 2, 3
>>> a, _, c = 1, 2, 3
>>> _, b, _ = 1, 2, 3
>>> _, _, c = 1, 2, 3
2.1.13. Use Case - 0x03¶
Passwd
>>> line = 'watney:x:1000:1000:Mark Watney:/home/watney:/bin/bash'
>>> username, _, uid, _, _, _, _ = line.split(':')
>>>
>>> print(f'{username=}, {uid=}')
username='watney', uid='1000'
2.1.14. Use Case - 0x04¶
Important
>>> _, important, _ = 1, 2, 3
>>>
>>> print(important)
2
>>> _, (important, _) = [1, (2, 3)]
>>>
>>> print(important)
2
>>> _, _, important = (True, [1, 2, 3, 4], 5)
>>>
>>> print(important)
5
>>> _, _, important = (True, [1, 2, 3, 4], (5, True))
>>>
>>> print(important)
(5, True)
>>>
>>> _, _, (important, _) = (True, [1, 2, 3, 4], (5, True))
>>>
>>> print(important)
5
Python understands this as:
>>> _ = (True, [1, 2, 3, 4], (5, True))
>>>
>>> a,b,c = (object, object, object)
>>> a,b,(c,d) = (object, object, (object,object))
2.1.15. Recap¶
Four types of assignments: Scalar, Vector, Multi
For unpacking assignment, lengths at both sides must be the same
Both left and right expression side brackets are optional
Unpacking nested sequences
Skipping values is done by using
_
Scalar assignment:
>>> a = 1
Vector assignment:
>>> a, b = 1, 2
Multi assignment:
>>> a = b = 1
Unpacking nested:
>>> a, (b, c) = 1, (2, 3)
Skipping:
>>> _, (important, _) = 1, (2, 3)
2.1.16. Assignments¶
"""
* Assignment: Unpack Assignment List
* Required: yes
* Complexity: easy
* Lines of code: 1 lines
* Time: 3 min
English:
1. Separate ip address and host name
2. Run doctests - all must succeed
Polish:
1. Odseparuj adres ip i nazwę hosta
2. Uruchom doctesty - wszystkie muszą się powieść
Tests:
>>> import sys; sys.tracebacklimit = 0
>>> assert ip is not Ellipsis, \
'Assign your result to variable `ip`'
>>> assert host is not Ellipsis, \
'Assign your result to variable `host`'
>>> assert type(ip) is str, \
'Variable `ip` has invalid type, should be str'
>>> assert type(host) is str, \
'Variable `hosts` has invalid type, should be str'
>>> ip
'10.13.37.1'
>>> host
'nasa.gov'
"""
DATA = ['10.13.37.1', 'nasa.gov']
# String with IP address: 10.13.37.1
# type: str
ip = ...
# String with host name: nasa.gov
# type: str
host = ...
"""
* Assignment: Unpack Assignment Split
* Required: yes
* Complexity: easy
* Lines of code: 1 lines
* Time: 3 min
English:
1. Split input data
2. Separate ip address and host name
3. Run doctests - all must succeed
Polish:
1. Podziel dane wejściowe
2. Odseparuj adres ip i nazwę hosta
3. Uruchom doctesty - wszystkie muszą się powieść
Hints:
* `str.split()`
Tests:
>>> import sys; sys.tracebacklimit = 0
>>> assert ip is not Ellipsis, \
'Assign your result to variable `ip`'
>>> assert host is not Ellipsis, \
'Assign your result to variable `host`'
>>> assert type(ip) is str, \
'Variable `ip` has invalid type, should be str'
>>> assert type(host) is str, \
'Variable `hosts` has invalid type, should be str'
>>> ip
'10.13.37.1'
>>> host
'nasa.gov'
"""
DATA = '10.13.37.1 nasa.gov'
# String with IP address: 10.13.37.1
# type: str
ip = ...
# String with host name: nasa.gov
# type: str
host = ...