Oct-19-2020, 03:36 PM
(Oct-19-2020, 02:02 PM)DeaD_EyE Wrote: Calling __next__ directly is not the best idea.
This line will call the function, which returns a generator.
The generator keeps the state. Then you're calling next on the generator, which yields the first result.
even_nums.filter_even().__next__()But the generator is afterwards garbage collected because you have no reference to it.
even_nums = Even(10, 50, False) for num in even_nums.filter_even(): print(num) # only printing results = [] even_nums = Even(10, 50, False) for num in even_nums.filter_even(): print(num) results.append(num) # printing and appending to results even_nums = Even(10, 50, False) result = list(even_nums.filter_even()) even_nums = Even(10, 50, False) result = tuple(even_nums.filter_even()) even_nums = Even(10, 50, False) result = set(even_nums.filter_even())
You can also convert the class into an iterator iterable:
class Even: def __init__(self, start, stop): self.start = start self.stop = stop def __iter__(self): for i in range(self.start, self.stop + 1): if i % 2 == 0: yield i even_numbers = Even(10, 20) result = list(even_numbers) print(result)This is a boring class. So if the only functionality is to filter out even numbers, you can turn it into a function/generator.
def filter_even_numbers(sequence): for number in sequence: if number % 2 == 0: yield number numbers = [1,2,3,4,5,6] result = list(filter_even_numbers(numbers))If you need to select a start and stop index of your sequence, you can do it with the subscription:
numbers = [1,2,3,4,5,6] numbers_to_process = numbers[1:] # from index 1 to ... result = list(filter_even_numbers(numbers_to_process))
Thanks for your patience and explaining it very clearly.