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
?
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
?
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 denominadanext
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.
+1: Eso es lo que estaba diciendo en el comentario. – rubik
Me gustó más esta respuesta. Especialmente debido a la nota, que Py3000 ya no tendrá los siguientes métodos en los objetos. –
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 generaStopIteration
.
Obtiene la opción default
.
+1, pero no pudo haber agregado un parámetro opcional 'default' al método:' obj .next (predeterminado) '? –
@Tim: Entonces, cada implementación de iterador tendría que duplicar la lógica. –
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
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.
¿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. –
@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). –
Es como 'Enumerable # find' en Ruby, por ejemplo. –
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" ..... –
También se preguntó antes: http: // stackoverflow. com/questions/656155/why-did-python-2-6-add-a-global-next-function –