# 4.2. Idiom Range¶

• Return sequence of numbers

• It is not a generator

• Generator (lazy evaluated)

• range([start], <stop>, [step])

• optional start, inclusive, default: 0

• required stop, exclusive,

• optional step, default: 1

>>> from inspect import isgeneratorfunction, isgenerator
>>>
>>>
>>> isgeneratorfunction(range)
False
>>>
>>> result = range(0,5)
>>> isgenerator(result)
False


## 4.2.1. Example¶

>>> range(0,3)
range(0, 3)

>>> list(range(0,3))
[0, 1, 2]

>>> tuple(range(0,3))
(0, 1, 2)

>>> set(range(0,3))
{0, 1, 2}

>>> list(range(4,11,2))
[4, 6, 8, 10]


## 4.2.2. Problem¶

>>> i = 0
>>> result = []
>>>
>>> while i < 3:
...     result.append(i)
...     i += 1
>>>
>>> result
[0, 1, 2]


## 4.2.3. Solution¶

>>> result = range(0,3)
>>>
>>> list(result)
[0, 1, 2]


## 4.2.4. Lazy Evaluation¶

>>> for i in range(0,3):
...     print(i)
0
1
2


## 4.2.5. Itertools¶

>>> from itertools import count
>>>
>>>
>>> result = count(3, 2)
>>>
>>> next(result)
3
>>> next(result)
5
>>> next(result)
7


## 4.2.6. Assignments¶

"""
* Assignment: Idioms Range Impl
* Complexity: medium
* Lines of code: 7 lines
* Time: 13 min

English:
1. Write own implementation of a built-in range() function
2. Define function myrange with parameters:
a. parameter start: int
b. parameter stop: int
c. parameter step: int
3. Don't validate arguments and assume, that user will:
a. always pass valid type of arguments
b. never give only one argument
c. arguments will be unsigned
4. Run doctests - all must succeed

Polish:
1. Zaimplementuj własne rozwiązanie wbudowanej funkcji range()
2. Zdefiniuj funkcję myrange z parametrami:
a. parameter start: int
b. parameter stop: int
c. parameter step: int
3. Nie waliduj argumentów i przyjmij, że użytkownik:
a. zawsze poda argumenty poprawnych typów
b. nigdy nie poda tylko jednego argumentu
c. argumenty będą nieujemne
4. Uruchom doctesty - wszystkie muszą się powieść

Hint:
* https://github.com/python/cpython/blob/main/Objects/rangeobject.c

Tests:
>>> import sys; sys.tracebacklimit = 0
>>> from inspect import isfunction
>>> assert isfunction(myrange)

>>> myrange(0, 10, 2)
[0, 2, 4, 6, 8]

>>> myrange(0, 5)
[0, 1, 2, 3, 4]
"""

# Write own implementation of a built-in range() function
# Define function myrange with parameters: start, stop, step
# type: Callable[[int,int,int], list[int]]
def myrange():
...