Autor Tema: Dudas de Python

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

17 Noviembre, 2020, 03:02 pm
Leído 348 veces

Quema

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,722
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Hola

Me piden un programa que reciba nombre y edad de personas hasta que una de ellas ingrese la palabra detener. Hice lo siguiente

def cliente ():
      nombre=str(input('Ingresar nombre o detener:'))
      edad=str(input('Ingresar Edad o detener:'))

     while nombre or edad != 'detener':
            nombre=str(input('Ingresar nombre o detener:'))
            edad=str(input('Ingresar Edad o detener:'))

      if nombre or edad=='detener'
           print ('Detenido')
           break

   cliente()

no me funciona, qué estoy haciendo mal.


17 Noviembre, 2020, 06:45 pm
Respuesta #1

mathtruco

  • Moderador Global
  • Mensajes: 4,995
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira
Hola Quema.

El programa tiene varios detalles:

Código: [Seleccionar]
1. def cliente ():
2.     nombre=str(input('Ingresar nombre o detener:'))
3.     edad=str(input('Ingresar Edad o detener:'))
4.
5.     while nombre or edad != 'detener':
6.            nombre=str(input('Ingresar nombre o detener:'))
7.            edad=str(input('Ingresar Edad o detener:'))
8.
9.      if nombre or edad=='detener'
10.          print ('Detenido')
11.          break
12.
13.    cliente()


(1) El indentado no es correcto, en particular la línea 13. No sé si es debido al copy+paste en el foro. Ten en cuenta que si indentas de cierta forma (con tabs o número de espacios) debes seguir esa misma regla. En lo personal, esto de la indentación de python vs uso de paréntesis de otros lenguajes me parece algo pésimo (aunque todos lo alaban), porque hace que sea muy fácil arruinar un programa largo.

(2) En la línea 9 faltó finalizarla con dos puntos.

(3) En la línea 11, no tiene sentido el break porque estás fuera del loop while. Estar fuera es debido al indentado. Para que estuviera correcto tendría que ser

Código: [Seleccionar]
1. def cliente ():
2.     nombre=str(input('Ingresar nombre o detener:'))
3.     edad=str(input('Ingresar Edad o detener:'))
4.
5.     while nombre or edad != 'detener':
6.            nombre=str(input('Ingresar nombre o detener:'))
7.            edad=str(input('Ingresar Edad o detener:'))
8.
9.            if nombre or edad=='detener'
10.                print ('Detenido')
11.                break
12.
13. cliente()

Nota que además corregí el indentado de "cliente()".  (aún así el programa no correrá)

(3) Nunca había visto como la línea 5 (lo mismo para la línea 9). Cuando escribes

    while nombre or edad != 'detener':

nota que "nombre" y "edad" son strings, ¿tiene sentido escribir "nombre or edad" (el "or" es un conectivo lógico, no puede operar con string). Lo correcto sería escribir:

    while (nombre != 'detener') or (edad != 'detener)':

Nota que "nombre != 'detener'"  y   "edad != 'detener" sí son proposiciones (pueden ser True o False) y por eso tiene sentido conectarlas con el or.


Te escribo unos ejemplos para tu programa:

Ejemplo 1: Así escribiría yo tu programa:

Código: [Seleccionar]
def cliente ():

     while True:
         nombre = str(input('Ingresar nombre o detener: '))
         edad     = str(input('Ingresar Edad o detener  : '))
         #
         if (nombre=='detener') or (edad=='detener'):
             print 'Detenido'
             break

cliente()




Ejemplos 2:  Me hace sentido que en el momento que escribe el nombre o edad 'detenido' entonces el programa salga:

Código: [Seleccionar]

def cliente ():

     while True:
         nombre = str(input('Ingresar nombre o detener:'))
         if nombre=='detener':
             print 'Detenido'
             break
         edad   = str(input('Ingresar Edad o detener:'))
         if edad=='detener':
             print 'Detenido'
             break

cliente()



Nota que los ejemplos 1 y 2 sí tiene sentido el "break" porque está dentro del ciclo while.


Ejemplo 3: Al menos en este programa no es necesario definir una función cliente(), a menos claro que te lo pidan como requisito. Sin esa función queda como sigue:

Código: [Seleccionar]

while True:
     nombre = str(input('Ingresar nombre o detener:'))
     if nombre=='detener':
          print 'Detenido'
          break
     edad   = str(input('Ingresar Edad o detener:'))
     if edad=='detener':
          print 'Detenido'
          break


17 Noviembre, 2020, 07:03 pm
Respuesta #2

geómetracat

  • Moderador Global
  • Mensajes: 1,908
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Al margen de los muy acertados comentarios de mathtruco, hay algo que me resulta muy extraño sobre este programa. Tal como está, los nombres no se guardan en ningún lado. Es decir, vas introduciendo nombre y edad, pero cada vez que introduces uno nuevo el antiguo se pierde para siempre, de manera que el programa realmente no sirve para nada. ¿No deberías guardar nombres y edades en una lista o algo así?
La ecuación más bonita de las matemáticas: \( d^2=0 \)

18 Noviembre, 2020, 01:07 pm
Respuesta #3

Quema

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,722
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Hola

Si no se bien si se guarda en algún lado.

Tengo otra pregunta.

Dado una lista de nombres, sus números telefónicos y el correo electrónico, hay que enviar un correo si el número está mal ingresado.
El número debe tener:
i) Nueve cifras.
ii) Empezar con 0.
iii) El tercer dígito debe ser distinto de 2.

(El indentado podría verse afectado por el copiado y pegado).

Hice lo siguiente, que no funcionó.

usuarios = {'Juan': {'celular': '095534135', 'mail': 'juan@celofan.com.uy'},
            'Maria': {'celular': '093659415', 'mail': 'maria@mail.org'},
            'Ignacio': {'celular': '056', 'mail': 'nacho@nacho.com'},
            'Roberto': {'celular': '094159656', 'mail': 'robertototo@robert.edu'},
            'Estefania': {'celular': '094159135', 'mail': 'estefa@1997'},
            'Mauricio': {'celular': '5759615', 'mail': 'mauriciofuente@empresa.uy'},
            'Raúl': {'celular': 'n/a', 'mail': 'rrodriguez@empresa.uy'}}

def correos(diccionario):
    for key in diccionario.keys():
        print(key)
        if len(diccionario[key]['celular'])!=9 or diccionario[key]['celular'][0]!=0 or diccionario[key]['celular'][2]==2:
            return diccionario[key]['mail']
correos(usuarios)

def correos(diccionario):
    lista_celulares=[]
    lista_celulares_incorrectos=[]

    for key,value in diccionario.items():
        celulares=value['celular']
        #print(celulares)
        lista_celulares.append(celulares)
    return lista_celulares
        #print(lista_celulares)
    for celular in lista_celulares:
        if len(celular)!=9 or celular[0]!=0 or celular[2]==2:
            lista_celulares_incorrectos.append(celular)
    print(lista_celulares_incorrectos)
               
                             
correos({'Juan': {'celular': '095534135', 'mail': 'juan@celofan.com.uy'},
            'Maria': {'celular': '093659415', 'mail': 'maria@mail.org'},
            'Ignacio': {'celular': '056', 'mail': 'nacho@nacho.com'},
            'Roberto': {'celular': '094159656', 'mail': 'robertototo@robert.edu'},
            'Estefania': {'celular': '094159135', 'mail': 'estefa@1997'},
            'Mauricio': {'celular': '5759615', 'mail': 'mauriciofuente@empresa.uy'},
            'Raúl': {'celular': 'n/a', 'mail': 'rrodriguez@empresa.uy'}})

18 Noviembre, 2020, 02:09 pm
Respuesta #4

feriva

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 9,172
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino


no me funciona, qué estoy haciendo mal.

Puedes hacerlo así, por ejemplo; y al final te pone la lista.
Código: [Seleccionar]
M=[]
def cliente ():
global M
while 2+2 == 4:
nombre=str(input('Ingresar nombre o detener:'))
if nombre == "detener" or nombre == "Detener":
return
edad=  int (input('Ingrese su edad con numeros:'))
datos = "Nombre: %s; Edad: %d" %(nombre, edad)
M.append (datos)
cliente()
print (M)

Había puesto un "cliente()" de más


Saludos.

18 Noviembre, 2020, 04:08 pm
Respuesta #5

feriva

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 9,172
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
Hola

Si no se bien si se guarda en algún lado.

Tengo otra pregunta.

Dado una lista de nombres, sus números telefónicos y el correo electrónico, hay que enviar un correo si el número está mal ingresado.
El número debe tener:
i) Nueve cifras.
ii) Empezar con 0.
iii) El tercer dígito debe ser distinto de 2.


Los diccionarios están mejor para parejas de cosas, yo aquí usaría matrices; esquemáticamente, algo así

Código: [Seleccionar]

usuarios = [ ["Pepe", "mailPepe", "022222222"], ["Juan", "mailJua", "029222222"] ]

for i in (usuarios):

n = (i [2])

if len (n) == 9 and n [0] == "0" and n[2] != "2":

print ( " %s BIEN" %(n) )

else:

print ( " %s MAL" %(n) )


Saludos.

18 Noviembre, 2020, 04:32 pm
Respuesta #6

ingmarov

  • Moderador Global
  • Mensajes: 4,900
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
Hola

Si no se bien si se guarda en algún lado.

Tengo otra pregunta.

Dado una lista de nombres, sus números telefónicos y el correo electrónico, hay que enviar un correo si el número está mal ingresado.
El número debe tener:
i) Nueve cifras.
ii) Empezar con 0.
iii) El tercer dígito debe ser distinto de 2.

(El indentado podría verse afectado por el copiado y pegado).

Hice lo siguiente, que no funcionó.

usuarios = {'Juan': {'celular': '095534135', 'mail': 'juan@celofan.com.uy'},
            'Maria': {'celular': '093659415', 'mail': 'maria@mail.org'},
            'Ignacio': {'celular': '056', 'mail': 'nacho@nacho.com'},
            'Roberto': {'celular': '094159656', 'mail': 'robertototo@robert.edu'},
            'Estefania': {'celular': '094159135', 'mail': 'estefa@1997'},
            'Mauricio': {'celular': '5759615', 'mail': 'mauriciofuente@empresa.uy'},
            'Raúl': {'celular': 'n/a', 'mail': 'rrodriguez@empresa.uy'}}

def correos(diccionario):
    for key in diccionario.keys():
        print(key)
        if len(diccionario[key]['celular'])!=9 or diccionario[key]['celular'][0]!=0 or diccionario[key]['celular'][2]==2:
            return diccionario[key]['mail']
correos(usuarios)

def correos(diccionario):
    lista_celulares=[]
    lista_celulares_incorrectos=[]

    for key,value in diccionario.items():
        celulares=value['celular']
        #print(celulares)
        lista_celulares.append(celulares)
    return lista_celulares
        #print(lista_celulares)
    for celular in lista_celulares:
        if len(celular)!=9 or celular[0]!=0 or celular[2]==2:
            lista_celulares_incorrectos.append(celular)
    print(lista_celulares_incorrectos)
               
                             
correos({'Juan': {'celular': '095534135', 'mail': 'juan@celofan.com.uy'},
            'Maria': {'celular': '093659415', 'mail': 'maria@mail.org'},
            'Ignacio': {'celular': '056', 'mail': 'nacho@nacho.com'},
            'Roberto': {'celular': '094159656', 'mail': 'robertototo@robert.edu'},
            'Estefania': {'celular': '094159135', 'mail': 'estefa@1997'},
            'Mauricio': {'celular': '5759615', 'mail': 'mauriciofuente@empresa.uy'},
            'Raúl': {'celular': 'n/a', 'mail': 'rrodriguez@empresa.uy'}})

¿Has definido dos veces a la misma función (correos)? ¿Por qué?

Al llamar la función correos en la última linea ¿Por qué no le escribes como argumento la variable usuarios?

Además esta linea

Citar
if len(celular)!=9 or celular[0]!=0 or celular[2]==2:
            lista_celulares_incorrectos.append(celular)
    print(lista_celulares_incorrectos)

¿No deberías comparar las cifras del string celular con un caracter y no con un entero?


Saludos
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

19 Noviembre, 2020, 01:05 am
Respuesta #7

Quema

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,722
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Ok, lo voy a mirar, pero tengo que primero sacarme estas dudas básicas.

Supongamos que tengo esta lista

lista=['alto','alto','bajo','gordo', 'flaco' ]

Y me piden que defina una función que cuenta la cantidad de letras que tiene cada elemento de la lista. Esto creo que es fácil y es haciendo



for i in list:
      length=len(i)
      print(length)

Ahora, supongamos me piden un programa que (individualmente cada caso) que muestre:

a) Solamente las letras que tienen más de 4 letras.
b) La cantidad de vocales por palabra.
c) La cantidad de veces que aparece cada palabra.
d) Solamente las palabras cuyo número de letras es múltiplo de 2.

Creo que si me enseñan esto habré avanzado bastante.


Además, para generar la secuencia de Fibbonacci tengo

def fib(numero):
    x,y= 0,1
    list=[]
    while x<=numero:
        list.append(x)
        x, y=y, x+y
    return list
fib(8)

Pero no entiendo debajo de list.append(x) qué signfica x,y=y, x+y




19 Noviembre, 2020, 02:28 am
Respuesta #8

ingmarov

  • Moderador Global
  • Mensajes: 4,900
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
Ok, lo voy a mirar, pero tengo que primero sacarme estas dudas básicas.

Supongamos que tengo esta lista

lista=['alto','alto','bajo','gordo', 'flaco' ]

Y me piden que defina una función que cuenta la cantidad de letras que tiene cada elemento de la lista. Esto creo que es fácil y es haciendo



for i in list:
      length=len(i)
      print(length)

Ahora, supongamos me piden un programa que (individualmente cada caso) que muestre:

a) Solamente las letras que tienen más de 4 letras.
b) La cantidad de vocales por palabra.
c) La cantidad de veces que aparece cada palabra.
d) Solamente las palabras cuyo número de letras es múltiplo de 2.

Creo que si me enseñan esto habré avanzado bastante.


Además, para generar la secuencia de Fibbonacci tengo

def fib(numero):
    x,y= 0,1
    list=[]
    while x<=numero:
        list.append(x)
        x, y=y, x+y
    return list
fib(8)

Pero no entiendo debajo de list.append(x) qué signfica x,y=y, x+y

Abre un hilo por problema, como mandan las reglas.

Saludos
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

19 Noviembre, 2020, 02:56 am
Respuesta #9

mathtruco

  • Moderador Global
  • Mensajes: 4,995
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira
Hola Quema.

Me da la impresión que te estás iniciando en programación, y por eso quiero sugerirte lo siguiente.

Cada comando que uses pruébalo aparte. Por ejemplo>

- Mira qué resulta al escribir cada una de las siguientes líneas

Código: [Seleccionar]

     len (n) == 9

     n [0] == "0"

     n[2] != "2"

- Sólo luego de que estás 100% seguro de esas salidas prueba la línea

Código: [Seleccionar]
         if  len(n) == 9 and n [0] == "0" and n[2] != "2":
probando si al colocar cualquier cosa dentro del if entra efectivamente.


Quizás no es el mejor ejemplo el que he dado. Me refiero a que en programación debes ir probando comando a comando qué estás haciendo, y verificando que línea a línea entiendes 100% lo que hace. Así, poco a poco, vas generando un programa más largo, y sin ningún error. Uno siempre tiene un  archivo "testing.py" en otro directorio donde ir haciendo pruebas.

Sólo cuando ganes mucha experiencia podrás escribir un programa largo sin hacer pruebas línea a línea. Pero te cuento que hasta los mejores programadores hacen lo que te menciono: probar parte a parte su programa para verificar que hace lo que quieren.

No conozco a ningún buen programador que escriba un programa completo sin ir probando, y que recién al finarlizarlo lo intente correr para luego buscar errores.

Con esto no te quiero desinsentivar a que preguntes acá, es sólo una una opinión de alguien que todos los días escribe código.