Entender la lógica de un bucle while en python.-

Iniciado por NOB2014, 19 Noviembre 2017, 16:25 PM

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

NOB2014

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 (python) [Seleccionar]
while((re.findall(expr, cadena))):

Código (python) [Seleccionar]
# -*- coding: utf-8 -*-
import os
import re

def input_abc():
expr = r'[0-9]'
cadena = input('\n Ingrece una cadena (no se permiten números)...: ')
while((re.findall(expr, cadena))):
borrar()
cadena = input('\n Ingrece una cadena (no se permiten números)...: ')

return cadena

def borrar():
print('\n\tError. No se permiten números...')
input("\n Pulse una tecla para continuar...")
if os.name == "posix":
os.system ("clear")
elif os.name == ("ce", "nt", "dos"):
os.system ("cls")

def main():
print("\n Cadena introducida: ", input_abc())

main()


Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

engel lex

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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

NOB2014

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 (python) [Seleccionar]
while((re.findall(expr, cadena))==True):
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

engel lex

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

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


es decir, sus valores retornados pueden ser

Código (python) [Seleccionar]
falla = False
logra  = ["hola","mundo"]

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Eleкtro

#4
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 (python) [Seleccionar]
import re

regexp = r'[0-9]'
string = "1234567890"

while len(re.findall(regexp, string)) !=0:
   print "El Array contiene elementos."
   string = re.sub(regexp, "", string)

else:
   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.








tincopasan

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 (python) [Seleccionar]

expr = r'[0-9]'  #esto sobra
cadena = input('\n Ingrece una cadena (no se permiten números)...: ')
while((re.findall(expr, cadena))): #que ganas de poner paréntesis, aunque la lógica de la sentencia la usaría

con menos caracteres  llegas a lo mismo:
Código (python) [Seleccionar]

cadena = input('\n Ingrece una cadena (no se permiten números)...: ')
while re.findall("\d", cadena):


NOB2014

 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 
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-