unir - Python.join o cadena de concatenación
unir listas python (5)
(Estoy bastante seguro de que a todas las personas que apuntan al formato de cadena les falta la pregunta por completo).
La creación de una cadena mediante la construcción de una matriz y su unión es solo por razones de rendimiento. A menos que necesite ese rendimiento, o al menos que sea la forma natural de implementarlo de todos modos, no hay ningún beneficio en hacerlo en lugar de la simple concatenación de cadenas.
Decir ''@''.join([user, host])
es intuitivo. Me pregunto: ¿por qué está haciendo esto? ¿Hay alguna sutileza en ello? ¿Hay algún caso en el que pueda haber más de una ''@''? La respuesta es no, por supuesto, pero lleva más tiempo llegar a esa conclusión que si se escribiera de forma natural.
No contorsione su código simplemente para evitar la concatenación de cadenas; no hay nada inherentemente malo en ello. Unir matrices es solo una optimización.
Me doy cuenta de que si tienes un iterable siempre debes usar .join(iterable)
lugar de for x in y: str += x
. Pero si solo hay un número fijo de variables que aún no están en una iterable, ¿está utilizando .join()
todavía la forma recomendada?
Por ejemplo tengo
user = ''username''
host = ''host''
deberia hacer
ret = user + ''@'' + host
o
ret = ''@''.join([user, host])
No estoy preguntando mucho desde el punto de vista del rendimiento, ya que ambos serán bastante triviales. Pero he leído que la gente aquí dice que siempre usa .join()
y me preguntaba si hay alguna razón en particular para eso o si en general es una buena idea usar .join()
.
Entiendo que la pregunta significa: "¿Está bien hacer esto?"
ret = user + ''@'' + host
..Y la respuesta es sí. Eso está perfectamente bien.
Por supuesto, deberías estar al tanto de las cosas geniales de formato que puedes hacer en Python, y debes saber que para listas largas, "unirse" es el camino a seguir, pero para una situación simple como esta, lo que tienes es exactamente correcto. Es simple y claro, y el rendimiento no será un problema.
Notaré que siempre he tendido a usar la concatenación in situ hasta que volví a leer una parte de la Guía de estilo PEP PEP-8 de Python para el estilo general de Python .
- El código debe escribirse de manera que no perjudique a otras implementaciones de Python (PyPy, Jython, IronPython, Pyrex, Psyco, etc.). Por ejemplo, no confíe en la implementación eficiente de la concatenación de cadenas en el lugar de CPython para las declaraciones en la forma a + = b o a = a + b. Esas declaraciones corren más lentamente en Jython. En las partes de la biblioteca sensibles al rendimiento, se debe utilizar el formulario '''' .join () en su lugar. Esto asegurará que la concatenación ocurra en tiempo lineal en varias implementaciones.
A raíz de esto, me he estado convirtiendo a la práctica de usar uniones para poder mantener el hábito como una práctica más automática cuando la eficiencia es más crítica.
Así que voy a poner en mi voto para:
ret = ''@''.join([user, host])
Si está creando una cadena como esa, normalmente desea usar el formato de cadena:
>>> user = ''username''
>>> host = ''host''
>>> ''%s@%s'' % (user, host)
''username@host''
Python 2.6 agregó otro formulario, que no se basa en la sobrecarga del operador y tiene algunas características adicionales:
>>> ''{0}@{1}''.format(user, host)
''username@host''
Como norma general, la mayoría de las personas usarán +
en las cadenas solo si están agregando dos cadenas allí mismo. Para partes o cadenas más complejas, usan el formato de cadena, como el de arriba, o ensamblan elementos en una lista y los unen (especialmente si hay algún tipo de bucle involucrado). La razón para usar str.join()
es que al agregar cuerdas juntas significa crear una nueva cadena (y potencialmente destruir las viejas) para cada adición . Python a veces puede optimizar esto, pero str.join()
rápidamente se vuelve más claro, más obvio y significativamente más rápido.
Yo uso siguiente
ret = ''%s@%s'' % (user, host)