Digamos que tengo una función:
x=[] i=5 while i<=20: x.append(i) i=i+10 return x¿Hay alguna manera de convertirlo en una lista de comprensión como esta?
newList = [i=05 while i<=20 i=i+10]Me sale un error de sintaxis.
No necesitas una lista de comprensión para eso. range simplemente hará:
list(range(5, 21, 10)) # [5, 15] Un bucle while no es posible dentro de una lista de comprensión. En su lugar, podrías hacer algo como esto:
def your_while_generator(): i = 5 while i <= 20: yield i i += 10 [i for i in your_while_generator()]No, no puede usar while está en una lista de comprensión.
Según la especificación gramatical de Python , solo se permiten las siguientes expresiones atómicas:
atom: ('(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']' | '{' [dictorsetmaker] '}' | NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False') La expresión correspondiente a la comprensión de una lista - testlist_comp se parece a la siguiente en Python 3:
testlist_comp: (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] )Aquí, las únicas declaraciones permitidas son
test: or_test ['if' or_test 'else' test] | lambdef star_expr: '*' expr comp_for: [ASYNC] 'for' exprlist 'in' or_test [comp_iter]donde
comp_if: 'if' test_nocond [comp_iter] comp_iter: comp_for | comp_if No hay una sola instrucción while permitida en ninguna parte. Las únicas palabras clave que puede usar son for , for y for loop.
Use un bucle for o aproveche itertools .
No hay ninguna sintaxis para esto, pero puede usar itertools. Por ejemplo:
In [11]: from itertools import accumulate, repeat, takewhile In [12]: list(takewhile(lambda x: x <= 20, accumulate(repeat(1), lambda x, _: x + 10))) Out[12]: [1, 11](Sin embargo, eso no es Pythonic. Se debe preferir la solución del generador o la solución explícita).