Empecé a aprender Python recientemente y no entiendo por qué Python se comporta así:
>>> "Está bien"
'OK'
>>> """OK"""
'OK'
>>> "no está bien"
Archivo "<stdin>", línea 1
"no está bien'
^
SyntaxError: EOL al escanear literal de cadena
>>> "no está bien"""
'no está bien'
¿Por qué no da un error para la última declaración ya que el número de comillas no coincide?
Python usa una implementación similar a la pila para detectar la apertura y el cierre de las comillas. Si sabe qué es una pila, es una estructura de datos, en la que el Último elemento se eliminará primero.
Suponga que su cadena es A = "''" Lo que hace es, por cada comilla simple o comilla doble que encuentre por primera vez, la agregará a la pila, y por cada segundo, la eliminará de la pila, a menos que, por supuesto, """ que se analizará como uno solo
En nuestro ejemplo, A = "''" , iterando sobre él, para los primeros 2 elementos, se agregarán a la pila y para los siguientes 2, se eliminarán.
Entonces, las comillas coincidirán, si y solo si, el número de elementos en la pila al final debe ser cero
El """ final no se reconoce como una comilla triple, sino como un solo " (para cerrar el literal de cadena actual) seguido de una cadena vacía "" ; los dos literales de cadena yuxtapuestos están concatenados. El mismo comportamiento se puede reconocer más fácilmente poniendo un espacio entre el cierre y la apertura " .
>>> "not OK" "" 'not OK'"not OK"""
Python interpreta esto como "not OK"+""
Si das "not Ok""ay" , obtendrás el resultado como 'not Okay'
Pensarías que no hay diferencia entre " o ', pero en realidad, Python usa un método codicioso para aceptar entradas.
Una vez que Python ve una cita coincidente, entonces finaliza la declaración.
Es por eso que puedes escribir algo como "'s" "" . Dentro de la cadena hay un ' pero debido a que estás en una cadena, python no genera un error. Luego, después de eso, hay un " seguido de " pero esa es una cadena diferente (vacía).
Si hace algo como "s' entonces Python está buscando el siguiente " antes de ejecutar su comando.