DuDas sobre funciones Python"

Iniciado por Itzhack, 9 Febrero 2015, 04:39 AM

0 Miembros y 1 Visitante están viendo este tema.

Itzhack

Hola, acabo de acabar dos pequeños programas, pero tengo una duda para cada uno:

Primero:

Código (python) [Seleccionar]
def factores(nb):
   
   print ("Los factores positivos de un numero entero." )
   nb = int(input("Entra un numero entre 1 y 20: "))
   res = []
   i = 1
   while i <= nb:
       if nb % i == 0:
           res.append(i)
       i += 1

   return "Los factores de {} son: {}".format(nb, res)


(Aquí para afichar los resultados utilizo una lista, pero yo busco otro metodo en el que pueda afichar los factores, pero no como lista)


Segundo:

Cuando hago una funcion, y no le pongo return sino print, me aparece mi resultado, pero también "None". Como hago para que no me salga "None"?. Ojo, mi correcto resultado de varios valores me sale con print, si pongo return, me muestra solo un resultado.

Uso python 3.4

Saludos mis amigos y desde ya gracias por su ayuda!!!  ;-)

Mod: Usa etiquetas GeSHi cuando publiques codigo

GonzaFz

#1
¿Por que razón no quieres almacenar los resultados en una lista?
No tienes otra forma, a menos que sepas la cantidad de elementos que quieras almacenar y crees una variable para cada uno.
Lo que vos necesitas es referenciar a un objeto que te permita acceder a un numero variable de referencias de otros objetos y ese es el rol que cumple una lista.
Existen variantes de listas, como pilas o colas, pero al final siguen siendo lo mismo. Podrías usar un diccionario pero también estarías cayendo en las listas nuevamente, y encima necesitarías definir una clave para cada elemento.
Quizás me equivoque pero que yo sepa no hay forma de hacer esto si no es con una lista..
EDITO: Podrías almacenarlos en un string poniendo alguna marca para después saber donde termina cada elemento, pero no tiene mucho sentido.

Y con respecto a lo segundo, pon el codigo así es mas facil saber que es lo que pasa,

PD: cuando pongas codigos, tenes que ponerlo entre etiquetas. Las de python son: [ code=python][/ code] (sin los espacios).


Itzhack

Hola GonzaFZ,

Muchas gracias por la rápida respuestas. Lo de la listas, pasa que llevo un curso a distancia en programacion en Python, y el profe dejo como tarea eso, hacer un programa que pida un número y retorne sus factores. (pero como aun no vemos listas, dejo una nota: "Prohibido utilizar listas, diccionarios u otro que aun no hayamos visto en clase:". Bueno, voy a seguir intentando a ver si hay otra manera.

Con respecto a mi segunda pregunta. En la misma tarea, no pide hacer de introducir un numero impar y que no devuelva una figura de un reloj de arena, solo con los simbolos "-" y " *".

Aquí lo que logré hasta ahora (puedo ver el reloj y todo, pero como no acabo con ´return´, en mi resultado me arroja NONE.

Código (python) [Seleccionar]

def afficher_sablier(dimension):
   
    print ("Afficher un sablier de N lignes et N colonnes")
    dimension = int(input("Entrez s.v.p. un nombre entre 3 et 59: "))
   
    if dimension % 2 == 0:
        return "***Dimension invalide, Entrez un nombre impair***"

    else:
        i = 0
        j = 0
        while i < int((dimension + 1)/2):
            print ("-"*i + "*"*(dimension - 2*i) + "-"*(i))
            i += 1

        while j < int((dimension - 1)/2):
            print ("-"*(i - 2) + "*"*(3 + 2*j) + "-"*(i - 2))
            j += 1
            i -= 1


El curso lo llevo en francés, por eso las entradas en este idioma, pero creo se entiende.  :)

Y de nuevo Gracias!!!

Itzhack

GonzaFz

Ahh entonces si, podes usar un string para almacenar los números. Los vas concatenando y listo  :D

Y por lo que entiendo en la segunda pregunta, ¿La figura la tenes que devolver o imprimir?
Si solo lo tienes que imprimir desde la función que hiciste, entonces no debe devolver nada, es decir, va a devolver None (debido a que si no escribís return, implícitamente devuelven None, creo...)
Ahora, si necesitas que te devuelva el reloj sin imprimirlo (para que si vos haces print(afficher_sablier(5)) te lo dibuje), lo que tenes que hacer es "dibujarlo" en un string, me refiero a que en vez de imprimirlo dentro de los ciclos, vas concatenando en un string, que después al final de la función, lo devolves con el return.

Si no se entiende, preguntame de nuevo  ;D



Itzhack

Si, te entiendo lo de concadenar los string. Pero no sé como hacerlo, me podrias dejar un ejemplo pequeño, para luego yo poder aplicarlo en mis dos programas: Por favor!!!  :silbar:

GonzaFz

Te dejo una idea y con esto te alcanza para hacer lo que necesitas:
Concatenación de dos strings
Código (python) [Seleccionar]
# Creamos dos strings
hola = "Hola"
mundo = "Mundo!"

# Los concatenamos
concatenar = hola + mundo

# Es lo mismo que
concatenar = "Hola" + "Mundo!"

Si haces print(concatenar) va a imprimir:
HolaMundo!

(pista: en el primer problema puedes ir concatenando los numeros y dejando un espacio entre ellos, asi despues haces return "Los factores de {} son: {}".format(nb, stringDeNumeros) )

Y una ayuda para el reloj de arena (observa el \n):
Código (python) [Seleccionar]
# Creamos dos strings
hola = "Hola\n" # Observa el \n
mundo = "Mundo!"

# Los concatenamos
concatenar = hola + mundo

Si haces print(concatenar) va a imprimir:
Hola
Mundo!

Al poner el "Escape Character" (no se el nombre en español xd) \n lo que hace es indicar que la parte que sigue ira en una nueva linea.

Creo que con eso es suficiente como para hacer esos trabajos.
Igual si tenes dudas en esta pagina hay buena informacion sobre los strings:
http://www.tutorialspoint.com/python/python_strings.htm

Itzhack

Muchas Gracias GonzaFZ!!!

Sos Grande!!!  ;-)