Python - Calcular los divisores de un numero con iteradores

 
Vista:
sin imagen de perfil
Val: 23
Ha disminuido su posición en 3 puestos en Python (en relación al último mes)
Gráfica de Python

Calcular los divisores de un numero con iteradores

Publicado por Candela (9 intervenciones) el 06/03/2021 12:32:33
Buenas! He empezado el tema de iteradores y hay un ejercicio que parece que se me esta resistiendo.

1
2
3
4
5
6
7
8
9
10
11
class Divisors:
    """iterator: Returns, one at a time, the Divisors os a positive integer"""
 
    def __init__(self, number):
        """Set number to get its Divisors
           raise ValueError is number is not a positve integer
        """
        if type(number) == int and number > 0:
            self.__number = number
        else:
            raise ValueError("Initalization parameter must be a positive integer")

A partir de dicho código tengo que completar la clase Divisors para convertirla en un iterador que devuelva, uno por uno y en orden ascendente, todos los divisores de un número entero positivo.

Yo he intentado tirar por este camino
1
2
3
4
5
6
7
8
9
10
11
12
13
def __iter__(self):
        self.current = 1
        self.stop = self.__number
        return self
 
    def __next__(self):
            if self.current <= self.__number:
                if self.__number % self.current == 0:
                    return (self.current)
                self.current += 1
 
            else:
                raise StopIteration

Pero me da un bucle infinito y no consigo encontrar la forma de resolverlo.

El resultado sería el siguiente:
1
2
f i in Divisors(12):
       print(i)

Output:
1
2
3
4
6
12
Agradezco cualquier tipo d ayuda o pista!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 2.808
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Calcular los divisores de un numero con iteradores

Publicado por tincopasan (1082 intervenciones) el 08/03/2021 18:25:50
en principio no está mal, pero estás teniendo un problema de lógica, que es lo que te lleva al bucle infinito:
1
2
3
4
if self.current <= self.__number:
    if self.__number % self.current == 0:
        return (self.current)
    self.current += 1

si te fijas el incremento está después del return a la función, lo cual hace que al cumplirse la condición de módulo 0 el valor actual nunca aumente.

te muestro una posible solución y modifico el método next y el bucle para una mejor presentación y lectura:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#-*- coding: utf -8 -*-
class Divisors:
    """iterator: Returns, one at a time, the Divisors os a positive integer"""
 
    def __init__(self, number):
        """Set number to get its Divisors
           raise ValueError is number is not a positve integer
        """
        if type(number) == int and number > 0:
            self.__number = number
        else:
            raise ValueError("Initalization parameter must be a positive integer")
 
    def __iter__(self):
        self.current = 1
        self.stop = self.__number
        return self
 
    def __next__(self):
        if self.__number < self.current:
            raise StopIteration
        if self.__number % self.current == 0:
            self.current += 1
            return self.current -1
        else:
            self.current+=1
            return 0
 
 
 
for i in Divisors(12):
    if i !=0:
        print(i)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar

Calcular los divisores de un numero con iteradores

Publicado por Santiago (1 intervención) el 05/03/2022 01:33:58
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
"""This module contains the class Divisors which is an Iterator."""
 
 
class Divisors:
    """iterator: Returns, one at a time, the divisors os a positive integer."""
 
    def __init__(self, number):
        """Set number to get its Divisors.
        raise ValueError is number is not a positive integer.
        """
        if type(number) == int and number > 0:
            self.__number = number
        else:
            raise ValueError(
                "Initalization parameter must be a positive integer"
                )
 
    def __iter__(self):
        """Iter."""
        self.__current = 1
        return self
 
    def __next__(self):
        """Next."""
        while self.__current <= self.__number:
            if self.__number % self.__current == 0:
                result = self.__current
                self.__current += 1
                return result
            else:
                self.__current += 1
                pass
        raise StopIteration
 
 
if __name__ == "__main__":
    for i in Divisors(12):
        print(i)

A lo mejor llego un poco tarde, pero como se suele decir, mejor tarde que nunca. Probablemente ya no necesites el código, pero a lo mejor otra persona, como yo, se topa con esto y se lleva una alegría.
Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar