Usando “o” en un bucle de python para definir la secuencia predeterminada

He visto en alguna parte este uso de un bucle for:

def func(seq=None): for i in seq or [1, 2, 3]: print i func([3, 4, 5]) # Will print 3, 4, 5 func() # Will print 1, 2, 3 

Parece que al usar o / y al usar la palabra clave “in” seleccionará la primera / última secuencia “utilizable” para ejecutar el bucle for.

No he visto ninguna documentación oficial y me preguntaba cómo funciona y si se usa comúnmente.

En el caso de or (o and ) operador, cuando lo hace –

 a or b 

Devuelve a si a no es un valor falso, de lo contrario, devuelve b . None (y las listas vacías) son falsos como valor.

De la documentación –

La expresión x and y primero evalúa x ; si x es falso, su valor es devuelto; de lo contrario, se evalúa y y se devuelve el valor resultante.

La expresión x or y primero evalúa x ; Si x es verdadero, se devuelve su valor; de lo contrario, se evalúa y y se devuelve el valor resultante.

(Tenga en cuenta que ni y o o restringen el valor y el tipo que devuelven a Falso y Verdadero, sino que devuelven el último argumento evaluado. Esto a veces es útil, por ejemplo, si s es una cadena que debe reemplazarse por un valor predeterminado si es vacío, la expresión s or 'foo' produce el valor deseado. Debido a que no tiene que inventar un valor de todos modos, no se molesta en devolver un valor del mismo tipo que su argumento, por lo que, por ejemplo, no ‘foo’ produce False, no ”.)


Además, en el caso de for loop, in realidad es parte de la construcción for loop, no es un operador. Documentación para for loop construct aquí .


Por lo tanto, cuando haces

 for i in seq or [1, 2, 3]: 

Primero evaluaría

 seq or [1 , 2, 3] 

Y devuelve la lista de seq si no es ninguna o está vacía, para que pueda iterar sobre eso. De lo contrario, devolvería [1, 2, 3] y repetirías eso.

¡No! ¡Es la prioridad del operador! or antes in
Precedencia , §6.15.
De modo que se evalúa seq or [1, 2, 3] antes de ingresar al bucle. Y seq es None .