2012-05-02 15 views
23

Python 2.6 introdujo una función next.Python: ¿Por qué debería usar next() y no obj.next()?

¿Por qué fue esto necesario? Uno siempre puede escribir obj.next() en lugar de next(obj).

¿Es este último más pythonic?

+5

Siempre me he preguntado por qué el lenguaje Python inspirado en Monty Python sentía la necesidad de acuñar el término "pitónico" en lugar del más natural "Pythonesque" ..... –

+0

También se preguntó antes: http: // stackoverflow. com/questions/656155/why-did-python-2-6-add-a-global-next-function –

Respuesta

35

PEP 3114 describe este cambio. Un extracto sobre la motivación:

Este PEP propone que el método next ser renombrado a __next__, consistente con todos los otros protocolos de Python en el que un método es implícitamente llamado como parte de un protocolo de nivel de idioma, y que se haya introducido una función integrada denominada next para invocar el método __next__, consistente con la manera en que se invocan explícitamente otros protocolos .

Asegúrese de leer este PEP para obtener más detalles interesantes.

cuanto a por qué que desea utilizar el next incorporado: una buena razón es que el método next desaparece en Python 3, por lo que la portabilidad es mejor empezar a utilizar el next integrado tan pronto como sea posible.

+0

+1: Eso es lo que estaba diciendo en el comentario. – rubik

+1

Me gustó más esta respuesta. Especialmente debido a la nota, que Py3000 ya no tendrá los siguientes métodos en los objetos. –

25

next(iterator[, default])

recuperar el siguiente elemento de la iterador llamando a su next()(__next__() en Python método 3). Si se proporciona predeterminado, se devuelve si el iterador está agotado; de lo contrario, se genera StopIteration.

Obtiene la opción default.

+1

+1, pero no pudo haber agregado un parámetro opcional 'default' al método:' obj .next (predeterminado) '? –

+9

@Tim: Entonces, cada implementación de iterador tendría que duplicar la lógica. –

+5

Además, en Python 3 el método 'next()' ya no existe. Se reemplaza por '__next __()'. La función 'next()' permite un comportamiento unificado. – rubik

11

Aparte de la funcionalidad adicional obvia, también se ve mejor cuando se usa junto con las expresiones del generador. Comparar

(x for x in lst if x > 2).next() 

a

next(x for x in lst if x > 2) 

Este último es mucho más coherente con el resto del estilo de Python, en mi humilde opinión.

+0

¿No comienza la expresión del generador desde el principio cada vez que se ejecuta la instrucción?Parece que esto solo devolverá el primer elemento. –

+1

@Mark: Sí, ese es el propósito de este modismo: Devolver el primer elemento de un iterable que cumpla con un determinado criterio (o plantee 'StopIteration' de lo contrario). –

+0

Es como 'Enumerable # find' en Ruby, por ejemplo. –

Cuestiones relacionadas