<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ignacio Reyna</title>
    <description>The latest articles on DEV Community by Ignacio Reyna (@ignacioreyna).</description>
    <link>https://dev.to/ignacioreyna</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F384954%2F5f392a22-5fe2-4e24-b225-93d14d6f594f.png</url>
      <title>DEV Community: Ignacio Reyna</title>
      <link>https://dev.to/ignacioreyna</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ignacioreyna"/>
    <language>en</language>
    <item>
      <title>WhatsApp analyzer - WhatStat</title>
      <dc:creator>Ignacio Reyna</dc:creator>
      <pubDate>Mon, 08 Feb 2021 14:24:33 +0000</pubDate>
      <link>https://dev.to/ignacioreyna/whatsapp-analyzer-whatstat-oj7</link>
      <guid>https://dev.to/ignacioreyna/whatsapp-analyzer-whatstat-oj7</guid>
      <description>&lt;h1&gt;
  
  
  Whatsapp analyzer
&lt;/h1&gt;

&lt;p&gt;Pareciera que la crisis del coronavirus esta más cerca de su fin que de su comienzo. Cierto es que transcurrió casi un año desde el primer caso en nuestro país. Durante la cuarentena más estricta, muchas personas se aburrieron. Algunas, aprovecharon para buscar cosas para hacer. Yo era una de las personas aburridas y allá por Junio y me surgieron algunas dudas de cómo había sido mi interacción con la gente mientras estuve guardado. Quién mandó más mensajes? Quién inició más conversaciones? En qué momento del día estoy más activo? Podía hacerlo, ya que la gran mayoría de mis interacciones en ese período, además de las llamadas, fue por WhatsApp. Y sabía que ofrece la posibilidad de exportar los chats en formato TXT, porque ya lo había hecho hacía algunos años. Además, yo ya había usado &lt;code&gt;pandas&lt;/code&gt; y &lt;code&gt;matplotlib&lt;/code&gt;, por lo que arranqué por ahí. Después de hacer todo el análisis en &lt;code&gt;matplotlib&lt;/code&gt; conocí &lt;code&gt;plotly&lt;/code&gt;, que a diferencia de &lt;code&gt;matplotlib&lt;/code&gt; es más interactivo. Apenas unos días después conocí &lt;strong&gt;Dash&lt;/strong&gt;, un framework que sirve realizar reportes dinámicos en forma de web apps. &lt;strong&gt;Dash&lt;/strong&gt; está construido con Plotly.js, React y Flask, pero se programa en Python. Ofrece la posiblidad de publicar gráficos con diferentes rotadores y filtros. Empecé a leer su documentación todos los días después de trabajar. Una vez que más o menos entendí cómo funcionaba &lt;strong&gt;Dash&lt;/strong&gt;, comencé a tratar de entender cómo leer los chats.&lt;/p&gt;

&lt;p&gt;Para empezar, exporté un chat, con el objetivo de saber cómo era para poder parsearlo. Lo primero que vi fue que tenía la siguiente estructura, separado por saltos de línea para delimitar cada mensaje. Vamos a ver únicamente 4 mensajes, para facilitar la lectura.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;11/30/20, 15:45 - Lucas Monzón created group "Guardia modo "&lt;/p&gt;

&lt;p&gt;11/30/20, 17:17 - Lucas Monzón changed the subject from "Guardia modo " to "Fiesta MODO🔥"&lt;/p&gt;

&lt;p&gt;11/30/20, 17:23 - Nano Vázquez: He hecho mi trabajo&lt;/p&gt;

&lt;p&gt;11/30/20, 20:59 - Nano Vázquez: Estuvo bien el cambio de nombre&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Al principio viene la fecha, luego una coma, luego la hora y después quién envió el mensaje, con un guión antes. Después de todo esto, vienen dos puntos para dar lugar al contenido del mensaje. Lo primero que hice fue sacarle esa coma que no sumaba nada. Decidí hacerlo con una regex. Una regex o expresión regular es una sucesión de caracteres que sirve para formar un patrón de búsqueda. Es un tema que da para largo, e inclusive alguien podría dar una lightning o hasta una charla del tema!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(?&amp;lt;=\/[0-9]{2}),
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NjtROx8y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.postimg.cc/8cfhmQCx/image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NjtROx8y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.postimg.cc/8cfhmQCx/image.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta regex va a buscar comas que vengan después de una barra seguida de dos números.&lt;/p&gt;

&lt;p&gt;Después de hacer esto, lo siguiente que hice fue obtener la fecha y hora y de los mensajes, también con una regex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;^\d{2}\/\d{2}\/\d{2} \d{2}:\d{2}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cn3pMpSp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.postimg.cc/Hn78qwXN/image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cn3pMpSp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.postimg.cc/Hn78qwXN/image.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta regex va a buscar números en el formato &lt;code&gt;NN/NN/NN NN:NN&lt;/code&gt;. Si bien esta regex parece funcionar, cuando empecé a contarle a distintas personas que había hecho este análisis (originalmente con &lt;code&gt;matplotlib&lt;/code&gt;, es decir que no era tan fácil de compartir a alguien que no supiera código), algunas me pidieron los gráficos, por lo que me enviaron sus historiales para que les armara los gráficos. Cuando quise correrlo con los nuevos archivos, pasó algo que no había considerado: WhatsApp utiliza la config de cada celular para realizar los exports: la fecha estaba en otro formato, no venía la coma, en vez de barras separadoras había guiones y además de estar en posiciones diferentes, el año tenía cuatro dígitos, por lo que la regex original no servía más. La tuve que modificar por esta otra:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;^\d{1,4}[\/-]\d{1,2}[\/-]\d{1,4} \d{1,2}:\d{1,2}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si bien en la imagen parecieran hacer lo mismo, esta cubrirá más casos. Ahora lo que buscamos son líneas que comiencen con uno a cuatro números, ya que algunos celulares al exportar no incluyen el &lt;em&gt;trailing zero&lt;/em&gt; de los meses, seguido de una barra o un guión, etc.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ye99J0gl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.postimg.cc/DyHB46xS/image.png" alt=""&gt;
&lt;/h1&gt;

&lt;p&gt;Después de esta parte del parseo, ahora podemos atacar directamente el guión que divide horario de quién envió el mensaje. En python, y seguramente en cualquier lenguaje, podemos hacer esto con un &lt;code&gt;split&lt;/code&gt;, teniendo en cuenta que haga una única división por línea, en el caso del primer guión, porque no queremos generar más elementos en caso de que hubiera un guión en el mensaje . Entonces, hasta ahora, tenemos una tabla con esta pinta:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;date&lt;/th&gt;
&lt;th&gt;msg&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;11/30/20 15:45&lt;/td&gt;
&lt;td&gt;Lucas Monzón created group "Guardia modo "&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11/30/20 17:17&lt;/td&gt;
&lt;td&gt;Lucas Monzón changed the subject from "Guardia modo " to "Fiesta MODO🔥"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11/30/20 17:23&lt;/td&gt;
&lt;td&gt;Nano Vázquez: He hecho mi trabajo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11/30/20 20:59&lt;/td&gt;
&lt;td&gt;Nano Vázquez: Estuvo bien el cambio de nombre&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;De la misma forma que antes, vamos a generar la columna que nos diga el nombre de la persona que envió el mensaje. Nuevamente vamos a tener en cuenta que sean los primeros dos puntos de la línea ya que no queremos tener en cuenta los que se hayan mandado en el mensaje. Pero qué pasa con los primeros dos mensajes, que no tienen un autor, ya que son mensajes generados por WhatsApp? Yo decidí ignorarlos, así que tendríamos una tabla así:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;date&lt;/th&gt;
&lt;th&gt;msg&lt;/th&gt;
&lt;th&gt;author&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;11/30/20 17:23&lt;/td&gt;
&lt;td&gt;He hecho mi trabajo&lt;/td&gt;
&lt;td&gt;Nano Vázquez&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11/30/20 20:59&lt;/td&gt;
&lt;td&gt;Estuvo bien el cambio de nombre&lt;/td&gt;
&lt;td&gt;Nano Vázquez&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Con esto podría decirse que la parte del parseo ya está hecha, ahora queda la parte del análisis.&lt;/p&gt;




&lt;p&gt;Algo que puede resultar muy útil para hacer obtener algún tipo de insight es descomponer la fecha en año, mes, día, etc.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;date&lt;/th&gt;
&lt;th&gt;msg&lt;/th&gt;
&lt;th&gt;author&lt;/th&gt;
&lt;th&gt;year&lt;/th&gt;
&lt;th&gt;month&lt;/th&gt;
&lt;th&gt;day&lt;/th&gt;
&lt;th&gt;hour&lt;/th&gt;
&lt;th&gt;weekofyear&lt;/th&gt;
&lt;th&gt;quarter&lt;/th&gt;
&lt;th&gt;dayofweek&lt;/th&gt;
&lt;th&gt;year-week&lt;/th&gt;
&lt;th&gt;year-month&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2020-11-30 17:23:00&lt;/td&gt;
&lt;td&gt;He hecho mi trabajo&lt;/td&gt;
&lt;td&gt;Nano Vázquez&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;20-49&lt;/td&gt;
&lt;td&gt;20-11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-11-30 20:59:00&lt;/td&gt;
&lt;td&gt;Estuvo bien el cambio de nombre&lt;/td&gt;
&lt;td&gt;Nano Vázquez&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;20-49&lt;/td&gt;
&lt;td&gt;20-11&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Esta tabla ya pareciera ser una buena base para hacer un análisis. Podemos empezar a contar cuantas apariciones tiene &lt;code&gt;Nano Vázquez&lt;/code&gt; y todas las personas que aparezcan en la columna &lt;code&gt;author&lt;/code&gt;, lo que representaría cuantos mensajes envió cada una. De esta misma forma podemos contar cuántas veces aparece &lt;code&gt;2020&lt;/code&gt; o &lt;code&gt;2021&lt;/code&gt; en la columna &lt;code&gt;year&lt;/code&gt;, para saber cuántos mensajes se enviaron en esos años.&lt;/p&gt;

&lt;p&gt;Para poder hacer un análisis un poco más complejo vamos a necesitar presentar algunas definiciones; por ejemplo, si yo quiero saber quién inicia conversaciones, tengo que definir qué es iniciar una conversación. A mi se me ocurrió definir, por mis experiencias previas, que una nueva conversación está comenzando si llega un nuevo mensaje después de al menos 6 horas de inactividad, aunque esta definición es completamente debatible. Otro analisis interesante puede ser saber si alguien envía pocos mensajes porque en cada mensaje envía mucho, o simplemente es porque participa poco. Esto lo vamos a poder saber contando cuántas palabras contiene cada mensaje.&lt;/p&gt;

&lt;p&gt;Un ejemplo sería ver los mensajes distribuidos por hora del día:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sbLc_yGi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.postimg.cc/L66m2HTt/image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sbLc_yGi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.postimg.cc/L66m2HTt/image.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O también, verlo por año, por persona:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ytts2E27--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.postimg.cc/W1QP7h46/image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ytts2E27--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.postimg.cc/W1QP7h46/image.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Después de analizar mis propias conversaciones con &lt;code&gt;pandas&lt;/code&gt;, cuando quise pasar a Dash, lo que tenía en la cabeza era generar mostrar un &lt;em&gt;upload component&lt;/em&gt; en el que una persona pudiera cargar sus propias conversaciones, y todo el mundo pudiera hacer obtener estos insights sin necesitar tener conocimientos de programación. Volviendo al tema de las fechas y los formatos, me surgió un nuevo problema: para poder parsearlas, tenía que saber en qué formato estaban; sin el correcto, no iba a poder hacerlo. Se me ocurrió agarrar los primeros 10 mensajes, obtener su fecha, y mostrárselos a la persona que quería utilizar la página y que la misma ingresara cuál era el formato correcto entre un listado de formatos, con la siguiente pinta:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;date&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2020-11-30 17:23:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-11-30 17:23:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-11-30 17:23:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-11-30 17:25:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-11-30 18:34:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-11-30 20:55:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-11-30 20:59:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-11-30 20:59:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-11-30 21:00:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-11-30 22:15:00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;En principio esta idea no parecía mala, así que después de implementarla procedí a las pruebas de usabilidad. &lt;br&gt;
Primero, padre: pudo hacerlo sin problemas. &lt;em&gt;Disclamer&lt;/em&gt;: es developer.&lt;br&gt;
Luego, madre: ni siquiera entendió la pregunta. &lt;br&gt;
Con las pruebas concluidas, el resultado fue un fallo rotundo. Lo siguiente que se me ocurrió fue hacer una inferencia del formato de las fechas, a partir de las mismas. Después de buscar durante casi un día sin éxito y justo antes de ponerme a hacer un modelo que pudiera hacer eso, finalmente encontré un repo en Github con una última actualización bastante lejana, pero que hacía lo que yo necesitaba. Lo probé y efectivamente me ahorraba la fricción de que la o el usuario tuviera que introducir el formato, brindando una experiencia mucho más fluída.&lt;/p&gt;

&lt;p&gt;Superado el primer escollo, quise publicar la página, por lo que compré un dominio y un amigo me recomendó abrirme una cuenta en Digital Ocean, por un tema de costos.&lt;/p&gt;

&lt;p&gt;Después de publicar la página, me topé con un nuevo problema. Originalmente yo había hecho esta página tal como me hubiera gustado encontrarla si fuese un usuario, haciendo foco en la privacidad. A mi, como usuario, no me gustaría subir mis conversaciones a ningún lado y de la pequeña investigación de mercado que había hecho, me di cuenta que cuando yo subía una conversación si hacía un refresh esta quedaba persistida, lo cual no me gustaba nada. Entonces me incliné por utilizar el &lt;code&gt;sessionStorage&lt;/code&gt; del explorador. Cuando lo corría localmente no había ningún problema, pero cuando corría en el server, se generaban demoras eternas al tener que enviar todo el historial en cada request. Este problema no supe cómo solucionarlo, así que tomé una decisión un poco más laxa en cuanto a privacidad: decidí generar un file en el server con la conversación ya convertida en tabla. Dash, al estar hecho en React, permite agregarle componentes, creándolos en React. Como me había quedado la espina de la privacidad, me cree un componente que escuchara el evento de &lt;em&gt;unload&lt;/em&gt;, para poder borrar el archivo generado ni bien la persona cerrara la página. Aun así, y muy a mi pesar, este listener funcionaba a veces sí y a veces no. Finalmente, tuve que resignar lo que quería hacer, y a pesar de que le deje el listener para que funcionara cuando fuese posible, le agregué un script croneado, de forma tal que borrara todos los archivos que tuvieran más de 2 horas de antigüedad.&lt;/p&gt;

&lt;p&gt;Finalmente, logré publicarlo con un nivel de servicio con el que estuve relativamente conforme. Pueden analizar sus conversaciones desde &lt;a href="https://whatstat.herokuapp.com/"&gt;la página&lt;/a&gt;. Igualmente, el &lt;a href="https://www.github.com/ignacioreyna/whatsapp-dash"&gt;repo&lt;/a&gt; quedó publicado para que cualquiera pueda analizarlas de forma local! Les adelanto algo: la UI no es lo mío.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Y ahora dale, sin miedo.</title>
      <dc:creator>Ignacio Reyna</dc:creator>
      <pubDate>Tue, 12 May 2020 19:43:02 +0000</pubDate>
      <link>https://dev.to/ignacioreyna/y-ahora-dale-sin-miedo-fn2</link>
      <guid>https://dev.to/ignacioreyna/y-ahora-dale-sin-miedo-fn2</guid>
      <description>&lt;h4&gt;
  
  
  A lo largo de este texto voy a intentar borrar al menos algunos preconceptos sobre la programación, como que es complicadísimo o que hay que ser muy inteligente.
&lt;/h4&gt;




&lt;p&gt;&lt;strong&gt;Para comenzar, ¿qué es un lenguaje de programación?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Así como las personas nos entendemos mediante un idioma, las computadoras entienden un único lenguaje: el de máquinas. Un lenguaje de programación es una manera de interactuar con un procesador (también conocido como microprocesador, es el corazón y cerebro de una computadora), de manera tal de poder proporcionarle una serie de instrucciones que debe llevar a cabo. La computadora (es decir, el procesador) &lt;strong&gt;SIEMPRE&lt;/strong&gt; va a hacer lo que le indiquemos que haga, ni más, ni menos.&lt;/p&gt;

&lt;p&gt;Está bien, todo muy lindo, pero ¿de qué me sirve esto? Bueno, la realidad es que hay mucho misterio e ideas generalizadas sobre la programación (si bien es cierto que se está dando un progresivo proceso de desmitificación). En sus orígenes, comunicarse con una computadora realmente era algo muy complicado y que por su naturaleza hubiera producido rechazo en muchas personas. Lo primero primero, era esto: &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nCz7Jvz6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://http2.mlstatic.com/tarjeta-perforada-ibm-D_NQ_NP_482225-MLV25394795285_022017-F.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nCz7Jvz6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://http2.mlstatic.com/tarjeta-perforada-ibm-D_NQ_NP_482225-MLV25394795285_022017-F.jpg" alt="alt text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Así como lo ven, esto era una &lt;em&gt;"cartulina"&lt;/em&gt; a la que una persona, con una maquinita, iba haciéndole las perforaciones que vemos en la imagen. Que hubiera agujeritos, implicaba que había zonas, donde &lt;strong&gt;no&lt;/strong&gt; había agujeritos. Entonces, &lt;em&gt;agujereado&lt;/em&gt; y &lt;em&gt;no agujereado&lt;/em&gt;  eran las únicas opciones y significaban dos cosas literalmente opuestas. Si bien en nuestros días las computadoras disminuyeron muchísimo de tamaño y tuvieron un aumento fenomenal en su capacidad de procesamiento, mantienen la misma idea, lo que seguramente alguna vez escucharon nombrar como "&lt;em&gt;unos y ceros&lt;/em&gt;".&lt;/p&gt;

&lt;p&gt;Dicho esto, desde que se crearon las primeras computadoras hasta hoy, hubo un montón de personas, muy capaces (y con mucho amor por la materia), que le dedicaron un montón de tiempo para que la programación sea cada vez más accesible para todo el mundo. Ella es &lt;strong&gt;Margaret Hamilton&lt;/strong&gt;, directora del equipo de programadores de la misión Apolo XI, la primera expedición espacial que logró alunizar (el 20 de Julio de 1969). Aquí la podemos ver junto al código que este grupo escribió para semejante proeza. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L7AGeNbg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://elpais.com/tecnologia/imagenes/2017/01/09/actualidad/1483980291_213857_1483980952_noticia_grande.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L7AGeNbg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://elpais.com/tecnologia/imagenes/2017/01/09/actualidad/1483980291_213857_1483980952_noticia_grande.jpg" alt="alt text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Estas personas se fueron encargando de armar "traductores" para que pudiéramos interactuar con las máquinas usando un lenguaje cada vez más parecido al &lt;strong&gt;natural&lt;/strong&gt; (el que hablamos a diario, o por lo menos, el que hablan en Estados Unidos). El código de la misión Apollo XI estaba escrito en un lenguaje que ya se servía de un traductor a &lt;em&gt;unos y ceros&lt;/em&gt;. Estos lenguajes no son todos iguales y tienen una escala para medir su "lejanía" con el lenguaje de máquinas (unos y ceros). Esta escala de los lenguajes va desde el &lt;strong&gt;bajo nivel&lt;/strong&gt; (más cerca del lenguaje de máquinas) al &lt;strong&gt;alto nivel&lt;/strong&gt; (más lejos, y por lo tanto, más parecido al lenguaje natural).&lt;/p&gt;

&lt;p&gt;A medida que fue pasando el tiempo, fueron apareciendo formas de programar cada vez más amigables, hasta llegar a los tiempos que corren, en los que ya es posible programar utilizando únicamente el mouse, arrastrando algunos &lt;em&gt;bloques&lt;/em&gt; de código. En este post voy a ejemplificar lo &lt;em&gt;alto&lt;/em&gt; que han llegado algunos lenguajes con uno que se llama &lt;strong&gt;Python&lt;/strong&gt;. Este fue el lenguaje con el que yo di mis primeros pasos en esto de la programación, y cada día que pasa, lo quiero un poco más.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Python&lt;/strong&gt; es un lenguaje particularmente amigable para quienes quieren empezar, debido a la simpleza de su &lt;em&gt;sintaxis&lt;/em&gt; (cada lenguaje tiene la suya propia, como puede pasar con el español y el inglés). En todo lenguaje de programación, hay algunas palabras claves o reservadas, que nos permiten darle una instrucción al procesador. En cada lenguaje, estas palabras claves son diferentes. También hay elementos en común entre todos los lenguajes, como el concepto de los tipos (no, no me refiero a los varones). El &lt;em&gt;tipado&lt;/em&gt; le permite al lenguaje determinar de qué manera tratar un elemento. De igual manera, nos resultaría imposible realizar las mismas operaciones con una palabra que con un número. Los números los podemos sumar, en cambio, las palabras, no.&lt;/p&gt;

&lt;p&gt;Bien. Pero de vuelta, ¿de qué me sirve esto? Bueno, después de esta larga introducción, vayamos al barro. Quiero mostrarles lo simple que puede ser realizar una tarea, si bien &lt;em&gt;sencilla&lt;/em&gt;, larga y repetitiva. Hay una página, que me gusta &lt;strong&gt;mucho&lt;/strong&gt;, que fue con la que comencé a programar. La misma se llama &lt;a href="https://projecteuler.net"&gt;Project Euler&lt;/a&gt; y tiene muchos problemas matemáticos, que solo podrías resolver &lt;em&gt;programáticamente&lt;/em&gt; (o si tuvieras &lt;strong&gt;muchísimos&lt;/strong&gt; años de vida por delante).&lt;/p&gt;

&lt;p&gt;Bien, veamos el primer desafío que la página nos propone: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;br&gt;
 &lt;code&gt;If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
 &lt;code&gt;Find the sum of all the multiples of 3 or 5 below 1000.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;p&gt;En español:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;br&gt;
 &lt;code&gt;Si listamos todos los números naturales menores a 10 que son múltiplos de 3 o de 5, obtenemos el 3, el 5, el 6 y el 9. La suma de estos múltiplos es 23.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
 &lt;code&gt;Hallar la suma de todos los múltiplos de 3 o de 5 que sean menores que 1000.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quizás hay muchas palabras que no escuchan hace mucho tiempo, pero si lo leen sin &lt;em&gt;asquito&lt;/em&gt;, no parece un pedido complejo, ¿verdad? Nos están pidiendo los números que podamos dividir o por 3 o por 5 y sumarlos todos.&lt;/p&gt;

&lt;p&gt;Como vemos en la consigna, si nos pidieran los menores que 10, sería algo corto y lo podríamos resolver a mano o mentalmente. 3, 5, 6, 9 y listo. La cuestión se &lt;em&gt;complejiza&lt;/em&gt; cuando nos piden los menores a 1.000 (que también podrían ser los menores a 10.000 o a 100.000, y hacerlo a mano sería todavía más engorroso).&lt;/p&gt;

&lt;p&gt;Retomando el concepto del &lt;em&gt;tipado&lt;/em&gt;, en este caso la respuesta va a ser un número, ya que nos están pidiendo una suma.&lt;/p&gt;

&lt;p&gt;Ya que las máquinas tienen un traductor a unos y ceros, vamos a igualar las condiciones teniendo un traductor a lenguaje humano, así que tranqui.&lt;/p&gt;

&lt;p&gt;Hay distintos tipos, números, palabras, o una lista de los tipos que acabamos de ver, es decir una lista de números o una lista de palabras. Acá es donde empieza a tomar importancia nuestra imaginación. Los números menores que 1.000, podrían formar todos parte de una lista o &lt;strong&gt;rango&lt;/strong&gt; de números, ¿no?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# Cada vez que yo diga "numero" me voy a estar refiriendo a 1.
&lt;/span&gt;&lt;span class="n"&gt;palabra&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"palabra"&lt;/span&gt; &lt;span class="c1"&gt;# Cada vez que yo diga "palabra" me voy a estar refiriendo a palabra.
&lt;/span&gt;&lt;span class="n"&gt;menores_de_mil&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Cada vez que yo diga menores_de_mil me voy a estar
#                                 refiriendo a la lista de números, que seria 
#                                 [1, 2, 3, 4, ……………, 998, 999].
#                                 Fíjense que el último número no se incluye.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ya estamos muy cerca de obtener el resultado. Los procesadores hacen muy bien las operaciones matemáticas, así que no tenemos que preocuparnos por eso. Y de lo bien que las hacen, también podemos saber con una sola tecla, si una división entre dos números enteros, me dejaría un resto o no (si no me sobra nada, entonces ese número es divisor). Esta tecla es el &lt;code&gt;%&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Otra cosa que hacen muy bien los procesadores, es comparar si dos cosas son iguales. Vamos a aprovecharnos de esto, con la clave &lt;code&gt;==&lt;/code&gt; (Esto se hace con dos iguales, porque con un solo igual le estaríamos diciendo al procesador que se acuerde de un valor). Veámoslo con un ejemplo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# "Mostrame el resto de la división de 4 por 2". En este caso, yo puedo 
#              dividir 4 por 2 y no me sobra nada, entonces, el 2 es un divisor de 4.
&lt;/span&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# "Mostrame el resto de la división de 5 por 3". En este caso, al dividir 
#               5 por 3 me van a sobrar 2, entonces 3 no es un divisor de 5.
&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Decime, Python, ¿2, es igual a 3?
&lt;/span&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Macanudo, y otra cosa, ¿2 es igual a 2?
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bueno, todo muy lindo pero, ¿de qué me sirve esto?&lt;/p&gt;

&lt;p&gt;¡Esta es la parte interesante! Podemos decirle a nuestro &lt;em&gt;programa&lt;/em&gt; que se comporte de diferentes maneras en caso de que algo sea cierto o no. Entonces, pensemos el proceso que deberíamos llevar a cabo para poder realizar el desafío a mano.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;  Armar una lista con todos los números menores que 1.000.&lt;/li&gt;
&lt;li&gt;  Decidir cuáles de esos números cumplen con la condición que nos plantearon, en este caso, que sean múltiplos de 3 o de 5.&lt;/li&gt;
&lt;li&gt;  Solo vamos a querer sumar los números que cumplan nuestra condición.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para indicarle al procesador que se comporte de una manera en caso de que el número cumpla con la condición y de otra manera si no la cumpliera, existen dos palabras reservadas, &lt;code&gt;if&lt;/code&gt; y &lt;code&gt;else&lt;/code&gt;. (En español, &lt;code&gt;si pasa esto…&lt;/code&gt; y &lt;code&gt;caso contrario…&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;Nos puede resultar un poco &lt;em&gt;ajeno&lt;/em&gt;, pero lo podemos simplificar como una canilla, que puede estar abierta o cerrada. Si abrimos el grifo, saldrá agua, si lo cerramos, no saldrá nada. Esto puede pensarse como un &lt;strong&gt;comportamiento binario&lt;/strong&gt;. (Siempre volvemos a los ceros y unos). Mejor veámoslo con un ejemplo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;# Si es cierto que 2 es igual a 2
&lt;/span&gt;  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Esto es verdadero!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Mostrame la frase "Esto es verdadero!"
&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# Si es mentira que 2 es igual a 2 
&lt;/span&gt;  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Esto es falso!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Mostrame la frase "Esto es falso!"
# &amp;gt;&amp;gt;&amp;gt; Esto es verdadero!
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;# Si es cierto que 2 es igual a 5
&lt;/span&gt;  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Esto es verdadero!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Mostrame la frase "Esto es verdadero!"
&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# Si es mentira que 2 es igual a 5
&lt;/span&gt;  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Esto es falso!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Mostrame la frase "Esto es falso!"
# &amp;gt;&amp;gt;&amp;gt; Esto es falso!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con lo que vimos hasta ahora, podríamos decidir qué comportamiento queremos que realice el procesador si los números son múltiplos de 3 o de 5. Existe una tercera palabra reservada para definir este tipo de comportamientos, &lt;code&gt;elif&lt;/code&gt;. Esta palabra no tiene un significado real en inglés, si no que es como una mezcla entre las otras dos. Sería como un &lt;code&gt;o si no, si es&lt;/code&gt;. Es muy útil cuando queremos definir un comportamiento con más de una posibilidad (que sea múltiplo de 3 ó que sea múltiplo de 5).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resto_de_la_division_por_cinco&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;303&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="c1"&gt;# Cada vez que diga 
#                                          resto_de_la_division_por_cinco me voy a 
#                                          estar refiriendo al resto de esta división.
&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"El resto de la división por cinco es:"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Quiero ver en pantalla la frase 
#                                                "El resto de la división por cinco es:"
&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resto_de_la_division_por_cinco&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Mostrame a lo que me refiero cuando digo 
#                                       resto_de_la_division_por_cinco
&lt;/span&gt;


&lt;span class="n"&gt;resto_de_la_division_por_tres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;303&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="c1"&gt;# Cada vez que diga 
#                                         resto_de_la_division_por_tres me voy a
#                                         estar refiriendo al resto de esta división.
&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"El resto de la división por tres es:"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Quiero ver en pantalla la frase
#                                               "El resto de la división por tres es:"
&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resto_de_la_division_por_tres&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Mostrame a lo que me refiero cuando digo 
#                                      resto_de_la_division_por_tres
&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resto_de_la_division_por_cinco&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;# Si es cierto que 
#                                          resto_de_la_division_por_cinco es 0 
#                                          (o sea, si el 5 es divisor)
&lt;/span&gt;  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Es múltiplo de 5!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Decime "Es múltiplo de 5!"
&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resto_de_la_division_por_tres&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;# En cambio, si es cierto que 
#                                           resto_de_la_division_por_tres es 0 
#                                           (o sea, si el 3 es divisor)
&lt;/span&gt;   &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Es múltiplo de 3!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Decime "Es múltiplo de 3!"
&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# Si todo lo que me dijiste antes es mentira
&lt;/span&gt;  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"No es múltiplo ni de 3 ni de 5 :("&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Decime "No es múltiplo ni de 3 ni de 5 :(" 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡Genial! Ahora solo nos faltaría poder mirar todos los números y decidir si son múltiplos o no. Si tan solo hubiera algo capaz de mirar una lista &lt;strong&gt;muy&lt;/strong&gt; rápido…&lt;br&gt;
&lt;a href="https://i.giphy.com/media/l0G18gptStsYQrcL6/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l0G18gptStsYQrcL6/giphy.gif" alt="alt text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para poder mirar una lista contamos con otra palabra reservada (Sí, otra… Por lo menos tienen nombres fáciles 😜 ). Esta vez se llama &lt;code&gt;for&lt;/code&gt;. Deriva de una frase en inglés, &lt;code&gt;for each&lt;/code&gt;, en español esta frase significa &lt;code&gt;para cada&lt;/code&gt;. Con esta palabrita vamos a poder realizarle las operaciones que querramos a cada número que haya en la lista. Por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;lista_de_prueba&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Cuando diga lista_de_prueba me voy a referir a la 
#                                lista de números [1, 2, 3, 4, 5] 
#                                (el último número del rango no está incluido)
&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lista_de_prueba&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# Para cada número en la lista_de_prueba
&lt;/span&gt;  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"El número es:"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Quiero que me digas "El número es:"
&lt;/span&gt;  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Y me muestres el número
&lt;/span&gt;
&lt;span class="c1"&gt;# &amp;gt;&amp;gt;&amp;gt; El número es:
# &amp;gt;&amp;gt;&amp;gt; 1
# &amp;gt;&amp;gt;&amp;gt; El número es:
# &amp;gt;&amp;gt;&amp;gt; 2
# &amp;gt;&amp;gt;&amp;gt; El número es:
# &amp;gt;&amp;gt;&amp;gt; 3
# &amp;gt;&amp;gt;&amp;gt; El número es:
# &amp;gt;&amp;gt;&amp;gt; 4
# &amp;gt;&amp;gt;&amp;gt; El número es:
# &amp;gt;&amp;gt;&amp;gt; 5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡Wow! ¡Cuánta magia! Ahora ya solo nos queda mezclar todas estas palabras reservadas y obtener el resultado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;menores_de_mil&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Cada vez que yo diga menores_de_mil me voy a estar
#                                 refiriendo a la lista de números que seria 
#                                 [1, 2, 3, 4, ……………, 998, 999]. No incluimos el último.
&lt;/span&gt;
&lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="c1"&gt;# Cada vez que yo diga resultado voy a referirme a este 0
&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;menores_de_mil&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# Para cada numero en la lista menores_de_mil
&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;# Si cuando al número lo divido por 3 no me deja resto 
#                              (o sea que es divisible por 3)
&lt;/span&gt;
    &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="c1"&gt;# Agarrá mi resultado, que originalmente era 0 y 
#                                    sumale el número. Por ejemplo, en el caso del 9, 
#                                    se va a dar cuenta que es divisible por 3 
#                                    y lo va a agregar a la cuenta.
&lt;/span&gt;
  &lt;span class="k"&gt;elif&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;# Si al dividirlo por 3 me dejó resto, entonces fijate 
#                              si cuando al número lo divido por 5 no me deja resto 
#                              (o sea que es divisible por 5).
&lt;/span&gt;
    &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="c1"&gt;# Agarrá mi resultado, que originalmente era 0 y 
#                                    sumale el número. Por ejemplo, en el caso del 10, 
#                                    se va a dar cuenta que es divisible por 5 
#                                    y lo va a agregar a la cuenta.
&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"El resultado es: "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Cuando hayas terminado de fijarte todos 
#                                       los números, mostrame el resultado!
&lt;/span&gt;
&lt;span class="c1"&gt;# &amp;gt;&amp;gt;&amp;gt; El resultado es:  233168
&lt;/span&gt;
&lt;span class="c1"&gt;#=============== Una versión sin las traducciones, para verlo más claro ================#
&lt;/span&gt;
&lt;span class="n"&gt;menores_de_mil&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;menores_de_mil&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt;
      &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;
  &lt;span class="k"&gt;elif&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt;
      &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"El resultado es: "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# &amp;gt;&amp;gt;&amp;gt; El resultado es:  233168
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sin las traducciones queda más corto ¿no?&lt;/p&gt;

&lt;h4&gt;
  
  
  Espero haber aclarado algunas de las ideas que tenían sobre la programación antes de haberse cruzado con este texto. Gracias por haber leído hasta acá. Si todo esto les dio curiosidad y quieren aprender más, internet está repleto de páginas para aprender de forma gratuita muchos lenguajes, incluido Python. ¡Están a un Google de distancia!
&lt;/h4&gt;

</description>
      <category>beginners</category>
    </item>
  </channel>
</rss>
