2011-05-13 24 views
6
print max(3 for i in range(4)) 
#output is 3 

utilizar Python 2.6Strange python para la sintaxis, ¿cómo funciona esto, cómo se llama?

El 3 me es tirar fuera, aquí está mi intento de explicar qué se está encendiendo.

para i en el rango (4) hace un bucle que se repite 4 veces, incrementando i de 0 a 3 al comienzo de cada ciclo. [no tiene idea de qué significa el 3 en este contexto ...] max() devuelve el iterable más grande que se le pasa y el resultado se imprime en la pantalla.

+6

Por alguna razón, esta pregunta me recuerda a Monty Python y al Santo Grial. –

Respuesta

9

Esto se evalúa como:

print max([3,3,3,3]) 

... que es una forma elaborada de decir print 3.

expr for x in xs es una expresión de generador. Normalmente, usaría x en expr. Por ejemplo:

[2*i for i in range(4)] #=> [0, 2, 4, 6]

+0

entonces, ¿el 3 significa "hacer esto para el bucle 3 veces"? Parece una cosa muy extraña, tendrá que experimentar. – jason

+0

Nah, el 3 es lo que se está agregando a la lista cada vez que el ciclo gira.Entonces, para el primer número en rango (4), que es 0, agregue el número 3 ... luego, para el siguiente número, agregue el número tres, el siguiente y el siguiente. Entonces terminas con una lista de cuatro tres. – Doug

+0

ahhhh entonces 'heres 3, trátelo como un i' – jason

14

3 for i in range(4) es un generador que produce 3 cuatro veces en una fila y max toma un iterable y devuelve el elemento con el valor más alto, que es, obviamente, tres aquí.

5

Se puede reescribirse como:

nums = [] 
for i in range(4): 
    nums.append(3) 
print max(nums) # 3! Hurrah! 

Espero que tenga su falta de sentido más evidente.

2

La expresión:

print max(3 for i in range(4)) 

está imprimiendo el resultado de max() función aplicada a lo que está en los soportes. En los soportes sin embargo hay que generador expresión de la creación de algo similar a la matriz con todos los elementos iguales a 3, pero de una manera más eficiente que la expresión:

print max([3 for i in range(4)]) 

que va a crear la matriz de 3 's y destruirlo después de que ya no sea necesario.

Básicamente, porque en los corchetes creará solo valores que son iguales y la función max() devuelve la más grande, no necesita crear más de un elemento. Porque con el número de elementos siempre igual a uno, max() función no se hace necesario y su código se puede sustituir con eficacia (al menos en el caso de que haya dado) por el siguiente código:

print 3 

Eso no es más que todos;)

Para leer más sobre las diferencias entre la comprensión y generador de expresión, se puede visitar documentation page.

Cuestiones relacionadas