Python - Ejercicio suma de digitos

 
Vista:

Ejercicio suma de digitos

Publicado por Alex (5 intervenciones) el 28/09/2018 12:37:55
Hola a todos alguien sabria orientarme acerca de este ejercicio?

Supongo que habrá que usar bucles
def suma_digitos (n):

(creo que habria que usar la funcion len()?, no estoy seguro

y que una vez que con len() consigamos sumar todos los valores hasta que solo nos quede 1 digito el programa pase por el siguiente bucle:

Asi nos aseguramos de que n solo sea 1 digito?

if 0 <= n <= 9:
return n

Se agradece toda ayuda y pista!

EJERCICIO

Define una función de nombre suma_digitos que admite como argumento un número entero. Debe devolver un número entero de una sola cifra, resultante de sumar los dígitos del número mientras el resultado tenga más de un dígito.

Por ejemplo, para el número 187 la suma de los dígitos resulta 16, que tiene más de un dígito. Por tanto volvemos a aplicar el mismo procedimiento, que resulta en un 7. Éste ya solo tiene un dígito y por tanto es el resultado final.
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 abZer0x
Val: 425
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Ejercicio suma de digitos

Publicado por abZer0x (109 intervenciones) el 29/09/2018 08:27:45
Hola Alex, existen muchas maneras de realizar el ejercicio que planteas, una de ellas podría ser la siguiente:

1
2
3
def suma_digitos(num):
        while num > 10: num = sum(int(x) for x in str(num))
        return num

Ejemplos de ejecución:
1
2
3
4
>>> suma_digitos(187)
>>> 7
>>> suma_digitos(4853)
>>> 2
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

Ejercicio suma de digitos

Publicado por Alex (5 intervenciones) el 29/09/2018 15:33:22
Funciona perfectamente muchisimas gracias abZer0x,

¿Podrías explicarme como funciona por favor? Las funciones sum, de int(x), for x in str en que se diferencia de for i in range
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 abZer0x
Val: 425
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Ejercicio suma de digitos

Publicado por abZer0x (109 intervenciones) el 30/09/2018 01:49:33
En primer lugar la condición del bucle while comprueba que el número (en este caso la variable num) pasada como parámetro a la función sea mayor que 10. De esta manera no aseguramos que el número tiene más de una cifra, por ende el bucle se ejecutara mientras dicha condición se cumpla.
Luego entra en juego la función integrada de python o función built-in sum la cual tiene la siguiente firma:
1
sum(iterable[, start])
Donde el primer parámetro de esta es un objeto iterable de números, y el segundo es un entero que por defecto es 0, el cual determina el valor inicial de la suma.
Para aclarar, un objeto iterable son por ejemplo una cadena, lista, tupla, conjuto y los generadores.
Por ejemplo:
Supongamos que tenemos una lista de elementos llama numbers la cual tiene los primeros 5 números primos 2, 3, 5, 7, 11.
y no interesa saber cuanto es la suma/total de estos cinco números, para esto podríamos hacer lo siguiente:
1
2
3
4
5
numbers = [2, 3, 5, 7, 11]
total = 0
for num in numbers:
      print(num)
      total += num
Ejecución
1
2
>>> print(total)
>>> 28
En este caso, el bucle for es el encargado de iterar sobre la lista de números, es decir, que en cada pasada que el bucle realiza la variable num toma un valor de la lista (puedes confirmarlo al imprimir su valor).
Lo anterior pude realizarse de una forma más "Pythonica" por así decirlo que es utilizando la función sum junto un generador,

Ejemplo 1:
1
2
3
4
# Función generadora
def gen(numbers)
        for num in numbers:
             yield num
Ejecución
1
2
>>> sum(gen(numbers))
>>> 28

Ejemplo 2: Uso de una expresión generadora.
En lugar de definir una función utilizo una expresión generadora, la cual tiene una sintaxis similar a una lista por comprensión
1
2
>>> sum(num for num in numbers)
>>> 28

Ahora bien, con respecto a range este lo que hace en pocas palabras es retornar un objeto el cual produce una secuencia de enteros, por lo pude ser utilizado tanto el bulce for y la función sum entre otras. Esto se debe a que dicho objeto implementa el método __iter__, el cual es un requisito necesario para ser considerado un iterador.
Ejemplo:
1
2
3
4
>>> iterator = range(3).__iter__() # Esto retorna un objeto range_iterator
>>> next(iterator) # 0
>>> next(iterator) # 1
>>> next(iterator) # 2
Lo anterior es lo que realiza internamente el bucle for, la función next retorna el siguinte elemento del iterador.

Se que pude parecer un poco, confuso y difícil de entender en un principio, pero una vez que lo comprendes todo sea hace más facil
y es a hay donde logras ver la potencia de este gran lenguaje.
Te comparto algunos artículos que pueden ayudarte en el aprendizaje ya que la solución de este ejercicio llevo a tocar algunos temas
un poco avanzados de python como los generadores, listas por comprension, objetos iteradores, etc.

https://www.programiz.com/python-programming/generator
https://www.programiz.com/python-programming/list#list-comprehension
https://www.programiz.com/python-programming/iterator
https://docs.python.org/3/library/functions.html#sum

Coméntanos si tienes alguna otra duda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Ejercicio suma de digitos

Publicado por kip (257 intervenciones) el 30/09/2018 21:01:18
Muy buena explicación abZer0x, me gustaría agregar un par de cosas:

"Lo anterior pude realizarse de una forma más "Pythonica" por así decirlo que es utilizando la función sum junto un generador"

Si tienes una lista no es necesario el uso de un generador, a menos que estés tomando data(mucha) de algún proceso donde el uso de generadores beneficien la 'performance' en términos de memoria, entiendo que es solo por explicación pero a veces lo simple es es mejor que lo complejo -> "Simple is better than complex."

1
>>> iterator = range(3).__iter__() # Esto retorna un objeto range_iterator

El código anterior puede verse menos "confuso" o "aterrador" si no usamos el método mágico __iter__ y en su lugar usamos iter() o alguna expresión generadora como mencionaste:

1
2
3
4
5
6
7
8
>>> it = iter(range(3))
>>> next(it)
0
>>> next(it)
1
>>> next(it)
2
>>>

1
2
3
4
5
6
7
8
>>> it = (n for n in range(3))
>>> next(it)
0
>>> next(it)
1
>>> next(it)
2
>>>

"la solución de este ejercicio llevo a tocar algunos temas un poco avanzados de python como los generadores"

En mi opinión no se si sea la mejor solución para alguien que recién inicia, lo mejor es siempre lo explicito sobre lo implicito "Explicit is better than implicit.", no hay problema en usar "for in" o inclusive un "while"...

Esta es una solución posible usando recursividad y while:

1
2
3
4
5
6
7
8
9
10
11
12
def digitSum(number):
  total = 0
 
  while number:
    digit = number % 10
    number = number // 10
    total = total + digit
 
  if total > 9:
    return digitSum(total)
 
  return total

Entiendo que el código tiene mas líneas pero al final me parece mas explicito para alguien que inicia, se podrian reducir un par de lineas ? si, quizas con divmod()

1
2
3
4
5
6
7
8
9
10
11
def digitSum(number):
  total = 0
 
  while number:
    number, digit = divmod(number, 10)
    total += digit
 
  if total > 9:
    return digitSum(total)
 
  return total

Es verdad que existen múltiples soluciones para un solo problema, pero hay que saber elegirlas para que estas ayuden a quien las necesita y sin necesidad de recurrir a temas algo avanzados, que a veces, aunque no lo creas, son motivos para que muchos desistan en programar o intentar hacer código.

Obviamente no digo que tu respuesta este mal, es muy buena, a veces es mejor dar un código con un par de lineas de mas pero que tiene una explicación simple a uno corto (mucha abstracción) con una explicación algo compleja, hablando en el contexto de alguien que recién esta comenzando.
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
Imágen de perfil de abZer0x
Val: 425
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Ejercicio suma de digitos

Publicado por abZer0x (109 intervenciones) el 01/10/2018 00:02:46
Tienes razón kip, ahora que releo mi comentario creo que la complique demasiado, en su lugar debí hacerlo más simple sin recurrir a temas avanzados. Es mucha información para una persona que esta recién comenzando, es más, yo no me considero una persona con conocimientos avanzados ni mucho menos en programación, trato de aprender todos los días algo nuevo. Muchas veces me pasa que me encuentro con algunos artículos abrumadores y un tanto complejos a la hora de explicar un tema en particular y me quedo muy y confundido.
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 kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Ejercicio suma de digitos

Publicado por kip (257 intervenciones) el 01/10/2018 01:36:28
Nos pasa a todos
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

Ejercicio suma de digitos

Publicado por Alex (5 intervenciones) el 02/10/2018 01:11:13
Muchisimas gracias por tomarte tantisimas molestias en explicarme tu solucion abZer0x y muchisimas gracias a ti también kip por, como tu dices, hacerlo mas simple pero un poco más entendible para alguien como yo que apenas lleva 2 semanas en python y ya me estan pidiendo ejercicios de bucles que para mi se hacen un mundo desconocido y complejo.

De verdad que gracias a los dos ya que me habeis enseñado mucho y ayudado mucho acerca de los bucles y estoy seguro de que con toda esta información sere capaz de hacer el resto de ejercicios relacionados a bucles ya que con este ejemplo tan bien explicado me habeis dado una referencia y una forma de entenderlo mucho mejor.

Sois un par de cracks! Saludos!!
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