Python - Problema con objetos.

   
Vista:

Problema con objetos.

Publicado por Joloch (4 intervenciones) el 07/02/2013 03:49:13
Hola, recién comencé a interesarme en Python y me puse a transcribir las tareas que me han marcado para Java en el nuevo lenguaje, pero me topé con un problema. En Java me marcaron hacer la Serie Fibonacci de forma iterativa y recursiva. Al pasar dichos códigos a Python el iterativo me funcionó, pero el recursivo no. Estoy acostumbrado a utilizar métodos y objetos, así que al ejecutar mi programa:

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class FibonacciRecursivo:
 
    pass
 
Serie = [10]
 
def __init__(self):
 
    return
 
@classmethod
def Funcion(cls, n):
 
    if n == 0:
 
       return 0 #Para poder usar return, tiene que haberse declarado una función
 
    elif n == 1: #elif es similar a usar "or".
 
       return 1
 
    else:
 
       return Funcion(n - 1) + Funcion(n - 2)
 
     #Fin de la función
 
@classmethod
def Llena(cls):
 
      C = 0
 
      while C < len(Serie):
 
          Serie[C] = Funcion(C)
 
          C += 1
 
@classmethod
def Imprime(cls):
 
    Q = 0
 
    while Q < len(Serie):
 
        print(Serie[Q])
 
        Q += 1
 
 
def main():
 
    obj = FibonacciRecursivo()
 
    obj.Llena()
    obj.Imprime()
 
if __name__ == '__main__':
    main()


Me genera el siguiente error:

Traceback (most recent call last):
File "C:/Users/Joloch/PycharmProjects/Varios/FibonacciRecursivo", line 60, in <module>
main()
File "C:/Users/Joloch/PycharmProjects/Varios/FibonacciRecursivo", line 56, in main
obj.Llena()
AttributeError: 'FibonacciRecursivo' object has no attribute 'Llena'


Y no tengo idea de cuál sea el problema. Les agradeceré muchísimo su ayuda :3
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
Imágen de perfil de xve

Problema con objetos.

Publicado por xve (1231 intervenciones) el 07/02/2013 07:56:45
Hola Joloch, es error que tienes, es porque la función Llenar y la función Imprime no están dentro del objeto FibonacciRecursivo()..

Es mas, el objeto FibonacciRecursivo no tiene nada... para que las funciones estén dentro del objeto, recuerda que tienen que estar tabuladas dentro.

1
2
3
4
5
6
7
8
9
class a:
    var=0
 
    def __init(self):
        pass
 
    def function(self,parameter):
        self.var=1
        return self.var


Si luego dentro de las funciones quieres hacer referencia a la variable, recuerda utilizar self.variable

espero que te ayude.
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

Problema con objetos.

Publicado por Joloch (4 intervenciones) el 08/02/2013 07:09:34
Gracias, igual y vi que mi main tenía un error. Ahora ya no me tira errores, pero en lugar de que me imprima la serie, me imprime sólo un 0, parece que no me está llenando el arreglo, sino que sólo está devolviendo el 1 y 0 de mis condiciones en mi método Funcion:

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class FibonacciRecursivo(object):
 
      pass
 
      Serie = [10]
 
      def __init__(self):
 
          return
 
      @classmethod
      def Funcion(self, n):
 
          if n == 0:
 
           return 0
 
          elif n == 1:
 
           return 1
 
          else:
 
           return self.Funcion(n - 1) + self.Funcion(n - 2)
 
 
      @classmethod
      def Llena(self):
 
          C = 0
 
          while C < len(self.Serie):
 
              self.Serie[C] = self.Funcion(C)
 
              C += 1
 
              return
 
      @classmethod
      def Imprime(self):
 
          Q = 0
 
          while Q < len(self.Serie):
 
              print(self.Serie[Q])
 
              Q += 1
 
              return
 
 
      def main(self):
 
          obj = FibonacciRecursivo()
 
          obj.Llena()
          obj.Imprime()
 
if __name__ == '__main__':
 
    FibonacciRecursivo().main()


Ya probé incluso remplazando mi if y mi elif, por una condicion:
1
2
if n < 2:
   return 1

y ello sólo me imprime el 1.
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
Imágen de perfil de xve

Problema con objetos.

Publicado por xve (1231 intervenciones) el 08/02/2013 08:08:50
Este bucle me parece que no llega a entrar nunca:
1
while C < len(self.Serie):

self.Series es 0, no? por lo tanto no llega a hacer el bucle.
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

Problema con objetos.

Publicado por Joloch (4 intervenciones) el 09/02/2013 04:18:44
¿Cómo así? Pero si Serie es un arreglo de 10, no veo dónde puede estar el error. Es más, te dejo mi código de java para compararlo:

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class Serie {
 
	int V[] = new int[10];
 
	Serie() {
 
	}
 
	public int Fibonacci(int Numero) {
 
		if(Numero < 2) {
 
			return 1;
 
		}
 
		else
 
			return Fibonacci(Numero - 1) + Fibonacci(Numero - 2);
 
	}
 
	public void LlenaV() {
 
        int Y;
 
		for(Y = 0; Y < V.length; Y++) {
 
			 V[Y] = Fibonacci(Y);
 
		}
 
	}
 
	public void Imprime() {
 
		int N;
 
		for(N = 0; N < V.length; N++) {
 
			System.out.println(V[N]+ " ");
 
		}
 
		return;
 
	}
 
	public static void main(String[] Galletas) {
 
		Serie objeto = new Serie();
 
		objeto.LlenaV();
		objeto.Imprime();
 
	}
 
}


Sólo que mi error estuviese en que utilicé while en Python en vez de for, pero y si ése fuera el caso, ¿me podrías decir de qué forma podría arreglar mis ciclos?
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
Imágen de perfil de xve

Problema con objetos.

Publicado por xve (1231 intervenciones) el 10/02/2013 11:16:16
Con esta linea Serie = [10] no defines una lista de 10... le indicas que Serie es una lista con el valor 10.

Si quieres definir una lista de 10 valores, seria algo así:
1
Serie=[1,2,3,4,5,6,7,8,9,0]

Esto si es una lista de 10 elementos.

Te he modificado el código haber si te sirve...
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
class FibonacciRecursivo(object):
    Serie = []
 
    def Funcion(self, n):
        if n == 0:
            return 0
        elif n == 1:
            return 1
        else:
            return self.Funcion(n - 1) + self.Funcion(n - 2)
 
    def Llena(self):
        for i in range(10):
            self.Serie.append(self.Funcion(i))
        return
 
    def Imprime(self):
        for i in range(len(self.Serie)):
            print(self.Serie[i])
        return
 
    def main(self):
        self.Llena()
        self.Imprime()
 
if __name__ == '__main__':
    obj=FibonacciRecursivo()
    obj.main()


Coméntanos, ok?
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

Problema con objetos.

Publicado por Joloch (4 intervenciones) el 10/02/2013 19:41:21
¡Muchas gracias! Ya quedó. Le modifiqué un par de cosas, como que el número de iteraciones puede agregarse con input, y ésta linea:

1
self.Serie.append(self.Funcion(i))


Le puse (i + 1) porque me empezaba la serie desde 0, y debe comenzar en 1.

Gracias de nuevo, esa era mi duda, porque sé que pueden utilizarse for y while para ciclar, pero no sabía como aplicar el for, pues en Python no se le puede agregar el += 1, como a while.

--------------

Por cierto, para no tener que abrir otro tema, ¿cómo expresarías ésta línea de Java en Python?
1
if ((Matriz[K][Q] == 1) || ((Matriz[K][J] == 1) && (Matriz[J][Q] == 1)))


Porque no estoy seguro de si and, or, |, & y ^, tengan la misma función que || y &&.
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