¿Por qué Python no diseña una estructura de bucle do-while?

En algunos lenguajes de programación, como C/C++, C#, PHP, Java, JavaScript, etc., do-while es una construcción de bucle básica.

Su semántica principal es: ejecutar primero el código del cuerpo del ciclo , luego ejecutar la declaración condicional una vez , si se considera que la declaración condicional es verdadera, continuar ejecutando el código del cuerpo del ciclo y ejecutar la declaración condicional nuevamente; hasta que se juzgue la declaración condicional para ser falso, luego salta fuera de la estructura de bucle.

El diagrama de flujo es el siguiente (ejemplo de Java):

// 打印小于 20 的数字
public class Test {
   public static void main(String[] args){
      int x = 10;
      do {
         System.out.print("value of x : " + x );
         x++;
         System.out.print("\n");
      } while(x < 20);
   }
}

Python no admite la construcción do-while y "do" no es una palabra clave válida.

Entonces, ¿por qué Python no proporciona esta estructura de sintaxis y cuáles son las consideraciones de diseño detrás de este statu quo?

Antes de responder a esta pregunta, pensemos un poco más en lo que puede resolver la sintaxis do-while y veamos qué beneficios se pueden obtener al usar esta estructura.

El beneficio más obvio es que la sintaxis do-while garantiza que el cuerpo del bucle se ejecutará primero.

Sus escenarios de uso pueden no ser muchos, pero, a diferencia de la idea de " precondición " de la sintaxis de ciclo while ordinario o ciclo for, incorpora una lógica de programación de " post condicional ", y también es un ciclo de control común.

Su relación parece ser un poco como la diferencia entre las operaciones i++y ++ien lenguajes como C/C++, y puede ser más eficiente en algunos casos especiales.

Además de esta característica, el escenario de aplicación más grande de esta estructura es en realidad el do {...} while (0) uso especial en C/C++. Esto se puede encontrar en el código fuente de muchos proyectos de código abierto, como Linux, Redis y el intérprete CPython, por nombrar algunos.

El número 0 aquí representa el valor booleano Falso, lo que significa que el ciclo solo se ejecutará una vez y luego saltará.

¿No es rara esta ortografía? El llamado "bucle" generalmente significa que la experiencia del programa se ejecuta repetidamente muchas veces, pero do {...} while (0) solo necesita ejecutarse una vez, lo que parece un poco redundante al principio.

Este método de escritura se utiliza principalmente en la definición de funciones de macro, que pueden resolver el problema de compilar bloques de código de macro, de modo que el código se pueda dividir en bloques razonables de acuerdo con nuestra intención.

Además, do {...} while (0) combinado con el uso de break, también se puede lograr un efecto de control de salto muy elegante.

En el siguiente ejemplo, se requiere ejecutar los pasos 1, 4 y 5, mientras que el paso 2 depende del resultado del paso 1 y el paso 3 depende del resultado del paso 2.

do {
  // 执行步骤 1 
  if (条件1失败) {
    break;
  }
  // 执行步骤 2 
  if (条件2失败) {
    break;
  }
  // 执行步骤 3 
  if (条件3失败) {
    break;
  }
} while(0);
// 执行步骤 4
// 执行步骤 5

En este escenario, solo necesitamos hacerlo una vez en orden. La estructura do-while es muy clara y evita situaciones en las que se establecen múltiples niveles de anidamiento condicional o muchas banderas adicionales.

Finalmente, a nivel de ensamblaje, do-while está más cerca de la lógica del lenguaje ensamblador que while, lo que puede ahorrar el uso de instrucciones.En la era de poca memoria en el pasado, puede considerarse como un método de escritura optimizado.

Después de analizar los beneficios de do-while, volvamos al tema: ¿Por qué Python no necesita diseñar la sintaxis de bucle do-while?

En primer lugar, Python está demasiado lejos de la programación de aplicaciones de bajo nivel para considerar la optimización de las instrucciones de ensamblaje y, al mismo tiempo, no implica el uso de macros.

En cuanto a la diferencia entre "condición previa condicional" y "condición posterior condicional", no tiene mucho impacto. Además, dado que Python usa sangría concisa y elegante y sintaxis de dos puntos para dividir bloques de código, la traducción literal de do- mientras que la sintaxis parece extraña (tenga en cuenta que no hay nada después de la condición del tiempo literal):

do:
    pass
while False

Si desea introducir nuevas características gramaticales, debe seguir los hábitos de estilo establecidos. Las construcciones do-while en otros idiomas son definitivamente inapropiadas cuando se traducen literalmente a Python.

De hecho, en 2003, hubo una propuesta de PEP para agregar soporte de sintaxis do-while a Python:

PEP-315 Bucle while mejorado

Este PEP propone agregar una cláusula do opcional para admitir la expansión del ciclo while para que se vea así:

do:
    <setup code>
while <condition>:
    <loop body>

Esto no es simplemente traducir de otros idiomas a Python, conserva el uso de sangría de Python después de la instrucción while y no provoca resultados molestos en la traducción literal.

Con la cláusula else opcional ya admitida por el propio bucle while, la estructura sintáctica completa de while es la siguiente:

while_stmt : ["do" ":" suite]
            "while" expression ":" suite
            ["else" ":" suite]

(PD. En el próximo artículo de esta serie, explicaremos por qué Python admite la sintaxis while-else)

Es decir, manteniendo la sintaxis del ciclo while original sin cambios, PEP-315 propone admitir el uso de una cláusula do opcional antes de while.

La cláusula do solo se ejecutará una vez, cuando aparezca break en ella saltará fuera de todo el ciclo do-while, cuando aparezca continue en la cláusula do saltará fuera de la cláusula do y entrará en el juicio condicional de mientras.

Con la cláusula do, es fácil lograr  do {...} while (0) el efecto de control de salto.

Sin embargo, algunos desarrolladores principales se opusieron a este PEP.

La objeción es que no hay necesidad de introducir nuevas palabras clave y sintaxis, y la misma funcionalidad se puede implementar sin problemas usando la sintaxis existente:

while True:
    <setup code>
    if not <condition>:
        break
    <loop body>

Guido van Rossum, el padre de Python, tampoco estuvo de acuerdo. Sus palabras originales fueron:

Respuesta de Guido

Por favor, rechace el PEP. Más variaciones en este sentido no harán que el idioma sea más elegante o más fácil de aprender. Simplemente ahorrarían algo de escritura a algunas personas apresuradas mientras que otros que tienen que leer/mantener su código se preguntan qué significa.

Simplemente traducida, esta sintaxis do-while no hace que Python sea más elegante y fácil de usar, pero crea una carga de comprensión de lectura/mantenimiento del código.

Personalmente, tampoco apruebo la introducción de la sintaxis do-while opcional de PEP-315, aunque es un poco más flexible y elegante que la construcción do-while de forma fija.

Finalmente, para resumir un poco, do-while, como una estructura de bucle común, ha desempeñado un papel en otros lenguajes, e incluso ha desarrollado un do {...} while (0) uso típico. Sin embargo, varios problemas que puede resolver do-while están en Python o No. No existe (definiciones de macros, instrucciones de montaje), o existe una implementación más adecuada y de bajo coste (control de salto).

 [aprendizaje de Python]
Socios de aprendizaje de Python, bienvenidos a unirse al nuevo intercambio [Jun Yang]: 1020465983
para discutir el conocimiento de programación juntos, convertirse en un gran dios, hay paquetes de instalación de software, casos prácticos, materiales de aprendizaje en el grupo

Supongo que te gusta

Origin blog.csdn.net/weixin_56659172/article/details/124361234
Recomendado
Clasificación