<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Python Scouts</title><link href="https://pythonscouts.com/" rel="alternate"/><link href="https://pythonscouts.com/feeds/all.atom.xml" rel="self"/><id>https://pythonscouts.com/</id><updated>2026-04-11T12:55:00+02:00</updated><subtitle>Aprende Python en Español.</subtitle><entry><title>Estructuras de datos en Python: Colas (queues)</title><link href="https://pythonscouts.com/python-queue/" rel="alternate"/><published>2026-04-11T12:55:00+02:00</published><updated>2026-04-11T12:55:00+02:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-04-11:/python-queue/</id><summary type="html">&lt;p&gt;Las colas o &lt;em&gt;queues&lt;/em&gt; te permiten organizar los datos según el principio FIFO (primero en entrar, primero en salir). Son esenciales en la gestión de tareas y recursos.&lt;/p&gt;</summary><content type="html">&lt;p&gt;En este artículo, aprenderás cómo implementar una cola en Python, incluyendo sus operaciones y características principales.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/queue-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#que-es-una-cola-o-queue"&gt;¿Qué es una cola o queue?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#operaciones-comunes-en-una-cola"&gt;Operaciones comunes en una cola&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#implementacion-de-una-cola-en-python"&gt;Implementación de una cola en Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplo-de-uso-de-la-cola"&gt;Ejemplo de uso de la cola&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#inicializacion"&gt;Inicialización&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#encolar-y-desencolar-elementos"&gt;Encolar y desencolar elementos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#consultar-el-frente"&gt;Consultar el frente&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#eliminar-un-elemento-especifico"&gt;Eliminar un elemento específico&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#longitud-y-pertenencia"&gt;Longitud y pertenencia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#iteracion"&gt;Iteración&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="que-es-una-cola-o-queue"&gt;¿Qué es una cola o queue?&lt;/h2&gt;
&lt;p&gt;Una &lt;a href="https://es.wikipedia.org/wiki/Cola_(inform%C3%A1tica)"&gt;cola&lt;/a&gt; es una colección de elementos que permite añadir elementos por un extremo y retirarlos por el extremo opuesto.&lt;/p&gt;
&lt;p&gt;Esta estructura de datos es ampliamente utilizada en la gestión de tareas, la programación de procesos, la simulación de eventos y los algoritmos.&lt;/p&gt;
&lt;p&gt;Las características fundamentales de una cola incluyen las siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FIFO&lt;/strong&gt; (&lt;em&gt;First In, First Out&lt;/em&gt;): El primer elemento que entró es el primero que sale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dos extremos&lt;/strong&gt;: Los elementos se añaden por la parte trasera (&lt;em&gt;enqueue&lt;/em&gt;) y se retiran por la parte delantera (&lt;em&gt;dequeue&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tamaño dinámico&lt;/strong&gt;: La cola crece o decrece conforme añades o eliminas elementos.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;En Python, las colas no están disponibles como una estructura de datos integrada. La librería estándar incluye el módulo &lt;a href="https://docs.python.org/3/library/queue.html#module-queue"&gt;&lt;code&gt;queue&lt;/code&gt;&lt;/a&gt; que está orientado sobre todo a la comunicación entre hilos (&lt;strong&gt;threads&lt;/strong&gt;). Para implementar tu propia cola, también puedes usar &lt;code&gt;collections.deque&lt;/code&gt;, que suele ser una opción práctica porque ofrece inserciones y eliminaciones eficientes en ambos extremos.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="operaciones-comunes-en-una-cola"&gt;Operaciones comunes en una cola&lt;/h2&gt;
&lt;p&gt;A continuación, un resumen de las operaciones que soportará tu cola:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Operación&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Descripción&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;queue = Queue()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Construye una cola vacía.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;queue = Queue(iterable)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Construye una cola con elementos de &lt;code&gt;iterable&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;queue.enqueue(item)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Añade &lt;code&gt;item&lt;/code&gt; al final de la cola.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;queue.dequeue()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Extrae y elimina el elemento del frente de la cola.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;queue.front()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Devuelve el elemento del frente sin eliminarlo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;queue.remove(item)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Elimina la primera aparición de &lt;code&gt;item&lt;/code&gt; en la cola.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;queue.is_empty()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Devuelve &lt;a href="/python-true/"&gt;&lt;code&gt;True&lt;/code&gt;&lt;/a&gt; si la cola está vacía, &lt;a href="/python-false/"&gt;&lt;code&gt;False&lt;/code&gt;&lt;/a&gt; en caso contrario.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;len(queue)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Devuelve la cantidad de elementos en la cola.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;item in queue&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Devuelve &lt;code&gt;True&lt;/code&gt; si &lt;code&gt;item&lt;/code&gt; existe en la cola, &lt;code&gt;False&lt;/code&gt; en caso contrario.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;for item in queue: ...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="/ciclos-for-python/"&gt;Itera&lt;/a&gt; sobre los elementos de la cola.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;for item in reversed(queue): ...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Itera sobre los elementos en orden inverso.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="implementacion-de-una-cola-en-python"&gt;Implementación de una cola en Python&lt;/h2&gt;
&lt;p&gt;Para implementar tu propia cola en Python, utilizarás la &lt;a href="/python-class/"&gt;clase&lt;/a&gt; &lt;code&gt;Queue&lt;/code&gt; que encapsula la funcionalidad descrita anteriormente con el soporte de &lt;code&gt;collections.deque&lt;/code&gt; para almacenar los elementos de la cola.&lt;/p&gt;
&lt;p&gt;A continuación, la implementación completa de la clase &lt;code&gt;Queue&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - queue.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;deque&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Implement a Queue (FIFO) abstract data type.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;/&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;deque&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;deque&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Add items to the right end of the queue.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;dequeue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Remove and return an item from the front of the queue.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;popleft&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;dequeue from an empty queue&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;front&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Return the item at the beginning of the queue.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;front from an empty queue&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Remove the first occurrence of item.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.remove(x): x not found&amp;quot;&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Return True if the queue is empty, False otherwise.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&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="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__len__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__contains__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__repr__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;(&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)&amp;quot;&lt;/span&gt;

    &lt;span class="fm"&gt;__str__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="fm"&gt;__repr__&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__iter__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__reversed__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="nb"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El atributo &lt;code&gt;._data&lt;/code&gt; es un objeto &lt;code&gt;deque&lt;/code&gt; que almacena los elementos de la cola. La clase &lt;code&gt;deque&lt;/code&gt; proporciona operaciones de inserción y eliminación en tiempo constante O(1) en ambos extremos, lo que la hace apropiada para implementar colas.&lt;/p&gt;
&lt;p&gt;Los métodos principales te permiten ofrecer las siguientes funcionalidades:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.enqueue()&lt;/code&gt;&lt;/strong&gt;: añade un elemento al final de la cola usando &lt;code&gt;.append()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.dequeue()&lt;/code&gt;&lt;/strong&gt;: devuelve y elimina el elemento del frente de la cola usando &lt;code&gt;.popleft()&lt;/code&gt; y lanza &lt;code&gt;IndexError&lt;/code&gt; si la cola está vacía.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.front()&lt;/code&gt;&lt;/strong&gt;: devuelve el elemento del frente sin eliminarlo y lanza &lt;code&gt;IndexError&lt;/code&gt; si la cola está vacía.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.remove()&lt;/code&gt;&lt;/strong&gt;: elimina la primera aparición de un elemento. Lanza &lt;code&gt;ValueError&lt;/code&gt; si el elemento no existe.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.is_empty()&lt;/code&gt;&lt;/strong&gt;: comprueba si la cola está vacía.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Los métodos especiales te permiten ofrecer las siguientes funcionalidades:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.__len__()&lt;/code&gt;&lt;/strong&gt;: devuelve el número de elementos en la cola.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.__contains__()&lt;/code&gt;&lt;/strong&gt;: comprueba si un elemento está en la cola y devuelve &lt;code&gt;True&lt;/code&gt; o &lt;code&gt;False&lt;/code&gt; según corresponda.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.__iter__()&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;.__reversed__()&lt;/code&gt;&lt;/strong&gt;: permiten iterar sobre los elementos de la cola en orden normal o inverso.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.__repr__()&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;.__str__()&lt;/code&gt;&lt;/strong&gt;: devuelven representaciones de cadena de la cola.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ejemplo-de-uso-de-la-cola"&gt;Ejemplo de uso de la cola&lt;/h2&gt;
&lt;p&gt;En esta sección verás ejemplos prácticos de cómo crear y manipular instancias de tu clase &lt;code&gt;Queue&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="inicializacion"&gt;Inicialización&lt;/h3&gt;
&lt;p&gt;Para crear una &lt;code&gt;Queue&lt;/code&gt;, puedes hacerlo sin argumentos o pasando un iterable como una lista:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;
&lt;span class="go"&gt;Queue([])&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Queue&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;
&lt;span class="go"&gt;Queue([1, 2, 3])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="encolar-y-desencolar-elementos"&gt;Encolar y desencolar elementos&lt;/h3&gt;
&lt;p&gt;Puedes añadir elementos al final de la cola y extraerlos del frente, siguiendo el orden FIFO:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enqueue&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="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;
&lt;span class="go"&gt;Queue([1, 2, 3])&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dequeue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dequeue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;
&lt;span class="go"&gt;Queue([3])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si intentas extraer un elemento de una cola vacía, obtendrás un error:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dequeue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;IndexError&lt;/span&gt;: &lt;span class="n"&gt;dequeue from an empty queue&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="consultar-el-frente"&gt;Consultar el frente&lt;/h3&gt;
&lt;p&gt;El método &lt;code&gt;.front()&lt;/code&gt; te permite ver el elemento del frente sin eliminarlo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Queue&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;front&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;
&lt;span class="go"&gt;Queue([1, 2, 3])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="eliminar-un-elemento-especifico"&gt;Eliminar un elemento específico&lt;/h3&gt;
&lt;p&gt;El método &lt;code&gt;.remove()&lt;/code&gt; elimina la primera aparición de un elemento de la cola y lanza un &lt;code&gt;ValueError&lt;/code&gt; si el elemento no se encuentra:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Queue&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;
&lt;span class="go"&gt;Queue([1, 3])&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;ValueError&lt;/span&gt;: &lt;span class="n"&gt;Queue.remove(x): x not found&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="longitud-y-pertenencia"&gt;Longitud y pertenencia&lt;/h3&gt;
&lt;p&gt;Puedes consultar la longitud de la cola con &lt;code&gt;len()&lt;/code&gt; y verificar si un elemento está contenido en ella con el operador &lt;a href="/python-in/"&gt;&lt;code&gt;in&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="iteracion"&gt;Iteración&lt;/h3&gt;
&lt;p&gt;Los métodos &lt;code&gt;.__iter__()&lt;/code&gt; y &lt;code&gt;.__reversed__()&lt;/code&gt; permiten iterar sobre la cola tanto hacia adelante como hacia atrás:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Queue&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="conclusion"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Has aprendido cómo implementar una cola (&lt;em&gt;queue&lt;/em&gt;) que proporciona operaciones esenciales como añadir y eliminar elementos siguiendo el principio FIFO, consultar el primer elemento, eliminar elementos específicos y verificar si un elemento pertenece a la cola.&lt;/p&gt;
&lt;p&gt;Este conocimiento te sirve de base para entender algoritmos que dependen de colas, como la búsqueda en anchura, la gestión de tareas en sistemas operativos y los &lt;em&gt;buffers&lt;/em&gt; de datos.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/queue-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="data structures"/></entry><entry><title>Estructuras de datos en Python: Pilas (stacks)</title><link href="https://pythonscouts.com/python-stack/" rel="alternate"/><published>2026-04-07T22:20:00+02:00</published><updated>2026-04-07T22:20:00+02:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-04-07:/python-stack/</id><summary type="html">&lt;p&gt;Las pilas o stacks son una estructura de datos fundamental que sigue el principio LIFO (último en entrar, primero en salir). Son esenciales en muchos algoritmos.&lt;/p&gt;</summary><content type="html">&lt;p&gt;En este artículo, aprenderás cómo implementar una pila en Python, incluyendo sus operaciones y características principales.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/stack-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#que-es-una-pila-o-stack"&gt;¿Qué es una pila o stack?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#operaciones-comunes-en-una-pila"&gt;Operaciones comunes en una pila&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#implementacion-de-una-pila-en-python"&gt;Implementación de una pila en Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplo-de-uso-de-la-pila"&gt;Ejemplo de uso de la pila&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#inicializacion"&gt;Inicialización&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#empujar-y-extraer-elementos"&gt;Empujar y extraer elementos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#consultar-la-cima"&gt;Consultar la cima&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#longitud-y-pertenencia"&gt;Longitud y pertenencia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#iteracion"&gt;Iteración&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="que-es-una-pila-o-stack"&gt;¿Qué es una pila o stack?&lt;/h2&gt;
&lt;p&gt;Una &lt;a href="https://es.wikipedia.org/wiki/Pila_(inform%C3%A1tica)"&gt;pila&lt;/a&gt; es una estructura de datos donde el acceso está restringido a un solo extremo de la secuencia. Los elementos se &lt;em&gt;empujan&lt;/em&gt; (&lt;em&gt;push&lt;/em&gt;) hacia la pila para añadirlos y se &lt;em&gt;extraen&lt;/em&gt; (&lt;em&gt;pop&lt;/em&gt;) de la pila para retirarlos. Las pilas son muy utilizadas en algoritmos de informática y resultan especialmente útiles para tareas de análisis sintáctico (&lt;em&gt;parsing&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Las características fundamentales de una pila incluyen las siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LIFO&lt;/strong&gt; (&lt;em&gt;Last In, First Out&lt;/em&gt;): El último elemento que entró es el primero que sale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Acceso restringido&lt;/strong&gt;: Solo puedes acceder al elemento de la cima (&lt;em&gt;top&lt;/em&gt;) de la pila.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tamaño dinámico&lt;/strong&gt;: La pila crece o decrece conforme añades o eliminas elementos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En Python, las pilas no están integradas como una estructura de datos primitiva, pero puedes implementarla fácilmente usando el tipo &lt;code&gt;collections.deque&lt;/code&gt;, que proporciona operaciones eficientes de inserción y eliminación en ambos extremos.&lt;/p&gt;
&lt;h2 id="operaciones-comunes-en-una-pila"&gt;Operaciones comunes en una pila&lt;/h2&gt;
&lt;p&gt;En la tabla siguiente tienes un resumen de las operaciones que soportará tu pila:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Operación&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Descripción&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stack = Stack()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Construye una pila vacía.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stack = Stack(iterable)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Construye una pila con elementos de &lt;code&gt;iterable&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stack.push(item)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Empuja &lt;code&gt;item&lt;/code&gt; a la cima de la pila.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stack.pop()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Extrae y elimina el elemento de la cima de la pila.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stack.top()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Devuelve el elemento de la cima sin eliminarlo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stack.is_empty()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Devuelve &lt;code&gt;True&lt;/code&gt; si la pila está vacía, &lt;code&gt;False&lt;/code&gt; en caso contrario.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;len(stack)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Devuelve la cantidad de elementos en la pila.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;item in stack&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Devuelve &lt;code&gt;True&lt;/code&gt; si &lt;code&gt;item&lt;/code&gt; existe en la pila, &lt;code&gt;False&lt;/code&gt; en caso contrario.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;for item in stack: ...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Itera sobre los elementos de la pila.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;for item in reversed(stack): ...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Itera sobre los elementos en orden inverso.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="implementacion-de-una-pila-en-python"&gt;Implementación de una pila en Python&lt;/h2&gt;
&lt;p&gt;A continuación encontrarás un ejemplo de implementación de una pila en Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - stack.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;deque&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Implement a Stack (LIFO) abstract data type.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;iterable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;deque&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;deque&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;iterable&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iterable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Push an item onto the stack.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Remove and return an item from the top of the stack.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pop from an empty stack&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;top&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Return the item at the top of the stack.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;top from an empty stack&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Return True if the stack is empty, False otherwise.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&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="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__len__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__contains__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__repr__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;(&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)&amp;quot;&lt;/span&gt;

    &lt;span class="fm"&gt;__str__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="fm"&gt;__repr__&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__iter__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__reversed__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="nb"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El atributo &lt;code&gt;._data&lt;/code&gt; es un objeto &lt;code&gt;deque&lt;/code&gt; del módulo &lt;code&gt;collections&lt;/code&gt; que almacena los elementos de la pila. La clase &lt;code&gt;deque&lt;/code&gt; proporciona operaciones de inserción y eliminación en tiempo constante O(1) en ambos extremos.&lt;/p&gt;
&lt;p&gt;Los métodos principales te permiten ofrecer las siguientes funcionalidades:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.push()&lt;/code&gt;&lt;/strong&gt;: añade un elemento a la cima de la pila usando &lt;code&gt;.append()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.pop()&lt;/code&gt;&lt;/strong&gt;: elimina y devuelve el elemento de la cima de la pila. Lanza &lt;code&gt;IndexError&lt;/code&gt; si la pila está vacía.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.top()&lt;/code&gt;&lt;/strong&gt;: devuelve el elemento de la cima sin eliminarlo. Lanza &lt;code&gt;IndexError&lt;/code&gt; si la pila está vacía.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.is_empty()&lt;/code&gt;&lt;/strong&gt;: comprueba si la pila está vacía.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Los métodos especiales te permiten ofrecer las siguientes funcionalidades:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.__len__()&lt;/code&gt;&lt;/strong&gt;: devuelve el número de elementos en la pila.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.__contains__()&lt;/code&gt;&lt;/strong&gt;: comprueba si un elemento está en la pila y devuelve &lt;code&gt;True&lt;/code&gt; o &lt;code&gt;False&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.__iter__()&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;.__reversed__()&lt;/code&gt;&lt;/strong&gt;: permiten iterar sobre los elementos de la pila en orden normal o inverso.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.__repr__()&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;.__str__()&lt;/code&gt;&lt;/strong&gt;: devuelven representaciones de cadena legibles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ejemplo-de-uso-de-la-pila"&gt;Ejemplo de uso de la pila&lt;/h2&gt;
&lt;p&gt;En esta sección verás ejemplos prácticos de cómo crear y manipular instancias de tu clase &lt;code&gt;Stack&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="inicializacion"&gt;Inicialización&lt;/h3&gt;
&lt;p&gt;Para crear una &lt;code&gt;Stack&lt;/code&gt;, puedes hacerlo sin argumentos o pasando un iterable:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;
&lt;span class="go"&gt;Stack([])&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Stack&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;
&lt;span class="go"&gt;Stack([1, 2, 3])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="empujar-y-extraer-elementos"&gt;Empujar y extraer elementos&lt;/h3&gt;
&lt;p&gt;Puedes empujar elementos a la cima y extraerlos en orden LIFO:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&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="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;
&lt;span class="go"&gt;Stack([1, 2, 3])&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;
&lt;span class="go"&gt;Stack([1])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si intentas extraer un elemento de una pila vacía, obtendrás un error:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;IndexError&lt;/span&gt;: &lt;span class="n"&gt;pop from an empty stack&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="consultar-la-cima"&gt;Consultar la cima&lt;/h3&gt;
&lt;p&gt;El método &lt;code&gt;.top()&lt;/code&gt; te permite ver el elemento en la cima sin eliminarlo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Stack&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;
&lt;span class="go"&gt;Stack([1, 2, 3])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="longitud-y-pertenencia"&gt;Longitud y pertenencia&lt;/h3&gt;
&lt;p&gt;Puedes consultar la longitud de la pila y verificar si un elemento está contenido en ella:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Stack&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="iteracion"&gt;Iteración&lt;/h3&gt;
&lt;p&gt;Los métodos &lt;code&gt;.__iter__()&lt;/code&gt; y &lt;code&gt;.__reversed__()&lt;/code&gt; permiten iterar sobre la pila tanto hacia adelante como hacia atrás:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Stack&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="conclusion"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Has aprendido cómo implementar una pila que proporciona operaciones esenciales como empujar y extraer elementos siguiendo el principio LIFO, consultar la cima, verificar pertenencia e iterar sobre sus elementos. Este conocimiento te sirve de base para entender algoritmos que dependen de pilas, como la evaluación de expresiones, el recorrido de grafos en profundidad y la gestión de historial de acciones.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/stack-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="data structures"/></entry><entry><title>Palabras clave en Python: case</title><link href="https://pythonscouts.com/python-case/" rel="alternate"/><published>2026-04-05T22:05:00+02:00</published><updated>2026-04-05T22:05:00+02:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-04-05:/python-case/</id><summary type="html">&lt;p&gt;En Python, la palabra clave suave &lt;code&gt;case&lt;/code&gt; es el componente principal de la estructura &lt;code&gt;match&lt;/code&gt; ... &lt;code&gt;case&lt;/code&gt;, diseñada para implementar coincidencias de patrones de forma expresiva y moderna.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Esta estructura de &lt;a href="/condicionales-python/"&gt;control de flujo&lt;/a&gt; te permite comparar una &lt;a href="/expresiones-python/"&gt;expresión&lt;/a&gt; con múltiples patrones de datos de manera explícita, facilitando la escritura de programas más legibles y menos propensos a errores en comparación con otros métodos de control de flujo.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/case-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-case"&gt;Uso de case&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;Para utilizar &lt;code&gt;case&lt;/code&gt;, necesitas una sentencia &lt;a href="/python-match/"&gt;&lt;code&gt;match&lt;/code&gt;&lt;/a&gt; que proporcione el &lt;a href="/valores-python/"&gt;valor&lt;/a&gt; a evaluar. Cada bloque &lt;code&gt;case&lt;/code&gt; define un patrón con el que se comparará dicho valor.&lt;/p&gt;
&lt;p&gt;La sintaxis básica es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;pattern1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Código si expression coincide con pattern1&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;pattern2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Código si expression coincide con pattern2&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Patrón comodín para manejar cualquier otro caso&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este flujo de ejecución, el intérprete evalúa cada &lt;code&gt;case&lt;/code&gt; de arriba abajo. Cuando encuentra la primera coincidencia, ejecuta su bloque de código y sale de la estructura.&lt;/p&gt;
&lt;p&gt;El uso de un guion bajo (&lt;code&gt;_&lt;/code&gt;) al final actúa como un &lt;strong&gt;comodín&lt;/strong&gt; (&lt;em&gt;catch-all&lt;/em&gt;) para capturar cualquier valor que no haya coincidido con los patrones anteriores.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Las &lt;strong&gt;palabras clave suaves&lt;/strong&gt; (&lt;em&gt;soft keywords&lt;/em&gt;) como &lt;code&gt;case&lt;/code&gt; se diferencian de las &lt;a href="/python-palabras-clave/"&gt;palabras clave&lt;/a&gt; normales en que pueden ser usadas como identificadores, lo que incluye nombres de &lt;a href="/variables-python/"&gt;variables&lt;/a&gt;, &lt;a href="/python-def/"&gt;funciones&lt;/a&gt; o &lt;a href="/python-class/"&gt;clases&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Observa el siguiente ejemplo de una función que clasifica edades:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;classify_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Eres un niño&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Eres un adolescente&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Eres un adulto&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;classify_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Eres un niño&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;classify_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Eres un adolescente&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;classify_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Eres un adulto&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como puedes ver, &lt;strong&gt;&lt;code&gt;match&lt;/code&gt; ... &lt;code&gt;case&lt;/code&gt;&lt;/strong&gt; te ofrece una vía directa para tomar decisiones basadas en &lt;a href="/valores-python/"&gt;valores&lt;/a&gt; específicos de tus objetos de forma más declarativa que las sentencias &lt;a href="/condicionales-python/"&gt;condicionales&lt;/a&gt; tradicionales.&lt;/p&gt;
&lt;h2 id="uso-de-case"&gt;Uso de &lt;code&gt;case&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;case&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ramificar la lógica de tus aplicaciones según el contenido específico o la estructura de tus datos&lt;/li&gt;
&lt;li&gt;Simplificar la lectura y mantenimiento de programas que dependen de múltiples condiciones de decisión&lt;/li&gt;
&lt;li&gt;Evaluar y desestructurar de forma segura estructuras de datos complejas mediante la coincidencia de patrones&lt;/li&gt;
&lt;li&gt;Sustituir cadenas extensas de sentencias &lt;a href="/python-if/"&gt;&lt;code&gt;if&lt;/code&gt;&lt;/a&gt; - &lt;a href="/python-elif/"&gt;&lt;code&gt;elif&lt;/code&gt;&lt;/a&gt; - &lt;a href="/python-else/"&gt;&lt;code&gt;else&lt;/code&gt;&lt;/a&gt; cuando comparas una sola variable contra múltiples opciones posibles&lt;/li&gt;
&lt;li&gt;Manejar respuestas de &lt;a href="/iniciando-con-fastapi-python/"&gt;APIs&lt;/a&gt; o eventos de manera más clara y declarativa&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;case&lt;/code&gt; constituye una adición esencial a Python para realizar coincidencias de patrones eficaces.&lt;/p&gt;
&lt;p&gt;Conocer y emplear esta herramienta te permitirá desarrollar aplicaciones más claras, fáciles de mantener y con un control de flujo mucho más potente.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/case-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: match</title><link href="https://pythonscouts.com/python-match/" rel="alternate"/><published>2026-03-29T21:50:00+02:00</published><updated>2026-03-29T21:50:00+02:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-03-29:/python-match/</id><summary type="html">&lt;p&gt;En Python, la palabra clave suave &lt;code&gt;match&lt;/code&gt; te permite evaluar expresiones mediante coincidencia de patrones, lo que facilita la escritura de múltiples condiciones de forma más clara y concisa.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Esta característica de control de flujo te ofrece una forma elegante y declarativa de evaluar tus objetos y realizar ramificaciones de decisión que anteriormente habrían requerido múltiples sentencias &lt;a href="/condicionales-python/"&gt;condicionales&lt;/a&gt; encadenadas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/match-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-match"&gt;Uso de match&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para usar la &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; &lt;code&gt;match&lt;/code&gt; consiste en una expresión seguida de bloques &lt;code&gt;case&lt;/code&gt; que definen los patrones:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;pattern1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Código si pattern1 coincide con expression&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;pattern2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Código si pattern2 coincide con expression&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Patrón comodín (opcional)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En esta estructura, la expresión se evalúa y su resultado se compara con cada patrón en orden. El primer patrón que coincida ejecutará su bloque de código asociado. Si ningún patrón coincide, se ejecuta el bloque del patrón comodín (&lt;code&gt;_&lt;/code&gt;), si este existe.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Las &lt;strong&gt;palabras clave suaves&lt;/strong&gt; (&lt;em&gt;soft keywords&lt;/em&gt;) se diferencian de las palabras clave normales en que pueden ser usadas como identificadores, lo que incluye nombres de &lt;a href="/variables-python/"&gt;variables&lt;/a&gt;, &lt;a href="/python-def/"&gt;funciones&lt;/a&gt; o &lt;a href="/python-class/"&gt;clases&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos básicos de cómo puedes usar &lt;code&gt;match&lt;/code&gt; en Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;start&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Iniciando...&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;stop&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Deteniendo...&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Comando desconocido&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;process_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;start&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Iniciando...&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;process_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stop&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Deteniendo...&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;También es ideal para realizar comparaciones múltiples de forma concisa usando el operador &lt;code&gt;|&lt;/code&gt; (&lt;code&gt;OR&lt;/code&gt;). El siguiente ejemplo muestra cómo obtener información sobre un código de estado HTTP:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_http_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;204&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Éxito&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;401&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Error del cliente&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;503&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Error del servidor&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Otro código&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;process_http_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Éxito&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;process_http_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Error del cliente&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como puedes ver, el uso de &lt;code&gt;match&lt;/code&gt; hace que estas comparaciones múltiples sean mucho más legibles.&lt;/p&gt;
&lt;h2 id="uso-de-match"&gt;Uso de &lt;code&gt;match&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;match&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comparar el contenido y la forma de tus datos de manera clara y concisa para tomar decisiones de control de flujo&lt;/li&gt;
&lt;li&gt;Extraer información específica de estructuras de datos complejas&lt;/li&gt;
&lt;li&gt;Reemplazar múltiples bloques de &lt;code&gt;if-elif-else&lt;/code&gt; encadenados&lt;/li&gt;
&lt;li&gt;Procesar eventos o estados según la forma que tengan tus datos&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;En definitiva, la palabra clave &lt;code&gt;match&lt;/code&gt; en Python te ofrece una vía moderna y potente para evaluar una expresión contra varios patrones, lo que se traduce en un código mucho más limpio y fácil de seguir.&lt;/p&gt;
&lt;p&gt;Al dominar &lt;code&gt;match&lt;/code&gt;, contarás con una herramienta fundamental para mejorar la legibilidad y mantenibilidad de tus programas, especialmente cuando trabajes con estructuras de datos complejas y múltiples condiciones lógicas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/match-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: type</title><link href="https://pythonscouts.com/python-type/" rel="alternate"/><published>2026-03-27T18:15:00+01:00</published><updated>2026-03-27T18:15:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-03-27:/python-type/</id><summary type="html">&lt;p&gt;En Python, la palabra clave suave &lt;code&gt;type&lt;/code&gt; se utiliza para declarar alias de tipos. Esta funcionalidad te permite asignar nombres descriptivos a tipos de datos complejos o genéricos.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Al emplear esta &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt;, verás cómo tus anotaciones de tipos (&lt;em&gt;type hints&lt;/em&gt;) se vuelven más expresivas y fáciles de mantener.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Las &lt;strong&gt;palabras clave suaves&lt;/strong&gt; (&lt;em&gt;soft keywords&lt;/em&gt;) se diferencian de las palabras clave normales en que pueden ser usadas como identificadores, lo que incluye nombres de &lt;a href="/variables-python/"&gt;variables&lt;/a&gt;, &lt;a href="/def-python/"&gt;funciones&lt;/a&gt; o &lt;a href="/class-python/"&gt;clases&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/type-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-type"&gt;Uso de type&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para declarar un alias de tipo con &lt;code&gt;type&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="n"&gt;AliasName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Además, puedes usar &lt;code&gt;type&lt;/code&gt; para crear alias que se adapten a diferentes tipos de datos, también conocidos como &lt;strong&gt;tipos genéricos&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="n"&gt;AliasName&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BaseType&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En esta sintaxis, la letra &lt;code&gt;T&lt;/code&gt; representa un &lt;strong&gt;parámetro de tipo&lt;/strong&gt; que actúa como un marcador de posición para el tipo concreto que se usará al emplear el alias. Aunque por convención se suele usar &lt;code&gt;T&lt;/code&gt; (de &lt;em&gt;Type&lt;/em&gt;), puedes emplear cualquier otro nombre válido en Python.&lt;/p&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos de cómo puedes usar la palabra clave &lt;code&gt;type&lt;/code&gt; en tus programas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Un alias de tipo&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Point&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;move_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Moviendo a: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Un alias de tipo genérico&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="n"&gt;ListOrSet&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ListOrSet&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En estos ejemplos, usas &lt;code&gt;type&lt;/code&gt; para crear nombres más legibles para tipos complejos. Nota que &lt;code&gt;Point&lt;/code&gt; es ahora un alias para una tupla de dos números &lt;code&gt;float&lt;/code&gt;, y &lt;code&gt;ListOrSet&lt;/code&gt; es un alias genérico que puede representar tanto una lista como un conjunto (&lt;code&gt;set&lt;/code&gt;) de elementos de un tipo &lt;code&gt;T&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Al usar estos alias, los &lt;strong&gt;analizadores estáticos de tipos&lt;/strong&gt; (&lt;em&gt;static type checkers&lt;/em&gt;) como &lt;a href="https://mypy-lang.org/" target="_blank"&gt;mypy&lt;/a&gt; o &lt;a href="https://github.com/microsoft/pyright" target="_blank"&gt;pyright&lt;/a&gt; no reportarán errores y te ayudarán a validar que tus datos coincidan con los tipos definidos.&lt;/p&gt;
&lt;h2 id="uso-de-type"&gt;Uso de &lt;code&gt;type&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;type&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crear alias descriptivos para tipos complejos o anidados.&lt;/li&gt;
&lt;li&gt;Facilitar la lectura de las anotaciones de tipos.&lt;/li&gt;
&lt;li&gt;Implementar clases y funciones genéricas de forma más limpia.&lt;/li&gt;
&lt;li&gt;Centralizar la definición de estructuras de datos que se usan en múltiples partes de tu aplicación.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;En resumen, la palabra clave suave &lt;code&gt;type&lt;/code&gt; es una adición moderna al lenguaje que te ayuda a escribir código más expresivo y fácil de mantener mediante la declaración de alias de tipos.&lt;/p&gt;
&lt;p&gt;Conocer y emplear esta palabra clave te proporciona una herramienta esencial para manejar la complejidad de los tipos en tus programas, permitiéndote aprovechar al máximo el sistema de tipos de Python a la vez que mejoras la legibilidad.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/type-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Python a través de ejemplos: Ciclos o bucles while</title><link href="https://pythonscouts.com/ciclos-while-python/" rel="alternate"/><published>2026-03-18T21:35:00+01:00</published><updated>2026-03-18T21:35:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-03-18:/ciclos-while-python/</id><summary type="html">&lt;p&gt;En Python, los ciclos &lt;code&gt;while&lt;/code&gt; te permiten ejecutar un bloque de código repetidamente mientras una condición se evalúe como verdadera.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Estos ciclos son especialmente útiles cuando no conoces de antemano cuántas repeticiones necesitas. En este tutorial, aprenderás lo esencial sobre el funcionamiento de los ciclos &lt;code&gt;while&lt;/code&gt; y cómo utilizarlos de forma efectiva en tus programas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/ciclos-while-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#conociendo-los-ciclos-while"&gt;Conociendo los ciclos while&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#iterando-con-ciclos-while-en-python"&gt;Iterando con ciclos while en Python&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#acumulando-con-un-ciclo-while"&gt;Acumulando con un ciclo while&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#procesando-datos-de-entrada-del-usuario"&gt;Procesando datos de entrada del usuario&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#recorriendo-colecciones-con-un-ciclo-while"&gt;Recorriendo colecciones con un ciclo while&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#controlando-la-iteracion-con-break-y-continue"&gt;Controlando la iteración con break y continue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#implementando-ciclos-infinitos-con-while-true"&gt;Implementando ciclos infinitos con while True&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usando-la-clausula-else-en-ciclos-while"&gt;Usando la cláusula else en ciclos while&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usando-ciclos-while-anidados"&gt;Usando ciclos while anidados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusiones"&gt;Conclusiones&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="conociendo-los-ciclos-while"&gt;Conociendo los ciclos &lt;code&gt;while&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Un ciclo o bucle &lt;strong&gt;&lt;code&gt;while&lt;/code&gt;&lt;/strong&gt; te permite ejecutar repetidamente un bloque de código mientras una &lt;a href="/condicionales-python/"&gt;condición&lt;/a&gt; sea verdadera. A diferencia de los &lt;a href="/ciclos-for-python/"&gt;ciclos &lt;code&gt;for&lt;/code&gt;&lt;/a&gt;, que iteran sobre una secuencia de elementos como una lista, los ciclos &lt;code&gt;while&lt;/code&gt; dependen de una condición que se evalúa antes de cada iteración.&lt;/p&gt;
&lt;p&gt;La sintaxis básica de un ciclo &lt;code&gt;while&lt;/code&gt; en Python es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;condition&lt;/code&gt;&lt;/strong&gt;: &lt;a href="/expresiones-python/"&gt;expresión&lt;/a&gt; que se evalúa antes de cada iteración. Si es &lt;a href="/python-true/"&gt;True&lt;/a&gt;, el ciclo continúa. Si es &lt;a href="/python-false/"&gt;False&lt;/a&gt;, se detiene y la ejecución pasa al siguiente bloque de código.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;block&amp;gt;&lt;/code&gt;&lt;/strong&gt;: bloque de código con las instrucciones que se ejecutan o repiten en cada iteración.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aquí tienes un ejemplo básico:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Contador: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;Contador: 0&lt;/span&gt;
&lt;span class="go"&gt;Contador: 1&lt;/span&gt;
&lt;span class="go"&gt;Contador: 2&lt;/span&gt;
&lt;span class="go"&gt;Contador: 3&lt;/span&gt;
&lt;span class="go"&gt;Contador: 4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, se inicia con &lt;code&gt;counter = 0&lt;/code&gt;. Mientras la condición &lt;code&gt;counter &amp;lt; 5&lt;/code&gt; devuelva &lt;code&gt;True&lt;/code&gt;, el ciclo imprime el valor actual y le suma &lt;code&gt;1&lt;/code&gt; a la &lt;a href="/variables-python/"&gt;variable&lt;/a&gt; &lt;code&gt;counter&lt;/code&gt;. El ciclo se detiene cuando &lt;code&gt;counter&lt;/code&gt; alcanza &lt;code&gt;5&lt;/code&gt;, pues la condición se evalúa como &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="iterando-con-ciclos-while-en-python"&gt;Iterando con ciclos &lt;code&gt;while&lt;/code&gt; en Python&lt;/h2&gt;
&lt;p&gt;Los ciclos &lt;code&gt;while&lt;/code&gt; son versátiles y puedes emplearlos en diversas situaciones. En las secciones siguientes, explorarás algunos patrones de uso comunes.&lt;/p&gt;
&lt;h3 id="acumulando-con-un-ciclo-while"&gt;Acumulando con un ciclo &lt;code&gt;while&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Uno de los usos más básicos de un ciclo &lt;code&gt;while&lt;/code&gt; es acumular valores en una variable. Aunque en muchos casos puedes usar un ciclo &lt;code&gt;for&lt;/code&gt; con &lt;code&gt;range()&lt;/code&gt; para esto, el ciclo &lt;code&gt;while&lt;/code&gt; te ofrece más control sobre la condición de parada:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;
&lt;span class="go"&gt;55&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, el ciclo suma los números del &lt;code&gt;1&lt;/code&gt; al &lt;code&gt;10&lt;/code&gt;. La variable &lt;code&gt;total&lt;/code&gt; acumula la suma, y &lt;code&gt;number&lt;/code&gt; se incrementa en cada iteración hasta que supera &lt;code&gt;10&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="procesando-datos-de-entrada-del-usuario"&gt;Procesando datos de entrada del usuario&lt;/h3&gt;
&lt;p&gt;Los ciclos &lt;code&gt;while&lt;/code&gt; son ideales para solicitar datos al usuario de forma repetida hasta que este proporcione una entrada válida:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - user_input.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;user_input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;salir&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;user_input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Escribe algo (o &amp;#39;salir&amp;#39; para terminar): &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;salir&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Escribiste: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;¡Hasta luego!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Puedes usar el &lt;a href="/operadores-python/"&gt;operador&lt;/a&gt; walrus (&lt;code&gt;:=&lt;/code&gt;) para simplificar este tipo de ciclos, permitiéndote asignar la entrada del usuario a una variable y evaluarla en la misma línea:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Escribe algo (o &amp;#39;salir&amp;#39; para terminar): &amp;quot;&lt;/span&gt;

&lt;span class="hll"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;salir&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Escribiste: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Esta versión es más eficiente y compacta, pues elimina la necesidad de inicializar &lt;code&gt;user_input&lt;/code&gt; fuera del ciclo y de repetir la lógica de validación.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;p&gt;Si ejecutas este programa, podrás interactuar con él de la siguiente manera:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;user_input.py
&lt;span class="go"&gt;Escribe algo (o &amp;#39;salir&amp;#39; para terminar): hola&lt;/span&gt;
&lt;span class="go"&gt;Escribiste: hola&lt;/span&gt;
&lt;span class="go"&gt;Escribe algo (o &amp;#39;salir&amp;#39; para terminar): Python&lt;/span&gt;
&lt;span class="go"&gt;Escribiste: Python&lt;/span&gt;
&lt;span class="go"&gt;Escribe algo (o &amp;#39;salir&amp;#39; para terminar): salir&lt;/span&gt;
&lt;span class="go"&gt;¡Hasta luego!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este patrón es frecuente en programas interactivos que necesitan mantener un ciclo de ejecución hasta que el usuario decida salir.&lt;/p&gt;
&lt;h3 id="recorriendo-colecciones-con-un-ciclo-while"&gt;Recorriendo colecciones con un ciclo &lt;code&gt;while&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Otro uso común de &lt;code&gt;while&lt;/code&gt; es consumir los elementos de una lista con el método &lt;code&gt;.pop()&lt;/code&gt;. En este ejemplo, el siguiente ciclo se ejecuta hasta que la lista &lt;code&gt;tasks&lt;/code&gt; esté vacía:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Comprar pan&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Estudiar Python&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Hacer ejercicios&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Completada: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;Completada: Hacer ejercicios&lt;/span&gt;
&lt;span class="go"&gt;Completada: Estudiar Python&lt;/span&gt;
&lt;span class="go"&gt;Completada: Comprar pan&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, el ciclo &lt;code&gt;while&lt;/code&gt; utiliza la lista &lt;code&gt;tasks&lt;/code&gt; directamente como condición. Cuando la lista queda vacía, se evalúa como &lt;code&gt;False&lt;/code&gt; y el ciclo termina. El método &lt;code&gt;.pop()&lt;/code&gt; elimina y devuelve el último elemento de la lista en cada iteración.&lt;/p&gt;
&lt;h2 id="controlando-la-iteracion-con-break-y-continue"&gt;Controlando la iteración con &lt;code&gt;break&lt;/code&gt; y &lt;code&gt;continue&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;En Python, las sentencias &lt;a href="/python-break/"&gt;&lt;code&gt;break&lt;/code&gt;&lt;/a&gt; y &lt;a href="/python-continue/"&gt;&lt;code&gt;continue&lt;/code&gt;&lt;/a&gt; te permiten controlar el flujo de ejecución en los ciclos &lt;code&gt;while&lt;/code&gt;. La función de estas sentencias es la siguiente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;break&lt;/code&gt;&lt;/strong&gt;: termina el ciclo anticipadamente y salta a la sentencia inmediatamente después del ciclo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;continue&lt;/code&gt;&lt;/strong&gt;: salta a la siguiente iteración, sin ejecutar el código que le sigue en el bloque del ciclo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A continuación, un ejemplo de cómo usar &lt;code&gt;break&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;counter&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="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;break&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El ciclo se detiene cuando &lt;code&gt;counter&lt;/code&gt; llega a &lt;code&gt;3&lt;/code&gt;, aunque la condición original &lt;code&gt;counter &amp;lt; 10&lt;/code&gt; siga siendo &lt;code&gt;True&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Considera el siguiente ejemplo de cómo funciona &lt;code&gt;continue&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;counter&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="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;4&lt;/span&gt;
&lt;span class="go"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cuando &lt;code&gt;counter&lt;/code&gt; es &lt;code&gt;3&lt;/code&gt;, la sentencia &lt;code&gt;continue&lt;/code&gt; evita la ejecución de &lt;code&gt;print()&lt;/code&gt;, saltando directamente a la siguiente iteración del ciclo.&lt;/p&gt;
&lt;h2 id="implementando-ciclos-infinitos-con-while-true"&gt;Implementando ciclos infinitos con &lt;code&gt;while True&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Si la condición de un ciclo &lt;code&gt;while&lt;/code&gt; nunca se vuelve &lt;code&gt;False&lt;/code&gt;, el ciclo se repite indefinidamente. Esto se conoce como un &lt;strong&gt;ciclo infinito&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Esto se repite para siempre&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este puede ser un error de lógica importante en tu código. Asegúrate siempre de que la condición se vuelva falsa en algún momento para evitar ciclos infinitos involuntarios.&lt;/p&gt;
&lt;p&gt;Si en algún momento te encuentras en un ciclo infinito, puedes detenerlo presionando &lt;code&gt;Ctrl+C&lt;/code&gt; en tu terminal. Esta combinación genera una excepción de tipo &lt;code&gt;KeyboardInterrupt&lt;/code&gt; y detiene la ejecución del programa.&lt;/p&gt;
&lt;p&gt;A pesar de que los ciclos infinitos pueden ser el resultado de un error, en muchas ocasiones son una herramienta poderosa y necesaria cuando los diseñas intencionalmente.&lt;/p&gt;
&lt;p&gt;Estos ciclos intencionados son la base de los &lt;strong&gt;ciclos de eventos&lt;/strong&gt; (&lt;strong&gt;event loops&lt;/strong&gt;) en aplicaciones con interfaz gráfica de usuario (GUI por sus siglas en inglés) y juegos, donde el programa debe esperar acciones del usuario o eventos externos en todo momento. También los encontrarás en servidores de red que escuchan peticiones de forma permanente.&lt;/p&gt;
&lt;p&gt;Para implementar este tipo de lógica de manera efectiva, puedes usar el patrón &lt;code&gt;while True&lt;/code&gt; combinado con una sentencia &lt;code&gt;break&lt;/code&gt;. De esta forma, podrás controlar con total precisión cuándo debe terminar el ciclo según los eventos que ocurran.&lt;/p&gt;
&lt;p&gt;Aquí tienes un ejemplo de un juego de adivinanza:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - guessing_game.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;random&lt;/span&gt;

&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;randint&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;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# Ciclo infinito intencional&lt;/span&gt;
    &lt;span class="n"&gt;guess&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Adivina el número (1-10): &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;¡Correcto!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;  &lt;span class="c1"&gt;# Termina el ciclo cuando adivinas el número&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Muy bajo, intenta de nuevo.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Muy alto, intenta de nuevo.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si ejecutas este programa, podrás jugar a adivinar un número:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;guessing_game.py
&lt;span class="go"&gt;Adivina el número (1-10): 5&lt;/span&gt;
&lt;span class="go"&gt;Muy bajo, intenta de nuevo.&lt;/span&gt;
&lt;span class="go"&gt;Adivina el número (1-10): 8&lt;/span&gt;
&lt;span class="go"&gt;Muy alto, intenta de nuevo.&lt;/span&gt;
&lt;span class="go"&gt;Adivina el número (1-10): 7&lt;/span&gt;
&lt;span class="go"&gt;¡Correcto!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, el patrón &lt;code&gt;while True&lt;/code&gt; crea un ciclo que se ejecuta indefinidamente. La sentencia &lt;code&gt;break&lt;/code&gt; termina el ciclo cuando el usuario adivina el número correcto.&lt;/p&gt;
&lt;h2 id="usando-la-clausula-else-en-ciclos-while"&gt;Usando la cláusula &lt;code&gt;else&lt;/code&gt; en ciclos &lt;code&gt;while&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Como las sentencias condicionales, los ciclos &lt;code&gt;while&lt;/code&gt; pueden tener una cláusula &lt;a href="/python-else/"&gt;&lt;code&gt;else&lt;/code&gt;&lt;/a&gt;. Esta cláusula se ejecuta únicamente cuando la condición se evalúa como &lt;code&gt;False&lt;/code&gt; sin que se haya ejecutado una sentencia &lt;code&gt;break&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Ciclo terminado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;Ciclo terminado&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este ciclo termina naturalmente luego de que &lt;code&gt;counter&lt;/code&gt; alcanza el valor de &lt;code&gt;3&lt;/code&gt;. Entonces, el &lt;code&gt;else&lt;/code&gt; se ejecuta y ves el mensaje &lt;code&gt;Ciclo terminado&lt;/code&gt; en la pantalla. Este tipo de &lt;code&gt;else&lt;/code&gt; sin un &lt;code&gt;break&lt;/code&gt; no es muy útil, pues es equivalente a poner el mensaje fuera del ciclo.&lt;/p&gt;
&lt;p&gt;En contraste, si usas una instrucción &lt;code&gt;break&lt;/code&gt;, el bloque &lt;code&gt;else&lt;/code&gt; no se ejecuta:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;break&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Ciclo terminado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este caso, el ciclo termina prematuramente cuando &lt;code&gt;counter&lt;/code&gt; es &lt;code&gt;1&lt;/code&gt;, y la cláusula &lt;code&gt;else&lt;/code&gt; se omite por completo.&lt;/p&gt;
&lt;p&gt;La cláusula &lt;code&gt;else&lt;/code&gt; te permite manejar de forma elegante situaciones donde la condición del ciclo se vuelve falsa después de varios intentos. Es particularmente útil en escenarios como los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implementar mecanismos de reintento en operaciones de red o archivos.&lt;/li&gt;
&lt;li&gt;Esperar a que un recurso externo alcance un estado específico o se agote el tiempo de espera.&lt;/li&gt;
&lt;li&gt;Procesar flujos de datos continuos hasta que aparezca una señal de parada.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Al emplear &lt;code&gt;else&lt;/code&gt;, evitas el uso de variables de control adicionales para saber si la operación tuvo éxito o no después de agotar los intentos. A continuación, verás un ejemplo más realista que simula una conexión:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - retry_connection.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;random&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# Simula un intento de conexión aleatorio&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;attempts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;max_attempts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;attempts&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;attempts&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Intento &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attempts&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: Conectando...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;¡Conexión establecida con éxito!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;No se pudo establecer la conexión.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, la función &lt;code&gt;connect()&lt;/code&gt; simula el resultado de una operación que puede fallar. Si el intento tiene éxito, el &lt;code&gt;break&lt;/code&gt; detiene el ciclo y el programa continúa normalmente. Si el ciclo se completa porque se alcanzaron los tres intentos sin éxito, el bloque &lt;code&gt;else&lt;/code&gt; se activa para manejar el fallo definitivo.&lt;/p&gt;
&lt;p&gt;Dependiendo de la aleatoriedad, al ejecutar este programa podrías ver una salida exitosa:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;retry_connection.py
&lt;span class="go"&gt;Intento 1: Conectando...&lt;/span&gt;
&lt;span class="go"&gt;Intento 2: Conectando...&lt;/span&gt;
&lt;span class="go"&gt;¡Conexión establecida con éxito!&lt;/span&gt;

&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;retry_connection.py
&lt;span class="go"&gt;Intento 1: Conectando...&lt;/span&gt;
&lt;span class="go"&gt;Intento 2: Conectando...&lt;/span&gt;
&lt;span class="go"&gt;Intento 3: Conectando...&lt;/span&gt;
&lt;span class="go"&gt;No se pudo establecer la conexión.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si el ciclo se interrumpe mediante una sentencia &lt;code&gt;break&lt;/code&gt;, el bloque &lt;code&gt;else&lt;/code&gt; no se ejecutará y verás el mensaje de &lt;code&gt;¡Conexión establecida con éxito!&lt;/code&gt;. En caso contrario, verás el mensaje de &lt;code&gt;No se pudo establecer la conexión.&lt;/code&gt; que indica que el &lt;code&gt;else&lt;/code&gt; se ejecutó.&lt;/p&gt;
&lt;h2 id="usando-ciclos-while-anidados"&gt;Usando ciclos &lt;code&gt;while&lt;/code&gt; anidados&lt;/h2&gt;
&lt;p&gt;Puedes anidar un ciclo &lt;code&gt;while&lt;/code&gt; dentro de otro. Al anidar ciclos, el ciclo interno se ejecuta por completo en cada iteración del ciclo externo.&lt;/p&gt;
&lt;p&gt;Este patrón es común en aplicaciones que gestionan menús jerárquicos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - menu.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;--- Menú Principal ---&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1. Entrar a Configuración&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2. Salir&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;menu_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Selecciona una opción: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;menu_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;--- Configuración ---&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1. Cambiar Idioma&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2. Volver&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;config_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Selecciona una opción: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;config_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Idioma cambiado con éxito.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;config_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;  &lt;span class="c1"&gt;# Sale del ciclo interno hacia el menú principal&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;menu_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Saliendo del sistema...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;  &lt;span class="c1"&gt;# Sale del ciclo externo y termina el programa&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este esquema, el primer ciclo mantiene la aplicación en ejecución de forma indefinida. Cuando el usuario elige la opción 1, se ejecuta el ciclo interno, presentando un nuevo menú.&lt;/p&gt;
&lt;p&gt;Esta estructura te permite crear interfaces interactivas que se adaptan al ritmo del usuario. Sin embargo, debes tener en cuenta que anidar demasiados niveles puede hacer que el código sea difícil de entender, en cuyo caso, considera extraer las subtareas en funciones independientes.&lt;/p&gt;
&lt;h2 id="conclusiones"&gt;Conclusiones&lt;/h2&gt;
&lt;p&gt;Los ciclos o bucles &lt;strong&gt;&lt;code&gt;while&lt;/code&gt;&lt;/strong&gt; son esenciales en Python cuando necesitas ejecutar un bloque de código un número indeterminado de veces, basándote en una condición dinámica.&lt;/p&gt;
&lt;p&gt;Estos ciclos son ideales para procesar datos de entrada del usuario, implementar menús interactivos y manejar situaciones donde no conoces de antemano el número de iteraciones.&lt;/p&gt;
&lt;p&gt;También puedes combinar &lt;code&gt;while&lt;/code&gt; con &lt;code&gt;break&lt;/code&gt;, &lt;code&gt;continue&lt;/code&gt; y &lt;code&gt;else&lt;/code&gt; para controlar el flujo de ejecución de tu código de una manera mucho más precisa. El patrón &lt;code&gt;while True&lt;/code&gt; (ciclo infinito) con &lt;code&gt;break&lt;/code&gt; es especialmente útil para ciclos que dependen de eventos externos.&lt;/p&gt;
&lt;p&gt;Dominar los ciclos &lt;code&gt;while&lt;/code&gt; es fundamental para escribir código más limpio e idiomático en Python. ¡Practica con tus propios ejemplos y experimenta con diferentes patrones para afianzar tu comprensión!&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/ciclos-while-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/></entry><entry><title>Palabras clave en Python: await</title><link href="https://pythonscouts.com/python-await/" rel="alternate"/><published>2026-03-05T19:15:00+01:00</published><updated>2026-03-05T19:15:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-03-05:/python-await/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;await&lt;/code&gt; se utiliza para pausar la ejecución de una función asíncrona hasta que una tarea asíncrona se complete.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Esta &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; es una parte fundamental del manejo de la programación asíncrona en Python, permitiendo que tu código espere de manera eficiente a que se resuelvan las operaciones sin bloquear el hilo de ejecución.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/await-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-await"&gt;Uso de await&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para usar &lt;code&gt;await&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;some_awaitable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, &lt;code&gt;some_awaitable()&lt;/code&gt; es la llamada a una &lt;a href="/python-def/"&gt;función&lt;/a&gt; &lt;code&gt;async&lt;/code&gt; que produce un objeto &lt;em&gt;awaitable&lt;/em&gt; (una corrutina), y &lt;code&gt;await&lt;/code&gt; se utiliza para esperar a que se complete antes de continuar con el código.&lt;/p&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;A continuación tienes algunos ejemplos de cómo se usa &lt;code&gt;await&lt;/code&gt; en Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - await_python.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;asyncio&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Inicio&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&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="c1"&gt;# Simula una operación asíncrona&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Fin&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Ejecutar la función asíncrona&lt;/span&gt;
&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, &lt;code&gt;await asyncio.sleep(1)&lt;/code&gt; pausa la ejecución de la función &lt;code&gt;main&lt;/code&gt; durante un segundo sin bloquear el hilo de ejecución principal. Después de un segundo, el programa continúa y ejecuta &lt;code&gt;print("Fin")&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;El siguiente ejemplo muestra cómo usar &lt;code&gt;await&lt;/code&gt; para esperar los resultados de múltiples solicitudes de red concurrentes. Para ello, usarás la biblioteca &lt;code&gt;aiohttp&lt;/code&gt; junto con la API pública &lt;a href="https://jsonplaceholder.typicode.com" target="_blank"&gt;JSONPlaceholder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Antes de ejecutar el ejemplo, instala &lt;code&gt;aiohttp&lt;/code&gt; en tu &lt;a href="/entorno-virtual-python/"&gt;entorno virtual&lt;/a&gt; con el siguiente comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;aiohttp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Una vez instalada la biblioteca, crea un archivo con el siguiente código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - fetch_todos.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;aiohttp&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://jsonplaceholder.typicode.com&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;aiohttp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClientSession&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;user_ids&lt;/span&gt; &lt;span class="o"&gt;=&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/users/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;user_ids&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;todos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/todos?userId=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;user_ids&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_todos&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;pending&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;user_todos&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;completed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pending&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; tareas pendientes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si ejecutas este script, obtendrás una salida similar a la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;fetch_todos.py
&lt;span class="go"&gt;Leanne Graham: 9 tareas pendientes&lt;/span&gt;
&lt;span class="go"&gt;Ervin Howell: 12 tareas pendientes&lt;/span&gt;
&lt;span class="go"&gt;Clementine Bauch: 10 tareas pendientes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, la función &lt;code&gt;fetch_data()&lt;/code&gt; usa &lt;code&gt;await&lt;/code&gt; para esperar la respuesta de la API en formato JSON. En &lt;code&gt;main()&lt;/code&gt;, las llamadas a &lt;code&gt;await asyncio.gather()&lt;/code&gt; permiten lanzar todas las solicitudes de forma concurrente, de modo que mientras una espera su respuesta, las demás pueden avanzar sin bloquear el hilo de ejecución.&lt;/p&gt;
&lt;h2 id="uso-de-await"&gt;Uso de &lt;code&gt;await&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;await&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Esperar a que se completen las operaciones de entrada/salida (I/O) asíncronas, como solicitudes de red o acceso a bases de datos.&lt;/li&gt;
&lt;li&gt;Coordinar tareas asíncronas que dependen del resultado de otras tareas.&lt;/li&gt;
&lt;li&gt;Mejorar la eficiencia de las aplicaciones al permitir que se realicen otras operaciones mientras se espera la finalización de tareas asíncronas.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;await&lt;/code&gt; es esencial en Python para trabajar con programación asíncrona, permitiendo que las funciones esperen de manera eficiente a que se completen las tareas.&lt;/p&gt;
&lt;p&gt;Conocer y utilizar &lt;code&gt;await&lt;/code&gt; te permite escribir código que es más eficiente en el manejo de operaciones de entrada/salida y en la gestión de tareas que pueden ejecutarse de forma concurrente.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/await-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: async</title><link href="https://pythonscouts.com/python-async/" rel="alternate"/><published>2026-03-03T21:30:00+01:00</published><updated>2026-03-03T21:30:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-03-03:/python-async/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;async&lt;/code&gt; se utiliza para definir funciones y bloques de código que se ejecutan de manera asíncrona sin bloquear el programa principal.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Esta &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; resulta especialmente útil para operaciones que pueden llevar tiempo, como la lectura de archivos o las solicitudes de red, debido a que permite que el programa continúe ejecutándose mientras espera que estas operaciones se completen.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/async-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-async"&gt;Uso de async&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para definir una función asíncrona con &lt;a href="/python-def/"&gt;&lt;code&gt;def&lt;/code&gt;&lt;/a&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;function_name&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="c1"&gt;# Async code here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;También puedes usar &lt;code&gt;async&lt;/code&gt; con la sentencia &lt;a href="/python-with/"&gt;&lt;code&gt;with&lt;/code&gt;&lt;/a&gt; para crear gestores de contexto asíncronos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="c1"&gt;# Async code here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Y con ciclos &lt;a href="/python-for/"&gt;&lt;code&gt;for&lt;/code&gt;&lt;/a&gt; para iterar de forma asíncrona:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;async_iterable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="c1"&gt;# Async code here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos que ilustran cómo se usa &lt;code&gt;async&lt;/code&gt; en Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;asyncio&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&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="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Mundo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="go"&gt;Hola&lt;/span&gt;
&lt;span class="go"&gt;Mundo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, la función &lt;code&gt;greeting()&lt;/code&gt; utiliza &lt;code&gt;async&lt;/code&gt; y &lt;code&gt;await&lt;/code&gt; para pausar la ejecución durante un segundo entre las dos impresiones. La función &lt;code&gt;asyncio.run()&lt;/code&gt; se utiliza para ejecutar la función asíncrona.&lt;/p&gt;
&lt;p&gt;El siguiente ejemplo muestra cómo &lt;code&gt;async&lt;/code&gt; te permite ejecutar varias solicitudes de red de forma concurrente. Para ello, usarás la biblioteca &lt;code&gt;aiohttp&lt;/code&gt; junto con la API pública &lt;a href="https://jsonplaceholder.typicode.com" target="_blank"&gt;JSONPlaceholder&lt;/a&gt; para obtener la información de varios usuarios al mismo tiempo.&lt;/p&gt;
&lt;p&gt;Antes de ejecutar el ejemplo, instala &lt;code&gt;aiohttp&lt;/code&gt; en tu &lt;a href="/entorno-virtual-python/"&gt;entorno virtual&lt;/a&gt; con el siguiente comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;aiohttp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Una vez instalada la biblioteca, crea un archivo con el siguiente código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - fetch_users.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;aiohttp&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://jsonplaceholder.typicode.com/users/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Usuario &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; recibido&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;aiohttp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClientSession&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="n"&gt;fetch_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&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="n"&gt;fetch_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;fetch_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Usuario &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;  Nombre: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;  Email: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;email&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;  Empresa: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;company&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si ejecutas este script, obtendrás la siguiente salida:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;fetch_users.py
&lt;span class="go"&gt;Usuario 2 recibido&lt;/span&gt;
&lt;span class="go"&gt;Usuario 3 recibido&lt;/span&gt;
&lt;span class="go"&gt;Usuario 1 recibido&lt;/span&gt;

&lt;span class="go"&gt;Usuario 1:&lt;/span&gt;
&lt;span class="go"&gt;  Nombre: Leanne Graham&lt;/span&gt;
&lt;span class="go"&gt;  Email: Sincere@april.biz&lt;/span&gt;
&lt;span class="go"&gt;  Empresa: Romaguera-Crona&lt;/span&gt;

&lt;span class="go"&gt;Usuario 2:&lt;/span&gt;
&lt;span class="go"&gt;  Nombre: Ervin Howell&lt;/span&gt;
&lt;span class="go"&gt;  Email: Shanna@melissa.tv&lt;/span&gt;
&lt;span class="go"&gt;  Empresa: Deckow-Crist&lt;/span&gt;

&lt;span class="go"&gt;Usuario 3:&lt;/span&gt;
&lt;span class="go"&gt;  Nombre: Clementine Bauch&lt;/span&gt;
&lt;span class="go"&gt;  Email: Nathan@yesenia.net&lt;/span&gt;
&lt;span class="go"&gt;  Empresa: Romaguera-Jacobson&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, las tres llamadas a &lt;code&gt;fetch_user()&lt;/code&gt; se lanzan de forma concurrente con &lt;code&gt;asyncio.gather()&lt;/code&gt;. Las solicitudes se realizan al mismo tiempo en lugar de esperar a que cada una termine antes de iniciar la siguiente. Esto ilustra la ventaja principal de la programación asíncrona: aprovechar los tiempos de espera en operaciones de red para realizar otras solicitudes de forma simultánea.&lt;/p&gt;
&lt;h2 id="uso-de-async"&gt;Uso de &lt;code&gt;async&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;async&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Definir funciones asíncronas que realizan operaciones de entrada/salida de larga duración sin bloquear el hilo principal del programa&lt;/li&gt;
&lt;li&gt;Mejorar el rendimiento de las aplicaciones al permitir que múltiples operaciones se ejecuten simultáneamente&lt;/li&gt;
&lt;li&gt;Usar en combinación con &lt;code&gt;await&lt;/code&gt; para esperar el resultado de una operación asíncrona sin bloquear la ejecución del código&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;async&lt;/code&gt; en Python es fundamental para escribir código asíncrono, lo que permite realizar operaciones concurrentes de manera eficiente.&lt;/p&gt;
&lt;p&gt;Conocer y utilizar &lt;code&gt;async&lt;/code&gt; te ayuda a mejorar el rendimiento de tus aplicaciones, especialmente cuando se trata de operaciones de E/S que resultan lentas o bloquean el flujo del programa.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/async-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: nonlocal</title><link href="https://pythonscouts.com/python-nonlocal/" rel="alternate"/><published>2026-03-02T19:10:00+01:00</published><updated>2026-03-02T19:10:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-03-02:/python-nonlocal/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;nonlocal&lt;/code&gt; te permite modificar variables de la función externa desde funciones anidadas para gestionar clausuras y estado intermedio.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Esto resulta especialmente útil cuando trabajas con clausuras (&lt;em&gt;closures&lt;/em&gt;) y necesitas que la &lt;a href="/python-def/"&gt;función&lt;/a&gt; anidada recuerde y modifique el estado de la función que la contiene, sin recurrir a &lt;a href="/variables-python/"&gt;variables&lt;/a&gt; &lt;a href="/python-global/"&gt;&lt;code&gt;global&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/nonlocal-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-nonlocal"&gt;Uso de nonlocal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para usar la &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; &lt;code&gt;nonlocal&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;nonlocal&lt;/span&gt; &lt;span class="n"&gt;variable_name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Donde &lt;code&gt;variable_name&lt;/code&gt; es el nombre de la &lt;a href="/variables-python/"&gt;variable&lt;/a&gt; que deseas marcar como no local.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;La palabra clave &lt;code&gt;nonlocal&lt;/code&gt; solo es válida dentro de funciones anidadas. Usarla a nivel de módulo o dentro de una función que no está anidada en otra provoca un &lt;code&gt;SyntaxError&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Veamos un ejemplo para ilustrar cómo funciona &lt;code&gt;nonlocal&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;outer_function&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;inner_function&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;nonlocal&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Dentro de inner_function:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;inner_function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Dentro de outer_function:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;outer_function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;Dentro de inner_function: 20&lt;/span&gt;
&lt;span class="go"&gt;Dentro de outer_function: 20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, &lt;code&gt;inner_function()&lt;/code&gt; modifica el &lt;a href="/valores-python/"&gt;valor&lt;/a&gt; de &lt;code&gt;value&lt;/code&gt; declarado en &lt;code&gt;outer_function()&lt;/code&gt; gracias a la palabra clave &lt;code&gt;nonlocal&lt;/code&gt;. Sin &lt;code&gt;nonlocal&lt;/code&gt;, &lt;code&gt;inner_function()&lt;/code&gt; trataría &lt;code&gt;value&lt;/code&gt; como una nueva variable local.&lt;/p&gt;
&lt;p&gt;Un ejemplo más práctico es un contador que mantiene su estado entre llamadas gracias a una clausura:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;make_counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&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="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;nonlocal&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;make_counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, &lt;code&gt;make_counter()&lt;/code&gt; devuelve la función &lt;code&gt;increment()&lt;/code&gt;, que recuerda y modifica &lt;code&gt;count&lt;/code&gt; gracias a &lt;code&gt;nonlocal&lt;/code&gt;. Cada llamada a &lt;code&gt;counter()&lt;/code&gt; incrementa el valor sin necesidad de variables globales ni &lt;a href="/python-class/"&gt;clases&lt;/a&gt;.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;A diferencia de &lt;code&gt;global&lt;/code&gt;, que permite acceder a variables del ámbito global del módulo, &lt;code&gt;nonlocal&lt;/code&gt; solo actúa sobre variables definidas en la función externa. Esto la convierte en una herramienta clave para trabajar con clausuras (&lt;em&gt;closures&lt;/em&gt;) y funciones anidadas.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h2 id="uso-de-nonlocal"&gt;Uso de &lt;code&gt;nonlocal&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;nonlocal&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Modificar variables de la función externa sin afectar el ámbito global&lt;/li&gt;
&lt;li&gt;Mantener el estado entre llamadas sucesivas a una función anidada&lt;/li&gt;
&lt;li&gt;Crear clausuras (&lt;em&gt;closures&lt;/em&gt;) que recuerdan el estado de la función que las contiene&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;nonlocal&lt;/code&gt; en Python te permite modificar variables de la función externa desde dentro de funciones anidadas.&lt;/p&gt;
&lt;p&gt;Conocer y emplear esta palabra clave te permite controlar mejor el alcance de las variables y crear clausuras y funciones anidadas más flexibles y poderosas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/nonlocal-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: global</title><link href="https://pythonscouts.com/python-global/" rel="alternate"/><published>2026-02-25T21:30:00+01:00</published><updated>2026-02-25T21:30:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-02-25:/python-global/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;global&lt;/code&gt; te permite modificar variables globales desde funciones y gestionar el estado global de tu programa de forma controlada.&lt;/p&gt;</summary><content type="html">&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/global-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-global"&gt;Uso de global&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para usar la &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; &lt;code&gt;global&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;var_name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Donde &lt;code&gt;var_name&lt;/code&gt; es el nombre de la &lt;a href="/variables-python/"&gt;variable&lt;/a&gt; global que deseas modificar dentro de una función.&lt;/p&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;El ejemplo clásico es un contador global:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;counter&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;# Variable global&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;  &lt;span class="c1"&gt;# Declaración global&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Contador incrementado&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, la función &lt;code&gt;increment()&lt;/code&gt; utiliza &lt;code&gt;global&lt;/code&gt; para modificar la variable &lt;code&gt;counter&lt;/code&gt; que se encuentra fuera de la función. Sin la declaración &lt;code&gt;global&lt;/code&gt;, intentar ejecutar &lt;code&gt;counter += 1&lt;/code&gt; dentro de la función provocaría un error (&lt;code&gt;UnboundLocalError&lt;/code&gt;), pues Python interpretaría que intentas modificar una variable local antes de haberle asignado un valor.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Aunque la palabra clave global puede ser útil en ciertos casos, gestionar el estado de un programa mediante variables globales no es una buena práctica de programación. El uso excesivo de variables globales puede dificultar el mantenimiento, la depuración y la reutilización del código. Siempre que sea posible, emplea alternativas como el &lt;a href="/python-def/"&gt;paso de argumentos&lt;/a&gt;, el retorno de valores o el uso de &lt;a href="/python-class/"&gt;clases y objetos&lt;/a&gt; para gestionar el estado.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h2 id="uso-de-global"&gt;Uso de &lt;code&gt;global&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;global&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Modificar una variable definida fuera del ámbito de la función actual.&lt;/li&gt;
&lt;li&gt;Compartir una variable entre múltiples funciones dentro del mismo módulo.&lt;/li&gt;
&lt;li&gt;Inicializar o reiniciar variables globales desde funciones cuando el estado global debe ser controlado explícitamente.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;global&lt;/code&gt; en Python te permite modificar variables globales desde dentro de una función.&lt;/p&gt;
&lt;p&gt;Conocer y emplear esta palabra clave puede facilitar la gestión del estado global del programa de manera controlada, aunque debe usarse con precaución para mantener un código limpio y fácil de mantener.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/global-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: finally</title><link href="https://pythonscouts.com/python-finally/" rel="alternate"/><published>2026-02-21T19:30:00+01:00</published><updated>2026-02-21T19:30:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-02-21:/python-finally/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;finally&lt;/code&gt; se utiliza junto con &lt;code&gt;try&lt;/code&gt; para garantizar que un bloque de código se ejecute sin importar si ocurre una excepción.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Esto la convierte en una &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; especialmente útil para la limpieza de recursos, como cerrar archivos o conexiones de red, asegurando que estas operaciones se completen sin importar el resultado de los bloques &lt;a href="/python-try/"&gt;&lt;code&gt;try&lt;/code&gt;&lt;/a&gt; y &lt;a href="/python-except/"&gt;&lt;code&gt;except&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/finally-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-finally"&gt;Uso de finally&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para usar &lt;code&gt;finally&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ExceptionType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cleanup_block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;También puedes usar &lt;code&gt;finally&lt;/code&gt; directamente con &lt;code&gt;try&lt;/code&gt;, sin incluir &lt;code&gt;except&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cleanup_block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos que muestran cómo se utiliza la palabra clave &lt;code&gt;finally&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;data.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;w&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola, Python Scouts&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;IOError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error de escritura: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Archivo cerrado: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;closed&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;Archivo cerrado: True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, abres un archivo (&lt;code&gt;data.txt&lt;/code&gt;) para escritura y usas &lt;code&gt;finally&lt;/code&gt; para garantizar que el archivo se cierre sin importar si la operación de escritura produce un error o no.&lt;/p&gt;
&lt;p&gt;También puedes usar &lt;code&gt;finally&lt;/code&gt; sin &lt;code&gt;except&lt;/code&gt; cuando solo necesitas asegurar la limpieza de recursos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;data.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Archivo cerrado: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;closed&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;Hola, Python Scouts!&lt;/span&gt;
&lt;span class="go"&gt;Archivo cerrado: True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, el bloque &lt;code&gt;finally&lt;/code&gt; se ejecuta independientemente de si la lectura del archivo fue exitosa o no, asegurando que el recurso se libere correctamente.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 MD038 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Aunque puedes usar &lt;code&gt;try&lt;/code&gt; y &lt;code&gt;finally&lt;/code&gt; para gestionar recursos como archivos, la forma recomendada en Python es emplear la sentencia &lt;a href="/python-with/"&gt;&lt;code&gt;with&lt;/code&gt;&lt;/a&gt;, que se encarga automáticamente de cerrar el archivo y manejar posibles excepciones de manera más segura y concisa. El ejemplo anterior quedaría de la siguiente manera:
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;data.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
El archivo se cierra automáticamente al salir del bloque &lt;code&gt;with&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 MD038 --&gt;

&lt;h2 id="uso-de-finally"&gt;Uso de &lt;code&gt;finally&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;finally&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Liberación de recursos como cerrar archivos o conexiones de base de datos.&lt;/li&gt;
&lt;li&gt;Ejecución de tareas de limpieza sin importar si se produjo una excepción.&lt;/li&gt;
&lt;li&gt;Asegurar que ciertas operaciones críticas se realicen incluso en presencia de errores.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;finally&lt;/code&gt; en Python te permite garantizar la ejecución de un bloque de código independientemente de si ocurre una excepción o no.&lt;/p&gt;
&lt;p&gt;Conocer y emplear &lt;code&gt;finally&lt;/code&gt; es beneficioso para asegurar que los recursos se gestionen de manera adecuada y que se realicen las tareas necesarias de limpieza en tus programas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/finally-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: except</title><link href="https://pythonscouts.com/python-except/" rel="alternate"/><published>2026-02-20T19:30:00+01:00</published><updated>2026-02-20T19:30:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-02-20:/python-except/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;except&lt;/code&gt; se utiliza junto con &lt;code&gt;try&lt;/code&gt; para capturar y manejar excepciones, permitiéndote gestionar errores de forma controlada.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Con esta &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; defines bloques de respuesta ante errores específicos dentro de una sentencia &lt;a href="/python-try/"&gt;&lt;code&gt;try&lt;/code&gt;&lt;/a&gt;, indicando qué tipo de excepción capturar y cómo reaccionar en cada caso.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/except-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-except"&gt;Uso de except&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para usar &lt;code&gt;except&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ExceptionType&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;variable&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puedes capturar múltiples excepciones con cláusulas &lt;code&gt;except&lt;/code&gt; separadas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ExceptionType1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;handler_1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ExceptionType2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;handler_2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;También puedes agrupar varias excepciones en una sola cláusula usando una tupla:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ExceptionType1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ExceptionType2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Los corchetes indican elementos opcionales.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos que muestran cómo se utiliza la palabra clave &lt;code&gt;except&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ZeroDivisionError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: división por cero&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;Error: división por cero&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, intentas dividir &lt;code&gt;10&lt;/code&gt; entre &lt;code&gt;0&lt;/code&gt;, lo cual genera una excepción &lt;code&gt;ZeroDivisionError&lt;/code&gt;. La cláusula &lt;code&gt;except&lt;/code&gt; captura esa excepción y muestra un mensaje en lugar de detener el programa.&lt;/p&gt;
&lt;p&gt;Puedes acceder a los detalles de la excepción usando la palabra clave &lt;a href="/python-as/"&gt;&lt;code&gt;as&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Python&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;No se pudo convertir: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;No se pudo convertir: invalid literal for int() with base 10: &amp;#39;Python&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, intentas convertir una cadena que no representa un número a un entero, lo que provoca una excepción &lt;code&gt;ValueError&lt;/code&gt;. Con &lt;code&gt;as&lt;/code&gt;, capturas el objeto de excepción para mostrar un mensaje más detallado.&lt;/p&gt;
&lt;p&gt;También puedes capturar múltiples excepciones en diferentes cláusulas &lt;code&gt;except&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: valor no numérico&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ZeroDivisionError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: división por cero&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Resultado: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;process_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;abc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Error: valor no numérico&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;process_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Error: división por cero&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;process_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;4&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Resultado: 25.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;En la práctica, es recomendable capturar excepciones específicas en lugar de usar un &lt;code&gt;except&lt;/code&gt; genérico sin tipo de excepción o usando &lt;code&gt;Exception&lt;/code&gt;. Esto te permite manejar cada error de forma adecuada y evitar ocultar errores inesperados en tu código.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h2 id="uso-de-except"&gt;Uso de &lt;code&gt;except&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;except&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Capturar excepciones específicas, como &lt;code&gt;ZeroDivisionError&lt;/code&gt;, &lt;code&gt;ValueError&lt;/code&gt;, entre otras, para proporcionar mensajes de error claros y personalizados.&lt;/li&gt;
&lt;li&gt;Acceder a los detalles de una excepción usando &lt;code&gt;as&lt;/code&gt; para registrar o presentar información útil.&lt;/li&gt;
&lt;li&gt;Manejar múltiples tipos de excepciones con distintas cláusulas &lt;code&gt;except&lt;/code&gt;, ofreciendo respuestas diferenciadas ante cada error.&lt;/li&gt;
&lt;li&gt;Proveer un mecanismo para continuar la ejecución del programa incluso cuando ocurre un error.&lt;/li&gt;
&lt;li&gt;Implementar lógica de recuperación o limpieza cuando se produce un error inesperado.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;except&lt;/code&gt; en Python es fundamental para el manejo de excepciones, permitiéndote capturar y gestionar errores de manera controlada.&lt;/p&gt;
&lt;p&gt;Conocer y emplear &lt;code&gt;except&lt;/code&gt; junto con &lt;code&gt;try&lt;/code&gt;, &lt;a href="/python-else/"&gt;&lt;code&gt;else&lt;/code&gt;&lt;/a&gt; y &lt;code&gt;finally&lt;/code&gt; te permite crear programas más robustos que manejan situaciones inesperadas sin interrupciones abruptas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/except-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: is</title><link href="https://pythonscouts.com/python-is/" rel="alternate"/><published>2026-02-17T19:25:00+01:00</published><updated>2026-02-17T19:25:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-02-17:/python-is/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;is&lt;/code&gt; se utiliza para comprobar si dos referencias (variables) de objetos apuntan al mismo objeto en la memoria.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A diferencia del &lt;a href="/operadores-python/"&gt;operador&lt;/a&gt; &lt;code&gt;==&lt;/code&gt;, que compara si los valores de dos objetos son iguales, es decir, si tienen el mismo contenido, &lt;code&gt;is&lt;/code&gt; te ayuda a verificar la identidad del objeto.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/is-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-is"&gt;Uso de is&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis para usar la palabra clave &lt;code&gt;is&lt;/code&gt; es bastante sencilla:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, &lt;code&gt;x&lt;/code&gt; y &lt;code&gt;y&lt;/code&gt; son las dos referencias que deseas comparar para ver si apuntan al mismo objeto.&lt;/p&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Veamos algunos ejemplos prácticos para entender mejor cómo funciona el operador &lt;code&gt;is&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[:]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En el primer ejemplo, &lt;code&gt;a is b&lt;/code&gt; devuelve &lt;a href="/python-true/"&gt;&lt;code&gt;True&lt;/code&gt;&lt;/a&gt; porque &lt;code&gt;b&lt;/code&gt; es una referencia al mismo objeto que &lt;code&gt;a&lt;/code&gt; en la memoria.&lt;/p&gt;
&lt;p&gt;En el segundo ejemplo, &lt;code&gt;a is c&lt;/code&gt; devuelve &lt;a href="/python-false/"&gt;&lt;code&gt;False&lt;/code&gt;&lt;/a&gt; porque &lt;code&gt;c&lt;/code&gt; es una copia superficial de &lt;code&gt;a&lt;/code&gt;, lo que significa que tienen el mismo contenido, pero son objetos diferentes en la memoria. Sin embargo, &lt;code&gt;a == c&lt;/code&gt; devuelve &lt;code&gt;True&lt;/code&gt; porque los valores son iguales.&lt;/p&gt;
&lt;h2 id="uso-de-is"&gt;Uso de &lt;code&gt;is&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;is&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comprobar si una &lt;a href="/variables-python/"&gt;variable&lt;/a&gt; es &lt;a href="/python-none/"&gt;&lt;code&gt;None&lt;/code&gt;&lt;/a&gt;, es decir, &lt;code&gt;variable is None&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Verificar la identidad de objetos inmutables como cadenas y números en ciertas situaciones.&lt;/li&gt;
&lt;li&gt;&lt;a href="/python-if/"&gt;Controlar el flujo&lt;/a&gt; para tomar decisiones basadas en la identidad de los objetos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;is&lt;/code&gt; en Python te permite verificar la identidad de los objetos, asegurándote de que dos referencias apuntan al mismo objeto en la memoria.&lt;/p&gt;
&lt;p&gt;Conocer cómo y cuándo usar &lt;code&gt;is&lt;/code&gt; te permite escribir código más preciso y eficiente, especialmente cuando trabajas con comparaciones de objetos y estructuras de datos complejas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/is-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Iniciando con FastAPI para desarrollo de APIs</title><link href="https://pythonscouts.com/iniciando-con-fastapi-python/" rel="alternate"/><published>2026-02-09T22:20:00+01:00</published><updated>2026-02-09T22:20:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-02-09:/iniciando-con-fastapi-python/</id><summary type="html">&lt;p&gt;FastAPI es un framework web moderno y de alto rendimiento para construir APIs con Python. Está basado en el empleo de indicadores de tipo (type hints) y estándares abiertos como OpenAPI.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Para desarrollar &lt;a href="https://en.wikipedia.org/wiki/Web_API" target="_blank"&gt;APIs&lt;/a&gt; modernas y robustas con Python, puedes emplear una variedad de &lt;em&gt;frameworks&lt;/em&gt;, incluyendo &lt;a href="https://www.django-rest-framework.org/" target="_blank"&gt;Django REST Framework&lt;/a&gt;, &lt;a href="https://flask.palletsprojects.com/" target="_blank"&gt;Flask&lt;/a&gt;, &lt;a href="https://falconframework.org/" target="_blank"&gt;Falcon&lt;/a&gt;, entre otros. Sin embargo, &lt;a href="https://fastapi.tiangolo.com/" target="_blank"&gt;FastAPI&lt;/a&gt; se ha convertido en una de las opciones más populares y sólidas disponibles gracias a su alto rendimiento y su enfoque en la productividad del desarrollador.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En este tutorial, aprenderás cómo:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instalar&lt;/strong&gt; FastAPI y configurarlo en tu computadora&lt;/li&gt;
&lt;li&gt;Crear tu primera &lt;strong&gt;API&lt;/strong&gt; con un endpoint básico&lt;/li&gt;
&lt;li&gt;Usar &lt;strong&gt;parámetros de ruta&lt;/strong&gt; y &lt;strong&gt;parámetros de query&lt;/strong&gt; para recibir datos&lt;/li&gt;
&lt;li&gt;Validar datos de entrada con &lt;strong&gt;modelos Pydantic&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Aprovechar la &lt;strong&gt;documentación interactiva&lt;/strong&gt; automática&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para obtener el máximo de este tutorial, debes conocer lo básico de programación con Python, especialmente temas relacionados con &lt;a href="/python-def/"&gt;funciones&lt;/a&gt;, decoradores y &lt;a href="https://docs.python.org/es/3.14/glossary.html#term-type-hint" target="_blank"&gt;&lt;em&gt;type hints&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Tutoriales/iniciando-con-fastapi-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#conociendo-fastapi"&gt;Conociendo FastAPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#instalando-fastapi"&gt;Instalando FastAPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#creando-una-aplicacion-fastapi"&gt;Creando una aplicación FastAPI&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#ejecutando-el-servidor"&gt;Ejecutando el servidor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#documentacion-interactiva"&gt;Documentación interactiva&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#explorando-las-operaciones-http"&gt;Explorando las operaciones HTTP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usando-parametros-de-ruta"&gt;Usando parámetros de ruta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usando-parametros-de-query"&gt;Usando parámetros de query&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#validando-datos-con-modelos-pydantic"&gt;Validando datos con modelos Pydantic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#demo-api-con-fastapi-autos"&gt;Demo API con FastAPI: Autos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="conociendo-fastapi"&gt;Conociendo FastAPI&lt;/h2&gt;
&lt;p&gt;FastAPI es un &lt;em&gt;web framework&lt;/em&gt; moderno y de alto rendimiento para construir APIs con Python 3.9+ basado en los indicadores de tipo estándar (&lt;a href="https://docs.python.org/3/library/typing.html" target="_blank"&gt;&lt;em&gt;type hints&lt;/em&gt;&lt;/a&gt;). Sus características principales incluyen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rapidez&lt;/strong&gt;: Muy alto rendimiento, a la par con NodeJS y Go, gracias a Starlette y Pydantic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rápido de programar&lt;/strong&gt;: Incrementa la velocidad de desarrollo entre 200% y 300%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Menos errores&lt;/strong&gt;: Reduce alrededor del 40% de errores inducidos por desarrolladores&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intuitivo&lt;/strong&gt;: Gran soporte en editores con autocompletado en todas partes, lo que reduce el tiempo de depuración&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fácil&lt;/strong&gt;: Diseñado para ser fácil de usar y aprender, lo que reduce el tiempo leyendo documentación&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Corto&lt;/strong&gt;: Minimiza la duplicación de código con múltiples funcionalidades para cada declaración de parámetros&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Robusto&lt;/strong&gt;: Código listo para producción con documentación interactiva automática&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Basado en estándares&lt;/strong&gt;: Totalmente compatible con los estándares abiertos para APIs, como OpenAPI y JSON Schema&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;FastAPI se apoya internamente en dos bibliotecas clave: &lt;a href="https://www.starlette.io/" target="_blank"&gt;Starlette&lt;/a&gt; para la parte web y &lt;a href="https://docs.pydantic.dev/" target="_blank"&gt;Pydantic&lt;/a&gt; para la validación de datos. Esta combinación le permite alcanzar un rendimiento comparable al de &lt;em&gt;frameworks&lt;/em&gt; escritos en Go o NodeJS.&lt;/p&gt;
&lt;h2 id="instalando-fastapi"&gt;Instalando FastAPI&lt;/h2&gt;
&lt;p&gt;Para comenzar a trabajar con FastAPI, necesitas instalarlo junto con un servidor ASGI (&lt;em&gt;Asynchronous Server Gateway Interface&lt;/em&gt;), como &lt;code&gt;uvicorn&lt;/code&gt;, que será el encargado de ejecutar tu aplicación.&lt;/p&gt;
&lt;p&gt;Si estás utilizando &lt;code&gt;uv&lt;/code&gt; para &lt;a href="/gestionar-proyecto-python-uv/"&gt;gestionar tu proyecto&lt;/a&gt;, lo cual es recomendado, puedes añadir las dependencias con el siguiente comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;fastapi&lt;span class="w"&gt; &lt;/span&gt;uvicorn
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alternativamente, puedes usar &lt;code&gt;pip&lt;/code&gt; directamente en tu &lt;a href="/entorno-virtual-python/"&gt;entorno virtual Python&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp gp-VirtualEnv"&gt;(.venv)&lt;/span&gt; &lt;span class="gp"&gt;$ &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;fastapi&lt;span class="w"&gt; &lt;/span&gt;uvicorn
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="creando-una-aplicacion-fastapi"&gt;Creando una aplicación FastAPI&lt;/h2&gt;
&lt;p&gt;Con FastAPI instalado, estás listo para crear tu primera API. Para comenzar, crearás una aplicación de &lt;a href="/python-hola-mundo/"&gt;Hola, Mundo!&lt;/a&gt; Crea un archivo llamado &lt;code&gt;main.py&lt;/code&gt; con el siguiente contenido:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - main.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_root&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;message&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Hola, Mundo!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Veamos qué está pasando en este código:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;from fastapi import FastAPI&lt;/code&gt;: Importas la clase principal &lt;code&gt;FastAPI&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;app = FastAPI()&lt;/code&gt;: Creas una instancia de la aplicación. Esta instancia &lt;code&gt;app&lt;/code&gt; será el punto de interacción principal para crear tu API&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@app.get("/")&lt;/code&gt;: Este decorador le dice a FastAPI que la función que está justo debajo se encarga de manejar las peticiones que van al &lt;em&gt;path&lt;/em&gt; &lt;code&gt;/&lt;/code&gt;, es decir, la raíz, usando la operación HTTP &lt;strong&gt;GET&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;def read_root()&lt;/code&gt;: Esta es la función que define la lógica del &lt;em&gt;endpoint&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;return {"message": "Hola, Mundo!"}&lt;/code&gt;: Retornas un diccionario que FastAPI convierte a JSON y envía la respuesta en el formato esperado&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="ejecutando-el-servidor"&gt;Ejecutando el servidor&lt;/h3&gt;
&lt;p&gt;Para ver tu aplicación en acción, ejecuta el siguiente comando en tu terminal. Asegúrate de estar en el mismo directorio que &lt;code&gt;main.py&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;uvicorn&lt;span class="w"&gt; &lt;/span&gt;main:app&lt;span class="w"&gt; &lt;/span&gt;--reload
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La opción &lt;code&gt;--reload&lt;/code&gt; hace que el servidor se reinicie automáticamente cada vez que guardas cambios en tu código, lo cual es ideal durante el proceso de desarrollo.&lt;/p&gt;
&lt;p&gt;Al ejecutarse el comando, verás una salida similar a esta:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Texto&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;INFO:     Will watch for changes in these directories: [&amp;#39;/home/user/app&amp;#39;]
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [28720] using WatchFiles
INFO:     Started server process [28722]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Abre tu navegador y ve a &lt;code&gt;http://127.0.0.1:8000&lt;/code&gt;. Verás la respuesta en JSON:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Json&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;message&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola, Mundo!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="documentacion-interactiva"&gt;Documentación interactiva&lt;/h3&gt;
&lt;p&gt;Una de las características más deseables de FastAPI es que genera documentación interactiva automáticamente, sin escribir una sola línea extra de código. Puedes consultarla yendo a &lt;code&gt;http://127.0.0.1:8000/docs&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-fastapi-python/fastapi-docs.png" class="mx-auto d-block mt-2" style="max-width: 800px; width: 100%; height: auto;" alt="Documentación interactiva de FastAPI con Swagger UI"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Documentación interactiva automática (Swagger UI)&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Desde aquí puedes ver tus &lt;em&gt;endpoints&lt;/em&gt;, probarlos directamente desde el navegador y examinar las respuestas en formato JSON. Esta funcionalidad es especialmente útil durante el desarrollo, puesto que te permite depurar y verificar tu API sin necesidad de herramientas externas como Postman o &lt;a href="https://curl.se/" target="_blank"&gt;cURL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;También tienes disponible una documentación alternativa basada en ReDoc en &lt;code&gt;http://127.0.0.1:8000/redoc&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="explorando-las-operaciones-http"&gt;Explorando las operaciones HTTP&lt;/h2&gt;
&lt;p&gt;Para construir APIs efectivas, es importante entender cómo funcionan las peticiones HTTP. Cuando un cliente, como un navegador o una app móvil, quiere interactuar con tu API, envía una petición o &lt;em&gt;request&lt;/em&gt;, y tu servidor devuelve una respuesta o &lt;em&gt;response&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;En FastAPI, cada operación de ruta corresponde a un método HTTP específico:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/strong&gt;: Leer datos&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/strong&gt;: Crear datos&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;PUT&lt;/code&gt;&lt;/strong&gt;: Actualizar datos&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;DELETE&lt;/code&gt;&lt;/strong&gt;: Borrar datos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por eso usas &lt;code&gt;@app.get("/")&lt;/code&gt; para leer la raíz. Si quisieras crear un elemento, usarías &lt;code&gt;@app.post("/")&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="usando-parametros-de-ruta"&gt;Usando parámetros de ruta&lt;/h2&gt;
&lt;p&gt;A menudo necesitarás obtener un elemento específico de tu API, por ejemplo, un usuario por su ID. FastAPI te permite hacer esto definiendo parámetros en la ruta.&lt;/p&gt;
&lt;p&gt;Añade la siguiente función a tu archivo &lt;code&gt;main.py&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - main.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nd"&gt;@app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/items/&lt;/span&gt;&lt;span class="si"&gt;{item_id}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;item_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El valor del argumento de ruta &lt;code&gt;item_id&lt;/code&gt; se pasará a tu función como el argumento &lt;code&gt;item_id&lt;/code&gt;. Observa el identificador de tipo: &lt;code&gt;item_id: int&lt;/code&gt;. Esto le dice a FastAPI que valide que el valor sea un entero. La validación es automática gracias a los &lt;em&gt;type hints&lt;/em&gt; de Python.&lt;/p&gt;
&lt;p&gt;Si vas a &lt;code&gt;http://127.0.0.1:8000/items/5&lt;/code&gt;, verás:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Json&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;item_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pero si intentas ir a &lt;code&gt;http://127.0.0.1:8000/items/foo&lt;/code&gt;, verás un error HTTP indicando que el valor no es un entero válido. FastAPI se encarga de esta validación automáticamente.&lt;/p&gt;
&lt;h2 id="usando-parametros-de-query"&gt;Usando parámetros de &lt;em&gt;query&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Cuando declaras otros parámetros en la función que no son parte de la ruta, FastAPI los interpreta automáticamente como parámetros de &lt;em&gt;query&lt;/em&gt;, es decir, los que van después del signo de interrogación, &lt;code&gt;?&lt;/code&gt;, en la URL:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - main.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nd"&gt;@app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/items/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&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;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;fake_items_db&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;item_name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;item_name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Bar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, &lt;code&gt;skip&lt;/code&gt; tiene un valor por defecto de &lt;code&gt;0&lt;/code&gt; y &lt;code&gt;limit&lt;/code&gt; de &lt;code&gt;10&lt;/code&gt;. Como son &lt;code&gt;int&lt;/code&gt;, FastAPI también los validará. Prueba ir a: &lt;code&gt;http://127.0.0.1:8000/items/?skip=0&amp;amp;limit=1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Los parámetros de &lt;em&gt;query&lt;/em&gt; son opcionales cuando tienen valores por defecto. Si no proporcionas un valor, FastAPI usará el valor por defecto que definiste en la firma de la función.&lt;/p&gt;
&lt;h2 id="validando-datos-con-modelos-pydantic"&gt;Validando datos con modelos Pydantic&lt;/h2&gt;
&lt;p&gt;Para enviar datos a tu API, por ejemplo para crear un item, necesitas usar el cuerpo de la petición. FastAPI usa &lt;strong&gt;Pydantic&lt;/strong&gt; para esto, lo cual es una de sus mayores fortalezas.&lt;/p&gt;
&lt;p&gt;Primero, importa &lt;code&gt;BaseModel&lt;/code&gt; de &lt;code&gt;pydantic&lt;/code&gt; y define tu modelo de datos con los campos necesarios:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - main.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
    &lt;span class="n"&gt;is_offer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este modelo, &lt;code&gt;name&lt;/code&gt; y &lt;code&gt;price&lt;/code&gt; son campos obligatorios pues no tienen valor por defecto. En contraste, &lt;code&gt;is_offer&lt;/code&gt; es opcional y su valor por defecto es &lt;a href="/python-false/"&gt;&lt;code&gt;False&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ahora, usa una &lt;code&gt;Item&lt;/code&gt; como un parámetro en tu operación POST para crear un nuevo item:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - main.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nd"&gt;@app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/items/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;item_name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;item_price&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;is_offer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_offer&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;FastAPI hará lo siguiente automáticamente:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Leer el cuerpo de la petición como JSON&lt;/li&gt;
&lt;li&gt;Convertir los tipos correspondientes si es necesario&lt;/li&gt;
&lt;li&gt;Validar los datos y devolver un error si, por ejemplo, envías un &lt;em&gt;string&lt;/em&gt; en &lt;code&gt;price&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Entregarte el objeto &lt;code&gt;item&lt;/code&gt; en tu función, con autocompletado en tu editor&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Esta validación automática es una de las grandes ventajas de FastAPI frente a otros &lt;em&gt;frameworks&lt;/em&gt;. No necesitas escribir código de validación manual, lo que reduce la cantidad de errores y simplifica tu código considerablemente.&lt;/p&gt;
&lt;p&gt;Puedes probar este &lt;em&gt;endpoint&lt;/em&gt; con &lt;code&gt;curl&lt;/code&gt; desde tu terminal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;POST&lt;span class="w"&gt; &lt;/span&gt;http://127.0.0.1:8000/items/&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-H&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Content-Type: application/json&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&amp;quot;name&amp;quot;: &amp;quot;Laptop&amp;quot;, &amp;quot;price&amp;quot;: 999.99, &amp;quot;is_offer&amp;quot;: true}&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La respuesta será:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Json&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;item_name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Laptop&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;item_price&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;999.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;is_offer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si omites un campo obligatorio o envías un tipo incorrecto, FastAPI responderá con un error &lt;strong&gt;422&lt;/strong&gt; detallando exactamente qué falló en la validación.&lt;/p&gt;
&lt;h2 id="demo-api-con-fastapi-autos"&gt;Demo API con FastAPI: Autos&lt;/h2&gt;
&lt;p&gt;Ahora que conoces las bases de FastAPI, es momento de reunir todo en un ejemplo más completo. Crearás una pequeña API para gestionar un catálogo de autos que incluye operaciones GET y POST.&lt;/p&gt;
&lt;p&gt;Crea un archivo llamado &lt;code&gt;cars.py&lt;/code&gt; con el siguiente contenido:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - cars.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Base de datos simulada&lt;/span&gt;
&lt;span class="n"&gt;cars_db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&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="s2"&gt;&amp;quot;brand&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Toyota&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Corolla&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;year&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;brand&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Honda&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Civic&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;year&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;

&lt;span class="nd"&gt;@app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/cars/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_cars&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cars_db&lt;/span&gt;

&lt;span class="nd"&gt;@app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/cars/&lt;/span&gt;&lt;span class="si"&gt;{car_id}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;car_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;car&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cars_db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;car&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;car_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;car&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;error&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Auto no encontrado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/cars/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;car&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;new_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cars_db&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;new_car&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;new_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;car&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model_dump&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;
    &lt;span class="n"&gt;cars_db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_car&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;new_car&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, usas una lista de diccionarios como base de datos simulada. La API expone tres &lt;em&gt;endpoints&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;GET /cars/&lt;/code&gt;&lt;/strong&gt;: Devuelve todos los autos del catálogo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;GET /cars/{car_id}&lt;/code&gt;&lt;/strong&gt;: Devuelve un auto específico por su ID usando un parámetro de ruta&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;POST /cars/&lt;/code&gt;&lt;/strong&gt;: Crea un nuevo auto validando los datos con el modelo &lt;code&gt;Car&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ejecuta el servidor con:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;uvicorn&lt;span class="w"&gt; &lt;/span&gt;cars:app&lt;span class="w"&gt; &lt;/span&gt;--reload
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ahora puedes consultar todos los autos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;http://127.0.0.1:8000/cars/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La salida de este comando será la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Json&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;brand&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Toyota&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Corolla&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;year&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;brand&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Honda&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Civic&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;year&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Para obtener un auto específico, puedes usar su &lt;code&gt;id&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;http://127.0.0.1:8000/cars/1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este caso, obtendrás el JSON siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Json&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;brand&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Toyota&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Corolla&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;year&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finalmente, para crear un nuevo auto, puedes hacerlo así:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;POST&lt;span class="w"&gt; &lt;/span&gt;http://127.0.0.1:8000/cars/&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-H&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Content-Type: application/json&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&amp;quot;brand&amp;quot;: &amp;quot;Ford&amp;quot;, &amp;quot;model&amp;quot;: &amp;quot;Mustang&amp;quot;, &amp;quot;year&amp;quot;: 2024}&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Y obtendrás lo siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Json&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;brand&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Ford&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Mustang&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;year&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Con este ejemplo puedes ver cómo FastAPI te permite construir una API funcional con muy pocas líneas de código, combinando parámetros de ruta, modelos Pydantic y múltiples operaciones HTTP.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Las &lt;strong&gt;APIs&lt;/strong&gt; representan una parte esencial del desarrollo de software moderno. Python ofrece varios frameworks que pueden ayudarte a desarrollar APIs robustas y de alto rendimiento.&lt;/p&gt;
&lt;p&gt;En este tutorial, aprendiste cómo usar &lt;strong&gt;FastAPI&lt;/strong&gt;, que es uno de los frameworks más populares y eficientes para el desarrollo de APIs en Python.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En este tutorial, has aprendido a:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instalar&lt;/strong&gt; FastAPI y configurarlo en tu computadora&lt;/li&gt;
&lt;li&gt;Crear tu primera &lt;strong&gt;API&lt;/strong&gt; con un endpoint básico&lt;/li&gt;
&lt;li&gt;Usar &lt;strong&gt;parámetros de ruta&lt;/strong&gt; y &lt;strong&gt;parámetros de query&lt;/strong&gt; para recibir datos&lt;/li&gt;
&lt;li&gt;Validar datos de entrada con &lt;strong&gt;modelos Pydantic&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Aprovechar la &lt;strong&gt;documentación interactiva&lt;/strong&gt; automática&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ahora puedes usar tus conocimientos de Python y FastAPI para dar vida a tus propias APIs. Para seguir profundizando, puedes explorar la &lt;a href="https://fastapi.tiangolo.com/es/" target="_blank"&gt;documentación oficial&lt;/a&gt;, aprender sobre inyección de dependencias, conectar tu API a una base de datos o implementar autenticación con tokens JWT.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Tutoriales/iniciando-con-fastapi-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Tutoriales"/><category term="fastapi"/><category term="web"/><category term="api"/><category term="python"/></entry><entry><title>Palabras clave en Python: try</title><link href="https://pythonscouts.com/python-try/" rel="alternate"/><published>2026-02-08T19:35:00+01:00</published><updated>2026-02-08T19:35:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-02-08:/python-try/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;try&lt;/code&gt; se utiliza para manejar excepciones, permitiéndote ejecutar código que podría fallar y responder adecuadamente ante errores.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Junto con las cláusulas &lt;code&gt;except&lt;/code&gt;, &lt;a href="/python-else/"&gt;&lt;code&gt;else&lt;/code&gt;&lt;/a&gt; y &lt;code&gt;finally&lt;/code&gt;, esta &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; te ofrece un control preciso sobre el flujo de ejecución cuando surgen condiciones inesperadas en tu código.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/try-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-try"&gt;Uso de try&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para usar &lt;code&gt;try&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ExceptionType&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;variable&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;no_error_block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cleanup_block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Los corchetes indican elementos opcionales. Para que un bloque &lt;code&gt;try&lt;/code&gt; sea válido, debes incluir al menos una cláusula &lt;code&gt;except&lt;/code&gt; o una cláusula &lt;code&gt;finally&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos que muestran cómo se utiliza la palabra clave &lt;code&gt;try&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ZeroDivisionError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: división por cero&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;Error: división por cero&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, intentas dividir &lt;code&gt;10&lt;/code&gt; entre &lt;code&gt;0&lt;/code&gt;, lo cual genera una excepción &lt;code&gt;ZeroDivisionError&lt;/code&gt;. Con &lt;code&gt;try&lt;/code&gt; y &lt;code&gt;except&lt;/code&gt;, capturas esta excepción e imprimes un mensaje de error en lugar de que el programa falle.&lt;/p&gt;
&lt;p&gt;Puedes acceder a los detalles de la excepción usando la palabra clave &lt;a href="/python-as/"&gt;&lt;code&gt;as&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;abc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;No se pudo convertir: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;No se pudo convertir: invalid literal for int() with base 10: &amp;#39;abc&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La cláusula &lt;code&gt;else&lt;/code&gt; se ejecuta únicamente cuando no ocurre ninguna excepción:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ZeroDivisionError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: división por cero&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Resultado: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;Resultado: 5.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La cláusula &lt;code&gt;finally&lt;/code&gt; se ejecuta siempre, haya o no una excepción. Esto la hace ideal para liberar recursos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ZeroDivisionError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: división por cero&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Bloque finally ejecutado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;Error: división por cero&lt;/span&gt;
&lt;span class="go"&gt;Bloque finally ejecutado&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;También puedes capturar múltiples excepciones en un solo bloque &lt;code&gt;try&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ZeroDivisionError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: división por cero&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: tipo de dato no válido&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Resultado: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Error: división por cero&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Error: tipo de dato no válido&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Resultado: 5.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;En la práctica, es recomendable capturar excepciones específicas en lugar de usar un &lt;code&gt;except&lt;/code&gt; genérico sin tipo de excepción o usando &lt;code&gt;Exception&lt;/code&gt;. Esto te permite manejar cada error de forma adecuada y personalizada, evitando ocultar errores inesperados en tu código.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h2 id="uso-de-try"&gt;Uso de &lt;code&gt;try&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;try&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manejar excepciones específicas y prevenir que el programa se detenga abruptamente.&lt;/li&gt;
&lt;li&gt;Proporcionar mensajes de error personalizados o realizar acciones específicas cuando ocurren errores.&lt;/li&gt;
&lt;li&gt;Acceder a los detalles de una excepción usando &lt;code&gt;as&lt;/code&gt; para registrar o presentar información útil.&lt;/li&gt;
&lt;li&gt;Ejecutar lógica alternativa con &lt;code&gt;else&lt;/code&gt; cuando el código del bloque &lt;code&gt;try&lt;/code&gt; se ejecuta sin errores.&lt;/li&gt;
&lt;li&gt;Limpiar recursos con la cláusula &lt;code&gt;finally&lt;/code&gt;, asegurando que ciertas acciones se realicen sin importar si ocurrió una excepción o no.&lt;/li&gt;
&lt;li&gt;Combinar &lt;code&gt;try&lt;/code&gt; con la palabra clave &lt;a href="/python-with/"&gt;&lt;code&gt;with&lt;/code&gt;&lt;/a&gt; para gestionar recursos externos de forma segura.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;try&lt;/code&gt; en Python es esencial para el manejo de excepciones, permitiéndote escribir código más robusto y fácil de mantener.&lt;/p&gt;
&lt;p&gt;Conocer y emplear &lt;code&gt;try&lt;/code&gt; junto con &lt;code&gt;except&lt;/code&gt;, &lt;code&gt;else&lt;/code&gt; y &lt;code&gt;finally&lt;/code&gt; te permite gestionar errores de manera clara y controlada, manteniendo tu programa funcionando sin interrupciones inesperadas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/try-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: in</title><link href="https://pythonscouts.com/python-in/" rel="alternate"/><published>2026-02-05T21:00:00+01:00</published><updated>2026-02-05T21:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-02-05:/python-in/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;in&lt;/code&gt; te permite verificar la pertenencia de un elemento en una secuencia o iterar sobre un iterable.&lt;/p&gt;</summary><content type="html">&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/in-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-in"&gt;Uso de in&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis de la &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; &lt;code&gt;in&lt;/code&gt; como operador de pertenencia es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sequence&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Para los bucles &lt;a href="/python-for/"&gt;&lt;code&gt;for&lt;/code&gt;&lt;/a&gt;, la sintaxis es:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sequence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos de cómo puedes usar la palabra clave &lt;code&gt;in&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;manzana&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="ow"&gt;in&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="ow"&gt;in&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El operador &lt;code&gt;in&lt;/code&gt; devuelve &lt;a href="/python-true/"&gt;&lt;code&gt;True&lt;/code&gt;&lt;/a&gt; cuando el elemento existe en la colección y &lt;a href="/python-false/"&gt;&lt;code&gt;False&lt;/code&gt;&lt;/a&gt; en caso contrario.&lt;/p&gt;
&lt;p&gt;Cuando usas &lt;code&gt;in&lt;/code&gt; en un bucle &lt;code&gt;for&lt;/code&gt;, puedes iterar a través de cada elemento de un iterable:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;letter&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;hola&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;letter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;h&lt;/span&gt;
&lt;span class="go"&gt;o&lt;/span&gt;
&lt;span class="go"&gt;l&lt;/span&gt;
&lt;span class="go"&gt;a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este caso, se itera a través de cada carácter de la cadena &lt;code&gt;"hola"&lt;/code&gt;, imprimiéndolos uno por uno.&lt;/p&gt;
&lt;h2 id="uso-de-in"&gt;Uso de &lt;code&gt;in&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;in&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comprobar si un elemento está presente en una colección como listas, tuplas, cadenas, conjuntos o diccionarios.&lt;/li&gt;
&lt;li&gt;Verificar si una clave existe en un diccionario.&lt;/li&gt;
&lt;li&gt;Iterar sobre elementos de un iterable utilizando bucles &lt;code&gt;for&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Comprobar si un elemento &lt;strong&gt;no&lt;/strong&gt; pertenece a una colección combinando &lt;a href="/python-not/"&gt;&lt;code&gt;not&lt;/code&gt;&lt;/a&gt; con &lt;code&gt;in&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;in&lt;/code&gt; te permite verificar la pertenencia de elementos en secuencias. También es clave en ciclos &lt;code&gt;for&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Conocer y emplear &lt;code&gt;in&lt;/code&gt; de forma eficiente te ayudará a escribir código más claro y conciso al trabajar con colecciones de datos. Consulta también los artículos sobre &lt;code&gt;not&lt;/code&gt;, &lt;code&gt;for&lt;/code&gt; y &lt;a href="/estructuras-de-datos-en-python/"&gt;colecciones&lt;/a&gt; para ampliar tus conocimientos.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/in-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: not</title><link href="https://pythonscouts.com/python-not/" rel="alternate"/><published>2026-01-31T12:00:00+01:00</published><updated>2026-01-31T12:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-01-31:/python-not/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;not&lt;/code&gt; es un operador lógico que se utiliza para invertir el valor de verdad de una expresión u objeto.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Cuando usas &lt;code&gt;not&lt;/code&gt;, estás diciendo esencialmente "no" al valor de verdad que se evalúa, convirtiendo &lt;code&gt;True&lt;/code&gt; en &lt;code&gt;False&lt;/code&gt; y viceversa.&lt;/p&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis para utilizar &lt;code&gt;not&lt;/code&gt; es bastante sencilla:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt;
&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, &lt;code&gt;expression&lt;/code&gt; es cualquier &lt;a href="/expresiones-python/"&gt;expresión&lt;/a&gt; que retorne un valor booleano o no. Mientras que &lt;code&gt;obj&lt;/code&gt; es cualquier objeto Python.&lt;/p&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Veamos algunos ejemplos de cómo puedes usar &lt;code&gt;not&lt;/code&gt; en Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En estos ejemplos, puedes ver la lógica de funcionamiento del operador. Cuando ejecutas &lt;code&gt;not True&lt;/code&gt;, el resultado es &lt;a href="/python-false/"&gt;&lt;code&gt;False&lt;/code&gt;&lt;/a&gt; y &lt;code&gt;not False&lt;/code&gt; se convierte en &lt;a href="/python-true/"&gt;&lt;code&gt;True&lt;/code&gt;&lt;/a&gt;. También puedes ver cómo se puede aplicar &lt;code&gt;not&lt;/code&gt; a expresiones más complejas como comparaciones.&lt;/p&gt;
&lt;p&gt;A diferencia de otros operadores lógicos como &lt;a href="/python-and/"&gt;&lt;code&gt;and&lt;/code&gt;&lt;/a&gt; y &lt;a href="/python-or/"&gt;&lt;code&gt;or&lt;/code&gt;&lt;/a&gt;, &lt;code&gt;not&lt;/code&gt; siempre devuelve un valor booleano:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cuando empleas &lt;code&gt;not&lt;/code&gt; con objetos o &lt;a href="/valores-python/"&gt;valores&lt;/a&gt;, en lugar de con expresiones booleanas, Python determina el valor de verdad del objeto y lo convierte en el valor opuesto.&lt;/p&gt;
&lt;p&gt;También puedes combinar &lt;code&gt;not&lt;/code&gt; con &lt;code&gt;and&lt;/code&gt; y &lt;code&gt;or&lt;/code&gt;. Estos operadores son fundamentales para construir &lt;a href="/condicionales-python/"&gt;condiciones&lt;/a&gt; y controlar el flujo de tus programas.&lt;/p&gt;
&lt;h2 id="uso-de-not"&gt;Uso de &lt;code&gt;not&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;not&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Invertir el valor de una expresión booleana en sentencias de control de flujo, como &lt;code&gt;if&lt;/code&gt; y &lt;a href="/python-while/"&gt;&lt;code&gt;while&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Simplificar las condiciones lógicas en el código para hacerlo más legible.&lt;/li&gt;
&lt;li&gt;Negar condiciones en expresiones condicionales para ejecutar bloques de código específicos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;not&lt;/code&gt; en Python invierte el valor de verdad de un objeto, lo que te permite tener un mayor control sobre las condiciones lógicas en tu código.&lt;/p&gt;
&lt;p&gt;Conocer y usar &lt;code&gt;not&lt;/code&gt; de forma eficiente puede simplificar tus sentencias de control de flujo y mejorar la claridad del código al manejar condiciones negativas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/not-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: yield</title><link href="https://pythonscouts.com/python-yield/" rel="alternate"/><published>2026-01-22T16:00:00+01:00</published><updated>2026-01-22T16:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-01-22:/python-yield/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;yield&lt;/code&gt; se utiliza en una función para convertirla en un generador que produce una secuencia de valores de manera eficiente.&lt;/p&gt;</summary><content type="html">&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis para utilizar &lt;code&gt;yield&lt;/code&gt; en una función es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generator&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Solo necesitas incluir la &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; &lt;code&gt;yield&lt;/code&gt; seguida del &lt;a href="/valores-python/"&gt;valor&lt;/a&gt; que deseas devolver.&lt;/p&gt;
&lt;p&gt;Los generadores también pueden incluir varios &lt;code&gt;yield&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;gen_numbers&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finalmente, es común usar &lt;code&gt;yield&lt;/code&gt; en un &lt;a href="/ciclos-for-python/"&gt;ciclo &lt;code&gt;for&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;gen_numbers&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="ow"&gt;in&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;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Veamos un ejemplo de cómo se usa la palabra clave &lt;code&gt;yield&lt;/code&gt; en Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;gen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;StopIteration&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, la función &lt;code&gt;counter()&lt;/code&gt; es un generador que utiliza &lt;code&gt;yield&lt;/code&gt; para devolver los valores &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt; y &lt;code&gt;2&lt;/code&gt;, uno a la vez, cada vez que se llama a &lt;code&gt;next()&lt;/code&gt; en el generador.&lt;/p&gt;
&lt;p&gt;Si intentas llamar a &lt;code&gt;next(gen)&lt;/code&gt; una vez que el generador ha producido todos sus valores, Python lanzará una excepción &lt;code&gt;StopIteration&lt;/code&gt;. Esta excepción indica que no quedan más elementos por generar y es el comportamiento esperado para finalizar la iteración.&lt;/p&gt;
&lt;p&gt;En la mayoría de los casos, usarás un ciclo &lt;a href="/python-for/"&gt;&lt;code&gt;for&lt;/code&gt;&lt;/a&gt; para iterar sobre el generador:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, el ciclo for gestiona automáticamente el fin de la iteración cuando ocurre la excepción &lt;code&gt;StopIteration&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="uso-de-yield"&gt;Uso de &lt;code&gt;yield&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;yield&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crear generadores que producen una secuencia de valores donde cada valor se genera bajo demanda, lo cual es útil para manejar grandes cantidades de datos haciendo un uso eficiente de la memoria.&lt;/li&gt;
&lt;li&gt;Implementar algoritmos que requieren una pausa y reanudación de su estado, como iteradores personalizados.&lt;/li&gt;
&lt;li&gt;Mejorar la eficiencia de memoria al no requerir que se almacenen todos los valores en la memoria al mismo tiempo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;yield&lt;/code&gt; en Python te permite crear generadores para gestionar y procesar grandes cantidades de datos de manera eficiente y con un uso mínimo de memoria.&lt;/p&gt;
&lt;p&gt;Conocer y emplear &lt;code&gt;yield&lt;/code&gt; te permite escribir código más eficiente y legible, especialmente cuando trabajas con flujos de datos continuos o grandes.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/yield-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: from</title><link href="https://pythonscouts.com/python-from/" rel="alternate"/><published>2026-01-21T13:05:00+01:00</published><updated>2026-01-21T13:05:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-01-21:/python-from/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;from&lt;/code&gt; se utiliza principalmente para importar módulos y sus componentes específicos de manera que puedas usarlos directamente en tu código.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Esta &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; se emplea generalmente en combinación con &lt;a href="/python-import/"&gt;&lt;code&gt;import&lt;/code&gt;&lt;/a&gt; y permite acceder solo a objetos específicos de un módulo sin cargar todo el contenido del módulo.&lt;/p&gt;
&lt;p&gt;Además, &lt;code&gt;from&lt;/code&gt; tiene otros usos en Python:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Con &lt;a href="/python-raise/"&gt;&lt;code&gt;raise&lt;/code&gt;&lt;/a&gt;: Encadena excepciones y preserva el contexto del error original.&lt;/li&gt;
&lt;li&gt;Con &lt;code&gt;yield&lt;/code&gt;: Delega la iteración a otro generador o iterable.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/from-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-from"&gt;Uso de from&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para utilizar &lt;code&gt;from&lt;/code&gt; junto con &lt;a href="/python-import/"&gt;&lt;code&gt;import&lt;/code&gt;&lt;/a&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;module_name&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;specific_component&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si necesitas crear un alias para evitar conflictos de nombres o simplificar el uso, puedes usar &lt;a href="/python-as/"&gt;&lt;code&gt;as&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;module_name&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;specific_component&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;alias&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;También puedes importar múltiples componentes separados por comas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;module_name&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;component1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;component2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Además, puedes usar &lt;code&gt;*&lt;/code&gt; para importar todos los componentes del módulo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;module_name&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Esta sintaxis se conoce como &lt;strong&gt;wildcard import&lt;/strong&gt; y es común en secciones de trabajo interactivas. Sin embargo, no se recomienda usarla en código en producción pues puede causar conflictos de nombres y dificultar la depuración.&lt;/p&gt;
&lt;p&gt;Sintaxis para el uso con &lt;a href="/python-raise/"&gt;&lt;code&gt;raise&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;NewException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mensaje&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;original_exception&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si deseas suprimir el contexto de la excepción original, puedes usar &lt;a href="/python-none/"&gt;&lt;code&gt;None&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;NewException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mensaje&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sintaxis para el uso con &lt;code&gt;yield&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;iterable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Esta sintaxis equivale a iterar sobre el iterable y producir cada elemento uno por uno.&lt;/p&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí hay algunos ejemplos que ilustran cómo se usa la palabra clave &lt;code&gt;from&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pi&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt;
&lt;span class="go"&gt;3.141592653589793&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, solo se importa &lt;code&gt;pi&lt;/code&gt; del módulo &lt;code&gt;math&lt;/code&gt;, permitiéndote usarlo directamente sin tener que prefijarlo con &lt;code&gt;math&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;future&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&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="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;future&lt;/span&gt;
&lt;span class="go"&gt;datetime.datetime(2023, 10, 27, 15, 34, 50, 401213)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, se importan &lt;code&gt;datetime&lt;/code&gt; y &lt;code&gt;timedelta&lt;/code&gt; del módulo &lt;code&gt;datetime&lt;/code&gt;. Esto permite trabajar con fechas y tiempos de manera más directa.&lt;/p&gt;
&lt;p&gt;A continuación, un ejemplo de encadenamiento de excepciones con &lt;code&gt;raise from&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;connect_to_database&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connection_string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="c1"&gt;# Código de conexión&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ConnectionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;no se pudo conectar al servidor&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ConnectionError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;error en la base de datos&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;error&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;connect_to_database&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;localhost:5432&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;ConnectionError&lt;/span&gt;: &lt;span class="n"&gt;no se pudo conectar al servidor&lt;/span&gt;

&lt;span class="gt"&gt;The above exception was the direct cause of the following exception:&lt;/span&gt;

&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;RuntimeError&lt;/span&gt;: &lt;span class="n"&gt;error en la base de datos&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, se preserva la excepción original (&lt;code&gt;ConnectionError&lt;/code&gt;) como causa directa del nuevo error (&lt;code&gt;RuntimeError&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Finalmente, un ejemplo de delegación de iteración con &lt;code&gt;yield from&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="n"&gt;second&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;combine&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;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="go"&gt;[1, 2, 3, 4]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, &lt;code&gt;yield from&lt;/code&gt; delega la iteración a cada lista, produciendo sus elementos sin necesidad de un bucle explícito.&lt;/p&gt;
&lt;h2 id="uso-de-from"&gt;Uso de &lt;code&gt;from&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;from&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Importar componentes específicos de un módulo para mantener el namespace limpio y mejorar la legibilidad.&lt;/li&gt;
&lt;li&gt;Evitar conflictos de nombres al importar solo lo necesario.&lt;/li&gt;
&lt;li&gt;Hacer el código más limpio y fácil de entender al eliminar la necesidad de prefijos de módulo para componentes importados.&lt;/li&gt;
&lt;li&gt;Permitir la importación de múltiples componentes de un módulo en una sola línea.&lt;/li&gt;
&lt;li&gt;Encadenar excepciones con &lt;code&gt;raise ... from ...&lt;/code&gt; para preservar el contexto del error original.&lt;/li&gt;
&lt;li&gt;Delegar la iteración a otro generador o iterable con &lt;code&gt;yield from&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;from&lt;/code&gt; en Python es una herramienta versátil con múltiples usos: importar componentes específicos de módulos, encadenar excepciones con &lt;code&gt;raise&lt;/code&gt; y delegar iteraciones con &lt;code&gt;yield&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Dominar estos usos te permite escribir código más claro, modular y expresivo en diferentes contextos de programación.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/from-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: or</title><link href="https://pythonscouts.com/python-or/" rel="alternate"/><published>2026-01-09T18:35:00+01:00</published><updated>2026-01-09T18:35:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-01-09:/python-or/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;or&lt;/code&gt; es un operador lógico que se utiliza para evaluar dos expresiones y devuelve &lt;code&gt;True&lt;/code&gt; si al menos una es verdadera.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Este operador se emplea para combinar condiciones lógicas y es fundamental para la toma de decisiones en el flujo de un programa.&lt;/p&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis para utilizar &lt;code&gt;or&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;expr1&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;expr2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Donde &lt;code&gt;expr1&lt;/code&gt; y &lt;code&gt;expr2&lt;/code&gt; son las expresiones lógicas que deseas evaluar. Si alguna de ellas es verdadera, el resultado será &lt;a href="/python-true/"&gt;&lt;code&gt;True&lt;/code&gt;&lt;/a&gt;. Si ambas son falsas, el resultado es &lt;a href="/python-false/"&gt;&lt;code&gt;False&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;El operador &lt;code&gt;or&lt;/code&gt; aplica lo que se conoce como evaluación diferida (short-circuiting): si &lt;code&gt;expr1&lt;/code&gt; es verdadera, entonces Python no evalúa &lt;code&gt;expr2&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Además, &lt;code&gt;or&lt;/code&gt; devuelve el primer operando con valor de verdad verdadero (truthy). Si ninguno es verdadero, devuelve el último operando. Por lo tanto, no siempre devuelve &lt;code&gt;True&lt;/code&gt; o &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La tabla de verdad del operador cuando lo usamos con expresiones lógicas se resume a continuación:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;code&gt;expression_1&lt;/code&gt; (bool)&lt;/th&gt;
&lt;th&gt;&lt;code&gt;expression_2&lt;/code&gt; (bool)&lt;/th&gt;
&lt;th&gt;&lt;code&gt;expression_1 or expression_2&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos prácticos que muestran cómo se usa el operador &lt;code&gt;or&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;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;6&lt;/span&gt; &lt;span class="ow"&gt;or&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;4&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En estos ejemplos, el operador &lt;code&gt;or&lt;/code&gt; evalúa las expresiones a la izquierda y a la derecha. Si alguna de las expresiones es verdadera, el resultado de toda la expresión es &lt;code&gt;True&lt;/code&gt;. En el caso de que ambas expresiones sean falsas, el resultado es &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si usamos &lt;code&gt;or&lt;/code&gt; con objetos concretos o con expresiones que retornan objetos distintos de &lt;code&gt;True&lt;/code&gt; o &lt;code&gt;False&lt;/code&gt;, tenemos el comportamiento siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;default&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="go"&gt;5&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="go"&gt;5&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="go"&gt;[]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En estos ejemplos, el operador devuelve objetos concretos en lugar de los valores &lt;code&gt;True&lt;/code&gt; o &lt;code&gt;False&lt;/code&gt;. Esto se debe a que todo objeto en Python tiene un valor de verdad intrínseco. Estos son los objetos considerados falsos:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;constantes definidas para tener valor falso: &lt;code&gt;None&lt;/code&gt; y &lt;code&gt;False&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;cero en cualquiera de los diferentes tipos numéricos: &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;0.0&lt;/code&gt;, &lt;code&gt;0j&lt;/code&gt;, &lt;code&gt;Decimal(0)&lt;/code&gt;, &lt;code&gt;Fraction(0, 1)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;cualquier colección o secuencia vacía: &lt;code&gt;''&lt;/code&gt;, &lt;code&gt;()&lt;/code&gt;, &lt;code&gt;[]&lt;/code&gt;, &lt;code&gt;{}&lt;/code&gt;, &lt;code&gt;set()&lt;/code&gt;, &lt;code&gt;range(0)&lt;/code&gt; (&lt;a href="https://docs.python.org/es/3.14/library/stdtypes.html#truth-value-testing" target="_blank"&gt;Fuente&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;El resto de los objetos son considerados verdaderos a menos que su clase defina un método &lt;code&gt;.__bool__()&lt;/code&gt; que devuelva &lt;code&gt;False&lt;/code&gt; o un método &lt;code&gt;.__len__()&lt;/code&gt; que devuelva zero.&lt;/p&gt;
&lt;h2 id="uso-de-or"&gt;Uso de &lt;code&gt;or&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;or&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Evaluar múltiples condiciones en declaraciones de control de flujo como &lt;a href="/python-if/"&gt;&lt;code&gt;if&lt;/code&gt;&lt;/a&gt;, &lt;a href="/python-while/"&gt;&lt;code&gt;while&lt;/code&gt;&lt;/a&gt;, o &lt;a href="/python-assert/"&gt;&lt;code&gt;assert&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Simplificar la lógica condicional al permitir que al menos una condición sea verdadera para que la expresión completa sea verdadera.&lt;/li&gt;
&lt;li&gt;Utilizar en expresiones booleanas para determinar el flujo de un programa.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;or&lt;/code&gt; es un operador lógico esencial en Python y permite evaluar múltiples condiciones y devolver &lt;code&gt;True&lt;/code&gt; si al menos una es verdadera o &lt;code&gt;False&lt;/code&gt; si ambas son falsas.&lt;/p&gt;
&lt;p&gt;Conocer y utilizar &lt;code&gt;or&lt;/code&gt; te ayuda a escribir código más eficiente y legible al simplificar la lógica condicional en tus programas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/or-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: raise</title><link href="https://pythonscouts.com/python-raise/" rel="alternate"/><published>2026-01-06T10:00:00+01:00</published><updated>2026-01-06T10:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-01-06:/python-raise/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;raise&lt;/code&gt; se utiliza para generar una excepción de manera explícita en tu código.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Te permite señalar la ocurrencia de un error que debe manejarse, interrumpiendo el flujo normal de ejecución y activando el mecanismo de manejo de excepciones.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/raise-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-raise"&gt;Uso de raise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para usar &lt;code&gt;raise&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;ExceptionType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mensaje opcional&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, &lt;code&gt;ExceptionType&lt;/code&gt; es el tipo de excepción que deseas generar o lanzar, y el &lt;code&gt;"mensaje opcional"&lt;/code&gt; proporciona más detalles sobre la excepción.&lt;/p&gt;
&lt;p&gt;Para encadenar excepciones y conservar el contexto del error original, puedes usar la &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; &lt;code&gt;from&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;NewException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mensaje&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;original_exception&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Esto permite que la nueva excepción conserve la traza (traceback) de la excepción original, facilitando la depuración.&lt;/p&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos que muestran cómo usar &lt;code&gt;raise&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;este es un error de valor&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;ValueError&lt;/span&gt;: &lt;span class="n"&gt;este es un error de valor&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, &lt;code&gt;raise&lt;/code&gt; genera un &lt;code&gt;ValueError&lt;/code&gt; con un mensaje personalizado.&lt;/p&gt;
&lt;p&gt;También puedes definir tus propias excepciones personalizadas y generarlas con &lt;code&gt;raise&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CustomException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;CustomException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;esto es un error personalizado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;CustomException&lt;/span&gt;: &lt;span class="n"&gt;esto es un error personalizado&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, defines una nueva clase de excepción llamada &lt;code&gt;CustomException&lt;/code&gt; que hereda de &lt;code&gt;Exception&lt;/code&gt;, y luego la lanzas usando &lt;code&gt;raise&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;abc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;original_error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;error al convertir a entero&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;original_error&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;ValueError&lt;/span&gt;: &lt;span class="n"&gt;invalid literal for int() with base 10: &amp;#39;abc&amp;#39;&lt;/span&gt;

&lt;span class="gt"&gt;The above exception was the direct cause of the following exception:&lt;/span&gt;

&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;RuntimeError&lt;/span&gt;: &lt;span class="n"&gt;error al convertir a entero&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, &lt;code&gt;raise ... from ...&lt;/code&gt; permite que la excepción &lt;code&gt;RuntimeError&lt;/code&gt; conserve la traza de la excepción original, facilitando la depuración.&lt;/p&gt;
&lt;p&gt;En la práctica, debes generar excepciones en código de bajo nivel (backend) y capturarlas en código de alto nivel (frontend).&lt;/p&gt;
&lt;h2 id="uso-de-raise"&gt;Uso de &lt;code&gt;raise&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;raise&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generar excepciones personalizadas para indicar condiciones de error específicas.&lt;/li&gt;
&lt;li&gt;Interrumpir el flujo de ejecución normal cuando se detecta un error que no puede manejarse en el contexto actual.&lt;/li&gt;
&lt;li&gt;Proporcionar mensajes de error contextualizados que ayuden a depurar problemas en el código.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;raise&lt;/code&gt; es una herramienta para el manejo de excepciones que te permite generar errores de manera explícita cuando las condiciones del programa lo requieran.&lt;/p&gt;
&lt;p&gt;El uso correcto de &lt;code&gt;raise&lt;/code&gt; contribuye a la robustez y mantenibilidad de tu código.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/raise-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: elif</title><link href="https://pythonscouts.com/python-elif/" rel="alternate"/><published>2026-01-03T20:45:00+01:00</published><updated>2026-01-03T20:45:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-01-03:/python-elif/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;elif&lt;/code&gt; te permite evaluar múltiples condiciones de forma clara y eficiente.&lt;/p&gt;</summary><content type="html">&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/elif-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-elif"&gt;Uso de elif&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para emplear la palabra clave &lt;code&gt;elif&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Código si condition1 es verdadera&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;condition2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Código si condition2 es verdadera&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;conditionN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Código si conditionN es verdadera&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;# Código si ninguna de las condiciones anteriores es verdadera&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Veamos un ejemplo de cómo puedes usar la palabra clave &lt;code&gt;elif&lt;/code&gt; en Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x es negativo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;x&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="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x es cero&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x es diez&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x es positivo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;x es diez&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, &lt;code&gt;x&lt;/code&gt; es &lt;code&gt;10&lt;/code&gt;. La primera condición &lt;code&gt;if&lt;/code&gt; es falsa; el primer &lt;code&gt;elif&lt;/code&gt; también es falso, pero el segundo &lt;code&gt;elif&lt;/code&gt; es verdadero, por lo que se ejecuta ese bloque y se imprime &lt;code&gt;"x es diez"&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Debes tener en cuenta que &lt;code&gt;elif&lt;/code&gt; se adecúa mejor a situaciones donde tus condiciones son mutuamente excluyentes y evalúan el estado de una misma variable. Python evalúa las ramas en orden y ejecuta solo la primera condición verdadera, por lo que usar &lt;code&gt;elif&lt;/code&gt; deja claro que solo una rama debe ejecutarse.&lt;/p&gt;
&lt;p&gt;Un ejemplo típico de condiciones mutuamente excluyentes es cuando necesitas clasificar códigos de estado HTTP según su rango de valores:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Respuesta informativa&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Respuesta exitosa&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Redirección&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error del cliente&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error del servidor&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Código desconocido&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;Error del cliente&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, todas las condiciones evalúan el estado de una misma variable, &lt;code&gt;status_code&lt;/code&gt;, y solo una rama debe ejecutarse. Por eso, &lt;code&gt;elif&lt;/code&gt; es la opción natural.&lt;/p&gt;
&lt;p&gt;Si necesitas comprobar condiciones independientes donde podrían cumplirse varias, utiliza un bloque &lt;code&gt;if&lt;/code&gt; separado para cada una.&lt;/p&gt;
&lt;h2 id="uso-de-elif"&gt;Uso de &lt;code&gt;elif&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;elif&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Verificar múltiples condiciones para tomar decisiones en el flujo de control.&lt;/li&gt;
&lt;li&gt;Mejorar la legibilidad al organizar claramente condiciones mutuamente excluyentes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;elif&lt;/code&gt; en Python te permite manejar múltiples condiciones dentro de una sentencia &lt;code&gt;if&lt;/code&gt;. Al usar &lt;code&gt;elif&lt;/code&gt;, puedes mejorar la legibilidad de tu código cuando necesitas evaluar más de dos condiciones.&lt;/p&gt;
&lt;p&gt;Conocer y emplear &lt;code&gt;elif&lt;/code&gt; te permitirá escribir código más claro y eficiente en tus programas de Python.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/elif-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Iniciando con Kivy para desarrollo GUI</title><link href="https://pythonscouts.com/iniciando-con-kivy-python/" rel="alternate"/><published>2026-01-02T16:45:00+01:00</published><updated>2026-01-02T16:45:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2026-01-02:/iniciando-con-kivy-python/</id><summary type="html">&lt;p&gt;Kivy es un framework para construir aplicaciones con interfaz gráfica (GUI) multiplataforma. Provee widgets, layouts, eventos y más.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Si quieres crear interfaces gráficas en Python con un enfoque moderno y con soporte para gestos y multitouch en dispositivos móviles y táctiles, Kivy es una buena opción.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Tutoriales/iniciando-con-kivy-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#conociendo-kivy"&gt;Conociendo Kivy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#instalando-kivy"&gt;Instalando Kivy&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#en-windows"&gt;En Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#en-linux-y-macos"&gt;En Linux y macOS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#creando-una-aplicacion-kivy"&gt;Creando una aplicación Kivy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#explorando-widgets-comunes-en-kivy"&gt;Explorando widgets comunes en Kivy&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#botones-clicables"&gt;Botones clicables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#campos-de-entrada-de-texto"&gt;Campos de entrada de texto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#botones-de-opcion"&gt;Botones de opción&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#selectores-deslizantes"&gt;Selectores deslizantes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#listas-desplegables"&gt;Listas desplegables&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#usando-gestores-de-disposicion"&gt;Usando gestores de disposición&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#disponer-widgets-en-vertical-u-horizontal"&gt;Disponer widgets en vertical u horizontal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#organizar-widgets-en-cuadriculas"&gt;Organizar widgets en cuadrículas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#colocar-widgets-en-posiciones-especificas"&gt;Colocar widgets en posiciones específicas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conectando-eventos-con-callbacks-en-kivy"&gt;Conectando eventos con callbacks en Kivy&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#enlazar-eventos"&gt;Enlazar eventos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#enlazar-propiedades"&gt;Enlazar propiedades&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#separando-la-interfaz-de-la-logica-con-kv-language"&gt;Separando la interfaz de la lógica con KV language&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="conociendo-kivy"&gt;Conociendo Kivy&lt;/h2&gt;
&lt;p&gt;Kivy es un framework para crear aplicaciones con interfaces gráficas en Python. Está pensado para UI con soporte multitouch y puede ejecutarse en varios sistemas operativos.&lt;/p&gt;
&lt;p&gt;Kivy funciona muy bien cuando:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quieres una GUI en Python con componentes y layouts listos para usar&lt;/li&gt;
&lt;li&gt;Te interesa reutilizar la misma base de código en escritorio y, más adelante, empaquetar para móviles&lt;/li&gt;
&lt;li&gt;Prefieres un enfoque declarativo para la interfaz y dejar la lógica de negocio en Python&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="instalando-kivy"&gt;Instalando Kivy&lt;/h2&gt;
&lt;p&gt;La forma recomendada de instalar Kivy es usar un &lt;a href="/entorno-virtual-python/"&gt;entorno virtual&lt;/a&gt; y luego instalar el framework desde &lt;a href="https://pypi.org/project/Kivy/" target="_blank"&gt;PyPI&lt;/a&gt;. Los comandos necesarios pueden variar un poco según tu sistema operativo.&lt;/p&gt;
&lt;h3 id="en-windows"&gt;En Windows&lt;/h3&gt;
&lt;p&gt;En Windows, puedes crear el entorno virtual e instalar Kivy ejecutando los comandos siguientes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Powershell&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;-m&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt;
&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Scripts&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Activate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ps1&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;-m&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;kivy[base]&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Con estos comandos, primero creas y activas un entorno virtual de Python y luego instalas Kivy desde PyPI. Opcionalmente, puedes instalar los ejemplos de Kivy con el paquete &lt;code&gt;kivy_examples&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="en-linux-y-macos"&gt;En Linux y macOS&lt;/h3&gt;
&lt;p&gt;En Linux y macOS el proceso es similar y puedes realizarlo con los siguientes comandos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;venv&lt;span class="w"&gt; &lt;/span&gt;venv
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;venv/bin/activate
&lt;span class="gp gp-VirtualEnv"&gt;(venv)&lt;/span&gt; &lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;kivy[base]&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Kivy también ofrece las variantes &lt;code&gt;kivy[base,media]&lt;/code&gt; o &lt;code&gt;kivy[full]&lt;/code&gt; para incluir más opciones y funcionalidades, como, por ejemplo, el manejo de audio y video. Si estás comenzando, &lt;code&gt;kivy[base]&lt;/code&gt; suele ser suficiente.&lt;/p&gt;
&lt;h2 id="creando-una-aplicacion-kivy"&gt;Creando una aplicación Kivy&lt;/h2&gt;
&lt;p&gt;Una aplicación mínima en Kivy generalmente requiere que sigas los pasos siguientes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Crear una subclase de &lt;code&gt;App&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Implementar el método &lt;code&gt;.build()&lt;/code&gt; para devolver el widget raíz de la UI.&lt;/li&gt;
&lt;li&gt;Crear una instancia de la clase y llamar su método &lt;code&gt;.run()&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Para traducir estos pasos a código Python, guarda el código siguiente como &lt;code&gt;hello.py&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - hello.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.label&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Label&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HelloApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola, Mundo!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;HelloApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, importas &lt;code&gt;App&lt;/code&gt; como la clase base de tu aplicación. También importas &lt;code&gt;Label&lt;/code&gt; para mostrar texto en pantalla. Luego defines &lt;code&gt;HelloApp&lt;/code&gt; heredando de &lt;code&gt;App&lt;/code&gt; e implementas &lt;code&gt;.build()&lt;/code&gt; para construir la interfaz. El widget que devuelves en este método será la raíz del árbol de widgets de Kivy. En este ejemplo, usas el &lt;code&gt;Label&lt;/code&gt; con el texto &lt;code&gt;Hola, Mundo!&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Por último, creas la instancia de &lt;code&gt;HelloApp&lt;/code&gt; y llamas al método &lt;code&gt;.run()&lt;/code&gt;. Con esto, Kivy inicia la aplicación y su bucle principal de eventos, abre la ventana y renderiza el &lt;code&gt;Label&lt;/code&gt; que devolviste en &lt;code&gt;.build()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Puedes ejecutar la aplicación con el comando siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;hello.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Una vez que ejecutas este comando, verás en pantalla una ventana que luce como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-kivy-python/kivy-demo-app.png" class="mx-auto d-block mt-2" style="max-width: 800px; width: 100%; height: auto;" alt="Aplicación 'Hola, Mundo!' con Kivy y Python"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Aplicación "Hola, Mundo!" con Kivy y Python&lt;/em&gt;&lt;/div&gt;

&lt;h2 id="explorando-widgets-comunes-en-kivy"&gt;Explorando widgets comunes en Kivy&lt;/h2&gt;
&lt;p&gt;En Kivy, una interfaz (UI) es un árbol de widgets. Muchos widgets exponen eventos, como &lt;code&gt;on_press&lt;/code&gt; en un &lt;code&gt;Button&lt;/code&gt;. También tienen propiedades como &lt;code&gt;.text&lt;/code&gt;, &lt;code&gt;.active&lt;/code&gt; o &lt;code&gt;.value&lt;/code&gt;, que puedes vincular con &lt;code&gt;.bind()&lt;/code&gt; para reaccionar a eventos de usuario.&lt;/p&gt;
&lt;p&gt;En las siguientes secciones, encontrarás una selección de widgets básicos que te ayudarán a comprender conceptos fundamentales para empezar a crear tus GUIs con Kivy.&lt;/p&gt;
&lt;h3 id="botones-clicables"&gt;Botones clicables&lt;/h3&gt;
&lt;p&gt;La clase &lt;code&gt;Button&lt;/code&gt; ofrece un widget clicable en forma rectangular. Algunos botones típicos incluyen &lt;em&gt;Ok&lt;/em&gt;, &lt;em&gt;Cancelar&lt;/em&gt;, &lt;em&gt;Aplicar&lt;/em&gt;, &lt;em&gt;Sí&lt;/em&gt;, &lt;em&gt;No&lt;/em&gt;, &lt;em&gt;Cerrar&lt;/em&gt;, entre otros. He aquí un ejemplo que crea estos botones:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - buttons.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.core.window&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.boxlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.button&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ButtonsApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Botones Kivy&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;vertical&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spacing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Ok&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cancelar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Aplicar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Sí&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;No&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cerrar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;layout&lt;/span&gt;
    
&lt;span class="n"&gt;ButtonsApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, la clase &lt;code&gt;ButtonsApp&lt;/code&gt; crea una ventana que muestra varios botones en una columna. En &lt;code&gt;.build()&lt;/code&gt;, primero configuras la ventana con un título y un tamaño apropiado. Luego, creas un &lt;code&gt;BoxLayout&lt;/code&gt; vertical con &lt;code&gt;padding&lt;/code&gt; y &lt;code&gt;spacing&lt;/code&gt; para garantizar margen interno y separación entre los botones.&lt;/p&gt;
&lt;p&gt;El &lt;a href="/ciclos-for-python/"&gt;ciclo &lt;code&gt;for&lt;/code&gt;&lt;/a&gt; recorre la lista de botones y los crea para luego añadirlos al layout con &lt;code&gt;.add_widget()&lt;/code&gt;. Al final, &lt;code&gt;.build()&lt;/code&gt; devuelve el layout como widget raíz.&lt;/p&gt;
&lt;p&gt;Cuando corres la aplicación, obtienes una ventana como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-kivy-python/kivy-botones.png" class="mx-auto d-block mt-2" alt="Botones en Kivy"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Botones en Kivy&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Estos botones todavía no ejecutan ninguna acción al hacer clic en ellos, pues aún no están vinculados o enlazados a una función o método. Aprenderás sobre esto en la sección &lt;a href="#conectando-eventos-con-callbacks-en-kivy"&gt;"Conectando eventos con callbacks en Kivy"&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="campos-de-entrada-de-texto"&gt;Campos de entrada de texto&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;TextInput&lt;/code&gt; permite que el usuario escriba texto. Considera el siguiente ejemplo que crea un formulario para entrada de credenciales de usuario:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - text_inputs.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.core.window&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.boxlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.textinput&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TextInput&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TextInputApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Campos de texto Kivy&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;vertical&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spacing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Nombre&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Usuario&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Contraseña&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TextInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;hint_text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;multiline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;layout&lt;/span&gt;

&lt;span class="n"&gt;TextInputApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este ejemplo muestra cómo usar &lt;code&gt;TextInput&lt;/code&gt; para crear campos de texto. En el ciclo &lt;code&gt;for&lt;/code&gt;, creas tres instancias de &lt;code&gt;TextInput&lt;/code&gt; y las agregas al &lt;code&gt;BoxLayout&lt;/code&gt;, de modo que cada campo aparezca apilado en la ventana. La propiedad &lt;code&gt;hint_text&lt;/code&gt; actúa como texto de ayuda (placeholder) y le indica al usuario qué debe escribir en cada campo.&lt;/p&gt;
&lt;p&gt;Además, al establecer &lt;code&gt;multiline=False&lt;/code&gt;, le dices a &lt;code&gt;TextInput&lt;/code&gt; que actúe como un campo de una sola línea.&lt;/p&gt;
&lt;p&gt;A continuación se muestra cómo luce tu aplicación:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-kivy-python/kivy-campos-de-texto.png" class="mx-auto d-block mt-2" alt="Campos de texto en Kivy"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Campos de texto en Kivy&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Prueba a introducir texto en cada campo. También podrás copiar y pegar texto con las combinaciones de teclas &lt;code&gt;Ctrl+C&lt;/code&gt; y &lt;code&gt;Ctrl+V&lt;/code&gt;, respectivamente.&lt;/p&gt;
&lt;h3 id="botones-de-opcion"&gt;Botones de opción&lt;/h3&gt;
&lt;p&gt;La clase &lt;code&gt;CheckBox&lt;/code&gt; representa una opción booleana que te permite activar o desactivar características, funcionalidades, configuraciones y similares:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - checkboxes.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.core.window&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.boxlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.checkbox&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CheckBox&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.label&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Label&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CheckBoxApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Botones de opción Kivy&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clearcolor&lt;/span&gt; &lt;span class="o"&gt;=&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;1&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;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;Recibir notificaciones&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;Aceptar términos y condiciones&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;Suscribirse al boletín&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;vertical&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spacing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;option&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;horizontal&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spacing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CheckBox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size_hint_x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

            &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;option&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&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="n"&gt;size_hint_x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;texture_update&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;texture_size&lt;/span&gt;&lt;span class="p"&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;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;layout&lt;/span&gt;

&lt;span class="n"&gt;CheckBoxApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas una lista de opciones con casillas de verificación usando objetos &lt;code&gt;CheckBox&lt;/code&gt;. Creas un &lt;code&gt;BoxLayout&lt;/code&gt; vertical para la aplicación y, para cada opción, construyes una fila horizontal (&lt;code&gt;row&lt;/code&gt;) en la que insertas un checkbox. Al fijar &lt;code&gt;size_hint_x=None&lt;/code&gt; y un &lt;code&gt;width&lt;/code&gt; concreto, aseguras que todas las casillas tengan el mismo ancho y queden alineadas de forma consistente, una por fila, justo a la izquierda del texto.&lt;/p&gt;
&lt;p&gt;Luego añades un &lt;code&gt;Label&lt;/code&gt; con el texto de la opción y lo ajustas al tamaño real del contenido para que el texto quede pegado al checkbox sin ocupar el resto de la fila.&lt;/p&gt;
&lt;p&gt;Finalmente, agregas cada fila al layout principal, lo que produce una columna de filas, cada una con su checkbox y su descripción al lado.&lt;/p&gt;
&lt;p&gt;Al ejecutar esta aplicación, obtendrás una ventana similar a la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-kivy-python/kivy-botones-de-opcion.png" class="mx-auto d-block mt-2" alt="Botones de opción en Kivy"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Botones de opción en Kivy&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Cuando haces clic en las casillas, las activas o desactivas alternativamente. Puedes usar la propiedad &lt;code&gt;.active&lt;/code&gt; para comprobar el estado actual de cada casilla y tomar acciones en consecuencia.&lt;/p&gt;
&lt;h3 id="selectores-deslizantes"&gt;Selectores deslizantes&lt;/h3&gt;
&lt;p&gt;La clase &lt;code&gt;Slider&lt;/code&gt; proporciona un selector deslizante que es útil para seleccionar un valor dentro de un rango predeterminado:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - sliders.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.core.window&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.boxlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.label&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Label&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.slider&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Slider&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SliderApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Selector deslizante Kivy&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;vertical&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spacing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Valor: 0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;slider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Slider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;min&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="nb"&gt;max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Valor: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;

        &lt;span class="n"&gt;slider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;on_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;

&lt;span class="n"&gt;SliderApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, organizas la UI en un &lt;code&gt;BoxLayout&lt;/code&gt; vertical, con un &lt;code&gt;Label&lt;/code&gt; arriba y un &lt;code&gt;Slider&lt;/code&gt; abajo. Creas el &lt;code&gt;Slider&lt;/code&gt; con &lt;code&gt;min=0&lt;/code&gt;, &lt;code&gt;max=100&lt;/code&gt; y &lt;code&gt;value=0&lt;/code&gt;, que son los parámetros típicos para definir el rango y el valor inicial de este widget.&lt;/p&gt;
&lt;p&gt;Luego, conectas el &lt;code&gt;Slider&lt;/code&gt; con el &lt;code&gt;Label&lt;/code&gt; mediante la función &lt;code&gt;on_value()&lt;/code&gt;, que recibe el nuevo valor del control y actualiza el texto del label según los cambios. Al hacer &lt;code&gt;slider.bind(value=on_value)&lt;/code&gt;, le dices a Kivy que ejecute esa función cada vez que cambie la propiedad &lt;code&gt;.value&lt;/code&gt; del &lt;code&gt;Slider&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ejecuta la app y obtendrás una ventana como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-kivy-python/kivy-selector-deslizante.png" class="mx-auto d-block mt-2" alt="Selector deslizante en Kivy"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Selector deslizante en Kivy&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Prueba a mover el selector del slider y verás cómo el &lt;code&gt;Label&lt;/code&gt; se actualiza, lo que logra una interfaz reactiva que refleja el valor seleccionado en tiempo real.&lt;/p&gt;
&lt;h3 id="listas-desplegables"&gt;Listas desplegables&lt;/h3&gt;
&lt;p&gt;La clase &lt;code&gt;Spinner&lt;/code&gt; ofrece un selector compacto que muestra el valor actual y, al presionarlo, despliega una lista de opciones:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - spinners.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.core.window&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.boxlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.spinner&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Spinner&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SpinnerApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Lista desplegable Kivy&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;vertical&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spacing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Kivy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;PyQt6&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;PySide6&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Tkinter&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;base_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Framework GUI favorito&amp;quot;&lt;/span&gt;

        &lt;span class="n"&gt;spinner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Spinner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;base_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;size_hint_y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spinner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;

&lt;span class="n"&gt;SpinnerApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas una lista desplegable usando &lt;code&gt;Spinner&lt;/code&gt;. La lista muestra un texto inicial: &lt;code&gt;Framework GUI favorito&lt;/code&gt;. Luego, añades una colección (tupla) de opciones entre las cuales el usuario podrá seleccionar una a la vez.&lt;/p&gt;
&lt;p&gt;Si ejecutas esta aplicación, obtendrás una ventana como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-kivy-python/kivy-lista-desplegable.png" class="mx-auto d-block mt-2" alt="Lista desplegable en Kivy"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Lista desplegable en Kivy&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Aquí se muestra la lista desplegada. Puedes experimentar y seleccionar opciones de la lista. La opción seleccionada se mostrará en el selector compacto al cerrar la lista.&lt;/p&gt;
&lt;h2 id="usando-gestores-de-disposicion"&gt;Usando gestores de disposición&lt;/h2&gt;
&lt;p&gt;Los &lt;strong&gt;layouts&lt;/strong&gt; o &lt;strong&gt;gestores de disposición&lt;/strong&gt; son contenedores que controlan la distribución de los widgets en la ventana de la aplicación. En Kivy, es habitual empezar con un layout mínimo y luego refinar la interfaz a medida que avanzas en el desarrollo de tu aplicación.&lt;/p&gt;
&lt;h3 id="disponer-widgets-en-vertical-u-horizontal"&gt;Disponer widgets en vertical u horizontal&lt;/h3&gt;
&lt;p&gt;La clase &lt;code&gt;BoxLayout&lt;/code&gt; te permite organizar los widgets de forma secuencial, ya sea en orientación vertical (uno encima de otro) u horizontal (uno al lado del otro). El ejemplo siguiente demuestra la forma básica de usar este tipo de layout para disponer los widgets horizontalmente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - box_layout_horizontal.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.core.window&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.boxlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.button&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BoxLayoutApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Disposición horizontal Kivy&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;horizontal&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spacing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Izquierda&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Centro&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Derecha&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;

&lt;span class="n"&gt;BoxLayoutApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La orientación horizontal es la orientación por defecto del &lt;code&gt;BoxLayout&lt;/code&gt;, así que puedes obtener el mismo resultado si omites el argumento &lt;code&gt;orientation&lt;/code&gt; al crear la instancia de &lt;code&gt;BoxLayout&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En un &lt;code&gt;BoxLayout&lt;/code&gt;, el &lt;code&gt;padding&lt;/code&gt; controla el margen interno del layout, es decir, el espacio entre el borde del contenedor y sus widgets hijos. En cambio, el &lt;code&gt;spacing&lt;/code&gt; controla el espacio entre los widgets hijos. En este ejemplo, sería el espacio (en píxeles) que dejas entre un botón y el siguiente, ya sea en una columna (vertical) o en una fila (horizontal).&lt;/p&gt;
&lt;p&gt;Así es como luce esta aplicación:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-kivy-python/kivy-layout-horizontal.png" class="mx-auto d-block mt-2" alt="Disposición horizontal de widgets en Kivy"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Disposición horizontal de widgets en Kivy&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Para ordenar los widgets de manera vertical, solo tienes que hacer &lt;code&gt;orientation="vertical"&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - box_layout_vertical.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.core.window&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.boxlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.button&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BoxLayoutApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Disposición vertical Kivy&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;vertical&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spacing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Arriba&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Centro&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Abajo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;

&lt;span class="n"&gt;BoxLayoutApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Al ejecutar esta app, obtienes una ventana como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-kivy-python/kivy-layout-vertical.png" class="mx-auto d-block mt-2" alt="Disposición vertical de widgets en Kivy"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Disposición vertical de widgets en Kivy&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Como puedes apreciar, ahora los botones se muestran en una sola columna, manteniendo el orden en que los añadiste en el código.&lt;/p&gt;
&lt;h3 id="organizar-widgets-en-cuadriculas"&gt;Organizar widgets en cuadrículas&lt;/h3&gt;
&lt;p&gt;La clase &lt;code&gt;GridLayout&lt;/code&gt; te permite distribuir los widgets en una cuadrícula de filas y columnas. Para usarlo, debes especificar al menos una dimensión, por ejemplo, &lt;code&gt;cols&lt;/code&gt; o &lt;code&gt;rows&lt;/code&gt; para columnas o filas respectivamente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - grid_layout.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.core.window&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.button&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.gridlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GridLayout&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GridLayoutApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Disposición en cuadrícula Kivy&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GridLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cols&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="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spacing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="ow"&gt;in&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;6&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;index=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;

&lt;span class="n"&gt;GridLayoutApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas una app que organiza botones en una cuadrícula de dos columnas usando un &lt;code&gt;GridLayout&lt;/code&gt;. Con &lt;code&gt;cols=2&lt;/code&gt; estableces cuántas columnas tendrá la cuadrícula.&lt;/p&gt;
&lt;p&gt;Luego, en el ciclo &lt;code&gt;for&lt;/code&gt;, creas seis botones y los vas añadiendo con &lt;code&gt;.add_widget()&lt;/code&gt;. Kivy no coloca widgets en una fila o columna especificada, sino que asigna la posición automáticamente según el orden (&lt;code&gt;index&lt;/code&gt;) en que agregas los widgets.&lt;/p&gt;
&lt;p&gt;Si ejecutas la aplicación, obtendrás una ventana como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-kivy-python/kivy-layout-cuadricula.png" class="mx-auto d-block mt-2" alt="Disposición de widgets en cuadrícula en Kivy"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Disposición de widgets en cuadrícula en Kivy&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Cada botón muestra el índice con el que fue creado, y &lt;code&gt;GridLayout&lt;/code&gt; lo coloca en la cuadrícula según el orden en que lo agregas con &lt;code&gt;.add_widget()&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="colocar-widgets-en-posiciones-especificas"&gt;Colocar widgets en posiciones específicas&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;FloatLayout&lt;/code&gt; te da más libertad para posicionar los widgets. Este layout respeta las propiedades &lt;code&gt;pos_hint&lt;/code&gt; y &lt;code&gt;size_hint&lt;/code&gt; de sus widgets hijos. Considera el siguiente ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - float_layout.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.core.window&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.button&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.floatlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FloatLayout&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FloatLayoutApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Disposición flotante Kivy&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FloatLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="n"&gt;button1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Centrado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;size_hint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;pos_hint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;center_x&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;center_y&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;button2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Esquina inferior derecha&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;size_hint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;pos_hint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;right&amp;quot;&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="s2"&gt;&amp;quot;y&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;

&lt;span class="n"&gt;FloatLayoutApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, creas una app con un &lt;code&gt;FloatLayout&lt;/code&gt; que te permite posicionar y dimensionar sus widgets hijos a partir de sus propiedades &lt;code&gt;size_hint&lt;/code&gt; y &lt;code&gt;pos_hint&lt;/code&gt;. El &lt;code&gt;button1&lt;/code&gt; ocupará el 50% del ancho y el 20% del alto del contenedor, lo cual logras con &lt;code&gt;size_hint&lt;/code&gt;. Con &lt;code&gt;pos_hint&lt;/code&gt;, lo anclas al centro del layout.&lt;/p&gt;
&lt;p&gt;El &lt;code&gt;button2&lt;/code&gt; muestra otra forma común de ubicar elementos en &lt;code&gt;FloatLayout&lt;/code&gt;. En este caso, usas &lt;code&gt;pos_hint={"right": 1, "y": 0}&lt;/code&gt; para indicar que el borde derecho del botón debe coincidir con el borde derecho del contenedor (&lt;code&gt;right=1&lt;/code&gt;) y que su posición vertical esté pegada al borde inferior (&lt;code&gt;y=0&lt;/code&gt;). Además, &lt;code&gt;size_hint&lt;/code&gt; lo hace ocupar el 30% de ancho y el 10% de alto del layout.&lt;/p&gt;
&lt;p&gt;Tu aplicación debe lucir como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-kivy-python/kivy-layout-flotante.png" class="mx-auto d-block mt-2" style="max-width: 800px; width: 100%; height: auto;" alt="Disposición en posiciones específicas en Kivy"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Disposición en posiciones específicas en Kivy&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Como puedes ver, el layout renderiza los botones en las posiciones correspondientes sin necesidad de calcular las coordenadas manualmente. Al redimensionar la ventana, notarás que los botones se mantienen en sus posiciones.&lt;/p&gt;
&lt;h2 id="conectando-eventos-con-callbacks-en-kivy"&gt;Conectando eventos con callbacks en Kivy&lt;/h2&gt;
&lt;p&gt;En Kivy, la mayoría de los widgets te permiten vincular eventos y propiedades con funciones de callback mediante el método &lt;code&gt;.bind()&lt;/code&gt;. Esta es la base para reaccionar a eventos del usuario, como clics, selecciones y entradas de texto.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Es importante que sepas que no es lo mismo enlazar un evento que enlazar una propiedad. Por ejemplo, &lt;code&gt;on_press&lt;/code&gt; (evento) suele llamar un callback con un solo argumento: la instancia del widget. En contraste, &lt;code&gt;.text&lt;/code&gt;, &lt;code&gt;.active&lt;/code&gt; o &lt;code&gt;.value&lt;/code&gt; (propiedades) invocan un callback con dos argumentos: la instancia y el nuevo valor.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h3 id="enlazar-eventos"&gt;Enlazar eventos&lt;/h3&gt;
&lt;p&gt;Cuando quieres ejecutar una acción al pulsar un botón, puedes enlazar el evento &lt;code&gt;on_press&lt;/code&gt; (al presionar) u &lt;code&gt;on_release&lt;/code&gt; (al soltar) a una función o método. En la función (callback), el parámetro &lt;code&gt;instance&lt;/code&gt; te permite identificar qué botón disparó o generó el evento.&lt;/p&gt;
&lt;p&gt;Considera el siguiente ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - button_callbacks.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.core.window&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.boxlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.button&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.label&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Label&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ButtonsCallbacksApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Enlazar eventos Kivy&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;220&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;220&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;vertical&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spacing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Presionaste: ...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;  &lt;span class="c1"&gt;# Callback&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Presionaste: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Ok&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cancelar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Aplicar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on_press&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;on_press&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Enlace&lt;/span&gt;
            &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;

&lt;span class="n"&gt;ButtonsCallbacksApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas una app que muestra un &lt;code&gt;Label&lt;/code&gt; con el texto &lt;code&gt;"Presionaste: ..."&lt;/code&gt;. Este label mostrará el resultado de la interacción con los botones.&lt;/p&gt;
&lt;p&gt;Luego, creas una función llamada &lt;code&gt;on_press()&lt;/code&gt; que actualizará el texto del label según el botón que presiones. En el bucle, creas tres botones y los enlazas con &lt;code&gt;on_press()&lt;/code&gt; mediante &lt;code&gt;.bind()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Al ejecutar la app, obtendrás lo siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-kivy-python/kivy-enlace-de-eventos.png" class="mx-auto d-block mt-2" alt="Enlace de eventos en Kivy"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Enlace de eventos en Kivy&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;De este modo, cuando pulsas un botón en la ventana, Kivy llama al callback, pasándole la instancia del botón que disparó el evento, y el label se actualiza.&lt;/p&gt;
&lt;h3 id="enlazar-propiedades"&gt;Enlazar propiedades&lt;/h3&gt;
&lt;p&gt;Además de eventos, puedes enlazar propiedades. Por ejemplo, en un &lt;code&gt;TextInput&lt;/code&gt; puedes reaccionar a los cambios en la propiedad &lt;code&gt;.text&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Considera el siguiente ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - bind_properties.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.core.window&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.boxlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.label&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Label&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.textinput&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TextInput&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BindPropertiesApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Enlazar propiedades Kivy&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;320&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;220&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;vertical&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spacing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TextInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hint_text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Escribe algo aquí...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;multiline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Escribiste: &amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;&amp;quot;&lt;/span&gt;

        &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;on_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;

&lt;span class="n"&gt;BindPropertiesApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas una app con un &lt;code&gt;TextInput&lt;/code&gt; y un &lt;code&gt;Label&lt;/code&gt;. El &lt;code&gt;TextInput&lt;/code&gt; funciona como campo de entrada, mientras que el &lt;code&gt;Label&lt;/code&gt; sirve como salida para mostrar lo que el usuario va escribiendo.&lt;/p&gt;
&lt;p&gt;La clave está en la función &lt;code&gt;on_text()&lt;/code&gt;. Como aquí enlazas una &lt;strong&gt;propiedad&lt;/strong&gt; (&lt;code&gt;.text&lt;/code&gt;), Kivy llama al callback con dos argumentos: la instancia del widget que cambió (&lt;code&gt;instance&lt;/code&gt;) y el nuevo valor de la propiedad (&lt;code&gt;value&lt;/code&gt;). En consecuencia, cada vez que el usuario modifica el contenido del &lt;code&gt;TextInput&lt;/code&gt;, el callback actualiza el texto del &lt;code&gt;Label&lt;/code&gt; con &lt;code&gt;display.text = ...&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Al ejecutar la app, obtendrás lo siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-kivy-python/kivy-enlace-de-propiedades.png" class="mx-auto d-block mt-2" alt="Enlace de propiedades en Kivy"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Enlace de propiedades en Kivy&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Como ves, &lt;code&gt;.text&lt;/code&gt; es una propiedad que cambia mientras escribes. Enlazar propiedades con &lt;code&gt;.bind()&lt;/code&gt; es una forma directa de construir interfaces reactivas, en las que la UI se actualiza automáticamente en respuesta a cambios de estado.&lt;/p&gt;
&lt;h2 id="separando-la-interfaz-de-la-logica-con-kv-language"&gt;Separando la interfaz de la lógica con KV language&lt;/h2&gt;
&lt;p&gt;Una de las características más poderosas de Kivy es el &lt;em&gt;KV language&lt;/em&gt;. Se trata de un lenguaje dedicado que te permite definir la interfaz de forma declarativa en un archivo &lt;code&gt;.kv&lt;/code&gt; y dejar la lógica en Python.&lt;/p&gt;
&lt;p&gt;Kivy puede cargar automáticamente un archivo &lt;code&gt;.kv&lt;/code&gt; por convención de nombres, usando el nombre de la subclase de &lt;code&gt;App&lt;/code&gt;. Por ejemplo, si tu clase de app se llama &lt;code&gt;CounterApp&lt;/code&gt;, Kivy buscará y cargará un archivo llamado &lt;code&gt;counter.kv&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Supón que tu app tiene la estructura siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Texto&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;counter/
├── main.py
└── counter.kv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El archivo &lt;code&gt;main.py&lt;/code&gt; define la aplicación y el widget raíz con la lógica de la aplicación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - main.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.core.window&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.properties&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;NumericProperty&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.boxlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CounterApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;KV language Kivy&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;RootWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RootWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NumericProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="n"&gt;CounterApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este código no define elementos gráficos para la UI de tu aplicación. Puedes hacer este trabajo en &lt;code&gt;counter.kv&lt;/code&gt;. Para este ejemplo, añadirás un label y un botón:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Kv - counter.kv&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lt;RootWidget&amp;gt;:
    orientation: &amp;quot;vertical&amp;quot;
    padding: 20
    spacing: 10

    Label:
        text: &amp;quot;Clics: &amp;quot; + str(root.count)
        font_size: &amp;quot;24sp&amp;quot;

    Button:
        text: &amp;quot;Incrementar&amp;quot;
        size_hint: (1, None)
        height: 48
        on_press: root.increment()

RootWidget:
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Con este código en su lugar, la aplicación lucirá como se muestra a continuación:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-kivy-python/kivy-kv-language.png" class="mx-auto d-block mt-2" alt="KV language en Kivy"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;KV language en Kivy&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Fíjate en dos ventajas importantes de esa manera de construir tus aplicaciones Kivy:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;La UI queda definida en &lt;code&gt;counter.kv&lt;/code&gt;, lo que facilita iterar sobre el diseño.&lt;/li&gt;
&lt;li&gt;La lógica de la app (incrementar el contador) se encuentra en tus archivos de Python, lo que desacopla el frontend del backend.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Con Kivy, puedes construir aplicaciones de interfaz gráfica con un conjunto sólido de widgets y layouts. También puedes separar la lógica y el diseño de la interfaz en archivos &lt;code&gt;.kv&lt;/code&gt; a medida que tu aplicación crece.&lt;/p&gt;
&lt;p&gt;A partir de aquí, prueba a combinar widgets y layouts para crear aplicaciones multiplataforma, crear tus interfaces con KV language para mantener tu proyecto organizado.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Tutoriales/iniciando-con-kivy-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Tutoriales"/><category term="kivy"/><category term="python"/><category term="gui"/></entry><entry><title>Palabras clave en Python: continue</title><link href="https://pythonscouts.com/python-continue/" rel="alternate"/><published>2025-12-31T06:00:00+01:00</published><updated>2025-12-31T06:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-12-31:/python-continue/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;continue&lt;/code&gt; te permite saltar inmediatamente a la siguiente iteración de un bucle, omitiendo el resto del cuerpo de este.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Puedes usar &lt;code&gt;continue&lt;/code&gt; para &lt;em&gt;saltar&lt;/em&gt; casos que no quieres procesar sin salir del bucle.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/continue-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-continue"&gt;Uso de continue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica de &lt;code&gt;continue&lt;/code&gt; en un bucle &lt;code&gt;for&lt;/code&gt; o &lt;code&gt;while&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;iterable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Si &lt;code&gt;continue&lt;/code&gt; queda como última sentencia del cuerpo del bucle, es innecesaria porque no hay código que omitir y el bucle pasa igual a la siguiente iteración.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;A continuación, algunos ejemplos prácticos de cómo emplear &lt;code&gt;continue&lt;/code&gt;. Comenzamos con un ejemplo de cómo saltar números pares en un bucle &lt;code&gt;for&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&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;6&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&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;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Un caso de uso típico de &lt;code&gt;while&lt;/code&gt; es validar la entrada del usuario. En el ejemplo siguiente, &lt;code&gt;continue&lt;/code&gt; evita ejecutar el resto del cuerpo del bucle cuando la entrada es inválida:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - continue_python.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Edad (Enter para salir): &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Entrada inválida. Escribe un número entero.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;La edad debe ser mayor que cero.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;

    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Edad registrada: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En bucles anidados, &lt;code&gt;continue&lt;/code&gt; afecta solo al bucle más interno:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;pairs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&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;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&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;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;            &lt;span class="k"&gt;continue&lt;/span&gt;    &lt;span class="c1"&gt;# Salta pares donde i == j&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="n"&gt;pairs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;pairs&lt;/span&gt;
&lt;span class="go"&gt;[(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El bloque &lt;code&gt;else&lt;/code&gt; de un bucle aún se ejecuta si usas &lt;code&gt;continue&lt;/code&gt;. Solo &lt;code&gt;break&lt;/code&gt; lo evita:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&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="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Terminó sin usar break&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;Terminó sin usar break&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Errores comunes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;function&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;SyntaxError: &amp;#39;continue&amp;#39; not properly in loop&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como ves, &lt;code&gt;continue&lt;/code&gt; solo puede emplearse dentro de un ciclo.&lt;/p&gt;
&lt;h2 id="uso-de-continue"&gt;Uso de &lt;code&gt;continue&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;continue&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Saltar entradas inválidas o casos especiales sin duplicar lógica de salida del bucle.&lt;/li&gt;
&lt;li&gt;Simplificar condiciones anidadas (“guard clauses”) para aplanar el cuerpo del bucle.&lt;/li&gt;
&lt;li&gt;Omitir iteraciones que no cumplen un filtro dentro de bucles &lt;code&gt;for&lt;/code&gt;/&lt;code&gt;while&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Mantener disponible el bloque &lt;code&gt;else&lt;/code&gt; del bucle (a diferencia de &lt;code&gt;break&lt;/code&gt;, que lo inhibe).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;continue&lt;/code&gt; te permite omitir de forma limpia el resto de la iteración actual y pasar a la siguiente, manteniendo el bucle en ejecución.&lt;/p&gt;
&lt;p&gt;Conocer y emplear &lt;code&gt;continue&lt;/code&gt; mejora la claridad del flujo en tus bucles al evitar anidaciones profundas y manejar casos especiales de manera directa.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/continue-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: else</title><link href="https://pythonscouts.com/python-else/" rel="alternate"/><published>2025-12-30T15:25:00+01:00</published><updated>2025-12-30T15:25:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-12-30:/python-else/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;else&lt;/code&gt; te permite controlar el flujo de tus programas en condicionales, bucles y manejo de excepciones.&lt;/p&gt;</summary><content type="html">&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/else-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-else"&gt;Uso de else&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica de &lt;code&gt;else&lt;/code&gt; en una condicional &lt;a href="/python-if/"&gt;&lt;code&gt;if&lt;/code&gt;&lt;/a&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Bloque que se ejecuta si la condición es verdadera&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;# Bloque que se ejecuta si la condición es falsa&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Y en un &lt;a href="/ciclos-for-python/"&gt;bucle &lt;code&gt;for&lt;/code&gt;&lt;/a&gt;, se usa así:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;iterable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Código para cada item&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;# Código si el bucle completa sin interrupciones&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En la práctica, no deberías emplear &lt;code&gt;else&lt;/code&gt; en ciclos que no contienen una sentencia &lt;a href="/python-break/"&gt;&lt;code&gt;break&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;También puedes usar &lt;code&gt;else&lt;/code&gt; junto con bloques &lt;code&gt;try&lt;/code&gt; para ejecutar código solo si no ocurre ninguna excepción:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Código que puede lanzar una excepción&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Código que se ejecuta si ocurre una excepción&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;# Código que se ejecuta si no ocurre ninguna excepción&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos que muestran cómo se usa &lt;code&gt;else&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x es mayor que 5&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x no es mayor que 5&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;x no es mayor que 5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, como &lt;code&gt;x&lt;/code&gt; es menor que &lt;code&gt;5&lt;/code&gt;, el bloque de código dentro del &lt;code&gt;if&lt;/code&gt; no se ejecuta. En su lugar, se ejecuta el código dentro de &lt;code&gt;else&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&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;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Bucle completado sin interrupciones&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;Bucle completado sin interrupciones&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En el ejemplo anterior, el ciclo se completa sin interrupciones, por lo que el bloque &lt;code&gt;else&lt;/code&gt; se ejecuta.&lt;/p&gt;
&lt;p&gt;Ahora considera lo que ocurre si usas &lt;code&gt;break&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&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;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&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="gp"&gt;... &lt;/span&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;¡Se encontró el 2!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;break&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Bucle completado sin interrupciones&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;¡Se encontró el 2!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este caso, el bucle se interrumpe con &lt;code&gt;break&lt;/code&gt; y el bloque &lt;code&gt;else&lt;/code&gt; no se ejecuta.&lt;/p&gt;
&lt;h2 id="uso-de-else"&gt;Uso de &lt;code&gt;else&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;else&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Proporcionar un camino de ejecución por defecto en las &lt;a href="/condicionales-python/"&gt;condicionales&lt;/a&gt; &lt;code&gt;if&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ejecutar un bloque de código al finalizar un bucle &lt;code&gt;for&lt;/code&gt; o &lt;code&gt;while&lt;/code&gt; sin interrupciones.&lt;/li&gt;
&lt;li&gt;Junto con &lt;code&gt;try&lt;/code&gt; para especificar un bloque de código que se ejecuta si no se produce ninguna excepción.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;else&lt;/code&gt; en Python es fundamental para manejar flujos alternativos de ejecución en tus programas.&lt;/p&gt;
&lt;p&gt;Conocer y emplear &lt;code&gt;else&lt;/code&gt; correctamente te permite gestionar y organizar mejor la lógica de tu código, haciendo que tus programas sean más robustos y fáciles de seguir.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/else-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: break</title><link href="https://pythonscouts.com/python-break/" rel="alternate"/><published>2025-12-29T12:00:00+01:00</published><updated>2025-12-29T12:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-12-29:/python-break/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;break&lt;/code&gt; te permite salir anticipadamente de bucles &lt;code&gt;for&lt;/code&gt; o &lt;code&gt;while&lt;/code&gt; cuando se cumple una condición.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Es una herramienta útil para controlar el flujo de ejecución y evitar iteraciones innecesarias.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/break-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-break"&gt;Uso de break&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica de &lt;code&gt;break&lt;/code&gt; es la siguiente, dependiendo del tipo de bucle que uses:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;iterable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Coloca &lt;code&gt;break&lt;/code&gt; dentro del cuerpo de un bucle para interrumpir su ejecución cuando se cumpla una determinada condición.&lt;/p&gt;
&lt;p&gt;En general, no debes usar &lt;code&gt;break&lt;/code&gt; directamente en el cuerpo del ciclo, pues eso provocaría que solo se realice una iteración. En su lugar, debes colocar esta palabra clave dentro de una sentencia &lt;a href="/condicionales-python/"&gt;condicional&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;A continuación, algunos ejemplos prácticos de cómo usar &lt;code&gt;break&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&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;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&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="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;break&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, el bucle &lt;a href="/ciclos-for-python/"&gt;&lt;code&gt;for&lt;/code&gt;&lt;/a&gt; se detiene cuando &lt;code&gt;n&lt;/code&gt; es igual a &lt;code&gt;5&lt;/code&gt;, por lo que solo se imprimen los números del &lt;code&gt;0&lt;/code&gt; al &lt;code&gt;4&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;break&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, el bucle &lt;a href="/python-while/"&gt;&lt;code&gt;while&lt;/code&gt;&lt;/a&gt; se ejecuta indefinidamente hasta que &lt;code&gt;i&lt;/code&gt; alcanza &lt;code&gt;3&lt;/code&gt;, momento en el que &lt;code&gt;break&lt;/code&gt; interrumpe el ciclo.&lt;/p&gt;
&lt;h2 id="uso-de-break"&gt;Uso de &lt;code&gt;break&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; &lt;code&gt;break&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Salir anticipadamente de bucles &lt;code&gt;for&lt;/code&gt; o &lt;code&gt;while&lt;/code&gt; cuando se cumple una condición.&lt;/li&gt;
&lt;li&gt;Evitar iteraciones o repeticiones innecesarias una vez que se ha encontrado el resultado deseado.&lt;/li&gt;
&lt;li&gt;Mejorar la eficiencia y legibilidad del código al controlar el flujo de ejecución en bucles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;break&lt;/code&gt; en Python te permite controlar cuándo finalizar un bucle, haciendo tu código más eficiente y fácil de leer.&lt;/p&gt;
&lt;p&gt;Conocer y emplear &lt;code&gt;break&lt;/code&gt; te ayuda a escribir programas más claros y optimizados, evitando iteraciones y repeticiones innecesarias en tus ciclos.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/break-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: assert</title><link href="https://pythonscouts.com/python-assert/" rel="alternate"/><published>2025-12-28T12:00:00+01:00</published><updated>2025-12-28T12:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-12-28:/python-assert/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;assert&lt;/code&gt; te permite comprobar precondiciones durante el desarrollo y depuración de tus programas, lanzando un error si no se cumplen.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Si la condición evaluada es falsa, &lt;code&gt;assert&lt;/code&gt; genera una excepción de tipo &lt;code&gt;AssertionError&lt;/code&gt;, lo que te ayuda a identificar y corregir problemas en tu código.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/assert-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-assert"&gt;Uso de assert&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;[,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;condition&lt;/code&gt;: Una expresión que se evalúa como verdadera o falsa.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;message&lt;/code&gt;: Un mensaje opcional de error que se mostrará si la condición es falsa.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos que muestran cómo se utiliza la palabra clave &lt;code&gt;assert&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# No se genera ningún error porque la condición es verdadera.&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;#39;y&amp;#39; debería ser mayor que 5&amp;quot;&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;AssertionError&lt;/span&gt;: &lt;span class="n"&gt;&amp;#39;y&amp;#39; debería ser mayor que 5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En el primer ejemplo, la condición &lt;code&gt;x &amp;gt; 5&lt;/code&gt; es verdadera, por lo que no ocurre nada ni se imprime ningún mensaje en pantalla.&lt;/p&gt;
&lt;p&gt;En el segundo ejemplo, la condición &lt;code&gt;y &amp;gt; 5&lt;/code&gt; es falsa, por lo que se lanza un &lt;code&gt;AssertionError&lt;/code&gt; con el mensaje especificado.&lt;/p&gt;
&lt;h2 id="uso-de-assert"&gt;Uso de &lt;code&gt;assert&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;assert&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Verificar condiciones en el código durante la fase de desarrollo y depuración.&lt;/li&gt;
&lt;li&gt;Asegurarse de que los &lt;a href="/valores-python/"&gt;valores&lt;/a&gt; de las &lt;a href="/variables-python/"&gt;variables&lt;/a&gt; cumplen con los requisitos esperados antes de continuar con la ejecución.&lt;/li&gt;
&lt;li&gt;Documentar supuestos en el código que deberían mantenerse verdaderos.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;En la práctica, no debes emplear la palabra clave &lt;code&gt;assert&lt;/code&gt; para verificar condiciones en producción, como puede ser la validación de datos de entrada. Esto se debe a que Python permite deshabilitar &lt;code&gt;assert&lt;/code&gt; con el fin de optimizar el funcionamiento del código en producción y, por tanto, tu validación quedaría sin efecto.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;assert&lt;/code&gt; en Python garantiza que ciertas precondiciones se mantengan durante la ejecución de un programa. Es especialmente valiosa durante la fase de desarrollo y depuración, pues permite identificar rápidamente errores lógicos y corregirlos.&lt;/p&gt;
&lt;p&gt;Conocer y emplear &lt;code&gt;assert&lt;/code&gt; te ayuda a escribir código más robusto y confiable.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/assert-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: del</title><link href="https://pythonscouts.com/python-del/" rel="alternate"/><published>2025-12-27T12:00:00+01:00</published><updated>2025-12-27T12:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-12-27:/python-del/</id><summary type="html">&lt;p&gt;La palabra clave &lt;code&gt;del&lt;/code&gt; te permite eliminar variables, elementos de colecciones y atributos, liberando referencias y ayudándote a gestionar memoria.&lt;/p&gt;</summary><content type="html">&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/del-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-del"&gt;Uso de del&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para usar &lt;code&gt;del&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;También puedes usarla para eliminar elementos de una lista, pares de un diccionario o atributos de un objeto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;a_list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;a_dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attribute&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Veamos algunos ejemplos de cómo se usa &lt;code&gt;del&lt;/code&gt; en diferentes contextos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;NameError&lt;/span&gt;: &lt;span class="n"&gt;name &amp;#39;x&amp;#39; is not defined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, la &lt;a href="/variables-python/"&gt;variable&lt;/a&gt; &lt;code&gt;x&lt;/code&gt; se elimina con &lt;code&gt;del&lt;/code&gt;. Cualquier intento de acceder a ella después de eliminada genera un error.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;
&lt;span class="go"&gt;[1, 2, 4]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, usas &lt;code&gt;del&lt;/code&gt; para eliminar el elemento en el índice &lt;code&gt;2&lt;/code&gt; de la lista, modificando la lista original.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;letters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a&amp;quot;&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="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;c&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;letters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;letters&lt;/span&gt;
&lt;span class="go"&gt;{&amp;#39;a&amp;#39;: 1, &amp;#39;c&amp;#39;: 3}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En diccionarios, &lt;code&gt;del dic["key"]&lt;/code&gt; elimina el par clave-valor correspondiente. Si la clave no existe, se lanza una excepción &lt;code&gt;KeyError&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DemoClase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DemoClase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attribute&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attribute&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;AttributeError&lt;/span&gt;: &lt;span class="n"&gt;&amp;#39;DemoClase&amp;#39; object has no attribute &amp;#39;attribute&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, empleas &lt;code&gt;del&lt;/code&gt; para eliminar un atributo de un objeto, lo que resulta en un error si intentas acceder a él después de haberlo eliminado.&lt;/p&gt;
&lt;h2 id="uso-de-del"&gt;Uso de &lt;code&gt;del&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; &lt;code&gt;del&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eliminar variables para liberar memoria.&lt;/li&gt;
&lt;li&gt;Remover elementos de listas, diccionarios y otros tipos mutables.&lt;/li&gt;
&lt;li&gt;Eliminar atributos de objetos en clases.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;del&lt;/code&gt; en Python es una herramienta poderosa para gestionar la memoria y mantener tu código limpio y eficiente al eliminar variables, elementos de listas, diccionarios y atributos de objetos.&lt;/p&gt;
&lt;p&gt;Conocer y emplear esta palabra clave te permite escribir programas más eficientes y evitar errores relacionados con referencias innecesarias.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/del-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: with</title><link href="https://pythonscouts.com/python-with/" rel="alternate"/><published>2025-12-25T13:10:00+01:00</published><updated>2025-12-25T13:10:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-12-25:/python-with/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;with&lt;/code&gt; se utiliza para la gestión de recursos externos como archivos, conexiones de red y similares, asegurando que se liberen adecuadamente después de su uso.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Esta &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; es especialmente útil cuando necesita gestionar situaciones que requieren lógica de configuración y desmontaje (setup and teardown).&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/with-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-with"&gt;Uso de with&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para usar &lt;code&gt;with&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;variable&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La porción &lt;code&gt;[as variable]&lt;/code&gt; es opcional y solo la necesitas cuando quieres una referencia al valor generado por la expresión.&lt;/p&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;A continuación algunos ejemplos que muestran cómo se usa la palabra clave &lt;code&gt;with&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - with_python.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;archivo.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;r&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, &lt;code&gt;with&lt;/code&gt; se utiliza para abrir un archivo llamado &lt;code&gt;archivo.txt&lt;/code&gt; en modo de lectura. El archivo se asigna a la &lt;a href="/variables-python/"&gt;variable&lt;/a&gt; &lt;code&gt;file&lt;/code&gt;, y luego se lee su contenido. Una vez que el bloque &lt;code&gt;with&lt;/code&gt; se completa, el archivo se cierra automáticamente, liberando el recurso incluso si ocurre una excepción.&lt;/p&gt;
&lt;p&gt;Otro ejemplo podría ser:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - with_python.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;threading&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Lock&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;Lock&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# Código que requiere acceso exclusivo&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Bloque protegido por un lock&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, utilizas &lt;code&gt;with&lt;/code&gt; para adquirir un lock antes de ejecutar un bloque de código que requiere acceso exclusivo a un recurso compartido. El lock se libera automáticamente al salir del bloque &lt;code&gt;with&lt;/code&gt; de modo que otros hilos o procesos puedan usar el recurso compartido.&lt;/p&gt;
&lt;h2 id="uso-de-with"&gt;Uso de &lt;code&gt;with&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;with&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gestión automática de archivos, asegurando que se cierren correctamente después de su uso.&lt;/li&gt;
&lt;li&gt;Manejo de conexiones de red, bases de datos o sockets, liberando los recursos al finalizar.&lt;/li&gt;
&lt;li&gt;Adquisición y liberación de locks en programación concurrente para prevenir condiciones de carrera (race condition) y corrupción de datos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;with&lt;/code&gt; en Python es una herramienta fundamental para la gestión de recursos externos, garantizando que se liberen de manera adecuada y simplificando el manejo de excepciones.&lt;/p&gt;
&lt;p&gt;Conocer y emplear &lt;code&gt;with&lt;/code&gt; puede ayudarte a escribir código más limpio, seguro y menos propenso a errores relacionados con la gestión de recursos.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/with-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: pass</title><link href="https://pythonscouts.com/python-pass/" rel="alternate"/><published>2025-12-22T22:40:00+01:00</published><updated>2025-12-22T22:40:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-12-22:/python-pass/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;pass&lt;/code&gt; se utiliza como un marcador de posición en el código. Es una instrucción que se emplea cuando la sintaxis del lenguaje requiere una sentencia, pero no se necesita ejecutar ninguna acción.&lt;/p&gt;</summary><content type="html">&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/pass-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-pass"&gt;Uso de pass&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis de la &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; &lt;code&gt;pass&lt;/code&gt; es extremadamente sencilla, ya que solo consiste en la palabra en sí:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos rápidos que muestran cómo se usa la palabra clave &lt;code&gt;pass&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CustomException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;load_data&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;  &lt;span class="c1"&gt;# TODO: Implementar luego&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;remove_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;FileNotFoundError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En el primer ejemplo, &lt;code&gt;pass&lt;/code&gt; se utiliza para crear una excepción personalizada sin añadir comportamiento adicional.&lt;/p&gt;
&lt;p&gt;En el segundo ejemplo, la función &lt;code&gt;load_data()&lt;/code&gt; aún no hace nada. En este caso, &lt;code&gt;pass&lt;/code&gt; sirve como un recordatorio para implementar la lógica más tarde sin que el código genere un error de sintaxis.&lt;/p&gt;
&lt;p&gt;En el tercer ejemplo, usas &lt;code&gt;pass&lt;/code&gt; en un bloque &lt;code&gt;except&lt;/code&gt; para ignorar explícitamente el error que ocurre si el archivo que intentas borrar no existe.&lt;/p&gt;
&lt;h2 id="uso-de-pass"&gt;Uso de &lt;code&gt;pass&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;pass&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Como marcador de posición en una sentencia compuesta como &lt;a href="/python-if/"&gt;&lt;code&gt;if&lt;/code&gt;&lt;/a&gt;, &lt;a href="/python-for/"&gt;&lt;code&gt;for&lt;/code&gt;&lt;/a&gt; o &lt;a href="/python-while/"&gt;&lt;code&gt;while&lt;/code&gt;&lt;/a&gt; donde el código aún no está implementado.&lt;/li&gt;
&lt;li&gt;Para crear funciones y evitar errores de sintaxis mientras se desarrolla el esqueleto del programa.&lt;/li&gt;
&lt;li&gt;En clases como un marcador de posición para métodos o bloques de código que se implementarán más tarde.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;pass&lt;/code&gt; en Python es una herramienta esencial para situaciones en las que no deseas realizar ninguna acción específica, pero necesitas cumplir con la sintaxis del lenguaje.&lt;/p&gt;
&lt;p&gt;Conocer y utilizar &lt;code&gt;pass&lt;/code&gt; te permite estructurar tu código de manera más limpia y evita errores mientras desarrollas o refactorizas tus programas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/pass-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: lambda</title><link href="https://pythonscouts.com/python-lambda/" rel="alternate"/><published>2025-12-18T09:45:00+01:00</published><updated>2025-12-18T09:45:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-12-18:/python-lambda/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;lambda&lt;/code&gt; te permite crear funciones anónimas de una sola expresión para escribir transformaciones y filtros inline.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Estas funciones son ideales cuando requieres encapsular una lógica breve y desecharla inmediatamente después, como sucede al ordenar colecciones, transformar datos o definir callbacks.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/lambda-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis-basica"&gt;Sintaxis básica&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usos-de-lambda"&gt;Usos de lambda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis-basica"&gt;Sintaxis básica&lt;/h2&gt;
&lt;p&gt;Una función &lt;code&gt;lambda&lt;/code&gt; se compone de tres partes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;La &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; &lt;code&gt;lambda&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Una lista opcional de argumentos separados por comas&lt;/li&gt;
&lt;li&gt;Una única expresión cuyo resultado se devuelve de forma implícita&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Esta es la sintaxis:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Al igual que las funciones creadas con &lt;a href="/python-def/"&gt;&lt;code&gt;def&lt;/code&gt;&lt;/a&gt;, las lambdas aceptan &lt;a href="/valores-python/"&gt;valores&lt;/a&gt; por defecto, argumentos posicionales y hasta &lt;code&gt;*args&lt;/code&gt; o &lt;code&gt;**kwargs&lt;/code&gt;. Lo que no puedes hacer es escribir varias sentencias dentro del cuerpo de una &lt;code&gt;lambda&lt;/code&gt; porque únicamente admiten una expresión.&lt;/p&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;A continuación algunos ejemplos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;multipliers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&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;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;multipliers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;factor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;factor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;multipliers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, cada &lt;code&gt;lambda&lt;/code&gt; captura el valor de &lt;code&gt;n&lt;/code&gt; mediante un parámetro con valor por defecto. Al final del &lt;a href="/ciclos-for-python/"&gt;ciclo &lt;code&gt;for&lt;/code&gt;&lt;/a&gt; obtienes una lista de funciones a las que puedes pasar un valor para multiplicarlo por la &lt;code&gt;n&lt;/code&gt; correspondiente.&lt;/p&gt;
&lt;p&gt;Las lambdas brillan cuando las combinas con funciones que aceptan otras funciones como argumento:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SALUDO&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;mañana&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;funciones&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;funciones&amp;#39;, &amp;#39;mañana&amp;#39;, &amp;#39;SALUDO&amp;#39;]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;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;numbers&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;[3, 0, 11]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;functools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;reduce&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sorted()&lt;/code&gt; usa la &lt;code&gt;lambda&lt;/code&gt; para normalizar cada elemento antes de comparar.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;filter()&lt;/code&gt; filtra la lista para mantener solo los números positivos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reduce()&lt;/code&gt; acumula los valores sin necesidad de definir una función separada.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="usos-de-lambda"&gt;Usos de &lt;code&gt;lambda&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;lambda&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crear transformaciones breves dentro de funciones de orden superior como &lt;code&gt;map()&lt;/code&gt;, &lt;code&gt;filter()&lt;/code&gt;, &lt;code&gt;sorted()&lt;/code&gt; y similares.&lt;/li&gt;
&lt;li&gt;Definir claves o métricas inline para ordenar, agrupar o seleccionar datos.&lt;/li&gt;
&lt;li&gt;Escribir callbacks o manejadores temporales en APIs que esperan funciones, como eventos en interfaces gráficas o hooks de librerías.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;lambda&lt;/code&gt; te ayuda a empaquetar lógica limitada de forma concisa sin necesidad de un identificador o nombre de función. Cuando la legibilidad, las pruebas o la trazabilidad sean prioritarias, prefiere &lt;code&gt;def&lt;/code&gt; y reserva las lambdas para los casos puntuales donde brilla su brevedad.&lt;/p&gt;
&lt;p&gt;Conocer y emplear esta palabra clave te ayuda a crear funciones rápidas y breves que operan con un tiempo de vida limitado.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/lambda-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: import</title><link href="https://pythonscouts.com/python-import/" rel="alternate"/><published>2025-12-14T09:00:00+01:00</published><updated>2025-12-14T09:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-12-14:/python-import/</id><summary type="html">&lt;p&gt;La palabra clave &lt;code&gt;import&lt;/code&gt; permite incorporar módulos y objetos externos para extender las capacidades de tus programas en Python.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Los imports actúan como conexión entre tu código y el ecosistema Python. Con ella puedes acceder a funciones, clases y &lt;a href="/constantes-python/"&gt;constantes&lt;/a&gt; definidas en otros módulos, ya sea de la biblioteca estándar, de terceros o propios.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/import-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis-basica"&gt;Sintaxis básica&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cuando-usar-import"&gt;Cuándo usar import&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#buenas-practicas"&gt;Buenas prácticas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis-basica"&gt;Sintaxis básica&lt;/h2&gt;
&lt;p&gt;La forma más directa de cargar un módulo consiste en escribir su nombre después de la &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;module_name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;También puedes asignar un alias que resulte más corto o significativo, aprovechando la palabra clave &lt;a href="/python-as/"&gt;&lt;code&gt;as&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;module_name&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;alias&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Otra opción consiste en traer símbolos concretos desde el módulo para usarlos directamente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;module_name&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si lo necesitas, también puedes renombrar el símbolo importado:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;module_name&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;alias&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Los imports selectivos te permiten traer únicamente los nombres que necesitas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sqrt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finalmente, los imports relativos privilegian módulos dentro de tu propio paquete:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;.helpers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;parse_config&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este estilo solo funciona dentro de paquetes y ayuda a mantener rutas cortas y claras.&lt;/p&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;A continuación algunos ejemplos prácticos de cómo usar la palabra clave &lt;code&gt;import&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;random&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;🐍&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;🧠&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;⚙️&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;🐍&amp;#39;&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;statistics&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;sts&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;sts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="go"&gt;15&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;statistics&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;median&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;median&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;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="go"&gt;4.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Estos ejemplos muestran cómo &lt;code&gt;import&lt;/code&gt; activa capacidades adicionales sin necesidad de duplicar código ni copiar archivos.&lt;/p&gt;
&lt;h2 id="cuando-usar-import"&gt;Cuándo usar &lt;code&gt;import&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los usos más frecuentes de la palabra clave &lt;code&gt;import&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Acceder a paquetes y módulos de la biblioteca estándar, tales como &lt;code&gt;math&lt;/code&gt;, &lt;code&gt;datetime&lt;/code&gt;, &lt;code&gt;pathlib&lt;/code&gt; o &lt;code&gt;itertools&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Usar paquetes de terceros, tales como &lt;code&gt;requests&lt;/code&gt;, &lt;code&gt;numpy&lt;/code&gt;, &lt;code&gt;pandas&lt;/code&gt; o cualquier otro que instales con herramientas como &lt;code&gt;pip&lt;/code&gt; o &lt;a href="/gestionar-proyecto-python-uv/"&gt;&lt;code&gt;uv&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Modularizar proyectos propios y dividir tu aplicación en múltiples archivos con responsabilidades específicas.&lt;/li&gt;
&lt;li&gt;Configurar extensiones opcionales y cargar dinámicamente módulos solo cuando se requieren, reduciendo tiempos de arranque.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="buenas-practicas"&gt;Buenas prácticas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Agrupa las importaciones al inicio de cada archivo siguiendo el orden:&lt;ol&gt;
&lt;li&gt;Librería estándar&lt;/li&gt;
&lt;li&gt;Paquetes de terceros&lt;/li&gt;
&lt;li&gt;Paquetes locales.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Sitúa estas importaciones antes de tus &lt;a href="/python-def/"&gt;definiciones de funciones&lt;/a&gt; y &lt;a href="/python-class/"&gt;clases&lt;/a&gt;, manteniendo cada archivo coherente y fácil de recorrer.&lt;/li&gt;
&lt;li&gt;Usa alias descriptivos solo cuando aporten claridad.&lt;/li&gt;
&lt;li&gt;Evita &lt;code&gt;from module import *&lt;/code&gt; (wildcard imports), pues comprometen la legibilidad del código, contaminan tu espacio de nombres y puede sobrescribir nombres sin aviso, causando bugs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;import&lt;/code&gt; es la base de la modularidad en Python. Te permite incorporar funcionalidad existente, mantener el código ordenado y facilitar la colaboración entre diferentes partes de un proyecto.&lt;/p&gt;
&lt;p&gt;Dominar sus variantes y buenas prácticas te ayuda a escribir programas limpios, escalables y fáciles de mantener.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/import-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: as</title><link href="https://pythonscouts.com/python-as/" rel="alternate"/><published>2025-12-08T21:00:00+01:00</published><updated>2025-12-08T21:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-12-08:/python-as/</id><summary type="html">&lt;p&gt;Descubre cómo usar la palabra clave as en Python para crear alias de módulos y capturar excepciones, mejorando la legibilidad de tu código.&lt;/p&gt;</summary><content type="html">&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/as-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-as"&gt;Uso de as&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para usar &lt;code&gt;as&lt;/code&gt; es:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Importar módulos con alias:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;module_name&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;alias_name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Capturar excepciones:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Code that may raise an exception&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ExceptionType&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Handle the exception&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Gestionar contextos con &lt;code&gt;with&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;variable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Code that uses variable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos de cómo se usa &lt;code&gt;as&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="go"&gt;array([1, 2, 3])&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ZeroDivisionError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;Error: division by zero&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En el primer ejemplo, se importa el módulo &lt;code&gt;numpy&lt;/code&gt; y se le asigna el alias &lt;code&gt;np&lt;/code&gt;, lo que permite referirse a él de forma más concisa.&lt;/p&gt;
&lt;p&gt;En el segundo ejemplo, &lt;code&gt;as&lt;/code&gt; se utiliza para capturar una excepción y asignarla a la variable &lt;code&gt;error&lt;/code&gt;, permitiendo manejarla e imprimir un mensaje de error.&lt;/p&gt;
&lt;h2 id="uso-de-as"&gt;Uso de &lt;code&gt;as&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;as&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crear alias para módulos importados, lo que ayuda a reducir la longitud del código y mejora la legibilidad, especialmente con nombres de módulos largos.&lt;/li&gt;
&lt;li&gt;Capturar excepciones para acceder a los detalles de la excepción en bloques &lt;code&gt;try-except&lt;/code&gt;, permitiendo un manejo más preciso de errores.&lt;/li&gt;
&lt;li&gt;Gestionar contextos con &lt;code&gt;with&lt;/code&gt;, asignando el resultado de un gestor de contexto a una variable para facilitar el manejo de recursos como archivos, conexiones de red o bloqueos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;as&lt;/code&gt; en Python es una herramienta versátil que te permite asignar alias a módulos, capturar excepciones y gestionar contextos, facilitando un código más limpio y manejable.&lt;/p&gt;
&lt;p&gt;Conocer y emplear &lt;code&gt;as&lt;/code&gt; puede mejorar significativamente la legibilidad y organización de tu código Python.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/as-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: ¿Cuáles son?</title><link href="https://pythonscouts.com/python-palabras-clave/" rel="alternate"/><published>2025-12-06T21:00:00+01:00</published><updated>2025-12-06T21:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-12-06:/python-palabras-clave/</id><summary type="html">&lt;p&gt;Las &lt;strong&gt;palabras clave&lt;/strong&gt; o &lt;strong&gt;palabras reservadas&lt;/strong&gt; (&lt;em&gt;keywords&lt;/em&gt;) de Python son un conjunto de palabras en idioma inglés que tienen un significado especial para el lenguaje. Estas palabras constituyen la base de la sintaxis de Python.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Por esta razón, es importante que las conozcas y sepas su rol en el lenguaje. Con ellas, podrás escribir diferentes tipos de sentencias que, en su conjunto, conformarán tus programas y aplicaciones Python.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En este tutorial, aprenderás:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Qué son las &lt;strong&gt;palabras clave&lt;/strong&gt; o &lt;strong&gt;reservadas&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Cuáles son las &lt;strong&gt;palabras clave&lt;/strong&gt; de Python&lt;/li&gt;
&lt;li&gt;Cómo obtener &lt;strong&gt;ayuda&lt;/strong&gt; sobre las palabras clave de Python&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Con estos conocimientos, mejorarás tu comprensión del lenguaje y estarás mejor preparado para enfrentar el aprendizaje del mismo.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/python-palabras-clave" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#que-son-las-palabras-clave-o-reservadas-en-python"&gt;¿Qué son las palabras clave o reservadas en Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cuales-son-las-palabras-clave-de-python"&gt;¿Cuáles son las palabras clave de Python?&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#palabras-clave-suaves"&gt;Palabras clave suaves&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#como-obtengo-ayuda-sobre-palabras-clave-especificas"&gt;¿Cómo obtengo ayuda sobre palabras clave específicas?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#puedo-emplear-palabras-clave-como-nombres"&gt;¿Puedo emplear palabras clave como nombres?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="que-son-las-palabras-clave-o-reservadas-en-python"&gt;¿Qué son las palabras clave o reservadas en Python?&lt;/h2&gt;
&lt;p&gt;Python cuenta con lo que se conoce como &lt;a href="https://docs.python.org/es/3/reference/lexical_analysis.html#keywords" target="_blank"&gt;palabras clave&lt;/a&gt; o &lt;strong&gt;palabras reservadas&lt;/strong&gt; (&lt;em&gt;keywords&lt;/em&gt;). Se trata de un conjunto reducido de palabras, en idioma inglés, que tienen un significado especial en el lenguaje y que forman parte de su sintaxis.&lt;/p&gt;
&lt;p&gt;Tal y como refiere la documentación oficial de Python en español:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[Las palabras clave] Deben escribirse exactamente como están escritas aquí: (&lt;a href="https://docs.python.org/es/3/reference/lexical_analysis.html#keywords" target="_blank"&gt;Fuente&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cuando la documentación dice que deben escribirse de esta forma, esto incluye el detalle de las mayúsculas, como en los casos de &lt;a href="/python-none/"&gt;&lt;code&gt;None&lt;/code&gt;&lt;/a&gt;, &lt;a href="/python-false/"&gt;&lt;code&gt;False&lt;/code&gt;&lt;/a&gt; y &lt;a href="/python-true/"&gt;&lt;code&gt;True&lt;/code&gt;&lt;/a&gt;. Sí, Python discrimina entre mayúsculas y minúsculas, de modo que las variantes &lt;code&gt;True&lt;/code&gt; y &lt;code&gt;true&lt;/code&gt; no son equivalentes.&lt;/p&gt;
&lt;p&gt;Cualquier error de escritura en una palabra clave provoca una excepción del tipo &lt;a href="https://docs.python.org/es/3/library/exceptions.html#NameError" target="_blank"&gt;&lt;code&gt;NameError&lt;/code&gt;&lt;/a&gt;. Este comportamiento se debe a que como la palabra está mal escrita, Python asume que se trata de un identificador o nombre y al no encontrar el nombre, levanta la excepción.&lt;/p&gt;
&lt;p&gt;Con esta breve introducción al concepto de palabras clave, estás listo para conocer cuáles son las palabras clave de Python.&lt;/p&gt;
&lt;h2 id="cuales-son-las-palabras-clave-de-python"&gt;¿Cuáles son las palabras clave de Python?&lt;/h2&gt;
&lt;p&gt;Dependiendo de la versión, Python tiene un conjunto de palabras clave o reservadas que ronda las 30 palabras. Estas palabras constituyen el núcleo de la sintaxis del lenguaje. Para conocer o consultar cuáles son estas palabras, puedes abrir una sesión interactiva de Python y ejecutar el siguiente código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Python 3.13&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;keyword&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;kwlist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;softkwlist&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;kwlist&lt;/span&gt;
&lt;span class="go"&gt;[&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;False&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;None&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;True&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;and&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;as&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;assert&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;async&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;await&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;break&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;class&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;continue&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;def&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;del&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;elif&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;else&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;except&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;finally&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;for&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;from&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;global&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;if&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;import&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;in&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;is&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;lambda&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;nonlocal&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;not&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;or&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;pass&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;raise&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;return&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;try&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;while&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;with&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;#39;yield&amp;#39;&lt;/span&gt;
&lt;span class="go"&gt;]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;softkwlist&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;_&amp;#39;, &amp;#39;case&amp;#39;, &amp;#39;match&amp;#39;, &amp;#39;type&amp;#39;]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kwlist&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;softkwlist&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;39&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El módulo &lt;a href="https://docs.python.org/es/3/library/keyword.html#module-keyword" target="_blank"&gt;&lt;code&gt;keyword&lt;/code&gt;&lt;/a&gt; de la &lt;a href="https://docs.python.org/es/3/library/index.html" target="_blank"&gt;biblioteca estándar&lt;/a&gt; exporta las listas &lt;a href="https://docs.python.org/es/3/library/keyword.html#keyword.kwlist" target="_blank"&gt;&lt;code&gt;kwlist&lt;/code&gt;&lt;/a&gt; y &lt;a href="https://docs.python.org/es/3/reference/lexical_analysis.html#soft-keywords" target="_blank"&gt;&lt;code&gt;softkwlist&lt;/code&gt;&lt;/a&gt; que contienen todas las palabras clave de Python.&lt;/p&gt;
&lt;p&gt;En el código anterior, primeramente importas &lt;code&gt;kwlist&lt;/code&gt; y &lt;code&gt;softkwlist&lt;/code&gt; desde &lt;code&gt;keyword&lt;/code&gt; y luego muestras su contenido. Python 3.13 tiene 39 palabras clave, incluidas las suaves, tal y como resulta de ejecutar &lt;code&gt;len(kwlist + softkwlist)&lt;/code&gt; en la última línea de código del ejemplo.&lt;/p&gt;
&lt;p&gt;Debes tener en cuenta que el número de palabras clave varía en dependencia de la versión de Python que estés usando actualmente.&lt;/p&gt;
&lt;p&gt;Otra manera de consultar las palabras clave de Python es mediante la función &lt;a href="/obtener-ayuda-python/#2-el-sistema-interactivo-de-ayuda-help"&gt;&lt;code&gt;help()&lt;/code&gt;&lt;/a&gt;. Se trata de una función incluida (&lt;em&gt;built-in&lt;/em&gt;) que te permite consultar la documentación y obtener ayuda rápida sobre cualquier objeto en Python.&lt;/p&gt;
&lt;p&gt;Para consultar las palabras clave de Python por esta vía, primeramente ejecuta &lt;code&gt;help()&lt;/code&gt; para entrar al &lt;strong&gt;sistema de ayuda integrado&lt;/strong&gt; de Python. Luego consulta el contenido de la página de palabras clave usando el comando &lt;code&gt;keywords&lt;/code&gt; como en el ejemplo siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="go"&gt;Welcome to Python 3.13&amp;#39;s help utility!&lt;/span&gt;

&lt;span class="go"&gt;...&lt;/span&gt;

&lt;span class="go"&gt;help&amp;gt; keywords&lt;/span&gt;

&lt;span class="go"&gt;Here is a list of the Python keywords.  Enter any keyword to get more help.&lt;/span&gt;

&lt;span class="go"&gt;False               class               from                or&lt;/span&gt;
&lt;span class="go"&gt;None                continue            global              pass&lt;/span&gt;
&lt;span class="go"&gt;True                def                 if                  raise&lt;/span&gt;
&lt;span class="go"&gt;and                 del                 import              return&lt;/span&gt;
&lt;span class="go"&gt;as                  elif                in                  try&lt;/span&gt;
&lt;span class="go"&gt;assert              else                is                  while&lt;/span&gt;
&lt;span class="go"&gt;async               except              lambda              with&lt;/span&gt;
&lt;span class="go"&gt;await               finally             nonlocal            yield&lt;/span&gt;
&lt;span class="go"&gt;break               for                 not&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este caso, cuando ejecutas &lt;code&gt;help()&lt;/code&gt; en una sesión interactiva de Python, entras inmediatamente al sistema de ayuda integrado del lenguaje. El indicador (&lt;em&gt;prompt&lt;/em&gt;) &lt;code&gt;help&amp;gt;&lt;/code&gt; te hace saber que estás dentro. Una vez allí, tecleas el comando &lt;code&gt;keywords&lt;/code&gt; y presionas &lt;em&gt;Enter&lt;/em&gt;. Esta acción te devuelve el listado de palabras clave de tu versión específica del lenguaje.&lt;/p&gt;
&lt;p&gt;Es importante que domines las palabras clave o reservadas de Python, y sobre todo que conozcas su significado en español. A continuación, un resumen que incluye la traducción al español y una breve descripción de cada palabra clave:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Palabra clave&lt;/th&gt;
&lt;th&gt;Traducción&lt;/th&gt;
&lt;th&gt;Descripción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Falso&lt;/td&gt;
&lt;td&gt;Representa el valor booleano falso&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ninguno&lt;/td&gt;
&lt;td&gt;Representa un objeto nulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Verdadero&lt;/td&gt;
&lt;td&gt;Representa el valor booleano verdadero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;and&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;y&lt;/td&gt;
&lt;td&gt;Operador lógico &lt;code&gt;AND&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;as&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;como&lt;/td&gt;
&lt;td&gt;Permite crear alias de módulos, clases o funciones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;assert&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;afirmar&lt;/td&gt;
&lt;td&gt;Verifica si una &lt;a href="/expresiones-python/"&gt;expresión&lt;/a&gt; es verdadera y lanza un error si es falsa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;async&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Asíncrono&lt;/td&gt;
&lt;td&gt;Define una función o estructura asíncrona&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;await&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;esperar&lt;/td&gt;
&lt;td&gt;Espera a que se complete una función o estructura asíncrona&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;break&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;romper&lt;/td&gt;
&lt;td&gt;Sale de un bucle &lt;code&gt;for&lt;/code&gt; o &lt;code&gt;while&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;class&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;clase&lt;/td&gt;
&lt;td&gt;Define una clase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;continue&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;continuar&lt;/td&gt;
&lt;td&gt;Salta a la siguiente iteración en un bucle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;def&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;definir&lt;/td&gt;
&lt;td&gt;Define una función&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;del&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;borrar&lt;/td&gt;
&lt;td&gt;Elimina nombres, elementos de listas, claves de diccionarios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;elif&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;entonces si&lt;/td&gt;
&lt;td&gt;Cláusula &lt;code&gt;else if&lt;/code&gt; para una sentencia &lt;code&gt;if&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;else&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;entonces&lt;/td&gt;
&lt;td&gt;Cláusula &lt;code&gt;else&lt;/code&gt; para una sentencia &lt;code&gt;if&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;except&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;excepto&lt;/td&gt;
&lt;td&gt;Captura y maneja excepciones en un bloque &lt;code&gt;try&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;finally&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;finalmente&lt;/td&gt;
&lt;td&gt;Se ejecuta siempre en un bloque &lt;code&gt;try&lt;/code&gt;, independientemente de si se produjo una excepción o no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;for&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;para&lt;/td&gt;
&lt;td&gt;Inicia un bucle &lt;code&gt;for&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;from&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;desde&lt;/td&gt;
&lt;td&gt;Importa objetos específicos desde un módulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;global&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;global&lt;/td&gt;
&lt;td&gt;Indica que una &lt;a href="/valores-python/"&gt;variable&lt;/a&gt; se define en el ámbito global&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;if&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;si&lt;/td&gt;
&lt;td&gt;Inicia una &lt;a href="/condicionales-python/"&gt;sentencia condicional&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;import&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;importar&lt;/td&gt;
&lt;td&gt;Importa un módulo o elementos específicos de un módulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;in&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;en&lt;/td&gt;
&lt;td&gt;Verifica si un valor se encuentra en una lista, diccionario o cualquier objeto iterable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;is&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;es&lt;/td&gt;
&lt;td&gt;Compara si dos objetos son el mismo objeto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lambda&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;lambda&lt;/td&gt;
&lt;td&gt;Crea una función anónima&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nonlocal&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no local&lt;/td&gt;
&lt;td&gt;Indica que una variable se encuentra en el ámbito externo a una función&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;not&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Operador lógico &lt;code&gt;NOT&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;or&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;o&lt;/td&gt;
&lt;td&gt;Operador lógico &lt;code&gt;OR&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pass&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;pasar&lt;/td&gt;
&lt;td&gt;Es una sentencia que no hace nada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;raise&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;lanzar&lt;/td&gt;
&lt;td&gt;Lanza una excepción&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;return&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;retornar&lt;/td&gt;
&lt;td&gt;Sale de una función y devuelve un valor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;try&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;intentar&lt;/td&gt;
&lt;td&gt;Inicia un bloque de manejo de excepciones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;while&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;mientras&lt;/td&gt;
&lt;td&gt;Inicia un bucle &lt;code&gt;while&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;with&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;con&lt;/td&gt;
&lt;td&gt;Simplifica el manejo de recursos mediante un gestor de contexto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;yield&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;producir&lt;/td&gt;
&lt;td&gt;Devuelve un valor de un generador sin finalizar la función&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="palabras-clave-suaves"&gt;Palabras clave suaves&lt;/h3&gt;
&lt;p&gt;Python también cuenta con &lt;a href="https://docs.python.org/es/3/reference/lexical_analysis.html#soft-keywords" target="_blank"&gt;palabras clave suaves&lt;/a&gt; (&lt;em&gt;soft keywords&lt;/em&gt;). A diferencia de las palabras clave normales, las palabras clave suaves pueden emplearse en identificadores, tales como nombres de variables o funciones, siempre que no se usen en el contexto sintáctico específico que las define como palabras reservadas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Palabra clave&lt;/th&gt;
&lt;th&gt;Traducción&lt;/th&gt;
&lt;th&gt;Descripción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;_&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;guión bajo&lt;/td&gt;
&lt;td&gt;Funciona como un patrón comodín que coincide con cualquier valor u objeto sin vincularlo a un nombre en una sentencia &lt;code&gt;match&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;case&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;caso&lt;/td&gt;
&lt;td&gt;Define un patrón de coincidencia en una sentencia &lt;code&gt;match&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;match&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;coincidencia&lt;/td&gt;
&lt;td&gt;Define una sentencia usada para coincidencia de patrones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;tipo&lt;/td&gt;
&lt;td&gt;Declara un alias de tipo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Conocer las palabras reservadas de Python te facilitará la comprensión y la escritura de código. Recuerda que este conjunto de palabras es el núcleo de toda la sintaxis del lenguaje.&lt;/p&gt;
&lt;h2 id="como-obtengo-ayuda-sobre-palabras-clave-especificas"&gt;¿Cómo obtengo ayuda sobre palabras clave específicas?&lt;/h2&gt;
&lt;p&gt;En determinadas situaciones, sobre todo cuando estás comenzando con Python, necesitarás consultar rápidamente el objetivo de determinada palabra clave. En esos casos, puedes auxiliarte de &lt;code&gt;help()&lt;/code&gt; nuevamente.&lt;/p&gt;
&lt;p&gt;Una vez que entras al sistema de ayuda integrado usando &lt;code&gt;help()&lt;/code&gt;, puedes introducir la palabra clave que deseas consultar y presionar &lt;em&gt;Enter&lt;/em&gt;. De inmediato te aparecerá en pantalla la documentación de la palabra en cuestión.&lt;/p&gt;
&lt;p&gt;Por ejemplo, si introduces &lt;code&gt;if&lt;/code&gt; y presionas Enter, entonces el sistema de ayuda entrará directamente a la página que documenta esta sentencia y mostrará la salida siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Texto&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;The &amp;quot;if&amp;quot; statement
******************

The &amp;quot;if&amp;quot; statement is used for conditional execution:

   if_stmt ::= &amp;quot;if&amp;quot; assignment_expression &amp;quot;:&amp;quot; suite
               (&amp;quot;elif&amp;quot; assignment_expression &amp;quot;:&amp;quot; suite)*
               [&amp;quot;else&amp;quot; &amp;quot;:&amp;quot; suite]

It selects exactly one of the suites by evaluating the expressions one
by one until one is found to be true (see section Boolean operations
for the definition of true and false); then that suite is executed
(and no other part of the &amp;quot;if&amp;quot; statement is executed or evaluated).
If all expressions are false, the suite of the &amp;quot;else&amp;quot; clause, if
present, is executed.

Related help topics: TRUTHVALUE
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si introduces una palabra clave o palabra reservada cualquiera (&lt;code&gt;if&lt;/code&gt; en el ejemplo anterior) en el indicador (&lt;em&gt;prompt&lt;/em&gt;) del sistema de ayuda de Python, obtienes acceso directo a la documentación de la misma. Esta documentación solo aparece en idioma inglés. Si deseas obtener ayuda en idioma español, entonces puedes usar la &lt;a href="https://docs.python.org/es/3/index.html" target="_blank"&gt;documentación oficial en español&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Es importante que sepas que cuando consultas una página de documentación específica en el sistema de ayuda integrado, tendrás que presionar la tecla &lt;em&gt;Q&lt;/em&gt; en tu teclado para poder salir de la página y regresar a la ayuda.&lt;/p&gt;
&lt;p&gt;El sistema de ayuda integrado te ofrece además una guía de temas relacionados con la palabra clave que estés consultando. En la última línea del ejemplo anterior puedes leer &lt;code&gt;Related help topics: TRUTHVALUE&lt;/code&gt;. Si introduces &lt;code&gt;TRUTHVALUE&lt;/code&gt; y presionas &lt;em&gt;Enter&lt;/em&gt;, obtendrás la página de ayuda correspondiente. Adelántate y experiméntalo tú mismo.&lt;/p&gt;
&lt;h2 id="puedo-emplear-palabras-clave-como-nombres"&gt;¿Puedo emplear palabras clave como nombres?&lt;/h2&gt;
&lt;p&gt;En la mayoría de los casos, si tratas de emplear una palabra clave o reservada para definir una variable o nombre, recibirás un error de sintaxis:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="err"&gt;= &amp;quot;&lt;/span&gt;&lt;span class="nc"&gt;Economy&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
  File &lt;span class="nb"&gt;&amp;quot;&amp;lt;input&amp;gt;&amp;quot;&lt;/span&gt;, line &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="err"&gt;= &amp;quot;&lt;/span&gt;&lt;span class="nc"&gt;Economy&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="pm"&gt;^&lt;/span&gt;
&lt;span class="gr"&gt;SyntaxError&lt;/span&gt;: &lt;span class="n"&gt;invalid syntax&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, cuando tratas de usar &lt;code&gt;class&lt;/code&gt; como un nombre de variable, recibes una excepción de tipo &lt;code&gt;SyntaxError&lt;/code&gt;. Sin embargo, este no es siempre el caso. Python también tiene &lt;a href="https://docs.python.org/es/3/reference/lexical_analysis.html#soft-keywords" target="_blank"&gt;palabras clave suaves&lt;/a&gt; que en determinado contexto, puedes emplear como nombres. Las más comunes son &lt;code&gt;match&lt;/code&gt; y &lt;code&gt;case&lt;/code&gt;, que solo están restringidas en el contexto de sentencias &lt;a href="https://docs.python.org/es/3/reference/compound_stmts.html#match" target="_blank"&gt;&lt;code&gt;match&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;match&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este ejemplo demuestra que puedes emplear la palabra reservada &lt;code&gt;match&lt;/code&gt; como un nombre de variable. En este caso, Python no levanta una excepción como lo hace con otras palabras reservadas.&lt;/p&gt;
&lt;p&gt;En cualquier caso, debes evitar emplear palabras clave como nombres o identificadores de variables, funciones, clases, módulos, paquetes o de cualquier otra estructura u objeto Python. Emplearlas de esta forma podría generar problemas difíciles de identificar y resolver en tu código.&lt;/p&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;Ya has adquirido conocimientos elementales sobre las palabras clave o palabras reservadas de Python. Sabes cómo obtener la lista de palabras reservadas disponibles en tu entorno Python y cómo obtener ayuda sobre estas palabras y su papel en la sintaxis del lenguaje.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ahora conoces:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La definición de &lt;strong&gt;palabra clave&lt;/strong&gt; o &lt;strong&gt;reservada&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Las &lt;strong&gt;palabras clave de Python&lt;/strong&gt; y su significado&lt;/li&gt;
&lt;li&gt;Cómo usar la función &lt;code&gt;help()&lt;/code&gt; para obtener &lt;strong&gt;ayuda&lt;/strong&gt; sobre las palabras clave&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Con estos conocimientos tienes las bases y las herramientas necesarias para profundizar en los conceptos y definiciones que encierra cada una de las palabras clave de Python.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/python-palabras-clave" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: return</title><link href="https://pythonscouts.com/python-return/" rel="alternate"/><published>2025-12-06T20:30:00+01:00</published><updated>2025-12-06T20:30:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-12-06:/python-return/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;return&lt;/code&gt; se utiliza para finalizar la ejecución de una función y enviar el resultado al código que llama a dicha función.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Esta &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; es una parte esencial de las funciones porque permite que estas devuelvan resultados útiles que puedes utilizar posteriormente en tu código.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/return-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-return"&gt;Uso de return&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica de la palabra clave &lt;code&gt;return&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Donde &lt;code&gt;expression&lt;/code&gt; es opcional y representa el valor que deseas devolver. Si no proporcionas ninguna expresión, la función devolverá &lt;a href="/python-none/"&gt;&lt;code&gt;None&lt;/code&gt;&lt;/a&gt; de manera predeterminada.&lt;/p&gt;
&lt;p&gt;Si omites la sentencia &lt;code&gt;return&lt;/code&gt;, Python automáticamente devuelve &lt;code&gt;None&lt;/code&gt; al concluir la ejecución de tu función.&lt;/p&gt;
&lt;p&gt;También debes tener en cuenta que solo puedes usar &lt;code&gt;return&lt;/code&gt; dentro de funciones.&lt;/p&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Veamos algunos ejemplos prácticos del uso de &lt;code&gt;return&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;
&lt;span class="go"&gt;8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, la función &lt;code&gt;add()&lt;/code&gt; toma dos argumentos numéricos &lt;code&gt;a&lt;/code&gt; y &lt;code&gt;b&lt;/code&gt;, y utiliza &lt;code&gt;return&lt;/code&gt; para devolver la suma de estos. El valor devuelto se almacena en la &lt;a href="/variables-python/"&gt;variable&lt;/a&gt; &lt;code&gt;result&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;no_return&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;no_return&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;Hola!&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, la función &lt;code&gt;no_return()&lt;/code&gt; imprime un mensaje y luego usa &lt;code&gt;return&lt;/code&gt; sin una expresión o valor de retorno, lo que significa que devuelve &lt;code&gt;None&lt;/code&gt; implícitamente.&lt;/p&gt;
&lt;p&gt;Obtendrás el mismo resultado o comportamiento si obvias por completo la sentencia &lt;code&gt;return&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="uso-de-return"&gt;Uso de &lt;code&gt;return&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;return&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finalizar la ejecución de una función y devolver un valor de retorno al código que la llamas.&lt;/li&gt;
&lt;li&gt;Facilitar la reutilización de código al permitir encapsular porciones específicas de código que realizan una tarea o calculan un valor.&lt;/li&gt;
&lt;li&gt;Controlar el flujo de ejecución dentro de funciones, ya que puedes utilizar &lt;code&gt;return&lt;/code&gt; para salir de la función en cualquier momento.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;En Python, la palabra clave &lt;code&gt;return&lt;/code&gt; es fundamental para la creación de funciones, pues te permite obtener y devolver valores al código que las llama.&lt;/p&gt;
&lt;p&gt;Conocer y emplear &lt;code&gt;return&lt;/code&gt; te permite escribir funciones que no solo realicen tareas, sino que también devuelvan resultados útiles.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/return-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: class</title><link href="https://pythonscouts.com/python-class/" rel="alternate"/><published>2025-12-01T08:50:00+01:00</published><updated>2025-12-01T08:50:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-12-01:/python-class/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;class&lt;/code&gt; se utiliza para definir nuevas clases, que son plantillas para crear objetos.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Las clases encapsulan datos y funcionalidades en una sola entidad, lo que te permite modelar objetos del mundo real y sus interacciones de manera eficiente.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/class-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-class"&gt;Uso de class&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para definir una clase en Python es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ClassName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;cls_attribute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;  &lt;span class="c1"&gt;# Atributo de clase&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt;  &lt;span class="c1"&gt;# Atributo de instancia&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes un ejemplo rápido que ilustra cómo se usa la palabra clave &lt;code&gt;class&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; dice ¡Guau!&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;fido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Fido&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;fido&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bark&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Fido dice ¡Guau!&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;fido&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Fido&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, definimos una clase &lt;code&gt;Dog&lt;/code&gt; que tiene un método &lt;code&gt;.bark()&lt;/code&gt;. Cuando creamos un objeto &lt;code&gt;fido&lt;/code&gt; de la clase &lt;code&gt;Dog&lt;/code&gt;, podemos llamar a sus métodos para que realice acciones, como ladrar con &lt;code&gt;.bark()&lt;/code&gt;. También podemos acceder a sus atributos o datos con la notación de punto.&lt;/p&gt;
&lt;h2 id="uso-de-class"&gt;Uso de &lt;code&gt;class&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;class&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crear objetos con atributos y métodos que modelan entidades del mundo real.&lt;/li&gt;
&lt;li&gt;Facilitar la reutilización de código mediante herencia.&lt;/li&gt;
&lt;li&gt;Encapsular y ocultar detalles internos de implementación para mejorar la modularidad.&lt;/li&gt;
&lt;li&gt;Definir estructuras de datos complejas y personalizadas.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;class&lt;/code&gt; en Python es fundamental para la programación orientada a objetos, permitiéndote definir nuevas estructuras de datos y modelar comportamientos complejos.&lt;/p&gt;
&lt;p&gt;Conocer y emplear esta palabra clave te ayuda a crear aplicaciones más organizadas, modulares y escalables.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/class-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Estructuras de datos en Python: Arreglos (arrays)</title><link href="https://pythonscouts.com/python-array/" rel="alternate"/><published>2025-11-23T22:50:00+01:00</published><updated>2025-11-23T22:50:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-11-23:/python-array/</id><summary type="html">&lt;p&gt;Los arreglos o arrays son una de las estructuras de datos más usadas en programación. Proporcionan una forma de almacenar un número fijo de elementos en una secuencia.&lt;/p&gt;</summary><content type="html">&lt;p&gt;En este artículo, aprenderás cómo implementar un arreglo en Python, incluyendo sus operaciones y características principales.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/array-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#que-es-un-arreglo-o-array"&gt;¿Qué es un arreglo o array?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#operaciones-comunes-en-un-arreglo"&gt;Operaciones comunes en un arreglo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#implementacion-de-un-arreglo-en-python"&gt;Implementación de un arreglo en Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplo-de-uso-del-arreglo"&gt;Ejemplo de uso del arreglo&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#inicializacion"&gt;Inicialización&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#acceso-y-modificacion-de-elementos"&gt;Acceso y modificación de elementos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#limpiar-el-arreglo"&gt;Limpiar el arreglo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#longitud-y-pertenencia"&gt;Longitud y pertenencia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#iteracion"&gt;Iteración&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#representacion-en-cadena"&gt;Representación en cadena&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="que-es-un-arreglo-o-array"&gt;¿Qué es un arreglo o array?&lt;/h2&gt;
&lt;p&gt;Un arreglo es una colección de elementos, cada uno identificado por un índice entero. Las características fundamentales de un arreglo incluyen las siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tamaño fijo&lt;/strong&gt;: El tamaño o número de elementos del arreglo se determina al crearlo y no se puede cambiar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Acceso aleatorio&lt;/strong&gt;: Los elementos se pueden acceder directamente usando índices que comienzan en &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Homogéneo o heterogéneo&lt;/strong&gt;: Los arreglos pueden almacenar elementos del mismo tipo de dato o de tipos mixtos, dependiendo de la implementación.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En Python, los arreglos no están integrados como una estructura de datos primitiva. La biblioteca estándar incluye el tipo &lt;code&gt;array.array&lt;/code&gt; para trabajar con datos numéricos homogéneos, pero en este artículo implementarás tu propio arreglo usando el módulo &lt;code&gt;ctypes&lt;/code&gt; para tener un mayor control de bajo nivel.&lt;/p&gt;
&lt;p&gt;A través de este ejercicio, podrás obtener una serie de habilidades fundamentales en Python, como puede ser el uso de clases y de métodos especiales, también conocidos como métodos mágicos o dunder.&lt;/p&gt;
&lt;h2 id="operaciones-comunes-en-un-arreglo"&gt;Operaciones comunes en un arreglo&lt;/h2&gt;
&lt;p&gt;A continuación, un resumen de las operaciones que soportará tu arreglo:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Operación&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Descripción&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;array = Array(size)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Construye un arreglo que puede contener &lt;code&gt;size&lt;/code&gt; elementos.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;array[index]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Accede al elemento en &lt;code&gt;index&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;array[index] = value&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Asigna &lt;code&gt;value&lt;/code&gt; al elemento en &lt;code&gt;index&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;array.clear([value])&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restablece todos los elementos del arreglo, asignándoles el valor &lt;code&gt;value&lt;/code&gt; o &lt;code&gt;None&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;len(array)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Devuelve la longitud del arreglo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;item in array&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Devuelve &lt;code&gt;True&lt;/code&gt; si &lt;code&gt;item&lt;/code&gt; está contenido en el arreglo y &lt;code&gt;False&lt;/code&gt; si no lo está.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;for item in array: ...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Itera sobre los elementos del arreglo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;for item in reversed(array): ...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Itera sobre los elementos en orden inverso.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="implementacion-de-un-arreglo-en-python"&gt;Implementación de un arreglo en Python&lt;/h2&gt;
&lt;p&gt;A continuación encontrarás la implementación del arreglo en Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - array_python.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;ctypes&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Generator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Array size must be a positive integer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py_object&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_size&lt;/span&gt;&lt;span class="p"&gt;)()&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&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="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_type&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
            &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
            &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Expected type &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, got &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_size&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__len__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_size&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__contains__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_check_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Index out of range: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. &amp;quot;&lt;/span&gt;
                &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Valid range: 0 to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__getitem__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_check_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__setitem__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_type&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_type&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Expected type &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, got &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_check_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__iter__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Generator&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__reversed__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Generator&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;yield from&lt;/span&gt; &lt;span class="nb"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__str__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;(&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__repr__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;(size=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El atributo &lt;code&gt;._size&lt;/code&gt; almacena el tamaño fijo del arreglo o el número de posiciones disponibles, mientras que &lt;code&gt;._data&lt;/code&gt; proporciona un arreglo de bajo nivel creado con &lt;code&gt;ctypes.py_object * size&lt;/code&gt;, donde se guardan las referencias a los objetos de Python.&lt;/p&gt;
&lt;p&gt;En &lt;code&gt;._type&lt;/code&gt;, se guarda el tipo de dato de los elementos del arreglo. Una vez que asignas el primer valor no nulo, solo se permiten valores de ese mismo tipo.&lt;/p&gt;
&lt;p&gt;El método &lt;code&gt;.clear()&lt;/code&gt; recorre todas las posiciones del arreglo y les asigna &lt;code&gt;value&lt;/code&gt; o &lt;code&gt;None&lt;/code&gt;. Si &lt;code&gt;._type&lt;/code&gt; ya está fijado, comprueba que &lt;code&gt;value&lt;/code&gt; coincida con ese tipo.&lt;/p&gt;
&lt;p&gt;Los métodos especiales te permiten ofrecer las siguientes funcionalidades:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.__getitem__()&lt;/code&gt;&lt;/strong&gt;: devuelve el valor almacenado en &lt;code&gt;index&lt;/code&gt; después de verificar que el índice esté dentro del rango válido.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.__setitem__()&lt;/code&gt;&lt;/strong&gt;: fija el tipo de dato de los elementos del arreglo con el primer &lt;code&gt;value&lt;/code&gt; no nulo. A partir de ahí, solo permite valores de ese tipo. También valida que el índice esté en rango antes de asignar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;__len__&lt;/code&gt;&lt;/strong&gt;: devuelve el tamaño del arreglo o el número de elementos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;__contains__()&lt;/code&gt;&lt;/strong&gt;: comprueba si &lt;code&gt;value&lt;/code&gt; está contenido en el arreglo y devuelve &lt;code&gt;True&lt;/code&gt; o &lt;code&gt;False&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;__iter__&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;__reversed__&lt;/code&gt;&lt;/strong&gt;: permiten iterar sobre los elementos del arreglo en orden normal o inverso.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;__str__&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;__repr__&lt;/code&gt;&lt;/strong&gt;: devuelven representaciones de cadena que muestran el contenido actual del arreglo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ejemplo-de-uso-del-arreglo"&gt;Ejemplo de uso del arreglo&lt;/h2&gt;
&lt;p&gt;En esta sección verás ejemplos prácticos de cómo crear, inicializar y manipular instancias de tu clase &lt;code&gt;Array&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="inicializacion"&gt;Inicialización&lt;/h3&gt;
&lt;p&gt;Para crear un &lt;code&gt;Array&lt;/code&gt;, solo necesitas indicar su tamaño. Todos los elementos se inicializan con &lt;code&gt;None&lt;/code&gt; por defecto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Array&lt;/span&gt;&lt;span class="p"&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;# Crea un arreglo con 5 elementos&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Array(None, None, None, None, None)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="acceso-y-modificacion-de-elementos"&gt;Acceso y modificación de elementos&lt;/h3&gt;
&lt;p&gt;Puedes leer y escribir elementos con el operador de indexado &lt;code&gt;[index]&lt;/code&gt;, igual que en una lista:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;  &lt;span class="c1"&gt;# Establece el primer elemento a 42&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;42&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si intentas asignar un valor de un tipo de dato diferente al que ya tiene el arreglo, o usar un índice fuera del rango válido, obtendrás errores claros:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&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="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;tres&amp;quot;&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;TypeError&lt;/span&gt;: &lt;span class="n"&gt;Expected type &amp;lt;class &amp;#39;int&amp;#39;&amp;gt;, got &amp;lt;class &amp;#39;str&amp;#39;&amp;gt;&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&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;10&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;IndexError&lt;/span&gt;: &lt;span class="n"&gt;Index out of range: 3. Valid range: 0 to 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="limpiar-el-arreglo"&gt;Limpiar el arreglo&lt;/h3&gt;
&lt;p&gt;El método &lt;code&gt;.clear()&lt;/code&gt; restablece todos los elementos asignándoles el valor especificado. El valor predeterminado es &lt;code&gt;None&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&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;# Establece todos los elementos a 0&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Array(0, 0, 0, 0, 0)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="longitud-y-pertenencia"&gt;Longitud y pertenencia&lt;/h3&gt;
&lt;p&gt;El método &lt;code&gt;.__len__()&lt;/code&gt; devuelve el tamaño del arreglo, mientras que &lt;code&gt;.__contains__()&lt;/code&gt; verifica si un elemento existe en el arreglo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;5&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="iteracion"&gt;Iteración&lt;/h3&gt;
&lt;p&gt;Los métodos &lt;code&gt;.__iter__()&lt;/code&gt; y &lt;code&gt;.__reversed__()&lt;/code&gt; permiten iterar sobre el arreglo tanto hacia adelante como hacia atrás:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&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="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&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;4&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;4&lt;/span&gt;
&lt;span class="go"&gt;5&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;5&lt;/span&gt;
&lt;span class="go"&gt;4&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="representacion-en-cadena"&gt;Representación en cadena&lt;/h3&gt;
&lt;p&gt;Los métodos &lt;code&gt;.__str__()&lt;/code&gt; y &lt;code&gt;.__repr__()&lt;/code&gt; son más bien utilitarios y proporcionan representaciones legibles para humanos y amigables para desarrolladores:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Array(0, 0, 0, 0, 0)&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;repr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;Array(size=5)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="conclusion"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Has aprendido cómo implementar un arreglo de tamaño fijo que proporciona operaciones esenciales como indexación, iteración y pertenencia, al tiempo que refuerza la consistencia del tipo de dato de sus elementos. Este conocimiento te sirve de base para entender estructuras de datos fundamentales en Python.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/array-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/></entry><entry><title>Palabras clave en Python: while</title><link href="https://pythonscouts.com/python-while/" rel="alternate"/><published>2025-11-22T21:40:00+01:00</published><updated>2025-11-22T21:40:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-11-22:/python-while/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;while&lt;/code&gt; te permite definir bucles que ejecutan un bloque de código repetidamente mientras una condición sea verdadera.&lt;/p&gt;</summary><content type="html">&lt;p&gt;La &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; &lt;code&gt;while&lt;/code&gt; en Python define una estructura de control llamada bucle. Este tipo de bucle te permite ejecutar un bloque de código múltiples veces mientras una condición lógica sea verdadera. Si la condición es falsa desde el principio, el cuerpo del bucle no se ejecuta ni una sola vez.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/while-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-while"&gt;Uso de while&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para un bucle &lt;code&gt;while&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos que muestran cómo crear bucles &lt;code&gt;while&lt;/code&gt; en Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, el bucle &lt;code&gt;while&lt;/code&gt; se ejecuta mientras &lt;code&gt;counter&lt;/code&gt; sea menor que 5. En cada repetición, se imprime el valor actual de &lt;code&gt;counter&lt;/code&gt; y luego se incrementa en &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;El siguiente ejemplo muestra cómo usar un bucle &lt;code&gt;while&lt;/code&gt; para contar hacia atrás:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;5&lt;/span&gt;
&lt;span class="go"&gt;4&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, el bucle &lt;code&gt;while&lt;/code&gt; se ejecuta mientras &lt;code&gt;number&lt;/code&gt; sea mayor que 0, imprimiendo el valor de &lt;code&gt;number&lt;/code&gt; y luego disminuyéndolo en &lt;code&gt;1&lt;/code&gt; en cada iteración.&lt;/p&gt;
&lt;h2 id="uso-de-while"&gt;Uso de &lt;code&gt;while&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;while&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Repetir un bloque de código hasta que se cumpla una condición específica.&lt;/li&gt;
&lt;li&gt;Crear bucles que dependen de condiciones dinámicas que pueden cambiar durante la ejecución del programa.&lt;/li&gt;
&lt;li&gt;Implementar bucles infinitos que se detienen mediante condiciones internas y una instrucción &lt;code&gt;break&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;El bucle &lt;code&gt;while&lt;/code&gt; es una herramienta muy útil en Python, pues te permite ejecutar código repetidamente mientras se cumpla una condición.&lt;/p&gt;
&lt;p&gt;Conocer y utilizar la palabra clave &lt;code&gt;while&lt;/code&gt; te proporciona la flexibilidad de controlar el flujo de tu programa y manejar tareas repetitivas de manera eficiente.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/while-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>¿Cómo gestionar un proyecto Python con uv?</title><link href="https://pythonscouts.com/gestionar-proyecto-python-uv/" rel="alternate"/><published>2025-10-05T22:55:00+02:00</published><updated>2025-10-05T22:55:00+02:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-10-05:/gestionar-proyecto-python-uv/</id><summary type="html">&lt;p&gt;La herramienta de línea de comandos &lt;code&gt;uv&lt;/code&gt; te permite gestionar proyectos Python y sus dependencias de manera eficiente y precisa.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Esta herramienta ofrece una alternativa rápida y completa a otras como &lt;code&gt;pip&lt;/code&gt;, &lt;code&gt;pip-tools&lt;/code&gt; o &lt;code&gt;poetry&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Con &lt;code&gt;uv&lt;/code&gt; puedes instalar diferentes versiones de Python, crear proyectos desde cero, gestionar &lt;a href="/entorno-virtual-python/"&gt;entornos virtuales&lt;/a&gt;, añadir y remover dependencias garantizando reproducibilidad, e incluso construir y publicar tus proyectos en PyPI. Todo desde un único flujo de trabajo.&lt;/p&gt;
&lt;p&gt;En esta guía aprenderás lo básico de cómo usar &lt;code&gt;uv&lt;/code&gt; para ejecutar las tareas más comunes de gestión de proyectos Python, desde la instalación hasta la distribución.&lt;/p&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#instalar-uv-en-tu-sistema"&gt;Instalar uv en tu sistema&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#gestionar-multiples-versiones-de-python"&gt;Gestionar múltiples versiones de Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#iniciar-un-proyecto-python-con-uv"&gt;Iniciar un proyecto Python con uv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#gestionar-dependencias-de-proyectos"&gt;Gestionar dependencias de proyectos&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#crear-un-entorno-virtual-para-tu-proyecto"&gt;Crear un entorno virtual para tu proyecto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#instalar-dependencias-de-ejecucion"&gt;Instalar dependencias de ejecución&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#instalar-dependencias-de-desarrollo"&gt;Instalar dependencias de desarrollo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#desinstalar-dependencias"&gt;Desinstalar dependencias&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#distribuir-y-publicar-el-proyecto"&gt;Distribuir y publicar el proyecto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="instalar-uv-en-tu-sistema"&gt;Instalar &lt;code&gt;uv&lt;/code&gt; en tu sistema&lt;/h2&gt;
&lt;p&gt;En macOS y Linux, puedes instalar &lt;code&gt;uv&lt;/code&gt; con el comando siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-LsSf&lt;span class="w"&gt; &lt;/span&gt;https://astral.sh/uv/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si no dispones de &lt;code&gt;curl&lt;/code&gt; en tu sistema, entonces puedes usar &lt;code&gt;wget&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;wget&lt;span class="w"&gt; &lt;/span&gt;-qO-&lt;span class="w"&gt; &lt;/span&gt;https://astral.sh/uv/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En Windows, puedes usar el comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Powershell&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;powershell&lt;/span&gt; &lt;span class="n"&gt;-ExecutionPolicy&lt;/span&gt; &lt;span class="n"&gt;ByPass&lt;/span&gt; &lt;span class="n"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;irm https://astral.sh/uv/install.ps1 | iex&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Una vez concluida la instalación, &lt;code&gt;uv&lt;/code&gt; estará disponible en tu sistema. Puedes comprobarla con el comando &lt;code&gt;uv --version&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="gestionar-multiples-versiones-de-python"&gt;Gestionar múltiples versiones de Python&lt;/h2&gt;
&lt;p&gt;Con &lt;code&gt;uv&lt;/code&gt; puedes instalar y usar distintas versiones de Python fácilmente. Para instalar una versión de Python, por ejemplo la 3.13, usa el comando siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.13
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Esto te permite trabajar con varios proyectos que requieran versiones diferentes del lenguaje.&lt;/p&gt;
&lt;p&gt;Con el comando &lt;code&gt;uv python list&lt;/code&gt;, puedes listar las versiones disponibles y con &lt;code&gt;uv python pin &amp;lt;version&amp;gt;&lt;/code&gt;, puedes fijar la versión de Python que quieres emplear en un proyecto específico.&lt;/p&gt;
&lt;h2 id="iniciar-un-proyecto-python-con-uv"&gt;Iniciar un proyecto Python con &lt;code&gt;uv&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Con &lt;code&gt;uv&lt;/code&gt; puedes crear la estructura inicial de tus nuevos proyectos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;project_name
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este comando crea la estructura de proyecto siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Texto&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;project_name/
│
├── .git/
├── .gitignore
├── .python-version
├── README.md
├── main.py
└── pyproject.toml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí tienes un repositorio Git con su correspondiente archivo &lt;code&gt;.gitignore&lt;/code&gt;. Luego tienes el archivo &lt;code&gt;.python-version&lt;/code&gt; donde &lt;code&gt;uv&lt;/code&gt; almacena la versión de Python para el proyecto. El archivo &lt;code&gt;README.md&lt;/code&gt; provee el espacio para la documentación básica del proyecto.&lt;/p&gt;
&lt;p&gt;Seguidamente tienes el archivo &lt;code&gt;main.py&lt;/code&gt; que es el script de entrada del proyecto. Puedes modificarlo según tus necesidades o puedes incluso reemplazarlo por otro. Finalmente, tienes el archivo &lt;code&gt;pyproject.toml&lt;/code&gt; que contiene la configuración necesaria para construir y distribuir tu proyecto.&lt;/p&gt;
&lt;p&gt;Alternativamente, puedes emplear varias estructuras disponibles en dependencia de tus necesidades:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;--app&lt;span class="w"&gt; &lt;/span&gt;app_name
&lt;span class="gp"&gt;$ &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;--lib&lt;span class="w"&gt; &lt;/span&gt;library_name
&lt;span class="gp"&gt;$ &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;--pkg&lt;span class="w"&gt; &lt;/span&gt;package_name
&lt;span class="gp"&gt;$ &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;--script&lt;span class="w"&gt; &lt;/span&gt;script_name
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cada tipo genera una estructura inicial de archivos adaptada al caso. Puedes usar esta estructura como punto de partida para programar tu proyecto.&lt;/p&gt;
&lt;p&gt;Debes notar que estos comandos crean el directorio raíz del proyecto usando el nombre suministrado. Si ya has creado el directorio, entonces puedes ejecutar &lt;code&gt;uv init .&lt;/code&gt; dentro del mismo.&lt;/p&gt;
&lt;p&gt;Una vez que has inicializado un proyecto de aplicación, puedes ejecutarlo con el comando &lt;code&gt;uv run main.py&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="gestionar-dependencias-de-proyectos"&gt;Gestionar dependencias de proyectos&lt;/h2&gt;
&lt;p&gt;Uno de los puntos fuertes de &lt;code&gt;uv&lt;/code&gt; es la gestión de dependencias. Con &lt;code&gt;uv&lt;/code&gt; puedes instalar y desinstalar dependencias de manera rápida y precisa. Además, &lt;code&gt;uv&lt;/code&gt; mantiene un estricto registro y control de dependencias que facilita la reproducibilidad de tu entorno de desarrollo en otros sistemas. Esta característica es fundamental cuando trabajas en equipo.&lt;/p&gt;
&lt;p&gt;Cuando añades dependencias con &lt;code&gt;uv&lt;/code&gt;, se actualizan automáticamente los archivos &lt;code&gt;pyproject.toml&lt;/code&gt; y &lt;code&gt;uv.lock&lt;/code&gt;. El primero declara las dependencias, mientras que el segundo mantiene un registro estricto de las versiones instaladas.&lt;/p&gt;
&lt;p&gt;A continuación aprenderás cómo instalar y desinstalar dependencias externas con &lt;code&gt;uv&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="crear-un-entorno-virtual-para-tu-proyecto"&gt;Crear un entorno virtual para tu proyecto&lt;/h3&gt;
&lt;p&gt;Luego que has inicializado tu proyecto, puedes crear un entorno virtual Python manualmente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;venv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El nombre del directorio del entorno virtual es &lt;code&gt;.venv&lt;/code&gt; por defecto, pero puedes usar el nombre que desees con solo añadirlo después del subcomando &lt;code&gt;venv&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;El entorno virtual hará referencia al intérprete de Python disponible directamente en tu sistema, entorno de trabajo o shell.&lt;/p&gt;
&lt;p&gt;Debes saber que el entorno virtual se crea automáticamente (si es que no existe) cuando ejecutas comandos como &lt;code&gt;uv run&lt;/code&gt;, &lt;code&gt;uv add&lt;/code&gt;, &lt;code&gt;uv sync&lt;/code&gt;, o &lt;code&gt;uv lock&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="instalar-dependencias-de-ejecucion"&gt;Instalar dependencias de ejecución&lt;/h3&gt;
&lt;p&gt;Las dependencias de ejecución son aquellas bibliotecas o paquetes que empleas directamente en el código de tu proyecto.&lt;/p&gt;
&lt;p&gt;Por ejemplo, digamos que estás creando un proyecto de Inteligencia Artificial y quieres emplear la API de OpenAI. Puedes instalar la librería &lt;code&gt;openai&lt;/code&gt; con el siguiente comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;openai
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este comando añade la librería &lt;code&gt;openai&lt;/code&gt; al proyecto como dependencia de ejecución.&lt;/p&gt;
&lt;h3 id="instalar-dependencias-de-desarrollo"&gt;Instalar dependencias de desarrollo&lt;/h3&gt;
&lt;p&gt;Las dependencias de desarrollo son aquellas que necesitas durante el ciclo de desarrollo de tu proyecto. Por ejemplo, puedes necesitar &lt;code&gt;pytest&lt;/code&gt; para escribir y ejecutar test unitarios para tu proyecto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;--dev&lt;span class="w"&gt; &lt;/span&gt;pytest
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este comando instala &lt;code&gt;pytest&lt;/code&gt; como dependencia de desarrollo, actualizando los archivos &lt;code&gt;uv.lock&lt;/code&gt; y &lt;code&gt;pyproject.toml&lt;/code&gt; de manera adecuada.&lt;/p&gt;
&lt;h3 id="desinstalar-dependencias"&gt;Desinstalar dependencias&lt;/h3&gt;
&lt;p&gt;Para eliminar un paquete o biblioteca que ya habías instalado y que no necesitas más, puedes usar el comando siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;remove&lt;span class="w"&gt; &lt;/span&gt;pytest
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este comando desinstala la biblioteca &lt;code&gt;pytest&lt;/code&gt; y todas sus dependencias transitivas, dejando tu entorno virtual de trabajo limpio de paquetes no necesarios. También actualiza el archivo &lt;code&gt;uv.lock&lt;/code&gt; de acuerdo con los cambios.&lt;/p&gt;
&lt;h2 id="distribuir-y-publicar-el-proyecto"&gt;Distribuir y publicar el proyecto&lt;/h2&gt;
&lt;p&gt;Con &lt;code&gt;uv&lt;/code&gt; también puedes empaquetar y publicar tu proyecto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;build
&lt;span class="gp"&gt;$ &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;publish&lt;span class="w"&gt; &lt;/span&gt;--token&lt;span class="w"&gt; &lt;/span&gt;tu_token_aquí
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El primer comando genera los artefactos de distribución que se guardan en el directorio &lt;code&gt;dist/&lt;/code&gt; por defecto. El segundo comando sube estos artefactos a PyPI.&lt;/p&gt;
&lt;p&gt;Debes notar que para que estos comandos funcionen correctamente, es necesario configurar el script de entrada del proyecto y el sistema de construcción (build system). Todo esto en el archivo &lt;code&gt;pyproject.toml&lt;/code&gt; de tu proyecto.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Con &lt;code&gt;uv&lt;/code&gt; puedes gestionar todo el ciclo de vida de un proyecto Python desde la línea de comandos de manera rápida, precisa y eficiente. Es una alternativa ligera y moderna frente a herramientas como &lt;code&gt;poetry&lt;/code&gt; y puede reemplazar la funcionalidad de herramientas como &lt;code&gt;pyenv&lt;/code&gt;, &lt;code&gt;pip&lt;/code&gt;, &lt;code&gt;venv&lt;/code&gt;, &lt;code&gt;pip-tools&lt;/code&gt;, &lt;code&gt;twine&lt;/code&gt; entre otras.&lt;/p&gt;</content><category term="Guías"/><category term="python"/></entry><entry><title>Palabras clave en Python: for</title><link href="https://pythonscouts.com/python-for/" rel="alternate"/><published>2025-10-02T20:00:00+02:00</published><updated>2025-10-02T20:00:00+02:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-10-02:/python-for/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;for&lt;/code&gt; se utiliza para iterar sobre secuencias de elementos como pueden ser las listas, tuplas, cadenas, o cualquier objeto que sea iterable.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Esta &lt;a href="/python-palabras-clave/"&gt;palabra clave&lt;/a&gt; define una estructura de control llamada &lt;strong&gt;ciclo&lt;/strong&gt; o &lt;strong&gt;bucle&lt;/strong&gt; que te permite ejecutar acciones sobre o con cada elemento en la secuencia, facilitando la automatización de tareas repetitivas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/for-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-for"&gt;Uso de for&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica de un ciclo &lt;code&gt;for&lt;/code&gt; en Python es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;variable&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;iterable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Donde &lt;code&gt;variable&lt;/code&gt; toma el valor de cada elemento en el &lt;code&gt;iterable&lt;/code&gt;, y el bloque de código se ejecuta para cada uno de estos valores.&lt;/p&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;A continuación algunos ejemplos de cómo usar el ciclo &lt;code&gt;for&lt;/code&gt; en tu código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="ow"&gt;in&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, el ciclo &lt;code&gt;for&lt;/code&gt; itera sobre una lista de números, y &lt;code&gt;print(number)&lt;/code&gt; se ejecuta para cada número en la lista.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Para aprender más sobre los ciclos &lt;code&gt;for&lt;/code&gt; revisa el tutorial &lt;a href="/ciclos-for-python/"&gt;Python a través de ejemplos: Ciclos o bucles &lt;code&gt;for&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;p&gt;También puedes iterar sobre los caracteres de una &lt;a href="/valores-python/#valores-de-cadena-de-caracteres"&gt;cadena&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;letter&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Python&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;letter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;P&lt;/span&gt;
&lt;span class="go"&gt;y&lt;/span&gt;
&lt;span class="go"&gt;t&lt;/span&gt;
&lt;span class="go"&gt;h&lt;/span&gt;
&lt;span class="go"&gt;o&lt;/span&gt;
&lt;span class="go"&gt;n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, el ciclo &lt;code&gt;for&lt;/code&gt; recorre cada caracter de la cadena &lt;code&gt;"Python"&lt;/code&gt; e imprime cada uno de ellos en pantalla.&lt;/p&gt;
&lt;p&gt;El ejemplo siguiente muestra cómo iterar sobre un diccionario y acceder a sus claves y valores:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;students&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="s2"&gt;&amp;quot;Ana&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="s2"&gt;&amp;quot;Luis&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="s2"&gt;&amp;quot;María&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; tiene &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; años&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;Ana tiene 18 años&lt;/span&gt;
&lt;span class="go"&gt;Luis tiene 20 años&lt;/span&gt;
&lt;span class="go"&gt;María tiene 19 años&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este caso, el método &lt;code&gt;.items()&lt;/code&gt; devuelve pares de clave y valor que puedes desempaquetar directamente en el ciclo &lt;code&gt;for&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="uso-de-for"&gt;Uso de &lt;code&gt;for&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;for&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Iterar sobre elementos en una lista, tupla, conjunto o diccionario.&lt;/li&gt;
&lt;li&gt;Recorrer cadenas de caracteres.&lt;/li&gt;
&lt;li&gt;Ejecutar un bloque de código un número específico de veces utilizando la función &lt;code&gt;range()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Trabajar con estructuras de datos complejas y realizar operaciones en cada elemento.&lt;/li&gt;
&lt;li&gt;Iterar sobre un archivo línea por línea.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;for&lt;/code&gt; es fundamental en Python para realizar iteraciones sobre secuencias de elementos de manera eficiente y clara.&lt;/p&gt;
&lt;p&gt;Conocer y emplear esta palabra clave te permitirá automatizar tareas repetitivas y manejar colecciones de datos de forma efectiva.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/for-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: if</title><link href="https://pythonscouts.com/python-if/" rel="alternate"/><published>2025-09-21T19:30:00+02:00</published><updated>2025-09-21T19:30:00+02:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-09-21:/python-if/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;if&lt;/code&gt; se utiliza para construir sentencias condicionales, permitiéndote ejecutar bloques de código basados en la evaluación de una condición.&lt;/p&gt;</summary><content type="html">&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/if-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-if"&gt;Uso de if&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica de una sentencia &lt;code&gt;if&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puedes extender una sentencia &lt;code&gt;if&lt;/code&gt; con las palabras clave &lt;code&gt;elif&lt;/code&gt; y &lt;code&gt;else&lt;/code&gt; para gestionar múltiples condiciones:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="c1"&gt;# Se ejecuta si condition1 es verdadera&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;condition2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="c1"&gt;# Se ejecuta si condition2 es verdadera&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;condition3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="c1"&gt;# Se ejecuta si condition3 es verdadera&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="c1"&gt;# Se ejecuta si ninguna de las condiciones anteriores es verdadera&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puedes usar tantas cláusulas &lt;code&gt;elif&lt;/code&gt; como necesites, pero solo puedes tener una única cláusula &lt;code&gt;else&lt;/code&gt;. La cláusula &lt;code&gt;else&lt;/code&gt; siempre debe aparecer al final.&lt;/p&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Estos son algunos ejemplos de cómo usar la palabra clave &lt;code&gt;if&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x es mayor que 5&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;x es mayor que 5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, como &lt;code&gt;x&lt;/code&gt; es mayor que &lt;code&gt;5&lt;/code&gt;, el bloque de código de la sentencia &lt;code&gt;if&lt;/code&gt; se ejecuta y la función &lt;code&gt;print()&lt;/code&gt; muestra el mensaje correspondiente.&lt;/p&gt;
&lt;p&gt;La cláusula &lt;code&gt;else&lt;/code&gt; funciona como bloque por defecto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;y es mayor que 5&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;y no es mayor que 5&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;y no es mayor que 5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, como &lt;code&gt;y&lt;/code&gt; no es mayor que &lt;code&gt;5&lt;/code&gt;, se ejecuta el bloque de código asociado a &lt;code&gt;else&lt;/code&gt; y la función &lt;code&gt;print()&lt;/code&gt; muestra el mensaje en pantalla.&lt;/p&gt;
&lt;p&gt;Ahora considera el ejemplo siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;z es mayor que 10&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;z es mayor que 5 pero no mayor que 10&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;z no es mayor que 5&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;z es mayor que 5 pero no mayor que 10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, &lt;code&gt;z&lt;/code&gt; es mayor que &lt;code&gt;5&lt;/code&gt; pero no mayor que &lt;code&gt;10&lt;/code&gt;, por lo que se ejecuta el bloque de código asociado a &lt;code&gt;elif&lt;/code&gt; y la función &lt;code&gt;print()&lt;/code&gt; muestra el mensaje especificado.&lt;/p&gt;
&lt;h2 id="uso-de-if"&gt;Uso de &lt;code&gt;if&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;if&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Controlar el flujo del programa ejecutando código basado en condiciones específicas.&lt;/li&gt;
&lt;li&gt;Implementar lógica de decisiones en funciones y métodos.&lt;/li&gt;
&lt;li&gt;Validar y verificar datos antes de proceder con operaciones críticas.&lt;/li&gt;
&lt;li&gt;Ejecutar diferentes caminos de ejecución en algoritmos y estructuras de datos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;if&lt;/code&gt; en Python es fundamental para controlar el flujo de ejecución de tus programas basado en condiciones.&lt;/p&gt;
&lt;p&gt;Conocer y usar esta palabra clave te permite crear programas que tomen decisiones dinámicas según las condiciones que enfrenten, mejorando la capacidad de respuesta y adaptabilidad de tus aplicaciones.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/if-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: def</title><link href="https://pythonscouts.com/python-def/" rel="alternate"/><published>2025-07-29T23:10:00+02:00</published><updated>2025-07-29T23:10:00+02:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-07-29:/python-def/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;def&lt;/code&gt; se utiliza para definir una nueva función. Las funciones son bloques de código reutilizables que realizan una tarea específica.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Una vez que escribes una función, puedes llamarla en cualquier parte de tu programa para ejecutar esa tarea.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/def-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-def"&gt;Uso de def&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis básica para definir una función con &lt;code&gt;def&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;function_name&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;return_value&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Los corchetes indican elementos opcionales. De modo similar, los corchetes angulares denotan elementos requeridos.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos de cómo puedes usar &lt;code&gt;def&lt;/code&gt; para definir tus funciones:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;¡Hola, Mundo!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;¡Hola, Mundo!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, has definido una función llamada &lt;code&gt;greet()&lt;/code&gt; que imprime &lt;code&gt;¡Hola, Mundo!&lt;/code&gt; cuando la llamas.&lt;/p&gt;
&lt;p&gt;La función &lt;code&gt;add()&lt;/code&gt; permite sumar dos números:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, la función &lt;code&gt;add()&lt;/code&gt; toma dos argumentos &lt;code&gt;a&lt;/code&gt; y &lt;code&gt;b&lt;/code&gt; que deben ser números, y devuelve su suma. Cuando llamas a &lt;code&gt;add(3, 5)&lt;/code&gt;, obtienes el resultado &lt;code&gt;8&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="uso-de-def"&gt;Uso de &lt;code&gt;def&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;def&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crear funciones que encapsulen lógica reutilizable en tu código.&lt;/li&gt;
&lt;li&gt;Dividir el código en unidades modulares y más fáciles de mantener.&lt;/li&gt;
&lt;li&gt;Definir funciones con parámetros para recibir argumentos y devolver valores.&lt;/li&gt;
&lt;li&gt;Definir funciones anidadas (funciones dentro de otras funciones) para crear lógica interna específica o closures.&lt;/li&gt;
&lt;li&gt;Implementar decoradores, que reciben y devuelven funciones para añadir funcionalidad a código existente.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;def&lt;/code&gt; en Python es fundamental para definir funciones, lo que te permite estructurar tu código de manera eficiente y reutilizable.&lt;/p&gt;
&lt;p&gt;Conocer y utilizar &lt;code&gt;def&lt;/code&gt; te ayuda a escribir programas más organizados y modulares, encapsulando lógica para tareas específicas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/def-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: and</title><link href="https://pythonscouts.com/python-and/" rel="alternate"/><published>2025-04-18T13:50:00+02:00</published><updated>2025-04-18T13:50:00+02:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-04-18:/python-and/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;and&lt;/code&gt; se utiliza como un operador lógico que conecta dos expresiones u objetos con el fin de verificar el valor de verdad de ambos.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Este operador es comúnmente empleado para combinar múltiples &lt;a href="/condicionales-python/"&gt;condiciones&lt;/a&gt; en una sola expresión lógica o condición compuesta. En este contexto, el operador devuelve un valor verdadero si ambas condiciones son verdaderas y un valor falso si al menos una de las condiciones es falsa.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/and-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-and"&gt;Uso de and&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis para usar &lt;code&gt;and&lt;/code&gt; es como se muestra a continuación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;expression_1&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;expression_2&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;expression_n&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cada una de las expresiones involucradas puede ser cualquier expresión u objeto Python. La parte de la sintaxis encerrada entre corchetes es opcional y expresa la posibilidad de encadenar múltiples expresiones con varias instancias de &lt;code&gt;and&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Es importante recordar que todos los objetos Python tienen un valor de verdad asociado. Por lo tanto, &lt;code&gt;and&lt;/code&gt; puede relacionar cualquier objeto y no está limitado a expresiones booleanas que devuelvan &lt;a href="/python-true/"&gt;&lt;code&gt;True&lt;/code&gt;&lt;/a&gt; o &lt;a href="/python-false/"&gt;&lt;code&gt;False&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La tabla de verdad del operador cuando lo usamos con expresiones lógicas se resume a continuación:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;code&gt;expression_1&lt;/code&gt; (bool)&lt;/th&gt;
&lt;th&gt;&lt;code&gt;expression_2&lt;/code&gt; (bool)&lt;/th&gt;
&lt;th&gt;&lt;code&gt;expression_1 and expression_2&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;True&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;False&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Esta tabla aplica cuando usas &lt;code&gt;and&lt;/code&gt; con expresiones que retornan un valor booleano concreto, ya sea &lt;code&gt;True&lt;/code&gt; o &lt;code&gt;False&lt;/code&gt;. Sin embargo, cuando usas &lt;code&gt;and&lt;/code&gt; para conectar expresiones u objetos de otro tipo de datos, entonces &lt;code&gt;and&lt;/code&gt; funciona como se muestra a continuación:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;code&gt;expression_1&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;expression_2&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;expression_1 and expression_2&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Verdadero&lt;/td&gt;
&lt;td&gt;Verdadero&lt;/td&gt;
&lt;td&gt;&lt;code&gt;expression_2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verdadero&lt;/td&gt;
&lt;td&gt;Falso&lt;/td&gt;
&lt;td&gt;&lt;code&gt;expression_2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Falso&lt;/td&gt;
&lt;td&gt;Falso&lt;/td&gt;
&lt;td&gt;&lt;code&gt;expression_1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Falso&lt;/td&gt;
&lt;td&gt;Verdadero&lt;/td&gt;
&lt;td&gt;&lt;code&gt;expression_1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Esta tabla resalta un aspecto importante del comportamiento de &lt;code&gt;and&lt;/code&gt; y es que la expresión de la derecha solo se evalúa si la expresión de la izquierda es verdadera. Esto se conoce como &lt;a href="https://es.wikipedia.org/wiki/Evaluaci%C3%B3n_de_cortocircuito" target="_blank"&gt;evaluación de cortocircuito (short-circuit evaluation)&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos rápidos de cómo se usa &lt;code&gt;and&lt;/code&gt; en Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En estos ejemplos, &lt;code&gt;and&lt;/code&gt; evalúa dos objetos o expresiones booleanas. Si ambas son verdaderas, el resultado es &lt;code&gt;True&lt;/code&gt;. Si alguna de ellas es falsa, el resultado es &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Experimentar con expresiones que devuelvan otros tipos de datos te permitirá familiarizarte con el comportamiento del operador en estas situaciones:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;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;1&lt;/span&gt; &lt;span class="ow"&gt;and&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="go"&gt;-1&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;&amp;#39;&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;&amp;#39;&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En estos ejemplos, se usa &lt;code&gt;and&lt;/code&gt; para conectar expresiones y objetos que devuelven tipos no booleanos. En cada caso, se obtiene un objeto en lugar de un valor &lt;code&gt;True&lt;/code&gt; o &lt;code&gt;False&lt;/code&gt;. Esta característica de &lt;code&gt;and&lt;/code&gt; es útil para evaluar expresiones condicionalmente aprovechando la evaluación de cortocircuito.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;current_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;juan&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;user_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_user&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;user_name&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Juan&amp;#39;&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;current_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;user_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_user&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, cuando tienes un usuario activo, puedes usar &lt;code&gt;and&lt;/code&gt; para modificar el nombre de usuario para que se muestre con letra inicial mayúscula. Si por el contrario, no tienes ningún usuario activo (&lt;code&gt;current_user = None&lt;/code&gt;), la expresión de la derecha no se evalúa.&lt;/p&gt;
&lt;p&gt;Cómo puedes confirmar que la expresión de la derecha no se evaluó? Si intentas llamar al método &lt;code&gt;.title()&lt;/code&gt; en el objeto &lt;a href="/python-none/"&gt;&lt;code&gt;None&lt;/code&gt;&lt;/a&gt;, Python genera una excepción de tipo &lt;code&gt;AttributeError&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;AttributeError&lt;/span&gt;: &lt;span class="n"&gt;&amp;#39;NoneType&amp;#39; object has no attribute &amp;#39;title&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El hecho de recibir esta excepción confirma que la expresión del lado derecho, &lt;code&gt;current_user.title()&lt;/code&gt;, no se ejecutó en tu ejemplo original.&lt;/p&gt;
&lt;h2 id="uso-de-and"&gt;Uso de &lt;code&gt;and&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;and&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Combinar múltiples condiciones en una sentencia &lt;code&gt;if&lt;/code&gt; o un ciclo &lt;code&gt;while&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Filtrar elementos en una colección usando múltiples criterios de filtrado.&lt;/li&gt;
&lt;li&gt;Evaluar expresiones condicionalmente, usando la evaluación de cortocircuito.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;and&lt;/code&gt; en Python es fundamental para crear condiciones compuestas que conecten múltiples condiciones simples entre sí.&lt;/p&gt;
&lt;p&gt;Conocer y emplear &lt;code&gt;and&lt;/code&gt; te permite construir expresiones lógicas más complejas y precisas, lo cual es esencial para la toma de decisiones en tus programas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/and-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: True</title><link href="https://pythonscouts.com/python-true/" rel="alternate"/><published>2025-04-12T11:00:00+02:00</published><updated>2025-04-12T11:00:00+02:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-04-12:/python-true/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;True&lt;/code&gt; representa un valor booleano que indica que una condición u objeto es verdadero.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;code&gt;True&lt;/code&gt; es comúnmente el resultado de evaluar condiciones y expresa la veracidad de una declaración en el contexto de operaciones lógicas y de control de flujo como &lt;a href="/condicionales-python/"&gt;condicionales&lt;/a&gt; y ciclos &lt;code&gt;while&lt;/code&gt;. También puedes emplearla como valor por defecto de argumentos opcionales en funciones y métodos.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/true-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-true"&gt;Uso de True&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis para usar &lt;code&gt;True&lt;/code&gt; es bastante sencilla pues se trata de una constante booleana. Solo necesitas usarla directamente en tus declaraciones o expresiones. Por ejemplo, en una asignación como la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;variable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Considera algunos ejemplos rápidos para comprender mejor la manera en que &lt;code&gt;True&lt;/code&gt; puede aparecer generalmente en tu código Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="ow"&gt;in&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3.14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En estos ejemplos, &lt;code&gt;True&lt;/code&gt; es el resultado de evaluar expresiones lógicas que son verdaderas. En el primer ejemplo, &lt;code&gt;5&lt;/code&gt; es menor que &lt;code&gt;6&lt;/code&gt;. En el segundo ejemplo, &lt;code&gt;4&lt;/code&gt; está presente en la lista, y en el tercer ejemplo, el número 3.14 es de tipo &lt;code&gt;float&lt;/code&gt;. Todas estas expresiones resultan ser verdaderas, por lo tanto devuelven &lt;code&gt;True&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Un uso práctico común donde ves a &lt;code&gt;True&lt;/code&gt; empleado de manera explícita es cuando funciona como valor por defecto de argumentos de funciones:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;informal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;informal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Buenos días &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Pythonista&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Hola, Pythonista!&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Pythonista&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;informal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Buenos días Pythonista!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, el argumento &lt;code&gt;informal&lt;/code&gt; tiene un valor por defecto igual a &lt;code&gt;True&lt;/code&gt;. Esto significa que cuando llamas la función sin pasarle un valor explícito a &lt;code&gt;informal&lt;/code&gt; obtienes un saludo informal. Observa que cuando llamas a la función con &lt;code&gt;informal&lt;/code&gt; igual a &lt;a href="/python-false/"&gt;&lt;code&gt;False&lt;/code&gt;&lt;/a&gt; (el valor de verdad opuesto a &lt;code&gt;True&lt;/code&gt;), entonces el saludo se vuelve formal porque se ejecuta la cláusula &lt;code&gt;else&lt;/code&gt; de la condicional.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;En Python, es una práctica común y más idiomática no comparar explícitamente las condiciones con &lt;code&gt;True&lt;/code&gt; o &lt;code&gt;False&lt;/code&gt;. En lugar de &lt;code&gt;if informal == True&lt;/code&gt;, simplemente puedes usar &lt;code&gt;if informal&lt;/code&gt;. Esto hace que tu código sea más limpio y conciso.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h2 id="uso-de-true"&gt;Uso de &lt;code&gt;True&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;True&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Representar un valor de verdad verdadero en operaciones lógicas y comparaciones.&lt;/li&gt;
&lt;li&gt;Decidir qué acciones ejecutar en declaraciones de control de flujo como sentencias &lt;code&gt;if&lt;/code&gt; y ciclos &lt;code&gt;while&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Proporcionar un valor por defecto para argumentos de funciones y métodos.&lt;/li&gt;
&lt;li&gt;Indicar éxito o condiciones verdaderas como un valor de retorno en funciones y métodos.&lt;/li&gt;
&lt;li&gt;Definir funciones y métodos de valor booleano, es decir, que devuelven &lt;code&gt;True&lt;/code&gt; o &lt;code&gt;False&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;True&lt;/code&gt; en Python es fundamental para evaluar condiciones y controlar el flujo de tu programa.&lt;/p&gt;
&lt;p&gt;Conocer y emplear &lt;code&gt;True&lt;/code&gt; te permite trabajar eficazmente con estructuras lógicas y desarrollar programas que tomen decisiones de ejecución basadas en los resultados de las condiciones evaluadas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/true-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: None</title><link href="https://pythonscouts.com/python-none/" rel="alternate"/><published>2025-03-11T11:10:00+01:00</published><updated>2025-03-11T11:10:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-03-11:/python-none/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;None&lt;/code&gt; se utiliza para representar la ausencia de un valor o un valor nulo. &lt;code&gt;None&lt;/code&gt; es un objeto único de su propia clase &lt;code&gt;NoneType&lt;/code&gt;.&lt;/p&gt;</summary><content type="html">&lt;p&gt;El objeto &lt;code&gt;None&lt;/code&gt; es comúnmente usado para indicar que una variable no tiene un valor real o valor con significado. Expresa ideas como inexistente, nulo, ninguno, nada y similares.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/none-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-none"&gt;Uso de None&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis para &lt;code&gt;None&lt;/code&gt; es simplemente usar la palabra tal y como se escribe, incluida la mayúscula inicial, cuando desees establecer un valor nulo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;variable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;Aquí tienes algunos ejemplos rápidos del uso de la palabra clave &lt;code&gt;None&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, &lt;code&gt;None&lt;/code&gt; indica que la variable &lt;code&gt;username&lt;/code&gt; aún no tiene un valor definido.&lt;/p&gt;
&lt;p&gt;Es muy común usar &lt;code&gt;None&lt;/code&gt; como valor por defecto de argumentos en funciones:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;mundo&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;Hola, mundo!&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Ana&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Hola, Ana!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este segundo ejemplo, la función &lt;code&gt;greet()&lt;/code&gt; acepta el argumento &lt;code&gt;name&lt;/code&gt; cuyo valor por defecto es &lt;code&gt;None&lt;/code&gt;. Si llamas a la función sin argumentos, entonces obtienes &lt;a href="/python-hola-mundo/"&gt;&lt;code&gt;Hola, mundo!&lt;/code&gt;&lt;/a&gt; como respuesta. Si le pasas un nombre, la función saluda a la persona deseada.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;En Python, las funciones sin valor de retorno explícito retornan &lt;code&gt;None&lt;/code&gt;. Para visualizar el valor &lt;code&gt;None&lt;/code&gt; en una sesión interactiva, puedes emplear la función integrada &lt;code&gt;print()&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h2 id="uso-de-none"&gt;Uso de &lt;code&gt;None&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;None&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inicializar variables a un estado nulo antes de asignarles un valor concreto&lt;/li&gt;
&lt;li&gt;Indicar que una función no devuelve un valor&lt;/li&gt;
&lt;li&gt;Comprobar si una variable o nombre tiene un valor asignado o no&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;None&lt;/code&gt; es una herramienta esencial en Python para representar la ausencia de un valor.&lt;/p&gt;
&lt;p&gt;Conocer y utilizar &lt;code&gt;None&lt;/code&gt; te permite manejar situaciones donde necesitas trabajar con variables que aún no tienen un valor definido o funciones que no necesitan devolver datos sino que operan a través de efectos secundarios o colaterales.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/none-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>Palabras clave en Python: False</title><link href="https://pythonscouts.com/python-false/" rel="alternate"/><published>2025-03-08T11:00:00+01:00</published><updated>2025-03-08T11:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-03-08:/python-false/</id><summary type="html">&lt;p&gt;En Python, la palabra clave &lt;code&gt;False&lt;/code&gt; representa un valor booleano que indica falso o la ausencia de verdad en una expresión lógica.&lt;/p&gt;</summary><content type="html">&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/false-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#sintaxis"&gt;Sintaxis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejemplos-practicos"&gt;Ejemplos prácticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uso-de-false"&gt;Uso de False&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="sintaxis"&gt;Sintaxis&lt;/h2&gt;
&lt;p&gt;La sintaxis de &lt;code&gt;False&lt;/code&gt; consiste en usar la palabra clave tal cual se escribe (incluyendo la inicial mayúscula) en expresiones o sentencias, como en comparaciones o evaluaciones booleanas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;is_registered&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="ejemplos-practicos"&gt;Ejemplos prácticos&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;False&lt;/code&gt; puede ser el resultado de evaluar una expresión booleana en Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, &lt;code&gt;5&lt;/code&gt; es menor que &lt;code&gt;6&lt;/code&gt;, por lo tanto, Python evalúa la expresión y retorna &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;También es común emplear &lt;code&gt;False&lt;/code&gt; como valor por defecto de argumentos en funciones y métodos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;! Cómo estás hoy?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Scout&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Hola, Scout!&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Scout&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Hola, Scout! Cómo estás hoy?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, el argumento &lt;code&gt;verbose&lt;/code&gt; es falso por defecto. &lt;code&gt;False&lt;/code&gt; se emplea comúnmente para establecer el valor por defecto de argumentos que operan como indicadores (flags) booleanos.&lt;/p&gt;
&lt;p&gt;También puedes emplear &lt;code&gt;False&lt;/code&gt; como valor inicial de variables booleanas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;is_active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;has_permission&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En estos ejemplos, &lt;code&gt;False&lt;/code&gt; te permite establecer un valor inicial para variables que pueden ser verdaderas o falsas.&lt;/p&gt;
&lt;h2 id="uso-de-false"&gt;Uso de &lt;code&gt;False&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Los casos de uso más comunes de la palabra clave &lt;code&gt;False&lt;/code&gt; incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Representar un valor de verdad falso en operaciones lógicas y comparaciones&lt;/li&gt;
&lt;li&gt;Definir un valor predeterminado o por defecto para argumentos en funciones y métodos.&lt;/li&gt;
&lt;li&gt;Determinar qué acción ejecutar en control de flujo como &lt;a href="/condicionales-python/"&gt;condicionales (&lt;code&gt;if&lt;/code&gt;)&lt;/a&gt; y ciclos &lt;code&gt;while&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;La palabra clave &lt;code&gt;False&lt;/code&gt; en Python es fundamental para representar un valor booleano falso en evaluaciones lógicas y control de flujo.&lt;/p&gt;
&lt;p&gt;Conocer y emplear esta palabra clave te permitirá escribir código legible y efectivo al manejar condiciones y tomar decisiones en tus programas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/false-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/><category term="palabras clave"/></entry><entry><title>¿Cómo obtener ayuda en Python?</title><link href="https://pythonscouts.com/obtener-ayuda-python/" rel="alternate"/><published>2025-03-03T17:30:00+01:00</published><updated>2025-03-03T17:30:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-03-03:/obtener-ayuda-python/</id><summary type="html">&lt;p&gt;Para obtener ayuda en Python, debes conocer herramientas básicas que te permitan resolver dudas de forma eficiente. La documentación oficial y el sistema interactivo de ayuda de Python son excelentes opciones.&lt;/p&gt;</summary><content type="html">&lt;p&gt;En esta guía rápida, tienes un resumen de las opciones más utilizadas para obtener ayuda directamente desde una sesión interactiva de Python o desde la terminal de tu sistema operativo.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Guías/obtener-ayuda-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#1-la-documentacion-oficial-de-python"&gt;1. La documentación oficial de Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-el-sistema-interactivo-de-ayuda-help"&gt;2. El sistema interactivo de ayuda: help()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-la-herramienta-pydoc"&gt;3. La herramienta pydoc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="1-la-documentacion-oficial-de-python"&gt;1. La documentación oficial de Python&lt;/h2&gt;
&lt;p&gt;La &lt;a href="https://docs.python.org/es/3/" target="_blank"&gt;documentación&lt;/a&gt; oficial de Python es la fuente primaria de información actualizada sobre el lenguaje y sus últimas actualizaciones. La estructura de la documentación incluye secciones como las siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/es/3/whatsnew/3.13.html" target="_blank"&gt;¿Qué hay de nuevo en Python?&lt;/a&gt;: Novedades en cada versión&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/es/3/tutorial/index.html" target="_blank"&gt;Tutorial&lt;/a&gt;: Guía escrita por Guido Van Rossum&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/es/3/library/index.html" target="_blank"&gt;Library reference&lt;/a&gt;: Referencia de módulos y paquetes&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/es/3/reference/index.html" target="_blank"&gt;Language reference&lt;/a&gt;: Sintaxis del lenguaje&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/es/3/howto/index.html" target="_blank"&gt;Cómos (&lt;em&gt;HOWTOs&lt;/em&gt;) de Python&lt;/a&gt;: Preguntas frecuentes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notarás que la documentación aún tiene fragmentos que no han sido traducidos completamente al Español. ¿Te gustaría contribuir en la traducción? Consulta la &lt;a href="https://python-docs-es.readthedocs.io/es/3.13/CONTRIBUTING.html" target="_blank"&gt;guía de contribución&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="2-el-sistema-interactivo-de-ayuda-help"&gt;2. El sistema interactivo de ayuda: &lt;code&gt;help()&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;La función integrada &lt;code&gt;help()&lt;/code&gt; proporciona información detallada sobre objetos, funciones y módulos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, usas la clase &lt;code&gt;list&lt;/code&gt; como argumento para &lt;code&gt;help()&lt;/code&gt; y obtienes la página de ayuda relacionada.&lt;/p&gt;
&lt;p&gt;Para consultar la ayuda de un objeto que no está en tu espacio de nombres actual, puedes emplear una cadena con el nombre del objeto. Por ejemplo, para consultar la ayuda sobre el módulo &lt;code&gt;sys&lt;/code&gt; de la librería estándar no tienes que importar el módulo primero, solo usa una cadena con su nombre:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sys&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cuando el objeto que le pasas como argumento a &lt;code&gt;help()&lt;/code&gt; tiene una página de ayuda disponible, esa página te aparecerá en pantalla.&lt;/p&gt;
&lt;p&gt;Si llamas a la función &lt;code&gt;help()&lt;/code&gt; sin argumentos, entonces entrarás al sistema interactivo de ayuda:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dentro del sistema interactivo de ayuda, puedes explorar temas fundamentales escribiendo algunas palabras clave como por ejemplo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;keywords&lt;/code&gt;: Lista de palabras clave de Python&lt;/li&gt;
&lt;li&gt;&lt;code&gt;modules&lt;/code&gt;: Lista de módulos disponibles&lt;/li&gt;
&lt;li&gt;&lt;code&gt;topics&lt;/code&gt;: Temas de documentación&lt;/li&gt;
&lt;li&gt;&lt;code&gt;symbols&lt;/code&gt;: Símbolos disponibles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para salir de cada página de ayuda, presiona la tecla &lt;em&gt;Q&lt;/em&gt;. Para salir del sistema de ayuda y regresar a tu sesión interactiva de Python, escribe &lt;code&gt;q&lt;/code&gt; o &lt;code&gt;quit&lt;/code&gt; y presiona &lt;em&gt;Enter&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="3-la-herramienta-pydoc"&gt;3. La herramienta &lt;code&gt;pydoc&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;La herramienta de línea de comandos &lt;code&gt;pydoc&lt;/code&gt; permite obtener información sobre módulos y funciones desde la terminal sin necesidad de estar en una sesión interactiva de Python. Esta herramienta funciona de manera muy parecida a la función &lt;code&gt;help()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Por ejemplo, el siguiente comando muestra información sobre la clase &lt;code&gt;str&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;pydoc&lt;span class="w"&gt; &lt;/span&gt;str
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puedes generar documentación en HTML con el comando siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;pydoc&lt;span class="w"&gt; &lt;/span&gt;-w&lt;span class="w"&gt; &lt;/span&gt;sys
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Guarda la documentación del módulo &lt;code&gt;sys&lt;/code&gt; en un archivo HTML llamado &lt;code&gt;sys.html&lt;/code&gt; en tu directorio de trabajo.&lt;/p&gt;
&lt;p&gt;Para explorar la documentación en un navegador web:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;pydoc&lt;span class="w"&gt; &lt;/span&gt;-b
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Con este comando, puedes iniciar un servidor web con la documentación de Python.&lt;/p&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;Contar con buenas fuentes de información es clave para aprender Python eficazmente. La documentación oficial, la función integrada &lt;code&gt;help()&lt;/code&gt; y la herramienta &lt;code&gt;pydoc&lt;/code&gt; te permitirán encontrar respuestas rápidamente mientras trabajas en tu código.&lt;/p&gt;
&lt;p&gt;Explora estas opciones y podrás resolver rápidamente tus dudas sobre Python.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Guías/obtener-ayuda-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Guías"/><category term="python"/><category term="ayuda"/></entry><entry><title>Python a través de ejemplos: Ciclos o bucles for</title><link href="https://pythonscouts.com/ciclos-for-python/" rel="alternate"/><published>2025-02-24T22:00:00+01:00</published><updated>2025-02-24T22:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-02-24:/ciclos-for-python/</id><summary type="html">&lt;p&gt;En Python, un ciclo o bucle &lt;code&gt;for&lt;/code&gt; es una sentencia compuesta que puedes emplear para recorrer colecciones o contenedores de datos como listas, tuplas, cadenas, diccionarios y conjuntos.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Los ciclos &lt;code&gt;for&lt;/code&gt; son fundamentales para procesar colecciones de datos, aplicando transformaciones sobre cada valor de la colección o empleando los valores en alguna operación o cálculo intermedio.&lt;/p&gt;
&lt;p&gt;En este tutorial, aprenderás lo esencial sobre el funcionamiento de los ciclos &lt;code&gt;for&lt;/code&gt; y cómo utilizarlos en tus programas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/ciclos-for-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#conociendo-los-ciclos-for"&gt;Conociendo los ciclos for&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#iterando-con-ciclos-for-en-python"&gt;Iterando con ciclos for en Python&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#listas-y-tuplas"&gt;Listas y tuplas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cadenas-de-texto"&gt;Cadenas de texto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#rangos-de-valores"&gt;Rangos de valores&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#diccionarios-y-conjuntos"&gt;Diccionarios y conjuntos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#controlando-la-iteracion-con-break-y-continue"&gt;Controlando la iteración con break y continue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usando-la-clausula-else-en-ciclos-for"&gt;Usando la cláusula else en ciclos for&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usando-ciclos-for-anidados"&gt;Usando ciclos for anidados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusiones"&gt;Conclusiones&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="conociendo-los-ciclos-for"&gt;Conociendo los ciclos &lt;code&gt;for&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Un ciclo o bucle &lt;strong&gt;&lt;code&gt;for&lt;/code&gt;&lt;/strong&gt; te permite iterar sobre los elementos de un iterable, colección o contenedor de datos, como pueden ser las listas, tuplas, cadenas de texto y diccionarios. En cada iteración, puedes ejecutar un bloque de código que actúe sobre cada elemento de la colección.&lt;/p&gt;
&lt;p&gt;La sintaxis básica de un ciclo &lt;code&gt;for&lt;/code&gt; en Python es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;variable&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;iterable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;variable&lt;/code&gt;&lt;/strong&gt;: variable del ciclo que mantiene una referencia al elemento actual de la secuencia.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;iterable&lt;/code&gt;&lt;/strong&gt;: objeto iterable sobre el que se realiza la iteración.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;block&amp;gt;&lt;/code&gt;&lt;/strong&gt;: bloque de código con las instrucciones que se ejecutan en cada iteración.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="iterando-con-ciclos-for-en-python"&gt;Iterando con ciclos &lt;code&gt;for&lt;/code&gt; en Python&lt;/h2&gt;
&lt;p&gt;En tu trabajo diario con Python, puedes emplear los ciclos &lt;code&gt;for&lt;/code&gt; para recorrer los elementos de distintos tipos de datos, siempre y cuando estos soporten la iteración. Esto te permite transformar tus datos y hacer cálculos y operaciones con ellos mientras iteras.&lt;/p&gt;
&lt;p&gt;En las secciones siguientes, aprenderás cómo emplear ciclos &lt;code&gt;for&lt;/code&gt; para recorrer distintos tipos de datos integrados, como las listas, tuplas, cadenas, diccionarios y conjuntos.&lt;/p&gt;
&lt;h3 id="listas-y-tuplas"&gt;Listas y tuplas&lt;/h3&gt;
&lt;p&gt;Los ciclos &lt;code&gt;for&lt;/code&gt; son comúnmente empleados para iterar sobre listas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;manzana&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;banana&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;cereza&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;fruit&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;manzana&lt;/span&gt;
&lt;span class="go"&gt;banana&lt;/span&gt;
&lt;span class="go"&gt;cereza&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, el ciclo recorre la lista de frutas e imprime cada elemento. La &lt;a href="/variables-python/"&gt;variable&lt;/a&gt; &lt;code&gt;fruit&lt;/code&gt; es la variable del ciclo, y la lista &lt;code&gt;fruits&lt;/code&gt; es el objeto iterable. La llamada a &lt;code&gt;print()&lt;/code&gt; representa el bloque de código del bucle. Este bloque generalmente opera sobre o con los elementos del iterable.&lt;/p&gt;
&lt;p&gt;También puedes emplear un ciclo &lt;code&gt;for&lt;/code&gt; para poblar una lista vacía con &lt;a href="/valores-python/"&gt;valores&lt;/a&gt; generados a partir de alguna operación o cálculo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;squares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;squares&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&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="gp"&gt;...&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;squares&lt;/span&gt;
&lt;span class="go"&gt;[1, 4, 9]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas una lista vacía para almacenar los cuadrados de los valores almacenados en una lista de números. El método &lt;code&gt;.append()&lt;/code&gt; te permite agregar valores individuales al final de una lista.&lt;/p&gt;
&lt;p&gt;El ciclo &lt;code&gt;for&lt;/code&gt; funciona de igual manera con tuplas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Juan&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Programador&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cuba&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;Juan&lt;/span&gt;
&lt;span class="go"&gt;35&lt;/span&gt;
&lt;span class="go"&gt;Programador&lt;/span&gt;
&lt;span class="go"&gt;Cuba&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, iteras sobre una tupla con un ciclo &lt;code&gt;for&lt;/code&gt;. Nuevamente, el ciclo solo imprime cada elemento de la tupla en tu pantalla.&lt;/p&gt;
&lt;h3 id="cadenas-de-texto"&gt;Cadenas de texto&lt;/h3&gt;
&lt;p&gt;También puedes usar un bucle &lt;code&gt;for&lt;/code&gt; para recorrer los caracteres de una cadena de texto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Python!&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;P&lt;/span&gt;
&lt;span class="go"&gt;y&lt;/span&gt;
&lt;span class="go"&gt;t&lt;/span&gt;
&lt;span class="go"&gt;h&lt;/span&gt;
&lt;span class="go"&gt;o&lt;/span&gt;
&lt;span class="go"&gt;n&lt;/span&gt;
&lt;span class="go"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cada iteración de este bucle imprime un carácter de la cadena original.&lt;/p&gt;
&lt;h3 id="rangos-de-valores"&gt;Rangos de valores&lt;/h3&gt;
&lt;p&gt;La función incorporada &lt;a href="https://docs.python.org/es/3/library/functions.html#func-range" target="_blank"&gt;&lt;code&gt;range()&lt;/code&gt;&lt;/a&gt; genera secuencias de números enteros:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&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;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí, &lt;code&gt;range(5)&lt;/code&gt; genera los números del &lt;code&gt;0&lt;/code&gt; al &lt;code&gt;4&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="diccionarios-y-conjuntos"&gt;Diccionarios y conjuntos&lt;/h3&gt;
&lt;p&gt;Los ciclos &lt;code&gt;for&lt;/code&gt; también te permiten iterar sobre diccionarios y conjuntos. En el caso de los diccionarios, puedes recorrer un diccionario por sus claves, valores o ítems.&lt;/p&gt;
&lt;p&gt;Para recorrer un diccionario por sus claves, puedes emplear el diccionario directamente o el método &lt;code&gt;.keys()&lt;/code&gt; como se muestra a continuación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;nombre&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Juan&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;edad&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;puesto&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Programador&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;nombre -&amp;gt; Juan&lt;/span&gt;
&lt;span class="go"&gt;edad -&amp;gt; 35&lt;/span&gt;
&lt;span class="go"&gt;puesto -&amp;gt; Programador&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;nombre -&amp;gt; Juan&lt;/span&gt;
&lt;span class="go"&gt;edad -&amp;gt; 35&lt;/span&gt;
&lt;span class="go"&gt;puesto -&amp;gt; Programador&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ambas maneras de iterar sobre las claves son equivalentes. La primera es más comúnmente usada y ligeramente más eficiente. Sin embargo, la segunda puede ser más explícita en algunas situaciones.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;El método &lt;code&gt;.keys()&lt;/code&gt; es redundante en este contexto. Iterar directamente sobre el diccionario es la manera preferida en la mayoría de los casos. Este método solo es útil si necesitas específicamente un objeto de &lt;a href="https://docs.python.org/es/3.13/library/stdtypes.html#dict-views" target="_blank"&gt;vista de claves&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;p&gt;Para iterar sobre los valores, puedes emplear el método &lt;code&gt;.values()&lt;/code&gt; como se muestra en el siguiente ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;Juan&lt;/span&gt;
&lt;span class="go"&gt;35&lt;/span&gt;
&lt;span class="go"&gt;Programador&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si deseas recorrer los pares clave-valor, puedes usar &lt;code&gt;.items()&lt;/code&gt; como se muestra en el siguiente ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;nombre -&amp;gt; Juan&lt;/span&gt;
&lt;span class="go"&gt;edad -&amp;gt; 35&lt;/span&gt;
&lt;span class="go"&gt;puesto -&amp;gt; Programador&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finalmente, los ciclos &lt;code&gt;for&lt;/code&gt; también te permiten recorrer conjuntos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rojo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;azul&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;verde&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;amarillo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;amarillo&lt;/span&gt;
&lt;span class="go"&gt;azul&lt;/span&gt;
&lt;span class="go"&gt;verde&lt;/span&gt;
&lt;span class="go"&gt;rojo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Es fundamental que tengas en cuenta que los conjuntos en Python son colecciones no ordenadas de datos. Por esta razón, el ciclo itera sobre los elementos en un orden diferente al orden de inserción.&lt;/p&gt;
&lt;h2 id="controlando-la-iteracion-con-break-y-continue"&gt;Controlando la iteración con &lt;code&gt;break&lt;/code&gt; y &lt;code&gt;continue&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;En Python, las sentencias &lt;code&gt;break&lt;/code&gt; y &lt;code&gt;continue&lt;/code&gt; te permiten controlar el flujo de ejecución en los ciclos &lt;code&gt;for&lt;/code&gt;. La función de estas sentencias es la siguiente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;break&lt;/code&gt;&lt;/strong&gt;: termina el ciclo anticipadamente y salta a la sentencia inmediatamente después del ciclo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;continue&lt;/code&gt;&lt;/strong&gt;: salta a la siguiente iteración, sin ejecutar el código que le sigue en el bloque del ciclo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A continuación, un ejemplo de cómo usar &lt;code&gt;break&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;letter&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;python&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;letter&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;h&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;break&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;letter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;p&lt;/span&gt;
&lt;span class="go"&gt;y&lt;/span&gt;
&lt;span class="go"&gt;t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nota cómo la ejecución termina cuando la letra actual es &lt;code&gt;"h"&lt;/code&gt;. El resto de las letras no se imprimen.&lt;/p&gt;
&lt;p&gt;Considera el siguiente ejemplo de cómo emplear &lt;code&gt;continue&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;letter&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;python&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;letter&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;h&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;letter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;p&lt;/span&gt;
&lt;span class="go"&gt;y&lt;/span&gt;
&lt;span class="go"&gt;t&lt;/span&gt;
&lt;span class="go"&gt;o&lt;/span&gt;
&lt;span class="go"&gt;n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, la letra &lt;code&gt;"h"&lt;/code&gt; no se imprime, pues la sentencia &lt;code&gt;continue&lt;/code&gt; salta a la próxima iteración sin ejecutar &lt;code&gt;print()&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="usando-la-clausula-else-en-ciclos-for"&gt;Usando la cláusula &lt;code&gt;else&lt;/code&gt; en ciclos &lt;code&gt;for&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Como las &lt;a href="/condicionales-python/"&gt;sentencias condicionales&lt;/a&gt;, los ciclos &lt;code&gt;for&lt;/code&gt; pueden tener una cláusula &lt;code&gt;else&lt;/code&gt;. En los ciclos, el &lt;code&gt;else&lt;/code&gt; se ejecuta únicamente cuando el ciclo finaliza sin ser interrumpido por una sentencia &lt;code&gt;break&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&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;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Ciclo finalizado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;Ciclo finalizado&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este ciclo termina naturalmente luego de recorrer el rango de valores completo. Entonces, el &lt;code&gt;else&lt;/code&gt; se ejecuta y ves el mensaje &lt;code&gt;Ciclo finalizado&lt;/code&gt; en la pantalla.&lt;/p&gt;
&lt;p&gt;Si se usa una instrucción &lt;code&gt;break&lt;/code&gt;, el bloque &lt;code&gt;else&lt;/code&gt; no se ejecuta:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&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;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&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="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;break&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Ciclo finalizado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este ciclo termina cuando el valor de &lt;code&gt;i&lt;/code&gt; es igual a &lt;code&gt;2&lt;/code&gt;, en cuyo caso la cláusula &lt;code&gt;else&lt;/code&gt; no se ejecuta.&lt;/p&gt;
&lt;p&gt;Es importante tener en cuenta que, cuando incluyes un bucle &lt;code&gt;for&lt;/code&gt; en una función y el bucle contiene una instrucción &lt;code&gt;return&lt;/code&gt;, entonces este termina al alcanzar dicha instrucción y la cláusula &lt;code&gt;else&lt;/code&gt; no se ejecuta.&lt;/p&gt;
&lt;h2 id="usando-ciclos-for-anidados"&gt;Usando ciclos &lt;code&gt;for&lt;/code&gt; anidados&lt;/h2&gt;
&lt;p&gt;Puedes anidar un ciclo &lt;code&gt;for&lt;/code&gt; dentro de otro para recorrer estructuras más complejas, como por ejemplo listas de listas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="go"&gt;    [1, 2, 3],&lt;/span&gt;
&lt;span class="go"&gt;    [4, 5, 6],&lt;/span&gt;
&lt;span class="go"&gt;    [7, 8, 9],&lt;/span&gt;
&lt;span class="go"&gt;]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;4&lt;/span&gt;
&lt;span class="go"&gt;5&lt;/span&gt;
&lt;span class="go"&gt;6&lt;/span&gt;
&lt;span class="go"&gt;7&lt;/span&gt;
&lt;span class="go"&gt;8&lt;/span&gt;
&lt;span class="go"&gt;9&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puedes anidar ciclos a tantos niveles como necesites. Sin embargo, esta práctica suele causar que tu código sea ineficiente y difícil de entender. Por lo tanto, es recomendable no anidar ciclos a más de dos niveles de profundidad.&lt;/p&gt;
&lt;h2 id="conclusiones"&gt;Conclusiones&lt;/h2&gt;
&lt;p&gt;Los ciclos o bucles &lt;strong&gt;&lt;code&gt;for&lt;/code&gt;&lt;/strong&gt; son esenciales en Python para realizar tareas repetitivas y manipular datos eficientemente. Con un ciclo &lt;code&gt;for&lt;/code&gt;, puedes recorrer diversos tipos de datos como listas, cadenas y diccionarios.&lt;/p&gt;
&lt;p&gt;También puedes combinar &lt;code&gt;for&lt;/code&gt; con &lt;code&gt;range()&lt;/code&gt;, &lt;code&gt;break&lt;/code&gt;, &lt;code&gt;continue&lt;/code&gt; y &lt;code&gt;else&lt;/code&gt; para controlar el flujo de ejecución de tu código de una manera mucho más precisa.&lt;/p&gt;
&lt;p&gt;Dominar esta estructura es fundamental para escribir código más limpio y efectivo. Practica con tus propios ejemplos y experimenta con diferentes estructuras para afianzar tu comprensión.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/ciclos-for-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/></entry><entry><title>¿Cómo comprimir archivos con zipfile en Python?</title><link href="https://pythonscouts.com/comprimir-archivos-zipfile-python/" rel="alternate"/><published>2025-02-11T22:15:00+01:00</published><updated>2025-02-11T22:15:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-02-11:/comprimir-archivos-zipfile-python/</id><summary type="html">&lt;p&gt;Comprimir una serie de archivos con el fin de ahorrar espacio en disco puede ser una tarea necesaria en tu trabajo diario con Python. En esta guía rápida, aprenderás cómo hacerlo.&lt;/p&gt;</summary><content type="html">&lt;p&gt;El módulo &lt;a href="https://docs.python.org/es/3.13/library/zipfile.html#module-zipfile" target="_blank"&gt;&lt;code&gt;zipfile&lt;/code&gt;&lt;/a&gt; de la biblioteca estándar de Python permite manipular archivos en formato &lt;a href="https://en.wikipedia.org/wiki/ZIP_(file_format)" target="_blank"&gt;ZIP&lt;/a&gt; que es un formato estándar para comprimir y archivar datos. Con este módulo, puedes crear, leer, escribir, extraer y listar archivos contenidos dentro de archivos ZIP.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Guías/comprimir-archivos-zipfile-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#pasos-resumidos"&gt;Pasos resumidos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#paso-1-importar-el-modulo-zipfile"&gt;Paso 1: Importar el módulo zipfile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#paso-2-instanciar-la-clase-zipfile"&gt;Paso 2: Instanciar la clase ZipFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#paso-3-elegir-el-metodo-de-compresion"&gt;Paso 3: Elegir el método de compresión&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#paso-4-comprimir-los-archivos-en-el-archivo-zip"&gt;Paso 4: Comprimir los archivos en el archivo ZIP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="pasos-resumidos"&gt;Pasos resumidos&lt;/h2&gt;
&lt;p&gt;Para comprimir archivos usando el módulo &lt;code&gt;zipfile&lt;/code&gt; en Python, puedes seguir los siguientes pasos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Importar el módulo &lt;code&gt;zipfile&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Instanciar la clase &lt;a href="https://docs.python.org/es/3.13/library/zipfile.html#zipfile.ZipFile" target="_blank"&gt;&lt;code&gt;ZipFile&lt;/code&gt;&lt;/a&gt; en modo de escritura (&lt;code&gt;"w"&lt;/code&gt;) para crear un nuevo archivo ZIP.&lt;/li&gt;
&lt;li&gt;Elegir el método de compresión.&lt;/li&gt;
&lt;li&gt;Comprimir los archivos en el archivo ZIP usando el método &lt;code&gt;.write()&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Estos pasos te permitirán crear y comprimir archivos en un archivo ZIP utilizando Python. El código necesario es el siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - compress_files.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;zipfile&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;zipfile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZipFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;archivo.zip&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;w&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;compression&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;zipfile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZIP_DEFLATED&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;zip_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;zip_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;archivo_0.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;zip_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;archivo_1.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A continuación una discusión más detallada de cada uno de estos pasos y su código Python asociado.&lt;/p&gt;
&lt;h2 id="paso-1-importar-el-modulo-zipfile"&gt;Paso 1: Importar el módulo &lt;code&gt;zipfile&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Primero, necesitas importar el módulo &lt;code&gt;zipfile&lt;/code&gt; en tu &lt;a href="/ejecutar-script-python/"&gt;script&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - compress_files.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;zipfile&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="paso-2-instanciar-la-clase-zipfile"&gt;Paso 2: Instanciar la clase &lt;code&gt;ZipFile&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;La clase &lt;code&gt;ZipFile&lt;/code&gt; funciona de modo similar a la función incorporada &lt;code&gt;open()&lt;/code&gt; de Python, permitiéndote abrir archivos ZIP. Para instanciar la clase, emplearás tres argumentos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;file&lt;/code&gt;&lt;/strong&gt;: El nombre del archivo ZIP resultante.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;mode&lt;/code&gt;&lt;/strong&gt;: El modo de apertura que puede ser modo de lectura (&lt;code&gt;"r"&lt;/code&gt;), escritura (&lt;code&gt;"w"&lt;/code&gt;), anexar (&lt;code&gt;"a"&lt;/code&gt;) y exclusivo (&lt;code&gt;"x"&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;compression&lt;/code&gt;&lt;/strong&gt;: El método de compresión deseado.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Esta clase funciona como un gestor de contexto, por lo que puedes utilizarla dentro de una sentencia &lt;code&gt;with&lt;/code&gt;. Como nombre de archivo, puedes emplear cualquier identificador de archivo válido en tu sistema operativo seguido de la extensión &lt;code&gt;.zip&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="paso-3-elegir-el-metodo-de-compresion"&gt;Paso 3: Elegir el método de compresión&lt;/h2&gt;
&lt;p&gt;Para comprimir archivos mientras los escribes en un archivo ZIP, puedes usar alguno de los modos de compresión siguientes con la constante apropiada:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Método de compresión&lt;/th&gt;
&lt;th&gt;Constante&lt;/th&gt;
&lt;th&gt;Módulo requerido&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deflate&lt;/td&gt;
&lt;td&gt;&lt;code&gt;zipfile.ZIP_DEFLATED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;zlib&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bzip2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;zipfile.ZIP_BZIP2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bz2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LZMA&lt;/td&gt;
&lt;td&gt;&lt;code&gt;zipfile.ZIP_LZMA&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lzma&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Estos son los métodos de compresión que actualmente puedes usar con &lt;code&gt;ZipFile&lt;/code&gt;. Usar un método diferente generará un &lt;code&gt;NotImplementedError&lt;/code&gt;. El método más comúnmente usado es &lt;code&gt;ZIP_DEFLATED&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="paso-4-comprimir-los-archivos-en-el-archivo-zip"&gt;Paso 4: Comprimir los archivos en el archivo ZIP&lt;/h2&gt;
&lt;p&gt;Ahora, supón que necesitas comprimir los archivos &lt;code&gt;archivo_0.txt&lt;/code&gt; y &lt;code&gt;archivo_1.txt&lt;/code&gt; que se encuentran en tu directorio de trabajo actual. Puedes lograrlo con el siguiente código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - compress_files.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;zipfile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZipFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;archivo.zip&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;w&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;compression&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;zipfile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZIP_DEFLATED&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;zip_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;zip_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;archivo_0.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;zip_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;archivo_1.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este código crea un archivo ZIP llamado &lt;code&gt;archivo.zip&lt;/code&gt; y lo abre en modo de escritura. Luego, utiliza el algoritmo Deflate para comprimir los archivos dentro del archivo ZIP. Dentro del bloque de la sentencia &lt;code&gt;with&lt;/code&gt;, se agregan los archivos a comprimir utilizando el método &lt;code&gt;.write()&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;Para comprimir archivos usando el módulo &lt;code&gt;zipfile&lt;/code&gt; en Python, puedes seguir los siguientes pasos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Importar el módulo &lt;code&gt;zipfile&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Instanciar la clase &lt;a href="https://docs.python.org/es/3.13/library/zipfile.html#zipfile.ZipFile" target="_blank"&gt;&lt;code&gt;ZipFile&lt;/code&gt;&lt;/a&gt; en modo de escritura (&lt;code&gt;"w"&lt;/code&gt;) para crear un nuevo archivo ZIP.&lt;/li&gt;
&lt;li&gt;Elegir el método de compresión.&lt;/li&gt;
&lt;li&gt;Comprimir los archivos en el archivo ZIP usando el método &lt;code&gt;.write()&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Estos pasos te permiten crear un archivo ZIP y comprimir los archivos deseados utilizando Python.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Guías/comprimir-archivos-zipfile-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Guías"/><category term="python"/></entry><entry><title>¿Cómo crear un entorno virtual de Python?</title><link href="https://pythonscouts.com/entorno-virtual-python/" rel="alternate"/><published>2025-02-03T10:20:00+01:00</published><updated>2025-02-03T10:20:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-02-03:/entorno-virtual-python/</id><summary type="html">&lt;p&gt;Un entorno virtual en Python es un espacio de trabajo en el que puedes ejecutar código e instalar paquetes sin afectar la instalación global de Python.&lt;/p&gt;</summary><content type="html">&lt;p&gt;En esta guía rápida, aprenderás los pasos para crear un entorno virtual en Windows, macOS y Linux (Debian/Ubuntu).&lt;/p&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#conociendo-los-entornos-virtuales-de-python"&gt;Conociendo los entornos virtuales de Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#crear-un-entorno-virtual-python-en-windows"&gt;Crear un entorno virtual Python en Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#crear-un-entorno-virtual-python-en-macos"&gt;Crear un entorno virtual Python en macOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#crear-un-entorno-virtual-python-en-linux-debianubuntu"&gt;Crear un entorno virtual Python en Linux (Debian/Ubuntu)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="conociendo-los-entornos-virtuales-de-python"&gt;Conociendo los entornos virtuales de Python&lt;/h2&gt;
&lt;p&gt;Los &lt;strong&gt;entornos virtuales&lt;/strong&gt; de Python te sirven para gestionar dependencias de manera independiente para cada uno de tus proyectos. Esto te evita conflictos entre diferentes versiones de bibliotecas.&lt;/p&gt;
&lt;p&gt;En la práctica, un entorno virtual:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crea una copia aislada de Python y &lt;a href="https://pip.pypa.io/en/stable/" target="_blank"&gt;&lt;code&gt;pip&lt;/code&gt;&lt;/a&gt; dentro de un directorio específico.&lt;/li&gt;
&lt;li&gt;Permite instalar paquetes sin interferir con otros proyectos o con el sistema operativo.&lt;/li&gt;
&lt;li&gt;Facilita la replicación de entornos en distintos dispositivos o servidores.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="crear-un-entorno-virtual-python-en-windows"&gt;Crear un entorno virtual Python en Windows&lt;/h2&gt;
&lt;p&gt;Los requisitos previos para crear un entorno virtual de Python en Windows son los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tener &lt;a href="/instalar-python-windows/"&gt;instalado&lt;/a&gt; Python.&lt;/li&gt;
&lt;li&gt;Asegurarse de que &lt;code&gt;python&lt;/code&gt; y &lt;code&gt;pip&lt;/code&gt; funcionan correctamente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Una vez que tu sistema cumple los requisitos previos, puedes crear un entorno virtual de Python siguiendo los pasos que a continuación se describen.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Abrir símbolo del sistema (&lt;code&gt;cmd.exe&lt;/code&gt;) o la aplicación PowerShell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navegar a la carpeta donde deseas crear el entorno virtual:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Powershell&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;&lt;span class="n"&gt;ruta&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;al&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;proyecto&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Crear el entorno virtual:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Powershell&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;-m&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Activar el entorno virtual:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Powershell&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Scripts&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Desactivar el entorno y regresar al indicador (prompt) del sistema:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Powershell&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;deactivate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Usar &lt;code&gt;venv&lt;/code&gt; como nombre de un entorno virtual de Python es una práctica común. Sin embargo, no es obligatorio hacerlo, puedes emplear el nombre que desees.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h2 id="crear-un-entorno-virtual-python-en-macos"&gt;Crear un entorno virtual Python en macOS&lt;/h2&gt;
&lt;p&gt;En macOS, para crear un entorno virtual de Python, solo necesitas tener Python correctamente &lt;a href="/instalar-python-macos/"&gt;instalado&lt;/a&gt; en tu sistema. Una vez instalado, puedes seguir los siguientes pasos para crear un entorno virtual de Python:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Abrir la Terminal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navegar a la carpeta donde deseas crear el entorno virtual:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ruta/al/proyecto
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Crear el entorno virtual:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;venv&lt;span class="w"&gt; &lt;/span&gt;venv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Activar el entorno virtual:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;venv/bin/activate
&lt;span class="gp gp-VirtualEnv"&gt;(venv)&lt;/span&gt; &lt;span class="gp"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Desactivar el entorno y regresar al indicador del sistema:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp gp-VirtualEnv"&gt;(venv)&lt;/span&gt; &lt;span class="gp"&gt;$ &lt;/span&gt;deactivate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="crear-un-entorno-virtual-python-en-linux-debianubuntu"&gt;Crear un entorno virtual Python en Linux (Debian/Ubuntu)&lt;/h2&gt;
&lt;p&gt;Si tienes un sistema Linux basado en Debian o Ubuntu, entonces los requisitos son los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tener &lt;a href="/instalar-python-linux-debian-ubuntu/"&gt;instalado&lt;/a&gt; Python&lt;/li&gt;
&lt;li&gt;Tener el módulo &lt;code&gt;venv&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En Ubuntu, el módulo &lt;code&gt;venv&lt;/code&gt; no viene instalado por defecto. Si ese es tu sistema, entonces puedes instalar &lt;code&gt;venv&lt;/code&gt; con el siguiente comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;python3-venv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Luego de cumplir con los requisitos iniciales, puedes crear un entorno virtual Python siguiendo los pasos a continuación:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Abrir la terminal o línea de comandos.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navegar a la carpeta del proyecto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ruta/al/proyecto
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Crear el entorno virtual:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;venv&lt;span class="w"&gt; &lt;/span&gt;venv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Activar el entorno virtual:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;venv/bin/activate
&lt;span class="gp gp-VirtualEnv"&gt;(venv)&lt;/span&gt; &lt;span class="gp"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Desactivar el entorno y regresar al indicador del sistema:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp gp-VirtualEnv"&gt;(venv)&lt;/span&gt; &lt;span class="gp"&gt;$ &lt;/span&gt;deactivate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;En Ubuntu, &lt;code&gt;pip&lt;/code&gt; tampoco viene instalado por defecto. Para poder usar esta herramienta, debes instalarla con el comando &lt;code&gt;sudo apt install python3-pip&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;En Python, las buenas prácticas recomiendan el empleo de entornos virtuales dedicados para cada uno de tus proyectos. Siguiendo los pasos de esta guía, puedes crear y activar entornos virtuales de Python de manera eficiente en el sistema operativo que estés usando en tu computadora.&lt;/p&gt;</content><category term="Guías"/><category term="python"/></entry><entry><title>Iniciando con PySide6 para desarrollo GUI</title><link href="https://pythonscouts.com/iniciando-con-pyside6-python/" rel="alternate"/><published>2025-01-21T21:40:00+01:00</published><updated>2025-01-21T21:40:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-01-21:/iniciando-con-pyside6-python/</id><summary type="html">&lt;p&gt;En Python, PySide6 es una biblioteca que proporciona el enlace oficial de Python con Qt, que es un framework de desarrollo de aplicaciones de interfaz gráfica de usuario (GUI).&lt;/p&gt;</summary><content type="html">&lt;p&gt;Para desarrollar este tipo de aplicaciones en Python, puedes emplear una amplia variedad de bibliotecas y frameworks, incluyendo &lt;a href="https://docs.python.org/3/library/tkinter.html" target="_blank"&gt;Tkinter&lt;/a&gt;, &lt;a href="https://realpython.com/python-gui-with-wxpython/" target="_blank"&gt;wxPython&lt;/a&gt;, &lt;a href="https://www.riverbankcomputing.com/software/pyqt/intro" target="_blank"&gt;PyQt&lt;/a&gt;, entre otras. Sin embargo, &lt;a href="https://wiki.qt.io/Qt_for_Python" target="_blank"&gt;PySide6&lt;/a&gt; es una de las bibliotecas más populares y sólidas disponibles.&lt;/p&gt;
&lt;p&gt;En este tutorial, aprenderás los conceptos básicos para construir aplicaciones GUI usando Python y PySide6.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En este tutorial, aprenderás cómo:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instalar&lt;/strong&gt; PySide6 y configurarlo en tu computadora&lt;/li&gt;
&lt;li&gt;Crear aplicaciones con &lt;strong&gt;interfaces gráficas de usuario&lt;/strong&gt; basadas en PySide6&lt;/li&gt;
&lt;li&gt;Organizar una GUI usando &lt;strong&gt;gestores de disposición&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Crear &lt;strong&gt;ventanas principales&lt;/strong&gt; y &lt;strong&gt;diálogos&lt;/strong&gt; en tus aplicaciones PySide6&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para obtener el máximo de este tutorial, debes conocer lo básico de programación con Python, especialmente temas relacionados con la programación orientada a objetos.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Tutoriales/iniciando-con-pyside6-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#conociendo-pyside6"&gt;Conociendo PySide6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#instalando-pyside6"&gt;Instalando PySide6&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#en-windows"&gt;En Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#en-linux-y-macos"&gt;En Linux y macOS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#creando-una-aplicacion-pyside6"&gt;Creando una aplicación PySide6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#explorando-widgets-comunes-de-pyside6"&gt;Explorando widgets comunes de PySide6&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#botones"&gt;Botones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#campos-de-entrada-de-texto"&gt;Campos de entrada de texto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#listas-desplegables"&gt;Listas desplegables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#botones-radiales"&gt;Botones radiales&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#usando-gestores-de-disposicion"&gt;Usando gestores de disposición&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#disposicion-horizontal"&gt;Disposición horizontal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#disposicion-vertical"&gt;Disposición vertical&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#disposicion-en-cuadricula"&gt;Disposición en cuadrícula&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#disposicion-de-formulario"&gt;Disposición de formulario&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#creando-ventanas-y-dialogos"&gt;Creando ventanas y diálogos&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#ventanas-principales"&gt;Ventanas principales&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#dialogos-y-formularios"&gt;Diálogos y formularios&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mensajes-y-dialogos-estandar"&gt;Mensajes y diálogos estándar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="conociendo-pyside6"&gt;Conociendo PySide6&lt;/h2&gt;
&lt;p&gt;PySide6 es una biblioteca que proporciona el enlace oficial entre Python y &lt;a href="https://wiki.qt.io/About_Qt" target="_blank"&gt;Qt&lt;/a&gt;, el cual es un framework de desarrollo en &lt;a href="https://realpython.com/python-vs-cpp/" target="_blank"&gt;C++&lt;/a&gt; para crear interfaces gráficas de usuario (GUIs). Proporciona &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets.html" target="_blank"&gt;clases&lt;/a&gt; y herramientas para la creación de GUIs, manejo de &lt;a href="https://realpython.com/python-xml-parser/" target="_blank"&gt;XML&lt;/a&gt;, comunicación de red, expresiones regulares, hilos, bases de datos SQL, navegación web y otras tecnologías disponibles en Qt.&lt;/p&gt;
&lt;p&gt;PySide6, también conocida como &lt;a href="https://doc.qt.io/qtforpython-6/" target="_blank"&gt;Qt for Python&lt;/a&gt;, es compatible con Windows, Linux y macOS, por lo que puedes emplearla para desarrollar aplicaciones multiplataforma que tengan una apariencia nativa en cada plataforma.&lt;/p&gt;
&lt;p&gt;Puedes usar PySide6 con una licencia comercial y en proyectos de código abierto con una licencia compatible con la licencia de Qt que estés empleando ya sea &lt;a href="https://tldrlegal.com/license/gnu-lesser-general-public-license-v3-(lgpl-3)" target="_blank"&gt;LGPLv3&lt;/a&gt; o &lt;a href="https://tldrlegal.com/license/gnu-general-public-license-v2" target="_blank"&gt;GPLv2&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="instalando-pyside6"&gt;Instalando PySide6&lt;/h2&gt;
&lt;p&gt;Para instalar PySide6 en tu computadora, la opción recomendada es instalar desde el índice de paquetes de Python, &lt;a href="https://realpython.com/pypi-publish-python-package/" target="_blank"&gt;PyPI&lt;/a&gt;, usando el comando &lt;code&gt;pip&lt;/code&gt;. Para esto, puedes crear un &lt;a href="https://docs.python.org/es/3.13/glossary.html#term-virtual-environment" target="_blank"&gt;entorno virtual de Python&lt;/a&gt; y luego instalar el paquete &lt;code&gt;pyside6&lt;/code&gt;, ejecuta lo siguiente en tu línea de comandos, dependiendo de tu sistema operativo.&lt;/p&gt;
&lt;h3 id="en-windows"&gt;En Windows&lt;/h3&gt;
&lt;p&gt;En Windows, puedes instalar PySide6 ejecutando los comandos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Powershell&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;-m&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt;
&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Scripts&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bat&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;-m&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;pyside6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Con estos comandos, primero creas y activas un entorno virtual Python y luego instalas PySide6 desde PyPI.&lt;/p&gt;
&lt;h3 id="en-linux-y-macos"&gt;En Linux y macOS&lt;/h3&gt;
&lt;p&gt;En Linux y macOS el proceso es el mismo y puedes realizarlo con los siguientes comandos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;venv&lt;span class="w"&gt; &lt;/span&gt;venv
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;venv/bin/activate
&lt;span class="gp gp-VirtualEnv"&gt;(venv)&lt;/span&gt; &lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;pyside6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nuevamente, primero creas un entorno virtual usando el módulo &lt;code&gt;venv&lt;/code&gt; de la biblioteca estándar de Python. Luego lo activas, y finalmente instalas PySide6.&lt;/p&gt;
&lt;h2 id="creando-una-aplicacion-pyside6"&gt;Creando una aplicación PySide6&lt;/h2&gt;
&lt;p&gt;Con PySide6 instalado, estás listo para crear tu primera aplicación GUI. Para comenzar, crearás una aplicación de &lt;code&gt;Hola, Mundo!&lt;/code&gt;. Aquí están los pasos a seguir:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Importa &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QApplication.html" target="_blank"&gt;&lt;code&gt;QApplication&lt;/code&gt;&lt;/a&gt; y todos los widgets necesarios desde &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/index.html#module-PySide6.QtWidgets" target="_blank"&gt;&lt;code&gt;PySide6.QtWidgets&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Crea una instancia de &lt;code&gt;QApplication&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Define la GUI de la aplicación.&lt;/li&gt;
&lt;li&gt;Muestra la GUI de la aplicación.&lt;/li&gt;
&lt;li&gt;Ejecuta el &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QCoreApplication.html#PySide6.QtCore.PySide6.QtCore.QCoreApplication.exec" target="_blank"&gt;bucle de eventos&lt;/a&gt; de la aplicación.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Crea un nuevo archivo Python llamado &lt;code&gt;app.py&lt;/code&gt; en tu directorio de trabajo actual:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - app.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PySide6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En esta línea de código, importas &lt;code&gt;QApplication&lt;/code&gt;, &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QLabel.html" target="_blank"&gt;&lt;code&gt;QLabel&lt;/code&gt;&lt;/a&gt;, y &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QWidget.html" target="_blank"&gt;&lt;code&gt;QWidget&lt;/code&gt;&lt;/a&gt; desde &lt;code&gt;QtWidgets&lt;/code&gt;. Con esto, has cumplido con el primer paso.&lt;/p&gt;
&lt;p&gt;Para completar el segundo paso, necesitas crear una instancia de &lt;code&gt;QApplication&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - app.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PySide6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En esta línea de código, creas la instancia de &lt;code&gt;QApplication&lt;/code&gt;. Es necesario crear esta instancia antes de crear cualquier objeto GUI en PySide6.&lt;/p&gt;
&lt;p&gt;El tercer paso consiste en crear la GUI o ventana principal de la aplicación. Para este ejemplo, la GUI se basará en la clase &lt;code&gt;QWidget&lt;/code&gt;, que es la clase base de todos los objetos de interfaz de usuario en PySide6.&lt;/p&gt;
&lt;p&gt;Así es como puedes crear la GUI de la app:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - app.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PySide6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;PySide6 Demo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;hello&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;h1&amp;gt;Hola, Mundo!&amp;lt;/h1&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este código, &lt;code&gt;window&lt;/code&gt; es una instancia de &lt;code&gt;QWidget&lt;/code&gt;, la cual proporciona todas las características que necesitarás para crear la ventana de la aplicación.&lt;/p&gt;
&lt;p&gt;Como su nombre sugiere, el método &lt;code&gt;.setWindowTitle()&lt;/code&gt; te permite establecer el título de la ventana en tu aplicación. En este ejemplo, la ventana de la app mostrará &lt;code&gt;PySide6 Demo&lt;/code&gt; en su barra de título.&lt;/p&gt;
&lt;p&gt;Puedes usar &lt;code&gt;.setGeometry()&lt;/code&gt; para definir el tamaño de la ventana y la posición en la pantalla. Los dos primeros argumentos son las coordenadas de pantalla &lt;code&gt;x&lt;/code&gt; y &lt;code&gt;y&lt;/code&gt; donde se colocará la ventana. El tercer y cuarto argumentos son el ancho y alto de la ventana.&lt;/p&gt;
&lt;p&gt;Cada aplicación GUI necesita &lt;strong&gt;widgets&lt;/strong&gt;. Estos son los componentes gráficos que conforman la GUI de la app. En este ejemplo, usas un widget &lt;code&gt;QLabel&lt;/code&gt; llamado&lt;code&gt;hello&lt;/code&gt; que te permitirá mostrar el mensaje &lt;code&gt;Hola, Mundo!&lt;/code&gt; en la ventana de tu aplicación.&lt;/p&gt;
&lt;p&gt;Los objetos &lt;code&gt;QLabel&lt;/code&gt; pueden mostrar texto formateado en HTML, por lo que puedes usar el elemento &lt;a href="https://es.wikipedia.org/wiki/HTML" target="_blank"&gt;HTML&lt;/a&gt; &lt;code&gt;"&amp;lt;h1&amp;gt;Hola, Mundo!&amp;lt;/h1&amp;gt;"&lt;/code&gt; para proporcionar el texto deseado como un encabezado &lt;code&gt;h1&lt;/code&gt;. Finalmente, usas el método &lt;code&gt;.move()&lt;/code&gt; para colocar el mensaje en las coordenadas &lt;code&gt;(60, 15)&lt;/code&gt; en la ventana de la aplicación.&lt;/p&gt;
&lt;p&gt;Has finalizado el tercer paso, así que puedes continuar con los dos últimos pasos y preparar tu aplicación GUI PySide6 para ejecutarse:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - app.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PySide6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;PySide6 Demo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;hello&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;h1&amp;gt;Hola, Mundo!&amp;lt;/h1&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En las dos últimas líneas, llamas el método &lt;code&gt;.show()&lt;/code&gt; en &lt;code&gt;window&lt;/code&gt; para mostrar la ventana en la pantalla. Luego, inicias el bucle de eventos de la aplicación ejecutando &lt;code&gt;.exec()&lt;/code&gt; y ya está.&lt;/p&gt;
&lt;p&gt;Puedes ejecutar tu primera aplicación PySide6 con el siguiente comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;app.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Al ejecutar este comando, verás una ventana que lucirá como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyside6-python/pyside6-demo-app.png" class="mx-auto d-block mt-2" alt="Aplicación 'Hola, Mundo!' con PySide6 y Python"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Aplicación "Hola, Mundo!" con PySide6 y Python&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Tu aplicación muestra una ventana basada en &lt;code&gt;QWidget&lt;/code&gt;. La ventana muestra el mensaje &lt;code&gt;Hola, Mundo!&lt;/code&gt; usando un widget &lt;code&gt;QLabel&lt;/code&gt;. ¡Y con eso, has escrito tu primera aplicación de escritorio GUI usando PySide6 y Python!&lt;/p&gt;
&lt;h2 id="explorando-widgets-comunes-de-pyside6"&gt;Explorando widgets comunes de PySide6&lt;/h2&gt;
&lt;p&gt;Los &lt;strong&gt;widgets&lt;/strong&gt; son componentes gráficos rectangulares que colocas en las ventanas de tu aplicación para construir la GUI. Los widgets tienen atributos y métodos que te permiten ajustar su apariencia y comportamiento.&lt;/p&gt;
&lt;p&gt;Los widgets también detectan clics del mouse, pulsaciones de teclas y otros eventos del usuario, el sistema de ventanas y otras fuentes. Cada vez que un widget captura un evento, emite una señal para anunciar su cambio de estado.&lt;/p&gt;
&lt;p&gt;PySide6 tiene una colección variada de widgets, cada uno de los cuales tiene un propósito diferente. Algunos de los widgets más comunes incluyen botones, etiquetas o labels, campos de entrada de texto, listas desplegables, y botones radiales.&lt;/p&gt;
&lt;h3 id="botones"&gt;Botones&lt;/h3&gt;
&lt;p&gt;Puedes crear un botón con la clase &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QPushButton.html" target="_blank"&gt;&lt;code&gt;QPushButton&lt;/code&gt;&lt;/a&gt;, la cual proporciona un botón de comando clásico. Algunos botones típicos son &lt;em&gt;Ok&lt;/em&gt;, &lt;em&gt;Cancelar&lt;/em&gt;, &lt;em&gt;Aplicar&lt;/em&gt;, &lt;em&gt;Sí&lt;/em&gt;, &lt;em&gt;No&lt;/em&gt;, &lt;em&gt;Cerrar&lt;/em&gt;, similares.&lt;/p&gt;
&lt;p&gt;Crea un archivo llamado &lt;code&gt;buttons.py&lt;/code&gt; y pon el siguiente código en él:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - buttons.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PySide6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Botones PySide6&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Ok&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cancelar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Aplicar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Sí&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;No&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cerrar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, primero añades la clase &lt;code&gt;QPushButton&lt;/code&gt; a tus objetos importados. El bucle &lt;code&gt;for&lt;/code&gt; itera sobre una lista de nombres de botones comunes y crea un botón con cada uno de los nombres definidos. Así es como se verá tu aplicación al ejecutarla desde tu terminal:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyside6-python/pyside6-botones.png" class="mx-auto d-block mt-2" alt="Botones en PySide6"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Botones en PySide6&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Botones como estos son quizás los widgets más utilizados en cualquier GUI. Cuando alguien hace clic en ellos, tu aplicación ordena a la computadora realizar acciones. Así es como puedes ejecutar cálculos cuando un usuario hace clic en un botón.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;En este ejemplo, empleas una clase llamada &lt;code&gt;QVBoxLayout&lt;/code&gt; que representa un gestor de disposición que permite organizar los widgets con una orientación vertical. Más sobre gestores de disposición en un momento.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h3 id="campos-de-entrada-de-texto"&gt;Campos de entrada de texto&lt;/h3&gt;
&lt;p&gt;Los &lt;strong&gt;campos de entrada de texto&lt;/strong&gt; son widgets comunes también. Estos widgets te permite ingresar una sola línea de texto y puedes crearlos con la clase &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QLineEdit.html" target="_blank"&gt;&lt;code&gt;QLineEdit&lt;/code&gt;&lt;/a&gt;. Los campos de entrada de texto son útiles cuando necesitas obtener información del usuario como texto simple.&lt;/p&gt;
&lt;p&gt;Para un ejemplo, crea un archivo &lt;code&gt;line_edits.py&lt;/code&gt; y escribe el siguiente código en él:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - line_edits.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PySide6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QLineEdit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Campos de texto PySide6&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Nombre&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Usuario&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Contraseña&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;edit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QLineEdit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;edit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPlaceholderText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En el bucle de este ejemplo, creas tres campos de texto para permitir que el usuario introduzca su nombre, usuario y contraseña:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyside6-python/pyside6-campos-de-texto.png" class="mx-auto d-block mt-2" alt="Campos de texto en PySide6"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Campos de texto en PySide6&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Campos de texto como estos proporcionan funcionalidades estándar como copiar, pegar, deshacer, rehacer, arrastrar, soltar, y similares. En la imagen, puedes notar que los campos muestran texto de marcador de posición para informar al usuario qué tipo de información debe introducir.&lt;/p&gt;
&lt;h3 id="listas-desplegables"&gt;Listas desplegables&lt;/h3&gt;
&lt;p&gt;Las &lt;strong&gt;listas desplegables&lt;/strong&gt; son otro tipo fundamental de widget en aplicaciones GUI. Puedes crearlas usando la clase &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QComboBox.html" target="_blank"&gt;&lt;code&gt;QComboBox&lt;/code&gt;&lt;/a&gt;. Una lista desplegable presenta al usuario una serie de opciones de una manera que ocupa un espacio mínimo en la pantalla.&lt;/p&gt;
&lt;p&gt;A continuación, un ejemplo de cómo emplear una lista desplegable en PySide6:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - combo_boxes.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PySide6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QComboBox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Lista desplegable PySide6&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;combo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QComboBox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;combo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addItems&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;PySide6&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;PyQt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Kivy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Tkinter&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;wxPython&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;combo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas &lt;code&gt;combo&lt;/code&gt; como una instancia de &lt;code&gt;QComboBox&lt;/code&gt;. Esta instancia contendrá una lista desplegable con una serie de nombres de bibliotecas Python para desarrollo de aplicaciones GUI. Cuando ejecutas esta aplicación desde tu línea de comandos, obtienes una ventana como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyside6-python/pyside6-lista-desplegable.png" class="mx-auto d-block mt-2" alt="Lista desplegable en PySide6"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Lista desplegable en PySide6&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Al hacer clic sobre esta lista desplegable, los usuarios pueden seleccionar una de las opciones desplegadas. Las listas desplegables también pueden ser de solo lectura o editables y además de texto, también pueden contener &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtGui/QBitmap.html" target="_blank"&gt;pixmaps&lt;/a&gt; o ambos.&lt;/p&gt;
&lt;h3 id="botones-radiales"&gt;Botones radiales&lt;/h3&gt;
&lt;p&gt;El último widget que estudiarás es el &lt;strong&gt;botón radial&lt;/strong&gt;, que puedes crear con la clase &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QRadioButton.html" target="_blank"&gt;&lt;code&gt;QRadioButton&lt;/code&gt;&lt;/a&gt;. Se trata de un botón circular de opción que puedes seleccionar al hacer clic sobre él. Los botones radiales son útiles cuando necesitas que el usuario seleccione una entre varias opciones.&lt;/p&gt;
&lt;p&gt;Todas las opciones en un grupo de botones radiales son visibles al mismo tiempo, pero el usuario solo puede seleccionar una de ellas. Es decir, la selección es excluyente. Considera el siguiente ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - radio_buttons.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PySide6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QRadioButton&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Botones radiales PySide6&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;230&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;¿Qué prefieres?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;foods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Pizza&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Hamburguesa&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Pasta&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Pollo asado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;food&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;foods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;radio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QRadioButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;radio&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas una aplicación que muestra un texto descriptivo, &lt;code&gt;"¿Qué prefieres?"&lt;/code&gt;, seguido de una serie de botones radiales, que representan opciones entre las que el usuario puede elegir. En este caso, las opciones son "Pizza", "Hamburguesa", "Pasta" y "Pollo asado". Para crear los botones, empleas un ciclo &lt;code&gt;for&lt;/code&gt; que itera sobre la lista de comidas.&lt;/p&gt;
&lt;p&gt;Al hacer clic en uno de los botones, este se activa y los demás se desactivan automáticamente. Esto los hace ideales para preguntas de selección única, como preferencias o respuestas a encuestas:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyside6-python/pyside6-botones-radiales.png" class="mx-auto d-block mt-2" alt="Botones radiales en PySide6"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Botones radiales en PySide6&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;En este grupo de botones radiales, solo un botón puede estar seleccionado a la vez. Si seleccionas otro botón del grupo, entonces el botón previamente seleccionado se deseleccionará automáticamente.&lt;/p&gt;
&lt;p&gt;PySide6 tiene una amplia colección de widgets. Actualmente hay más de cuarenta &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QWidget.html" target="_blank"&gt;widgets&lt;/a&gt; disponibles. Aquí, has estudiado solo una pequeña muestra. Sin embargo, esta es suficiente para mostrarte el poder y la flexibilidad de este framework GUI.&lt;/p&gt;
&lt;p&gt;En la siguiente sección, aprenderás cómo organizar diferentes widgets para construir GUIs modernas y completamente funcionales para tus aplicaciones.&lt;/p&gt;
&lt;h2 id="usando-gestores-de-disposicion"&gt;Usando gestores de disposición&lt;/h2&gt;
&lt;p&gt;Para construir GUI app, necesitas saber cómo organizar un conjunto de widgets para que tu GUI sea intuitiva y funcional. En PySide6, las herramientas para este fin son los llamados &lt;strong&gt;gestores de disposición&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Se trata de clases que te permiten dimensionar y posicionar tus widgets en la ventana o formulario de la aplicación. Se adaptan automáticamente a eventos de cambio de tamaño y otros cambios en la GUI, controlando el tamaño y posición de todos sus widgets.&lt;/p&gt;
&lt;p&gt;PySide6 proporciona cuatro clases básicas de gestores de disposición:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QHBoxLayout.html" target="_blank"&gt;&lt;code&gt;QHBoxLayout&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QVBoxLayout.html" target="_blank"&gt;&lt;code&gt;QVBoxLayout&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QGridLayout.html" target="_blank"&gt;&lt;code&gt;QGridLayout&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QFormLayout.html" target="_blank"&gt;&lt;code&gt;QFormLayout&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En las secciones siguientes, aprenderás lo básico de cómo emplear estas clases y crear GUIs ordenadas y funcionales.&lt;/p&gt;
&lt;h3 id="disposicion-horizontal"&gt;Disposición horizontal&lt;/h3&gt;
&lt;p&gt;La primera clase de gestor de disposición que estudiarás es &lt;strong&gt;&lt;code&gt;QHBoxLayout&lt;/code&gt;&lt;/strong&gt;. Esta te permite organizar los widgets horizontalmente de izquierda a derecha. El ejemplo a continuación muestra cómo usar &lt;code&gt;QHBoxLayout&lt;/code&gt; para organizar tres botones horizontalmente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - horizontal_layout.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PySide6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QHBoxLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Disposición Horizontal&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QHBoxLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;positions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Izquierda&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Centro&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Derecha&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas una instancia de &lt;code&gt;QHBoxLayout&lt;/code&gt; llamada &lt;code&gt;layout&lt;/code&gt;. Luego agregas los tres botones en un ciclo usando el método &lt;code&gt;.addWidget()&lt;/code&gt;. La aplicación resultante luce como se muestra a continuación:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyside6-python/pyside6-gestor-disposicion-horizontal.png" class="mx-auto d-block mt-2" alt="Gestor de disposición horizontal en PySide6"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Gestor de disposición horizontal en PySide6&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;La figura anterior muestra tres botones en disposición horizontal. Los botones se muestran de izquierda a derecha en el mismo orden en que los agregaste en tu código.&lt;/p&gt;
&lt;h3 id="disposicion-vertical"&gt;Disposición vertical&lt;/h3&gt;
&lt;p&gt;La siguiente clase de gestor de disposición es &lt;strong&gt;&lt;code&gt;QVBoxLayout&lt;/code&gt;&lt;/strong&gt;. Esta clase te permite organizar los widgets verticalmente de arriba a abajo, facilitando la construcción de diseños verticales en tu GUI.&lt;/p&gt;
&lt;p&gt;A continuación, un ejemplo de cómo puedes usar &lt;code&gt;QVBoxLayout&lt;/code&gt; para organizar tres botones verticalmente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - vertical_layout.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PySide6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Disposición Vertical&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;230&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;positions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Arriba&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Centro&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Abajo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas una instancia de &lt;code&gt;QVBoxLayout&lt;/code&gt; llamada &lt;code&gt;layout&lt;/code&gt;. En el ciclo &lt;code&gt;for&lt;/code&gt;, añades tres botones a &lt;code&gt;layout&lt;/code&gt; empleando &lt;code&gt;.addWidget()&lt;/code&gt;. Cuando ejecutas esta aplicación de ejemplo, obtienes una ventana que se ve como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyside6-python/pyside6-gestor-disposicion-vertical.png" class="mx-auto d-block mt-2" alt="Gestor de disposición vertical en PySide6"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Gestor de disposición vertical en PySide6&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Esta captura muestra tres botones en un arreglo vertical, uno debajo del otro. Los botones aparecen en el mismo orden en que los agregaste a tu código, de arriba a abajo.&lt;/p&gt;
&lt;h3 id="disposicion-en-cuadricula"&gt;Disposición en cuadrícula&lt;/h3&gt;
&lt;p&gt;El tercer gestor de disposición que estudiarás es &lt;strong&gt;&lt;code&gt;QGridLayout&lt;/code&gt;&lt;/strong&gt;. Esta clase te permite organizar los widgets en una cuadrícula de filas y columnas. Cada widget tendrá una posición relativa en la cuadrícula. Puedes definir la posición de un widget con un par de coordenadas como &lt;code&gt;(fila, columna)&lt;/code&gt;. Cada coordenada debe ser un &lt;a href="https://realpython.com/python-numbers/" target="_blank"&gt;número&lt;/a&gt; entero. Estos pares de coordenadas definen qué celda en la cuadrícula ocupará un widget determinado.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;QGridLayout&lt;/code&gt; toma el espacio disponible, lo divide en &lt;code&gt;filas&lt;/code&gt; y &lt;code&gt;columnas&lt;/code&gt;, y coloca cada widget hijo en su propia celda.&lt;/p&gt;
&lt;p&gt;A continuación, se muestra un ejemplo de cómo organizar una GUI con este gestor de disposición:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - grid_layout.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PySide6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QGridLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Disposición en Cuadrícula&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QGridLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;button_names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Botón (0, 0)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Botón (0, 1)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Botón (0, 2)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Botón (1, 0)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Botón (1, 1)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Botón (1, 2)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Botón (2, 0)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button_names&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&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="n"&gt;i&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="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Botón (2, 1) + 2 Columnas de Amplitud&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="mi"&gt;2&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;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas una aplicación que utiliza un objeto &lt;code&gt;QGridLayout&lt;/code&gt; para organizar sus widgets en la pantalla. Nuevamente, para añadir los botones, empleas un ciclo &lt;code&gt;for&lt;/code&gt; y el método &lt;code&gt;.addWidget()&lt;/code&gt;. Nota que el segundo y tercer argumento que pasas al métodos son números enteros que definen la posición de cada widget en la cuadrícula.&lt;/p&gt;
&lt;p&gt;Finalmente, pasas dos argumentos más a &lt;code&gt;.addWidget()&lt;/code&gt;. Estos argumentos son &lt;code&gt;rowSpan&lt;/code&gt; y &lt;code&gt;columnSpan&lt;/code&gt; los cuales sirven para hacer que un widget ocupe más de una fila o columna. En este ejemplo, el último botón ocupa una fila y dos columnas.&lt;/p&gt;
&lt;p&gt;Si ejecutas este código desde tu línea de comandos, obtendrás una ventana que luce así:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyside6-python/pyside6-gestor-disposicion-cuadricula.png" class="mx-auto d-block mt-2" alt="Gestor de disposición en cuadrícula en PySide6"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Gestor de disposición en cuadrícula en PySide6&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;En esta figura, puedes ver tus botones organizados en una cuadrícula de filas y columnas. El último botón ocupa dos columnas en la cuadrícula.&lt;/p&gt;
&lt;h3 id="disposicion-de-formulario"&gt;Disposición de formulario&lt;/h3&gt;
&lt;p&gt;El último gestor de disposición que estudiarás es el &lt;strong&gt;&lt;code&gt;QFormLayout&lt;/code&gt;&lt;/strong&gt;. Con esta clase, puedes organizar los widgets en un diseño de dos columnas. La primera columna generalmente muestra texto en etiquetas, mientras que la segunda columna pueden contener widgets de entrada de datos como &lt;code&gt;QLineEdit&lt;/code&gt;, &lt;code&gt;QComboBox&lt;/code&gt;, &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QSpinBox.html" target="_blank"&gt;&lt;code&gt;QSpinBox&lt;/code&gt;&lt;/a&gt;, entre otros.&lt;/p&gt;
&lt;p&gt;El siguiente ejemplo muestra cómo crear una aplicación que utiliza un objeto &lt;code&gt;QFormLayout&lt;/code&gt; para organizar sus widgets:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - form_layout.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PySide6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QFormLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QLineEdit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Disposición de Formulario&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QFormLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Nombre:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Edad:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Ocupación:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Dirección:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QLineEdit&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;QFormLayout&lt;/code&gt; tiene un método llamado &lt;code&gt;.addRow()&lt;/code&gt; que puedes usar para agregar una fila de dos widgets al formulario. El primer argumento de &lt;code&gt;.addRow()&lt;/code&gt; debe ser una etiqueta o una cadena. El segundo argumento puede ser cualquier widget que permita al usuario ingresar o editar datos. En este ejemplo específico, has usado campos de entrada de texto, &lt;code&gt;QLineEdit&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si ejecutas este código, obtendrás una ventana similar a la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyside6-python/pyside6-gestor-disposicion-formulario.png" class="mx-auto d-block mt-2" alt="Gestor de disposición para formulario en PySide6"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Gestor de disposición para formulario en PySide6&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Esta ventana muestra un diseño de formulario. La primera columna contiene etiquetas para comunicar al usuario la información deseada. La segunda columna muestra widgets que permiten al usuario ingresar la información.&lt;/p&gt;
&lt;h2 id="creando-ventanas-y-dialogos"&gt;Creando ventanas y diálogos&lt;/h2&gt;
&lt;p&gt;Las aplicaciones de escritorio GUI en PySide6 generalmente están conformadas por dos tipos de ventanas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ventana principal:&lt;/strong&gt; La ventana en la que se desarrolla la mayor parte de la interacción del usuario.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diálogos:&lt;/strong&gt; Ventanas auxiliares de la aplicación que solicitan o muestran información al usuario.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En las secciones siguientes, aprenderás sobre ambos tipos de ventanas y cómo crearlas en PySide6 de manera que puedas construir aplicaciones funcionales y atractivas.&lt;/p&gt;
&lt;h3 id="ventanas-principales"&gt;Ventanas principales&lt;/h3&gt;
&lt;p&gt;La mayoría de las veces, tus aplicaciones tendrán una ventana que incluye &lt;a href="https://realpython.com/python-menus-toolbars/" target="_blank"&gt;barra de menú&lt;/a&gt;, algunas barras de herramientas, una barra de estado y un widget central que será el elemento principal de la GUI. Para crear este tipo de ventana en PySide6, puedes heredar de la clase &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QMainWindow.html" target="_blank"&gt;&lt;code&gt;QMainWindow&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Una instancia de una clase que deriva de &lt;code&gt;QMainWindow&lt;/code&gt; se considera la &lt;strong&gt;ventana principal&lt;/strong&gt; de la aplicación y debe ser única.&lt;/p&gt;
&lt;p&gt;La clase &lt;code&gt;QMainWindow&lt;/code&gt; proporciona un marco para construir la GUI de tu aplicación rápidamente. Esta clase tiene su propio diseño incorporado, que acepta los siguientes componentes gráficos:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Componente&lt;/th&gt;
&lt;th&gt;Posición&lt;/th&gt;
&lt;th&gt;Descripción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Una &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QMenuBar.html" target="_blank"&gt;barra de menú&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Arriba&lt;/td&gt;
&lt;td&gt;Contiene el menú principal de la aplicación&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Una o más &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QToolBar.html" target="_blank"&gt;barras de herramientas&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Cualquiera de los lados&lt;/td&gt;
&lt;td&gt;Puede contener &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QToolButton.html" target="_blank"&gt;botones de herramienta&lt;/a&gt; y otros widgets, como &lt;code&gt;QComboBox&lt;/code&gt;, &lt;code&gt;QSpinBox&lt;/code&gt;, y más&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Un widget central&lt;/td&gt;
&lt;td&gt;Centro&lt;/td&gt;
&lt;td&gt;Contiene el widget central de la ventana, que puede ser de cualquier tipo, incluyendo un widget compuesto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uno o más widgets &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QDockWidget.html" target="_blank"&gt;acoplables&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Alrededor del widget central&lt;/td&gt;
&lt;td&gt;Son ventanas pequeñas, movibles y ocultables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Una &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QStatusBar.html" target="_blank"&gt;barra de estado&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Abajo&lt;/td&gt;
&lt;td&gt;Contiene la barra de estado de la app, que muestra información de estado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;No puedes crear una ventana principal sin un widget central. Puedes establecer el widget central de la ventana con el método &lt;code&gt;.setCentralWidget()&lt;/code&gt;. El diseño de la ventana principal te permitirá tener un único widget central, que puede ser simple o compuesto.&lt;/p&gt;
&lt;p&gt;El siguiente ejemplo muestra cómo usar &lt;code&gt;QMainWindow&lt;/code&gt; para crear una aplicación con ventana principal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - main_window.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PySide6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QMainWindow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QStatusBar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QToolBar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QMainWindow&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;QMainWindow&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setCentralWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Soy el Widget Central&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_createMenu&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_createToolBar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_createStatusBar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_createMenu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;menu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;menuBar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addMenu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;amp;Menú&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;menu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;amp;Salir&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_createToolBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QToolBar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Salir&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addToolBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_createStatusBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QStatusBar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;showMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Soy la Barra de Estado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setStatusBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
    &lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Primeramente, creas una clase llamada &lt;code&gt;Window&lt;/code&gt; que hereda de &lt;code&gt;QMainWindow&lt;/code&gt;. Dentro del método &lt;code&gt;.__init__()&lt;/code&gt;, llamas al inicializador de la clase base. El argumento &lt;code&gt;parent&lt;/code&gt; se establece en &lt;code&gt;None&lt;/code&gt; porque esta es la ventana principal de tu aplicación, por lo que no debe tener una ventana padre.&lt;/p&gt;
&lt;p&gt;Luego, estableces el título de la ventana y creas un objeto &lt;code&gt;QLabel&lt;/code&gt; para usar como widget central de la ventana. Finalmente, llamas los métodos no públicos &lt;code&gt;._createMenu()&lt;/code&gt;, &lt;code&gt;._createToolBar()&lt;/code&gt;, &lt;code&gt;._createStatusBar()&lt;/code&gt; para crear el menú principal, una barra de herramientas y la barra de estado.&lt;/p&gt;
&lt;p&gt;El widget central y la barra de estado muestran mensajes identificativos. El menú y la barra de herramientas mostrarán una opción para salir de la aplicación.&lt;/p&gt;
&lt;p&gt;En macOS, cuando ejecutas la aplicación de ejemplo anterior, obtendrás una ventana como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyside6-python/pyside6-ventana-principal-macOS.png" class="mx-auto d-block mt-2" alt="Ventana principal en PySide6 - macOS"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Ventana principal en PySide6 - macOS&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Como puedes confirmar, tu aplicación tiene los siguientes componentes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un menú principal llamado genéricamente &lt;em&gt;Menú&lt;/em&gt; que se muestra en la barra superior del escritorio macOS. En otras plataformas, el menú principal aparece en la misma ventana de la aplicación justo debajo de la barra de título.&lt;/li&gt;
&lt;li&gt;Una barra de herramientas que contiene un botón &lt;em&gt;Salir&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Un widget central compuesto por un objeto &lt;code&gt;QLabel&lt;/code&gt; que muestra un mensaje identificativo.&lt;/li&gt;
&lt;li&gt;Una barra de estado en la parte inferior de la ventana que también muestra un mensaje identificativo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;¡Eso es todo! Has aprendido a construir una aplicación con ventana principal usando Python y PySide6. Lo siguiente es aprender un poco sobre cómo crear diálogos.&lt;/p&gt;
&lt;h3 id="dialogos-y-formularios"&gt;Diálogos y formularios&lt;/h3&gt;
&lt;p&gt;También es común que tus aplicaciones tengan varios diálogos para llevar a cabo acciones secundarias que dependen de la entrada del usuario. Para crear un diálogo, necesitas crear una clase que herede de &lt;a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QDialog.html" target="_blank"&gt;&lt;code&gt;QDialog&lt;/code&gt;&lt;/a&gt;, que es la clase base de todas las ventanas de diálogo en PySide6.&lt;/p&gt;
&lt;p&gt;En PySide6, los diálogos pueden ser:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Modal:&lt;/strong&gt; Bloquea la entrada a cualquier otra ventana visible en la misma aplicación. Puedes mostrar un diálogo modal llamando a su método &lt;code&gt;.exec()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No modal:&lt;/strong&gt; Opera independientemente de otras ventanas en la misma aplicación. Puedes mostrar un diálogo no modal usando su método &lt;code&gt;.show()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Puedes emplear diálogos como formularios de entrada de datos, ventanas de configuración, entre otras. Por esto, los diálogos también pueden proporcionar un valor de retorno y tener botones predeterminados, como &lt;em&gt;Aplicar&lt;/em&gt;, &lt;em&gt;Ok&lt;/em&gt; y &lt;em&gt;Cancelar&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Un diálogo es siempre una ventana independiente. Si un diálogo tiene un widget padre (&lt;code&gt;parent&lt;/code&gt;), entonces se mostrará centrado sobre dicho widget.&lt;/p&gt;
&lt;p&gt;A continuación un ejemplo de cómo emplear &lt;code&gt;QDialog&lt;/code&gt; para desarrollar una diálogo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - dialog_form.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PySide6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QDialog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QDialogButtonBox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QFormLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QLineEdit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QDialog&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;QDialog&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;form_layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QFormLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Nombre:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Edad:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Ocupación:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Dirección:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;form_layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QLineEdit&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

        &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;form_layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;buttons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QDialogButtonBox&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;buttons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setStandardButtons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;QDialogButtonBox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardButton&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cancel&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
            &lt;span class="n"&gt;QDialogButtonBox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardButton&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ok&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buttons&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, usas la clase &lt;code&gt;QDialog&lt;/code&gt; como la base para crear una ventana de diálogo. Para definir el diseño del diálogo, usas un &lt;code&gt;QVBoxLayout&lt;/code&gt; y un &lt;code&gt;QFormLayout&lt;/code&gt;. Con ellos, estableces el diseño principal que consiste en un formulario para entrada de datos y dos botones para aceptar o cancelar la entrada de datos.&lt;/p&gt;
&lt;p&gt;Empleas la clase &lt;code&gt;QDialogButtonBox&lt;/code&gt; para gestionar los botones estándar del diálogo &lt;em&gt;OK&lt;/em&gt; y &lt;em&gt;Cancel&lt;/em&gt;. Este widget es muy útil porque gestiona automáticamente las interacciones comunes de los botones como cerrar el cuadro de diálogo o confirmar acciones.&lt;/p&gt;
&lt;p&gt;El código anterior mostrará una ventana que se verá así:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyside6-python/pyside6-dialogo.png" class="mx-auto d-block mt-2" alt="Ventana de diálogo en PySide6"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Ventana de diálogo en PySide6&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Esta figura muestra el diálogo creado con un &lt;code&gt;QFormLayout&lt;/code&gt; para organizar los widgets y un &lt;code&gt;QVBoxLayout&lt;/code&gt; para el diseño global.&lt;/p&gt;
&lt;h3 id="mensajes-y-dialogos-estandar"&gt;Mensajes y diálogos estándar&lt;/h3&gt;
&lt;p&gt;PySide6 también proporciona una forma rápida de crear &lt;strong&gt;cuadros de mensaje&lt;/strong&gt; para el usuario. La clase &lt;code&gt;QMessageBox&lt;/code&gt; te permite crear pequeñas ventanas diseñados para mostrar mensajes al usuario. PySide6 ofrece varios tipos de cuadros de mensajes predefinidos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;QMessageBox.information()&lt;/code&gt;&lt;/strong&gt;: Permite mostrar un mensaje informativo, como una confirmación o un aviso simple.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;QMessageBox.warning()&lt;/code&gt;&lt;/strong&gt;: Permite mostrar una advertencia sobre posibles problemas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;QMessageBox.critical()&lt;/code&gt;&lt;/strong&gt;: Muestra mensajes de error críticos.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;QMessageBox.question()&lt;/code&gt;&lt;/strong&gt;: Presenta una pregunta al usuario con opciones como &lt;em&gt;Sí&lt;/em&gt; y &lt;em&gt;No&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Además, PySide6 tiene &lt;strong&gt;diálogos estándar&lt;/strong&gt; predefinidos que facilitan la interacción con el usuario, ya sea para permitirle seleccionar archivos, carpetas, colores o fuentes. Aquí tienes un resumen de ellos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;QFileDialog&lt;/code&gt;&lt;/strong&gt;: Permite al usuario seleccionar un archivo existente para abrirlo. Con el método &lt;code&gt;.getOpenFileName()&lt;/code&gt;, seleccionas un archivos. Con &lt;code&gt;.getSaveFileNames()&lt;/code&gt;, seleccionas múltiples archivos. Por su parte, &lt;code&gt;.getSaveFileName()&lt;/code&gt; te permite seleccionar la ubicación y el nombre para guardar un archivo. Finalmente, &lt;code&gt;.getExistingDirectory()&lt;/code&gt; permite seleccionar una carpeta en lugar de un archivo.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;QColorDialog&lt;/code&gt;&lt;/strong&gt;: Presenta un diálogo selector de colores que permite al usuario elegir un color. El método empleado es &lt;code&gt;.getColor()&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;QFontDialog&lt;/code&gt;&lt;/strong&gt;: Representa un selector de fuentes que permite al usuario seleccionar una fuente, tamaño y estilo. El método empleado es &lt;code&gt;.getFont()&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;QInputDialog&lt;/code&gt;&lt;/strong&gt;: Permite al usuario ingresar datos simples, como un texto, un número o una opción de una lista. Los métodos correspondientes son &lt;code&gt;.getText()&lt;/code&gt; para entrada de texto, &lt;code&gt;.getInt()&lt;/code&gt; para entrada de un número entero, y &lt;code&gt;.getItem()&lt;/code&gt; para selección de un elemento de una lista.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A continuación, un ejemplo que muestra algunos de elementos en acción:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - standard_dialogs.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PySide6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QColorDialog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QFileDialog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QFontDialog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QInputDialog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QMessageBox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

&lt;span class="c1"&gt;# Mostrar un mensaje&lt;/span&gt;
&lt;span class="n"&gt;QMessageBox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Información&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Este es un mensaje.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Abrir un archivo&lt;/span&gt;
&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QFileDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getOpenFileName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Abrir Archivo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;QMessageBox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;Archivo Seleccionado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Seleccionaste: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Seleccionar un color&lt;/span&gt;
&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QColorDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getColor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;QMessageBox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Color Seleccionado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Seleccionaste: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Seleccionar una fuente&lt;/span&gt;
&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QFontDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getFont&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;QMessageBox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Fuente Seleccionada&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Seleccionaste: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Entrada de texto&lt;/span&gt;
&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QInputDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Entrada de Texto&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Escribe algo:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;QMessageBox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Texto Ingresado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Escribiste: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En esta aplicación, lo primero que haces es mostrar un mensaje empleando &lt;code&gt;QMessageBox.information()&lt;/code&gt;. Luego, empleas &lt;code&gt;QFileDialog.getOpenFileName()&lt;/code&gt; para generar un diálogo que te permite abrir un archivo seleccionado. Seguidamente, creas diálogos para seleccionar un color y una fuente. Finalmente, creas un diálogo que le da al usuario la posibilidad de introducir un número entero de manera rápida.&lt;/p&gt;
&lt;p&gt;Los cuadros de mensaje y los diálogos estándar son herramientas esenciales para cualquier aplicación PySide6 que requiera interacción con el usuario.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Las aplicaciones con &lt;strong&gt;interfaz gráfica de usuario (GUI)&lt;/strong&gt; representan una parte sustancial en el desarrollo de software. Python ofrece varios frameworks y bibliotecas que pueden ayudarte a desarrollar aplicaciones GUI modernas y robustas.&lt;/p&gt;
&lt;p&gt;En este tutorial, aprendiste cómo usar &lt;strong&gt;PySide6&lt;/strong&gt;, que es una de las bibliotecas más populares y sólidas para el desarrollo de aplicaciones GUI en Python. Es además, el enlace oficial de Python con &lt;a href="https://doc.qt.io/" target="_blank"&gt;Qt&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En este tutorial, has aprendido a:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instalar&lt;/strong&gt; PySide6 y configurarlo en tu computadora&lt;/li&gt;
&lt;li&gt;Desarrollar aplicaciones con &lt;strong&gt;GUI&lt;/strong&gt; basadas en PySide6&lt;/li&gt;
&lt;li&gt;Organizar una GUI usando &lt;strong&gt;gestores de disposición&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Crear &lt;strong&gt;ventanas principales&lt;/strong&gt; y &lt;strong&gt;diálogos&lt;/strong&gt; en tus aplicaciones PySide6&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ahora puedes usar tus conocimientos de Python y PySide6 para dar vida a tus propias aplicaciones GUI de escritorio.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Tutoriales/iniciando-con-pyside6-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Tutoriales"/><category term="gui"/><category term="pyside6"/></entry><entry><title>Python a través de ejemplos: Sentencias condicionales</title><link href="https://pythonscouts.com/condicionales-python/" rel="alternate"/><published>2025-01-21T18:40:00+01:00</published><updated>2025-01-21T18:40:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-01-21:/condicionales-python/</id><summary type="html">&lt;p&gt;En Python, una condicional es una sentencia compuesta que permite ejecutar bloques de código en función del cumplimiento de determinadas condiciones.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Python te permite crear varios tipos de sentencias condicionales. En este tutorial, aprenderás lo básico sobre cómo funcionan y cómo crear condicionales en Python.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/condicionales-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#condiciones"&gt;Condiciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#condicionales-simples-con-if"&gt;Condicionales simples con if&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#condicionales-con-clausula-else"&gt;Condicionales con cláusula else&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#condicionales-multiples-con-elif"&gt;Condicionales múltiples con elif&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusiones"&gt;Conclusiones&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="condiciones"&gt;Condiciones&lt;/h2&gt;
&lt;p&gt;Una &lt;strong&gt;condición&lt;/strong&gt; es una &lt;a href="/expresiones-python/"&gt;expresión&lt;/a&gt; que evalúa si algo es verdadero (&lt;code&gt;True&lt;/code&gt;) o falso (&lt;code&gt;False&lt;/code&gt;). Las condiciones se emplean para controlar el flujo de un programa, permitiendo ejecutar diferentes bloques de código según el resultado obtenido al evaluarlas.&lt;/p&gt;
&lt;p&gt;En Python, puedes crear varios tipos de condiciones. Por ejemplo, las siguientes condiciones comparan &lt;a href="/valores-python/"&gt;valores&lt;/a&gt; numéricos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;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="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;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="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Las condiciones más comunes usan operadores de &lt;a href="/operadores-python/#comparacion"&gt;comparación&lt;/a&gt; como &lt;code&gt;==&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;=&lt;/code&gt;, y &lt;code&gt;&amp;lt;=&lt;/code&gt;. En estos casos, siempre obtendrás un valor booleano (&lt;code&gt;True&lt;/code&gt; o &lt;code&gt;False&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Las expresiones de &lt;a href="/operadores-python/#pertenencia"&gt;pertenencia&lt;/a&gt; también son empleadas como condiciones:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="ow"&gt;in&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="ow"&gt;in&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;banana&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;manzana&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;banana&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;cereza&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;naranja&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;manzana&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;banana&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;cereza&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Estas expresiones permiten determinar si un valor u objeto específico forma parte de una serie de valores o colección.&lt;/p&gt;
&lt;p&gt;También puedes crear condiciones empleando los operadores &lt;a href="/operadores-python/#logicos"&gt;lógicos&lt;/a&gt; &lt;code&gt;and&lt;/code&gt;, &lt;code&gt;or&lt;/code&gt;, y &lt;code&gt;not&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En el primer ejemplo, utilizas el operador &lt;code&gt;and&lt;/code&gt; para combinar dos expresiones de comparación. Si ambas son verdaderas, obtienes &lt;code&gt;True&lt;/code&gt;. En el segundo ejemplo, empleas el operador &lt;code&gt;or&lt;/code&gt;. En este caso, si al menos una de las expresiones evaluadas es verdadera, entonces obtienes &lt;code&gt;True&lt;/code&gt;. Finalmente, el operador &lt;code&gt;not&lt;/code&gt; te permite negar el resultado de evaluar una expresión o condición.&lt;/p&gt;
&lt;p&gt;Finalmente, también es posible emplear valores y objetos individuales como condiciones. Esto es posible porque todos los objetos en Python tienen un valor de verdad inherente.&lt;/p&gt;
&lt;p&gt;Python emplea las siguientes reglas para determinar el valor de verdad de los objetos:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Por defecto, un objeto se considera verdadero a menos que su clase defina un método &lt;code&gt;.__bool__()&lt;/code&gt; que devuelva &lt;code&gt;False&lt;/code&gt; o un método &lt;code&gt;.__len__()&lt;/code&gt; que devuelva cero cuando se llama con el objeto. A continuación, se muestran la mayoría de los objetos incorporados considerados como falsos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Constantes definidas como falsas: &lt;code&gt;None&lt;/code&gt; y &lt;code&gt;False&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Cero en cualquiera de los diferentes tipos numéricos: &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;0.0&lt;/code&gt;, &lt;code&gt;0j&lt;/code&gt;, &lt;code&gt;Decimal(0)&lt;/code&gt;, &lt;code&gt;Fraction(0, 1)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Cualquier colección o secuencia vacía: &lt;code&gt;''&lt;/code&gt;, &lt;code&gt;()&lt;/code&gt;, &lt;code&gt;[]&lt;/code&gt;, &lt;code&gt;{}&lt;/code&gt;, &lt;code&gt;set()&lt;/code&gt;, &lt;code&gt;range(0)&lt;/code&gt; (&lt;a href="https://docs.python.org/es/3.13/library/stdtypes.html#truth-value-testing" target="_blank"&gt;Fuente&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="condicionales-simples-con-if"&gt;Condicionales simples con &lt;code&gt;if&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;El condicional &lt;code&gt;if&lt;/code&gt; permite ejecutar un bloque de código solo si una condición es verdadera. Su sintaxis es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El bloque de código se ejecuta únicamente si la condición es verdadera. Considera el siguiente ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x es mayor que 5&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;x es mayor que 5&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&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="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x es igual a 5&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La primera condición es verdadera, por lo tanto la función &lt;code&gt;print()&lt;/code&gt; se ejecuta. Si la condición es falsa, el código dentro del bloque &lt;code&gt;if&lt;/code&gt; no se ejecuta, tal y como sucede en el segundo ejemplo.&lt;/p&gt;
&lt;p&gt;Como ya sabes, todos los objetos en Python tienen un valor de verdad y por lo tanto los puedes emplear como condiciones en una sentencia condicional. Un ejemplo común es verificar si una lista contiene algún valor:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &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;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;la lista no está vacía&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;la lista no está vacía&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;[]:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;la lista no está vacía&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En el primer ejemplo, la lista contiene valores y por lo tanto su valor de verdad es &lt;code&gt;True&lt;/code&gt;. En este caso, el bloque de código se ejecuta. En el segundo ejemplo, la lista está vacía y su valor de verdad es &lt;code&gt;False&lt;/code&gt;. Por esta razón, el bloque de código no se ejecuta.&lt;/p&gt;
&lt;h2 id="condicionales-con-clausula-else"&gt;Condicionales con cláusula &lt;code&gt;else&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;La cláusula &lt;code&gt;else&lt;/code&gt; te permite manejar el caso en que la condición del &lt;code&gt;if&lt;/code&gt; es falsa. La sintaxis es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El bloque bajo la cláusula &lt;code&gt;else&lt;/code&gt; se ejecuta si la condición es falsa:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x es mayor que 5&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x no es mayor que 5&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;x no es mayor que 5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El bloque &lt;code&gt;else&lt;/code&gt; es opcional y solo se ejecuta si la condición en el &lt;code&gt;if&lt;/code&gt; no se cumple.&lt;/p&gt;
&lt;h2 id="condicionales-multiples-con-elif"&gt;Condicionales múltiples con &lt;code&gt;elif&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Cuando necesitas evaluar más de una condición, puedes usar la cláusula &lt;code&gt;elif&lt;/code&gt; (abreviatura de &lt;code&gt;else if&lt;/code&gt;). Esta permite verificar varias condiciones una detrás de otra. La sintaxis es la siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Sintaxis de Python&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition_1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;condition_2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;condition_3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;condition_N&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puedes tener cualquier número de cláusulas &lt;code&gt;elif&lt;/code&gt;, pero solo un &lt;code&gt;if&lt;/code&gt; que es requerido y un &lt;code&gt;else&lt;/code&gt; que es opcional. Python evalúa las condiciones en orden. Una vez que encuentra una condición verdadera, el bloque correspondiente se ejecuta y los bloques restantes se ignoran. Si ninguna condición resulta verdadera, el bloque &lt;code&gt;else&lt;/code&gt; (si existe) se ejecuta.&lt;/p&gt;
&lt;p&gt;Considera el ejemplo a continuación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x es mayor que 15&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x es mayor que 5 pero no mayor que 15&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x es 5 o menos&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;x es mayor que 5 pero no mayor que 15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, Python comienza evaluando la condición &lt;code&gt;x &amp;gt; 15&lt;/code&gt; la cual resulta falsa. Luego evalúa la siguiente condición &lt;code&gt;x &amp;gt; 5&lt;/code&gt; en la cláusula &lt;code&gt;elif&lt;/code&gt;. Como esta condición es verdadera, el bloque se ejecuta y la cláusula &lt;code&gt;else&lt;/code&gt; se ignora.&lt;/p&gt;
&lt;h2 id="conclusiones"&gt;Conclusiones&lt;/h2&gt;
&lt;p&gt;Has aprendido a escribir sentencias &lt;strong&gt;condicionales&lt;/strong&gt; en Python empleando las &lt;a href="/python-palabras-clave/"&gt;palabras clave&lt;/a&gt; &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;else&lt;/code&gt; y &lt;code&gt;elif&lt;/code&gt;. Las sentencias condicionales te permiten controlar el flujo de ejecución de un programa en función del cumplimiento de ciertas condiciones.&lt;/p&gt;
&lt;p&gt;Comprender y utilizar correctamente las condicionales es fundamental para cualquier desarrollador de Python, pues ellas te permiten tomar decisiones en tiempo de ejecución. Esto es esencial para desarrollar aplicaciones que respondan adecuadamente a diferentes escenarios.&lt;/p&gt;
&lt;p&gt;Ahora que sabes lo básico de las condicionales en Python, puedes aplicarlas para crear programas más complejos, y desarrollar aplicaciones que requieran lógica de decisión.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/condicionales-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/></entry><entry><title>¿Cómo instalar Python en tu sistema operativo Debian o Ubuntu Linux?</title><link href="https://pythonscouts.com/instalar-python-linux-debian-ubuntu/" rel="alternate"/><published>2025-01-20T15:45:00+01:00</published><updated>2025-01-20T15:45:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-01-20:/instalar-python-linux-debian-ubuntu/</id><summary type="html">&lt;p&gt;Instalar Python en tu computadora es el primer paso para aprender el lenguaje. Si usas Debian/Ubuntu, aquí encontrarás los pasos necesarios para instalar Python.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Emplearás &lt;code&gt;apt&lt;/code&gt; que es el gestor de paquetes de tu distribución Debian/Ubuntu y derivadas. Es recomendable que tengas experiencia de trabajo en sistemas Linux basados en Debian, como puede ser Ubuntu o Linux Mint, para poder seguir esta guía de instalación de Python.&lt;/p&gt;
&lt;p&gt;Es especialmente importante que tengas conocimientos básicos sobre la terminal del sistema y sepas cómo emplearla.&lt;/p&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#prerequisitos"&gt;Prerequisitos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#instalar-python-en-debian-o-ubuntu-linux-con-apt"&gt;Instalar Python en Debian o Ubuntu Linux con apt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#paso-1-actualizar-la-lista-de-paquetes-disponibles"&gt;Paso 1: Actualizar la lista de paquetes disponibles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#paso-2-instalar-python-desde-los-repositorios-del-sistema"&gt;Paso 2: Instalar Python desde los repositorios del sistema&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#paso-3-verificar-la-instalacion"&gt;Paso 3: Verificar la instalación&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="prerequisitos"&gt;Prerequisitos&lt;/h2&gt;
&lt;p&gt;Para completar los pasos de esta guía de instalación de Python en Linux, necesitas una computadora con alguna distribución basada en Debian como Ubuntu o Linux Mint. Además, necesitas tener privilegios root y una conexión a Internet.&lt;/p&gt;
&lt;p&gt;¡Lo demás es solo seguir las instrucciones más abajo!&lt;/p&gt;
&lt;h2 id="instalar-python-en-debian-o-ubuntu-linux-con-apt"&gt;Instalar Python en Debian o Ubuntu Linux con &lt;code&gt;apt&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;La manera recomendada para instalar Python en una computadora con Linux es emplear el gestor de paquetes de tu distribución. En distribuciones basadas en Debian y Ubuntu, el gestor de paquetes es &lt;code&gt;apt&lt;/code&gt;. Los pasos para completar la instalación son los siguientes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Actualizar la lista de paquetes disponibles con &lt;code&gt;sudo apt update&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Instalar Python desde los repositorios del sistema con &lt;code&gt;sudo apt install python3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Verificar que la instalación se completó con éxito.&lt;/li&gt;
&lt;li&gt;🐍&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A continuación encontrarás una explicación detallada de estos pasos. Presta especial atención al paso número dos. De él dependerá el éxito de la instalación.&lt;/p&gt;
&lt;h2 id="paso-1-actualizar-la-lista-de-paquetes-disponibles"&gt;Paso 1: Actualizar la lista de paquetes disponibles&lt;/h2&gt;
&lt;p&gt;Lo primero es abrir una terminal del sistema o línea de comandos. Para esto, puedes presionar Ctrl+Alt+T en tu teclado o buscar el terminal entre las aplicaciones de tu sistema. En Ubuntu, el terminal luce de la siguiente manera:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-linux-debian-ubuntu/terminal-window-ubuntu.png" class="mx-auto d-block mt-2" alt="Ventana de la Terminal o línea de comandos en Ubuntu Linux"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Ventana de la Terminal o línea de comandos en Ubuntu Linux&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Una vez que tengas la terminal abierta, puedes ejecutar el siguiente comando para actualizar la lista de paquetes disponibles en los repositorios de tu distribución:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Para poder ejecutar este comando, debes suministrar la contraseña del usuario root. De esto se encarga el comando &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Durante la ejecución de &lt;code&gt;apt update&lt;/code&gt;, el comando descargará los índices del repositorio y los actualizará en tu ordenador. De este modo, tendrás acceso a las últimas versiones disponibles para cada paquete de tu distribución. Con este paso, estás listo para instalar Python.&lt;/p&gt;
&lt;h2 id="paso-2-instalar-python-desde-los-repositorios-del-sistema"&gt;Paso 2: Instalar Python desde los repositorios del sistema&lt;/h2&gt;
&lt;p&gt;Ahora que tienes la lista de paquetes actualizada, puedes instalar Python desde los repositorios de tu distribución con el siguiente comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;python3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este comando descarga Python desde los repos y lo instala en tu ordenador. Esta será la instalación Python del sistema.&lt;/p&gt;
&lt;p&gt;En Ubuntu, el paquete &lt;code&gt;python3&lt;/code&gt; no incluye todas las funcionalidades que vienen con el instalador oficial de Python para otros sistemas operativos como &lt;a href="/instalar-python-windows/"&gt;Windows&lt;/a&gt; y &lt;a href="/instalar-python-macos/"&gt;macOS&lt;/a&gt;. Por ejemplo, si necesitas trabajar con entornos virtuales, deberás instalar &lt;code&gt;python3-venv&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;De modo similar, si deseas usar &lt;a href="https://pip.pypa.io/en/stable/" target="_blank"&gt;&lt;code&gt;pip&lt;/code&gt;&lt;/a&gt;, que es el instalador de paquetes para Python, deberás instalar el paquete &lt;code&gt;python3-pip&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Puedes disponer de estas dos herramientas al ejecutar el siguiente comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;python3-venv&lt;span class="w"&gt; &lt;/span&gt;python3-pip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Al concluir la ejecución de este comando, tendrás acceso a crear nuevos entornos virtuales e instalar paquetes Python usando &lt;code&gt;pip&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Finalmente, si planeas crear aplicaciones con &lt;a href="/iniciando-con-tkinter-python/"&gt;interfaz gráfica (GUI) basada en Tkinter&lt;/a&gt;, debes instalar el paquete &lt;code&gt;python3-tk&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="paso-3-verificar-la-instalacion"&gt;Paso 3: Verificar la instalación&lt;/h2&gt;
&lt;p&gt;Una vez que hayas ejecutado los pasos anteriores, Python estará instalado en tu sistema operativo. Para confirmar que lo tienes, ejecuta el comando siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;--version&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="go"&gt;Python 3.10.12&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este comando imprime la versión de Python que tienes instalada por defecto. Con esto has concluido la instalación de Python usando el gestor de paquetes de tu distribución Linux. Ahora estás listo para escribir tu &lt;a href="/python-hola-mundo/"&gt;primer programa&lt;/a&gt;.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Es importante que sepas que la versión de Python disponible en los repositorios oficiales de Debian, Ubuntu y derivados puede estar relativamente actualizada con respecto a las últimas versiones liberadas. Para instalar la última versión de Python, deberás compilarla desde sus &lt;a href="https://www.python.org/downloads/source/" target="_blank"&gt;fuentes&lt;/a&gt; o emplear herramientas como &lt;a href="https://github.com/pyenv/pyenv" target="_blank"&gt;&lt;code&gt;pyenv&lt;/code&gt;&lt;/a&gt; que te permiten gestionar varias versiones de Python en tu computadora.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;Instalar Python en tu ordenador es el primer paso en tu empeño de aprender a programar con el lenguaje. Nuevamente, recuerda que los pasos a seguir para completar la instalación en tu distribución Linux basada en Debian o Ubuntu son los siguientes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Actualizar la lista de paquetes disponibles con &lt;code&gt;sudo apt update&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Instalar Python desde los repositorios del sistema con &lt;code&gt;sudo apt install python3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Verificar que la instalación se completó con éxito.&lt;/li&gt;
&lt;li&gt;🐍&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Luego de completados estos pasos, estás listo para comenzar a explorar las bondades de Python como lenguaje de programación.&lt;/p&gt;</content><category term="Guías"/><category term="python"/><category term="linux"/></entry><entry><title>Iniciando con Tkinter para desarrollo GUI</title><link href="https://pythonscouts.com/iniciando-con-tkinter-python/" rel="alternate"/><published>2025-01-06T15:15:00+01:00</published><updated>2025-01-06T15:15:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2025-01-06:/iniciando-con-tkinter-python/</id><summary type="html">&lt;p&gt;En Python, Tkinter es una biblioteca que proporciona un kit de herramientas para el desarrollo de aplicaciones de interfaz gráfica de usuario (GUI).&lt;/p&gt;</summary><content type="html">&lt;p&gt;Tkinter es una de las bibliotecas más empleadas en el desarrollo rápido de aplicaciones GUI puesto que viene incluida con la instalación oficial de Python como parte de la biblioteca estándar.&lt;/p&gt;
&lt;p&gt;Aprender los conceptos básicos para construir aplicaciones GUI usando Python y Tkinter es una excelente habilidad para cualquier desarrollador Python.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En este tutorial, aprenderás cómo:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instalar&lt;/strong&gt; Tkinter y configurarlo en tu computadora&lt;/li&gt;
&lt;li&gt;Crear aplicaciones con &lt;strong&gt;interfaces gráficas de usuario&lt;/strong&gt; basadas en Tkinter&lt;/li&gt;
&lt;li&gt;Organizar una GUI usando los &lt;strong&gt;gestores de geometría&lt;/strong&gt; de Tkinter&lt;/li&gt;
&lt;li&gt;Crear &lt;strong&gt;ventanas principales&lt;/strong&gt; y &lt;strong&gt;diálogos&lt;/strong&gt; en tus aplicaciones&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para aprovechar al máximo de este tutorial, debes conocer lo básico de programación con Python, especialmente temas relacionados con la programación orientada a objetos.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Tutoriales/iniciando-con-tkinter-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#conociendo-tkinter"&gt;Conociendo Tkinter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#instalando-tkinter"&gt;Instalando Tkinter&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#en-windows-y-macos"&gt;En Windows y macOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#en-linux"&gt;En Linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#creando-una-aplicacion-tkinter"&gt;Creando una aplicación Tkinter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#explorando-widgets-comunes-de-tkinter"&gt;Explorando widgets comunes de Tkinter&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#botones"&gt;Botones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#campos-de-entrada-de-texto"&gt;Campos de entrada de texto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#listas-desplegables"&gt;Listas desplegables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#botones-radiales"&gt;Botones radiales&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#usando-gestores-de-geometria"&gt;Usando gestores de geometría&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#disposicion-por-empaquetado-con-pack"&gt;Disposición por empaquetado con .pack()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#disposicion-en-cuadricula-con-grid"&gt;Disposición en cuadrícula con .grid()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#disposicion-por-posicion-con-place"&gt;Disposición por posición con .place()&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#creando-ventanas-y-dialogos"&gt;Creando ventanas y diálogos&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#ventanas-principales"&gt;Ventanas principales&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mensajes-de-alerta-y-confirmacion"&gt;Mensajes de alerta y confirmación&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#dialogos-integrados"&gt;Diálogos integrados&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="conociendo-tkinter"&gt;Conociendo Tkinter&lt;/h2&gt;
&lt;p&gt;Tkinter es un paquete que forma parte de la biblioteca estándar de Python y está diseñado para crear interfaces gráficas de usuario (GUI). Provee acceso a las clases y objetos de la biblioteca &lt;a href="https://www.tcl.tk/" target="_blank"&gt;Tcl/Tk&lt;/a&gt; y proporciona una manera rápida y sencilla de crear aplicaciones GUI en Python.&lt;/p&gt;
&lt;p&gt;Tkinter es compatible con Windows, macOS y Linux, lo que te permite desarrollar aplicaciones multiplataforma sin preocuparte por las diferencias entre sistemas operativos.&lt;/p&gt;
&lt;p&gt;Tkinter ofrece una variada gama de widgets y herramientas que puedes usar para crear interfaces de usuario interactivas. Desde botones y etiquetas hasta cuadros de texto y menús. Tkinter tiene todo lo que necesitas para desarrollar aplicaciones de escritorio en Python.&lt;/p&gt;
&lt;p&gt;Sin embargo, a diferencia de otros frameworks y bibliotecas GUI que ofrecen componentes gráficos (widgets) y otras herramientas tales como clases para manipulación de bases de datos, trabajo con redes, y similares, Tkinter se enfoca en los componentes gráficos, la gestión de eventos y el soporte para menús y diálogos.&lt;/p&gt;
&lt;h2 id="instalando-tkinter"&gt;Instalando Tkinter&lt;/h2&gt;
&lt;p&gt;La mayoría de las distribuciones de Python ya incluyen Tkinter por defecto. Por lo tanto, es muy probable que no necesites instalarlo por separado. Sin embargo, si resulta que Tkinter no está disponible en tu sistema, puedes instalarlo de manera rápida.&lt;/p&gt;
&lt;h3 id="en-windows-y-macos"&gt;En Windows y macOS&lt;/h3&gt;
&lt;p&gt;Si instalaste Python empleando el instalador oficial para &lt;a href="/instalar-python-windows/"&gt;Windows&lt;/a&gt; y &lt;a href="/instalar-python-macos/"&gt;macOS&lt;/a&gt;, entonces Tkinter ya estará instalado. Si no está disponible, puedes reinstalar Python asegurándote de que la opción de instalación de Tkinter esté habilitada.&lt;/p&gt;
&lt;p&gt;En macOS, podría ser necesario instalar &lt;em&gt;Xcode&lt;/em&gt; o &lt;em&gt;Xcode Command Line Tools&lt;/em&gt; para que Tkinter funcione correctamente.&lt;/p&gt;
&lt;h3 id="en-linux"&gt;En Linux&lt;/h3&gt;
&lt;p&gt;En sistemas Linux basados en Debian, como Ubuntu, puede que al instalar Python desde los repositorios oficiales de la distribución, Tkinter no venga en el paquete. En estos casos, puedes instalar Tkinter usando el siguiente comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;python3-tk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este comando descargará e instalará Tkinter en tu sistema. Es decir, Tkinter estará disponible en la instalación global de Python.&lt;/p&gt;
&lt;h2 id="creando-una-aplicacion-tkinter"&gt;Creando una aplicación Tkinter&lt;/h2&gt;
&lt;p&gt;Con Tkinter disponible, estás listo para crear tu primera aplicación GUI. Para comenzar, crearás una aplicación &lt;a href="/python-hola-mundo/"&gt;&lt;code&gt;"Hola, mundo!"&lt;/code&gt;&lt;/a&gt;. Aquí están los pasos a seguir:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Importa &lt;code&gt;tkinter&lt;/code&gt; como &lt;code&gt;tk&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Crea una instancia de la clase &lt;code&gt;Tk&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Define la GUI de la aplicación.&lt;/li&gt;
&lt;li&gt;Ejecuta el bucle de eventos de la aplicación con &lt;code&gt;.mainloop()&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Crea un nuevo archivo Python llamado &lt;code&gt;app.py&lt;/code&gt; en tu directorio de trabajo actual y escribe el siguiente código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - app.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En esta línea de código, importas el módulo &lt;code&gt;tkinter&lt;/code&gt; y lo renombras como &lt;code&gt;tk&lt;/code&gt; para facilitar su uso. Con esto, has cumplido con el primer paso.&lt;/p&gt;
&lt;p&gt;Para completar el segundo paso, necesitas crear una instancia de &lt;code&gt;Tk&lt;/code&gt;, la cual usualmente llamarás &lt;code&gt;root&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - app.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En esta línea de código, creas la instancia de &lt;code&gt;Tk&lt;/code&gt;. Esto inicializa la aplicación y prepara el entorno para comenzar a añadir widgets a la GUI de tu aplicación.&lt;/p&gt;
&lt;p&gt;El tercer paso consiste en crear la ventana principal de la aplicación con los elementos gráficos deseados. Para este ejemplo, la GUI se basará en un widget &lt;code&gt;Label&lt;/code&gt; que mostrará el mensaje &lt;code&gt;"Hola, mundo!"&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Así es como puedes crear la GUI de la aplicación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - app.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Tkinter Demo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;280x80&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;hello&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola, mundo!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Arial&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este código, el método &lt;code&gt;.title()&lt;/code&gt; te permite establecer el título de la ventana de tu aplicación. En este ejemplo, la ventana de la aplicación mostrará &lt;code&gt;Tkinter Demo&lt;/code&gt; en su barra de título.&lt;/p&gt;
&lt;p&gt;Puedes usar el método &lt;code&gt;.geometry()&lt;/code&gt; para definir el tamaño de la ventana. El argumento es una cadena que especifica el ancho y alto de la ventana en píxeles.&lt;/p&gt;
&lt;p&gt;Cada aplicación GUI necesita widgets. Estos son los componentes gráficos que conforman la GUI de la aplicación. En este ejemplo, usas un widget &lt;code&gt;Label&lt;/code&gt; llamado &lt;code&gt;hello&lt;/code&gt; que te permitirá mostrar el mensaje &lt;code&gt;"Hola, mundo!"&lt;/code&gt; en la ventana de tu aplicación.&lt;/p&gt;
&lt;p&gt;El método &lt;code&gt;.pack()&lt;/code&gt; es un &lt;a href="/iniciando-con-tkinter-python/#usando-gestores-de-geometria"&gt;gestor de geometría&lt;/a&gt; se utiliza para colocar el widget en la ventana. El argumento &lt;code&gt;pady&lt;/code&gt; agrega un poco de espacio vertical alrededor del widget.&lt;/p&gt;
&lt;p&gt;Has finalizado el tercer paso, así que puedes continuar con el último paso y preparar tu aplicación Tkinter para su ejecución:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - app.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Tkinter Demo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;280x80&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;hello&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola, mundo!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Arial&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En la última línea, inicias el bucle de eventos de la aplicación ejecutando el método &lt;code&gt;.mainloop()&lt;/code&gt;. Eso es todo. Ahora puedes ejecutar tu primera aplicación Tkinter con el siguiente comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;app.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Al ejecutar este comando, verás una ventana que lucirá como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-tkinter-python/tkinter-demo-app.png" class="mx-auto d-block mt-2" alt="Aplicación 'Hola, Mundo!' con Tkinter y Python"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Aplicación 'Hola, Mundo!' con Tkinter y Python&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Tu aplicación muestra una ventana basada en &lt;code&gt;Tk&lt;/code&gt;. La ventana muestra el mensaje &lt;code&gt;"Hola, mundo!"&lt;/code&gt; usando un widget &lt;code&gt;Label&lt;/code&gt;. ¡Y con eso, has escrito tu primera aplicación de escritorio GUI usando Tkinter y Python!&lt;/p&gt;
&lt;h2 id="explorando-widgets-comunes-de-tkinter"&gt;Explorando widgets comunes de Tkinter&lt;/h2&gt;
&lt;p&gt;Los &lt;strong&gt;widgets&lt;/strong&gt; son componentes gráficos rectangulares que colocas en las ventanas de tus aplicación para construir su GUI. Los widgets tienen atributos y métodos que te permiten ajustar su apariencia y comportamiento.&lt;/p&gt;
&lt;p&gt;Tkinter tiene una variada colección de widgets, cada uno de los cuales tiene un propósito diferente. Algunos de los widgets más comunes incluyen botones, etiquetas o labels, campos de entrada de texto, listas desplegables, y botones radiales.&lt;/p&gt;
&lt;h3 id="botones"&gt;Botones&lt;/h3&gt;
&lt;p&gt;Puedes crear un botón con la clase &lt;code&gt;Button&lt;/code&gt;, la cual proporciona un botón de comando clásico. Algunos botones típicos son &lt;em&gt;Ok&lt;/em&gt;, &lt;em&gt;Cancelar&lt;/em&gt;, &lt;em&gt;Aplicar&lt;/em&gt;, &lt;em&gt;Sí&lt;/em&gt;, &lt;em&gt;No&lt;/em&gt;, &lt;em&gt;Cerrar&lt;/em&gt;, similares.&lt;/p&gt;
&lt;p&gt;Crea un archivo llamado &lt;code&gt;buttons.py&lt;/code&gt; y pon el siguiente código en él:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - buttons.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Botones Tkinter&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;190x240&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;buttons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Ok&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cancelar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Aplicar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Sí&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;No&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cerrar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;buttons&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padx&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="n"&gt;pady&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="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas botones en un bucle &lt;code&gt;for&lt;/code&gt; que itera sobre una lista de nombres de botones comunes y crea un botón con cada uno de los nombres definidos. Así es como se verá tu aplicación al ejecutarla desde tu terminal:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-tkinter-python/tkinter-botones.png" class="mx-auto d-block mt-2" alt="Botones en Tkinter"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Botones en Tkinter&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Botones como estos son quizás los widgets más utilizados en cualquier GUI. Cuando alguien hace clic en ellos, tu aplicación ordena a la computadora realizar acciones. Así es como puedes ejecutar cálculos cuando un usuario hace clic en un botón.&lt;/p&gt;
&lt;h3 id="campos-de-entrada-de-texto"&gt;Campos de entrada de texto&lt;/h3&gt;
&lt;p&gt;Los &lt;strong&gt;campos de entrada de texto&lt;/strong&gt; son widgets comunes también. Estos widgets te permiten ingresar una sola línea de texto y puedes crearlos con la clase &lt;code&gt;Entry&lt;/code&gt; de Tkinter. Los campos de entrada de texto son útiles cuando necesitas obtener información del usuario en forma de texto.&lt;/p&gt;
&lt;p&gt;Como ejemplo, crea un archivo &lt;code&gt;entries.py&lt;/code&gt; y escribe el siguiente código en él:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - entries.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Campos de texto Tkinter&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;250x120&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Nombre&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Usuario&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Contraseña&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;foreground&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lightgrey&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&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;field&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;padx&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="n"&gt;pady&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="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En el bucle de este ejemplo, creas tres campos de entrada de texto para permitir que el usuario introduzca su nombre, usuario y contraseña.&lt;/p&gt;
&lt;p&gt;La captura a continuación muestra cómo debe lucir tu aplicación:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-tkinter-python/tkinter-campos-de-texto.png" class="mx-auto d-block mt-2" alt="Campos de entrada de texto en Tkinter"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Campos de entrada de texto en Tkinter&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Campos de entrada de texto como estos proporcionan funcionalidades estándar como copiar, pegar y cortar. En la imagen, puedes notar que los campos muestran texto de marcador de posición (placeholder) para informar al usuario qué tipo de información debe introducir.&lt;/p&gt;
&lt;p&gt;La clase &lt;code&gt;Entry&lt;/code&gt; de Tkinter no tiene la opción de mostrar un texto de marcador de posición, por lo tanto, en este ejemplo lo que hiciste fue cambiar el color del texto para que sea gris claro y así simular un texto de marcador de posición.&lt;/p&gt;
&lt;h3 id="listas-desplegables"&gt;Listas desplegables&lt;/h3&gt;
&lt;p&gt;Las &lt;strong&gt;listas desplegables&lt;/strong&gt; son otro tipo fundamental de widget en aplicaciones GUI. Puedes crearlas usando la clase &lt;code&gt;Combobox&lt;/code&gt; del módulo &lt;code&gt;ttk&lt;/code&gt;, el cual contiene una serie mejorada de widgets para Tkinter. Una lista desplegable presenta al usuario una serie de opciones de una manera que ocupa un espacio mínimo en la pantalla.&lt;/p&gt;
&lt;p&gt;A continuación, un ejemplo de cómo emplear una lista desplegable en Tkinter:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - combo_boxes.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ttk&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Lista desplegable Tkinter&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;250x100&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Tkinter&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;PyQt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;PySide&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Kivy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;wxPython&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;selected_option&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StringVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;selected_option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&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;combobox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ttk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combobox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;textvariable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;selected_option&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;readonly&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;combobox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas &lt;code&gt;combobox&lt;/code&gt; como una instancia de &lt;code&gt;Combobox&lt;/code&gt;. Esta instancia contendrá una lista desplegable con una serie de nombres de bibliotecas Python para desarrollo de aplicaciones GUI. Cuando ejecutas esta aplicación desde tu línea de comandos, obtienes una ventana como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-tkinter-python/tkinter-lista-desplegable.png" class="mx-auto d-block mt-2" alt="Lista desplegable en Tkinter"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Lista desplegable en Tkinter&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Al hacer clic sobre esta lista desplegable, los usuarios pueden seleccionar una de las opciones desplegadas.&lt;/p&gt;
&lt;h3 id="botones-radiales"&gt;Botones radiales&lt;/h3&gt;
&lt;p&gt;El último widget que estudiarás es el &lt;strong&gt;botón radial&lt;/strong&gt;, que puedes crear con la clase &lt;code&gt;Radiobutton&lt;/code&gt;. Se trata de un botón circular de opción que puedes seleccionar al hacer clic sobre él. Los botones radiales son útiles cuando necesitas que el usuario seleccione una entre varias opciones.&lt;/p&gt;
&lt;p&gt;Todas las opciones en un grupo de botones radiales son visibles al mismo tiempo, pero el usuario solo puede seleccionar una de ellas. Es decir, la selección es excluyente.&lt;/p&gt;
&lt;p&gt;Considera el siguiente ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - radio_buttons.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Botones radiales Tkinter&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;230x150&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;¿Qué prefieres?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&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="n"&gt;foods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Pizza&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Hamburguesa&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Pasta&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Pollo asado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;selected_food&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StringVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;foods&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;food&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;foods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;radio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Radiobutton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;variable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;selected_food&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;radio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;w&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padx&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="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas una aplicación que muestra un texto descriptivo, &lt;code&gt;"¿Qué prefieres?"&lt;/code&gt;, seguido de una serie de botones radiales, que representan alternativas entre las que el usuario puede elegir. En este caso, las alternativas son &lt;code&gt;"Pizza"&lt;/code&gt;, &lt;code&gt;"Hamburguesa"&lt;/code&gt;, &lt;code&gt;"Pasta"&lt;/code&gt; y &lt;code&gt;"Pollo asado"&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Para crear los botones, empleas un ciclo &lt;code&gt;for&lt;/code&gt; que itera sobre la lista de comidas. Por defecto, el primer botón (&lt;code&gt;foods[0]&lt;/code&gt;) de la lista estará seleccionado.&lt;/p&gt;
&lt;p&gt;Al hacer clic en uno de los botones, este se activa y los demás se desactivan automáticamente. Este comportamiento los hace ideales para preguntas de selección única, como preferencias o respuestas a encuestas:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-tkinter-python/tkinter-botones-radiales.png" class="mx-auto d-block mt-2" alt="Botones radiales en Tkinter"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Botones radiales en Tkinter&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;En este grupo de botones radiales, solo un botón puede estar seleccionado a la vez. Si seleccionas otro botón del grupo, entonces el botón previamente seleccionado se deseleccionará automáticamente.&lt;/p&gt;
&lt;p&gt;Tkinter ofrece una colección aceptable de widgets. Aquí, has estudiado solo una pequeña muestra, suficiente para mostrarte el poder y la flexibilidad de este framework GUI.&lt;/p&gt;
&lt;p&gt;En la siguiente sección, aprenderás cómo organizar diferentes widgets para construir GUIs modernas y completamente funcionales para tus aplicaciones.&lt;/p&gt;
&lt;h2 id="usando-gestores-de-geometria"&gt;Usando gestores de geometría&lt;/h2&gt;
&lt;p&gt;Para construir aplicaciones GUI, necesitas saber cómo organizar un conjunto de widgets para que tu GUI sea intuitiva y funcional. En Tkinter, las herramientas para este fin son los llamados &lt;strong&gt;gestores de geometría&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Se trata de métodos que te permiten dimensionar y posicionar tus widgets en la ventana o formulario de la aplicación. Permiten además que tus widgets se adapten automáticamente a eventos de cambio de tamaño de ventana y otros cambios en la GUI.&lt;/p&gt;
&lt;p&gt;Tkinter proporciona tres métodos para gestionar la geometría de una GUI determinada:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.pack()&lt;/code&gt;&lt;/strong&gt;: Organiza widgets en bloques de forma sencilla, colocándolos automáticamente en la ventana según el orden especificado (arriba, abajo, izquierda o derecha).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.grid()&lt;/code&gt;&lt;/strong&gt;: Posiciona los widgets en una cuadrícula definida por filas y columnas, proporcionando más control sobre su posición relativa.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.place()&lt;/code&gt;&lt;/strong&gt;: Ubica widgets en posiciones absolutas o relativas especificadas por coordenadas exactas &lt;code&gt;(x, y)&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En las secciones siguientes, aprenderás lo básico sobre cómo emplear estos métodos y crear GUIs ordenadas y funcionales.&lt;/p&gt;
&lt;h3 id="disposicion-por-empaquetado-con-pack"&gt;Disposición por empaquetado con &lt;code&gt;.pack()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;El método &lt;code&gt;.pack()&lt;/code&gt; organiza los widgets en bloques antes o después de los widgets ya empaquetados. Puedes especificar las opciones &lt;code&gt;side&lt;/code&gt;, &lt;code&gt;fill&lt;/code&gt; y &lt;code&gt;expand&lt;/code&gt; para controlar cómo se comportan los widgets empaquetados.&lt;/p&gt;
&lt;p&gt;A continuación se muestra un ejemplo de uso de &lt;code&gt;.pack()&lt;/code&gt; para gestionar la geometría de una GUI ordenada verticalmente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - pack_vertical.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Disposición vertical&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;290x130&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;buttons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Arriba&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Centro&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Abajo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;buttons&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padx&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="n"&gt;pady&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="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, el método &lt;code&gt;.pack()&lt;/code&gt; coloca los botones uno debajo del otro en la ventana de la aplicación, rellenando horizontalmente el espacio disponible con el argumento &lt;code&gt;fill&lt;/code&gt; y añadiendo algo de espacio a ambos lados con &lt;code&gt;padx&lt;/code&gt; y &lt;code&gt;pady&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-tkinter-python/tkinter-gestor-de-geometria-pack-vertical.png" class="mx-auto d-block mt-2" alt="Disposición vertical por empaquetado con .pack() en Tkinter"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Disposición vertical por empaquetado con &lt;code&gt;.pack()&lt;/code&gt; en Tkinter&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Nota como el orden de los botones en la GUI coincide con el orden de aparición de los botones en el código.&lt;/p&gt;
&lt;p&gt;También puedes emplear &lt;code&gt;.pack()&lt;/code&gt; para disponer los widgets horizontalmente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - pack_horizontal.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Disposición horizontal&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;290x80&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;buttons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Izquierda&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Centro&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Derecha&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;buttons&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;side&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;left&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padx&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="n"&gt;pady&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="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, asignas &lt;code&gt;"left"&lt;/code&gt; al argumento &lt;code&gt;side&lt;/code&gt; del método &lt;code&gt;.pack()&lt;/code&gt; para alinear los botones horizontalmente y la ventana de tu aplicación lucirá como se muestra a continuación:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-tkinter-python/tkinter-gestor-de-geometria-pack-horizontal.png" class="mx-auto d-block mt-2" alt="Disposición horizontal por empaquetado con .pack() en Tkinter"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Disposición horizontal por empaquetado con &lt;code&gt;.pack()&lt;/code&gt; en Tkinter&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Con el argumento &lt;code&gt;side&lt;/code&gt; de &lt;code&gt;.pack()&lt;/code&gt;, puedes lograr una configuración horizontal de los widgets en la GUI de tu aplicación.&lt;/p&gt;
&lt;h3 id="disposicion-en-cuadricula-con-grid"&gt;Disposición en cuadrícula con &lt;code&gt;.grid()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;El método &lt;code&gt;.grid()&lt;/code&gt; es otro gestor de geometría en Tkinter. Con él, puedes organizar los widgets en una cuadrícula de filas y columnas. Puedes especificar la fila y la columna para cada widget usando índices, lo que te permite controlar su posición exacta en la ventana.&lt;/p&gt;
&lt;p&gt;A continuación se muestra un ejemplo de uso de &lt;code&gt;.grid()&lt;/code&gt; para posicionar un grupo de botones:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - grid_layout.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Disposición en cuadrícula&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;positions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Botón (0, 0)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Botón (0, 1)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Botón (1, 0)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Botón (1, 1)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;i&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="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;i&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="n"&gt;padx&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="n"&gt;pady&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="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Botón (2, 0) + 2 Columnas de Amplitud&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&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="n"&gt;column&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;columnspan&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="n"&gt;padx&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="n"&gt;pady&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="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, los botones se colocan en una cuadrícula de 2x2, lo que permite un control preciso sobre la disposición de los widgets:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-tkinter-python/tkinter-gestor-de-geometria-grid.png" class="mx-auto d-block mt-2" alt="Disposición en cuadrícula con .grid() en Tkinter"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Disposición en cuadrícula con &lt;code&gt;.grid()&lt;/code&gt; en Tkinter&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Los primeros cuatro botones ocupan una sola celda en la cuadrícula. La celda está definida por coordenadas enteras en la forma &lt;code&gt;(fila, columna)&lt;/code&gt;. El último botón ocupa dos celdas en la cuadricula. Para lograr esto, empleas el argumento &lt;code&gt;columnspan&lt;/code&gt; con un valor de &lt;code&gt;2&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="disposicion-por-posicion-con-place"&gt;Disposición por posición con &lt;code&gt;.place()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;El método &lt;code&gt;.place()&lt;/code&gt; te permite organizar los widgets en posiciones absolutas y relativas dentro de la ventana. Puedes especificar las coordenadas &lt;code&gt;x&lt;/code&gt; e &lt;code&gt;y&lt;/code&gt; para cada widget, lo que te permite un control preciso sobre su ubicación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - place_layout.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Disposición por posición&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;300x200&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x=0, y=0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;place&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&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;y&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;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x=50, y=50&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;place&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x=100, y=100&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;place&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x=150, y=150&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;place&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, los botones se colocan en posiciones absolutas dentro de la ventana, lo que permite un control preciso sobre su disposición:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-tkinter-python/tkinter-gestor-de-geometria-place.png" class="mx-auto d-block mt-2" alt="Disposición por posición con .place() en Tkinter"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Disposición por posición con &lt;code&gt;.place()&lt;/code&gt; en Tkinter&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Para definir la posición correcta de cada botón, debes saber que el origen de coordenadas es la esquina superior izquierda de la ventana.&lt;/p&gt;
&lt;p&gt;Las posiciones absolutas puede ser problemáticas para la adaptabilidad de la GUI, especialmente si el usuario cambia el tamaño de la ventana o si la aplicación se ejecuta en diferentes resoluciones de pantalla. El método &lt;code&gt;.place()&lt;/code&gt; te ayuda con estos problemas, permitiéndote especificar posiciones relativas con los parámetros &lt;code&gt;relx&lt;/code&gt;, &lt;code&gt;rely&lt;/code&gt;, &lt;code&gt;relwidth&lt;/code&gt; y &lt;code&gt;relheight&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="creando-ventanas-y-dialogos"&gt;Creando ventanas y diálogos&lt;/h2&gt;
&lt;p&gt;Las aplicaciones de escritorio GUI en Tkinter generalmente están conformadas por dos tipos de ventanas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ventana principal:&lt;/strong&gt; La ventana en la que se desarrolla la mayor parte de la interacción del usuario.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diálogos:&lt;/strong&gt; Ventanas auxiliares de la aplicación que solicitan o muestran información al usuario.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En las secciones siguientes, aprenderás sobre ambos tipos de ventanas y cómo crearlas en Tkinter de manera que puedas construir aplicaciones funcionales y atractivas.&lt;/p&gt;
&lt;h3 id="ventanas-principales"&gt;Ventanas principales&lt;/h3&gt;
&lt;p&gt;La mayoría de tus aplicaciones tendrán una ventana que puede incluir elementos como menús, botones y cuadros de texto. Para crear este tipo de ventana en Tkinter, utilizarás una instancia de la clase &lt;code&gt;Tk&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La siguiente aplicación muestra cómo crear una ventana principal con un menú:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - main_window.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Ventana Principal Tkinter&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;250x80&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;menubar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Menu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;menu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;menubar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;file_menu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Menu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;menubar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tearoff&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;file_menu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Salir&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;menubar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_cascade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Menú&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;menu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;file_menu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Soy el Widget Central&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas un menú con una opción para salir de la aplicación. Un &lt;code&gt;Label&lt;/code&gt; actúa como el widget central de la ventana. Cuando ejecutas esta aplicación, obtendrás una ventana que luce como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-tkinter-python/tkinter-ventana-principal.png" class="mx-auto d-block mt-2" alt="Ventana principal en Tkinter"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Ventana principal en Tkinter&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;La ventana de tu aplicación tiene un menú principal que, en macOS, se visualiza en la barra superior del escritorio. En otros sistemas operativos, el menú principal se muestra inmediatamente debajo de la barra de título de la ventana.&lt;/p&gt;
&lt;p&gt;Has aprendido a construir una aplicación con ventana principal usando Python y Tkinter. Lo siguiente es aprender un poco sobre cómo crear diálogos.&lt;/p&gt;
&lt;h3 id="mensajes-de-alerta-y-confirmacion"&gt;Mensajes de alerta y confirmación&lt;/h3&gt;
&lt;p&gt;Tkinter también proporciona una forma rápida de crear &lt;strong&gt;cuadros de mensaje&lt;/strong&gt; para el usuario. Para esto, puedes emplear el modulo &lt;code&gt;messagebox&lt;/code&gt;, el cual contiene funciones para construir diferentes tipos de diálogos de alerta y confirmación:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Función&lt;/th&gt;
&lt;th&gt;Descripción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;showinfo()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Información con un botón &lt;em&gt;Ok&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;showwarning()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Alerta con un botón &lt;em&gt;Ok&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;showerror()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Error con un botón &lt;em&gt;Ok&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;askokcancel()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Confirmación con botones &lt;em&gt;Ok&lt;/em&gt; y &lt;em&gt;Cancel&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;askyesno()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Confirmación con botones &lt;em&gt;Yes&lt;/em&gt; y &lt;em&gt;No&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;askretrycancel()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Confirmación con botones &lt;em&gt;Retry&lt;/em&gt; y &lt;em&gt;Cancel&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;askquestion()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pregunta con botones &lt;em&gt;Yes&lt;/em&gt; y &lt;em&gt;No&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;askyesnocancel()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pregunta con botones &lt;em&gt;Yes&lt;/em&gt;, &lt;em&gt;No&lt;/em&gt; y &lt;em&gt;Cancel&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Un ejemplo común es el cuadro de diálogo de mensaje, que puedes crear usando &lt;code&gt;messagebox.showinfo()&lt;/code&gt;. El siguiente código crea una aplicación con un botón que muestra un mensaje de información al usuario:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - message_boxes.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;messagebox&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Diálogo Tkinter&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;300x200&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;show_message&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;messagebox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;showinfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Información&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Este es un mensaje informativo.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Mostrar Mensaje&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;show_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, cuando haces clic en el botón &lt;em&gt;Mostrar Mensaje&lt;/em&gt; aparece un cuadro de diálogo informativo con un mensaje para el usuario.&lt;/p&gt;
&lt;h3 id="dialogos-integrados"&gt;Diálogos integrados&lt;/h3&gt;
&lt;p&gt;También es común que tus aplicaciones tengan diálogos para realizar acciones secundarias que dependen de la entrada del usuario. Tkinter también ofrece diálogos integrados para abrir y guardar archivos, seleccionar colores, entre otros.&lt;/p&gt;
&lt;p&gt;A continuación un resumen de los diálogos más usados:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;filedialog.askopenfilename()&lt;/code&gt;&lt;/strong&gt;: Diálogo que permite al usuario seleccionar un archivo para abrir. Retorna la ruta completa del archivo seleccionado como una cadena.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;filedialog.asksaveasfilename()&lt;/code&gt;&lt;/strong&gt;: Diálogo para que el usuario seleccione la ubicación y nombre de un archivo para guardar. Retorna la ruta completa del archivo elegido como una cadena.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;filedialog.askdirectory()&lt;/code&gt;&lt;/strong&gt;: Diálogo para seleccionar una carpeta. Devuelve la ruta completa de la carpeta seleccionada.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;colorchooser.askcolor()&lt;/code&gt;&lt;/strong&gt;: Selector de colores que permite al usuario elegir un color. Retorna una tupla con el valor RGB del color seleccionado y su representación hexadecimal.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El siguiente ejemplo muestra cómo usar un diálogo estándar para selecionar un archivo en tu sistema:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - file_dialog.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;filedialog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;messagebox&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Diálogo de Archivo Tkinter&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;300x200&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;open_file&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;file_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filedialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;askopenfilename&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;messagebox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;showinfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;Archivo Seleccionado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Seleccionaste: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Abrir Archivo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;open_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, un botón abre un cuadro de diálogo para seleccionar un archivo. Si se selecciona un archivo, se muestra un cuadro de mensaje con la ruta del archivo elegido.&lt;/p&gt;
&lt;p&gt;Es importante que sepas que la función &lt;code&gt;.askopenfilename()&lt;/code&gt; no abre el archivo, solo devuelve la ruta del archivo seleccionado. Para manipular el archivo, debes abrirlo explícitamente con Python, usando la función integrada &lt;code&gt;open()&lt;/code&gt; u otra herramienta similar.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Las aplicaciones con &lt;strong&gt;interfaz gráfica de usuario (GUI)&lt;/strong&gt; constituyen una parte sustancial del desarrollo de software. Python ofrece varios frameworks y bibliotecas que pueden ayudarte a desarrollar aplicaciones GUI modernas y robustas.&lt;/p&gt;
&lt;p&gt;En este tutorial, aprendiste cómo usar &lt;strong&gt;Tkinter&lt;/strong&gt;, que es una de las bibliotecas más accesibles para el desarrollo de aplicaciones GUI en Python.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En este tutorial, has aprendido a:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instalar&lt;/strong&gt; Tkinter y configurarlo en tu computadora&lt;/li&gt;
&lt;li&gt;Desarrollar aplicaciones con &lt;strong&gt;GUI&lt;/strong&gt; basadas en Tkinter&lt;/li&gt;
&lt;li&gt;Organizar una GUI usando &lt;strong&gt;gestores de geometría&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Crear &lt;strong&gt;ventanas principales&lt;/strong&gt; y &lt;strong&gt;diálogos&lt;/strong&gt; en tus aplicaciones Tkinter&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ahora puedes usar tus conocimientos de Python y Tkinter para dar vida a tus propias aplicaciones GUI de escritorio.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Tutoriales/iniciando-con-tkinter-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Tutoriales"/><category term="gui"/><category term="tkinter"/></entry><entry><title>Iniciando con PyQt para desarrollo GUI</title><link href="https://pythonscouts.com/iniciando-con-pyqt-python/" rel="alternate"/><published>2024-12-31T06:00:00+01:00</published><updated>2024-12-31T06:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2024-12-31:/iniciando-con-pyqt-python/</id><summary type="html">&lt;p&gt;En Python, PyQt es una biblioteca que proporciona un enlace con Qt, que es un framework de desarrollo de aplicaciones de interfaz gráfica de usuario (GUI).&lt;/p&gt;</summary><content type="html">&lt;p&gt;Para desarrollar este tipo de aplicaciones en Python, puedes emplear una amplia variedad de bibliotecas y frameworks, incluyendo &lt;a href="https://docs.python.org/3/library/tkinter.html" target="_blank"&gt;Tkinter&lt;/a&gt;, &lt;a href="https://realpython.com/python-gui-with-wxpython/" target="_blank"&gt;wxPython&lt;/a&gt;, &lt;a href="https://www.riverbankcomputing.com/software/pyqt/intro" target="_blank"&gt;PyQt&lt;/a&gt;, &lt;a href="https://wiki.qt.io/Qt_for_Python" target="_blank"&gt;PySide6&lt;/a&gt;, entre otras. Sin embargo, PyQt es una de las bibliotecas más populares y sólidas disponibles.&lt;/p&gt;
&lt;p&gt;En este tutorial, aprenderás los conceptos básicos para construir aplicaciones GUI usando Python y PyQt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En este tutorial, aprenderás cómo:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instalar&lt;/strong&gt; PyQt y configurarlo en tu computadora&lt;/li&gt;
&lt;li&gt;Crear aplicaciones con &lt;strong&gt;interfaces gráficas de usuario&lt;/strong&gt; basadas en PyQt&lt;/li&gt;
&lt;li&gt;Organizar una GUI usando &lt;strong&gt;gestores de disposición&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Crear &lt;strong&gt;ventanas principales&lt;/strong&gt; y &lt;strong&gt;diálogos&lt;/strong&gt; en tus aplicaciones PyQt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para obtener el máximo de este tutorial, debes conocer lo básico de programación con Python, especialmente temas relacionados con la programación orientada a objetos.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Tutoriales/iniciando-con-pyqt-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#conociendo-pyqt"&gt;Conociendo PyQt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#instalando-pyqt"&gt;Instalando PyQt&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#en-windows"&gt;En Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#en-linux-y-macos"&gt;En Linux y macOS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#creando-una-aplicacion-pyqt"&gt;Creando una aplicación PyQt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#explorando-widgets-comunes-de-pyqt"&gt;Explorando widgets comunes de PyQt&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#botones"&gt;Botones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#campos-de-entrada-de-texto"&gt;Campos de entrada de texto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#listas-desplegables"&gt;Listas desplegables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#botones-radiales"&gt;Botones radiales&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#usando-gestores-de-disposicion"&gt;Usando gestores de disposición&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#disposicion-horizontal"&gt;Disposición horizontal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#disposicion-vertical"&gt;Disposición vertical&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#disposicion-en-cuadricula"&gt;Disposición en cuadrícula&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#disposicion-de-formulario"&gt;Disposición de formulario&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#creando-ventanas-y-dialogos"&gt;Creando ventanas y diálogos&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#ventanas-principales"&gt;Ventanas principales&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#dialogos-y-formularios"&gt;Diálogos y formularios&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#mensajes-y-dialogos-estandar"&gt;Mensajes y diálogos estándar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusión&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="conociendo-pyqt"&gt;Conociendo PyQt&lt;/h2&gt;
&lt;p&gt;PyQt es una biblioteca que proporciona un enlace entre Python y &lt;a href="https://wiki.qt.io/About_Qt" target="_blank"&gt;Qt&lt;/a&gt;, el cual es un framework de desarrollo en &lt;a href="https://realpython.com/python-vs-cpp/" target="_blank"&gt;C++&lt;/a&gt; para crear interfaces gráficas de usuario (GUIs). Proporciona &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/sip-classes.html" target="_blank"&gt;clases&lt;/a&gt; y herramientas para la creación de GUIs, manejo de &lt;a href="https://realpython.com/python-xml-parser/" target="_blank"&gt;XML&lt;/a&gt;, comunicación de red, expresiones regulares, hilos, bases de datos SQL, navegación web y otras tecnologías disponibles en Qt.&lt;/p&gt;
&lt;p&gt;PyQt es compatible con Windows, Unix, Linux, macOS, iOS y Android, por lo que puedes emplearla para desarrollar aplicaciones multiplataforma que tengan una apariencia nativa en cada plataforma.&lt;/p&gt;
&lt;p&gt;Si deseas usar PyQt para crear aplicaciones comerciales, entonces necesitas una licencia comercial. También puedes emplear PyQt para proyectos de código abierto, en cuyo caso la licencia de tu proyecto debe ser compatible con la licencia de Qt que estés empleando.&lt;/p&gt;
&lt;h2 id="instalando-pyqt"&gt;Instalando PyQt&lt;/h2&gt;
&lt;p&gt;Para instalar PyQt en tu computadora, la opción recomendada es instalar desde el índice de paquetes de Python, &lt;a href="https://realpython.com/pypi-publish-python-package/" target="_blank"&gt;PyPI&lt;/a&gt;, usando el comando &lt;code&gt;pip&lt;/code&gt;. Para esto, puedes crear un &lt;a href="https://docs.python.org/es/3.13/glossary.html#term-virtual-environment" target="_blank"&gt;entorno virtual de Python&lt;/a&gt; y luego instalar el paquete &lt;code&gt;pyqt6&lt;/code&gt;, ejecuta lo siguiente en tu línea de comandos, dependiendo de tu sistema operativo.&lt;/p&gt;
&lt;h3 id="en-windows"&gt;En Windows&lt;/h3&gt;
&lt;p&gt;En Windows, puedes instalar PyQt ejecutando los comandos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Powershell&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;-m&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt;
&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Scripts&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bat&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;-m&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;pyqt6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Con estos comandos, primero creas y activas un entorno virtual Python y luego instalas PyQt dese PyPI.&lt;/p&gt;
&lt;h3 id="en-linux-y-macos"&gt;En Linux y macOS&lt;/h3&gt;
&lt;p&gt;En Linux y macOS el proceso es el mismo y puedes realizarlo con los siguientes comandos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;venv&lt;span class="w"&gt; &lt;/span&gt;venv
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;venv/bin/activate
&lt;span class="gp gp-VirtualEnv"&gt;(venv)&lt;/span&gt; &lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;pyqt6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nuevamente, primero creas un entorno virtual usando el módulo &lt;code&gt;venv&lt;/code&gt; de la biblioteca estándar de Python. Luego lo activas, y finalmente instalas PyQt.&lt;/p&gt;
&lt;h2 id="creando-una-aplicacion-pyqt"&gt;Creando una aplicación PyQt&lt;/h2&gt;
&lt;p&gt;Con PyQt instalado, estás listo para crear tu primera aplicación GUI. Para comenzar, crearás una aplicación de &lt;code&gt;Hola, Mundo!&lt;/code&gt;. Aquí están los pasos a seguir:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Importa &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qapplication.html" target="_blank"&gt;&lt;code&gt;QApplication&lt;/code&gt;&lt;/a&gt; y todos los widgets necesarios desde &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qtwidgets-module.html" target="_blank"&gt;&lt;code&gt;PyQt6.QtWidgets&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Crea una instancia de &lt;code&gt;QApplication&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Define la GUI de la aplicación.&lt;/li&gt;
&lt;li&gt;Muestra la GUI de la aplicación.&lt;/li&gt;
&lt;li&gt;Ejecuta el &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtcore/qcoreapplication.html?highlight=main%20loop#the-event-loop-and-event-handling" target="_blank"&gt;bucle de eventos&lt;/a&gt; de la aplicación.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Crea un nuevo archivo Python llamado &lt;code&gt;app.py&lt;/code&gt; en tu directorio de trabajo actual:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - app.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PyQt6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En esta línea de código, importas &lt;code&gt;QApplication&lt;/code&gt;, &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qlabel.html" target="_blank"&gt;&lt;code&gt;QLabel&lt;/code&gt;&lt;/a&gt;, y &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qwidget.html" target="_blank"&gt;&lt;code&gt;QWidget&lt;/code&gt;&lt;/a&gt; desde &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qtwidgets-module.html" target="_blank"&gt;&lt;code&gt;QtWidgets&lt;/code&gt;&lt;/a&gt;. Con esto, has cumplido con el primer paso.&lt;/p&gt;
&lt;p&gt;Para completar el segundo paso, necesitas crear una instancia de &lt;code&gt;QApplication&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - app.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PyQt6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En esta línea de código, creas la instancia de &lt;code&gt;QApplication&lt;/code&gt;. Es necesario crear esta instancia antes de crear cualquier objeto GUI en PyQt.&lt;/p&gt;
&lt;p&gt;El tercer paso consiste en crear la GUI o ventana principal de la aplicación. Para este ejemplo, la GUI se basará en la clase &lt;code&gt;QWidget&lt;/code&gt;, que es la clase base de todos los objetos de interfaz de usuario en PyQt.&lt;/p&gt;
&lt;p&gt;Así es como puedes crear la GUI de la app:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - app.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PyQt6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;PyQt Demo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;hello&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;h1&amp;gt;Hola, Mundo!&amp;lt;/h1&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este código, &lt;code&gt;window&lt;/code&gt; es una instancia de &lt;code&gt;QWidget&lt;/code&gt;, la cual proporciona todas las características que necesitarás para crear la ventana de la aplicación.&lt;/p&gt;
&lt;p&gt;Como su nombre sugiere, el método &lt;code&gt;.setWindowTitle()&lt;/code&gt; te permite establecer el título de la ventana en tu aplicación. En este ejemplo, la ventana de la app mostrará &lt;code&gt;PyQt Demo&lt;/code&gt; en su barra de título.&lt;/p&gt;
&lt;p&gt;Puedes usar &lt;code&gt;.setGeometry()&lt;/code&gt; para definir el tamaño de la ventana y la posición en la pantalla. Los dos primeros argumentos son las coordenadas de pantalla &lt;code&gt;x&lt;/code&gt; y &lt;code&gt;y&lt;/code&gt; donde se colocará la ventana. El tercer y cuarto argumentos son el ancho y alto de la ventana.&lt;/p&gt;
&lt;p&gt;Cada aplicación GUI necesita &lt;strong&gt;widgets&lt;/strong&gt;. Estos son los componentes gráficos que conforman la GUI de la app. En este ejemplo, usas un widget &lt;code&gt;QLabel&lt;/code&gt; llamado&lt;code&gt;hello&lt;/code&gt; que te permitirá mostrar el mensaje &lt;code&gt;Hola, Mundo!&lt;/code&gt; en la ventana de tu aplicación.&lt;/p&gt;
&lt;p&gt;Los objetos &lt;code&gt;QLabel&lt;/code&gt; pueden mostrar texto formateado en HTML, por lo que puedes usar el elemento &lt;a href="https://es.wikipedia.org/wiki/HTML" target="_blank"&gt;HTML&lt;/a&gt; &lt;code&gt;"&amp;lt;h1&amp;gt;Hola, Mundo!&amp;lt;/h1&amp;gt;"&lt;/code&gt; para proporcionar el texto deseado como un encabezado &lt;code&gt;h1&lt;/code&gt;. Finalmente, usas el método &lt;code&gt;.move()&lt;/code&gt; para colocar el mensaje en las coordenadas &lt;code&gt;(60, 15)&lt;/code&gt; en la ventana de la aplicación.&lt;/p&gt;
&lt;p&gt;Has finalizado el tercer paso, así que puedes continuar con los dos últimos pasos y preparar tu aplicación GUI PyQt para ejecutarse:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - app.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PyQt6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;PyQt Demo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;hello&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;h1&amp;gt;Hola, Mundo!&amp;lt;/h1&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En las dos últimas líneas, llamas el método &lt;code&gt;.show()&lt;/code&gt; en &lt;code&gt;window&lt;/code&gt; para mostrar la ventana en la pantalla. Luego, inicias el bucle de eventos de la aplicación ejecutando &lt;code&gt;.exec()&lt;/code&gt; y ya está.&lt;/p&gt;
&lt;p&gt;Puedes ejecutar tu primera aplicación PyQt con el siguiente comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;app.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Al ejecutar este comando, verás una ventana que lucirá como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyqt-python/pyqt-demo-app.png" class="mx-auto d-block mt-2" alt="Aplicación 'Hola, Mundo!' con PyQt y Python"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Aplicación "Hola, Mundo!" con PyQt y Python&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Tu aplicación muestra una ventana basada en &lt;code&gt;QWidget&lt;/code&gt;. La ventana muestra el mensaje &lt;code&gt;Hola, Mundo!&lt;/code&gt; usando un widget &lt;code&gt;QLabel&lt;/code&gt;. ¡Y con eso, has escrito tu primera aplicación de escritorio GUI usando PyQt y Python!&lt;/p&gt;
&lt;h2 id="explorando-widgets-comunes-de-pyqt"&gt;Explorando widgets comunes de PyQt&lt;/h2&gt;
&lt;p&gt;Los &lt;strong&gt;widgets&lt;/strong&gt; son componentes gráficos rectangulares que colocas en las ventanas de tu aplicación para construir la GUI. Los widgets tienen atributos y métodos que te permiten ajustar su apariencia y comportamiento.&lt;/p&gt;
&lt;p&gt;Los widgets también detectan clics del mouse, pulsaciones de teclas y otros eventos del usuario, el sistema de ventanas y otras fuentes. Cada vez que un widget captura un evento, emite una señal para anunciar su cambio de estado.&lt;/p&gt;
&lt;p&gt;PyQt tiene una colección variada de widgets, cada uno de los cuales tiene un propósito diferente. Algunos de los widgets más comunes incluyen botones, etiquetas o labels, campos de entrada de texto, listas desplegables, y botones radiales.&lt;/p&gt;
&lt;h3 id="botones"&gt;Botones&lt;/h3&gt;
&lt;p&gt;Puedes crear un botón con la clase &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qpushbutton.html" target="_blank"&gt;&lt;code&gt;QPushButton&lt;/code&gt;&lt;/a&gt;, la cual proporciona un botón de comando clásico. Algunos botones típicos son &lt;em&gt;Ok&lt;/em&gt;, &lt;em&gt;Cancelar&lt;/em&gt;, &lt;em&gt;Aplicar&lt;/em&gt;, &lt;em&gt;Sí&lt;/em&gt;, &lt;em&gt;No&lt;/em&gt;, &lt;em&gt;Cerrar&lt;/em&gt;, similares.&lt;/p&gt;
&lt;p&gt;Crea un archivo llamado &lt;code&gt;buttons.py&lt;/code&gt; y pon el siguiente código en él:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - buttons.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PyQt6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Botones PyQt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Ok&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cancelar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Aplicar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Sí&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;No&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cerrar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, primero añades la clase &lt;code&gt;QPushButton&lt;/code&gt; a tus objetos importados. El bucle &lt;code&gt;for&lt;/code&gt; itera sobre una lista de nombres de botones comunes y crea un botón con cada uno de los nombres definidos. Así es como se verá tu aplicación al ejecutarla desde tu terminal:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyqt-python/pyqt-botones.png" class="mx-auto d-block mt-2" alt="Botones en PyQt"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Botones en PyQt&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Botones como estos son quizás los widgets más utilizados en cualquier GUI. Cuando alguien hace clic en ellos, tu aplicación ordena a la computadora realizar acciones. Así es como puedes ejecutar cálculos cuando un usuario hace clic en un botón.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;En este ejemplo, empleas una clase llamada &lt;code&gt;QVBoxLayout&lt;/code&gt; que representa un gestor de disposición que permite organizar los widgets con una orientación vertical. Más sobre gestores de disposición en un momento.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h3 id="campos-de-entrada-de-texto"&gt;Campos de entrada de texto&lt;/h3&gt;
&lt;p&gt;Los &lt;strong&gt;campos de entrada de texto&lt;/strong&gt; son widgets comunes también. Estos widgets te permite ingresar una sola línea de texto y puedes crearlos con la clase &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qlineedit.html" target="_blank"&gt;&lt;code&gt;QLineEdit&lt;/code&gt;&lt;/a&gt;. Los campos de entrada de texto son útiles cuando necesitas obtener información del usuario como texto simple.&lt;/p&gt;
&lt;p&gt;Para un ejemplo, crea un archivo &lt;code&gt;line_edits.py&lt;/code&gt; y escribe el siguiente código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - line_edits.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PyQt6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QLineEdit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Campos de texto PyQt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Nombre&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Usuario&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Contraseña&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;edit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QLineEdit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;edit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setPlaceholderText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En el bucle de este ejemplo, creas tres campos de texto para permitir que el usuario introduzca su nombre, usuario y contraseña:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyqt-python/pyqt-campos-de-texto.png" class="mx-auto d-block mt-2" alt="Campos de texto en PyQt"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Campos de texto en PyQt&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Campos de texto como estos proporcionan funcionalidades estándar como copiar, pegar, deshacer, rehacer, arrastrar, soltar, y similares. En la imagen, puedes notar que los campos muestran texto de marcador de posición para informar al usuario qué tipo de información debe introducir.&lt;/p&gt;
&lt;h3 id="listas-desplegables"&gt;Listas desplegables&lt;/h3&gt;
&lt;p&gt;Las &lt;strong&gt;listas desplegables&lt;/strong&gt; son otro tipo fundamental de widget en aplicaciones GUI. Puedes crearlas usando la clase &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qcombobox.html" target="_blank"&gt;&lt;code&gt;QComboBox&lt;/code&gt;&lt;/a&gt;. Una lista desplegable presenta al usuario una serie de opciones de una manera que ocupa un espacio mínimo en la pantalla.&lt;/p&gt;
&lt;p&gt;A continuación, un ejemplo de cómo emplear una lista desplegable en PyQt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - combo_boxes.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PyQt6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QComboBox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Lista desplegable PyQt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;combo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QComboBox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;combo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;PyQt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;PySide&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Kivy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Tkinter&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;wxPython&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;combo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas &lt;code&gt;combo&lt;/code&gt; como una instancia de &lt;code&gt;QComboBox&lt;/code&gt;. Esta instancia contendrá una lista desplegable con una serie de nombres de bibliotecas Python para desarrollo de aplicaciones GUI. Cuando ejecutas esta aplicación desde tu línea de comandos, obtienes una ventana como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyqt-python/pyqt-lista-desplegable.png" class="mx-auto d-block mt-2" alt="Lista desplegable en PyQt"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Lista desplegable en PyQt&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Al hacer clic sobre esta lista desplegable, los usuarios pueden seleccionar una de las opciones desplegadas. Las listas desplegables también pueden ser de solo lectura o editables y además de texto, también pueden contener &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtgui/qbitmap.html" target="_blank"&gt;pixmaps&lt;/a&gt; o ambos.&lt;/p&gt;
&lt;h3 id="botones-radiales"&gt;Botones radiales&lt;/h3&gt;
&lt;p&gt;El último widget que estudiarás es el &lt;strong&gt;botón radial&lt;/strong&gt;, que puedes crear con la clase &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qradiobutton.html" target="_blank"&gt;&lt;code&gt;QRadioButton&lt;/code&gt;&lt;/a&gt;. Se trata de un botón circular de opción que puedes seleccionar al hacer clic sobre él. Los botones radiales son útiles cuando necesitas que el usuario seleccione una entre varias opciones.&lt;/p&gt;
&lt;p&gt;Todas las opciones en un grupo de botones radiales son visibles al mismo tiempo, pero el usuario solo puede seleccionar una de ellas. Es decir, la selección es excluyente. Considera el siguiente ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - radio_buttons.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PyQt6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QRadioButton&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Botones radiales PyQt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;230&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;¿Qué prefieres?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;foods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Pizza&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Hamburguesa&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Pasta&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Pollo asado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;food&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;foods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;radio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QRadioButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;radio&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas una aplicación que muestra un texto descriptivo, &lt;code&gt;"¿Qué prefieres?"&lt;/code&gt;, seguido de una serie de botones radiales, que representan opciones entre las que el usuario puede elegir. En este caso, las opciones son "Pizza", "Hamburguesa", "Pasta" y "Pollo asado". Para crear los botones, empleas un ciclo &lt;code&gt;for&lt;/code&gt; que itera sobre la lista de comidas.&lt;/p&gt;
&lt;p&gt;Al hacer clic en uno de los botones, este se activa y los demás se desactivan automáticamente. Esto los hace ideales para preguntas de selección única, como preferencias o respuestas a encuestas:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyqt-python/pyqt-botones-radiales.png" class="mx-auto d-block mt-2" alt="Botones radiales en PyQt"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Botones radiales en PyQt&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;En este grupo de botones radiales, solo un botón puede estar seleccionado a la vez. Si seleccionas otro botón del grupo, entonces el botón previamente seleccionado se deseleccionará automáticamente.&lt;/p&gt;
&lt;p&gt;PyQt tiene una amplia colección de widgets. Actualmente hay más de cuarenta &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qwidget.html" target="_blank"&gt;widgets&lt;/a&gt; disponibles. Aquí, has estudiado solo una pequeña muestra. Sin embargo, esta es suficiente para mostrarte el poder y la flexibilidad de este framework GUI.&lt;/p&gt;
&lt;p&gt;En la siguiente sección, aprenderás cómo organizar diferentes widgets para construir GUIs modernas y completamente funcionales para tus aplicaciones.&lt;/p&gt;
&lt;h2 id="usando-gestores-de-disposicion"&gt;Usando gestores de disposición&lt;/h2&gt;
&lt;p&gt;Para construir GUI app, necesitas saber cómo organizar un conjunto de widgets para que tu GUI sea intuitiva y funcional. En PyQt, las herramientas para este fin son los llamados &lt;strong&gt;gestores de disposición&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Se trata de clases que te permiten dimensionar y posicionar tus widgets en la ventana o formulario de la aplicación. Se adaptan automáticamente a eventos de cambio de tamaño y otros cambios en la GUI, controlando el tamaño y posición de todos sus widgets.&lt;/p&gt;
&lt;p&gt;PyQt proporciona cuatro clases básicas de gestores de disposición:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qhboxlayout.html" target="_blank"&gt;&lt;code&gt;QHBoxLayout&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qvboxlayout.html" target="_blank"&gt;&lt;code&gt;QVBoxLayout&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qgridlayout.html" target="_blank"&gt;&lt;code&gt;QGridLayout&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qformlayout.html" target="_blank"&gt;&lt;code&gt;QFormLayout&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En las secciones siguientes, aprenderás lo básico de cómo emplear estas clases y crear GUIs ordenadas y funcionales.&lt;/p&gt;
&lt;h3 id="disposicion-horizontal"&gt;Disposición horizontal&lt;/h3&gt;
&lt;p&gt;La primera clase de gestor de disposición que estudiarás es &lt;strong&gt;&lt;code&gt;QHBoxLayout&lt;/code&gt;&lt;/strong&gt;. Esta te permite organizar los widgets horizontalmente de izquierda a derecha. El ejemplo a continuación muestra cómo usar &lt;code&gt;QHBoxLayout&lt;/code&gt; para organizar tres botones horizontalmente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - horizontal_layout.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PyQt6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QHBoxLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Disposición Horizontal&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QHBoxLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;positions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Izquierda&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Centro&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Derecha&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas una instancia de &lt;code&gt;QHBoxLayout&lt;/code&gt; llamada &lt;code&gt;layout&lt;/code&gt;. Luego agregas los tres botones en un ciclo usando el método &lt;code&gt;.addWidget()&lt;/code&gt;. La aplicación resultante luce como se muestra a continuación:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyqt-python/pyqt-gestor-disposicion-horizontal.png" class="mx-auto d-block mt-2" alt="Gestor de disposición horizontal en PyQt"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Gestor de disposición horizontal en PyQt&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;La figura anterior muestra tres botones en disposición horizontal. Los botones se muestran de izquierda a derecha en el mismo orden en que los agregaste en tu código.&lt;/p&gt;
&lt;h3 id="disposicion-vertical"&gt;Disposición vertical&lt;/h3&gt;
&lt;p&gt;La siguiente clase de gestor de disposición es &lt;strong&gt;&lt;code&gt;QVBoxLayout&lt;/code&gt;&lt;/strong&gt;. Esta clase te permite organizar los widgets verticalmente de arriba a abajo, facilitando la construcción de diseños verticales en tu GUI.&lt;/p&gt;
&lt;p&gt;A continuación, un ejemplo de cómo puedes usar &lt;code&gt;QVBoxLayout&lt;/code&gt; para organizar tres botones verticalmente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - vertical_layout.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PyQt6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Disposición Vertical&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;230&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;positions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Arriba&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Centro&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Abajo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas una instancia de &lt;code&gt;QVBoxLayout&lt;/code&gt; llamada &lt;code&gt;layout&lt;/code&gt;. En el ciclo &lt;code&gt;for&lt;/code&gt;, añades tres botones a &lt;code&gt;layout&lt;/code&gt; empleando &lt;code&gt;.addWidget()&lt;/code&gt;. Cuando ejecutas esta aplicación de ejemplo, obtienes una ventana que se ve como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyqt-python/pyqt-gestor-disposicion-vertical.png" class="mx-auto d-block mt-2" alt="Gestor de disposición vertical en PyQt"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Gestor de disposición vertical en PyQt&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Esta captura muestra tres botones en un arreglo vertical, uno debajo del otro. Los botones aparecen en el mismo orden en que los agregaste a tu código, de arriba a abajo.&lt;/p&gt;
&lt;h3 id="disposicion-en-cuadricula"&gt;Disposición en cuadrícula&lt;/h3&gt;
&lt;p&gt;El tercer gestor de disposición que estudiarás es &lt;strong&gt;&lt;code&gt;QGridLayout&lt;/code&gt;&lt;/strong&gt;. Esta clase te permite organizar los widgets en una cuadrícula de filas y columnas. Cada widget tendrá una posición relativa en la cuadrícula. Puedes definir la posición de un widget con un par de coordenadas como &lt;code&gt;(fila, columna)&lt;/code&gt;. Cada coordenada debe ser un &lt;a href="https://realpython.com/python-numbers/" target="_blank"&gt;número&lt;/a&gt; entero. Estos pares de coordenadas definen qué celda en la cuadrícula ocupará un widget determinado.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;QGridLayout&lt;/code&gt; toma el espacio disponible, lo divide en &lt;code&gt;filas&lt;/code&gt; y &lt;code&gt;columnas&lt;/code&gt;, y coloca cada widget hijo en su propia celda.&lt;/p&gt;
&lt;p&gt;A continuación, se muestra un ejemplo de cómo organizar una GUI con este gestor de disposición:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - grid_layout.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PyQt6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QGridLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Disposición en Cuadrícula&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QGridLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;button_names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Botón (0, 0)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Botón (0, 1)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Botón (0, 2)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Botón (1, 0)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Botón (1, 1)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Botón (1, 2)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Botón (2, 0)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button_names&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&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="n"&gt;i&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="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QPushButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Botón (2, 1) + 2 Columnas de Amplitud&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="mi"&gt;2&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;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, creas una aplicación que utiliza un objeto &lt;code&gt;QGridLayout&lt;/code&gt; para organizar sus widgets en la pantalla. Nuevamente, para añadir los botones, empleas un ciclo &lt;code&gt;for&lt;/code&gt; y el método &lt;code&gt;.addWidget()&lt;/code&gt;. Nota que el segundo y tercer argumento que pasas al métodos son números enteros que definen la posición de cada widget en la cuadrícula.&lt;/p&gt;
&lt;p&gt;Finalmente, pasas dos argumentos más a &lt;code&gt;.addWidget()&lt;/code&gt;. Estos argumentos son &lt;code&gt;rowSpan&lt;/code&gt; y &lt;code&gt;columnSpan&lt;/code&gt; los cuales sirven para hacer que un widget ocupe más de una fila o columna. En este ejemplo, el último botón ocupa una fila y dos columnas.&lt;/p&gt;
&lt;p&gt;Si ejecutas este código desde tu línea de comandos, obtendrás una ventana que luce así:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyqt-python/pyqt-gestor-disposicion-cuadricula.png" class="mx-auto d-block mt-2" alt="Gestor de disposición en cuadrícula en PyQt"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Gestor de disposición en cuadrícula en PyQt&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;En esta figura, puedes ver tus botones organizados en una cuadrícula de filas y columnas. El último botón ocupa dos columnas en la cuadrícula.&lt;/p&gt;
&lt;h3 id="disposicion-de-formulario"&gt;Disposición de formulario&lt;/h3&gt;
&lt;p&gt;El último gestor de disposición que estudiarás es el &lt;strong&gt;&lt;code&gt;QFormLayout&lt;/code&gt;&lt;/strong&gt;. Con esta clase, puedes organizar los widgets en un diseño de dos columnas. La primera columna generalmente muestra texto en etiquetas, mientras que la segunda columna pueden contener widgets de entrada de datos como &lt;code&gt;QLineEdit&lt;/code&gt;, &lt;code&gt;QComboBox&lt;/code&gt;, &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qspinbox.html" target="_blank"&gt;&lt;code&gt;QSpinBox&lt;/code&gt;&lt;/a&gt;, entre otros.&lt;/p&gt;
&lt;p&gt;El siguiente ejemplo muestra cómo crear una aplicación que utiliza un objeto &lt;code&gt;QFormLayout&lt;/code&gt; para organizar sus widgets:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - form_layout.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PyQt6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QFormLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QLineEdit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Disposición de Formulario&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QFormLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Nombre:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Edad:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Ocupación:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Dirección:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QLineEdit&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;QFormLayout&lt;/code&gt; tiene un método llamado &lt;code&gt;.addRow()&lt;/code&gt; que puedes usar para agregar una fila de dos widgets al formulario. El primer argumento de &lt;code&gt;.addRow()&lt;/code&gt; debe ser una etiqueta o una cadena. El segundo argumento puede ser cualquier widget que permita al usuario ingresar o editar datos. En este ejemplo específico, has usado campos de entrada de texto, &lt;code&gt;QLineEdit&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si ejecutas este código, obtendrás una ventana similar a la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyqt-python/pyqt-gestor-disposicion-formulario.png" class="mx-auto d-block mt-2" alt="Gestor de disposición para formulario en PyQt"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Gestor de disposición para formulario en PyQt&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Esta ventana muestra un diseño de formulario. La primera columna contiene etiquetas para comunicar al usuario la información deseada. La segunda columna muestra widgets que permiten al usuario ingresar la información.&lt;/p&gt;
&lt;h2 id="creando-ventanas-y-dialogos"&gt;Creando ventanas y diálogos&lt;/h2&gt;
&lt;p&gt;Las aplicaciones de escritorio GUI en PyQt generalmente están conformadas por dos tipos de ventanas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ventana principal:&lt;/strong&gt; La ventana en la que se desarrolla la mayor parte de la interacción del usuario.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diálogos:&lt;/strong&gt; Ventanas auxiliares de la aplicación que solicitan o muestran información al usuario.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En las secciones siguientes, aprenderás sobre ambos tipos de ventanas y cómo crearlas en PyQt de manera que puedas construir aplicaciones funcionales y atractivas.&lt;/p&gt;
&lt;h3 id="ventanas-principales"&gt;Ventanas principales&lt;/h3&gt;
&lt;p&gt;La mayoría de las veces, tus aplicaciones tendrán una ventana que incluye &lt;a href="https://realpython.com/python-menus-toolbars/" target="_blank"&gt;barra de menú&lt;/a&gt;, algunas barras de herramientas, una barra de estado y un widget central que será el elemento principal de la GUI. Para crear este tipo de ventana en PyQt, puedes heredar de la clase &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qmainwindow.html" target="_blank"&gt;&lt;code&gt;QMainWindow&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Una instancia de una clase que deriva de &lt;code&gt;QMainWindow&lt;/code&gt; se considera la &lt;strong&gt;ventana principal&lt;/strong&gt; de la aplicación y debe ser única.&lt;/p&gt;
&lt;p&gt;La clase &lt;code&gt;QMainWindow&lt;/code&gt; proporciona un marco para construir la GUI de tu aplicación rápidamente. Esta clase tiene su propio diseño incorporado, que acepta los siguientes componentes gráficos:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Componente&lt;/th&gt;
&lt;th&gt;Posición&lt;/th&gt;
&lt;th&gt;Descripción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Una &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qmenubar.html" target="_blank"&gt;barra de menú&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Arriba&lt;/td&gt;
&lt;td&gt;Contiene el menú principal de la aplicación&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Una o más &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qtoolbar.html" target="_blank"&gt;barras de herramientas&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Cualquiera de los lados&lt;/td&gt;
&lt;td&gt;Puede contener &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qtoolbutton.html" target="_blank"&gt;botones de herramienta&lt;/a&gt; y otros widgets, como &lt;code&gt;QComboBox&lt;/code&gt;, &lt;code&gt;QSpinBox&lt;/code&gt;, y más&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Un widget central&lt;/td&gt;
&lt;td&gt;Centro&lt;/td&gt;
&lt;td&gt;Contiene el widget central de la ventana, que puede ser de cualquier tipo, incluyendo un widget compuesto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uno o más widgets &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qdockwidget.html" target="_blank"&gt;acoplables&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Alrededor del widget central&lt;/td&gt;
&lt;td&gt;Son ventanas pequeñas, movibles y ocultables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Una &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qstatusbar.html" target="_blank"&gt;barra de estado&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Abajo&lt;/td&gt;
&lt;td&gt;Contiene la barra de estado de la app, que muestra información de estado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;No puedes crear una ventana principal sin un widget central. Puedes establecer el widget central de la ventana con el método &lt;code&gt;.setCentralWidget()&lt;/code&gt;. El diseño de la ventana principal te permitirá tener un único widget central, que puede ser simple o compuesto.&lt;/p&gt;
&lt;p&gt;El siguiente ejemplo muestra cómo usar &lt;code&gt;QMainWindow&lt;/code&gt; para crear una aplicación con ventana principal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - main_window.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PyQt6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QMainWindow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QStatusBar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QToolBar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QMainWindow&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;QMainWindow&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setCentralWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QLabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Soy el Widget Central&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_createMenu&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_createToolBar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_createStatusBar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_createMenu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;menu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;menuBar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addMenu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;amp;Menú&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;menu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;amp;Salir&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_createToolBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QToolBar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Salir&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addToolBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_createStatusBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QStatusBar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;showMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Soy la Barra de Estado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setStatusBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
    &lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Primeramente, creas una clase llamada &lt;code&gt;Window&lt;/code&gt; que hereda de &lt;code&gt;QMainWindow&lt;/code&gt;. Dentro del método &lt;code&gt;.__init__()&lt;/code&gt;, llamas al inicializador de la clase base. El argumento &lt;code&gt;parent&lt;/code&gt; se establece en &lt;code&gt;None&lt;/code&gt; porque esta es la ventana principal de tu aplicación, por lo que no debe tener una ventana padre.&lt;/p&gt;
&lt;p&gt;Luego, estableces el título de la ventana y creas un objeto &lt;code&gt;QLabel&lt;/code&gt; para usar como widget central de la ventana. Finalmente, llamas los métodos no públicos &lt;code&gt;._createMenu()&lt;/code&gt;, &lt;code&gt;._createToolBar()&lt;/code&gt;, &lt;code&gt;._createStatusBar()&lt;/code&gt; para crear el menú principal, una barra de herramientas y la barra de estado.&lt;/p&gt;
&lt;p&gt;El widget central y la barra de estado muestran mensajes identificativos. El menú y la barra de herramientas mostrarán una opción para salir de la aplicación.&lt;/p&gt;
&lt;p&gt;En macOS, cuando ejecutas la aplicación de ejemplo anterior, obtendrás una ventana como la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyqt-python/pyqt-ventana-principal-macOS.png" class="mx-auto d-block mt-2" alt="Ventana principal en PyQt - macOS"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Ventana principal en PyQt - macOS&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Como puedes confirmar, tu aplicación tiene los siguientes componentes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un menú principal llamado genéricamente &lt;em&gt;Menú&lt;/em&gt; que se muestra en la barra superior del escritorio macOS. En otras plataformas, el menú principal aparece en la misma ventana de la aplicación justo debajo de la barra de título.&lt;/li&gt;
&lt;li&gt;Una barra de herramientas que contiene un botón &lt;em&gt;Salir&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Un widget central compuesto por un objeto &lt;code&gt;QLabel&lt;/code&gt; que muestra un mensaje identificativo.&lt;/li&gt;
&lt;li&gt;Una barra de estado en la parte inferior de la ventana que también muestra un mensaje identificativo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;¡Eso es todo! Has aprendido a construir una aplicación con ventana principal usando Python y PyQt. Lo siguiente es aprender un poco sobre cómo crear diálogos.&lt;/p&gt;
&lt;h3 id="dialogos-y-formularios"&gt;Diálogos y formularios&lt;/h3&gt;
&lt;p&gt;También es común que tus aplicaciones tengan varios diálogos para llevar a cabo acciones secundarias que dependen de la entrada del usuario. Para crear un diálogo, necesitas crear una clase que herede de &lt;a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/api/qtwidgets/qdialog.html" target="_blank"&gt;&lt;code&gt;QDialog&lt;/code&gt;&lt;/a&gt;, que es la clase base de todas las ventanas de diálogo en PyQt.&lt;/p&gt;
&lt;p&gt;En PyQt, los diálogos pueden ser:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Modal:&lt;/strong&gt; Bloquea la entrada a cualquier otra ventana visible en la misma aplicación. Puedes mostrar un diálogo modal llamando a su método &lt;code&gt;.exec()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No modal:&lt;/strong&gt; Opera independientemente de otras ventanas en la misma aplicación. Puedes mostrar un diálogo no modal usando su método &lt;code&gt;.show()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Puedes emplear diálogos como formularios de entrada de datos, ventanas de configuración, entre otras. Por esto, los diálogos también pueden proporcionar un valor de retorno y tener botones predeterminados, como &lt;em&gt;Aplicar&lt;/em&gt;, &lt;em&gt;Ok&lt;/em&gt; y &lt;em&gt;Cancelar&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Un diálogo es siempre una ventana independiente. Si un diálogo tiene un widget padre (&lt;code&gt;parent&lt;/code&gt;), entonces se mostrará centrado sobre dicho widget.&lt;/p&gt;
&lt;p&gt;A continuación un ejemplo de cómo emplear &lt;code&gt;QDialog&lt;/code&gt; para desarrollar una diálogo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - dialog_form.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PyQt6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QDialog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QDialogButtonBox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QFormLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QLineEdit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QDialog&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setWindowTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;QDialog&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QVBoxLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;form_layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QFormLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Nombre:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Edad:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Ocupación:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Dirección:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;form_layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QLineEdit&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

        &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;form_layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;buttons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QDialogButtonBox&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;buttons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setStandardButtons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;QDialogButtonBox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardButton&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cancel&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
            &lt;span class="n"&gt;QDialogButtonBox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardButton&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ok&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buttons&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, usas la clase &lt;code&gt;QDialog&lt;/code&gt; como la base para crear una ventana de diálogo. Para definir el diseño del diálogo, usas un &lt;code&gt;QVBoxLayout&lt;/code&gt; y un &lt;code&gt;QFormLayout&lt;/code&gt;. Con ellos, estableces el diseño principal que consiste en un formulario para entrada de datos y dos botones para aceptar o cancelar la entrada de datos.&lt;/p&gt;
&lt;p&gt;Empleas la clase &lt;code&gt;QDialogButtonBox&lt;/code&gt; para gestionar los botones estándar del diálogo &lt;em&gt;OK&lt;/em&gt; y &lt;em&gt;Cancel&lt;/em&gt;. Este widget es muy útil porque gestiona automáticamente las interacciones comunes de los botones como cerrar el cuadro de diálogo o confirmar acciones.&lt;/p&gt;
&lt;p&gt;El código anterior mostrará una ventana que se verá así:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/iniciando-con-pyqt-python/pyqt-dialogo.png" class="mx-auto d-block mt-2" alt="Ventana de diálogo en PyQt"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Ventana de diálogo en PyQt&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Esta figura muestra el diálogo creado con un &lt;code&gt;QFormLayout&lt;/code&gt; para organizar los widgets y un &lt;code&gt;QVBoxLayout&lt;/code&gt; para el diseño global.&lt;/p&gt;
&lt;h3 id="mensajes-y-dialogos-estandar"&gt;Mensajes y diálogos estándar&lt;/h3&gt;
&lt;p&gt;PyQt también proporciona una forma rápida de crear &lt;strong&gt;cuadros de mensaje&lt;/strong&gt; para el usuario. La clase &lt;code&gt;QMessageBox&lt;/code&gt; te permite crear pequeñas ventanas diseñados para mostrar mensajes al usuario. PyQt ofrece varios tipos de cuadros de mensajes predefinidos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;QMessageBox.information()&lt;/code&gt;&lt;/strong&gt;: Permite mostrar un mensaje informativo, como una confirmación o un aviso simple.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;QMessageBox.warning()&lt;/code&gt;&lt;/strong&gt;: Permite mostrar una advertencia sobre posibles problemas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;QMessageBox.critical()&lt;/code&gt;&lt;/strong&gt;: Muestra mensajes de error críticos.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;QMessageBox.question()&lt;/code&gt;&lt;/strong&gt;: Presenta una pregunta al usuario con opciones como &lt;em&gt;Sí&lt;/em&gt; y &lt;em&gt;No&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Además, PyQt tiene &lt;strong&gt;diálogos estándar&lt;/strong&gt; predefinidos que facilitan la interacción con el usuario, ya sea para permitirle seleccionar archivos, carpetas, colores o fuentes. Aquí tienes un resumen de ellos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;QFileDialog&lt;/code&gt;&lt;/strong&gt;: Permite al usuario seleccionar un archivo existente para abrirlo. Con el método &lt;code&gt;.getOpenFileName()&lt;/code&gt;, seleccionas un archivos. Con &lt;code&gt;.getSaveFileNames()&lt;/code&gt;, seleccionas múltiples archivos. Por su parte, &lt;code&gt;.getSaveFileName()&lt;/code&gt; te permite seleccionar la ubicación y el nombre para guardar un archivo. Finalmente, &lt;code&gt;.getExistingDirectory()&lt;/code&gt; permite seleccionar una carpeta en lugar de un archivo.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;QColorDialog&lt;/code&gt;&lt;/strong&gt;: Presenta un diálogo selector de colores que permite al usuario elegir un color. El método empleado es &lt;code&gt;.getColor()&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;QFontDialog&lt;/code&gt;&lt;/strong&gt;: Representa un selector de fuentes que permite al usuario seleccionar una fuente, tamaño y estilo. El método empleado es &lt;code&gt;.getFont()&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;QInputDialog&lt;/code&gt;&lt;/strong&gt;: Permite al usuario ingresar datos simples, como un texto, un número o una opción de una lista. Los métodos correspondientes son &lt;code&gt;.getText()&lt;/code&gt; para entrada de texto, &lt;code&gt;.getInt()&lt;/code&gt; para entrada de un número entero, y &lt;code&gt;.getItem()&lt;/code&gt; para selección de un elemento de una lista.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A continuación, un ejemplo que muestra algunos de elementos en acción:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - standard_dialogs.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PyQt6.QtWidgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QColorDialog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QFileDialog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QFontDialog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QInputDialog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;QMessageBox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QApplication&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;

&lt;span class="c1"&gt;# Mostrar un mensaje&lt;/span&gt;
&lt;span class="n"&gt;QMessageBox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Información&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Este es un mensaje.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Abrir un archivo&lt;/span&gt;
&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QFileDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getOpenFileName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Abrir Archivo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;QMessageBox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;Archivo Seleccionado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Seleccionaste: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Seleccionar un color&lt;/span&gt;
&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QColorDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getColor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;QMessageBox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Color Seleccionado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Seleccionaste: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Seleccionar una fuente&lt;/span&gt;
&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QFontDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getFont&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;QMessageBox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Fuente Seleccionada&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Seleccionaste: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Entrada de texto&lt;/span&gt;
&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QInputDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Entrada de Texto&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Escribe algo:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;QMessageBox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Texto Ingresado&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Escribiste: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En esta aplicación, lo primero que haces es mostrar un mensaje empleando &lt;code&gt;QMessageBox.information()&lt;/code&gt;. Luego, empleas &lt;code&gt;QFileDialog.getOpenFileName()&lt;/code&gt; para generar un diálogo que te permite abrir un archivo seleccionado. Seguidamente, creas diálogos para seleccionar un color y una fuente. Finalmente, creas un diálogo que le da al usuario la posibilidad de introducir un número entero de manera rápida.&lt;/p&gt;
&lt;p&gt;Los cuadros de mensaje y los diálogos estándar son herramientas esenciales para cualquier aplicación PyQt que requiera interacción con el usuario.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Las &lt;strong&gt;aplicaciones con interfaz gráfica de usuario (GUI)&lt;/strong&gt; representan una parte sustancial en el desarrollo de software. Python ofrece un puñado de frameworks y bibliotecas que pueden ayudarte a desarrollar aplicaciones GUI modernas y robustas.&lt;/p&gt;
&lt;p&gt;En este tutorial, aprendiste cómo usar &lt;strong&gt;PyQt&lt;/strong&gt;, que es una de las bibliotecas más populares y sólidas para el desarrollo de aplicaciones GUI en Python.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En este tutorial, has aprendido a:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instalar&lt;/strong&gt; PyQt y configurarlo en tu computadora&lt;/li&gt;
&lt;li&gt;Desarrollar aplicaciones con &lt;strong&gt;GUI&lt;/strong&gt; basadas en PyQt&lt;/li&gt;
&lt;li&gt;Organizar una GUI usando &lt;strong&gt;gestores de disposición&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Crear &lt;strong&gt;ventanas principales&lt;/strong&gt; y &lt;strong&gt;diálogos&lt;/strong&gt; en tus aplicaciones PyQt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ahora puedes usar tus conocimientos de Python y PyQt para dar vida a tus propias aplicaciones GUI de escritorio.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Tutoriales/iniciando-con-pyqt-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Tutoriales"/><category term="gui"/><category term="pyqt"/></entry><entry><title>Patrones de diseño en Python: Modelo-Vista-Controlador (MVC)</title><link href="https://pythonscouts.com/patron-mvc-python/" rel="alternate"/><published>2024-12-12T06:00:00+01:00</published><updated>2024-12-12T06:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2024-12-12:/patron-mvc-python/</id><summary type="html">&lt;p&gt;El patrón Modelo-Vista-Controlador (MVC) es usado en la industria del software para definir la arquitectura general de una aplicación.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Este patrón permite separar la lógica específica de cada uno de los componentes de la aplicación. El &lt;strong&gt;modelo&lt;/strong&gt; maneja la lógica de negocio, la &lt;strong&gt;vista&lt;/strong&gt; es el componente visual y el &lt;strong&gt;controlador&lt;/strong&gt; se ocupa de conectar y controlar el funcionamiento de los dos anteriores.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En este tutorial aprenderás:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Qué es &lt;strong&gt;MVC&lt;/strong&gt; y cómo funciona&lt;/li&gt;
&lt;li&gt;Qué &lt;strong&gt;rol&lt;/strong&gt; desempeña cada uno de los componentes del MVC&lt;/li&gt;
&lt;li&gt;Cuáles son los &lt;strong&gt;beneficios&lt;/strong&gt; de emplear el MVC en tus aplicaciones&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/patron-mvc-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#que-es-el-patron-modelo-vista-controlador"&gt;¿Qué es el patrón Modelo-Vista-Controlador?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#como-funciona-el-patron-mvc"&gt;¿Cómo funciona el patrón MVC?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#que-responsabilidades-tiene-cada-componente-del-patron-mvc"&gt;¿Qué responsabilidades tiene cada componente del patrón MVC?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#como-implementar-el-mvc-un-demo-con-tkinter-y-python"&gt;¿Cómo implementar el MVC? Un demo con Tkinter y Python?&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#el-modelo"&gt;El modelo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#la-vista"&gt;La vista&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#el-controlador"&gt;El controlador&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#que-beneficios-ofrece-el-patron-mvc"&gt;¿Qué beneficios ofrece el patrón MVC?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="que-es-el-patron-modelo-vista-controlador"&gt;¿Qué es el patrón Modelo-Vista-Controlador?&lt;/h2&gt;
&lt;p&gt;El Modelo-Vista-Controlador (MVC) más que un patrón de diseño, puede ser considerado un patrón de arquitectura de software. La diferencia entre el primero y el segundo es que el segundo tiene un alcance mucho mayor, pues define la arquitectura fundamental de la aplicación o sistema que estés desarrollando.&lt;/p&gt;
&lt;p&gt;Este patrón tiene tres componentes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Modelo&lt;/strong&gt; es el componente central y representa el conocimiento. El modelo contiene y gestiona la lógica del negocio, los datos, el estado y demás reglas fundamentales de la aplicación. Los datos pueden ser almacenados en el propio modelo o en una base de datos. En este último caso solo el modelo puede tener acceso a esta base de datos.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vista&lt;/strong&gt; es el componente visual pues debe proveer una representación visual del modelo que el usuario generalmente puede ver en pantalla. Por ejemplo, las Interfaces Gráficas de Usuario (GUI por sus siglas en inglés), o las salidas de texto en una consola o terminal, los gráficos de barras o de pastel, los documentos, las hojas de cálculo, y similares. La vista se limita a mostrar los datos contenidos en el modelo, sin tener la capacidad de manipularlos o modificarlos.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Controlador&lt;/strong&gt; es el enlace o medio de comunicación entre el modelo y la vista. El encargado de controlar todo el funcionamiento de ambos. Todo el flujo de comunicación entre el modelo y la vista es gestionado a través del controlador, por tanto, no existirá comunicación directa entre estos. Normalmente, el controlador acepta las acciones y entradas del usuario y delega la representación de los datos en la vista y la manipulación en el modelo.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;El MVC permite la aplicación práctica del principio de &lt;a href="https://es.wikipedia.org/wiki/Separaci%C3%B3n_de_intereses" target="_blank"&gt;Separación de intereses&lt;/a&gt; (&lt;em&gt;Separation of Concerns&lt;/em&gt;) al diseño de aplicaciones, donde cada uno de los componentes del patrón tiene una responsabilidad bien definida y única.&lt;/p&gt;
&lt;h2 id="como-funciona-el-patron-mvc"&gt;¿Cómo funciona el patrón MVC?&lt;/h2&gt;
&lt;p&gt;La lógica de funcionamiento del MVC puede ser más fácil de comprender con un ejemplo práctico. Supón que tienes una aplicación con una interfaz gráfica de usuario (GUI) donde puedes realizar acciones o eventos, incluidos hacer clic, presionar teclas, tocar el display táctil, entre otros.&lt;/p&gt;
&lt;p&gt;Cuando ejecutas la aplicación, inmediatamente ves su ventana principal en tu escritorio. Si la aplicación está implementada usando el MVC, entonces debe funcionar del siguiente modo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ejecutas una acción (evento) sobre la vista o ventana de la aplicación.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La vista recibe la acción e inmediatamente informa o notifica al controlador sobre la acción realizada.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;El controlador a su vez, delega la solicitud al modelo y actualiza la vista en consecuencia.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;El modelo realiza toda la validación de los datos y las entradas y luego procesa los requerimientos y realiza los cambios de estado solicitados, para finalmente informar al controlador que el cambio de estado correspondiente ha sido realizado.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;El controlador recibe la información de cambio de estado generada por el modelo y se la envía a la vista, quien se encargará de mostrarla en pantalla.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Haciendo una analogía, puedes comparar el MVC con un restaurante. La carta sería la vista que contiene la información sobre el menú, el mesero sería el controlador que recibe la orden del cliente y se la transmite al chef, quien representa al modelo y se encarga de confeccionar el plato solicitado por el cliente.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;En muchas implementaciones de MVC, especialmente en aplicaciones web, las acciones del usuario no son directamente manejadas por la vista, sino que pasan primero por el controlador. La vista debería ser lo más pasiva posible, simplemente renderizando lo que el controlador le proporciona. El controlador debe ser quien maneje las acciones del usuario y decida qué hacer con ellas, incluyendo actualizar el modelo o cambiar lo que se muestra en la vista.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;p&gt;Una vez que el plato está listo, el chef se lo hace saber al mesero, quien finalmente sirve la comida al cliente en forma de un plato terminado que sería la nueva representación de la vista.&lt;/p&gt;
&lt;p&gt;El chef y el cliente no tienen contacto directo, pues todo es gestionado por el mesero. Este es un principio básico de este patrón de diseño.&lt;/p&gt;
&lt;h2 id="que-responsabilidades-tiene-cada-componente-del-patron-mvc"&gt;¿Qué responsabilidades tiene cada componente del patrón MVC?&lt;/h2&gt;
&lt;p&gt;Para implementar el patrón MVC desde cero, debes asegurarte de crear modelos autónomos que recojan todo el conocimiento y la lógica del negocio. Los controladores deberán ser ligeros y limitarse a canalizar el flujo de información de la vista al modelo y viceversa. Las vistas deben limitarse a mostrar la información de estado del modelo.&lt;/p&gt;
&lt;p&gt;Para que el modelo pueda ser considerado autónomo debe:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Contener todas las reglas de validación de entradas y la lógica del negocio&lt;/li&gt;
&lt;li&gt;Manipular el estado de la aplicación&lt;/li&gt;
&lt;li&gt;Tener acceso directo a los datos de la aplicación (bases de datos, nube, archivos de configuración, etc.)&lt;/li&gt;
&lt;li&gt;No depender de la interfaz de usuario&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un controlador es considerado ligero cuando:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Actualiza el modelo cuando el usuario interactúa con la vista&lt;/li&gt;
&lt;li&gt;Actualiza la vista cuando hay cambios en el modelo&lt;/li&gt;
&lt;li&gt;No muestra datos directamente&lt;/li&gt;
&lt;li&gt;No tiene acceso directo a los datos de la aplicación&lt;/li&gt;
&lt;li&gt;No contiene reglas de validación ni lógica de negocio&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Una vista debe:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mostrar los datos contenidos en el modelo&lt;/li&gt;
&lt;li&gt;Permitir que el usuario interactúe con ella&lt;/li&gt;
&lt;li&gt;Realizar un mínimo procesamiento de datos con el fin de mostrarlos al usuario&lt;/li&gt;
&lt;li&gt;No almacenar datos&lt;/li&gt;
&lt;li&gt;No tener acceso directo a los datos de la aplicación&lt;/li&gt;
&lt;li&gt;No contener reglas de validación ni lógica de negocio&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="como-implementar-el-mvc-un-demo-con-tkinter-y-python"&gt;¿Cómo implementar el MVC? Un demo con Tkinter y Python?&lt;/h2&gt;
&lt;p&gt;En las secciones siguientes, desarrollarás una aplicación con una GUI escrita en Tkinter, que es el paquete de desarrollo de aplicaciones de escritorio por defecto de Python y que puedes encontrar en la &lt;a href="https://docs.python.org/es/3.13/library/index.html" target="_blank"&gt;biblioteca estándar&lt;/a&gt; del lenguaje.&lt;/p&gt;
&lt;p&gt;Para este ejemplo, desarrollarás una aplicación sencilla que te permitirá mostrar saludos aleatorios en una ventana.&lt;/p&gt;
&lt;h3 id="el-modelo"&gt;El modelo&lt;/h3&gt;
&lt;p&gt;Lo primero que debes definir es el modelo de tu aplicación. Crea un archivo Python llamado &lt;code&gt;model.py&lt;/code&gt; y escribe el siguiente código en él:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - model.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;random&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;choice&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;greetings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;Hola, Python!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;Hola, Mundo!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;Hola, Python Scouts!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_greeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;greetings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La clase &lt;code&gt;Model&lt;/code&gt; maneja una serie de saludos almacenados en el atributo &lt;code&gt;.greetings&lt;/code&gt;. El método &lt;code&gt;.get_greeting()&lt;/code&gt; permite seleccionar un saludo aleatorio empleando la función &lt;code&gt;choice()&lt;/code&gt; del módulo &lt;code&gt;random&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Este modelo funciona independientemente de la vista que emplees. Para esto, cuenta con sus propios datos y los métodos necesarios para manipular adecuadamente estos datos.&lt;/p&gt;
&lt;h3 id="la-vista"&gt;La vista&lt;/h3&gt;
&lt;p&gt;La vista es la representación gráfica de tu aplicación. Es lo que el usuario ve y con lo que interactúa directamente. La vista recibe las acciones del usuario, las notifica al controlador y luego refleja los cambios del modelo que resultan de las acciones del usuario.&lt;/p&gt;
&lt;p&gt;Crea un archivo llamado &lt;code&gt;view.py&lt;/code&gt; y pon en él el siguiente código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - view.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;MVC Demo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;160x70&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;greetings_label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola, Python Scouts!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;greetings_label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;greetings_button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Saludar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;greetings_button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;show_greeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;greetings_label&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En la vista &lt;code&gt;Window&lt;/code&gt; solo incluyes código &lt;code&gt;Tkinter&lt;/code&gt;. La vista debe ser autosuficiente, es decir, debe tener todos los métodos necesarios para actualizarse. En este caso, solo necesitas el método &lt;code&gt;.show_greeting()&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="el-controlador"&gt;El controlador&lt;/h3&gt;
&lt;p&gt;El controlador permite conectar la vista y el modelo. Es el único que debe tener conocimiento del resto de los componentes, vista y modelo. El controlador debe encargarse de guiar y gestionar las operaciones de acceso, modificación y actualización del modelo y de la vista.&lt;/p&gt;
&lt;p&gt;Para el controlador, crea un archivo con el nombre &lt;code&gt;app.py&lt;/code&gt; y escribe el siguiente código en él:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - app.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;model&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Model&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;view&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_view&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;greetings_button&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_greet&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show_greeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_greeting&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;# Client code&lt;/span&gt;
&lt;span class="n"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este archivo, defines una clase llamada &lt;code&gt;Controller&lt;/code&gt;. En el método &lt;code&gt;.__init__()&lt;/code&gt;, tomas como argumentos el modelo y la vista a emplear. Luego creas atributos para almacenar estos elementos y finalmente, conectas el botón Saludar de la vista con el método &lt;code&gt;._greet()&lt;/code&gt; del controlador.&lt;/p&gt;
&lt;p&gt;El método &lt;code&gt;._greet()&lt;/code&gt; es lo que se conoce como un callback. Este método se ejecuta cuando haces clic en el botón &lt;em&gt;Saludar&lt;/em&gt;. En este método, primeramente accedes al modelo con el fin de obtener el saludo usando el método &lt;code&gt;.get_greeting()&lt;/code&gt;. Luego, le indicas a la vista que muestre el saludo llamando al método &lt;code&gt;.show_greeting()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Fíjate que el controlador usa los métodos del modelo o de la vista en función de la tarea a realizar. El controlador no debe implementar lógica de negocio ni manipular directamente los datos del modelo. Su papel es coordinar las interacciones entre la vista y el modelo.&lt;/p&gt;
&lt;p&gt;Además, debes notar que el controlador solo tiene un método público, &lt;code&gt;.run()&lt;/code&gt;. El resto de sus métodos y atributos no son públicos pues sus nombres comienzan con un guión bajo.&lt;/p&gt;
&lt;p&gt;Una vez definido el controlador, viene el código cliente donde creas una instancia del controlador y llamas el método &lt;code&gt;.run()&lt;/code&gt; para ejecutar la aplicación. Para probar cómo funciona tu aplicación, ejecuta el siguiente comando en una ventana del terminal. Asegúrate de estar en el directorio que contiene el archivo &lt;code&gt;app.py&lt;/code&gt; de tu aplicación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;app.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Al presionar &lt;em&gt;Enter&lt;/em&gt;, verás en pantalla una ventana similar a la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/patron-mvc-python/mvc-demo-python-tkinter.png" class="mx-auto d-block mt-2" alt="MVC demo app with Tkinter and Python"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;MVC demo app with Tkinter and Python&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Si presionas continuamente el botón &lt;em&gt;Saludar&lt;/em&gt;, verás que aparecen los diferentes saludos de forma aleatoria uno tras otro. En este ejemplo puedes ver cómo cada clase realiza su trabajo y únicamente su trabajo.&lt;/p&gt;
&lt;h2 id="que-beneficios-ofrece-el-patron-mvc"&gt;¿Qué beneficios ofrece el patrón MVC?&lt;/h2&gt;
&lt;p&gt;Si empleas coherentemente el patrón de diseño MVC en el desarrollo de tus proyectos de software, obtendrás las ventajas siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;La separación entre la vista y el modelo permite que los diseñadores gráficos puedan dedicarse al diseño de la interfaz a la vez que los programadores se encargan de programar y probar el modelo, sin ninguna interferencia entre ellos. Luego, solo será necesario programar el controlador adecuado y la aplicación quedaría lista.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La poca o nula interdependencia entre el modelo y la vista, permite que cada parte pueda ser modificada de manera independiente sin que se afecte la otra, lo que mejora considerablemente la mantenibilidad de tus aplicaciones.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;El proceso de añadir nuevas vistas solo demanda implementar el controlador adecuado.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;El modelo no tiene conocimiento de las vistas, por tanto, es posible tener vistas diferentes para un único modelo. Por ejemplo, puedes crear una vista web, otra para el escritorio, y otra para dispositivos móviles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;El trabajo de mantener cada parte es mucho más fácil, debido a que las responsabilidades están claramente definidas.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;Ahora conoces conceptos fundamentales sobre el patrón Modelo-Vista-Controlador. Tienes una idea clara de qué cosa es el patrón de diseño Modelo-Vista-Controlador (MVC), cuáles son sus componentes fundamentales y qué función tiene cada uno de ellos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ahora sabes&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Qué es &lt;strong&gt;MVC&lt;/strong&gt; y cómo funciona&lt;/li&gt;
&lt;li&gt;Qué &lt;strong&gt;rol&lt;/strong&gt; desempeña cada uno de los componentes del MVC&lt;/li&gt;
&lt;li&gt;Cuáles son los &lt;strong&gt;beneficios&lt;/strong&gt; de emplear el MVC en tus aplicaciones&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aplicando estos conocimientos a tus proyectos Python, podrás darles una mejor organización de manera que sean más fáciles de modificar y mantener.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/patron-mvc-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/></entry><entry><title>Python a través de ejemplos: Expresiones</title><link href="https://pythonscouts.com/expresiones-python/" rel="alternate"/><published>2024-12-09T18:00:00+01:00</published><updated>2024-12-09T18:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2024-12-09:/expresiones-python/</id><summary type="html">&lt;p&gt;En Python, una expresión es una combinación de valores y operadores que retorna un resultado o valor específico cuando es evaluada.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Python te permite crear diferentes tipos de expresiones que podrás emplear para obtener valores requeridos en tu código. En este tutorial, aprenderás lo básico sobre cómo funcionan y cómo crear expresiones en Python.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/expresiones-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#aritmeticas"&gt;Aritméticas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#comparacion"&gt;Comparación&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#logicas-o-booleanas"&gt;Lógicas o booleanas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#concatenacion-y-repeticion"&gt;Concatenación y repetición&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#precedencia-de-operadores"&gt;Precedencia de operadores&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusiones"&gt;Conclusiones&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="aritmeticas"&gt;Aritméticas&lt;/h2&gt;
&lt;p&gt;Las expresiones aritméticas son aquellas expresiones basadas en operadores aritméticos que relacionan &lt;a href="/valores-python/"&gt;valores&lt;/a&gt; numéricos y funciones que retornan números:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
&lt;span class="go"&gt;6&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;300&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;142&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;5.0&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&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;200&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;164.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En estos ejemplos, construyes expresiones usando &lt;a href="/operadores-python/#aritmeticos"&gt;operadores aritméticos&lt;/a&gt; para combinar valores numéricos y funciones que dan como resultado un número.&lt;/p&gt;
&lt;p&gt;Las expresiones aritméticas también pueden emplear &lt;a href="/variables-python/"&gt;variables&lt;/a&gt; y &lt;a href="/constantes-python/"&gt;constantes&lt;/a&gt; en lugar de literales numéricos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.142&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;circle_area&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;circle_area&lt;/span&gt;
&lt;span class="go"&gt;314.2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, utilizamos una variable y una constante para crear una expresión que retorna el área de un círculo a partir del radio. Como las expresiones siempre retornan un valor, puedes emplear una variable para mantener una referencia al resultado.&lt;/p&gt;
&lt;h2 id="comparacion"&gt;Comparación&lt;/h2&gt;
&lt;p&gt;Por su parte, las expresiones de comparación son aquellas que nos permiten comparar objetos entre sí. Estas expresiones son útiles para decidir el flujo de ejecución de tus programas en función del cumplimiento de determinadas &lt;a href="/condicionales-python/"&gt;condiciones&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Por ejemplo, las expresiones siguientes comparan valores empleando &lt;a href="/operadores-python/#comparacion"&gt;operadores de comparación&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Todas las expresiones de comparación retornan un valor lógico, ya sea &lt;code&gt;True&lt;/code&gt; o &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Los ejemplos anteriores comparan valores numéricos, sin embargo, también es posible comparar cadenas, tuplas, listas y cualquier otro objeto que soporte los operadores de comparación.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;h2 id="logicas-o-booleanas"&gt;Lógicas o booleanas&lt;/h2&gt;
&lt;p&gt;Se pueden formar expresiones lógicas o booleanas empleando los &lt;a href="/operadores-python/#logicos"&gt;operadores lógicos&lt;/a&gt; &lt;code&gt;and&lt;/code&gt;, &lt;code&gt;or&lt;/code&gt;, y &lt;code&gt;not&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En estos ejemplos las expresiones retornan valores booleanos. Es decir, &lt;code&gt;True&lt;/code&gt; o &lt;code&gt;False&lt;/code&gt;. Sin embargo, no todas las expresiones lógicas retornan valores booleanos.&lt;/p&gt;
&lt;p&gt;Si los operandos involucrados son objetos o expresiones con un valor no booleano, entonces los operadores &lt;code&gt;and&lt;/code&gt; y &lt;code&gt;or&lt;/code&gt; retornan uno de los operandos dependiendo de sus valores de verdad:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Hola&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Hola&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="go"&gt;42&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="mf"&gt;3.14&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Hola&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;5&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="go"&gt;10&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mf"&gt;3.14&lt;/span&gt;
&lt;span class="go"&gt;3.14&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La siguiente tabla resume el comportamiento de los operadores &lt;code&gt;and&lt;/code&gt; y &lt;code&gt;or&lt;/code&gt; con operandos cuyos valores no son booleanos:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Operación&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Resultado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;x and y&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Si &lt;code&gt;x&lt;/code&gt; es falso, entonces retorna &lt;code&gt;x&lt;/code&gt;, si no, retorna &lt;code&gt;y&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;x or y&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Si &lt;code&gt;x&lt;/code&gt; es verdadero, entonces retorna &lt;code&gt;x&lt;/code&gt;, si no, retorna &lt;code&gt;y&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Estos resultados se obtienen con una evaluación cortocircuitada (short-circuit evaluation). Por ejemplo, si &lt;code&gt;x&lt;/code&gt; es falso entonces &lt;code&gt;x and y&lt;/code&gt; retorna &lt;code&gt;x&lt;/code&gt;, pero no evalúa a &lt;code&gt;y&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Para poder funcionar de esta forma estos operadores siguen una serie de reglas que Python usa internamente para determinar el valor de verdad de cualquier objeto. Estas reglas son las siguientes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Por defecto, un objeto se considera verdadero a menos que su clase defina un método &lt;code&gt;.__bool__()&lt;/code&gt; que devuelva &lt;code&gt;False&lt;/code&gt; o un método &lt;code&gt;.__len__()&lt;/code&gt; que devuelva cero cuando se llama con el objeto. Aquí están los objetos integrados considerados falsos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Constantes definidas como falsas: &lt;code&gt;None&lt;/code&gt; y &lt;code&gt;False&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cero en cualquiera de los diferentes tipos numéricos: &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;0.0&lt;/code&gt;, &lt;code&gt;0j&lt;/code&gt;, &lt;code&gt;Decimal(0)&lt;/code&gt;, &lt;code&gt;Fraction(0, 1)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cualquier colección o secuencia vacía: &lt;code&gt;''&lt;/code&gt;, &lt;code&gt;()&lt;/code&gt;, &lt;code&gt;[]&lt;/code&gt;, &lt;code&gt;{}&lt;/code&gt;, &lt;code&gt;set()&lt;/code&gt;, &lt;code&gt;range(0)&lt;/code&gt;. (&lt;a href="https://docs.python.org/es/3.13/library/stdtypes.html#truth-value-testing" target="_blank"&gt;Fuente&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="concatenacion-y-repeticion"&gt;Concatenación y repetición&lt;/h2&gt;
&lt;p&gt;Las expresiones de concatenación se forman con el operador de adición (&lt;code&gt;+&lt;/code&gt;). En este caso, los operandos deben ser cadenas de caracteres, listas, o tuplas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola,&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; Mundo&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;!&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Hola, Mundo!&amp;#39;&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &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;2&lt;/span&gt;&lt;span class="p"&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="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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="go"&gt;[1, 2, 3, 4, 5, 6]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Juan&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Programador&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;España&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;(&amp;#39;Juan&amp;#39;, 25, &amp;#39;Programador&amp;#39;, &amp;#39;España&amp;#39;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En el primer ejemplo, concatenas varias cadenas para formar una cadena final. De modo similar, lo haces con listas y con tuplas. Sin embargo, debes notar que los operandos deben ser del mismo tipo de datos. Considera el ejemplo siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Juan&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Programador&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;España&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;TypeError&lt;/span&gt;: &lt;span class="n"&gt;can only concatenate tuple (not &amp;quot;list&amp;quot;) to tuple&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si tratas de concatenar una tupla con una lista, entonces recibirás una excepción &lt;code&gt;TypeError&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En lo que respecta a las expresiones de repetición, debes emplear el operador de repetición (&lt;code&gt;*&lt;/code&gt;). Uno de los operandos será un número entero que representa el número de veces que deseas repetir el segundo operando. Este último puede ser una cadena, una lista, o una tupla:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola!&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Hola!Hola!Hola!&amp;#39;&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &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;2&lt;/span&gt;&lt;span class="p"&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;2&lt;/span&gt;
&lt;span class="go"&gt;[1, 2, 3, 1, 2, 3]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;uno&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;dos&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;(&amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El operador de repetición te permite repetir un objeto un determinado número de veces. Debes notar que el orden de los operandos no altera el resultado.&lt;/p&gt;
&lt;h2 id="precedencia-de-operadores"&gt;Precedencia de operadores&lt;/h2&gt;
&lt;p&gt;Cuando trabajas con expresiones que combinan diferentes tipos de operadores, debes considerar que los operadores tienen un orden de precedencia que define cuál operación se evalúa primero. A continuación un breve resumen de este orden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paréntesis&lt;/strong&gt; &lt;code&gt;()&lt;/code&gt;. Los paréntesis tienen la mayor precedencia y se evalúan primero:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &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="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="go"&gt;20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En esta expresión, se evalúa &lt;code&gt;(2 + 3)&lt;/code&gt; primero y se obtiene &lt;code&gt;5&lt;/code&gt;. Luego, se desarrolla la multiplicación y resulta en &lt;code&gt;20&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exponenciación&lt;/strong&gt; &lt;code&gt;**&lt;/code&gt;. El operador de potencia tiene la segunda mayor precedencia:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;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="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;18&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Se evalúa primero la exponenciación &lt;code&gt;(3**2)&lt;/code&gt; y se obtiene &lt;code&gt;9&lt;/code&gt;. Luego, se realiza la multiplicación y se obtiene &lt;code&gt;18&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Operadores unarios&lt;/strong&gt; &lt;code&gt;+x&lt;/code&gt;, &lt;code&gt;-x&lt;/code&gt;, &lt;code&gt;~x&lt;/code&gt;. Los operadores unarios como el negativo &lt;code&gt;-&lt;/code&gt; y el positivo &lt;code&gt;+&lt;/code&gt; se aplican antes que la mayoría de los operadores. Sin embargo, su precedencia es menor que la del operador de exponenciación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;-9&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;(&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;2&lt;/span&gt;
&lt;span class="go"&gt;9&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La primera expresión se evalúa como &lt;code&gt;-(3**2) = -9&lt;/code&gt; en lugar de como &lt;code&gt;(-3)**2 = 9&lt;/code&gt; que sería lo esperado en matemáticas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Multiplicación&lt;/strong&gt;, &lt;strong&gt;División&lt;/strong&gt;, &lt;strong&gt;Módulo&lt;/strong&gt; y &lt;strong&gt;División entera&lt;/strong&gt; &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;/&lt;/code&gt;, &lt;code&gt;%&lt;/code&gt;, &lt;code&gt;//&lt;/code&gt;. Todos estos operadores tienen la misma precedencia y se evalúan de izquierda a derecha según aparecen en las expresiones:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&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;2&lt;/span&gt;
&lt;span class="go"&gt;20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Se evalúa primero la multiplicación y luego la suma &lt;code&gt;10 + (5 * 2)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Suma&lt;/strong&gt; y &lt;strong&gt;Resta&lt;/strong&gt; &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;. Tienen precedencia menor que la multiplicación y se evalúan después de ella:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&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="go"&gt;11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Se evalúa de izquierda a derecha: primero &lt;code&gt;10 - 2&lt;/code&gt; y luego &lt;code&gt;8 + 3&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Operadores de desplazamiento de bits&lt;/strong&gt; &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;. Los operadores de desplazamiento tienen menor precedencia que los aritméticos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="go"&gt;12&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Se evalúa como &lt;code&gt;(1 + 2) &amp;lt;&amp;lt; 2&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Operadores de comparación&lt;/strong&gt; &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;lt;=&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;gt;=&lt;/code&gt;. Los operadores de comparación se evalúan después de los aritméticos y de los de desplazamiento:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Se evalúa como &lt;code&gt;(3 * 2) &amp;lt; 10&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Operadores de igualdad&lt;/strong&gt; &lt;code&gt;==&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;. Tienen menor precedencia que los operadores de comparación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&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="go"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Se evalúa primero &lt;code&gt;3 + 2&lt;/code&gt; y luego &lt;code&gt;5 == 5&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Operadores de bits&lt;/strong&gt; &lt;code&gt;&amp;amp;&lt;/code&gt;, &lt;code&gt;^&lt;/code&gt;, &lt;code&gt;|&lt;/code&gt;. Se evalúan en el siguiente orden: &lt;code&gt;&amp;amp;&lt;/code&gt; (AND bit a bit), &lt;code&gt;^&lt;/code&gt; (XOR bit a bit), &lt;code&gt;|&lt;/code&gt; (OR bit a bit):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&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;1&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Se evalúa como &lt;code&gt;(3 &amp;amp; 2) | 1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Operadores lógicos&lt;/strong&gt; &lt;code&gt;not&lt;/code&gt;, &lt;code&gt;and&lt;/code&gt;, &lt;code&gt;or&lt;/code&gt;. El operador &lt;code&gt;not&lt;/code&gt; tiene mayor precedencia que &lt;code&gt;and&lt;/code&gt;, que a su vez tiene mayor precedencia que &lt;code&gt;or&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Se evalúa como &lt;code&gt;(not True) or (False and True)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Operadores de pertenencia e identidad&lt;/strong&gt; &lt;code&gt;in&lt;/code&gt;, &lt;code&gt;not in&lt;/code&gt;, &lt;code&gt;is&lt;/code&gt;, &lt;code&gt;is not&lt;/code&gt;. Estos operadores tienen precedencia baja y se evalúan antes que los operadores lógicos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;m&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;mango&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Se evalúa como &lt;code&gt;("m" in "mango") and (None is not None)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Operadores de asignación&lt;/strong&gt; &lt;code&gt;=&lt;/code&gt;, &lt;code&gt;+=&lt;/code&gt;, &lt;code&gt;-=&lt;/code&gt;, &lt;code&gt;*=&lt;/code&gt;, &lt;code&gt;/=&lt;/code&gt;, &lt;code&gt;//=&lt;/code&gt;, &lt;code&gt;**=&lt;/code&gt;, y &lt;code&gt;%=&lt;/code&gt;. Los operadores de asignación tienen la menor precedencia, lo cual permite que los cálculos se realicen antes de asignar el valor final:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&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="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;
&lt;span class="go"&gt;13&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Primero se evalúa &lt;code&gt;3 + (2 * 5)&lt;/code&gt; y luego se asigna el resultado a la variable &lt;code&gt;x&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="conclusiones"&gt;Conclusiones&lt;/h2&gt;
&lt;p&gt;Has aprendido sobre las expresiones en Python y cómo formarlas usando diferentes tipos de operadores, como los aritméticos, de comparación, lógicos, de concatenación y repetición. También has conocido la importancia de la precedencia de operadores en la evaluación de expresiones complejas.&lt;/p&gt;
&lt;p&gt;Entender cómo formar expresiones en Python es fundamental, pues es la base de para una manipulación y transformación efectiva de datos.&lt;/p&gt;
&lt;p&gt;Ahora que dominas estos conceptos, puedes continuar explorando el uso de expresiones y operadores para maximizar la eficiencia y legibilidad de tu código Python.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/expresiones-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/></entry><entry><title>Python a través de ejemplos: Operadores</title><link href="https://pythonscouts.com/operadores-python/" rel="alternate"/><published>2024-11-04T06:00:00+01:00</published><updated>2024-11-04T06:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2024-11-04:/operadores-python/</id><summary type="html">&lt;p&gt;En Python, un operador es un símbolo que te permite realizar una determinada operación. Por ejemplo, los operadores aritméticos te permiten realizar operaciones con valores numéricos.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Python tiene varios tipos de operadores que se pueden emplear en diferentes contextos. En este tutorial, aprenderás lo básico sobre cómo funcionan y cómo emplear cada tipo de operador.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/operadores-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#aritmeticos"&gt;Aritméticos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#asignacion"&gt;Asignación&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#concatenacion"&gt;Concatenación&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#repeticion"&gt;Repetición&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#comparacion"&gt;Comparación&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#logicos"&gt;Lógicos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#pertenencia"&gt;Pertenencia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#identidad"&gt;Identidad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#bitwise"&gt;Bitwise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusiones"&gt;Conclusiones&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="aritmeticos"&gt;Aritméticos&lt;/h2&gt;
&lt;p&gt;Los operadores aritméticos son probablemente los más conocidos y empleados. Ellos permiten realizar operaciones aritméticas básicas entre &lt;a href="/valores-python/"&gt;valores&lt;/a&gt; numéricos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Adición&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="go"&gt;15&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Sustracción&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="go"&gt;5&lt;/span&gt;
&lt;span class="go"&gt; &lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Multiplicación&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="go"&gt;50&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# División&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;3.3333333333333335&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Módulo&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Exponenciación&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;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="go"&gt;8&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# División entera&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&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;# No -3, porque -4 es el mayor entero &amp;lt;= -3.333&lt;/span&gt;
&lt;span class="go"&gt;-4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Los operadores de adición, sustracción, multiplicación y división son casi idénticos a los que empleas en matemáticas.&lt;/p&gt;
&lt;p&gt;El operador de módulo (&lt;code&gt;%&lt;/code&gt;) devuelve el resto de la división entera. El operador de exponenciación o potenciación te permite elevar números a una determinada potencia. Finalmente, el operador de división entera realiza una división que devuelve el mayor entero menor o igual al resultado de la división normal. Esto se conoce como división de piso.&lt;/p&gt;
&lt;h2 id="asignacion"&gt;Asignación&lt;/h2&gt;
&lt;p&gt;Los operadores de asignación se emplean para asignar valores u objetos a variables o nombres:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Asignación&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;
&lt;span class="go"&gt;5&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Suma aumentada&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&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;# Equivale a number = number + 5&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;
&lt;span class="go"&gt;10&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Resta aumentada&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&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;# Equivale a number = number - 5&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;
&lt;span class="go"&gt;5&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Multiplicación aumentada&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&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;# Equivale a number = number * 3&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;
&lt;span class="go"&gt;15&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# División aumentada&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&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;# Equivale a number = number / 3&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;
&lt;span class="go"&gt;5.0&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Módulo aumentado&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&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;# Equivale a number = number % 3&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;
&lt;span class="go"&gt;2.0&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Potencia aumentada&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&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;# Equivale a number = number ** 3&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;
&lt;span class="go"&gt;8.0&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# División entera aumentada&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&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;# Equivale a number = number // 3&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;
&lt;span class="go"&gt;2.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En la práctica, Python tiene un operador de asignación (&lt;code&gt;=&lt;/code&gt;) y varios operadores de asignación aumentada. Los operadores de asignación aumentada son atajos que permiten actualizar el valor de una variable de forma rápida y concisa.&lt;/p&gt;
&lt;h2 id="concatenacion"&gt;Concatenación&lt;/h2&gt;
&lt;p&gt;Los operadores de concatenación te permiten unir cadenas de caracteres, listas y otros tipos de datos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Concatenación de cadenas&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola, &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;mundo!&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Hola, mundo!&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Python &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;es &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;genial&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Python es genial&amp;#39;&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Concatenación aumentada en cadenas&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Hola&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;, mundo!&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Hola, mundo!&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Python&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; es genial&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Python es genial&amp;#39;&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Concatenación de listas&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &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;2&lt;/span&gt;&lt;span class="p"&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="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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="go"&gt;[1, 2, 3, 4, 5, 6]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;c&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;d&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;a&amp;#39;, &amp;#39;b&amp;#39;, &amp;#39;c&amp;#39;, &amp;#39;d&amp;#39;]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Concatenación aumentada en listas&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&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="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;
&lt;span class="go"&gt;[1, 2, 3, 4, 5, 6]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;letters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;letters&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;c&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;d&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;letters&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;a&amp;#39;, &amp;#39;b&amp;#39;, &amp;#39;c&amp;#39;, &amp;#39;d&amp;#39;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nuevamente, Python tiene un operador de concatenación (&lt;code&gt;+&lt;/code&gt;) y varios operadores de concatenación aumentada.&lt;/p&gt;
&lt;h2 id="repeticion"&gt;Repetición&lt;/h2&gt;
&lt;p&gt;Puedes usar los operadores de repetición para repetir un valor un número determinado de veces:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Repetición de cadenas&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Hola Hola Hola &amp;#39;&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Python! &amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Python! Python! &amp;#39;&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Repetición de listas&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &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;2&lt;/span&gt;&lt;span class="p"&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;2&lt;/span&gt;
&lt;span class="go"&gt;[1, 2, 3, 1, 2, 3]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;a&amp;#39;, &amp;#39;b&amp;#39;, &amp;#39;a&amp;#39;, &amp;#39;b&amp;#39;, &amp;#39;a&amp;#39;, &amp;#39;b&amp;#39;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El operador de repetición comúnmente se emplea con cadenas de caracteres cuando queremos repetir una determinada cadena. Nota que este operador requiere de un operando entero que representa el número de repeticiones y que puede estar a la derecha o izquierda del operador.&lt;/p&gt;
&lt;h2 id="comparacion"&gt;Comparación&lt;/h2&gt;
&lt;p&gt;Cuando necesitas comparar valores u objetos, puedes utilizar los operadores de comparación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Igual a&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;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;5&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;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;10&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Mayor que&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Menor que&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Mayor o igual que&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Menor o igual que&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Diferente de&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;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;5&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Estos operadores son casi idénticos a los que usamos en las matemáticas. El operador de igualdad que se representa con dos símbolos de igualdad (&lt;code&gt;==&lt;/code&gt;) para diferenciarlo del operador de asignación. El operador de desigualdad se representa como &lt;code&gt;!=&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="logicos"&gt;Lógicos&lt;/h2&gt;
&lt;p&gt;Los operadores lógicos o booleanos permiten crear &lt;a href="/expresiones-python/"&gt;expresiones&lt;/a&gt; lógicas que generalmente se utilizan en &lt;a href="/condicionales-python/"&gt;condiciones&lt;/a&gt;. Python tiene tres operadores booleanos: &lt;code&gt;and&lt;/code&gt;, &lt;code&gt;or&lt;/code&gt;, y &lt;code&gt;not&lt;/code&gt;. Los siguientes ejemplos muestran el funcionamiento de cada operador:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Operador and (y)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Operador or (o)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Operador not (no)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Estos ejemplos expresan lo que se conoce como &lt;a href="https://es.wikipedia.org/wiki/Tabla_de_verdad" target="_blank"&gt;tabla de verdad&lt;/a&gt; de los operadores lógicos. Esta tabla resume los &lt;a href="https://es.wikipedia.org/wiki/Valor_de_verdad" target="_blank"&gt;valores de verdad&lt;/a&gt; que retornan los operadores en función del valor de verdad de los operandos.&lt;/p&gt;
&lt;p&gt;Los operadores lógicos en Python también funcionan con objetos distintos de &lt;code&gt;True&lt;/code&gt; and &lt;code&gt;False&lt;/code&gt;. Todos los objetos tienen un valor de verdad en Python. Las reglas para determinar estos valores de verdad son las siguientes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Por defecto, un objeto se considera verdadero a menos que su clase defina un método &lt;code&gt;.__bool__()&lt;/code&gt; que devuelva &lt;code&gt;False&lt;/code&gt; o un método &lt;code&gt;.__len__()&lt;/code&gt; que devuelva cero cuando se llama con el objeto. A continuación, se muestran la mayoría de los objetos incorporados considerados como falsos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Constantes definidas como falsas: &lt;code&gt;None&lt;/code&gt; y &lt;code&gt;False&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Cero en cualquiera de los diferentes tipos numéricos: &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;0.0&lt;/code&gt;, &lt;code&gt;0j&lt;/code&gt;, &lt;code&gt;Decimal(0)&lt;/code&gt;, &lt;code&gt;Fraction(0, 1)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Cualquier colección o secuencia vacía: &lt;code&gt;''&lt;/code&gt;, &lt;code&gt;()&lt;/code&gt;, &lt;code&gt;[]&lt;/code&gt;, &lt;code&gt;{}&lt;/code&gt;, &lt;code&gt;set()&lt;/code&gt;, &lt;code&gt;range(0)&lt;/code&gt; (&lt;a href="https://docs.python.org/es/3.13/library/stdtypes.html#truth-value-testing" target="_blank"&gt;Fuente&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cuando empleas los operadores &lt;code&gt;and&lt;/code&gt; y &lt;code&gt;or&lt;/code&gt; con objetos distintos de &lt;code&gt;True&lt;/code&gt; o &lt;code&gt;False&lt;/code&gt;, obtienes uno de los objetos como resultado en lugar de un valor booleano.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;and&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;[1, 2, 3]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;and&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;&amp;#39;&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;or&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;[1, 2, 3]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;or&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Hola&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El operador &lt;code&gt;and&lt;/code&gt; retorna el operando derecho si el izquierdo es verdadero. Si el operando izquierdo es falso, entonces &lt;code&gt;and&lt;/code&gt; lo retorna inmediatamente sin evaluar el operando derecho. Esto se &lt;a href="https://es.wikipedia.org/wiki/Evaluaci%C3%B3n_de_cortocircuito" target="_blank"&gt;denomina evaluación de cortocircuito&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En contraste, &lt;code&gt;or&lt;/code&gt; retorna el operando derecho si el izquierdo es falso. Si el operando izquierdo es verdadero, entonces &lt;code&gt;or&lt;/code&gt; lo retorna inmediatamente.&lt;/p&gt;
&lt;h2 id="pertenencia"&gt;Pertenencia&lt;/h2&gt;
&lt;p&gt;Los operadores de pertenencia se emplean cuando necesitas determinar si un valor u objeto determinado forma parte de una serie de valores o colección. Python tiene dos operadores de pertenencia: &lt;code&gt;in&lt;/code&gt; y &lt;code&gt;not in&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;El operador &lt;code&gt;in&lt;/code&gt; devuelve &lt;code&gt;True&lt;/code&gt; si el objeto está presente en la colección de valores, de lo contrario devuelve &lt;code&gt;False&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Verificar si un elemento está en una lista&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;manzana&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;banana&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;cereza&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;banana&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fruits&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;naranja&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fruits&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Verificar si una subcadena está en una cadena&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Hola, mundo!&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;adiós&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Verificar si un elemento está en un conjunto&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Verificar si una clave está en un diccionario&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Juan&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;age&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;address&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Por otro lado, el operador &lt;code&gt;not in&lt;/code&gt; permite determinar si un valor no pertenece a una serie de valores. Este operador devuelve &lt;code&gt;True&lt;/code&gt; cuando el valor no es parte de la colección de valores:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Verificar si un elemento NO está en una lista&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;manzana&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;banana&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;cereza&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;naranja&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fruits&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;banana&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fruits&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Verificar si una subcadena NO está en una cadena&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Hola, mundo!&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;adiós&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Verificar si un elemento NO está en un conjunto&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Verificar si una clave NO está en un diccionario&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Juan&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;age&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;address&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Los operadores de pertenencia funcionan con diferentes colecciones de datos como listas, duplas, conjuntos y diccionarios. Sin embargo, cuando necesitas realizar pruebas de pertenencia repetidamente, la opción más eficiente es emplear conjuntos.&lt;/p&gt;
&lt;h2 id="identidad"&gt;Identidad&lt;/h2&gt;
&lt;p&gt;En Python, cada objeto que se crea tiene una identidad única. En &lt;a href="https://es.wikipedia.org/wiki/CPython" target="_blank"&gt;CPython&lt;/a&gt;, esta identidad es un número entero que se corresponde con la dirección de memoria donde el objeto está almacenado.&lt;/p&gt;
&lt;p&gt;Python tiene dos operadores que permiten verificar si dos objetos tienen la misma identidad o no. Estos operadores son &lt;code&gt;is&lt;/code&gt; e &lt;code&gt;is not&lt;/code&gt; y se conocen como operadores de identidad.&lt;/p&gt;
&lt;p&gt;El operador &lt;code&gt;is&lt;/code&gt; devuelve &lt;code&gt;True&lt;/code&gt; si dos variables hacen referencia al mismo objeto, es decir, si apuntan a la misma ubicación en memoria:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;  &lt;span class="c1"&gt;# True, b se refiere a la misma lista que a&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;  &lt;span class="c1"&gt;# False, c es una lista independiente con el mismo contenido&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El operador &lt;code&gt;is not&lt;/code&gt; devuelve &lt;code&gt;True&lt;/code&gt; si dos variables no hacen referencia al mismo objeto en memoria:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Python realiza el caché de valores enteros en el rango de &lt;code&gt;-5&lt;/code&gt; a &lt;code&gt;256&lt;/code&gt;. Esto significa que cualquier número en este rango siempre apunta al mismo objeto en memoria:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;  &lt;span class="c1"&gt;# True, por estar en el rango de valores en caché&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;  &lt;span class="c1"&gt;# False, por NO estar en el rango de valores en caché&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Esta comportamiento de Python es una optimización de uso de memoria y se basa en el hecho de que posiblemente los enteros más comúnmente empleados están en ese rango de valores.&lt;/p&gt;
&lt;h2 id="bitwise"&gt;Bitwise&lt;/h2&gt;
&lt;p&gt;Los operadores de bits permiten manipular los bits de los números enteros directamente. Python cuenta con seis operadores de bit o bitwise. A continuación, algunos ejemplos que muestran cómo funcionan estos operadores:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# AND bit a bit&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;  &lt;span class="c1"&gt;# (En binario: 5 = 101 y 3 = 011, 101 &amp;amp; 011 = 001)&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="c1"&gt;# (En binario: 6 = 110 y 2 = 010, 110 &amp;amp; 010 = 010)&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# OR bit a bit&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;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="c1"&gt;# (En binario: 5 = 101 y 3 = 011, 101 | 011 = 111)&lt;/span&gt;
&lt;span class="go"&gt;7&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="c1"&gt;# (En binario: 6 = 110 y 2 = 010, 110 | 010 = 110)&lt;/span&gt;
&lt;span class="go"&gt;6&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# XOR bit a bit&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;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="c1"&gt;# (En binario: 5 = 101 y 3 = 011, 101 ^ 011 = 110)&lt;/span&gt;
&lt;span class="go"&gt;6&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="c1"&gt;# (En binario: 6 = 110 y 2 = 010, 110 ^ 010 = 100)&lt;/span&gt;
&lt;span class="go"&gt;4&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# NOT bit a bit&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &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;# (En binario: 5 = 0000 0101, ~5 = 1111 1010 que es -6 en complemento a dos)&lt;/span&gt;
&lt;span class="go"&gt;-6&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &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;# (En binario: 1 = 0000 0001, ~1 = 1111 1110 que es -2 en complemento a dos)&lt;/span&gt;
&lt;span class="go"&gt;-2&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Desplazamiento a la izquierda&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="c1"&gt;# (En binario: 5 = 0000 0101, 5 &amp;lt;&amp;lt; 1 = 0000 1010 que es 10)&lt;/span&gt;
&lt;span class="go"&gt;10&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="c1"&gt;# (En binario: 3 = 0000 0011, 3 &amp;lt;&amp;lt; 2 = 0000 1100 que es 12)&lt;/span&gt;
&lt;span class="go"&gt;12&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Desplazamiento a la derecha&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="c1"&gt;# (En binario: 5 = 0000 0101, 5 &amp;gt;&amp;gt; 1 = 0000 0010 que es 2)&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="c1"&gt;# (En binario: 12 = 0000 1100, 12 &amp;gt;&amp;gt; 2 = 0000 0011 que es 3)&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Los operadores a nivel de bits no son tan comunes en el desarrollo de aplicaciones de alto nivel. Sin embargo, son muy útiles en aplicaciones que requieren manipulación de datos a nivel de bits, incluidas la programación de sistemas, el procesamiento de señales, la criptografía, las redes, y los gráficos.&lt;/p&gt;
&lt;h2 id="conclusiones"&gt;Conclusiones&lt;/h2&gt;
&lt;p&gt;Has aprendido sobre los distintos tipos de operadores en Python, incluyendo aritméticos, de asignación, concatenación, repetición, comparación, lógicos, pertenencia, identidad y bitwise.&lt;/p&gt;
&lt;p&gt;El conocimiento de los operadores es esencial para cualquier desarrollador de Python, pues con ellos puedes manipular y evaluar datos, controlar el flujo de ejecución, y realizar otras tareas de programación.&lt;/p&gt;
&lt;p&gt;Ahora puedes aplicar tus conocimientos para resolver problemas complejos, optimizar tus programas y desarrollar aplicaciones más robustas y eficientes.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/operadores-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/></entry><entry><title>¿Cómo saber si todos los elementos en una lista son iguales en Python?</title><link href="https://pythonscouts.com/elementos-iguales-lista-python/" rel="alternate"/><published>2024-10-29T06:00:00+01:00</published><updated>2024-10-29T06:00:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2024-10-29:/elementos-iguales-lista-python/</id><summary type="html">&lt;p&gt;En Python, puede ser útil determinar si todos los elementos en una lista son iguales. Esto es lo que estarás aprendiendo en esta guía rápida.&lt;/p&gt;</summary><content type="html">&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Guías/elementos-iguales-lista-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#convertir-la-lista-en-un-conjunto-y-comprobar-si-contiene-un-unico-elemento"&gt;Convertir la lista en un conjunto y comprobar si contiene un único elemento&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usar-la-funcion-all-para-comparar-el-primer-elemento-con-los-restantes"&gt;Usar la función all() para comparar el primer elemento con los restantes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ordenar-la-lista-y-comparar-el-primer-y-el-ultimo-elemento"&gt;Ordenar la lista y comparar el primer y el último elemento&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#en-resumen"&gt;En resumen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="convertir-la-lista-en-un-conjunto-y-comprobar-si-contiene-un-unico-elemento"&gt;Convertir la lista en un conjunto y comprobar si contiene un único elemento&lt;/h2&gt;
&lt;p&gt;Una vía rápida para determinar si todos los elementos de una lista son iguales es convertir la lista en un conjunto usando la clase &lt;a href="https://docs.python.org/es/3/library/functions.html#func-set" target="_blank"&gt;&lt;code&gt;set()&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Como premisa y en aras de la simplicidad, asumiremos que se trata de una lista no vacía que contiene elementos del mismo tipo de dato, ya sea números, cadenas, u otros.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;p&gt;Los conjuntos son tipos de datos que no pueden contener elementos repetidos. Por tanto, si conviertes tu lista en un conjunto y terminas con un conjunto de un único elemento, entonces puedes concluir que todos los elementos de tu lista son iguales:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;letters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;letters&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En estos ejemplos, combinas las funciones &lt;code&gt;set()&lt;/code&gt; y &lt;a href="https://docs.python.org/es/3/library/functions.html#len" target="_blank"&gt;&lt;code&gt;len()&lt;/code&gt;&lt;/a&gt;. Si terminas con un conjunto de un solo elemento, entonces sabes que todos los elementos de tu lista original son iguales.&lt;/p&gt;
&lt;h2 id="usar-la-funcion-all-para-comparar-el-primer-elemento-con-los-restantes"&gt;Usar la función &lt;code&gt;all()&lt;/code&gt; para comparar el primer elemento con los restantes&lt;/h2&gt;
&lt;p&gt;Puedes emplear la función &lt;a href="https://docs.python.org/es/3/library/functions.html#all" target="_blank"&gt;&lt;code&gt;all()&lt;/code&gt;&lt;/a&gt; para determinar si todos los elementos de una lista son iguales. Esta función te permite comprobar si todos los elementos de un iterable son verdaderos. Para cumplir con tu tarea, puedes comparar el primer elemento de tu lista con el resto de los elementos.&lt;/p&gt;
&lt;p&gt;A continuación el código que te permite hacerlo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&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="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;letters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;letters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;letters&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="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Esta técnica para determinar si todos los elementos de una lista son iguales emplea una expresión generadora que produce &lt;a href="/valores-python/"&gt;valores&lt;/a&gt; booleanos que resultan de evaluar la &lt;a href="/expresiones-python/"&gt;expresión&lt;/a&gt; &lt;code&gt;item == letters[0]&lt;/code&gt;. Luego, &lt;code&gt;all()&lt;/code&gt; verifica si todos los elementos resultantes son &lt;code&gt;True&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="ordenar-la-lista-y-comparar-el-primer-y-el-ultimo-elemento"&gt;Ordenar la lista y comparar el primer y el último elemento&lt;/h2&gt;
&lt;p&gt;Otra manera de saber si todos los elementos de una lista son iguales es ordenar la lista y comparar el primer y el último elemento.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Debes saber que esta técnica puede ser muy ineficiente especialmente cuando tienes una lista muy larga, pues el algoritmo de ordenamiento puede tomar un tiempo considerable. Además, ordenar la lista modifica el orden original de los elementos, lo cual puede no ser deseado.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;p&gt;Considera los siguientes ejemplos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;letters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;letters&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;letters&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;a&amp;#39;, &amp;#39;a&amp;#39;, &amp;#39;b&amp;#39;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;letters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;letters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, ordenas la lista con el método &lt;a href="https://docs.python.org/es/3/library/stdtypes.html#list.sort" target="_blank"&gt;&lt;code&gt;.sort()&lt;/code&gt;&lt;/a&gt; y luego comparas el primer y el último elemento usando una comparación de igualdad. Si estos elementos son iguales, entonces todos los elementos de tu lista son iguales.&lt;/p&gt;
&lt;h2 id="en-resumen"&gt;En resumen&lt;/h2&gt;
&lt;p&gt;En esta guía, has aprendido tres técnicas diferentes para determinar si todos los elementos en una lista de Python son iguales:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Convertir la lista en un conjunto y verificar su longitud&lt;/li&gt;
&lt;li&gt;Utilizar la función &lt;code&gt;all()&lt;/code&gt; con una expresión generadora&lt;/li&gt;
&lt;li&gt;Ordenar la lista y comparar el primer y el último elemento&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cada técnica ofrece una forma útil de abordar el problema, proporcionando flexibilidad según las necesidades específicas de tu programa. Con estas habilidades, puedes implementar verificaciones de uniformidad de manera eficiente y rápida en tus proyectos de Python.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Guías/elementos-iguales-lista-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Guías"/><category term="python"/></entry><entry><title>Python a través de ejemplos: Constantes</title><link href="https://pythonscouts.com/constantes-python/" rel="alternate"/><published>2024-10-26T06:00:00+02:00</published><updated>2024-10-26T06:00:00+02:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2024-10-26:/constantes-python/</id><summary type="html">&lt;p&gt;En Python, una constante es un nombre simbólico que permite referenciar un objeto cuyo valor no cambia durante la ejecución del programa. Como las variables, las constantes referencian objetos en memoria.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Python no tiene una sintaxis específica para las constantes como otros lenguajes de programación sí la tienen. Por esta razón, las constantes en Python son realmente &lt;a href="/variables-python/"&gt;variables&lt;/a&gt; que no cambian su &lt;a href="/valores-python/"&gt;valor&lt;/a&gt; durante la ejecución del código.&lt;/p&gt;
&lt;p&gt;Al igual que las variables, las constantes consisten en dos cosas: un nombre y un valor asociado. El nombre describe claramente de qué trata la constante. El valor es la expresión concreta de la constante.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/constantes-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#constantes-comunes"&gt;Constantes comunes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#constantes-en-python"&gt;Constantes en Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tipos-de-datos-y-constantes"&gt;Tipos de datos y constantes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#nombres-de-constantes"&gt;Nombres de constantes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ventajas-de-usar-constantes"&gt;Ventajas de usar constantes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusiones"&gt;Conclusiones&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="constantes-comunes"&gt;Constantes comunes&lt;/h2&gt;
&lt;p&gt;La vida, y particularmente la ciencia, está llena de ejemplos de valores constantes, o valores que nunca cambian. Algunos ejemplos incluyen los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;3.141592653589793&lt;/strong&gt;: Una constante denotada por &lt;code&gt;π&lt;/code&gt;, conocida como Pi, que representa la relación entre la circunferencia de un círculo y su diámetro.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2.718281828459045&lt;/strong&gt;: Una constante denotada por e y conocida como el número de Euler, que está estrechamente relacionada con el logaritmo natural y el interés compuesto.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-273.15&lt;/strong&gt;: Una constante que representa el cero absoluto en grados Celsius, que es igual a 0 kelvins en la escala de temperatura Kelvin.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estos ejemplos son valores constantes que se utilizan comúnmente en la vida cotidiana como en la ciencia. En programación, a menudo te encontrarás manejando estos y muchos otros valores similares.&lt;/p&gt;
&lt;h2 id="constantes-en-python"&gt;Constantes en Python&lt;/h2&gt;
&lt;p&gt;Para crear una constante en Python, se emplea la misma sintaxis que para crear una &lt;a href="/variables-python/"&gt;variable&lt;/a&gt;. Esto es, el operador de asignación (&lt;code&gt;=&lt;/code&gt;) separando el nombre de la constante a la izquierda y el valor a la derecha.&lt;/p&gt;
&lt;p&gt;Como Python no tiene una sintaxis dedicada para definir constantes, la comunidad Python ha asumido y establecido una convención para definir los nombres de las constantes: emplear letras en mayúsculas separando las palabras con guiones bajos o caracteres de subrayado:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.1416&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;EULER_NUMBER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.718281828459045&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;LIGHT_SPEED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;299792458&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;BASE_PATH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/proyectos&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En estos ejemplos, has creado algunas variables mediante la asignación de valores numéricos o de cadena de caracteres.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Como regla general, emplearemos nombres de constantes en idioma inglés puesto que este es el idioma base para la programación actualmente.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;p&gt;A partir de este momento, puedes usar los nombres de estas constantes cuando quieras referirte a sus respectivos valores en tu código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;PI&lt;/span&gt;
&lt;span class="go"&gt;3.1416&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;EULER_NUMBER&lt;/span&gt;
&lt;span class="go"&gt;2.718281828459045&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;LIGHT_SPEED&lt;/span&gt;
&lt;span class="go"&gt;299792458&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;BASE_PATH&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;/proyectos&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puedes usar las constantes para referirte a los valores que estas referencian. Estos valores se encuentran almacenados en posiciones específicas de la memoria de tu computadora. La constante es solo una vía para llegar al valor referenciado a través de un nombre legible.&lt;/p&gt;
&lt;p&gt;Es importante notar que durante la ejecución de tu código, las constantes que has definido no deben cambiar su valor. Es decir, no &lt;em&gt;deberías&lt;/em&gt; reasignar una constante luego de haberla creado. Aunque técnicamente puedes asignar un nuevo valor a estas variables, hacerlo violaría la intención de usarlas como constantes.&lt;/p&gt;
&lt;h2 id="tipos-de-datos-y-constantes"&gt;Tipos de datos y constantes&lt;/h2&gt;
&lt;p&gt;Al igual que las variables, las constantes no tienen un tipo de dato estático. Cuando se habla del tipo de dato de una constante, en realidad se trata del tipo de dato del objeto al que la constante apunta, ya sea un valor numérico o cualquier otro tipo de valor. Python determina este tipo de dato dinámicamente.&lt;/p&gt;
&lt;h2 id="nombres-de-constantes"&gt;Nombres de constantes&lt;/h2&gt;
&lt;p&gt;Los nombres de constantes en Python pueden tener cualquier longitud y consistir en letras mayúsculas (A-Z), dígitos (0-9) y el carácter de subrayado o guión bajo (&lt;code&gt;_&lt;/code&gt;). La única restricción es que, aunque un nombre de constante puede contener dígitos, el primer carácter del nombre no puede ser un dígito.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Para una comprensión más profunda de las convenciones de estilo en Python, puedes consultar la &lt;a href="https://www.python.org/dev/peps/pep-0008/" target="_blank"&gt;Guía de Estilo para el Código Python (PEP 8)&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;p&gt;El uso de mayúsculas sostenidas es una convención y no una restricción del lenguaje. Python no te restringe en este sentido. Es decir, técnicamente, puedes nombrar una constante usando minúsculas, pero estarías violando la convención generalmente aceptada.&lt;/p&gt;
&lt;h2 id="ventajas-de-usar-constantes"&gt;Ventajas de usar constantes&lt;/h2&gt;
&lt;p&gt;Algunas ventajas de usar constantes en lugar de sus valores directamente en tu código incluyen:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ventaja&lt;/th&gt;
&lt;th&gt;Descripción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mejora en la legibilidad&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Un nombre descriptivo que representa un valor en un programa siempre es más legible y explícito que el valor en sí.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mejor mantenibilidad&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Las constantes te permiten usar un único nombre para identificar un valor en todo el código. Si necesitas actualizar el valor de la constante, solo debes modificar el valor en la definición de la constante.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Menor riesgo de errores&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Una constante que representa un valor en todo un programa es menos propensa a errores que tener múltiples instancias explícitas del valor en sí.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Menos necesidad de depuración&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Las constantes permanecen sin cambios durante la ejecución del programa. Dado que siempre tendrán el mismo valor, no deberían causar errores ni bugs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Como ves en esta tabla, las constantes son un concepto importante en programación. Ellas pueden hacer que tu vida sea más fácil y tu código más confiable, mantenible y legible.&lt;/p&gt;
&lt;h2 id="conclusiones"&gt;Conclusiones&lt;/h2&gt;
&lt;p&gt;Has aprendido cómo funcionan las constantes en Python, incluyendo su creación y uso. También has explorado cómo gestionar los nombres de constantes según las convenciones de nombrado empleadas en Python.&lt;/p&gt;
&lt;p&gt;Comprender las constantes es esencial para cualquier desarrollador de Python, pues ellas son fundamentales para manipular y gestionar datos en tus programas.&lt;/p&gt;
&lt;p&gt;Con estas habilidades, estás preparado para explorar conceptos más avanzados y desarrollar aplicaciones más complejas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/constantes-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/></entry><entry><title>Python a través de ejemplos: Variables</title><link href="https://pythonscouts.com/variables-python/" rel="alternate"/><published>2024-10-12T06:00:00+02:00</published><updated>2024-10-12T06:00:00+02:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2024-10-12:/variables-python/</id><summary type="html">&lt;p&gt;En Python, una variable es un nombre simbólico que te permite referenciar un objeto concreto almacenado en la memoria de tu computadora.&lt;/p&gt;</summary><content type="html">&lt;p&gt;En Python, las variables no almacenan objetos concretos. Las variables son como etiquetas que puedes asociar con un valor determinado en la memoria de tu computadora para luego acceder al valor empleando un nombre descriptivo.&lt;/p&gt;
&lt;p&gt;Python utiliza asignación basada en referencias, donde las variables son nombres que apuntan a objetos en la memoria.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/variables-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#variables-en-python"&gt;Variables en Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tipos-de-datos-y-variables"&gt;Tipos de datos y variables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#nombres-de-variables"&gt;Nombres de variables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusiones"&gt;Conclusiones&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="variables-en-python"&gt;Variables en Python&lt;/h2&gt;
&lt;p&gt;Para crear una variable en Python, se emplea el operador de asignación (&lt;code&gt;=&lt;/code&gt;) como se muestra a continuación:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;temperature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;76.7&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Python&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Bienvenidos a pythonscouts.com&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En estos ejemplos, has creado algunas variables mediante la asignación de &lt;a href="/valores-python/"&gt;valores&lt;/a&gt; numéricos o de cadena de caracteres.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;Como regla general, emplearemos nombres de variables en idioma inglés puesto que este es el idioma base para la programación actualmente.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;p&gt;A partir de este momento, puedes usar el nombre de estas variables cuando quieras referirte al valor asignado en tu código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;
&lt;span class="go"&gt;42&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;temperature&lt;/span&gt;
&lt;span class="go"&gt;76.7&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Python&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Bienvenidos a pythonscouts.com&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puedes usar las variables para referirte a los valores que estas referencian. Estos valores se encuentran almacenados en posiciones específicas de la memoria de tu computadora. La variable solo es una vía para llegar al valor referenciado.&lt;/p&gt;
&lt;p&gt;Durante la ejecución de tu código, tus variables pueden variar el valor referenciado. Es por eso que las llamamos &lt;em&gt;variables&lt;/em&gt;. Por ejemplo, el siguiente contador incrementa su valor de uno en uno durante la ejecución del código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Para cambiar el valor referenciado por una variable, lo que hacemos es reasignar la variable para que apunte a otro valor u objeto.&lt;/p&gt;
&lt;h2 id="tipos-de-datos-y-variables"&gt;Tipos de datos y variables&lt;/h2&gt;
&lt;p&gt;Python es un lenguaje de &lt;strong&gt;tipado dinámico&lt;/strong&gt;, lo que significa que el tipo de objeto al que una variable hace referencia puede cambiar durante la ejecución del programa.&lt;/p&gt;
&lt;p&gt;En realidad, las variables en Python no tienen tipo de dato. Los que tienen tipo de dato asociado son los objetos a los que las variables se refieren o apuntan.&lt;/p&gt;
&lt;p&gt;Debido a esto, una variable en Python puede referirse a una cadena en un momento determinado, a un valor numérico en otro momento, y a cualquier otro objeto más tarde:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;
&lt;span class="go"&gt;42&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# Más tarde...&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Una cadena&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Una cadena&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aunque esto es posible hacer que una variable se refiera a objetos de diferentes tipos de dato en diferentes momentos de su vida, esta práctica no es recomendable pues puede ocasionar errores durante la ejecución del código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;UNA CADENA&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo, puedes ver cómo inicialmente la variable referencia un objeto de tipo cadena al cual le puedes aplicar el método &lt;code&gt;.upper()&lt;/code&gt; para convertir todas las letras en mayúsculas.&lt;/p&gt;
&lt;p&gt;Ahora supongamos que un rato más tarde, el código reasigna la variable para referirse a un valor numérico entero. Cuando tratas de aplicar el método &lt;code&gt;.upper()&lt;/code&gt;, recibes una excepción &lt;code&gt;AttributeError&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;AttributeError&lt;/span&gt;: &lt;span class="n"&gt;&amp;#39;int&amp;#39; object has no attribute &amp;#39;upper&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Los enteros no implementan el método &lt;code&gt;.upper()&lt;/code&gt; y esto provoca que tu código falle. Debido a problemas como este, es recomendable que tus variables no cambien el tipo de objetos al que apuntan durante su vida.&lt;/p&gt;
&lt;h2 id="nombres-de-variables"&gt;Nombres de variables&lt;/h2&gt;
&lt;p&gt;Los nombres de variables en Python pueden tener cualquier longitud y consistir en letras mayúsculas (A-Z) y minúsculas (a-z), dígitos (0-9) y el carácter de guión bajo (_). La única restricción es que, aunque un nombre de variable puede contener dígitos, el primer carácter de un nombre de variable no puede ser un dígito.&lt;/p&gt;
&lt;p&gt;La guía de estilo de programación de Python, el PEP 8, recomienda que escribas los nombres de variables en minúsculas con guiones bajos para separar las palabras:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Juan&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;family_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Valdés&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;birth_day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;02-10-2008&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Las variables identifican objetos y, por esta razón, generalmente se emplean sustantivos para los nombres de variables.&lt;/p&gt;
&lt;p&gt;En el caso de nombres que requieren más de una palabra, se emplea un guión bajo para separar las palabras. En este caso, es común emplear un adjetivo junto con un sustantivo.&lt;/p&gt;
&lt;p&gt;Las variables que apuntan a valores Booleanos (&lt;code&gt;True&lt;/code&gt; o &lt;code&gt;False&lt;/code&gt;) generalmente usan los prefijos &lt;code&gt;is_*&lt;/code&gt; y &lt;code&gt;has_*&lt;/code&gt; en inglés:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;is_active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;has_permission&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El uso de estos prefijos es una convención de estilo que ayuda a mejorar la legibilidad del código. No es un requisito estricto del lenguaje.&lt;/p&gt;
&lt;h2 id="conclusiones"&gt;Conclusiones&lt;/h2&gt;
&lt;p&gt;Has aprendido cómo funcionan las variables en Python, incluyendo su creación, asignación y uso. También has explorado el concepto de tipado dinámico y cómo gestionar los nombres de variables según las convenciones más empleadas en Python.&lt;/p&gt;
&lt;p&gt;Comprender las variables es esencial para cualquier desarrollador de Python, pues ellas son fundamentales para manipular y gestionar datos en tus programas.&lt;/p&gt;
&lt;p&gt;Con estas habilidades, estás preparado para explorar conceptos más avanzados y desarrollar aplicaciones más complejas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/variables-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/></entry><entry><title>Python a través de ejemplos: Valores</title><link href="https://pythonscouts.com/valores-python/" rel="alternate"/><published>2024-10-03T20:20:00+02:00</published><updated>2024-10-03T20:20:00+02:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2024-10-03:/valores-python/</id><summary type="html">&lt;p&gt;Python tiene una serie de tipos de datos incorporados para representar números y cadenas de caracteres. Para crear instancias de los tipos de datos, comúnmente usarás valores que también son llamados literales en Python.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Los valores o literales más comunes son los valores numéricos. También encontrarás valores para definir cadenas de caracteres que te sirven para representar texto.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/valores-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#valores-numericos"&gt;Valores numéricos&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#numeros-enteros"&gt;Números enteros&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#numeros-decimales"&gt;Números decimales&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#numeros-complejos"&gt;Números complejos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#valores-de-cadena-de-caracteres"&gt;Valores de cadena de caracteres&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#literales-de-cadena"&gt;Literales de cadena&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#literales-de-cadena-sin-formato"&gt;Literales de cadena sin formato&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusiones"&gt;Conclusiones&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="valores-numericos"&gt;Valores numéricos&lt;/h2&gt;
&lt;p&gt;Los números son una parte fundamental de cualquier programa de computadoras. En la mayoría de los lenguajes de programación, los valores numéricos son representados de manera muy similar a la que se emplea en las matemáticas.&lt;/p&gt;
&lt;h3 id="numeros-enteros"&gt;Números enteros&lt;/h3&gt;
&lt;p&gt;Para definir valores enteros, puedes emplear números positivos y negativos tal y como los usarías en tu clase de matemáticas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;  &lt;span class="c1"&gt;# Cero como un entero&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;  &lt;span class="c1"&gt;# Un entero positivo&lt;/span&gt;
&lt;span class="go"&gt;42&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;  &lt;span class="c1"&gt;# Un entero negativo&lt;/span&gt;
&lt;span class="go"&gt;-100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;También puedes añadir un guión bajo como separador de miles en números de más de tres cifras:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;1000000&lt;/span&gt;  &lt;span class="c1"&gt;# Sin separador de miles en el literal&lt;/span&gt;
&lt;span class="go"&gt;1000000&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;1_000_000&lt;/span&gt;  &lt;span class="c1"&gt;# Con separador de miles en el literal&lt;/span&gt;
&lt;span class="go"&gt;1000000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Esta forma de escribir números enteros mejora significativamente la legibilidad del código.&lt;/p&gt;
&lt;h3 id="numeros-decimales"&gt;Números decimales&lt;/h3&gt;
&lt;p&gt;Para crear valores de coma flotante o decimales, debes añadir un punto (&lt;code&gt;.&lt;/code&gt;) luego de la parte entera y finalmente la fracción decimal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mf"&gt;3.14&lt;/span&gt;  &lt;span class="c1"&gt;# Un decimal positivo&lt;/span&gt;
&lt;span class="go"&gt;3.14&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.001&lt;/span&gt;  &lt;span class="c1"&gt;# Un decimal negativo&lt;/span&gt;
&lt;span class="go"&gt;-0.001&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;  &lt;span class="c1"&gt;# Cero como número decimal&lt;/span&gt;
&lt;span class="go"&gt;0.0&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mf"&gt;1.23e3&lt;/span&gt;  &lt;span class="c1"&gt;# Equivalente a 1.23 * 10^3&lt;/span&gt;
&lt;span class="go"&gt;1230.0&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mf"&gt;5.67E-2&lt;/span&gt;  &lt;span class="c1"&gt;# Equivalente a 5.67 * 10^-2&lt;/span&gt;
&lt;span class="go"&gt;0.0567&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;  &lt;span class="c1"&gt;# Sin cero a la izquierda del punto&lt;/span&gt;
&lt;span class="go"&gt;0.5&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mf"&gt;10.&lt;/span&gt;  &lt;span class="c1"&gt;# Sin fracción decimal especificada&lt;/span&gt;
&lt;span class="go"&gt;10.0&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mf"&gt;1_000_000.02&lt;/span&gt;  &lt;span class="c1"&gt;# Con separador de miles en el literal&lt;/span&gt;
&lt;span class="go"&gt;1000000.02  # Sin separador de miles en la salida&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dependiendo del contexto, puedes escribir los números decimales de diferentes maneras, que son muy similares a como los escribes en matemáticas.&lt;/p&gt;
&lt;p&gt;Sin embargo, la notación científica es un poco diferente. Para expresar un número en esta notación, debes usar la letra &lt;code&gt;e&lt;/code&gt; o &lt;code&gt;E&lt;/code&gt; seguida del exponente.&lt;/p&gt;
&lt;h3 id="numeros-complejos"&gt;Números complejos&lt;/h3&gt;
&lt;p&gt;Finalmente, tienes los valores de números complejos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;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="n"&gt;j&lt;/span&gt;
&lt;span class="go"&gt;(2+3j)&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;
&lt;span class="go"&gt;5j&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mf"&gt;2.5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;7.8&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;
&lt;span class="go"&gt;(2.5+7.8j)&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
&lt;span class="go"&gt;(6+3j)&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;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="n"&gt;j&lt;/span&gt;
&lt;span class="go"&gt;(2-3j)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Los números complejos tienen una parte real y otra imaginaria. En notación matemática, generalmente se emplea la letra &lt;code&gt;i&lt;/code&gt; para la parte imaginaria, pero en Python se usa la &lt;code&gt;j&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="valores-de-cadena-de-caracteres"&gt;Valores de cadena de caracteres&lt;/h2&gt;
&lt;p&gt;Cuando necesitas trabajar con cadenas de caracteres o texto, puedes emplear valores o literales que generalmente se forman con el texto entre comillas.&lt;/p&gt;
&lt;h3 id="literales-de-cadena"&gt;Literales de cadena&lt;/h3&gt;
&lt;p&gt;En Python, puedes usar diferentes tipos de comillas para definir literales de cadenas de caracteres:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Texto entre comillas simples&amp;#39;&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Texto entre comillas simples&amp;#39;&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Texto entre comillas dobles&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Texto entre comillas dobles&amp;#39;&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39;Texto entre comillas simples triplicadas&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="sd"&gt;que ocupa varias líneas físicas&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Texto entre comillas simples triplicadas\nque ocupa varias líneas físicas&amp;#39;&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Texto entre comillas dobles triplicadas&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="sd"&gt;que ocupa varias líneas físicas&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Texto entre comillas dobles triplicadas\nque ocupa varias líneas físicas&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Para crear cadenas de texto que ocupen una única línea física, puedes emplear comillas simples o dobles. Para crear cadenas de texto que ocupen múltiples líneas, emplea comillas simples o dobles triplicadas.&lt;/p&gt;
&lt;p&gt;Ahora bien, ¿qué puedes hacer si necesitas incluir los caracteres de comillas en una cadena de texto? En este caso, puedes alternar las comillas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Alterna &amp;quot;comillas&amp;quot; para incluirlas en el texto&amp;#39;&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Alterna &amp;quot;comillas&amp;quot; para incluirlas en el texto&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este caso, usaste las comillas simples para delimitar la cadena y así poder incluir las comillas dobles en el texto.&lt;/p&gt;
&lt;p&gt;Otra forma de hacerlo es escapar las comillas con una barra invertida (&lt;code&gt;\&lt;/code&gt;) como en el siguiente ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Escapa las &lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;comillas&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt; con un backslash&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Escapa las &amp;quot;comillas&amp;quot; con un backslash&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Python tiene varias otras &lt;a href="https://docs.python.org/es/3/reference/lexical_analysis.html#escape-sequences" target="_blank"&gt;secuencias de escape&lt;/a&gt; que puedes emplear en tus cadenas de caracteres. Estas secuencias implican el uso de la barra invertida y son útiles cuando necesitas incluir caracteres con significado especial en tus cadenas.&lt;/p&gt;
&lt;h3 id="literales-de-cadena-sin-formato"&gt;Literales de cadena sin formato&lt;/h3&gt;
&lt;p&gt;Los literales de cadenas pueden tener como prefijo la letra &lt;code&gt;r&lt;/code&gt; o &lt;code&gt;R&lt;/code&gt;. Estos son literales de cadena sin formato (raw strings) y tratan las barras invertidas como caracteres literales, por lo que son muy útiles y comunes en expresiones regulares.&lt;/p&gt;
&lt;p&gt;Por ejemplo, la expresión regular siguiente te permite identificar direcciones de correo electrónico:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cuando necesitas incluir barras invertidas y otros caracteres que pueden tener significados especiales en tus cadenas, puedes usar cadenas sin formato.&lt;/p&gt;
&lt;p&gt;Finalmente, están las f-strings o literales formateados. Estos te permiten interpolar y formatear valores en tus cadenas empleando campos de reemplazo delimitados por llaves (&lt;code&gt;{}&lt;/code&gt;) en el literal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;5425.9292&lt;/span&gt;

&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Balance general: $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;,.2f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;Balance general: $5,425.93&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El campo de reemplazo en esta f-string contiene una &lt;a href="/variables-python/"&gt;variable&lt;/a&gt; llamada &lt;code&gt;balance&lt;/code&gt;. Esta variable provee el valor que necesitamos interpolar en la cadena. Luego tenemos el especificador de formato que comienza con el caracter de dos puntos (&lt;code&gt;:&lt;/code&gt;). En este caso, formateas el valor como un valor decimal con dos lugares después del punto y empleando una coma (&lt;code&gt;,&lt;/code&gt;) como separador de miles.&lt;/p&gt;
&lt;h2 id="conclusiones"&gt;Conclusiones&lt;/h2&gt;
&lt;p&gt;Ahora sabes lo básico sobre los valores o literales en Python, incluidos valores numéricos como los números enteros, decimales y complejos. También aprendiste sobre los valores de cadenas de caracteres.&lt;/p&gt;
&lt;p&gt;Entender los valores y cómo crearlos es fundamental para cualquier desarrollador de Python, pues estos son la base sobre la que se construyen &lt;a href="/expresiones-python/"&gt;expresiones&lt;/a&gt; y sentencias más elaboradas.&lt;/p&gt;
&lt;p&gt;Ahora que dominas estos conceptos, tienes las puertas abiertas para explorar temas más avanzados en Python.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Series/valores-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Series"/><category term="python"/></entry><entry><title>¿Cómo ejecutar un script Python?</title><link href="https://pythonscouts.com/ejecutar-script-python/" rel="alternate"/><published>2024-03-21T18:40:00+01:00</published><updated>2024-03-21T18:40:00+01:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2024-03-21:/ejecutar-script-python/</id><summary type="html">&lt;p&gt;Un script Python es un archivo que contiene una secuencia de código Python ejecutable. Este tipo de archivo está diseñado para ser ejecutado directamente, de la misma manera que un programa o aplicación.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ser capaz de ejecutar tus scripts y programas es una de las habilidades más importantes que debes tener como programador Python. En realidad ejecutar el código es la única forma de asegurarte que funciona como esperas. Además, para qué escribir código sino para ejecutarlo y que haga cosas por ti?&lt;/p&gt;
&lt;p&gt;En este tutorial, aprenderás qué es un script o programa ejecutable en Python, cómo ejecutar scripts usando el comando &lt;code&gt;python&lt;/code&gt; o el propio script como un comando. Finalmente, aprenderás que también es posible ejecutar tus scripts desde tu IDE o editor de texto favorito, lo cual es muy conveniente durante el proceso de desarrollo.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Guías/ejecutar-script-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#scripts-y-programas-en-python"&gt;Scripts y programas en Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejecutar-scripts-con-el-comando-python"&gt;Ejecutar scripts con el comando python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejecutar-scripts-directamente-como-un-comando"&gt;Ejecutar scripts directamente como un comando&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#en-sistemas-unix"&gt;En sistemas Unix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#en-sistemas-windows"&gt;En sistemas Windows&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#ejecutar-scripts-desde-un-ide-o-editor-de-texto"&gt;Ejecutar scripts desde un IDE o editor de texto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="scripts-y-programas-en-python"&gt;Scripts y programas en Python&lt;/h2&gt;
&lt;p&gt;En informática, el término &lt;strong&gt;script&lt;/strong&gt; se emplea para designar un archivo que contiene una secuencia lógica de órdenes o comandos que un ordenador puede ejecutar. Con esto en mente, puedes definir un &lt;strong&gt;script Python&lt;/strong&gt; como una secuencia de instrucciones escritas en este lenguaje y que se almacena en un archivo de texto plano. Este archivo está diseñado para ser ejecutado directamente por el usuario.&lt;/p&gt;
&lt;p&gt;El término script también suele emplearse para designar archivos que contienen código &lt;strong&gt;interpretado&lt;/strong&gt;. Es decir, código que requiere un intérprete que lo ejecute. Por ejemplo, los scripts que regularmente se emplean en sistemas Unix y que son escritos en lenguaje &lt;a href="https://es.wikipedia.org/wiki/Bash" target="_blank"&gt;Bash&lt;/a&gt; u otro lenguaje &lt;a href="https://es.wikipedia.org/wiki/Shell_de_Unix" target="_blank"&gt;shell&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Los scripts pueden categorizarse como programas ejecutables. La diferencia es que los scripts son más simples que los programas o aplicaciones. Generalmente, se encargan de tareas específicas y poco complejas. Por ejemplo, puedes tener scripts para renombrar archivos en tu disco duro, automatizar la descarga de archivos, actualizar tu sistema, u otras tareas similares.&lt;/p&gt;
&lt;p&gt;En contraste, los programas suelen ser más complejos y tener muchas más funcionalidades. Un editor de texto, un navegador, un particionador de discos son todos ejemplos de programas o aplicaciones. En cualquier caso, si usas Python para crear proyectos complejos como estos, tendrás un script de entrada (entry-point script) que te permite ejecutar el programa en cuestión.&lt;/p&gt;
&lt;h2 id="ejecutar-scripts-con-el-comando-python"&gt;Ejecutar scripts con el comando &lt;code&gt;python&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Probablemente la manera más comúnmente empleada para ejecutar un script Python es usando el comando &lt;code&gt;python&lt;/code&gt; desde la línea de comandos o terminal del sistema operativo. Antes de entrar en el comando específico, abre tu editor de texto favorito, crea un nuevo archivo &lt;code&gt;.py&lt;/code&gt; y escribe el código siguiente en él:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - hello.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Hola, Mundo!&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este script es el típico programa &lt;a href="/python-hola-mundo/"&gt;&lt;code&gt;"Hola, Mundo!"&lt;/code&gt;&lt;/a&gt; que generalmente escribes cuando comienzas a aprender un lenguaje de programación. Guarda el archivo en tu directorio de trabajo y llámalo &lt;code&gt;hello.py&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Abre una ventana de terminal en tu directorio de trabajo actual y ejecuta el siguiente comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;hello.py
&lt;span class="go"&gt;Hola, Mundo!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Inmediatamente después de presionar &lt;em&gt;Enter&lt;/em&gt;, verás en pantalla la frase &lt;code&gt;Hola, Mundo!&lt;/code&gt;. Con eso acabas de ejecutar tu primer script Python! Es muy probable que uses esta forma de ejecutar scripts a menudo en tu ciclo de desarrollo o incluso en tus tareas diarias.&lt;/p&gt;
&lt;p&gt;En sistemas Windows, además del comando &lt;code&gt;python&lt;/code&gt;, también puedes emplear el lanzador &lt;code&gt;py&lt;/code&gt; desde &lt;a href="https://es.wikipedia.org/wiki/PowerShell" target="_blank"&gt;PowerShell&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Powershell&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Hola&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mundo&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El lanzador &lt;code&gt;py&lt;/code&gt; está disponible en todas las versiones de Python a partir de 3.3, así que no debes tener problemas para emplearlo.&lt;/p&gt;
&lt;h2 id="ejecutar-scripts-directamente-como-un-comando"&gt;Ejecutar scripts directamente como un comando&lt;/h2&gt;
&lt;p&gt;Si estás acostumbrado a crear scripts Python utilitarios para automatizar tareas repetitivas en tu entorno de trabajo, entonces es probable que desees simplificar el proceso de ejecución. En la mayoría de los casos sería más práctico ejecutar el script directamente como un comando independiente sin el auxilio del comando &lt;code&gt;python&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En las secciones siguientes, aprenderás cómo preparar tus scripts Python para ejecución directa desde la terminal de tu sistema operativo.&lt;/p&gt;
&lt;h3 id="en-sistemas-unix"&gt;En sistemas Unix&lt;/h3&gt;
&lt;p&gt;En sistemas Unix, como macOS y Linux, es posible ejecutar un script directamente desde la línea de comandos con unos pequeños arreglos. Primeramente, debes añadir un comentario especial a tu script justo en la primera línea:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - hello.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Hola, Mundo!&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este comentario especial es conocido como &lt;a href="https://es.wikipedia.org/wiki/Shebang" target="_blank"&gt;shebang&lt;/a&gt; y lo puede incluir en tu código fuente para decirle al shell de tu sistema operativo dónde puede encontrar el intérprete requerido para ejecutar el código del archivo.&lt;/p&gt;
&lt;p&gt;Para ejecutar un script Python que ya incluye el shebang apropiado, debes también asignarle permisos de ejecución con el siguiente comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;+x&lt;span class="w"&gt; &lt;/span&gt;hello.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Con este comando, le asignas permisos de ejecución a tu script. Ahora estás listo para ejecutarlo directamente empleando el nombre del archivo en la terminal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;./hello.py
&lt;span class="go"&gt;Hola, Mundo!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Listo! Tu script ahora funciona como si fuese un comando. Si deseas que tu script se parezca aún más a un comando estándar, puedes remover de su nombre la extensión &lt;code&gt;.py&lt;/code&gt;. Adicionalmente, puedes añadir el directorio que contiene tu script en el &lt;a href="https://es.wikipedia.org/wiki/PATH_(inform%C3%A1tica)" target="_blank"&gt;&lt;code&gt;PATH&lt;/code&gt;&lt;/a&gt; de tu sistema y lo tendrás disponible como un comando real desde cualquier directorio de trabajo.&lt;/p&gt;
&lt;h3 id="en-sistemas-windows"&gt;En sistemas Windows&lt;/h3&gt;
&lt;p&gt;En sistemas Windows con Python &lt;a href="/instalar-python-windows/"&gt;instalado&lt;/a&gt;, puedes ejecutar un script directamente desde una ventana de PowerShell abierta en el directorio que contiene el script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Powershell&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Hola&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mundo&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Esta técnica funciona gracias a que Windows automáticamente asocia los archivos &lt;code&gt;.py&lt;/code&gt; y &lt;code&gt;.pyw&lt;/code&gt; con los programas &lt;code&gt;python.exe&lt;/code&gt; y &lt;code&gt;pythonw.exe&lt;/code&gt;, respectivamente.&lt;/p&gt;
&lt;h2 id="ejecutar-scripts-desde-un-ide-o-editor-de-texto"&gt;Ejecutar scripts desde un IDE o editor de texto&lt;/h2&gt;
&lt;p&gt;Otra vía que puedes emplear para ejecutar tus scripts Python es usar un IDE (Integrated Development Environment, por sus siglas en inglés) como &lt;a href="https://www.jetbrains.com/es-es/pycharm/" target="_blank"&gt;PyCharm&lt;/a&gt; o un editor de código avanzado, como puede ser &lt;a href="https://code.visualstudio.com/" target="_blank"&gt;Visual Studio Code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Existe una amplia variedad de estos programas, muchos de ellos disponibles para las distintas plataformas (Windows, Linux, macOS) y que además, se pueden descargar libremente desde Internet.&lt;/p&gt;
&lt;p&gt;El IDE por defecto incluido en cualquier instalación estándar de Python es &lt;a href="https://docs.python.org/es/3/library/idle.html#idle" target="_blank"&gt;IDLE&lt;/a&gt; y lo puedes emplear para escribir, ejecutar, depurar y modificar tus scripts.&lt;/p&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;Ya sabes cómo correr o ejecutar scripts Python por diferentes vías y en diferentes plataformas. Ahora puedes ejecutar tus scripts desde la línea de comandos o terminal de tu sistema, ya sea usando el comando &lt;code&gt;python&lt;/code&gt; o usando el script directamente como un programa ejecutable. También aprendiste que los IDEs y editores de código generalmente incluyen opciones para la ejecución de tus scripts y programas.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Guías/ejecutar-script-python" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Guías"/><category term="python"/></entry><entry><title>¿Cómo instalar Python en tu sistema operativo Windows?</title><link href="https://pythonscouts.com/instalar-python-windows/" rel="alternate"/><published>2023-09-25T17:30:00+02:00</published><updated>2023-09-25T17:30:00+02:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2023-09-25:/instalar-python-windows/</id><summary type="html">&lt;p&gt;Instalar Python en tu computador es el primer paso para aprender el lenguaje. Si usas Windows 10 o superior, aquí encontrarás los pasos necesarios para hacerlo.&lt;/p&gt;</summary><content type="html">&lt;p&gt;En esta guía, emplearás el &lt;strong&gt;instalador oficial&lt;/strong&gt; para Windows que puedes descargar desde &lt;a href="https://www.python.org/" target="_blank"&gt;&lt;code&gt;Python.org&lt;/code&gt;&lt;/a&gt;. También conocerás cómo instalar Python desde la tienda de aplicaciones &lt;strong&gt;Microsoft Store&lt;/strong&gt;. Esta última opción es la recomendada por Microsoft, aunque el instalador oficial funciona perfectamente.&lt;/p&gt;
&lt;p&gt;Para seguir esta guía de instalación de Python, es recomendable que tengas experiencia de trabajo en Windows. Es también importante que tengas experiencia de trabajo con la terminal del sistema, PowerShell.&lt;/p&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#prerequisitos"&gt;Prerequisitos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#instalar-python-en-windows-usando-el-instalador-oficial"&gt;Instalar Python en Windows usando el instalador oficial&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#paso-1-descargar-el-instalador-de-python-para-windows"&gt;Paso 1: Descargar el instalador de Python para Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#paso-2-ejecutar-el-instalador-de-python"&gt;Paso 2: Ejecutar el instalador de Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#paso-3-verificar-la-instalacion-de-python"&gt;Paso 3: Verificar la instalación de Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#instalar-python-desde-microsoft-store"&gt;Instalar Python desde Microsoft Store&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="prerequisitos"&gt;Prerequisitos&lt;/h2&gt;
&lt;p&gt;Para completar los pasos de esta guía de instalación de Python en Windows, necesitas una computadora con Windows 10 o superior y conexión a Internet. Además, puedes requerir privilegios administrativos en dependencia del tipo de instalación que decidas hacer.&lt;/p&gt;
&lt;p&gt;Lo demás es seguir las instrucciones debajo, las cuales te guiarán en la instalación tanto usando el instalador oficial como el que está disponible en la tienda de aplicaciones de Microsoft.&lt;/p&gt;
&lt;h2 id="instalar-python-en-windows-usando-el-instalador-oficial"&gt;Instalar Python en Windows usando el instalador oficial&lt;/h2&gt;
&lt;p&gt;En general, la manera recomendada para instalar Python en una computadora con Windows es emplear el instalador oficial que provee la &lt;a href="https://www.python.org/psf-landing/" target="_blank"&gt;Python Software Foundation (PSF)&lt;/a&gt; en el sitio web del lenguaje, &lt;a href="https://www.python.org/" target="_blank"&gt;&lt;code&gt;Python.org&lt;/code&gt;&lt;/a&gt;. Los pasos para completar la instalación son los siguientes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Descargar el instalador de Python para Windows desde la &lt;a href="https://www.python.org/downloads/" target="_blank"&gt;página de descargas&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Ejecutar el instalador y seguir las instrucciones en pantalla.&lt;/li&gt;
&lt;li&gt;Verificar que la instalación se completó con éxito.&lt;/li&gt;
&lt;li&gt;🐍&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A continuación encontrarás una explicación detallada de estos pasos. Presta especial atención al paso número dos, pues de él depende el éxito de la instalación.&lt;/p&gt;
&lt;h3 id="paso-1-descargar-el-instalador-de-python-para-windows"&gt;Paso 1: Descargar el instalador de Python para Windows&lt;/h3&gt;
&lt;p&gt;El primer paso para instalar Python en Windows es descargar el &lt;a href="https://www.python.org/downloads/windows/" target="_blank"&gt;instalador&lt;/a&gt; desde la página oficial de descargas de &lt;a href="https://www.python.org/" target="_blank"&gt;&lt;code&gt;Python.org&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-windows/sitio-python.org.png" class="img-fluid mt-2" alt="Sitio oficial de Python"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Sitio oficial de Python&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Una vez en esta página, selecciona la opción &lt;em&gt;Downloads&lt;/em&gt;. Generalmente, cuando seleccionas esta opción, el sitio reconoce tu sistema operativo actual y te lleva directamente a la página de descargas correspondiente.&lt;/p&gt;
&lt;p&gt;Deberás ver la siguiente página en tu pantalla:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-windows/pagina-descargas-python.png" class="img-fluid mt-2" alt="Página de descargas de Python para Windows"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Página de descargas de Python para Windows&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Una vez en la página de descargas, es recomendable que descargues la versión más reciente de Python que aparecerá como la primera opción. De esta manera, tendrás acceso a las últimas novedades del lenguaje y estarás al día con las correcciones de errores y los parches de seguridad.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;En esta guía, emplearás el instalador ejecutable (&lt;code&gt;.exe&lt;/code&gt;) que puedes obtener haciendo clic en el botón amarillo.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;p&gt;Luego de estas consideraciones, haz clic en la versión de tu preferencia para comenzar la descarga del instalador de Python. Concluida la descarga, estás listo para el próximo paso.&lt;/p&gt;
&lt;h3 id="paso-2-ejecutar-el-instalador-de-python"&gt;Paso 2: Ejecutar el instalador de Python&lt;/h3&gt;
&lt;p&gt;Ejecuta el instalador de Python, ya sea desde tu carpeta de descargas o desde tu navegador de Internet. Al ejecutar el programa, aparecerá la ventana siguiente en tu pantalla:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-windows/instalador-python-ventana-inicial.png" class="mx-auto d-block mt-2" alt="Instalador de Python, ventana inicial"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Instalador de Python, ventana inicial&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Es la ventana inicial del instalador de Python. Sí, está en inglés, pero no hay de qué preocuparse. Tómalo como una práctica necesaria. Además, es probable que en tu ordenador te aparezca en español.&lt;/p&gt;
&lt;p&gt;En esta pantalla, inicia el instalador de Python 3.11.5 (64-bit) para Windows. Hay algo importante que debes hacer ahora y es seleccionar la opción &lt;em&gt;Add python.exe to PATH&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-windows/instalador-python-ventana-inicial-path.png" class="mx-auto d-block mt-2" alt="Instalador de Python, ventana inicial - Añadir Python al path del sistema"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Instalador de Python, ventana inicial - Añadir Python al path del sistema&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Con esto, el instalador añadirá el ejecutable de Python al &lt;em&gt;path&lt;/em&gt; (ruta) del sistema operativo. Así, podrás ejecutar el comando &lt;code&gt;python&lt;/code&gt; directamente desde la terminal PowerShell y Windows sabrá donde encontrar el ejecutable.&lt;/p&gt;
&lt;p&gt;Una vez hecha la selección, tienes dos opciones. Puedes hacer clic en:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Install Now&lt;/em&gt; (Instalar Ahora) para comenzar la instalación &lt;strong&gt;standard&lt;/strong&gt; de Python&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Customize installation&lt;/em&gt; (Personalizar instalación) para personalizar la instalación con opciones adicionales&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En esta guía, seleccionarás la segunda opción, la cual te lleva a la segunda ventana del instalador, &lt;em&gt;Optional Features&lt;/em&gt; (Características Opcionales), que luce así:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-windows/instalador-python-segunda-ventana-caracteristicas-opcionales.png" class="mx-auto d-block mt-2" alt="Instalador de Python, segunda ventana - Características Opcionales"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Instalador de Python, segunda ventana - Características Opcionales&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;En esta ventana, todas las opciones están seleccionadas por defecto, lo cual es recomendable. Sin embargo, si no tienes pensado emplear IDLE en tu proceso de aprendizaje y desarrollo, entonces puedes desmarcar esta opción. El resto de las opciones deberías mantenerlas seleccionadas para evitar futuros problemas.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;IDLE es el entorno de desarrollo integrado (IDE) por defecto de Python. Este programa provee una interfaz gráfica para trabajo con el lenguaje y su intérprete. Como regla general, está incluido en el instalador oficial en todas sus versiones.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;p&gt;Una vez que hayas decidido las características opcionales que deseas, puedes hacer clic en el botón &lt;em&gt;Next&lt;/em&gt; (Siguiente) para continuar. Te aparecerá la siguiente ventana:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-windows/instalador-python-tercera-ventana-opciones-avanzadas.png" class="mx-auto d-block mt-2" alt="Instalador de Python, tercera ventana - Opciones Avanzadas"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Instalador de Python, tercera ventana - Opciones Avanzadas&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;En esta ventana, tienes unas cuantas opciones avanzadas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install for all users&lt;/strong&gt; (Instalar para todos los usuarios): Recomendada si no eres el único usuario que usará Python en esta computadora. Requiere privilegios administrativos.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Associate files with Python&lt;/strong&gt; (Asociar archivos con Python): Recomendada porque esta opción asocia los archivos Python con el lanzador y el editor de código.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create shortcuts for installed applications&lt;/strong&gt; (Crear accesos directos para las aplicaciones instaladas): Recomendada, pues crea accesos directos que te permitirán acceder a Python y sus aplicaciones de forma rápida.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add Python to environment variables&lt;/strong&gt; (Añadir Python a las variables de entorno): Recomendada porque habilita la ejecución directa de Python.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Precompile standard library&lt;/strong&gt; (Precompilar la biblioteca estándar): No requerida. Esta opción precompila los archivos Python de la biblioteca estándar, lo cual puede demorar la instalación.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Download debugging symbols&lt;/strong&gt; and &lt;strong&gt;Download debug binaries&lt;/strong&gt;: Recomendadas cuando planeas crear extensiones en C o C++.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para seguir esta guía, deberás seleccionar la primera opción:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-windows/instalador-python-tercera-ventana-opciones-avanzadas-seleccion.png" class="mx-auto d-block mt-2" alt="Instalador de Python, tercera ventana - Selección de Opciones Avanzadas"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Instalador de Python, tercera ventana - Selección de Opciones Avanzadas&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Notarás que la opción de precompilar la instalación se selecciona automáticamente. Este comportamiento tiene el fin de optimizar el funcionamiento de Python cuando lo instalas para varios usuarios y estos pueden no tener acceso de escritura en el directorio destino, el cual también cambia automáticamente.&lt;/p&gt;
&lt;p&gt;Luego, haz clic en el botón &lt;em&gt;Install&lt;/em&gt; (Instalar) para comenzar la instalación de Python. Verás la siguiente ventana en tu pantalla:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-windows/instalador-python-cuarta-ventana-instalacion.png" class="mx-auto d-block mt-2" alt="Instalador de Python - Ventana de instalación"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Instalador de Python - Ventana de instalación&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;La instalación no debe tomar mucho tiempo. En cualquier caso, puedes recostarte y relajarte mientras el instalador hace su trabajo. Una vez concluido el proceso, aparecerá la ventana de instalación exitosa:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-windows/instalador-python-quinta-ventana-resumen.png" class="mx-auto d-block mt-2" alt="Instalador de Python - Ventana de resumen"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Instalador de Python - Ventana de resumen&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Esta ventana es la confirmación de que ha concluido la instalación de Python en tu sistema operativo Windows. Es recomendable que visites el link a la página sobre &lt;a href="https://docs.python.org/es/3.11/using/windows.html" target="_blank"&gt;cómo usar Python en Windows&lt;/a&gt;. Allí encontrarás información valiosa que puede servirte de mucho.&lt;/p&gt;
&lt;h3 id="paso-3-verificar-la-instalacion-de-python"&gt;Paso 3: Verificar la instalación de Python&lt;/h3&gt;
&lt;p&gt;Una vez que hayas ejecutado los pasos anteriores, Python estará instalado en tu sistema operativo. Para confirmar que lo tienes, abre una ventana de PowerShell y ejecuta el comando siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Powershell&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-version&lt;/span&gt;
&lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="n"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;11&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este comando imprime la versión de Python que tienes instalada por defecto. Con esto has concluido la instalación de Python usando el instalador oficial para Windows. Ahora estás listo para escribir tu &lt;a href="/python-hola-mundo/"&gt;primer programa&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="instalar-python-desde-microsoft-store"&gt;Instalar Python desde Microsoft Store&lt;/h2&gt;
&lt;p&gt;Para los usuarios que comienzan con Python en un sistema operativo Windows, Microsoft recomienda instalar la aplicación desde su tienda de aplicaciones. Si prefieres instalar Python de esta forma, entonces puedes seguir los pasos siguientes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ve al menú &lt;em&gt;Inicio&lt;/em&gt; y escribe &lt;code&gt;Microsoft Store&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Haz clic en el enlace para abrir la tienda.&lt;/li&gt;
&lt;li&gt;Selecciona la barra de &lt;em&gt;Búsqueda&lt;/em&gt; y escribe &lt;code&gt;Python&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Selecciona qué versión de Python que te gustaría usar. Nuevamente, deberías usar la versión más reciente para que tengas disponibles las nuevas características del lenguaje.&lt;/li&gt;
&lt;li&gt;Haz clic en &lt;em&gt;Obtener&lt;/em&gt; (&lt;em&gt;Get&lt;/em&gt;) para descargar e instalar la versión seleccionada.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Una vez ejecutados esto pasos, deberás tener Python instalado en tu sistema operativo. Nuevamente, para confirmar que la instalación fue exitosa, abre tu PowerShell y ejecutar el comando siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Powershell&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;PS&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-version&lt;/span&gt;
&lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="n"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;11&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El instalador de Python disponible en la tienda de aplicaciones Microsoft Store también incluye &lt;a href="https://pip.pypa.io/en/stable/" target="_blank"&gt;&lt;code&gt;pip&lt;/code&gt;&lt;/a&gt;, el gestor de paquetes por defecto de Python. Puedes confirmar que &lt;code&gt;pip&lt;/code&gt; también está instalado ejecutando &lt;code&gt;pip --version&lt;/code&gt; en tu sesión de PowerShell.&lt;/p&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;Instalar Python en tu ordenador es el primer paso en tu empeño de aprender a programar con el lenguaje. Nuevamente, recuerda que los pasos a seguir para completar la instalación con el instalador oficial para Windows son los siguientes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Descargar el instalador de Python para Windows desde la &lt;a href="https://www.python.org/downloads/" target="_blank"&gt;página de descargas&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Ejecutar el instalador y seguir las instrucciones en pantalla.&lt;/li&gt;
&lt;li&gt;Verificar que la instalación se completó con éxito.&lt;/li&gt;
&lt;li&gt;🐍&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Luego de completados estos pasos, estás listo para comenzar a explorar las bondades de Python como lenguaje de programación.&lt;/p&gt;</content><category term="Guías"/><category term="python"/><category term="windows"/></entry><entry><title>¿Cómo instalar Python en tu sistema operativo macOS?</title><link href="https://pythonscouts.com/instalar-python-macos/" rel="alternate"/><published>2023-08-29T19:00:00+02:00</published><updated>2023-08-29T19:00:00+02:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2023-08-29:/instalar-python-macos/</id><summary type="html">&lt;p&gt;Instalar Python en tu computadora es el primer paso para aprender el lenguaje. Si tienes una computadora Mac, aquí aprenderás los pasos necesarios para instalar Python de manera rápida y confiable en el sistema operativo macOS.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Para instalar Python, emplearás el &lt;strong&gt;instalador oficial&lt;/strong&gt; para macOS que puedes descargar desde &lt;a href="https://www.python.org/" target="_blank"&gt;&lt;code&gt;Python.org&lt;/code&gt;&lt;/a&gt;. Es recomendable que tengas experiencia de trabajo en sistemas macOS para poder seguir esta guía de instalación de Python. Es especialmente importante tener conocimientos básicos sobre la terminal del sistema y cómo emplearla.&lt;/p&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#prerequisitos"&gt;Prerequisitos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#instalar-python-en-macos-usando-el-instalador-oficial"&gt;Instalar Python en macOS usando el instalador oficial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#paso-1-descargar-el-instalador-de-python-para-macos"&gt;Paso 1: Descargar el instalador de Python para macOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#paso-2-ejecutar-el-instalador-de-python"&gt;Paso 2: Ejecutar el instalador de Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#paso-3-verificar-la-instalacion"&gt;Paso 3: Verificar la instalación&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="prerequisitos"&gt;Prerequisitos&lt;/h2&gt;
&lt;p&gt;Para completar los pasos de esta guía de instalación de Python en macOS, necesitas una computadora con este sistema operativo. Además, requieres tener privilegios root y una conexión a Internet.&lt;/p&gt;
&lt;p&gt;Lo demás es solo seguir las instrucciones más abajo!&lt;/p&gt;
&lt;h2 id="instalar-python-en-macos-usando-el-instalador-oficial"&gt;Instalar Python en macOS usando el instalador oficial&lt;/h2&gt;
&lt;p&gt;La manera recomendada para instalar Python en una computadora Mac es emplear el instalador oficial que provee la &lt;a href="https://www.python.org/psf-landing/" target="_blank"&gt;Python Software Foundation (PSF)&lt;/a&gt; en el sitio web del lenguaje, &lt;a href="https://www.python.org/" target="_blank"&gt;&lt;code&gt;Python.org&lt;/code&gt;&lt;/a&gt;. Los pasos para completar la instalación son los siguientes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Descargar el instalador de Python para macOS desde la &lt;a href="https://www.python.org/downloads/" target="_blank"&gt;página de descargas&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Ejecutar el instalador y seguir las instrucciones en pantalla.&lt;/li&gt;
&lt;li&gt;Verificar que la instalación se completó con éxito.&lt;/li&gt;
&lt;li&gt;🐍&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A continuación encontrarás una explicación detallada de estos pasos. Presta especial atención al paso número dos. De él dependerá el éxito de la instalación.&lt;/p&gt;
&lt;h2 id="paso-1-descargar-el-instalador-de-python-para-macos"&gt;Paso 1: Descargar el instalador de Python para macOS&lt;/h2&gt;
&lt;p&gt;Lo primero que debes hacer es descargar el instalador de Python para macOS desde el sitio oficial del lenguaje, &lt;a href="https://www.python.org/" target="_blank"&gt;Python.org&lt;/a&gt;, que luce de la manera siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-macos/sitio-python.org.png" class="img-fluid mt-2" alt="Sitio oficial de Python"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Sitio oficial de Python&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Una vez en esta página, selecciona la opción &lt;em&gt;Downloads&lt;/em&gt;. Generalmente, cuando seleccionas esta opción, el sitio reconoce tu sistema operativo actual y te lleva directamente a la página de descargas correspondiente.&lt;/p&gt;
&lt;p&gt;Deberás ver la siguiente página en tu pantalla:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-macos/pagina-descargas-python.png" class="img-fluid mt-2" alt="Página de descargas de Python para macOS"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Página de descargas de Python para macOS&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Una vez en la página de descargas, es recomendable que descargues la versión más reciente que aparecerá como la primera opción. De esta manera, tendrás acceso a las últimas novedades del lenguaje y estarás al día con las correcciones de errores y los parches de seguridad.&lt;/p&gt;
&lt;p&gt;También puedes seleccionar una versión más antigua si lo deseas. Para esto, desplázate hacia abajo en la página de descargas e identifica la versión deseada.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;En esta guía, emplearás el instalador universal (&lt;code&gt;.pkg&lt;/code&gt;) de 64-bit para macOS 10.9 o superior. Este instalador provee la versión 3.11.5 de Python. Puedes descargarlo directamente haciendo clic en el botón amarillo.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;p&gt;Luego de estas consideraciones, haz clic en la versión de tu preferencia para comenzar la descarga del instalador de Python. Una vez concluida la descarga, estás listo para el próximo paso.&lt;/p&gt;
&lt;h2 id="paso-2-ejecutar-el-instalador-de-python"&gt;Paso 2: Ejecutar el instalador de Python&lt;/h2&gt;
&lt;p&gt;Ejecuta el instalador de Python ya sea desde tu carpeta de descargas, desde tu navegador, o desde el dock de tu escritorio macOS. Al ejecutar el programa, aparecerá la ventana siguiente en tu pantalla:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-macos/instalador-python-ventana-inicial.png" class="img-fluid mt-2" alt="Instalador de Python, ventana inicial"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Instalador de Python, ventana inicial&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Es la ventana inicial del instalador de Python. Sí, está en inglés, pero no hay de qué preocuparse. Tómalo como una práctica necesaria. Además, es probable que en tu ordenador te aparezca todo en español.&lt;/p&gt;
&lt;p&gt;En esta pantalla, Python 3.11.5 te da la bienvenida a su instalador. Se trata de la versión diseñada para macOS 10.9 o superior.&lt;/p&gt;
&lt;p&gt;Puedes hacer clic en el botón &lt;em&gt;Continue&lt;/em&gt; (Continuar) para proseguir con la instalación. Esta acción te lleva a la segunda ventana del instalador, &lt;em&gt;Read Me&lt;/em&gt;, la cual luce de la manera siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-macos/instalador-python-segunda-ventana-readme.png" class="img-fluid mt-2" alt="Instalador de Python, segunda ventana: Readme"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Instalador de Python, segunda ventana: Readme&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;En esta ventana, encontrarás información importante sobre la instalación. Puedes leer todo el contenido si lo deseas. Una vez que concluyas la lectura, haz clic nuevamente en el botón &lt;em&gt;Continue&lt;/em&gt;. Accederás a la tercera ventana del instalador:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-macos/instalador-python-tercera-ventana-licencia.png" class="img-fluid mt-2" alt="Instalador de Python, tercera ventana: Licencia"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Instalador de Python, tercera ventana: Licencia&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Aquí encontrarás información sobre la licencia de software bajo la cual se distribuye Python. Nuevamente, puedes leerla si es un tema que te interesa. Para tu tranquilidad, la licencia de Python permite el uso del lenguaje tanto en aplicaciones de &lt;a href="https://es.wikipedia.org/wiki/C%C3%B3digo_abierto" target="_blank"&gt;código abierto&lt;/a&gt;, como en proyectos comerciales.&lt;/p&gt;
&lt;p&gt;Haz clic en el botón &lt;em&gt;Continue&lt;/em&gt; y acepta los términos de la licencia para proseguir. La siguiente ventana te permitirá seleccionar el disco de tu Mac donde deseas instalar Python. Si tu Mac tiene la configuración de discos por defecto, entonces el disco destino será &lt;strong&gt;Macintosh HD&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-macos/instalador-python-cuarta-ventana-hd-destino.png" class="img-fluid mt-2" alt="Instalador de Python, cuarta ventana: Disco destino"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Instalador de Python, cuarta ventana: Disco destino&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Con la configuración de discos por defecto, no tienes que realizar ningún paso adicional. Solo haz clic nuevamente en el botón &lt;em&gt;Continue&lt;/em&gt; del instalador.&lt;/p&gt;
&lt;p&gt;La próxima ventana te permitirá seleccionar el tipo de instalación. Aquí tienes dos opciones:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Instalación &lt;strong&gt;estándar&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Instalación &lt;strong&gt;personalizada&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La ventana de instalación estándar luce como se muestra a continuación:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-macos/instalador-python-quinta-ventana-instalacion-estandard.png" class="img-fluid mt-2" alt="Instalador de Python, quinta ventana: Instalación estándar"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Instalador de Python, quinta ventana: Instalación estándar&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Este tipo de instalación incluye todas las funcionalidades de Python para macOS. Por lo tanto, es la instalación recomendada si estás comenzando con Python.&lt;/p&gt;
&lt;p&gt;Si deseas personalizar tu instalación, puedes seleccionar el botón &lt;em&gt;Customize&lt;/em&gt; para acceder a la vista siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-macos/instalador-python-quinta-ventana-instalacion-personalizada.png" class="img-fluid mt-2" alt="Instalador de Python, quinta ventana: Instalación personalizada"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Instalador de Python, quinta ventana: Instalación personalizada&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;En esta ventana, puedes hacer clic en cada una de las opciones para obtener información adicional. Por ejemplo, si pinchas la opción &lt;em&gt;GUI Applications&lt;/em&gt;, obtendrás la siguiente vista:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-macos/instalador-python-quinta-ventana-instalacion-personalizada-opciones.png" class="img-fluid mt-2" alt="Instalador de Python, quinta ventana: Instalación personalizada, opciones"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Instalador de Python, quinta ventana: Instalación personalizada, opciones&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Si no tienes pensado emplear IDLE en tu proceso de aprendizaje y desarrollo, entonces puedes desmarcar esta opción. El resto de las opciones son recomendables para evitar futuros problemas, así que no deberías desmarcarlas.&lt;/p&gt;
&lt;!-- markdownlint-disable MD046 MD013 --&gt;
&lt;div class="admonition note"&gt;
&lt;p&gt;IDLE es el entorno de desarrollo integrado (IDE) por defecto de Python. Este programa provee una interfaz gráfica para trabajo con el lenguaje y su intérprete. Como regla general, está incluido en el instalador oficial en todas sus versiones.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- markdownlint-enable MD046 MD013 --&gt;

&lt;p&gt;Una vez que hayas personalizado tu instalación, puedes hacer clic en el botón &lt;em&gt;Install&lt;/em&gt; para comenzar. Deberás introducir tu nombre de usuario y tu contraseña. Ten en cuenta que debes tener privilegios administrativos para concluir la instalación.&lt;/p&gt;
&lt;p&gt;El proceso de instalación comenzará:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-macos/instalador-python-sexta-ventana-instalacion.png" class="img-fluid mt-2" alt="Instalador de Python, sexta ventana: Instalación"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Instalador de Python, sexta ventana: Instalación&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;La instalación no debe tomar mucho tiempo. En cualquier caso, puedes recostarte y relajarte mientras el instalador de Python hace su trabajo. Una vez concluido el proceso, recibirás un resumen de la instalación:&lt;/p&gt;
&lt;p&gt;&lt;img src="../images/articles/instalar-python-macos/instalador-python-septima-ventana-resumen.png" class="img-fluid mt-2" alt="Instalador de Python, séptima ventana: Resumen instalación"&gt;&lt;/p&gt;
&lt;div class="text-center mb-5 lead"&gt;&lt;em&gt;Instalador de Python, séptima ventana: Resumen instalación&lt;/em&gt;&lt;/div&gt;

&lt;p&gt;Esta ventana es la confirmación de que ha concluido la instalación de Python en tu sistema operativo macOS. Es importante que instales los &lt;a href="https://es.wikipedia.org/wiki/Seguridad_de_la_capa_de_transporte" target="_blank"&gt;certificados SSL&lt;/a&gt; para evitar problemas de conexión cuando emplees algunas de las herramientas de Python.&lt;/p&gt;
&lt;p&gt;Para instalar los certificados, ve a la carpeta de aplicaciones de tu Mac, localiza la carpeta Python 3.11, haz clic derecho sobre el archivo &lt;code&gt;Install Certificates.command&lt;/code&gt; y selecciona la opción &lt;code&gt;Abrir con -&amp;gt; Terminal.app&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="paso-3-verificar-la-instalacion"&gt;Paso 3: Verificar la instalación&lt;/h2&gt;
&lt;p&gt;Una vez que hayas ejecutados los pasos anteriores, Python estará instalado en tu sistema operativo. Para confirmar que lo tienes, abre una ventana de Terminal y ejecuta el comando siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;--version&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="go"&gt;Python 3.11.5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este comando imprime la versión de Python que tienes instalada por defecto. Con esto has concluido la instalación de Python usando el instalador oficial para macOS. Ahora estás listo para escribir tu &lt;a href="/python-hola-mundo/"&gt;primer programa&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;Instalar Python en tu ordenador es el primer paso en tu empeño de aprender a programar con el lenguaje. Nuevamente, recuerda que los pasos a seguir para completar la instalación son los siguientes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Descargar el instalador de Python para macOS desde la &lt;a href="https://www.python.org/downloads/" target="_blank"&gt;página de descargas&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Ejecutar el instalador y seguir las instrucciones en pantalla.&lt;/li&gt;
&lt;li&gt;Verificar que la instalación se completó con éxito.&lt;/li&gt;
&lt;li&gt;🐍&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Luego de completados estos pasos, estás listo para comenzar a explorar las bondades de Python como lenguaje de programación.&lt;/p&gt;</content><category term="Guías"/><category term="python"/><category term="macos"/></entry><entry><title>Cómo escribir tu primer programa en Python: Hola, mundo!</title><link href="https://pythonscouts.com/python-hola-mundo/" rel="alternate"/><published>2023-08-15T20:00:00+02:00</published><updated>2023-08-15T20:00:00+02:00</updated><author><name>Leodanis Pozo Ramos</name></author><id>tag:pythonscouts.com,2023-08-15:/python-hola-mundo/</id><summary type="html">&lt;p&gt;El &lt;em&gt;Hola, mundo!&lt;/em&gt; es el típico primer programa que escribirás cuando comienzas a aprender un lenguaje de programación como Python. El programa consiste en imprimir la frase &lt;em&gt;Hola, mundo!&lt;/em&gt; en la pantalla de tu ordenador. En esta guía, aprenderás cómo escribir tu &lt;em&gt;Hola, mundo!&lt;/em&gt; en Python.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Aquí aprenderás:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Qué es Python y para qué puedes emplearlo&lt;/li&gt;
&lt;li&gt;Cómo escribir el &lt;em&gt;Hola, mundo!&lt;/em&gt; en Python&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para seguir esta guía, deberías tener conocimientos básicos de trabajo en la línea de comandos o terminal de tu sistema operativo actual.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Guías/python-hola-mundo" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;
&lt;div class="toc"&gt;&lt;span class="toctitle"&gt;Contenidos&lt;/span&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#que-es-python"&gt;¿Qué es Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#como-escribes-el-hola-mundo-en-python"&gt;¿Cómo escribes el Hola, mundo! en Python?&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#hola-mundo-desde-una-sesion-interactiva"&gt;Hola, mundo! desde una sesión interactiva&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#hola-mundo-desde-un-archivo-py"&gt;Hola, mundo! desde un archivo .py&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#resumiendo"&gt;Resumiendo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="que-es-python"&gt;¿Qué es Python?&lt;/h2&gt;
&lt;p&gt;Python es un lenguaje de programación de alto nivel. Su sintaxis es muy clara y legible. Sus construcciones sintácticas se asemejan mucho al idioma inglés. Estas, y otras características, han propiciado que Python se convierta en un lenguaje muy popular, llegando a convertirse en una herramienta imprescindible para muchos profesionales de distintas disciplinas e industrias.&lt;/p&gt;
&lt;p&gt;He aquí cómo la &lt;a href="https://docs.python.org/es/3/index.html" target="_blank"&gt;documentación oficial&lt;/a&gt; define a Python:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Python es un lenguaje interpretado, interactivo y orientado a objetos. Incorpora módulos, excepciones, tipado dinámico, tipos de datos de muy alto nivel y clases. Python combina un poder destacado con una sintaxis muy clara. Tiene interfaces a muchas llamadas de sistema y bibliotecas, así como a varios sistemas de ventana, y es extensible en C o C++. También es usable como un lenguaje de extensión para aplicaciones que necesitan una interfaz programable. Por último, Python es portable: corre en muchas variantes de Unix, en Mac y en Windows 2000 y posteriores. (&lt;a href="https://docs.python.org/es/3/faq/general.html#what-is-python" target="_blank"&gt;Fuente&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Como puedes ver, Python es un lenguaje de programación con mucho potencial. Puede que no sea apropiado para escribir un sistema operativo, pero puedes usarlo en casi todo lo demás. Las aplicaciones prácticas de Python incluyen las siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Desarrollo web&lt;/li&gt;
&lt;li&gt;Desarrollo de aplicaciones de escritorio&lt;/li&gt;
&lt;li&gt;Creación de herramientas de consola&lt;/li&gt;
&lt;li&gt;Ciencia de datos&lt;/li&gt;
&lt;li&gt;Desarrollo de juegos&lt;/li&gt;
&lt;li&gt;Aprendizaje automático&lt;/li&gt;
&lt;li&gt;Inteligencia artificial&lt;/li&gt;
&lt;li&gt;DevOps y automatización&lt;/li&gt;
&lt;li&gt;Sistemas embebidos&lt;/li&gt;
&lt;li&gt;Robótica&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ten en cuenta que esta lista es solo una muestra de todo el amplio espectro de disciplinas donde Python se ha ganado un lugar importante.&lt;/p&gt;
&lt;h2 id="como-escribes-el-hola-mundo-en-python"&gt;¿Cómo escribes el &lt;code&gt;Hola, mundo!&lt;/code&gt; en Python?&lt;/h2&gt;
&lt;p&gt;Ahora que sabes de qué va Python Scouts y principalmente qué es Python y dónde puedes emplearlo, es tiempo de escribir tu primer programa en el lenguaje. Como es tradición, el primer programa que se escribe cuando comienzas a aprender un lenguaje de programación es el &lt;em&gt;Hola, mundo!&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Se trata de un programa muy elemental que muestra la frase &lt;em&gt;Hola, mundo!&lt;/em&gt; en la pantalla de tu computadora.&lt;/p&gt;
&lt;p&gt;Python ofrece dos modos básicos de trabajo. Puedes trabajar en modo:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Interactivo&lt;/li&gt;
&lt;li&gt;Script&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;El modo &lt;strong&gt;interactivo&lt;/strong&gt; consiste en ejecutar el intérprete Python desde tu línea de comandos o terminal usando el comando &lt;code&gt;python&lt;/code&gt;. Este modo de trabajo es útil cuando deseas probar ideas y fragmentos de código de manera rápida.&lt;/p&gt;
&lt;p&gt;Por otro lado, el modo &lt;a href="/ejecutar-script-python/"&gt;script&lt;/a&gt; es cuando pones tu código en un archivo con extensión &lt;code&gt;.py&lt;/code&gt; y corres este archivo en tu ordenador como un programa ejecutable.&lt;/p&gt;
&lt;p&gt;En las secciones siguientes, aprenderás a crear tu &lt;em&gt;Hola, mundo!&lt;/em&gt; usando Python en los dos modos de trabajo descritos.&lt;/p&gt;
&lt;h3 id="hola-mundo-desde-una-sesion-interactiva"&gt;&lt;code&gt;Hola, mundo!&lt;/code&gt; desde una sesión interactiva&lt;/h3&gt;
&lt;p&gt;Para comenzar una sesión interactiva de Python, abre una ventana de línea de comandos o terminal en tu computadora. Los pasos para abrir una terminal variarán en dependencia de tu sistema operativo. En macOS y Linux, generalmente encontrarás una aplicación llamada &lt;em&gt;Terminal&lt;/em&gt;. Si trabajas en Windows, entonces puedes usar algo como PowerShell.&lt;/p&gt;
&lt;p&gt;Una vez que tengas tu terminal abierta, ejecuta el siguiente comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este comando inicia el intérprete Python. El intérprete es el programa que te permite interpretar y ejecutar código escrito en lenguaje Python.&lt;/p&gt;
&lt;p&gt;En general, notarás que las personas usan el término Python para referirse tanto al lenguaje como al intérprete, pero debes saber que hay diferencias entre estos conceptos para que puedas identificar de qué se está hablando en cada contexto.&lt;/p&gt;
&lt;p&gt;Una vez que ejecutes el comando anterior, verás en pantalla un mensaje de presentación de tu versión actual de Python e inmediatamente te aparecerá el indicador (&lt;em&gt;prompt&lt;/em&gt;) primario del intérprete. Este indicador consiste en tres signos de &lt;em&gt;mayor que&lt;/em&gt;, &lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ahora escribe el siguiente código y presiona &lt;em&gt;Enter&lt;/em&gt; al final:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python REPL&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola, mundo!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Hola, mundo!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Al presionar &lt;em&gt;Enter&lt;/em&gt;, Python ejecuta el código que has introducido e inmediatamente imprime &lt;em&gt;Hola, mundo!&lt;/em&gt; en la siguiente línea. Y eso es todo! Ya escribiste tu &lt;em&gt;Hola, mundo!&lt;/em&gt; en Python.&lt;/p&gt;
&lt;p&gt;Hay dos cosas fundamentales que debes saber sobre esta línea de código. Primeramente, se trata de una llamada a la función integrada (&lt;em&gt;built-in&lt;/em&gt;) &lt;a href="https://docs.python.org/3/library/functions.html#print" target="_blank"&gt;&lt;code&gt;print()&lt;/code&gt;&lt;/a&gt;. Como su nombre sugiere, esta función te permite imprimir texto en la salida estándar de tu computadora. Esta salida es tu pantalla por defecto.&lt;/p&gt;
&lt;p&gt;Como argumento a la función &lt;code&gt;print()&lt;/code&gt;, empleas la frase o mensaje que deseas imprimir en pantalla. En este caso, el habitual saludo &lt;em&gt;Hola, mundo!&lt;/em&gt; Y con eso ya escribiste tu primer programa Python.&lt;/p&gt;
&lt;h3 id="hola-mundo-desde-un-archivo-py"&gt;&lt;code&gt;Hola, mundo!&lt;/code&gt; desde un archivo &lt;code&gt;.py&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Para escribir tu programa &lt;em&gt;Hola, mundo!&lt;/em&gt; y ejecutarlo desde un archivo Python, abre tu editor de código preferido y crea un nuevo archivo llamado &lt;code&gt;hello_world.py&lt;/code&gt; en tu carpeta de trabajo. Luego añade el mismo código de la sección anterior y salva los cambios:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Python - hello_world.py&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hola, mundo!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Una vez que hayas creado tu archivo &lt;code&gt;hello_world.py&lt;/code&gt; y añadido el código necesario, puedes abrir una nueva terminal y ejecutar el siguiente comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;span class="filename"&gt;Terminal&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;hello_world.py
&lt;span class="go"&gt;Hola, mundo!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este caso, el intérprete Python corre en modo script usando tu archivo &lt;code&gt;hello_world.py&lt;/code&gt; como entrada. El intérprete lee tu código y lo ejecuta línea por línea produciendo la salida deseada.&lt;/p&gt;
&lt;h2 id="resumiendo"&gt;Resumiendo&lt;/h2&gt;
&lt;p&gt;Has aprendido a escribir tu primer programa, el &lt;em&gt;Hola, mundo!&lt;/em&gt; usando Python. Los pasos necesarios para escribir y ejecutar este programa se resumen en:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Crea un archivo Python (&lt;code&gt;hello_world.py&lt;/code&gt;) en tu editor de código favorito&lt;/li&gt;
&lt;li&gt;Añade la línea de código &lt;code&gt;print("Hola, mundo!")&lt;/code&gt; y salva los cambios&lt;/li&gt;
&lt;li&gt;Abre una ventana de línea de comandos o terminal en tu carpeta de trabajo&lt;/li&gt;
&lt;li&gt;Ejecuta el comando &lt;code&gt;python hello_world.py&lt;/code&gt; para correr el programa&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Una vez que hayas ejecutado estos pasos, verás la frase &lt;em&gt;Hola, mundo!&lt;/em&gt; en la pantalla de tu ordenador. Eso es todo! Ya has escrito tu primer programa en Python! Más importante aún, has aprendido a ejecutar código Python. Estos conocimientos te servirán de base en tu empeño de aprender el lenguaje.&lt;/p&gt;
&lt;div class="code-link"&gt;&lt;p&gt;Puedes encontrar el código Python de este artículo en el &lt;a href="https://github.com/pythonscouts/ps-ejemplos/tree/main/Guías/python-hola-mundo" target="_blank" rel="noopener noreferrer"&gt;repositorio de ejemplos de Python Scouts&lt;/a&gt;. ¡Te agradeceríamos mucho si nos dejas una estrella (⭐) en el repositorio!&lt;/p&gt;&lt;/div&gt;</content><category term="Guías"/><category term="python"/></entry></feed>