Error de punto y coma del argumento de la línea de comando de Python

Estaba probando python -mtimeit así que puse python -mtimeit "n = 0; while n < 10: pass" Luego apareció un error de syntax no válido. Lo mismo con punto y coma y para bucle.

Sin embargo, cuando bash el punto y coma y el bucle de forma individual. Ambos trabajaron bien.

 python -c "for i in range(10): print(n)" python -c "n = 1; n = 2; print(n)" 

¿Por qué esto es así y cómo puedo probar while loop in timeit? ¡Muchas gracias!

while , for no tener un punto y coma antes, necesitan estar en una línea. Si miras la gramática de Python :

 compound_stmt ::= if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT statement ::= stmt_list NEWLINE | compound_stmt stmt_list ::= simple_stmt (";" simple_stmt)* [";"] 

Verá que las declaraciones que forman parte de compound_stmt deben ser una sola línea. Las únicas declaraciones que pueden ser separadas por punto y coma son el grupo simple_stmt :

 simple_stmt ::= expression_stmt | assert_stmt | assignment_stmt | augmented_assignment_stmt | pass_stmt | del_stmt | print_stmt | return_stmt | yield_stmt | raise_stmt | break_stmt | continue_stmt | import_stmt | global_stmt | exec_stmt 

timeit puede tomar dos parámetros: el código de configuración y el código a tiempo.

 python -mtimeit "n = 0" "while n < 10: pass" 

Además, debes cambiar ese pass a n += 1 o estarás en un bucle infinito.

Si lo escribes en un guión, ¿por qué no lo sangras de la misma manera que lo harías en un progtwig de python real? Me gusta esto:

 python -mtimeit " n = 0 while n < 10: pass" 

La respuesta seleccionada aborda magníficamente el por qué, pero no la cuestión de cómo puede solucionarse esto en cualquier sistema operativo (ya que Windows cmd no permite declaraciones de varias líneas)

La respuesta es: exec.

Tienes que anidar cualquier bucle en una sentencia exec.

Ejemplos: (Python 2)

 python -c "i = 3; while i:print i; i-=1" 

es un error de syntax, mientras

 python -c "i = 3; exec 'while i:print i;i-=1'" 

funciona correctamente