una tuplas tamaño resueltos programación practicar parte para más misma metodos llenar listas lista invertir imprimir funcion elementos ejercicios dificiles con comparar basico agregar python python-internals reverse-iterator

tuplas - más de 400 ejercicios de programación en python pdf



¿Cuál es la diferencia entre una tupla invertida y una lista invertida? (2)

Invertir una tupla y revertir una lista devuelve objetos de diferente tipo:

>>> reversed((1,2)) <reversed at 0x7fffe802f748> >>> reversed([1,2]) <list_reverseiterator at 0x7fffebdd4400>

Tienen la misma dir . Ningún tipo es una subclase de la otra.

¿Porqué es eso? ¿Qué puede uno hacer que el otro no puede?


Básicamente, una lista implementa el método __reversed__ y devuelve un objeto especializado, mientras que tuple __reversed__ a la implementación predeterminada de reversed para cualquier secuencia:

>>> list.__reversed__ <method ''__reversed__'' of ''list'' objects> >>> tuple.__reversed__ AttributeError: type object ''tuple'' has no attribute ''__reversed__''

Ahora, el motivo por el que la lista no se establece de forma predeterminada en la secuencia reversed se debe encontrar en el código fuente del propio objeto de la lista; es probable que habilite algunas optimizaciones accediendo directamente a algunos de los atributos de la list interna.

En realidad, mirando el código C, hay poca diferencia, y ciertamente nada que llame la atención.

Me atrevería a decir que la implementación de __reversed__ lista especial es un remanente de Python2 días en los que reversed realidad copiaría cualquier otra secuencia de Python a una list , por lo que no tendría sentido que otras secuencias tuvieran casos especiales (y cuándo se implementaron). el enumreverse general era suficiente para tuplas).

Estoy bastante seguro de que si uno simplemente comentara el espacio __reversed__ en listobject.c , Python y sus listas funcionarán como si nada hubiera pasado, por defecto al caso general reversed .


Según la documentation de Python:

object.__reversed__(self)

Llamado (si está presente) por el reversed() incorporado para implementar la iteración inversa. Debe devolver un nuevo objeto iterador que se repite en todos los objetos del contenedor en orden inverso.

Si no se proporciona el método __reversed__() , la función reversed() retrocederá al uso del protocolo de secuencia ( __len__() y __getitem__() ). Los objetos que admiten el protocolo de secuencia solo deben proporcionar __reversed__() si pueden proporcionar una implementación que sea más eficiente que la proporcionada por reversed() .