<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Datos y Cerebros]]></title><description><![CDATA[Explico temas de Python y ciencia de datos, de la manera en que me hubiera gustado que me lo explicaran a mi.]]></description><link>https://gustavojuantorena.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!c_gi!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F525c3c88-e1e9-417d-9943-3e8525178564_360x400.png</url><title>Datos y Cerebros</title><link>https://gustavojuantorena.substack.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 17 Aug 2026 01:06:33 GMT</lastBuildDate><atom:link href="https://gustavojuantorena.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Gustavo Juantorena]]></copyright><language><![CDATA[es]]></language><webMaster><![CDATA[gustavojuantorena@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[gustavojuantorena@substack.com]]></itunes:email><itunes:name><![CDATA[Gustavo Juantorena]]></itunes:name></itunes:owner><itunes:author><![CDATA[Gustavo Juantorena]]></itunes:author><googleplay:owner><![CDATA[gustavojuantorena@substack.com]]></googleplay:owner><googleplay:email><![CDATA[gustavojuantorena@substack.com]]></googleplay:email><googleplay:author><![CDATA[Gustavo Juantorena]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Construyendo un Buscador Semántico para LinkedIn con Streamlit y Sentence Transformers]]></title><description><![CDATA[Prob&#225; la app en https://buscador-linkedin.streamlit.app/]]></description><link>https://gustavojuantorena.substack.com/p/construyendo-un-buscador-semantico</link><guid isPermaLink="false">https://gustavojuantorena.substack.com/p/construyendo-un-buscador-semantico</guid><dc:creator><![CDATA[Gustavo Juantorena]]></dc:creator><pubDate>Tue, 04 Mar 2025 20:28:56 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3672e2ed-28ea-406b-b04a-b48a7525ce34_1294x644.gif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="pullquote"><p><strong>Prob&#225; la app en <a href="https://buscador-linkedin.streamlit.app/">https://buscador-linkedin.streamlit.app/</a></strong></p></div><p>El otro d&#237;a me di cuenta que hace ya cuatro a&#241;os que comparto contenido sobre Python y Ciencia de Datos en LinkedIn y la verdad es que se trata de una experiencia muy interesante que me permiti&#243; conectar con muchas personas. Sin embargo, al acumular cientos de publicaciones, encontrar contenido espec&#237;fico puede volverse un verdadero desaf&#237;o y frecuentemente hay gente pregunt&#225;ndome sobre algo de lo que ya hice muchos posts. Por esta raz&#243;n, decid&#237; desarrollar un buscador sem&#225;ntico que utiliza inteligencia artificial para encontrar publicaciones relevantes. Este proyecto combina las bibliotecas Sentence Transformers y Streamlit para crear una aplicaci&#243;n sencilla y poderosa que mejora la forma en que se puede interactuar con mi contenido. Al final, adem&#225;s del objetivo de proporcionar una manera m&#225;s eficaz para buscar entre mis publicaciones,  estos conceptos y herramientas les permitir&#225;n ir m&#225;s all&#225; y  crear un buscador en base a sus propios datos.</p><h3>B&#250;squeda sem&#225;ntica</h3><p>La b&#250;squeda sem&#225;ntica es un enfoque avanzado para encontrar informaci&#243;n relevante, que se basa en el significado de las palabras y las relaciones entre conceptos, en lugar de simplemente buscar coincidencias exactas de texto (como hacen los motores de b&#250;squeda tradicionales). La idea es entender la intenci&#243;n detr&#225;s de la consulta del usuario y su contexto, mejorando la precisi&#243;n de los resultados.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Suscribirse&quot;,&quot;language&quot;:&quot;es&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">&#161;Gracias por leer Datos y Cerebros! Suscr&#237;bete gratis para recibir nuevos posts y apoyar mi trabajo.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Escribe tu correo electr&#243;nico..." tabindex="-1"><input type="submit" class="button primary" value="Suscribirse"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Hay versiones m&#225;s sofisticadas, pero en su forma b&#225;sica se basa en encontrar similitudes entre palabras y oraciones en un espacio vectorial, luego de haber construido representaciones num&#233;ricas (tambi&#233;n conocidas como <a href="https://es.wikipedia.org/wiki/Word_embedding">embeddings</a>) de ellas. Esto se basa en l<strong>a idea de que palabras que aparecen en contextos similares tienen significados similares.</strong></p><h3>C&#243;mo funciona el buscador</h3><p>El coraz&#243;n de este proyecto es el modelo <strong><a href="https://huggingface.co/hiiamsid/sentence_similarity_spanish_es">hiiamsid/sentence_similarity_spanish_es</a></strong><a href="https://huggingface.co/hiiamsid/sentence_similarity_spanish_es">,</a> una variante de <a href="https://es.wikipedia.org/wiki/BERT_(modelo_de_lenguaje)">BERT</a> entrenada para calcular la similitud entre oraciones en espa&#241;ol. El modelo lo descargu&#233; de <a href="https://huggingface.co/">HuggingFace</a> y la idea es transformar tanto las publicaciones de LinkedIn como las consultas de los usuarios en <strong>vectores num&#233;ricos</strong> (embeddings) y luego medir la <strong>distancia</strong> entre ellos para encontrar el contenido m&#225;s relevante.</p><p>La ventaja de este enfoque es que el buscador no necesita que las palabras de la consulta coincidan <strong>exactamente</strong> con las palabras de mis publicaciones. Por ejemplo, si alguien busca &#8220;visualizaci&#243;n de datos&#8221;, el sistema puede encontrar publicaciones donde habl&#233; de <strong>gr&#225;ficos con Matplotlib</strong> o <strong>dashboards con Plotly</strong>, aunque esas palabras no est&#233;n en la consulta original. Esto es posible porque el modelo entiende que todos esos conceptos est&#225;n relacionados.</p><h3>C&#243;mo constru&#237; un buscador sem&#225;ntico de mis publicaciones de LinkedIn</h3><p>Para facilitar la b&#250;squeda de contenido espec&#237;fico entre mis cientos de publicaciones, cre&#233; un buscador sem&#225;ntico usando:</p><ul><li><p><strong><a href="https://sbert.net/">Sentence Transformers</a></strong>: Para convertir textos en vectores (embeddings) y medir similitud.</p></li><li><p><strong><a href="https://streamlit.io/">Streamlit</a></strong>: Para armar una interfaz web simple y funcional.</p></li><li><p><strong><a href="https://pandas.pydata.org/">Pandas</a></strong>: Para manipular el archivo CSV con mis publicaciones.</p></li></ul><h3>Flujo del Proyecto</h3><p><a href="https://github.com/GEJ1/buscador-linkedin">Ac&#225; pueden encontrar todo el c&#243;digo</a> del proyecto y a continuaci&#243;n pasar&#233; a explicar cada parte del mismo</p><h4>1. Descarga de mis posts de LinkedIn</h4><p>En el archivo posts.csv se encuentran todas mis publicaciones de LinkedIn. Cada fila corresponde a un post, con su fecha y el texto completo. Este archivo es la fuente principal de datos para el buscador sem&#225;ntico.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pzIQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8759582-4a9b-44f3-8d77-ee2d61e594a7_599x70.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pzIQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8759582-4a9b-44f3-8d77-ee2d61e594a7_599x70.png 424w, https://substackcdn.com/image/fetch/$s_!pzIQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8759582-4a9b-44f3-8d77-ee2d61e594a7_599x70.png 848w, https://substackcdn.com/image/fetch/$s_!pzIQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8759582-4a9b-44f3-8d77-ee2d61e594a7_599x70.png 1272w, https://substackcdn.com/image/fetch/$s_!pzIQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8759582-4a9b-44f3-8d77-ee2d61e594a7_599x70.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pzIQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8759582-4a9b-44f3-8d77-ee2d61e594a7_599x70.png" width="599" height="70" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8759582-4a9b-44f3-8d77-ee2d61e594a7_599x70.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:70,&quot;width&quot;:599,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6249,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://gustavojuantorena.substack.com/i/153928242?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8759582-4a9b-44f3-8d77-ee2d61e594a7_599x70.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pzIQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8759582-4a9b-44f3-8d77-ee2d61e594a7_599x70.png 424w, https://substackcdn.com/image/fetch/$s_!pzIQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8759582-4a9b-44f3-8d77-ee2d61e594a7_599x70.png 848w, https://substackcdn.com/image/fetch/$s_!pzIQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8759582-4a9b-44f3-8d77-ee2d61e594a7_599x70.png 1272w, https://substackcdn.com/image/fetch/$s_!pzIQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8759582-4a9b-44f3-8d77-ee2d61e594a7_599x70.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Fila de ejemplo del archivo posts.csv</figcaption></figure></div><p>Este archivo fue generado utilizando la herramienta oficial de <strong><a href="https://www.linkedin.com/help/linkedin/answer/a1340367/descargar-los-datos-de-tu-cuenta?lang=es-ES">Descarga de Datos de LinkedIn</a></strong>, que permite exportar un historial completo de tus publicaciones. De esta forma, pude obtener un registro estructurado con el contenido de cada post, listo para procesar y analizar.</p><h4>2. Creaci&#243;n de representaciones num&#233;ricas (embeddings)</h4><p>Este modelo est&#225; <em><strong><a href="https://es.wikipedia.org/wiki/Ajuste_fino_(aprendizaje_profundo)">finetuneado</a></strong></em> para calcular similitud entre oraciones en espa&#241;ol. La idea es que publicaciones con temas similares (por ejemplo, pandas y limpieza de datos) est&#233;n cerca en un espacio vectorial que los contiene.</p><p>El c&#243;digo relevante se encuentra en el notebook <strong><a href="https://github.com/GEJ1/buscador-linkedin/blob/main/notebooks/generar_linkedin_embeddings.ipynb">generar_linkedin_embeddings.ipynb</a></strong></p><pre><code>model = SentenceTransformer('hiiamsid/sentence_similarity_spanish_es')</code></pre><p>El flujo es el siguiente:</p><ol><li><p>Cargar el CSV de publicaciones.</p></li><li><p>Convertir cada post a un <strong>embedding</strong>.</p></li><li><p>Guardar los embeddings en un archivo. Los embeddings podr&#237;an generarse con cada consulta pero esto es una manera m&#225;s &#243;ptima de hacerlo.</p></li></ol><pre><code>shares_data.to_csv(f'Shares_with_embeddings_{model_type.split("/")[-1]}.csv', index=False)</code></pre><h4>3. Creaci&#243;n de una app con Streamlit </h4><p>La idea fue crear una app web sencilla que le permitiera al usuario escribir una consulta y visualizar los potenciales posts de inter&#233;s. </p><p>El c&#243;digo lo pueden encontrar en <a href="https://github.com/GEJ1/buscador-linkedin/blob/main/streamlit_app.py">streamlit_app.py</a> , pero m&#225;s all&#225; de algunos detalles de dise&#241;o para que se vea mejor, el sistema hace lo siguiente:</p><ol><li><p>Carga el archivo CSV con publicaciones y embeddings.</p></li><li><p>Compara la consulta con todos mis posts usando la <a href="https://es.wikipedia.org/wiki/Similitud_coseno">similitud coseno</a>.</p></li><li><p>Devuelve los 5 posts m&#225;s relevantes.</p></li><li><p>Permite ver una versi&#243;n abreviada del post e ir con un bot&#243;n directo al post original.</p></li></ol><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;7bed6d74-0b43-405c-b458-f1589f5e4a8c&quot;,&quot;duration&quot;:null}"></div><p></p><h4>Puesta en producci&#243;n</h4><p>Finalmente la sub&#237;  <a href="https://docs.streamlit.io/deploy/streamlit-community-cloud/get-started">Streamlit community cloud</a>, un servicio de Streamlit que tiene una capa gratuita para subir apps con algunas limitaciones.</p><h4>Prob&#225; la app funcionando: <a href="https://buscador-linkedin.streamlit.app/">https://buscador-linkedin.streamlit.app/</a></h4><h4>&#191;Quer&#233;s armar uno para tu propio buscador con IA?</h4><p>Si te interesa replicarlo, el c&#243;digo completo est&#225; disponible y puede adaptarse a cualquier colecci&#243;n de textos: posts, art&#237;culos, papers o documentos internos: <a href="https://github.com/GEJ1/buscador-linkedin/">https://github.com/GEJ1/buscador-linkedin/</a></p><h3>&#191;Te interesa seguir aprendiendo m&#225;s sobre Python?</h3><p>Si este contenido te result&#243; &#250;til y te interesa leer contenido sobre programaci&#243;n principalmente en Python, ciencia de datos e inteligencia artificial, seguime en mis redes:</p><p>&#128025; <strong>Pueden ver <a href="https://github.com/GEJ1/buscador-linkedin/">todo el c&#243;digo en es repositorio de Github</a> y si te sirve dej&#225; una estrella </strong><a href="https://emojipedia.org/star">&#11088;</a> </p><p>&#128216; <strong>LinkedIn donde comparto contenido con frecuencia:</strong> <a href="https://www.linkedin.com/in/gustavo-juantorena/">Gustavo Juantorena</a></p><p>&#128249; <strong>YouTube:</strong> <a href="https://www.youtube.com/@gustavojuantorena">Gustavo Juantorena - Programaci&#243;n y Ciencia de Datos</a></p><h4><a href="https://emojipedia.org/recycling-symbol">&#9851;&#65039;</a> Si te gust&#243; este post, &#161;compartilo para que m&#225;s personas puedan aprender! Si te quedaron dudas, dejalas en los comentarios</h4><h4>&#161;Nos vemos en el pr&#243;ximo!</h4><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Suscribirse&quot;,&quot;language&quot;:&quot;es&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">&#161;Gracias por leer Datos y Cerebros! Suscr&#237;bete gratis para recibir nuevos posts y apoyar mi trabajo.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Escribe tu correo electr&#243;nico..." tabindex="-1"><input type="submit" class="button primary" value="Suscribirse"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/p/construyendo-un-buscador-semantico/comments&quot;,&quot;text&quot;:&quot;Deja un comentario&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://gustavojuantorena.substack.com/p/construyendo-un-buscador-semantico/comments"><span>Deja un comentario</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/p/construyendo-un-buscador-semantico?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Compartir&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://gustavojuantorena.substack.com/p/construyendo-un-buscador-semantico?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Compartir</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Compartir Datos y Cerebros&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://gustavojuantorena.substack.com/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Compartir Datos y Cerebros</span></a></p><p class="cta-caption"></p>]]></content:encoded></item><item><title><![CDATA[*args y **kwargs en Python]]></title><description><![CDATA[Qu&#233; son y c&#243;mo usarlos f&#225;cilmente.]]></description><link>https://gustavojuantorena.substack.com/p/args-y-kwargs-en-python</link><guid isPermaLink="false">https://gustavojuantorena.substack.com/p/args-y-kwargs-en-python</guid><dc:creator><![CDATA[Gustavo Juantorena]]></dc:creator><pubDate>Mon, 16 Dec 2024 14:05:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qpzX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa6095e-80ae-4fe3-8292-41cb81a9c5cf_1043x476.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qpzX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa6095e-80ae-4fe3-8292-41cb81a9c5cf_1043x476.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qpzX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa6095e-80ae-4fe3-8292-41cb81a9c5cf_1043x476.png 424w, https://substackcdn.com/image/fetch/$s_!qpzX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa6095e-80ae-4fe3-8292-41cb81a9c5cf_1043x476.png 848w, https://substackcdn.com/image/fetch/$s_!qpzX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa6095e-80ae-4fe3-8292-41cb81a9c5cf_1043x476.png 1272w, https://substackcdn.com/image/fetch/$s_!qpzX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa6095e-80ae-4fe3-8292-41cb81a9c5cf_1043x476.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qpzX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa6095e-80ae-4fe3-8292-41cb81a9c5cf_1043x476.png" width="1043" height="476" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8fa6095e-80ae-4fe3-8292-41cb81a9c5cf_1043x476.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:476,&quot;width&quot;:1043,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:45844,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qpzX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa6095e-80ae-4fe3-8292-41cb81a9c5cf_1043x476.png 424w, https://substackcdn.com/image/fetch/$s_!qpzX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa6095e-80ae-4fe3-8292-41cb81a9c5cf_1043x476.png 848w, https://substackcdn.com/image/fetch/$s_!qpzX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa6095e-80ae-4fe3-8292-41cb81a9c5cf_1043x476.png 1272w, https://substackcdn.com/image/fetch/$s_!qpzX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fa6095e-80ae-4fe3-8292-41cb81a9c5cf_1043x476.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Argumentos posicionales</h2><p>En Python los par&#225;metros de una funci&#243;n son <strong>posicionales</strong> por defecto, esto quiere decir que el orden en que le pasamos los argumentos es importante. Veamos un ejemplo:</p><pre><code>def juntar_palabras(palabra1, palabra2):     
    return palabra1 + palabra2  

print(juntar_palabras('perro', 'loco')) # Salida: 'perroloco'  </code></pre><p>Si hubieramos pasado primero &#8216;loco&#8217; y luego &#8216;perro&#8217; el resultado hubiera estado invertido, devolviendo <strong>&#8216;locoperro&#8217;</strong>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Suscribirse&quot;,&quot;language&quot;:&quot;es&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">&#161;Gracias por leer El Substack de Gustavo! Suscr&#237;bete gratis para recibir nuevos posts y apoyar mi trabajo.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Escribe tu correo electr&#243;nico..." tabindex="-1"><input type="submit" class="button primary" value="Suscribirse"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>&#191;Qu&#233; sucede si quiero concatenar 3 palabras? Una opci&#243;n ser&#237;a agregar un tercer par&#225;metro a la funci&#243;n:</p><pre><code><code>def juntar_palabras(palabra1, palabra2, palabra3):          
    return palabra1 + palabra2 + palabra3    

print(juntar_palabras('perro', 'loco', 'lindo')) # Salida: 'perrolocolindo'  </code>  </code></pre><p>&#191;Y cu&#225;ndo no sabemos cu&#225;ntos argumentos va a recibir nuestra funci&#243;n?</p><p>Ah&#237; es donde aparece la utilidad de <code>*args</code>:</p><pre><code>def juntar_palabras(*args):    
    salida = ''  
    for palabra in args:
        salida += palabra
    return salida
  

print(juntar_palabras('perro', 'loco', 'lindo', 'grande')) # Salida: 'perrolocolindogrande' </code></pre><p>Como se observa en el ejemplo, utilizar <code>*args</code> nos permite recibir una cantidad de argumentos indefinida y utilizarla como si estuvieras pasando una tupla con esos valores.</p><h2>Argumentos con nombre</h2><p>Una alternativa que nos permite Python es crear una funci&#243;n con par&#225;metros que tengan nombre (o <em>keyword arguments</em>). De este modo, ya no importar&#225; el orden, sino que estaremos asignando un valor a cada variable que podr&#225; ser usado dentro de la funci&#243;n:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DX80!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb608ec95-2c47-4294-b4b3-d45264ce957e_794x458.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DX80!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb608ec95-2c47-4294-b4b3-d45264ce957e_794x458.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DX80!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb608ec95-2c47-4294-b4b3-d45264ce957e_794x458.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DX80!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb608ec95-2c47-4294-b4b3-d45264ce957e_794x458.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DX80!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb608ec95-2c47-4294-b4b3-d45264ce957e_794x458.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DX80!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb608ec95-2c47-4294-b4b3-d45264ce957e_794x458.jpeg" width="413" height="238.2292191435768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b608ec95-2c47-4294-b4b3-d45264ce957e_794x458.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:458,&quot;width&quot;:794,&quot;resizeWidth&quot;:413,&quot;bytes&quot;:45335,&quot;alt&quot;:&quot;meme de squirtle diciendo \&quot;vamo a calmarno\&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="meme de squirtle diciendo &quot;vamo a calmarno&quot;" title="meme de squirtle diciendo &quot;vamo a calmarno&quot;" srcset="https://substackcdn.com/image/fetch/$s_!DX80!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb608ec95-2c47-4294-b4b3-d45264ce957e_794x458.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DX80!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb608ec95-2c47-4294-b4b3-d45264ce957e_794x458.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DX80!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb608ec95-2c47-4294-b4b3-d45264ce957e_794x458.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DX80!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb608ec95-2c47-4294-b4b3-d45264ce957e_794x458.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><pre><code>def describir_pokemon(tipo, color, tama&#241;o):     
    return f"El Pokemon es {tipo}, {color} y {tama&#241;o}."

print(describir_pokemon(tama&#241;o="peque&#241;o", color="azul", tipo="agua"))
# Salida: 'El Pokemon es tipo agua, color azul y peque&#241;o.'</code></pre><p>En este caso, para recibir una cantidad <strong>variable de argumentos con nombre</strong> tenemos que usar no uno, sino dos asteriscos (<code>**kwargs</code><strong>)</strong>:</p><pre><code>def describir_atributos(**kwargs):     
    for clave, valor in kwargs.items():
        print(f"{clave}: {valor}")

describir_atributos(tipo="roca", color="negro", tama&#241;o="grande")  
# Salida:
# tipo: roca
# color: negro
# tama&#241;o: grande</code></pre><p>Lo que terminamos obteniendo es un diccionario donde las claves son los nombres de los argumentos y los valores son los datos proporcionados. </p><h2>La gran mentira sobre args y kwargs <a href="https://emojipedia.org/face-with-open-mouth">&#128558;</a></h2><p>Dado que cuando queremos el comportamiento explicado previamente usamos <code>*args</code><strong> </strong>y<strong> </strong><code>**kwargs</code>, podr&#237;amos creer que se trata de palabras reservadas que tienen un valor particular en el lenguaje (como <strong>True</strong>, <strong>print</strong> o <strong>def</strong>) pero &#161;nada m&#225;s lejos de la realidad! <code>*args</code> y <code>**kwargs</code> son simples <strong>convenciones</strong> y podr&#237;amos obtener el mismo comportamiento con cualquier otro nombre mientras respetemos el patr&#243;n de un asterisco para argumentos posicionales y dos para argumentos con nombre:</p><pre><code>def ejemplo_posic(*posicionales):
    print("Posicionales:", posicionales)


ejemplo_posic(1, 2, 3)  
# Salida:
# Posicionales: (1, 2, 3)

def ejemplo_con_nombre(**con_nombre):
    print("Con nombre:", con_nombre)

ejemplo_con_nombre(atributo1="valor1", atributo2="valor2")  
# Salida:
# Con nombre: {'atributo1': 'valor1', 'atributo2': 'valor2'}</code></pre><h2>Unamos lo aprendido <a href="https://emojipedia.org/handshake">&#129309;</a></h2><p>&#191;Qu&#233; pasa si en una misma funci&#243;n quiero recibir una cantidad desconocida de argumentos posicionales <strong>y adem&#225;s</strong> <strong>una cantidad desconocida de argumentos con nombre</strong>? Bueno, tranquilos porque eso es perfectamente v&#225;lido. Por completitud les voy a dejar un ejemplo con todas las posibilidades, el cual solo es funcional a partir de la <strong>versi&#243;n 3.8 de Python</strong>. Se puede definir una funci&#243;n con los siguientes tipos de par&#225;metros en este orden espec&#237;fico:</p><ol><li><p><strong>Par&#225;metros posicionales obligatorios</strong> (los &#8220;normales&#8221;).</p></li><li><p><code>/</code>: Para indicar que todos los par&#225;metros antes de esta barra deben ser <strong>posicionales obligatorios</strong>.</p></li><li><p><strong>Par&#225;metros posicionales o por nombre</strong>.</p></li><li><p><code>*</code>: Para indicar que todos los par&#225;metros despu&#233;s de <code>*</code> deben ser pasados por <strong>nombre (keyword-only)</strong>. Notar que este es otro uso del *, del cu&#225;l todav&#237;a no hab&#237;amos hablado.</p></li><li><p><code>*args</code>: Captura una cantidad variable de argumentos posicionales.</p></li><li><p><strong>Par&#225;metros con nombre (keyword-only)</strong>.</p></li><li><p><code>**kwargs</code>: Captura una cantidad variable de argumentos con nombre.</p></li></ol><pre><code>def ejemplo_completo(pos1, pos2, /, pos_o_nombre, *, nombre1, nombre2="por defecto", **kwargs):
    print("Posicionales obligatorios:")
    print(f"  pos1: {pos1}")
    print(f"  pos2: {pos2}")
    print("\nPosicionales o por nombre:")
    print(f"  pos_o_nombre: {pos_o_nombre}")
    print("\nSolo por nombre:")
    print(f"  nombre1: {nombre1}")
    print(f"  nombre2: {nombre2}")
    print("\nArgumentos adicionales (**kwargs):")
    for clave, valor in kwargs.items():
        print(f"  {clave}: {valor}")


# Llamada a la funci&#243;n
ejemplo_completo(1, 2, 3, nombre1="valor1", extra1="adicional1", extra2="adicional2")

Posicionales obligatorios:
  pos1: 1
  pos2: 2

Posicionales o por nombre:
  pos_o_nombre: 3

Solo por nombre:
  nombre1: valor1
  nombre2: por defecto

Argumentos adicionales (**kwargs):
  extra1: adicional1
  extra2: adicional2</code></pre><p>Una aclaraci&#243;n m&#225;s es que no es obligatorio pasar <strong>&#8220;</strong>de a uno<strong>&#8221; </strong>los argumentos posicionales y con nombre sino que podemos <strong>directamente pasarle la colecci&#243;n, siempre y cuando los desempaquemos con </strong><code>*</code><strong> y </strong><code>**</code>:</p><pre><code><code>mi_lista = [1, 2, 3]
mi_diccionario = {"a":4, "b":5}

def ejemplo_colecciones(*args, **kwargs):
    print("args:", args)
    print("kwargs:", kwargs)
    return args, kwargs  # Devuelve args y kwargs como una tupla

print(ejemplo_colecciones(*mi_lista, **mi_diccionario))
# Salida:
# args: (1, 2, 3)
# kwargs: {'a': 4, 'b': 5'}
# ((1, 2, 3), {'a': 4, 'b': 5})</code></code></pre><h2>Usando * y <code>**</code> fuera de una funci&#243;n </h2><p>Una de las cosas que tambi&#233;n suele confundir un poco sobre este tema es que el comportamiento de <code>*</code><strong> y </strong><code>**</code> cambia fuera de funciones porque en este caso se utilizan para desempaquetar colecciones en otros contextos, tales como la creaci&#243;n de listas, tuplas o diccionarios. En particular <code>*</code> se utiliza para desempaquetar (<em>unpacking</em>) colecciones como listas, sets y tuplas:</p><pre><code># Desempaquetar listas
lista1 = [1, 2, 3]
lista2 = [4, 5, 6]
combinada = [*lista1, *lista2]  # [1, 2, 3, 4, 5, 6]

# Desempaquetar sets
set1 = {1, 2}
set2 = {3, 4}
combinado = {*set1, *set2}  
print(combinado) # Salida: {1, 2, 3, 4}</code></pre><p>Mientras que <code>**</code> Se usa para desempaquetar<strong> diccionarios, permitiendo por ejemplo</strong> combinar sus claves y valores en un nuevo diccionario:</p><pre><code>dict1 = {"a": 1, "b": 2}
dict2 = {"c": 3, "d": 4}
combinado = {**dict1, **dict2} 

print(combinado) # Salida: {'a': 1, 'b': 2, 'c': 3, 'd': 4}</code></pre><p>Resumiendo, en la definici&#243;n de funciones <code>*</code> y <code>**</code>, se usan para recolectar entradas din&#225;micas, mientras que fuera de las funciones, se usan para expandir estructuras en nuevas colecciones.</p><h2>Conclusiones y resumen</h2><p>En Python <code>*args</code>, y <code>**kwargs</code> se usan para definir funciones de manera flexible. Adem&#225;s, existe el concepto de desempaquetado de colecciones con <code>*</code> y <code>**</code> fuera de las funciones, el cual nos permite expandir estructuras en nuevas colecciones.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!S69V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22d53f8-c22f-4aa3-8135-8e9e33d5d3e2_589x278.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S69V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22d53f8-c22f-4aa3-8135-8e9e33d5d3e2_589x278.png 424w, https://substackcdn.com/image/fetch/$s_!S69V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22d53f8-c22f-4aa3-8135-8e9e33d5d3e2_589x278.png 848w, https://substackcdn.com/image/fetch/$s_!S69V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22d53f8-c22f-4aa3-8135-8e9e33d5d3e2_589x278.png 1272w, https://substackcdn.com/image/fetch/$s_!S69V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22d53f8-c22f-4aa3-8135-8e9e33d5d3e2_589x278.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S69V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22d53f8-c22f-4aa3-8135-8e9e33d5d3e2_589x278.png" width="589" height="278" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d22d53f8-c22f-4aa3-8135-8e9e33d5d3e2_589x278.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:278,&quot;width&quot;:589,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50931,&quot;alt&quot;:&quot;Concepto\tDescripci&#243;n Argumentos Posicionales (*args)\tPermiten recibir una cantidad indefinida de argumentos posicionales en una funci&#243;n, trat&#225;ndolos como una tupla. Esto resulta &#250;til cuando no se conoce de antemano cu&#225;ntos valores se pasar&#225;n a la funci&#243;n. Argumentos con Nombre (**kwargs)\tPermiten manejar una cantidad variable de argumentos con nombre en una funci&#243;n, almacen&#225;ndolos como un diccionario. Es ideal para trabajar con configuraciones o valores din&#225;micos que deben identificarse por claves. Desempaquetado con *\tSe utiliza para expandir colecciones como listas, tuplas o conjuntos en otros contextos, como la creaci&#243;n de nuevas estructuras o la combinaci&#243;n de elementos de varias colecciones en una sola. Desempaquetado con **\tSe emplea para expandir diccionarios y combinar claves y valores en nuevos diccionarios o en funciones que aceptan par&#225;metros con nombre.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Concepto&#9;Descripci&#243;n Argumentos Posicionales (*args)&#9;Permiten recibir una cantidad indefinida de argumentos posicionales en una funci&#243;n, trat&#225;ndolos como una tupla. Esto resulta &#250;til cuando no se conoce de antemano cu&#225;ntos valores se pasar&#225;n a la funci&#243;n. Argumentos con Nombre (**kwargs)&#9;Permiten manejar una cantidad variable de argumentos con nombre en una funci&#243;n, almacen&#225;ndolos como un diccionario. Es ideal para trabajar con configuraciones o valores din&#225;micos que deben identificarse por claves. Desempaquetado con *&#9;Se utiliza para expandir colecciones como listas, tuplas o conjuntos en otros contextos, como la creaci&#243;n de nuevas estructuras o la combinaci&#243;n de elementos de varias colecciones en una sola. Desempaquetado con **&#9;Se emplea para expandir diccionarios y combinar claves y valores en nuevos diccionarios o en funciones que aceptan par&#225;metros con nombre." title="Concepto&#9;Descripci&#243;n Argumentos Posicionales (*args)&#9;Permiten recibir una cantidad indefinida de argumentos posicionales en una funci&#243;n, trat&#225;ndolos como una tupla. Esto resulta &#250;til cuando no se conoce de antemano cu&#225;ntos valores se pasar&#225;n a la funci&#243;n. Argumentos con Nombre (**kwargs)&#9;Permiten manejar una cantidad variable de argumentos con nombre en una funci&#243;n, almacen&#225;ndolos como un diccionario. Es ideal para trabajar con configuraciones o valores din&#225;micos que deben identificarse por claves. Desempaquetado con *&#9;Se utiliza para expandir colecciones como listas, tuplas o conjuntos en otros contextos, como la creaci&#243;n de nuevas estructuras o la combinaci&#243;n de elementos de varias colecciones en una sola. Desempaquetado con **&#9;Se emplea para expandir diccionarios y combinar claves y valores en nuevos diccionarios o en funciones que aceptan par&#225;metros con nombre." srcset="https://substackcdn.com/image/fetch/$s_!S69V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22d53f8-c22f-4aa3-8135-8e9e33d5d3e2_589x278.png 424w, https://substackcdn.com/image/fetch/$s_!S69V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22d53f8-c22f-4aa3-8135-8e9e33d5d3e2_589x278.png 848w, https://substackcdn.com/image/fetch/$s_!S69V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22d53f8-c22f-4aa3-8135-8e9e33d5d3e2_589x278.png 1272w, https://substackcdn.com/image/fetch/$s_!S69V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd22d53f8-c22f-4aa3-8135-8e9e33d5d3e2_589x278.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>&#191;Te interesa seguir aprendiendo m&#225;s sobre Python?</h3><p>Si este contenido te result&#243; &#250;til y te interesa leer contenido sobre programaci&#243;n principalmente en Python, ciencia de datos e inteligencia artificial? Seguime en mis redes:</p><p>&#128025; <strong>Pueden ver <a href="https://github.com/GEJ1/substack">todo el c&#243;digo en un Jupyter notebook en Github</a></strong></p><p>&#128216; <strong>LinkedIn donde comparto contenido con frecuencia:</strong> <a href="https://www.linkedin.com/in/gustavo-juantorena/">Gustavo Juantorena</a></p><p>&#128249; <strong>YouTube:</strong> <a href="https://www.youtube.com/@gustavojuantorena">Gustavo Juantorena - Programaci&#243;n y Ciencia de Datos</a></p><h4><a href="https://emojipedia.org/recycling-symbol">&#9851;&#65039;</a> Si te gust&#243; este post, &#161;compartilo para que m&#225;s personas puedan aprender! Si te quedaron dudas, dejalas en los comentarios</h4><h4>&#161;Nos vemos en el pr&#243;ximo!</h4><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/p/args-y-kwargs-en-python?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Compartir&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://gustavojuantorena.substack.com/p/args-y-kwargs-en-python?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Compartir</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Suscr&#237;bete ahora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://gustavojuantorena.substack.com/subscribe?"><span>Suscr&#237;bete ahora</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/p/args-y-kwargs-en-python/comments&quot;,&quot;text&quot;:&quot;Deja un comentario&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://gustavojuantorena.substack.com/p/args-y-kwargs-en-python/comments"><span>Deja un comentario</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Suscribirse&quot;,&quot;language&quot;:&quot;es&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">&#161;Gracias por leer El Substack de Gustavo! Suscr&#237;bete gratis para recibir nuevos posts y apoyar mi trabajo.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Escribe tu correo electr&#243;nico..." tabindex="-1"><input type="submit" class="button primary" value="Suscribirse"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[🗜️ Listas (y otros tipos) por comprensión en Python]]></title><description><![CDATA[&#191;Qu&#233; son y para qu&#233; sirven?]]></description><link>https://gustavojuantorena.substack.com/p/listas-y-otros-tipos-por-comprension</link><guid isPermaLink="false">https://gustavojuantorena.substack.com/p/listas-y-otros-tipos-por-comprension</guid><dc:creator><![CDATA[Gustavo Juantorena]]></dc:creator><pubDate>Sat, 30 Nov 2024 16:48:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5u73!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb55fbdcf-9023-4716-8039-0f638511c649_600x338.gif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5u73!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb55fbdcf-9023-4716-8039-0f638511c649_600x338.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5u73!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb55fbdcf-9023-4716-8039-0f638511c649_600x338.gif 424w, https://substackcdn.com/image/fetch/$s_!5u73!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb55fbdcf-9023-4716-8039-0f638511c649_600x338.gif 848w, https://substackcdn.com/image/fetch/$s_!5u73!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb55fbdcf-9023-4716-8039-0f638511c649_600x338.gif 1272w, https://substackcdn.com/image/fetch/$s_!5u73!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb55fbdcf-9023-4716-8039-0f638511c649_600x338.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5u73!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb55fbdcf-9023-4716-8039-0f638511c649_600x338.gif" width="600" height="338" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b55fbdcf-9023-4716-8039-0f638511c649_600x338.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:338,&quot;width&quot;:600,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Animaci&#243;n con el mismo c&#243;digo demostrando que se encuentra debajo demostrando como pasar de popular una nueva lista con un for loop a una lista por comprensi&#243;n&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Animaci&#243;n con el mismo c&#243;digo demostrando que se encuentra debajo demostrando como pasar de popular una nueva lista con un for loop a una lista por comprensi&#243;n" title="Animaci&#243;n con el mismo c&#243;digo demostrando que se encuentra debajo demostrando como pasar de popular una nueva lista con un for loop a una lista por comprensi&#243;n" srcset="https://substackcdn.com/image/fetch/$s_!5u73!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb55fbdcf-9023-4716-8039-0f638511c649_600x338.gif 424w, https://substackcdn.com/image/fetch/$s_!5u73!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb55fbdcf-9023-4716-8039-0f638511c649_600x338.gif 848w, https://substackcdn.com/image/fetch/$s_!5u73!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb55fbdcf-9023-4716-8039-0f638511c649_600x338.gif 1272w, https://substackcdn.com/image/fetch/$s_!5u73!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb55fbdcf-9023-4716-8039-0f638511c649_600x338.gif 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Las comprensiones en Python pueden generar c&#243;digo m&#225;s compacto y f&#225;cil de leer</figcaption></figure></div><p>Las comprensiones en Python (<em>comprehensions </em>en ingl&#233;s) son un tipo de construcci&#243;n espec&#237;fica de este lenguaje, que permite crear secuencias a partir de otras secuencias o de iterables.</p><p>Vamos con un ejemplo:  imaginate que quer&#233;s crear una lista a partir de otra. Una manera de hacerlo ser&#237;a la siguiente:</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Suscribirse&quot;,&quot;language&quot;:&quot;es&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">&#161;Gracias por leer El Substack de Gustavo! Suscr&#237;bete gratis para recibir nuevos posts y apoyar mi trabajo.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Escribe tu correo electr&#243;nico..." tabindex="-1"><input type="submit" class="button primary" value="Suscribirse"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><pre><code><code>lista_inicial = [1, 2, 3]
lista_nueva = [] 

for elemento in lista_inicial: 
    lista_nueva.append(elemento + 1) 

print(lista_nueva) # Salida: [2,3,4]</code></code></pre><p>Bueno, una manera de obtener el mismo resultado en Python utilizando una <a href="https://docs.python.org/es/dev/tutorial/datastructures.html#list-comprehensions">lista por comprensi&#243;n</a> ser&#237;a la siguiente:<code> </code></p><pre><code><code>lista_nueva = [elemento + 1 for elemento in lista_inicial] </code></code></pre><p>M&#225;s sencillo &#191;No?</p><h2>Filtrado dentro de la comprensi&#243;n</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3oIk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f7d5e5f-7f07-4801-aa93-7a00d8e1ecf9_1456x635.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3oIk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f7d5e5f-7f07-4801-aa93-7a00d8e1ecf9_1456x635.png 424w, https://substackcdn.com/image/fetch/$s_!3oIk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f7d5e5f-7f07-4801-aa93-7a00d8e1ecf9_1456x635.png 848w, https://substackcdn.com/image/fetch/$s_!3oIk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f7d5e5f-7f07-4801-aa93-7a00d8e1ecf9_1456x635.png 1272w, https://substackcdn.com/image/fetch/$s_!3oIk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f7d5e5f-7f07-4801-aa93-7a00d8e1ecf9_1456x635.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3oIk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f7d5e5f-7f07-4801-aa93-7a00d8e1ecf9_1456x635.png" width="1456" height="635" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6f7d5e5f-7f07-4801-aa93-7a00d8e1ecf9_1456x635.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:635,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:83809,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3oIk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f7d5e5f-7f07-4801-aa93-7a00d8e1ecf9_1456x635.png 424w, https://substackcdn.com/image/fetch/$s_!3oIk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f7d5e5f-7f07-4801-aa93-7a00d8e1ecf9_1456x635.png 848w, https://substackcdn.com/image/fetch/$s_!3oIk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f7d5e5f-7f07-4801-aa93-7a00d8e1ecf9_1456x635.png 1272w, https://substackcdn.com/image/fetch/$s_!3oIk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f7d5e5f-7f07-4801-aa93-7a00d8e1ecf9_1456x635.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Estructura general de una lista por comprensi&#243;n con un condicional &#191;Cu&#225;l es el resultado? Los leo en los comentarios</figcaption></figure></div><p>Adem&#225;s de escribir menos c&#243;digo, otra ventaja es tener una manera f&#225;cil de filtrar una lista:</p><pre><code><code>lista1 = [1, 2, 3, 4, 5, 6, 7, 8] 
lista2 = [item * 2 for item in lista1 if item &gt; 5] 

# Filtra los n&#250;meros mayores a 5 y los multiplica por 2

print(lista2) # Salida: [12, 14, 16]</code></code></pre><p>&#191;Y si tenemos m&#225;s de una condici&#243;n? Normalmente utilizar&#237;amos la palabra reservada <strong>elif</strong>, pero eso no es v&#225;lido dentro de una comprensi&#243;n. Sin embargo, se puede simular el comportamiento utilizando expresiones condicionales (<strong>if-else</strong>) dentro de la comprensi&#243;n:</p><pre><code><code>lista1 = [1, 2, 3, 4, 5, 6, 7, 8]

# Si el elemento es mayor a 5, lo multiplica por 2; si no, lo multiplica por 3
lista2 = [i * 2 if i &gt; 5 else i * 3 for i in lista1]

print(lista2) # Salida: [3, 6, 9, 12, 15, 12, 14, 16]</code></code></pre><h2>Listas por comprensi&#243;n anidadas</h2><p>Qu&#233; pasa si queremos llevar a este tipo de sintaxis una situaci&#243;n donde tenemos m&#225;s de un ciclo uno dentro de otro (anidados):</p><pre><code><code>lista1 = [1, 2, 3, 4, 5, 6, 7, 8]

# Usando un bucle est&#225;ndar 
lista2 = []
for item in lista1:
    if item &gt; 5:
        for factor in [2, 3]:
            lista2.append(item * factor)

print(lista2) # Salida: [12, 18, 14, 21, 16, 24]


# Usando una lista por comprensi&#243;n anidada

lista2 = [item * factor for item in lista1 if item &gt; 5 for factor in [2, 3]]

print(lista2) # Salida: [12, 18, 14, 21, 16, 24]</code></code></pre><p>Mi recomendaci&#243;n es no abusar de estas expresiones, siguiendo <a href="https://es.wikipedia.org/wiki/Zen_de_Python">Zen de Python</a> <em>Simple es mejor que complejo</em> y no tiene sentido hacer una comprensi&#243;n dif&#237;cil de leer, sino mejor ir por un bucle normal que sea m&#225;s f&#225;cil de entender a simple vista.</p><h2>Otras comprensiones</h2><p>Existen otras comprensiones que no se basan en listas pero que permiten tener un comportamiento similar para otras estructuras de datos</p><h3>Diccionarios por comprensi&#243;n</h3><p>Los <strong>diccionarios por comprensi&#243;n</strong> se caracterizan por el uso de llaves <strong>{ } </strong>y del par<strong> clave:valor</strong> separado por dos puntos. En el siguiente ejemplo crearemos un diccionario en base a una lista de palabras donde la clave sea cada palabra tal cual aparece y el valor sea esa misma palabra en may&#250;sculas:</p><pre><code><code>palabras = ["python", "carpincho", "diccionario"] 

diccionario_nuevo = {palabra: palabra.upper() for palabra in palabras} 

print(diccionario_nuevo) # Salida: {'python': 'PYTHON', 'carpincho': 'CARPINCHO', 'diccionario': 'DICCIONARIO'}</code></code></pre><p>Lo cual equivale a hacer lo siguiente:</p><pre><code><code>palabras = ["python", "carpincho", "diccionario"] 
diccionario_nuevo = {} 

for palabra in palabras: 
    diccionario_nuevo[palabra] = palabra.upper() 

print(diccionario_nuevo) # Salida: {'python': 'PYTHON', 'carpincho': 'CARPINCHO', 'diccionario': 'DICCIONARIO'}</code></code></pre><h3>Conjuntos (sets) por comprensi&#243;n</h3><p>Los <strong><a href="https://docs.python.org/es/3.13/tutorial/datastructures.html#sets">conjuntos (o sets)</a></strong> son colecciones no ordenada de elementos &#250;nicos en Python que simulan a los conjuntos matem&#225;ticos. Suelen ser menos conocidos aunque son muy &#250;tiles ya que no admiten duplicados y permiten operaciones de conjuntos como la uni&#243;n y la intersecci&#243;n.</p><p>Tienen su equivalente por comprensi&#243;n y aunque la sintaxis es similar no hay que confundirla con la de los diccionarios ya que ambos utilizan llaves, pero los diccionarios tienen los dos puntos ( <strong>:</strong> )  separando la clave del valor como vimos en la secci&#243;n anterior<strong>.</strong> </p><pre><code># Lista con n&#250;meros repetidos
numeros = [1, 2, 3, 4, 5, 3, 2, 1, 4, 5]

# Crear un conjunto vac&#237;o
mi_set = set()

# Usar un bucle para calcular los cuadrados de los n&#250;meros mayores a 2
for x in numeros:
    if x &gt; 2:
        mi_set.add(x**2)  # Agregar el cuadrado al conjunto

print(mi_set)  # Salida: {9, 16, 25}</code></pre><p>Ahora vamos a hacer lo mismo usando un conjunto por comprensi&#243;n:</p><pre><code><code># Lista con n&#250;meros repetidos
numeros = [1, 2, 3, 4, 5, 3, 2, 1, 4, 5]

mi_set_por_comprension = {x**2 for x in numeros if x &gt; 2}

print(mi_set_por_comprension) # Salida: {9, 16, 25}</code></code></pre><h3>Generadores por comprensi&#243;n</h3><p>Los <strong>generadores por comprensi&#243;n</strong> en Python utilizan par&#233;ntesis <strong>() </strong>y son una forma compacta de crear un generador. Los generadores son un tipo especial de iterable que produce elementos uno a uno, en lugar de materializar toda la colecci&#243;n en memoria de inmediato. Veamos un ejemplo:</p><pre><code><code># Generador para los cuadrados de los n&#250;meros del 1 al 5
generador = (x**2 for x in range(1, 6))

# Los datos se producen de uno en uno y no se almacenan en memoria como ocurre con las listas.

for valor in generador:
    print(valor)

# Salida: 1
# Salida: 4
# Salida: 9
# Salida: 16
# Salida: 25</code></code></pre><h3>&#128221; Conclusiones</h3><p>Para finalizar te dejo una tabla repasando la sintaxis de cada tipo de comprensi&#243;n:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-F1w!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78e3741b-7263-4387-a2a5-5446fb4be994_729x177.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-F1w!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78e3741b-7263-4387-a2a5-5446fb4be994_729x177.png 424w, https://substackcdn.com/image/fetch/$s_!-F1w!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78e3741b-7263-4387-a2a5-5446fb4be994_729x177.png 848w, https://substackcdn.com/image/fetch/$s_!-F1w!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78e3741b-7263-4387-a2a5-5446fb4be994_729x177.png 1272w, https://substackcdn.com/image/fetch/$s_!-F1w!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78e3741b-7263-4387-a2a5-5446fb4be994_729x177.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-F1w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78e3741b-7263-4387-a2a5-5446fb4be994_729x177.png" width="729" height="177" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/78e3741b-7263-4387-a2a5-5446fb4be994_729x177.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:177,&quot;width&quot;:729,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:30870,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-F1w!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78e3741b-7263-4387-a2a5-5446fb4be994_729x177.png 424w, https://substackcdn.com/image/fetch/$s_!-F1w!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78e3741b-7263-4387-a2a5-5446fb4be994_729x177.png 848w, https://substackcdn.com/image/fetch/$s_!-F1w!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78e3741b-7263-4387-a2a5-5446fb4be994_729x177.png 1272w, https://substackcdn.com/image/fetch/$s_!-F1w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78e3741b-7263-4387-a2a5-5446fb4be994_729x177.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Resumen de tipos de comprensiones</figcaption></figure></div><p>Las comprensiones pueden ser &#250;tiles para escribir c&#243;digo m&#225;s &#8220;pyth&#243;nico&#8221;, es decir, claro, conciso y mantenible aprovechando las funcionalidad del lenguaje y hasta podr&#237;a, <a href="https://wiki.python.org/moin/PythonSpeed/PerformanceTips#Loops">en ciertos casos</a>, ser computacionalmente m&#225;s eficiente. Ya sea que decidas usarlas en tu c&#243;digo o tengas que leer el c&#243;digo de otra persona es muy probable que te cruces con ellas, por lo cual espero que te sirva esta informaci&#243;n.</p><h3>&#191;Te interesa seguir aprendiendo m&#225;s sobre Python?</h3><p>Si este contenido te result&#243; &#250;til y te interesa leer contenido sobre programaci&#243;n principalmente en Python, ciencia de datos e inteligencia artificial? Seguime en mis redes:</p><p>&#128025; <strong>GitHub</strong>: <a href="https://github.com/GEJ1">https://github.com/GEJ1</a></p><p>&#128216; <strong>LinkedIn:</strong> <a href="https://www.linkedin.com/in/gustavo-juantorena/">Gustavo Juantorena</a></p><p>&#128249; <strong>YouTube:</strong> <a href="https://www.youtube.com/@gustavojuantorena">Gustavo Juantorena - Programaci&#243;n y Ciencia de Datos</a></p><p>Si te gust&#243; el post, &#161;Compartilo para que m&#225;s personas puedan aprender!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Suscr&#237;bete ahora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://gustavojuantorena.substack.com/subscribe?"><span>Suscr&#237;bete ahora</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/p/listas-y-otros-tipos-por-comprension?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Compartir&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://gustavojuantorena.substack.com/p/listas-y-otros-tipos-por-comprension?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Compartir</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/p/listas-y-otros-tipos-por-comprension/comments&quot;,&quot;text&quot;:&quot;Deja un comentario&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://gustavojuantorena.substack.com/p/listas-y-otros-tipos-por-comprension/comments"><span>Deja un comentario</span></a></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Suscribirse&quot;,&quot;language&quot;:&quot;es&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">&#161;Gracias por leer El Substack de Gustavo! Suscr&#237;bete gratis para recibir nuevos posts y apoyar mi trabajo.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Escribe tu correo electr&#243;nico..." tabindex="-1"><input type="submit" class="button primary" value="Suscribirse"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Los ✨métodos mágicos✨ de Python (que de mágicos no tienen nada 😅)]]></title><description><![CDATA[&#191;De d&#243;nde viene eso de __len__, __getitem__, __add__?]]></description><link>https://gustavojuantorena.substack.com/p/los-metodos-magicos-de-python-que</link><guid isPermaLink="false">https://gustavojuantorena.substack.com/p/los-metodos-magicos-de-python-que</guid><dc:creator><![CDATA[Gustavo Juantorena]]></dc:creator><pubDate>Sat, 14 Sep 2024 22:00:23 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/76892463-f728-47c7-ac73-6fa8701dc2dd_1543x1536.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En el mundo de Python, los m&#233;todos m&#225;gicos o "dunder" (abreviaci&#243;n de "double underscore") son los pilares de la funcionalidad avanzada en las clases. A pesar de su nombre, no hay magia; son simplemente los m&#233;todos que el int&#233;rprete de Python invoca autom&#225;ticamente cuando realizamos operaciones comunes, como sumar dos objetos, iterar sobre ellos, o incluso comprobar si un elemento est&#225; presente en una colecci&#243;n. Son clave en lo que se conoce como el <strong>Python Data Model<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></strong>.</p><h2>&#191;Qu&#233; hace especiales a los m&#233;todos m&#225;gicos?</h2><p>Los m&#233;todos m&#225;gicos nos permiten definir c&#243;mo los objetos creados con nuestras clases deben comportarse ante operaciones y funciones comunes. Aunque rara vez invocamos estos m&#233;todos directamente, Python lo hace por nosotros. Por ejemplo:</p><ul><li><p>Cuando usamos <strong>len(objeto)</strong>, en realidad se est&#225; invocando <strong>objeto.__len__</strong>().</p></li><li><p>Si sumamos dos objetos, como <strong>a + b</strong>, Python realmente llama a <strong>a.__add__(b) (Nota: </strong>Acordate de este que al final lo vamos a retomar &#128521;<strong>)</strong>.</p></li></ul><p>Esto no solo hace que nuestros objetos sean m&#225;s naturales de usar, sino que tambi&#233;n nos permite crear comportamientos personalizados para operaciones espec&#237;ficas.</p><h3>Ejemplos cotidianos: el poder de <strong>len</strong> y <strong>getitem</strong></h3><p>Los m&#233;todos m&#225;gicos como <strong>__len__</strong> y <strong>__getitem__</strong> son dos de los m&#225;s conocidos, ya que permiten a nuestras clases comportarse como secuencias.</p><p><strong>1</strong>. El m&#233;todo <strong>__len__</strong>: Este m&#233;todo es invocado por la funci&#243;n <strong>len()</strong>. Permite que nuestra clase pueda devolver su tama&#241;o cuando usemos <strong>len(objeto)</strong></p><p>2. El m&#233;todo <strong>__getitem__</strong>: Este m&#233;todo permite que nuestra clase sea "indexable". Al implementarlo, podemos acceder a sus elementos con la sintaxis de corchetes, como si fuera una lista o una tupla.</p><p>Veamos c&#243;mo estos m&#233;todos pueden aplicarse en un ejemplo sencillo con una clase que representa un grupo de carpinchos:</p><pre><code><code>class CarpinchoGrupo:
    def __init__(self, carpinchos):
        self._carpinchos = carpinchos

    def __len__(self):
        contador = 0
        for carpincho in self._carpinchos:
            contador += 1
        return contador

    def __getitem__(self, index):
        return self._carpinchos[index]

# Crear un grupo de carpinchos
grupo = CarpinchoGrupo(['Capy1', 'Capy2', 'Capy3'])

print(len(grupo))  # 3
print(grupo[0])    # 'Capy1'</code></code></pre><p>En este ejemplo:</p><ul><li><p><strong>__len__</strong>: Permite que la funci&#243;n <strong>len()</strong> funcione con la instancia de CarpinchoGrupo, devolviendo el n&#250;mero de carpinchos en el grupo. Es importante notar que la maner m&#225;s eficiente de implementar este m&#233;todo hubiera sido la siguiente:</p><pre><code>class CarpinchoGrupo:
    def __init__(self, carpinchos):
        self._carpinchos = carpinchos

    def __len__(self):
        return len(self._carpinchos)</code></pre><p>Sin embargo me parece importante mostrar que uno podr&#237;a implementar el m&#233;todo de la manera que considere m&#225;s conveniente.</p></li><li><p><strong>__getitem__</strong>: Permite que la clase sea indexada, como si fuera una lista. As&#237;, podemos acceder a los carpinchos individuales con <strong>grupo[0]</strong>.</p></li></ul><h3>Expandiendo el uso de m&#233;todos m&#225;gicos</h3><p>Python ofrece una amplia variedad de m&#233;todos m&#225;gicos que pueden dotar a nuestras clases de comportamientos m&#225;s complejos<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>. Algunos ejemplos adicionales son:</p><ul><li><p><strong>__iter__</strong>: Para hacer que nuestros objetos sean iterables.</p></li><li><p><strong>__contains__</strong>: Nos permite usar el operador in para verificar si un elemento est&#225; dentro del objeto.</p></li><li><p><strong>__call__</strong>: Permite que una instancia de una clase se comporte como una funci&#243;n.</p></li></ul><p>Si bien su implementaci&#243;n no siempre es necesaria, entender c&#243;mo funcionan y c&#243;mo utilizarlos puede elevar el nivel de nuestras clases, permitiendo un dise&#241;o m&#225;s intuitivo y funcional.</p><h2>&#191;Por qu&#233; son importantes?</h2><p>Los m&#233;todos m&#225;gicos hacen que nuestras clases se sientan "naturales" dentro del ecosistema de Python. En lugar de crear clases que requieren m&#233;todos especializados para acceder o modificar datos, podemos hacer que se comporten como tipos nativos del lenguaje, simplificando tanto su uso como su comprensi&#243;n.</p><h2>&#191;Y qu&#233; me ibas a decir sobre a + b?</h2><p>Para reforzar la idea de que cada implementaci&#243;n del m&#233;todo dunder podr&#237;a tener un comportamiento diferente, esto pasa en Python algunas veces en funci&#243;n del tipo de dato que utilicemos. En el caso del operador &#8220;<strong>+&#8221;, </strong>si lo que tenemos a derecha e izquierda son n&#250;meros los va a sumar (2 + 3  devolver&#225; 5), sin embargo si lo que tenemos son listas los va a concatenar ( [2] + [3] devolver&#225; [2, 3]). Veamos un ejemplo con carpinchos que siempre hacen que se entiendan mejor las cosas:</p><pre><code>class CarpinchoGrupo:
    def __init__(self, carpinchos):
        self._carpinchos = carpinchos

    def __add__(self, otro_grupo):
        # Combina los carpinchos de ambos grupos en una nueva lista
        return CarpinchoGrupo(self._carpinchos + otro_grupo._carpinchos)

    def __repr__(self):
        return f"CarpinchoGrupo({self._carpinchos})"

# Crear dos grupos de carpinchos
grupo1 = CarpinchoGrupo(['Capy1', 'Capy2'])
grupo2 = CarpinchoGrupo(['Capy3', 'Capy4'])

# Concatenar los dos grupos usando el operador "+"
grupo_combinado = grupo1 + grupo2

# Mostrar el grupo combinado
print(grupo_combinado) # CarpinchoGrupo(['Capy1', 'Capy2', 'Capy3', 'Capy4'])</code></pre><p>En este caso el comportamiento del operador &#8220;<strong>+&#8221;</strong> para un objeto <strong>CarpinchoGrupo </strong>es similar al que tiene Python con las listas, pero distinto al que tiene con los n&#250;meros.</p><h2>Conclusi&#243;n</h2><p>Los m&#233;todos m&#225;gicos son una poderosa herramienta que nos proporciona Python para definir comportamientos personalizados en nuestras clases. Lejos de ser complicados, son simplemente m&#233;todos que Python llama autom&#225;ticamente en segundo plano para realizar tareas cotidianas, como obtener la longitud de un objeto o iterar sobre &#233;l. La idea de este breve poste es que no te asustes si te encontras con esas palabras con muchos guiones bajos, sino que te familiriaces con esta poderosa herramienta que te va a ayudar a escribir c&#243;digo m&#225;s limpio.</p><h3>&#191;Te interesa seguir aprendiendo m&#225;s sobre Python?</h3><p>Si este contenido te result&#243; &#250;til y te interesa leer contenido sobre programaci&#243;n principalmente en Python, ciencia de datos e inteligencia artificial? Seguime en en mis redes:</p><p>&#128025; <strong>Github</strong>: <a href="https://github.com/GEJ1">https://github.com/GEJ1</a></p><p>&#128216; <strong>LinkedIn:</strong> <a href="https://www.linkedin.com/in/gustavo-juantorena/">Gustavo Juantorena</a></p><p>&#128249; <strong>YouTube:</strong> <a href="https://www.youtube.com/@gustavojuantorena">Gustavo Juantorena - Programaci&#243;n y Ciencia de Datos</a></p><p>Si te gust&#243; el post, &#161;Compartilo para que m&#225;s personas puedan aprender! </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/p/los-metodos-magicos-de-python-que?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Compartir&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://gustavojuantorena.substack.com/p/los-metodos-magicos-de-python-que?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Compartir</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/p/los-metodos-magicos-de-python-que/comments&quot;,&quot;text&quot;:&quot;Deja un comentario&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://gustavojuantorena.substack.com/p/los-metodos-magicos-de-python-que/comments"><span>Deja un comentario</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share&quot;,&quot;text&quot;:&quot;Compartir El Substack de Gustavo&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://gustavojuantorena.substack.com/?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Compartir El Substack de Gustavo</span></a></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>https://docs.python.org/es/3/reference/datamodel.html</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>https://docs.python.org/es/3/reference/datamodel.html#special-method-names</p></div></div>]]></content:encoded></item><item><title><![CDATA[Próximamente]]></title><description><![CDATA[Este es el Datos y Cerebros.]]></description><link>https://gustavojuantorena.substack.com/p/coming-soon</link><guid isPermaLink="false">https://gustavojuantorena.substack.com/p/coming-soon</guid><dc:creator><![CDATA[Gustavo Juantorena]]></dc:creator><pubDate>Sun, 14 Jul 2024 20:32:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!c_gi!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F525c3c88-e1e9-417d-9943-3e8525178564_360x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Este es el Datos y Cerebros.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://gustavojuantorena.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Suscr&#237;bete ahora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://gustavojuantorena.substack.com/subscribe?"><span>Suscr&#237;bete ahora</span></a></p>]]></content:encoded></item></channel></rss>