Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: NOB2014 en 19 Noviembre 2017, 16:25 pm



Título: Entender la lógica de un bucle while en python.-
Publicado por: NOB2014 en 19 Noviembre 2017, 16:25 pm
Hola gente, ¿como están?
El programa funciona, pero hay algo que salio de "casualidad" y lo que quiero es encontrarle la lógica.-
Lo que no entiendo es porque  funciona el bucle while.-

Código
  1. while((re.findall(expr, cadena))):

Código
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import re
  4.  
  5. def input_abc():
  6. expr = r'[0-9]'
  7. cadena = input('\n Ingrece una cadena (no se permiten números)...: ')
  8. while((re.findall(expr, cadena))):
  9. borrar()
  10. cadena = input('\n Ingrece una cadena (no se permiten números)...: ')
  11.  
  12. return cadena
  13.  
  14. def borrar():
  15. print('\n\tError. No se permiten números...')
  16. input("\n Pulse una tecla para continuar...")
  17. if os.name == "posix":
  18. os.system ("clear")
  19. elif os.name == ("ce", "nt", "dos"):
  20. os.system ("cls")
  21.  
  22. def main():
  23. print("\n Cadena introducida: ", input_abc())
  24.  
  25. main()

Saludos.
Daniel


Título: Re: Entender la lógica de un bucle while en python.-
Publicado por: engel lex en 19 Noviembre 2017, 16:35 pm
Código:
re.findall(expr, cadena)

esto consigue coincidencias en relación a una expresión regular, en este caso se evalúa si hay un numero, si hay un numero, findall retorna las coincidencias (que por defecto cualquier valor que no sea falso, 0, none o vacio, se asume verdadero) si no, retorna falso

por cierto, es IngreSe no con c


Título: Re: Entender la lógica de un bucle while en python.-
Publicado por: NOB2014 en 19 Noviembre 2017, 16:54 pm
Que Karma tengo con la ortografía, gracias me ha ayudado mucho tu explicación, otra pregunta ¿porque de esta forma no funciona correctamente?

Código
  1. while((re.findall(expr, cadena))==True):


Título: Re: Entender la lógica de un bucle while en python.-
Publicado por: engel lex en 19 Noviembre 2017, 17:09 pm
porque re.findall no retorna true, retorna false y "no false" (es decir algo que no puede ser interpretado como falso, pero tampoco es un true booleano, sino un array que sería simplmemente algo que no es falso) en tal caso puedes usar

Código:
while((re.findall(expr, cadena))!=False):


es decir, sus valores retornados pueden ser

Código
  1. falla = False
  2. logra  = ["hola","mundo"]


Título: Re: Entender la lógica de un bucle while en python.-
Publicado por: Eleкtro en 20 Noviembre 2017, 09:35 am
En un escenario de la vida real lo que en muchas ocasiones necesitarás hacer es evaluar de forma explícita la cantidad de elementos en un Array... si es igual a 0, mayor que 1, 3 o 4 elementos exactos, etcétera, así que no deberías tomar el hábito de usar evaluaciones booleanas con arrays... por que estás empezando en el aprendizaje y eso te puede confundir.

Puedes verlo de esta manera, con una modificación notable que le añadí para usar la función len():
Código
  1. import re
  2.  
  3. regexp = r'[0-9]'
  4. string = "1234567890"
  5.  
  6. while len(re.findall(regexp, string)) !=0:
  7.    print "El Array contiene elementos."
  8.    string = re.sub(regexp, "", string)
  9.  
  10. else:
  11.    print "El Array ya no contiene elementos."

Nota: en el código de arriba puedes eliminar el "!=0", o también puedes reemplazarlo por !=False (ya que False equivale a 0), pero tan solo es un ejemplo para mostrarte la manera de evaluar cantidad de elementos, ya que se trata de trabajar con valores enteros...

Saludos.


Título: Re: Entender la lógica de un bucle while en python.-
Publicado por: tincopasan en 20 Noviembre 2017, 12:25 pm
Esta más que claro que te explican para que entiendas la lógica y python como muchos lenguajes te deja escribir el código que quieras, pero:
Código
  1. expr = r'[0-9]'  #esto sobra
  2. cadena = input('\n Ingrece una cadena (no se permiten números)...: ')
  3. while((re.findall(expr, cadena))): #que ganas de poner paréntesis, aunque la lógica de la sentencia la usaría
  4.  
con menos caracteres  llegas a lo mismo:
Código
  1. cadena = input('\n Ingrece una cadena (no se permiten números)...: ')
  2. while re.findall("\d", cadena):



Título: Re: Entender la lógica de un bucle while en python.-
Publicado por: NOB2014 en 20 Noviembre 2017, 15:48 pm
 Hola, muy buen día para todos.-
 Eleкtro, estoy leyendo y releyendo lo tuyo y lo voy a tener muy en cuenta.-                                                           
 tincopasan, muchas gracias por hacer que el código sea más conciso, lo que deduzco de todo esto es que
 soy muy fanático a la práctica y me alejo demasiado de la teoría/lógica y así voy a aprender muy poco,  :-(
 tengo que conseguir algún libro más completo de python.-

Saludos.
Daniel