Answer:
The generator function using yield from:
def scale(s, k):
yield from map(lambda x: x * k, s)
Another way to implement generator function that works same as above using only yield:
def scale(s, k):
for i in s:
yield i * k
Step-by-step explanation:
The complete program is:
def scale(s, k):
"""Yield elements of the iterable s scaled by a number k.
>>> s = scale([1, 5, 2], 5)
>>> type(s)
<class 'generator'>
>>> list(s)
[5, 25, 10]
>>> m = scale(naturals(), 2)
>>> [next(m) for _ in range(5)]
[2, 4, 6, 8, 10]
"""
yield from map(lambda x: x * k, s)
If you want to see the working of the above generator function scale() as per mentioned in the above comments, use the following statements :
s = scale([1, 5, 2], 5)
print(type(s))
#The above print statement outputs:
#<class 'generator'>
print(list(s))
#The above print statement outputs a list s with following items:
#[5, 25, 10]
The function def scale(s, k): is
def scale(s, k):
yield from map(lambda x: x * k, s)
This function takes two parameters i.e. s and k and this function yields elements of the given iterable s, scaled by k.
In this statement: yield from map(lambda x: x * k, s)
yield from is used which allows to refactor a generator in a simple way by splitting up generator into multiple generators.
The yield from is used inside the body of a generator function.
The lambda function is a function that has any number of arguments but can only have one expression. This expression is evaluated to an iterable from which an iterator will be extracted. This iterator yields and receives values to or from the caller of the generator. Here the expression is x: x * k and iterable is s. This expression multiplies each item to k.
map() method applies the defined function for each time in an iterable.
The generator function can also be defined as:
def scale(s, k):
for i in s:
yield i * k
For the above example
s = scale([1, 5, 2], 5)
def scale(s,k): works as follows:
s = [1, 5, 2]
k = 5
for loop iterates for each item i in iterable s and yields i*k
i*k multiplies each element i.e 1,5 and 2 to k=5 and returns a list
At first iteration, for example, i*k = 1 * 5 = 5, next iteration i*k = 5*5 = 25 and last iteration i*k = 2*5 = 10. So the output. So
s = scale([1, 5, 2], 5) In this statement now s contains 5, 25 and 10
print(list(s)) prints the values of s in a list as: [5, 25, 10] So output is:
[5, 25, 10]