*Memo:
A range can be iterated with a for statement as shown below:
for x in range(5):
print(x)
# 0
# 1
# 2
# 3
# 4
fruits = ["Apple", "Orange", "Banana", "Kiwi", "Lemon", "Mango"]
for i in range(4):
print(fruits[i])
# Apple
# Orange
# Banana
# kiwi
for i in range(1, 6, 2):
print(fruits[i])
# Orange
# Kiwi
# Mango
for i in range(5, 0, -2):
print(fruits[i])
# Mango
# Kiwi
# Orange
A range can be unpacked with an assignment and for statement, function and * but not with ** as shown below:
v1, v2, v3 = range(3)
print(v1, v2, v3)
# 0 1 2
v1, *v2, v3 = range(6)
print(v1, v2, v3) # 0 [1, 2, 3, 4] 5
print(v1, *v2, v3) # 0 1 2 3 4 5
for v1, v2, v3 in [range(3), range(3, 6)]:
print(v1, v2, v3)
# 0 1 2
# 3 4 5
for v1, *v2, v3 in [range(6), range(6, 12)]:
print(v1, v2, v3)
print(v1, *v2, v3)
# 0 [1, 2, 3, 4] 5
# 0 1 2 3 4 5
# 6 [7, 8, 9, 10] 11
# 6 7 8 9 10 11
print(*range(4), *range(4, 6))
# 0 1 2 3 4 5
print([*range(4), *range(4, 6)])
# [0, 1, 2, 3, 4, 5]
def func(p1='a', p2='b', p3='c', p4='d', p5='e', p6='f'):
print(p1, p2, p3, p4, p5, p6)
func()
# a b c d e f
func(*range(4), *range(4, 6))
# 0 1 2 3 4 5
def func(p1='a', p2='b', *args):
print(p1, p2, args)
print(p1, p2, *args)
print(p1, p2, ['A', 'B', *args, 'C', 'D'])
func()
# a b ()
# a b Nothing
# a b ['A', 'B', 'C', 'D']
func(*range(4), *range(4, 6))
# 0 1 (2, 3, 4, 5)
# 0 1 2 3 4 5
# 0 1 ['A', 'B', 2, 3, 4, 5, 'C', 'D']
Even a big range doesn't get MemoryError as shown below:
v = range(100000000)
print(v)
# range(0, 100000000)
print(v[0], v[1], v[2])
# 0 1 2
A range can be read by slicing as shown below:
*Memo:
- Slicing can be done with one or more
[start:end:step]in the range[start, end):-
start(Optional-Default:None-Type:int/NoneType):- It's a start index(inclusive).
- If it's
None, it's the 1st index. - Don't use
start=.
-
end(Optional-Default:None-Type:int/NoneType):- It's an end index(exclusive).
- If it's
None, it's the range length. - Don't use
end=.
-
step(Optional-Default:None-Type:int/NoneType):- It's the interval of indices.
- If it's
None, it's1. - It cannot be zero.
- Don't use
end=.
- The
[]with at least one:is slicing. -
startandendcan be signed indices(zero and positive and negative indices). - Error doesn't occur even if
[start, end)is out of the range[The 1st index, The range length).
-
v1 = range(10)
print(v1)
# range(0, 10)
print(*v1)
print(*v1[:])
print(*v1[::])
print(*v1[None:None:None])
print(*v1[0:11:1])
print(*v1[-100:100:1])
# 0 1 2 3 4 5 6 7 8 9
v2 = v1[2:8]
v2 = v1[-8:-2]
print(v2)
# range(2, 8)
print(*v2)
# 2 3 4 5 6 7
v2 = v1[2:8:2]
v2 = v1[-8:-2:2]
print(v2)
# range(2, 8)
print(*v2)
# 2 4 6
A range cannot be changed by indexing, slicing and a del statement as shown below:
*Memo:
- A
delstatement cannot remove zero or more numbers from a range by indexing and slicing but can remove one or more variables themselves.
v = range(6)
print(*v)
# 0 1 2 3 4 5
v[1] = 10
v[-5] = 10
v[3:5] = [20, 30]
v[-3:-1] = [20, 30]
v[1], v[3:5] = 10, [20, 30]
v[-5], v[-3:-1] = 10, [20, 30]
# TypeError: 'range' object does not support item assignment
v = range(6)
print(*v)
# 0 1 2 3 4 5
del v[1], v[3:5]
del v[-5], v[-2:5]
# TypeError: 'range' object does not support item deletion
v = range(5)
del v
print(v)
# NameError: name 'v' is not defined
A range can be continuously used through multiple variables as shown below:
v1 = v2 = v3 = range(5) # Equivalent
# v1 = range(5)
print(v1, *v1) # range(0, 5) 0 1 2 3 4 # v2 = v1
print(v2, *v2) # range(0, 5) 0 1 2 3 4 # v3 = v2
print(v3, *v3) # range(0, 5) 0 1 2 3 4
A range can be shallow-copied (only by slicing) but cannot deep-copied as shown below:
<Shallow copy>:
*Memo:
-
v1andv2refer to different ranges (only by slicing) and each same element. -
iskeyword can check ifv1andv2refer to the same range and each same element. - Slicing can shallow-copy the range.
- copy.copy() cannot shallow-copy a range.
v1 = range(5)
v2 = v1[:]
print(v1, *v1) # range(0, 5) 0 1 2 3 4
print(v2, *v2) # range(0, 5) 0 1 2 3 4
print(v1 is v2, v1[2] is v2[2])
# False True
import copy
v1 = range(5)
v2 = copy.copy(v1)
print(v1, *v1) # range(0, 5) 0 1 2 3 4
print(v2, *v2) # range(0, 5) 0 1 2 3 4
print(v1 is v2, v1[2] is v2[2])
# True True
<Deep copy>:
*Memo:
-
v1andv2refer to the same range and each same element. - copy.deepcopy() cannot deep-copy and even shallow-copy a range.
import copy
v1 = range(5)
v2 = copy.deepcopy(v1)
print(v1, *v1) # range(0, 5) 0 1 2 3 4
print(v2, *v2) # range(0, 5) 0 1 2 3 4
print(v1 is v2, v1[2] is v2[2])
# True True
Top comments (0)