Hola Bryan,
¡Qué buena pregunta! En Python, la función zip() se utiliza para combinar elementos de múltiples iterables (como listas, tuplas, etc.) en pares, o en este caso, en tuplas de dos elementos. Cuando usas zip(alturas, pesos), lo que estás haciendo es crear un iterable que contiene tuplas, donde cada tupla tiene un elemento de alturas y un elemento de pesos en la misma posición.
El resultado de zip() es un objeto de tipo zip, que es un iterable. Por eso, cuando lo usas directamente en un bucle o en una comprensión de listas, no necesitas convertirlo explícitamente a otro tipo de iterable, como una lista o una tupla. Python maneja este objeto zip de manera que puedes iterar sobre él directamente.
En el ejemplo que mencionas:
imc = [round((peso / altura**2), 1) for altura, peso in zip(alturas, pesos)]
La comprensión de listas está iterando sobre el objeto zip, desempaquetando cada tupla en altura y peso, y calculando el IMC para cada par. El resultado final es una lista de los IMCs calculados.
Espero que esto aclare por qué no necesitas convertir el objeto zip a otro tipo de iterable antes de usarlo. Espero haber ayudado y buenos estudios!