Nomenclatura de los Bucles en Python

Recientemente he leído esta pregunta que había una solución sobre el etiquetado de los bucles en Java.

Me pregunto si un bucle-sistema de nomenclatura existe en Python. He estado en una situación varias veces donde me hace falta para salir de un exterior for bucle de un interior for bucle. Por lo general, puedo resolver este problema por poner el bucle interno en una función que devuelve (entre otros) un valor booleano que se utiliza como una ruptura de la condición. Pero el etiquetado de los bucles para romper parece mucho más sencillo y me gustaría probar que, si esta funcionalidad existe en python

¿Alguien sabe si lo hace?

Comprobar la segunda respuesta, esperemos que ayuda a algunos. Pero por lo que puedo ver, no hay tal sistema existe.
“Pero el etiquetado de los bucles para romper parece mucho más sencillo “? Más simple que el de funciones que le son propias? ¿Cómo es eso? ¿Puede dar algunos indicios de cómo podría ser “simple”?
No tengo un ejemplo práctico, pero sería una situación en la que tendría que crear una función que será utilizado sólo en ese punto. Tal vez “simple” fue la palabra equivocada. A lo que me refería era que no tendría que definir una nueva función para su uso en el que UN punto.
¿Qué hay de malo con la función anidada definiciones? Además, lo que sobre el rediseño del bucle interno para evitar el break?
Yo simplemente no les gusta. Supongo que es una cuestión de preferencia personal

OriginalEl autor inspectorG4dget | 2011-12-07

4 respuestas

  1. 10

    Hay una propuesta para incluir el nombre de bucles en python PEP3136, sin embargo, fue rechazada con una explicación aquí. El rechazo se debió principalmente al escaso número de circunstancias donde la legibilidad del código, puede ser mejorado mediante la inclusión de este constructo.

    OriginalEl autor GWW

  2. 10

    He aquí una manera de salir de múltiples bloques anidados utilizando un contexto manager:

    import contextlib
    
    @contextlib.contextmanager
    def escapable():
        class Escape(RuntimeError): pass
        class Unblock(object):
            def escape(self):
                raise Escape()
    
        try:
            yield Unblock()
        except Escape:
            pass

    Se puede utilizar para salir de varios bucles:

    with escapable() as a:
        for i in xrange(30):
            for j in xrange(30):
                if i * j > 6:
                    a.escape()

    Y puede incluso anidar ellos:

    with escapable() as a:
        for i in xrange(30):
            with escapable() as b:
                for j in xrange(30):
                    if i * j == 12:
                        b.escape()  # Break partway out
                    if i * j == 40:
                        a.escape()  # Break all the way out

    OriginalEl autor Stu Gla

  3. 9

    Aunque hay razones para incluir el nombre de bucle en la construcción del lenguaje, usted puede evitar fácilmente en python sin pérdida de legibilidad.
    Una aplicación de la referida ejemplo en python

    >>> try:
    for i in xrange(0,5):
    for j in xrange(0,6):
    if i*j > 6:
    print "Breaking"
    raise StopIteration
    print i," ",j
    except StopIteration:
    print "Done"
    0   0
    0   1
    0   2
    0   3
    0   4
    0   5
    1   0
    1   1
    1   2
    1   3
    1   4
    1   5
    2   0
    2   1
    2   2
    2   3
    Breaking
    Done
    >>> 

    Puedo resolver este problema por poner el bucle interno en una función que
    devuelve (entre otros) un valor booleano que se utiliza como una ruptura
    condición.

    Creo que usted debe tratar esto. Esto es muy python, simple y legible.

    +1. Mediante el uso de excepciones para el control de flujo es perfectamente cromulent en Python, aunque se considera de mal estilo en otros idiomas, generalmente por razones de rendimiento.
    ¿Qué pasa si sólo desea “continuar” el bucle externo, en lugar de detenerlo?
    Acabo de poner la instrucción try dentro del primer bucle for

    OriginalEl autor Abhijit

  4. 1

    Nope.

    Dependiendo de lo que usted está haciendo, hay una buena probabilidad de que usted puede usar algo de itertools para alisar los bucles for anidados en un único bucle for.

    OriginalEl autor Winston Ewert

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *