<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Sebastian J. Bustamante - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Sebastian J. Bustamante - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Fri, 22 May 2026 20:03:01 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/sebasj/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Guía de funciones de Python con ejemplos ]]>
                </title>
                <description>
                    <![CDATA[ Introducción a las funciones en Python Una función te permite definir un bloque de código reutilizable que se puede ejecutar muchas veces dentro de tu programa. Las funciones te permiten crear soluciones más modulares y DRY [https://en.wikipedia.org/wiki/Don%27t_repeat_yourself] para problemas complejos. Si bien Python ya proporciona muchas funciones integradas como print() ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/guia-de-funciones-de-python-con-ejemplos/</link>
                <guid isPermaLink="false">5fe8ccb38c7cd154bb97fd74</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian J. Bustamante ]]>
                </dc:creator>
                <pubDate>Sun, 21 Feb 2021 06:45:15 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1555949963-aa79dcee981c.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <h2 id="introducci-n-a-las-funciones-en-python">Introducción a las funciones en Python</h2><p>Una función te permite definir un bloque de código reutilizable que se puede ejecutar muchas veces dentro de tu programa.</p><p>Las funciones te permiten crear soluciones más modulares y <a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself">DRY</a> para problemas complejos.</p><p>Si bien Python ya proporciona muchas funciones integradas como <code>print()</code> y <code>len()</code>, también puedes definir tus propias funciones para usar en tus proyectos.</p><p>Una de las grandes ventajas de usar funciones en tu código es que reduce el número total de líneas de código en tu proyecto.</p><h3 id="sintaxis"><strong>Sintaxis</strong></h3><p>En Python, una definición de función tiene las siguientes características:</p><ol><li>La palabra clave <code>def</code></li><li>Un nombre de función</li><li>Paréntesis ’()’, y dentro de los paréntesis los parámetros de entrada, aunque los parámetros de entrada sean opcionales.</li><li>Dos puntos ’:’</li><li>Algún bloque de código para ejecutar</li><li>Una sentencia de retorno (opcional)</li></ol><pre><code class="language-python"># función sin parámetros o retorno de valores
def diHola():
  print("Hello!")

diHola()  # llamada a la función, 'Hello!' se muestra en la consola

# función con un parámetro
def holaConNombre(name):
  print("Hello " + name + "!")

holaConNombre("Ada")  # llamada a la función, 'Hello Ada!' se muestra en la consola

# función con múltiples parámetros con una sentencia de retorno
def multiplica(val1, val2):
  return val1 * val2

multiplica(3, 5)  # muestra 15 en la consola</code></pre><p>Las funciones son bloques de código que se pueden reutilizar simplemente llamando a la función. Esto permite la reutilización de código simple y elegante sin volver a escribir explícitamente secciones de código. Esto hace que el código sea más legible, facilita la depuración y limita los errores de escritura.</p><p>Las funciones en Python se crean usando la palabra clave <code>def</code>, seguida de un nombre de función y parámetros de función entre paréntesis.</p><p>Una función siempre devuelve un valor. La función utiliza la palabra clave <code>return</code> &nbsp;para devolver un valor; si no desea devolver ningún valor, se devolverá el valor predeterminado <code>None</code>.</p><p>El nombre de la función se usa para llamar a la función, pasando los parámetros necesarios entre paréntesis.</p><pre><code class="language-python"># esta es una función básica de suma
def suma(a, b):
  return a + b

result = suma(1, 2)
# result = 3</code></pre><p>Puedes definir valores predeterminados para los parámetros, de esa manera Python interpretará que el valor de ese parámetro es el predeterminado si no se proporciona ninguno.</p><pre><code class="language-python">def suma(a, b=3):
  return a + b

result = suma(1)
# result = 4</code></pre><p>Puedes pasar los parámetros en el orden que desees, utilizando el nombre del parámetro.</p><pre><code class="language-python">result = suma(b=2, a=2)
# result = 4</code></pre><p>Sin embargo, no es posible pasar un argumento de palabra clave antes que uno que no sea de palabra clave</p><pre><code class="language-python">result = suma(3, b=2)
#result = 5
result2 = suma(b=2, 3)
#Lanzará SyntaxError</code></pre><p>Las funciones también son objetos, por lo que puedes asignarlas a una variable y usar esa variable como una función.</p><pre><code class="language-python">s = suma
result = s(1, 2)
# result = 3</code></pre><h3 id="notas"><strong>Notas</strong></h3><p>Si la definición de una función incluye parámetros, debe proporcionar el mismo número de parámetros cuando llame a la función.</p><pre><code class="language-python">print(multiplica(3))  # TypeError: multiplica() utiliza exactamente 2 argumentos (0 proporcionados)

print(multiplica('a', 5))  # 'aaaaa' mostrado en la consola

print(multiplica('a', 'b'))  # TypeError: Python no puede multiplicar dos strings</code></pre><p>El bloque de código que ejecutará la función incluye todas las declaraciones con indentación dentro de la función.</p><pre><code class="language-python">def miFunción():
    print('this will print')
    print('so will this')

x = 7
# la asignación de x no es parte de la función ya que no está indentada</code></pre><p>Las variables definidas dentro de una función solo existen dentro del ámbito de esa función.</p><pre><code class="language-python">def duplica(num):
    x = num * 2
    return x

print(x)  # error - x no está definida
print(duplica(4))  # muestra 8</code></pre><p>Python interpreta el bloque de funciones solo cuando se llama a la función y no cuando se define la función. Por lo tanto, incluso si el bloque de definición de función contiene algún tipo de error, el intérprete de Python lo señalará solo cuando se llame a la función.</p><p>Ahora veamos algunas funciones específicas con ejemplos.</p><h2 id="funci-n-max-">Función max()</h2><p><code>max()</code> es una función incorporada en Python 3. Devuelve el elemento más grande en un iterable o el más grande de dos o más argumentos.</p><h3 id="argumentos">Argumentos</h3><p>Esta función toma dos o más números o cualquier tipo de iterable como argumento. Mientras damos un iterable como argumento, debemos asegurarnos de que todos los elementos del iterable sean del mismo tipo. Esto significa que no podemos pasar una lista que tenga almacenados valores enteros y de cadena. Sintaxis: max (iterable, * iterables [, clave, predeterminado]) max (arg1, arg2, * args [, clave])</p><p>Argumentos válidos:</p><pre><code class="language-text">max(2, 3)
max([1, 2, 3])
max('a', 'b', 'c')</code></pre><p>Argumentos inválidos:</p><pre><code class="language-text">max(2, 'a')
max([1, 2, 3, 'a'])
max([])</code></pre><h3 id="valor-devuelto">Valor devuelto</h3><p>Se devuelve el elemento más grande del iterable. Si se proporcionan dos o más argumentos posicionales, se devuelve el mayor de los argumentos posicionales. Si el iterable está vacío y no se proporciona el valor predeterminado, se genera un <code>ValueError</code>.</p><h3 id="c-digo-de-ejemplo-">Código de ejemplo:</h3><pre><code class="language-text">print(max(2, 3)) # Devuelve 3 ya que 3 es el mayor de los dos valores
print(max(2, 3, 23)) # Devuelve 23 ya que 23 es el mayor de todos los valores

list1 = [1, 2, 4, 5, 54]
print(max(list1)) # Devuelve 54 ya que 54 es el valor más grande de la lista

list2 = ['a', 'b', 'c' ]
print(max(list2)) # Devuelve 'c' ya que 'c' es el valor más grande en la lista porque 'c' tiene un valor ascii mayor que 'a' ,'b'.

list3 = [1, 2, 'abc', 'xyz']
print(max(list3)) # Se genera TypeError ya que los valores en la lista son de tipos diferentes

#Soluciona el TypeError mencionado anterioremente antes de continuar con el siguiente paso

list4 = []
print(max(list4)) # Se genera ValueError ya que el argumento está vacío</code></pre><p><a href="https://docs.python.org/es/3/library/functions.html#max">Documentación oficial</a></p><h2 id="funci-n-min-">Función min()</h2><p><code>min()</code> es una función incorporada en Python 3. Devuelve el elemento más pequeño en un iterable o el más pequeño de dos o más argumentos.</p><h3 id="argumentos-1">Argumentos</h3><p>Esta función toma dos o más números o cualquier tipo de iterable como argumento. Mientras damos un iterable como argumento, debemos asegurarnos de que todos los elementos del iterable sean del mismo tipo. Esto significa que no podemos pasar una lista que tenga almacenados valores enteros y de cadena.</p><p>Argumentos válidos:</p><pre><code class="language-text">min(2, 3)
min([1, 2, 3])
min('a', 'b', 'c')</code></pre><p>Argumentos inválidos:</p><pre><code class="language-text">min(2, 'a')
min([1, 2, 3, 'a'])
min([])</code></pre><h3 id="valor-devuelto-1">Valor devuelto</h3><p>Se devuelve el elemento más pequeño del iterable. Si se proporcionan dos o más argumentos posicionales, se devuelve el más pequeño de los argumentos posicionales. Si el iterable está vacío y no se proporciona el valor predeterminado, se genera un ValueError.</p><h3 id="c-digo-de-ejemplo--1">Código de ejemplo:</h3><pre><code class="language-text">print(min(2, 3)) # Devuelve 2 ya que 2 es el más pequeño de los dos valores
print(min(2, 3, -1)) # Devuelve -1 ya que -1 es el más pequeño de los dos valores

list1 = [1, 2, 4, 5, -54]
print(min(list1)) # Devuelve -54 ya que -54 es el más pequeño de los valores en la lista.

list2 = ['a', 'b', 'c' ]
print(min(list2)) # Devuelve 'a' ya que 'a' es el valor más pequeño de la lissta en orden alfabético

list3 = [1, 2, 'abc', 'xyz']
print(min(list3)) # Se genera TypeError ya que los valores en la lista son de tipos diferentes

#Soluciona el TypeError mencionado anterioremente antes de continuar con el siguiente paso

list4 = []
print(min(list4)) # Se genera ValueError ya que el argumento está vacío</code></pre><p><a href="https://docs.python.org/es/3/library/functions.html#min">Documentación oficial</a></p><h2 id="funci-n-divmod-">Función divmod()</h2><p><code>divmod()</code> es una función incorporada en Python 3, que devuelve el cociente y el resto al dividir el número <code>a</code> por el número <code>b</code>. Toma dos números como argumentos <code>a</code> &amp; <code>b</code>. El argumento no puede ser un número complejo.</p><h3 id="argumentos-2">Argumentos</h3><p>Se necesitan dos argumentos <code>a</code> &amp; <code>b</code>: un número entero o un número decimal. No puede ser un número complejo.</p><h3 id="valor-devuelto-2">Valor devuelto</h3><p>El valor de retorno será el par de números positivos que consiste en el cociente y el resto obtenido al dividir <code>a</code> por <code>b</code>. En el caso de tipos de operandos mixtos, se aplicarán las reglas para los operadores aritméticos binarios.<br>Para los <strong>argumentos de números enteros</strong>, el valor de retorno será el mismo que <code>(a // b, a % b)</code>.<br>Para los <strong>argumentos de números decimales</strong>, el valor devuelto será el mismo que <code>(q, a % b)</code>, donde <code>q</code> es normalmente math.floor (a / b) pero puede ser 1 menos que eso.</p><h3 id="c-digo-de-ejemplo--2">Código de ejemplo:</h3><pre><code class="language-text">print(divmod(5,2)) # muestra (2,1)
print(divmod(13.5,2.5)) # muestra (5.0, 1.0)
q,r = divmod(13.5,2.5)  # Asigna q=cociente &amp; r=resto
print(q) # muestra 5.0 porque math.floor(13.5/2.5) = 5.0
print(r) # muestra 1.0 porque (13.5 % 2.5) = 1.0</code></pre><p><a href="https://docs.python.org/es/3/library/functions.html#divmod">Documentación oficial</a></p><h2 id="funci-n-hex-x-">Función Hex(x)</h2><p><code>hex(x)</code> es una función incorporada en Python 3 para convertir un número entero en una cadena hexadecimal en minúscula con el prefijo "0x"</p><h3 id="argumentos-3">Argumentos</h3><p>Esta función toma un argumento, <code>x</code>, que debería ser de tipo entero.</p><h3 id="valor-devuelto-3">Valor devuelto</h3><p>Esta función devuelve una cadena hexadecimal en minúscula con el prefijo "0x".</p><h3 id="c-digo-de-ejemplo--3">Código de ejemplo:</h3><pre><code class="language-text">print(hex(16))    # muestra  0x10
print(hex(-298))  # muestra -0x12a
print(hex(543))   # muestra  0x21f</code></pre><p><a href="https://docs.python.org/es/3/library/functions.html#hex">Documentación oficial</a></p><h2 id="funci-n-len-">Función len()</h2><p><code>len()</code> es una función incorporada en Python 3. Este método devuelve la longitud (el número de elementos) de un objeto. Toma un argumento <code>x</code>.</p><h3 id="argumentos-4">Argumentos</h3><p>Esta función toma un argumento, <code>x</code>. Este argumento puede ser una secuencia (como un string, bytes, tupla, lista o rango) o una colección (como un diccionario, conjunto o conjunto congelado).</p><h3 id="valor-devuelto-4">Valor devuelto</h3><p>Esta función devuelve el número de elementos del argumento que se pasa a la función <code>len()</code>.</p><h3 id="c-digo-de-ejemplo--4">Código de ejemplo:</h3><pre><code class="language-text">list1 = [123, 'xyz', 'zara'] # lista
print(len(list1)) # muestra 3 ya que hay 3 elementos en list1

str1 = 'basketball' # string
print(len(str1)) # muestra 10 ya que str1 tiene 10 carácteres

tuple1 = (2, 3, 4, 5) # tuple 
print(len(tuple1)) # muestra 4 ya que hay 4 elementos en tuple1

dict1 = {'name': 'John', 'age': 4, 'score': 45} # dictionary
print(len(dict1)) # muestra 3 ya que hay 3 pares clave/valor en dict1</code></pre><p><a href="https://docs.python.org/es/3/library/functions.html#len">Documentación oficial</a></p><h2 id="funci-n-ord"><strong>Función Ord</strong></h2><p><code>ord()</code> es una función incorporada en Python 3, para convertir la cadena que representa un carácter Unicode en un entero que representa el código Unicode del carácter.</p><h4 id="ejemplos-"><strong>Ejemplos:</strong></h4><pre><code class="language-text">&gt;&gt;&gt; ord('d')
100
&gt;&gt;&gt; ord('1')
49</code></pre><h2 id="funci-n-chr">Función chr</h2><p><code>chr()</code> es una función incorporada en Python 3, para convertir el número entero que representa el código Unicode en una cadena que representa un carácter correspondiente.</p><h4 id="ejemplos--1"><strong>Ejemplos:</strong></h4><pre><code class="language-text">&gt;&gt;&gt; chr(49)
'1'</code></pre><p>Hay que tener en cuenta que, si el valor entero pasado a <code>chr()</code> está fuera del rango, entonces se generará un ValueError.</p><pre><code class="language-text">&gt;&gt;&gt; chr(-10)
'Traceback (most recent call last):
  File "&lt;pyshell#24&gt;", line 1, in &lt;module&gt;
    chr(-1)
ValueError: chr() arg not in range(0x110000)'</code></pre><h2 id="funciones-input-">Funciones input()</h2><p>Muchas veces, en un programa necesitamos alguna información del usuario. Recibir información del usuario hace que el programa se sienta interactivo. En Python 3, para recibir datos del usuario tenemos la función <code>input()</code>. Si se llama a la función input, el flujo del programa se detendrá hasta que el usuario haya introducido la información y haya finalizado la introducción de información con la tecla de retorno. Veamos algunos ejemplos:</p><ol><li>Cuando solo queremos recibir información:</li></ol><p>inp = input()</p><p>2. Para mostrar en la línea de comandos un mensaje:</p><p>prompt<em>with</em>message = input(’‘)</p><p>3. Cuando queremos tomar un número entero como información:</p><pre><code class="language-text">number = int(input('Please enter a number: '))</code></pre><p>Sin embargo, las entradas se almacenan de forma predeterminada como un string. El uso de la función <code>str()</code> deja en claro al lector de código que la entrada será una "cadena". Es una buena práctica mencionar de antemano qué tipo de información se tomará.</p><p><a href="https://docs.python.org/es/3/library/functions.html#input">Documentación oficial</a></p><h2 id="como-llamar-una-funci-n-en-python">Como llamar una función en Python</h2><p>Una sentencia de definición de función no ejecuta la función. La ejecución (llamada) de una función se realiza utilizando el nombre de la función seguido de paréntesis que encierran los argumentos requeridos (si los hay).</p><pre><code class="language-text">&gt;&gt;&gt; def di_hola():
...     print('Hello')
...
&gt;&gt;&gt; di_hola()
Hello</code></pre><p>La ejecución de una función introduce una nueva tabla de símbolos utilizada para las variables locales de la función. Más precisamente, todas las asignaciones de variables en una función almacenan el valor en la tabla de símbolos local; mientras que las referencias de variables primero buscan en la tabla de símbolos local, luego en las tablas de símbolos locales de las funciones adjuntas, luego en la tabla de símbolos global y finalmente en la tabla de nombres incorporados. Por lo tanto, a las variables globales no se les puede asignar directamente un valor dentro de una función (a menos que se mencionen en una declaración global), aunque se puede hacer referencia a ellas.</p><pre><code class="language-text">&gt;&gt;&gt; a = 1
&gt;&gt;&gt; b = 10
&gt;&gt;&gt; def fn():
...     print(a)    # la variable local a no esta asignada, no esta incluida en la función, es una variable global
...     b = 20      # la variable local b está asignada en la tabla de símbolos locales para la función.
...     print(b)    # la variable local b esta referenciada.
...
&gt;&gt;&gt; fn()
1
20
&gt;&gt;&gt; b               # la variable global b no se ha modificado por la llamada a la función.
10</code></pre><p>Los parámetros actuales (argumentos) para una llamada de función se introducen en la tabla de símbolos local de la función llamada cuando se llama; por lo tanto, los argumentos se pasan usando la llamada por valor (donde el valor es siempre una referencia de objeto, no el valor del objeto). Cuando una función llama a otra función, se crea una nueva tabla de símbolos local para esa llamada.</p><pre><code class="language-text">&gt;&gt;&gt; def saluda(s):
...     s = "Hello " + s    # s en la tabla local de símbolos es reasignada
...     print(s)
...
&gt;&gt;&gt; persona = "Bob"
&gt;&gt;&gt; saluda(persona)
Hello Bob
&gt;&gt;&gt; person                  # la variable persona utilizada en la llamada continua vinculada al objeto original, 'Bob'.
'Bob'</code></pre><p>Los argumentos utilizados para llamar a una función no pueden ser reasignados por la función, pero los argumentos que hacen referencia a objetos mutables pueden cambiar sus valores:</p><pre><code class="language-text">&gt;&gt;&gt; def fn(arg):
...     arg.append(1)
...
&gt;&gt;&gt; a = [1, 2, 3]
&gt;&gt;&gt; fn(a)
&gt;&gt;&gt; a
[1, 2, 3, 1]</code></pre><p>Traducido del artículo <strong><a href="https://www.freecodecamp.org/news/python-function-guide-with-examples/">Python Function Guide with Examples</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Entornos virtuales de Python explicados con ejemplos ]]>
                </title>
                <description>
                    <![CDATA[ Los entornos virtuales se pueden describir como directorios de instalación aislados. Este aislamiento te permite localizar la instalación de las dependencias de tu proyecto, sin obligarte a instalarlas en todo el sistema. Imagina que tienes dos aplicaciones, App1 y App2. Ambos usan el paquete Pak, pero requieren versiones diferentes. Si ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/entornos-virtuales-de-python-explicados-con-ejemplos/</link>
                <guid isPermaLink="false">5ff06ec28c7cd154bb982ce2</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian J. Bustamante ]]>
                </dc:creator>
                <pubDate>Tue, 09 Feb 2021 04:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/photo-1466248597128-17a2d5f14664.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Los entornos virtuales se pueden describir como directorios de instalación aislados. Este aislamiento te permite localizar la instalación de las dependencias de tu proyecto, sin obligarte a instalarlas en todo el sistema.</p><p>Imagina que tienes dos aplicaciones, App1 y App2. Ambos usan el paquete Pak, pero requieren versiones diferentes. Si instala Pak versión 2.3 para App1, no podrá ejecutar App2 porque requiere la versión 3.1.</p><p>Aquí es donde los entornos virtuales son útiles.</p><p>Beneficios:</p><ul><li>Puedes tener varios entornos, con varios conjuntos de paquetes, sin conflictos entre ellos. De esta manera, los requisitos de diferentes proyectos se pueden satisfacer al mismo tiempo.</li><li>Puedes lanzar fácilmente tu proyecto con sus propios módulos dependientes.</li></ul><p>Aquí hay dos formas en las que puede crear entornos virtuales Python.</p><h2 id="virtualenv"><strong>Virtualenv</strong></h2><p><a href="https://virtualenv.pypa.io/en/stable/">virtualenv</a> es una herramienta que se utiliza para crear entornos Python aislados. Crea una carpeta que contiene todos los ejecutables necesarios para usar los paquetes que necesitaría un proyecto de Python.</p><p>Puedes instalarlo con <code>pip</code>:</p><pre><code class="language-text">pip install virtualenv</code></pre><p>Verifica la instalación con el siguiente comando:</p><pre><code class="language-text">virtualenv --version</code></pre><h3 id="crear-un-entorno"><strong>Crear un entorno</strong></h3><p>Para crear un entorno virtual utiliza:</p><pre><code class="language-text">virtualenv --no-site-packages my-env</code></pre><p>Esto crea una carpeta en el directorio actual con el nombre del entorno (<code>my-env/</code>). Esta carpeta contiene los directorios para instalar módulos y ejecutables de Python.</p><p>También puedes especificar la versión de Python con la que quieres trabajar. Simplemente usa el argumento <code>--python=/ruta/a/la/version/de/python</code>. Por ejemplo, python2.7:</p><pre><code class="language-text">virtualenv --python=/usr/bin/python2.7 my-env</code></pre><h3 id="lista-de-entornos"><strong>Lista de entornos</strong></h3><p>Puedes enumerar los entornos disponibles con:</p><pre><code class="language-text">lsvirtualenv</code></pre><h3 id="activar-un-entorno"><strong>Activar un entorno</strong></h3><p>Antes de utilizar el entorno, debes activarlo:</p><pre><code class="language-text">source my-env/bin/activate</code></pre><p>Esto asegura que solo se usen los paquetes bajo <code>my-env/</code>.</p><p>Notarás que el nombre del entorno se muestra a la izquierda de la línea de comandos. De esta forma puedes ver cuál es el entorno activo.</p><h3 id="instalar-paquetes">Instalar paquetes</h3><p>Puede instalar paquetes uno por uno o configurando un archivo <code>requirements.txt</code> para tu proyecto.</p><pre><code class="language-text">pip install algun-paquete
pip install -r requirements.txt</code></pre><p>Si quieres crear un archivo <code>requirements.txt</code> &nbsp;a partir de los paquetes ya instalados, ejecuta el siguiente comando:</p><pre><code class="language-text">pip freeze &gt; requirements.txt</code></pre><p>El archivo contendrá la lista de todos los paquetes instalados en el entorno actual y sus respectivas versiones. Esto te ayudará a lanzar tu proyecto con sus propios módulos dependientes.</p><h3 id="desactivar-un-entorno">Desactivar un entorno</h3><p>Si has terminado de trabajar con el entorno virtual, puedes desactivarlo con:</p><pre><code class="language-text">deactivate</code></pre><p>Esto te devuelve al intérprete de Python predeterminado del sistema con todas sus bibliotecas instaladas.</p><h3 id="eliminar-un-entorno">Eliminar un entorno</h3><p>Simplemente elimina la carpeta del entorno.</p><h2 id="conda"><strong>Conda</strong></h2><p><a href="https://conda.io/docs/index.html"><code>Conda</code></a> es una gestión de paquetes, dependencias y entornos para muchos lenguajes, incluido Python.</p><p>Para instalar Conda, sigue estas <a href="https://conda.io/docs/user-guide/install/index.html">instrucciones</a>.</p><h3 id="crear-un-entorno-1"><strong>Crear un entorno</strong></h3><p>Para crear un entorno virtual, use:</p><pre><code class="language-text">conda create --name my-env</code></pre><p>Conda creará la carpeta correspondiente dentro del directorio de instalación de Conda.</p><p>También puedes especificar con qué versión de Python quieres trabajar:</p><pre><code class="language-text">conda create --name my-env python=3.6</code></pre><h3 id="lista-de-entornos-1"><strong>Lista de entornos</strong></h3><p>Puedes enumerar los entornos disponibles con:</p><pre><code class="language-text">conda info --envs</code></pre><h3 id="activar-un-entorno-1"><strong>Activar un entorno</strong></h3><p>Antes de utilizar el entorno, debes activarlo:</p><pre><code class="language-text">source activate my-env</code></pre><h3 id="instalar-paquetes-1">Instalar paquetes</h3><p>Igual que con <code>virtualenv</code>.</p><h3 id="desactivar-un-entorno-1">Desactivar un entorno</h3><p>Si has terminado de trabajar con el entorno virtual, puedes desactivarlo con:</p><pre><code class="language-text">source deactivate</code></pre><h3 id="eliminar-un-entorno-1">Eliminar un entorno</h3><p>Si quieres eliminar un entorno de Conda, utiliza:</p><pre><code class="language-text">conda remove --name my-env</code></pre><p>Traducido del artículo - <strong><a href="https://www.freecodecamp.org/news/python-virtual-environments-explained-with-examples/">Python Virtual Environments Explained with Examples</a></strong><br></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Sentencias de devolución en Python explicadas: Qué son y por qué las usas ]]>
                </title>
                <description>
                    <![CDATA[ Todas las funciones devuelven un valor cuando se ejecutan. Si a una sentencia de devolución le sigue una lista de expresiones, la lista de expresiones se evalúa y se devuelve el valor: >>> def mayor_que_1(n): ...     return n > 1 ... >>> print(mayor_que_1(1)) False >>> print(mayor_que_1(2)) ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/explicacion-de-las-declaraciones-return-de-python-que-son-y-por-que-las-usa/</link>
                <guid isPermaLink="false">5fdb15d18c7cd154bb9786cf</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian J. Bustamante ]]>
                </dc:creator>
                <pubDate>Mon, 08 Feb 2021 04:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1480179446325-8e6dd394431c.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Todas las funciones devuelven un valor cuando se ejecutan.</p><p>Si a una sentencia de devolución le sigue una lista de expresiones, la lista de expresiones se evalúa y se devuelve el valor:</p><pre><code class="language-text">&gt;&gt;&gt; def mayor_que_1(n):
...     return n &gt; 1
...
&gt;&gt;&gt; print(mayor_que_1(1))
False
&gt;&gt;&gt; print(mayor_que_1(2))
True</code></pre><p>Si no hay lista de expresiones especificada, se devuelve &nbsp;<code>None</code> :</p><pre><code class="language-text">&gt;&gt;&gt; def no_lista_expresion():
...     return    # No se devuelve una lista de expresiones.
...
&gt;&gt;&gt; print(no_lista_expresion())
None</code></pre><p>Si se alcanza una sentencia de devolución durante la ejecución de una función, la llamada a la función actual se deja en ese punto:</p><pre><code class="language-text">&gt;&gt;&gt; def devuelve_media():
...     a = 1
...     return a
...     a = 2     # Esta sentencia nunca es alcanzada.
...
&gt;&gt;&gt; print(devuelve_media())
1</code></pre><p>Si no hay sentencia de devolución, la función devuelve <code>None</code> cuando alcanza el final</p><pre><code class="language-text">&gt;&gt;&gt; def no_devolver():
...     pass     # No hay sentencia retornar.
...
&gt;&gt;&gt; print(no_devolver())
None</code></pre><p>Una única función puede tener muchas sentencias <code>devolver</code>. La ejecución de la función finaliza cuando una de las sentencias de devolución se alcanza:</p><pre><code class="language-text"> &gt;&gt;&gt; def multiples_devoluciones(n):
 ...    if(n):
 ...        return "First Return Statement"
 ...    else:
 ...        return "Second Return Statement"
 ...
 &gt;&gt;&gt; print(multiples_devoluciones(True))
 First Return Statement
 &gt;&gt;&gt; print(multiples_devoluciones(False))
 Second Return Statement
 </code></pre><p>Una única función puede devolver varios tipos:</p><pre><code class="language-text"> &gt;&gt;&gt; def varios_tipos_de_devolucion(n):
 ...     if(n==1):
 ...         return "Hello World."   # Devuelve un string
 ...     elif(n==2):
 ...         return 42               # Devuelve un valor
 ...     else:
 ...         return True             # Devuelve un boolean
 ... 
 &gt;&gt;&gt; print(varios_tipos_de_devolucion(1))
 Hello World.
 &gt;&gt;&gt; print(varios_tipos_de_devolucion(2))
 42
 &gt;&gt;&gt; print(varios_tipos_de_devolucion(3))
 True</code></pre><p>Incluso es posible que una única función devuelva múltiples valores con un simple Retornar:</p><pre><code class="language-text">&gt;&gt;&gt; def devolver_dos_valores():
 ...     a = 40
 ...     b = 2
 ...     return a,b
 ...
 &gt;&gt;&gt; print("First value = %d,  Second value = %d" %(devolver_dos_valores()))
 First value = 40,  Second value = 2</code></pre><p>Consulta la <a href="https://docs.python.org/es/3/reference/simple_stmts.html#the-return-statement">documentación de Python</a> para más información<br></p><p>Traducido del artículo - <strong><a href="https://www.freecodecamp.org/news/python-return-statements-explained-what-they-are-and-why-you-use-them/">Python Return Statements Explained: What They Are and Why You Use Them</a></strong><br></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Explicación de las listas de Python: Len, Pop, Index y Compresión de listas ]]>
                </title>
                <description>
                    <![CDATA[ Las listas en Python son similares a los arreglos en JavaScript. Son uno de los tipos de datos integrados en Python que se utilizan para almacenar colecciones de datos. Uso básico Cómo crear una lista Se crea una lista vacía usando un par de corchetes: >>> lista_vacia = [] >>> ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/explicacion-de-las-listas-de-python-comprension-de-len-pop-index-y-list-comprehension/</link>
                <guid isPermaLink="false">5fe30f4d8c7cd154bb97d269</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian J. Bustamante ]]>
                </dc:creator>
                <pubDate>Mon, 18 Jan 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1507925921958-8a62f3d1a50d.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Las listas en Python son similares a los arreglos en JavaScript. Son uno de los tipos de datos integrados en Python que se utilizan para almacenar colecciones de datos.</p><h2 id="uso-b-sico">Uso básico</h2><h3 id="c-mo-crear-una-lista">Cómo crear una lista</h3><p>Se crea una <code>lista</code> vacía usando un par de corchetes:</p><pre><code class="language-shell">&gt;&gt;&gt; lista_vacia = []
&gt;&gt;&gt; type(lista_vacia)
&lt;class 'lista'&gt;
&gt;&gt;&gt; len(lista_vacia)
0</code></pre><p>Se puede crear una <code>lista</code> con elementos encerrando una lista de elementos separados por comas entre corchetes. Las listas permiten que los elementos sean de diferentes tipos (heterogéneos) pero más comúnmente son de un solo tipo (homogéneos):</p><pre><code class="language-shell">&gt;&gt;&gt; lista_homogenea = [1, 1, 2, 3, 5, 8]
&gt;&gt;&gt; type(lista_homogenea)
&lt;class 'lista'&gt;
&gt;&gt;&gt; print(lista_homogenea)
[1, 1, 2, 3, 5, 8]
&gt;&gt;&gt; len(lista_homogenea)
6
&gt;&gt;&gt; lista_heterogenea = [1, "¡Hola Campistas!"]
&gt;&gt;&gt; print(lista_heterogenea)
[1, "¡Hola Campistas!"]
&gt;&gt;&gt; len(lista_heterogenea)
2</code></pre><p>El constructor <code>list</code> también se puede utilizar para crear una <code>lista</code>:</p><pre><code class="language-shell">&gt;&gt;&gt; lista_vaciat = list()                            # Crea una lista vacia
&gt;&gt;&gt; print(lista_vacia)
[]
&gt;&gt;&gt; lista_de_iterable = list("¡Hola Campistas!")    # Crea una lista a partir de un iterable.
&gt;&gt;&gt; print(lista_de_iterable)
['!', 'H', 'o', 'l', 'a', ' ', 'c', 'a', 'm', 'p', 'i', 's', 't', 'a', 's', '!']</code></pre><p>También puedes utilizar Compresión de listas (List Comprehension) para crear listas, que trataremos más adelante en este artículo.</p><h3 id="acceder-a-elementos-en-la-lista">Acceder a elementos en la lista</h3><pre><code class="language-shell">&gt;&gt;&gt; mi_lista = [1, 2, 9, 16, 25]
&gt;&gt;&gt; print(mi_lista)
[1, 2, 9, 16, 25]</code></pre><p><em>Indexación al 0</em></p><pre><code class="language-shell">&gt;&gt;&gt; mi_lista[0]
1
&gt;&gt;&gt; mi_lista[1]
2
&gt;&gt;&gt; mi_lista[2]
9</code></pre><p><em>Indexación desde el fin de la lista</em></p><pre><code class="language-shell">&gt;&gt;&gt; mi_lista[-1]
25
&gt;&gt;&gt; mi_lista[-2]
16</code></pre><p><em>Desempaquetado de listas para python-3</em></p><pre><code class="language-shell">&gt;&gt;&gt; print(*mi_lista)
1 2 9 16 25</code></pre><h3 id="las-listas-son-mutables">Las Listas son mutables</h3><p>Las <code>listas</code> son contenedores mutables. Los contenedores mutables son contenedores que permiten cambios en los objetos que contienen el contenedor.</p><p>Los elementos de una <code>lista</code> se pueden extraer y reorganizar utilizando otra <code>lista</code> como índice.</p><pre><code class="language-shell">&gt;&gt;&gt; mi_lista = [1, 2, 9, 16, 25, 34, 53, 21]
&gt;&gt;&gt; mi_indice = [5, 2, 0]
&gt;&gt;&gt; mi_nueva_lista = [mi_lista[i] for i in mi_indice]
&gt;&gt;&gt; print(mi_nueva_lista)
[34, 9, 1]</code></pre><h2 id="m-todos-de-lista">Métodos de lista</h2><h3 id="len-"><code>len()</code></h3><p>El método <code>len()</code> devuelve la longitud de un objeto, ya sea una lista, una cadena, una tupla o un diccionario.</p><p><code>len()</code> toma un argumento, que puede ser una secuencia (como una cadena, bytes, tupla, lista o rango) o colección (como un diccionario, conjunto o conjunto "set" congelado "set frozen").</p><pre><code class="language-text">lista1 = [123, 'xyz', 'zara'] # lista
print(len(lista1)) # Muestra 3 ya que hay 3 elementos en lista1

str1 = 'baloncesto' # string
print(len(str1)) # Muestra 10 ya que str1 está compuesto por 10 carácteres

tupla1 = (2, 3, 4, 5) # tupla 
print(len(tupla1)) # Muestra 4 ya que hay 4 elementos en tupla1

dict1 = {'nombre': 'John', 'edad': 4, 'puntaje': 45} # diccionario
print(len(dict1)) # Muestra 3 ya que hay 3 pares de clave/valor en dict1</code></pre><h3 id="index-"><code>index()</code></h3><p><code>index()</code> devuelve la primera aparición / índice del elemento en la lista dada como argumento de la función.</p><pre><code class="language-py">numeros = [1, 2, 2, 3, 9, 5, 6, 10]
palabras = ["Yo", "amo", "Python", "Yo", "amo"]

print(numeros.index(9)) # 4
print(numeros.index(2)) # 1
print(palabras.index("Yo")) # 0
print(palabras.index("soy")) # Devuelve un ValueError ya que  'soy' no está en la lista `palabras`</code></pre><p>Aquí la primera salida es muy obvia, pero la segunda y la tercera pueden parecer confusas al principio. Pero recuerda que <code>index()</code> devuelve la primera aparición del elemento y, por tanto, en este caso, <code>1</code> y <code>0</code> son los índices donde <code>2</code> y <code>"Yo"</code> aparecen primero en las listas, respectivamente.</p><p>Además, si un elemento no se encuentra en la lista, se devuelve un <code>ValueError</code> como en el caso de indexar <code>"soy"</code> en la lista <code>palabras</code>.</p><p><strong>Argumentos opcionales</strong></p><p>También puedes usar argumentos opcionales para limitar tu búsqueda a una sub secuencia particular de la lista:</p><pre><code class="language-py">palabras = ["Yo", "soy", "un", "Yo", "soy", "Pythonista"]

print(palabras.index("soy", 2, 5)) # 4</code></pre><p>Aunque el elemento se busca entre los índices 2 (inclusive) y 5 (no incluido), el índice devuelto se calcula con relación al comienzo de la lista completa en lugar del argumento de inicio.</p><h3 id="pop-"><code>pop()</code></h3><p>El método <code>pop()</code> &nbsp;borra y retorna el último elemento de una lista.</p><p>Existe un parámetro opcional que es el índice del elemento que se eliminará de la lista. Si no se especifica ningún índice, <code>pop()</code> elimina y devuelve el último elemento de la lista.</p><p>Si el índice pasado al método <code>pop()</code> no está en el rango, se lanza la excepción <code>IndexError: índice pop fuera del rango</code>.</p><pre><code class="language-py">ciudades = ['New York', 'Dallas', 'San Antonio', 'Houston', 'San Francisco'];

print "Ciudad borrada y retornada es: ", ciudades.pop() # Ciudad borrada y retornada  es: San Francisco
print "Ciudad al índice 2 es  : ", ciudades.pop(2) # Ciudad en en el índice 2 es: San Antonio</code></pre><p><strong>Funcionalidad de pila básica</strong></p><p>El método <code>pop()</code> se usa a menudo junto con <code>append()</code> para implementar la funcionalidad básica de la pila en una aplicación Python:</p><pre><code class="language-py">pila = []

for i in range(5):
    pila.append(i)

while len(pila):
    print(pila.pop())</code></pre><h3 id="compresi-n-de-listas">Compresión de listas</h3><p>La comprensión de listas es una forma de recorrer una lista para producir una nueva lista basada en algunas condiciones. Puede resultar confuso al principio, pero una vez que te acostumbras a la sintaxis, es muy potente y rápido.</p><p>El primer paso para aprender a utilizar la comprensión de listas es observar la forma tradicional de recorrer una lista. El siguiente es un ejemplo simple que devuelve una nueva lista de números pares.</p><pre><code class="language-python"># Lista para ejemplo de demostración
alguna_lista = [1, 2, 5, 7, 8, 10]

# Lista vacía que se rellenará con un bucle
lista_par = []

for numero in alguna_lista:
  if numero % 2 == 0:
    lista_par.append(numero)

# lista_par ahora es igual a [2, 8, 10]</code></pre><p>Primero se crea una lista con algunos números. Luego, creas una lista vacía que contendrá los resultados del bucle. En el bucle, verificas si cada número es divisible por 2 y, si es así, lo agregas a <code>lista_par</code>. Se han utilizado 5 líneas de código sin incluir comentarios y espacios en blanco, lo que no es mucho en este ejemplo.</p><p>Ahora el ejemplo de comprensión de lista.</p><pre><code class="language-python"># Lista para ejemplo de demostración
alguna_lista = [1, 2, 5, 7, 8, 10]

# Compresión de lista
lista_par = [numero for numero in alguna_lista if numero % 2 == 0]

# lista_par ahora es igual a [2, 8, 10]</code></pre><p>Otro ejemplo, con los mismos dos pasos: El código siguiente creará una lista de números que corresponden a los números en <code>mi_lista_de_inicio</code> multiplicados por 7.</p><pre><code class="language-py">mi_lista_de_partida = [1, 2, 3, 4, 5, 6, 7, 8]
mi_nueva_lista = []

for elemento in mi_lista_de_partida:
    mi_nueva_lista.append(elemento * 7)</code></pre><p>Cuando se ejecuta el código el valor final de <code>mi_nueva_lista</code> es: <code>[7, 14, 21, 28, 35, 42, 49, 56]</code></p><p>Un desarrollador que use la comprensión de listas podría lograr el mismo resultado usando la siguiente comprensión de listas, que da como resultado la misma <code>mi_nueva_lista</code>.</p><pre><code class="language-py">mi_lista_de_partida = [1, 2, 3, 4, 5, 6, 7, 8]

mi_nueva_lista = [elemento * 7 para elemento en mi_lista_de_partida]</code></pre><p>Una fórmula sencilla para escribir en forma de lista de comprensión es:</p><p><code>mi_lista = [{operacion con entrada n} for n in {python iterable}]</code></p><p>Reemplace <code>{operacion con entrada n}</code> con la forma en que deseas cambiar el elemento devuelto por el iterable. El ejemplo anterior usa <code>n * 7</code> pero la operación puede ser tan simple o tan compleja como sea necesario.</p><p>Reemplaza <code>{python iterable}</code> con cualquier iterable. Los tipos de secuencia serán los más comunes. En el ejemplo anterior se usó una lista, pero las tuplas y los rangos también son comunes.</p><p>La comprensión de listas agrega un elemento de una lista existente a una nueva lista si se cumple alguna condición. Es más ordenado, pero también mucho más rápido en la mayoría de los casos. En algunos casos, la comprensión de lista puede dificultar la legibilidad, por lo que el desarrollador debe sopesar sus opciones al elegir utilizar la comprensión de la lista.</p><p><strong>Ejemplos de comprensión de listas con condicionales</strong></p><p>El flujo de control en las listas por comprensión se puede controlar mediante condicionales. Por ejemplo:</p><pre><code class="language-py">solo_lista_par = [i for i in range(13) if i%2==0]</code></pre><p>Este es equivalente al siguiente bucle:</p><pre><code class="language-py">solo_lista_par = list()
for i in range(13):
  if i%2 == 0:
    solo_lista_par.append(i)</code></pre><p>La comprensión de listas también puede contener condiciones if anidadas. Considera el siguiente bucle:</p><pre><code class="language-py">divisible = list()
for i in range(50):
  if i%2 == 0:
    if i%3 == 0:
      divisible.append(i)</code></pre><p>Usando la comprensión de listas, esto se puede escribir como:</p><pre><code class="language-py">divisible = [i for i in range(50) if i%2==0 if i%3==0]</code></pre><p>La sentencia If-Else también se puede utilizar junto con la comprensión de listas.</p><pre><code class="language-py">lista_1 = [i if i%2==0 else i*-1 for i in range(10)]</code></pre><h4 id="mas-informaci-n-"><strong>Mas Información:</strong></h4><ul><li><a href="https://www.freecodecamp.org/news/python-example/">Los mejores ejemplos de código Python</a></li></ul><p>Traducido del artículo <strong><a href="https://www.freecodecamp.org/news/python-lists-explained-len-pop-index-and-list-comprehension/">Python Lists Explained: Len, Pop, Index, and List Comprehension</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo usar pip install en Python ]]>
                </title>
                <description>
                    <![CDATA[ Python viene con varios módulos integrados, pero la comunidad de Python tiene más que ofrecer. ¡Son los módulos los que hacen que Python sea tan poderoso! Los módulos de terceros añaden mucha más funcionalidad a Python. Así que es hora de aprender a instalar estos módulos para que podamos usarlos ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-usar-pip-install-en-python/</link>
                <guid isPermaLink="false">5fe198708c7cd154bb97c66c</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian J. Bustamante ]]>
                </dc:creator>
                <pubDate>Mon, 11 Jan 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1507680225127-6450260913c0-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Python viene con varios módulos integrados, pero la comunidad de Python tiene más que ofrecer. ¡Son los módulos los que hacen que Python sea tan poderoso!</p><p>Los módulos de terceros añaden mucha más funcionalidad a Python. Así que es hora de aprender a instalar estos módulos para que podamos usarlos en nuestros programas.</p><p>La forma más sencilla es utilizar <code>pip</code>.</p><pre><code class="language-text">pip install &lt;module_name&gt;</code></pre><p>Si has utilizado npm, puedes pensar en él como el <em>npm</em> de Python.</p><p>Nota: la diferencia es que con npm, es que <code>npm install</code> instala de forma predeterminada los paquetes localmente en un proyecto, mientras que <code>pip install</code> de forma predeterminada los instala globalmente.</p><p>Para instalar módulos localmente, necesitas crear y activar lo que se llama un entorno virtual, por lo que <code>pip install</code> se instala en la carpeta donde se encuentra ese entorno virtual, en lugar de globalmente (que puede requerir privilegios de administrador).</p><p>La última vez en el wiki de la &nbsp;<code><a>import</a>-statements</code> usamos el módulo <code>requests</code> como ejemplo. Como es un módulo de terceros, tenemos que instalarlo por separado después de instalar Python.</p><p>Instalarlo sería tan simple como ejecutar &nbsp;<code>pip install requests</code>. Incluso puedes pasar varios argumentos junto con él. El que te encontrarás con más frecuencia es <code>--upgrade</code>. Puede actualizar un módulo de Python mediante:</p><pre><code class="language-text">pip install &lt;module_name&gt; --upgrade</code></pre><p>Por ejemplo para actualizar el módulo requests a la última versión es tan sencillo como: <code>pip install requests --upgrade</code>.</p><p>Antes de usar <code>pip</code>, deberás instalarlo (es bastante simple). Puedes instalarlo desde <a href="https://bootstrap.pypa.io/get-pip.py">aquí</a></p><p>Haz clic en el enlace. Salva el fichero como <code>get-pip.py</code><em> Por favor, no olvides la extensión <code>.py</code>,</em> y ejecútalo.</p><p>Una alternativa al uso de pip sería probar <code><a href="https://bootstrap.pypa.io/ez_setup.py">easy_install</a></code>.</p><p>Utilizar <code>easy_install</code> es también muy sencillo. La sintaxis es:</p><pre><code class="language-text">easy_install &lt;module_name&gt;</code></pre><p>Sin embargo, <code>pip</code> es más popular que usar <code>easy_install</code>.</p><p><strong>Nota</strong>: en algunos sistemas donde están instalados Python 2 y Python 3, <code>pip</code> y <code>pip3</code> harán cosas diferentes. <code>pip</code> instala la versión Python 2 del paquete y <code>pip3</code> instalará la versión Python 3 del paquete.</p><p>Para obtener más información sobre la diferencia entre Python 2 y 3, consulta esta <a href="https://guide.freecodecamp.org/python/python-2-vs-python-3">guía</a>. Puedes verificar la versión de <code>pip</code> haciendo <code>pip --version</code> y/o <code>pip3 --version</code>:</p><pre><code class="language-text">pip3 --version
pip 18.0 from /usr/local/lib/python3.5/dist-packages/pip (python 3.5)</code></pre><p>También podemos crear un archivo txt que contenga una lista de módulos que deberían instalarse usando pip. Por ejemplo, podríamos crear el archivo requirements.txt y su contenido:</p><pre><code class="language-text">Kivy-Garden==0.1.4
macholib==1.5.1
idna==2.6
geoip2nation==0.1.2
docutils&gt;=0.14
Cython</code></pre><p>En este archivo también podríamos establecer una versión para la instalación. Después de esto, invocando a pip con:</p><pre><code class="language-text">pip install -r &lt;FICHERO QUE CONTIENE LOS MODULOS&gt;
 
          O EN NUESTRO EJEMPLO
 
 pip install -r requirements.txt</code></pre><p>debe instalar todos los módulos enumerados en el archivo.</p><p>Traducido del artículo <strong><a href="https://www.freecodecamp.org/news/how-to-use-pip-install-in-python/">How to use pip install in Python</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Indentación en Python con ejemplos ]]>
                </title>
                <description>
                    <![CDATA[ En general, es una buena práctica no mezclar tabuladores y espacios al programar en Python. Hacer esto puede causar un TabError y tu programa no funcionara. Se coherente cuando programes: elige indentar usando tabulaciones o espacios y sigue la convención elegida en todo el programa. Bloques de código e indentación ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/indentacion-en-python-con-ejemplos/</link>
                <guid isPermaLink="false">5fe0ea088c7cd154bb97c200</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian J. Bustamante ]]>
                </dc:creator>
                <pubDate>Sun, 03 Jan 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1529978025782-84b96d461eaf.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>En general, es una buena práctica no mezclar tabuladores y espacios al programar en Python. Hacer esto puede causar un <code>TabError</code> y tu programa no funcionara. Se coherente cuando programes: elige indentar usando tabulaciones o espacios y sigue la convención elegida en todo el programa.</p><h3 id="bloques-de-c-digo-e-indentaci-n">Bloques de código e indentación</h3><p>Una de las características más distintivas de Python es el uso de indentaciones para marcar bloques de código. Considera la declaración if de nuestro sencillo programa de verificación de contraseñas:</p><pre><code class="language-python">if pwd == 'manzana':
    print('Iniciando sesión ...')
else:
    print('Contraseña incorrecta.')

print('¡Todo terminado!')</code></pre><p>Las líneas <code>print('Iniciando sesión ...')</code> y <code>print('Contraseña incorrecta')</code> son dos bloques de código separados. Estos resultan tener solo una línea de longitud, pero Python le permite escribir bloques de código que constan de cualquier número de declaraciones.</p><p>Para indicar un bloque de código en Python, debes indentar cada línea del bloque en la misma cantidad. Los dos bloques de código en nuestro ejemplo sentencia if están endentados con cuatro espacios que es una cantidad típica de sangría para Python.</p><p>En la mayoría de los otros lenguajes de programación, la indentación se usa solo para ayudar a que el código se vea bonito. Pero en Python, es necesario para indicar a qué bloque de código pertenece una declaración. Por ejemplo, la sentencia final <code>print ("¡Todo terminado!")</code> No está endentada, por lo que no es parte del bloque else.</p><p>Los programadores familiarizados con otros lenguajes a menudo se irritan ante la idea de que la indentación importa: a muchos programadores les gusta la libertad de formatear su código como les plazca. Sin embargo, las reglas de indentación en Python son bastante simples y la mayoría de los programadores ya utilizan indentación para hacer que su código sea legible. Python simplemente lleva esta idea un paso más allá y le da significado a la sangría.</p><h3 id="sentencia-if-elif">Sentencia If/elif</h3><p>Una sentencia if / elif es una sentencia if generalizada con más de una condición. Se utiliza para tomar decisiones complejas. Por ejemplo, supongamos que una aerolínea tiene las siguientes tarifas de billetes para "niños": los niños de 2 años o menos vuelan gratis, los niños mayores de 2 pero menores de 13 pagan una tarifa de niño con descuento y cualquier persona de 13 años o más paga una tarifa de adulto normal. El siguiente programa determina cuánto debe pagar un pasajero:</p><pre><code class="language-python"># pasaje.py
edad = int(input('¿Qué edad tiene usted? '))
if edad &lt;= 2:
    print(' gratis')
elif 2 &lt; edad &lt; 13:
    print(' tarifa de niño)
else:
    print('tarifa para adultos')</code></pre><p>Después de que Python obtiene la edad del usuario, ingresa la declaración if / elif y verifica cada condición una tras otra en el orden en que se dan. Entonces, primero verifica si edad es menor a 2, y si es así, indica que el vuelo es libre y salta de la condición elif. Si edad no es menor que 2, entonces verifica la siguiente condición elif para ver si edad está entre 2 y 13. Si es así, muestra el mensaje apropiado y salta de la declaración if / elif. Si ni la condición if ni la condición elif son True, entonces ejecuta el código en el bloque else.</p><h3 id="expresiones-condicionales">Expresiones condicionales</h3><p>Python tiene un operador lógico más que le gusta a algunos programadores (¡y a otros no!). Es esencialmente una notación abreviada para declaraciones if que se pueden usar directamente dentro de expresiones. Considera este código:</p><pre><code class="language-python">comida = input("¿Cuál es tu comida favorita? ")
respuesta = 'yuck' if comida == 'cordero' else 'yum'</code></pre><p>La expresión en el lado derecho del = en la segunda línea se llama expresión condicional y se evalúa como "yuck" o "cordero". Es equivalente a lo siguiente:</p><pre><code class="language-python">comida = input("¿Cuál es tu comida favorita? ")
if comida == 'cordero':
   respuesta = 'yuck'
else:
   respuesta = 'yum'</code></pre><p>Las expresiones condicionales suelen ser más cortas que las correspondientes sentencias if / else, aunque no son tan flexibles o fáciles de leer. En general, deberías utilizarlas cuando simplifiquen tu código.</p><p><a href="https://docs.python.org/es/3/reference/lexical_analysis.html#indentation">Documentación oficial Python - Indentación</a></p><p>Traducido del artículo <strong><a href="https://www.freecodecamp.org/news/indentation-in-python/">Indentation in Python with Examples</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Operadores Básicos en Python con ejemplos ]]>
                </title>
                <description>
                    <![CDATA[ Los operadores son símbolos que le indican al intérprete que realice una operación específica, como aritmética, comparación, lógica, etc. Estos son los diferentes tipos de operadores en Python:  1. Operadores aritméticos   2. Operadores relacionales  3. Operadores Bit a Bit  4. Operadores de asignación  5. ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/operadores-basicos-en-python-con-ejemplos/</link>
                <guid isPermaLink="false">5fdc714a8c7cd154bb979b98</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian J. Bustamante ]]>
                </dc:creator>
                <pubDate>Fri, 01 Jan 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1515879218367-8466d910aaa4-1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Los operadores son símbolos que le indican al intérprete que realice una operación específica, como aritmética, comparación, lógica, etc.</p><p>Estos son los diferentes tipos de operadores en Python:</p><ol><li>Operadores aritméticos </li><li>Operadores relacionales</li><li>Operadores Bit a Bit</li><li>Operadores de asignación</li><li>Operadores lógicos</li><li>Operadores de pertenencia</li><li>Operadores de identidad</li></ol><p></p><h2 id="operadores-aritm-ticos">Operadores Aritméticos</h2><p>Un operador aritmético toma dos operandos como entrada, realiza un cálculo y devuelve el resultado.</p><p>Considera la expresión, <strong><strong><strong><strong>“a = 2 + 3”</strong></strong></strong></strong>. Aquí, <code>2</code> y &nbsp;<code>3</code> son los <em>operandos</em> y &nbsp;<code>+</code> es el <em>operador aritmético</em>. El resultado de la operación se almacena en la variable <code>a</code>.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align:center">Operador</th>
<th style="text-align:center">Descripción</th>
<th style="text-align:center">Uso</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">+</td>
<td style="text-align:center">Realiza Adición entre los operandos</td>
<td style="text-align:center">12 + 3 = 15</td>
</tr>
<tr>
<td style="text-align:center">-</td>
<td style="text-align:center">Realiza Substracción entre los operandos</td>
<td style="text-align:center">12 - 3 = 9</td>
</tr>
<tr>
<td style="text-align:center">*</td>
<td style="text-align:center">Realiza Multiplicación entre los operandos</td>
<td style="text-align:center">12 * 3 = 36</td>
</tr>
<tr>
<td style="text-align:center">/</td>
<td style="text-align:center">Realiza División entre los operandos</td>
<td style="text-align:center">12 / 3 = 4</td>
</tr>
<tr>
<td style="text-align:center">%</td>
<td style="text-align:center">Realiza un módulo entre los operandos</td>
<td style="text-align:center">16 % 3 = 1</td>
</tr>
<tr>
<td style="text-align:center">**</td>
<td style="text-align:center">Realiza la potencia de los operandos</td>
<td style="text-align:center">12 ** 3 = 1728</td>
</tr>
<tr>
<td style="text-align:center">//</td>
<td style="text-align:center">Realiza la división con resultado de número entero</td>
<td style="text-align:center">18 // 5 = 3</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>Nota: Para obtener el resultado en tipo flotante, uno de los operandos también debe ser de tipo flotante.</p><h2 id="operadores-relacionales"><strong>Operadores Relacionales </strong></h2><p>Un operador relacional se emplea para comparar y establecer la relación entre ellos. Devuelve un valor booleano (true o false) basado en la condición.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align:center">Operador</th>
<th style="text-align:center">Descripción</th>
<th style="text-align:center">Uso</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">&gt;</td>
<td style="text-align:center">Devuelve True si el operador de la izquierda es mayor que el operador de la derecha</td>
<td style="text-align:center">12 &gt; 3 devuelve True</td>
</tr>
<tr>
<td style="text-align:center">&lt;</td>
<td style="text-align:center">Devuelve True si el operador de la derecha es mayor que el operador de la izquierda</td>
<td style="text-align:center">12 &lt; 3 devuelve False</td>
</tr>
<tr>
<td style="text-align:center">==</td>
<td style="text-align:center">Devuelve True si ambos operandos son iguales</td>
<td style="text-align:center">12 == 3 devuelve False</td>
</tr>
<tr>
<td style="text-align:center">&gt;=</td>
<td style="text-align:center">Devuelve True si el operador de la izquierda es mayor o igual que el operador de la derecha</td>
<td style="text-align:center">12 &gt;= 3 devuelve True</td>
</tr>
<tr>
<td style="text-align:center">&lt;=</td>
<td style="text-align:center">Devuelve True si el operador de la derecha es mayor o igual que el operador de la izquierda</td>
<td style="text-align:center">12 &lt;= 3 devuelve False</td>
</tr>
<tr>
<td style="text-align:center">!=</td>
<td style="text-align:center">Devuelve True si ambos operandos no son iguales</td>
<td style="text-align:center">12 != 3 devuelve True</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><h2 id="operadores-bit-a-bit"><strong>Operadores Bit a Bit</strong></h2><p>Un operador bit a bit realiza operaciones en los operandos bit a bit.</p><p>Consideremos a = 2 (en binario = 10) y b = 3 (en binario = 11) para los siguientes casos.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align:center">Operador</th>
<th style="text-align:center">Descripción</th>
<th style="text-align:center">Uso</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">&amp;</td>
<td style="text-align:center">Realiza bit a bit la operación AND en los operandos</td>
<td style="text-align:center">a &amp; b = 2 (Binario: 10 &amp; 11 = 10)</td>
</tr>
<tr>
<td style="text-align:center">|</td>
<td style="text-align:center">Realiza bit a bit la operación OR en los operandos</td>
<td style="text-align:center">a | b = 3 (Binario: 10 | 11 = 11)</td>
</tr>
<tr>
<td style="text-align:center">^</td>
<td style="text-align:center">Realiza bit a bit la operación XOR en los operandos</td>
<td style="text-align:center">a ^ b = 1 (Binario: 10 ^ 11 = 01)</td>
</tr>
<tr>
<td style="text-align:center">~</td>
<td style="text-align:center">Realiza bit a bit la operación NOT bit a bit. Invierte cada bit en el operando</td>
<td style="text-align:center">~a = -3 (Binario: ~(00000010) = (11111101))</td>
</tr>
<tr>
<td style="text-align:center">&gt;&gt;</td>
<td style="text-align:center">Realiza un desplazamiento a la derecha bit a bit. Desplaza los bits del operador de la izquierda a la derecha tantos bits como indica el operador de la derecha</td>
<td style="text-align:center">a &gt;&gt; b = 0 (Binario: 00000010 &gt;&gt; 00000011 = 0)</td>
</tr>
<tr>
<td style="text-align:center">&lt;&lt;</td>
<td style="text-align:center">Realiza un desplazamiento a la izquierda bit a bit. Desplaza los bits del operando de la izquierda a la izquierda tantos bits como especifique el operador de la derecha</td>
<td style="text-align:center">a &lt;&lt; b = 16 (Binario: 00000010 &lt;&lt; 00000011 = 00001000)</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><h2 id="operadores-de-asignaci-n"><strong>Operadores de Asignación</strong></h2><p>Se utiliza un operador de asignación para asignar valores a una variable. Esto generalmente se combina con otros operadores (como aritmética, bit a bit) donde la operación se realiza en los operandos y el resultado se asigna al operando izquierdo.</p><p>Considera los siguientes ejemplos,</p><p><strong> a = 18</strong>. Aquí <code>=</code> es un operador de asignación, y el resultado se almacena en la variable a.</p><p><strong>a + = 10</strong>. Aquí <code>+=</code> es un operador de asignación, y el resultado se almacena en la variable a. Es lo mismo que a = a + 10.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align:center">Operador</th>
<th style="text-align:center">Descripción</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">=</td>
<td style="text-align:center">a = 5. El valor 5 es asignado a la variable a</td>
</tr>
<tr>
<td style="text-align:center">+=</td>
<td style="text-align:center">a += 5 es equivalente a a = a + 5</td>
</tr>
<tr>
<td style="text-align:center">-=</td>
<td style="text-align:center">a -= 5 es equivalente a a = a - 5</td>
</tr>
<tr>
<td style="text-align:center">*=</td>
<td style="text-align:center">a *= 3 es equivalente a a = a * 3</td>
</tr>
<tr>
<td style="text-align:center">/=</td>
<td style="text-align:center">a /= 3 es equivalente a a = a / 3</td>
</tr>
<tr>
<td style="text-align:center">%=</td>
<td style="text-align:center">a %= 3 es equivalente a a = a % 3</td>
</tr>
<tr>
<td style="text-align:center">**=</td>
<td style="text-align:center">a **= 3 es equivalente a a = a ** 3</td>
</tr>
<tr>
<td style="text-align:center">//=</td>
<td style="text-align:center">a //= 3 es equivalente a a = a // 3</td>
</tr>
<tr>
<td style="text-align:center">&amp;=</td>
<td style="text-align:center">a &amp;= 3 es equivalente a a = a &amp; 3</td>
</tr>
<tr>
<td style="text-align:center">|=</td>
<td style="text-align:center">a |= 3 es equivalente a a = a | 3</td>
</tr>
<tr>
<td style="text-align:center">^=</td>
<td style="text-align:center">a ^= 3 es equivalente a a = a ^ 3</td>
</tr>
<tr>
<td style="text-align:center">&gt;&gt;=</td>
<td style="text-align:center">a &gt;&gt;= 3 es equivalente a a = a &gt;&gt; 3</td>
</tr>
<tr>
<td style="text-align:center">&lt;&lt;=</td>
<td style="text-align:center">a &lt;&lt;= 3 es equivalente a a = a &lt;&lt; 3</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><h2 id="operadores-l-gicos"><strong>Operadores Lógicos</strong></h2><p>Se utiliza un operador lógico para tomar una decisión basada en múltiples condiciones. Los operadores lógicos utilizados en Python son &nbsp;<code>and</code>, <code>or</code> y <code>not</code>.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th style="text-align:center">Operador</th>
<th style="text-align:center">Descripción</th>
<th style="text-align:center">Uso</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">and</td>
<td style="text-align:center">Devuelve True si ambos operandos son True</td>
<td style="text-align:center">a and b</td>
</tr>
<tr>
<td style="text-align:center">or</td>
<td style="text-align:center">Devuelve True si alguno de los operandos es True</td>
<td style="text-align:center">a or b</td>
</tr>
<tr>
<td style="text-align:center">not</td>
<td style="text-align:center">Devuelve True si alguno de los operandos False</td>
<td style="text-align:center">not a</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><h2 id="operadores-de-pertenencia"><strong>Operadores de Pertenencia</strong></h2><p>Un operador de pertenencia se emplea para identificar pertenencia en alguna secuencia (listas, strings, tuplas).</p><p><code>in</code> y <code>not in</code> son operadores de pertenencia.</p><p><code>in</code> devuelve True si el valor especificado se encuentra en la secuencia. En caso contrario devuelve False.</p><p><code>not in</code> devuelve True si el valor especificado no se encuentra en la secuencia. En caso contrario devuelve False.</p><pre><code class="language-py">a = [1,2,3,4,5]
  
#Esta 3 en la lista a?
print 3 in a # Muestra True 
  
#No está 12 en la lista a?
print 12 not in a # Muestra True
  
str = "Hello World"
  
#Contiene World el string str?
print "World" in str # Muestra True
  
#Contiene world el string str? (nota: distingue mayúsculas y minúsculas)
print "world" in str # Muestra False  

print "code" not in str # Muestra True</code></pre><h2 id="operadores-de-identidad"><strong>Operadores de Identidad</strong></h2><p>Un operador de identidad se emplea para comprobar si dos variables emplean la misma ubicación en memoria.</p><p><code>is</code> y <code>is not</code> son operadores de identidad.</p><p><code>is</code> devuelve True si los operandos se refieren al mismo objeto. En caso contrario devuelve False.</p><p><code>is not</code> devuelve True si los operandos no se refieren al mismo objeto. En caso contrario devuelve False.</p><p>Ten en cuenta que dos valores, cuando son iguales, no implica necesariamente que sean idénticos.</p><pre><code class="language-py">a = 3
b = 3  
c = 4
print a is b # muestra True
print a is not b # muestra False
print a is not c # muestra True

x = 1
y = x
z = y
print z is 1 # muestra True
print z is x # muestra True

str1 = "FreeCodeCamp"
str2 = "FreeCodeCamp"

print str1 is str2 # muestra True
print "Code" is str2 # muestra False

a = [10,20,30]
b = [10,20,30]

print a is b # muestra False (ya que las listas son objetos mutables en Python)  </code></pre><p>Traducido del artículo <strong><strong><a href="https://www.freecodecamp.org/news/basic-operators-in-python-with-examples/">Basic Operators in Python With Examples</a></strong></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Sentencias If, Elif y Else en Python ]]>
                </title>
                <description>
                    <![CDATA[ Sentencias If Elif Else La estructuraif/elif/else es una forma común de controlar el flujo de un programa, lo que te permite ejecutar bloques de código específicos según el valor de algunos datos. Sentencia if Si la condición que sigue a la palabra clave if se evalúa como verdadera, el bloque ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/sentencias-if-elif-y-else-en-python/</link>
                <guid isPermaLink="false">5fdc6d3d8c7cd154bb979b01</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian J. Bustamante ]]>
                </dc:creator>
                <pubDate>Fri, 01 Jan 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1507680225127-6450260913c0.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <h2 id="sentencias-if-elif-else">Sentencias If Elif Else</h2><p>La estructura &nbsp;<code>if</code>/<code>elif</code>/<code>else</code> es una forma común de controlar el flujo de un programa, lo que te permite ejecutar bloques de código específicos según el valor de algunos datos.</p><p><strong>Sentencia if</strong></p><p>Si la condición que sigue a la palabra clave <code>if</code> &nbsp;se evalúa como verdadera, el bloque de código se ejecutará. Ten en cuenta que los paréntesis no se utilizan antes y después de la verificación de condición como en otros idiomas.</p><pre><code class="language-python">if True:
  print('¡el bloque If se ejecutará!')</code></pre><pre><code class="language-python">x = 5

if x &gt; 4:
  print("¡La condición era verdadera!") #Esta sentencia se ejecuta</code></pre><h3 id="sentencia-else"><strong>Sentencia else</strong></h3><p>Opcionalmente, puedes agregar una respuesta <code>else</code> que se ejecutará si la condición es <code>false</code></p><pre><code class="language-python">if not True:
  print('¡La sentencia If se ejecutará!')
else:
  print('¡La sentencia Else se ejecutará!')</code></pre><p>O también puedes ver este ejemplo:</p><pre><code class="language-python">y = 3

if y &gt; 4:
  print("¡No voy a imprimir!") #esta sentencia no se ejecuta
else:
  print("¡La condición no era verdadera!") #esta sentencia se ejecuta</code></pre><p><strong>Sentencia elif</strong></p><p>Se pueden verificar varias condiciones al incluir una o más verificaciones <code>elif</code> después de su declaración <code>if</code> inicial. Ten en cuenta que solo se ejecutará una condición:</p><pre><code class="language-python">z = 7

if z &gt; 8:
  print("¡No voy a imprimir!") #esta sentencia no se ejecuta
elif z &gt; 5:
  print("¡Yo lo haré!") #esta sentencia se ejecuta
elif z &gt; 6:
  print("¡Tampoco voy a imprimir!") #esta sentencia no se ejecuta
else:
  print("¡Yo tampoco!") #esta sentencia no se ejecuta</code></pre><p><em>Nota: solo se ejecutará la primera condición que se evalúe como <em><code>true</code></em>. </em>Aunque <code>z &gt; 6</code> es <code>true</code>, el bloque <code>if/elif/else</code> termina después de la primera condición verdadera. Esto significa que un <code>else</code> solo se ejecutará si ninguna de las condiciones es <code>true</code>.</p><p><strong>Sentencias if anidadas</strong></p><p>También podemos crear if anidados para la toma de decisiones. </p><p>Tomemos un ejemplo de cómo encontrar un número que sea par y también mayor que 10</p><pre><code class="language-text">python 
x = 34
if x %  2 == 0:  # así es como creas un comentario y ahora comprueba número par.
  if x &gt; 10:
    print("Este número es par y es mayor que 10")
  else:
    print("Este número es par, pero no mayor 10")
else:
  print ("El número no es par. Así que punto de verificación más.")</code></pre><p><br>Este fue solo un ejemplo simple de if anidados. No dudes en explorar más en línea.</p><p>Si bien los ejemplos anteriores son simples, puedes crear condiciones complejas utilizando comparaciones booleanas y operadores booleanos.</p><p><strong>Declaración if-else de Python en línea</strong><br>También podemos usar declaraciones if-else en funciones de Python en línea. El siguiente ejemplo debe verificar si el número es mayor o igual que 50, si es así, retorna True:</p><pre><code class="language-text">python 
x = 89
es_mayor = True if x &gt;= 50 else False

print(es_mayor)</code></pre><p>Salida:</p><pre><code class="language-text">&gt;
True
&gt;</code></pre><p>Traducido del artículo <strong><strong><a href="https://www.freecodecamp.org/news/if-elif-else-statements/">If, Elif, and Else Statements in Python</a></strong></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Expresiones Lambda en Python ]]>
                </title>
                <description>
                    <![CDATA[ Expresiones Lambda Las expresiones lambda se usan idealmente cuando necesitamos hacer algo simple y estamos más interesados en hacer el trabajo rápidamente en lugar de nombrar formalmente la función. Las expresiones lambda también se conocen como funciones anónimas. Las expresiones lambda en Python son una forma corta de declarar funciones ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/expresiones-lambda-en-python/</link>
                <guid isPermaLink="false">5fdc566c8c7cd154bb979a89</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian J. Bustamante ]]>
                </dc:creator>
                <pubDate>Thu, 31 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1431576901776-e539bd916ba2.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <h2 id="expresiones-lambda">Expresiones Lambda</h2><p>Las expresiones lambda se usan idealmente cuando necesitamos hacer algo simple y estamos más interesados en hacer el trabajo rápidamente en lugar de nombrar formalmente la función. Las expresiones lambda también se conocen como funciones anónimas.</p><p>Las expresiones lambda en Python son una forma corta de declarar funciones pequeñas y anónimas (no es necesario proporcionar un nombre para las funciones lambda).</p><p>Las funciones Lambda se comportan como funciones normales declaradas con la palabra clave <code>def</code>. Resultan útiles cuando se desea definir una función pequeña de forma concisa. Pueden contener solo una expresión, por lo que no son las más adecuadas para funciones con instrucciones de flujo de control.</p><h3 id="sintaxis-de-una-funci-n-lambda"><strong>Sintaxis de una función Lambda</strong></h3><p><code>lambda argumentos: expresión</code></p><p>Las funciones Lambda pueden tener cualquier número de argumentos, pero solo una expresión.</p><p><strong>Código de ejemplo:</strong></p><pre><code class="language-py"># Función Lambda para calcular el cuadrado de un número
square = lambda x: x ** 2
print(square(3)) # Resultado: 9

# Funcion tradicional para calcular el cuadrado de un numero
def square1(num):
  return num ** 2
print(square(5)) # Resultado: 25</code></pre><p>En el ejemplo de lambda anterior, <code>lambda x: x ** 2</code> produce un objeto de función anónimo que se puede asociar con cualquier nombre. Entonces, asociamos el objeto de función con <code>square</code>. De ahora en adelante, podemos llamar al objeto <code>square</code> como cualquier función tradicional, por ejemplo, <code>square(10)</code></p><h2 id="ejemplos-de-funciones-lambda"><strong><strong><strong>E</strong>jemplos de funciones lambda</strong></strong></h2><h3 id="principiante"><strong><strong>Principiante</strong></strong></h3><pre><code class="language-py">lambda_func = lambda x: x**2 # Funcion que recoge un número entero y devuelve su cuadrado
lambda_func(3) # Retorna 9</code></pre><h3 id="intermedio"><strong><strong>Intermedio</strong></strong></h3><pre><code class="language-py">lambda_func = lambda x: True if x**2 &gt;= 10 else False
lambda_func(3) # Retorna False
lambda_func(4) # Retorna True</code></pre><h3 id="complejos"><strong><strong><strong>Comple</strong>jos</strong></strong></h3><pre><code class="language-py">mi_dicc = {"A": 1, "B": 2, "C": 3}
sorted(mi_dicc, key=lambda x: my_dict[x]%3) # Retorna ['C', 'A', 'B']</code></pre><h2 id="casos-de-uso"><strong>Casos de uso</strong></h2><p>Supongamos que desea filtrar los números impares de una &nbsp;<code>lista</code>. Podrías usar un bucle <code>for</code>:</p><pre><code class="language-python">mi_lista = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
filtrado = []

for num in mi_lista:
     if num % 2 != 0:
         filtrado.append(num)

print(filtrado)      # Python 2: impresión de filtrado
# [1, 3, 5, 7, 9]</code></pre><p>O podría escribir esto en una línea con comprensión de listas (list-comprehensions). La compresión de listas ofrece una sintaxis más corta cuando deseas crear una nueva lista basada en los valores de una lista existente:</p><pre><code class="language-python">filtrado = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] if x % 2 != 0]</code></pre><p>Pero es posible que tengas la tentación de utilizar la función integrada <code>filter</code>. ¿Por qué? El primer ejemplo es demasiado detallado y la frase de una sola línea puede ser más difícil de entender. Pero <code>filter</code> ofrece lo mejor de ambas palabras. Además, las funciones integradas suelen ser más rápidas.</p><pre><code class="language-python">mi_lista = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

filtrado = filter(lambda x: x % 2 != 0, mi_lista)

list(filtrado)
# [1, 3, 5, 7, 9]</code></pre><p>NOTA: en Python 3, las funciones integradas devuelven objetos generadores, por lo que se debe llamar la función <code>list</code>. La función <code>list</code> crea un objecto de lista. &nbsp;En Python 2, por otro lado, devuelven una <code>lista</code>, <code>tupla</code> o &nbsp;<code>string</code>.</p><p>¿Entonces qué ha ocurrido? Le dijiste a <code>filter</code> que tomara cada elemento en <code>mi_lista</code> y aplicara la expresión lambda. Los valores que devuelven <code>False</code> se filtran.</p><p><strong><strong><strong>M</strong></strong>ás información<strong><strong>:</strong></strong></strong></p><ul><li><a href="https://docs.python.org/es/3/reference/expressions.html#lambda">Documentación oficial</a></li></ul><p>Traducido del artículo <strong><strong><a href="https://www.freecodecamp.org/news/lambda-expressions-in-python/">Lambda Expressions in Python</a></strong></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Python Diccionario explicación de la estructura de datos ]]>
                </title>
                <description>
                    <![CDATA[ El diccionario es una de las estructuras de datos más utilizadas en Python. Un diccionario es una colección desordenada de elementos. A menudo, tenemos claves y valores almacenados en un diccionario. Veamos algunos ejemplos de cómo se usa el diccionario. # declaración de diccionario 1 dict1 = dict() # declaración ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/estructura-de-datos-en-python-explicado/</link>
                <guid isPermaLink="false">5fdb1abd8c7cd154bb978744</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian J. Bustamante ]]>
                </dc:creator>
                <pubDate>Wed, 30 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1524639064490-254e0a1db723.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>El diccionario es una de las estructuras de datos más utilizadas en Python. Un diccionario es una colección desordenada de elementos. A menudo, tenemos claves y valores almacenados en un diccionario. Veamos algunos ejemplos de cómo se usa el diccionario.</p><pre><code class="language-python"># declaración de diccionario 1
dict1 = dict()

# declaración de diccionario 2
dict2 = {}

# Añadir items al diccionario
# La sintaxis para añadir y recuperar elementos es la misma para los dos objetos que hemos definido anteriormente. 
key = "X"
value = "Y"
dict1[key] = value

# El diccionario no tiene un tipo especifico de datos. 
# Entonces, los valores pueden ser muy diversos. 
dict1[key] = dict2</code></pre><p>Veamos ahora algunas formas de recuperar la información.</p><pre><code class="language-python"># Desde que existe "X" en nuestro diccionario, esta sentencia nos devolverá el valor
value = dict1[key]

# Esta clave no existe en el diccionario. 
# Entonces, esto devolverá un `KeyError`
value = dict1["random"]</code></pre><h3 id="evitando-el-keyerror-utiliza-la-funci-n-get"><strong><strong>Evitando el<strong> KeyError: </strong>Utili</strong>za<strong> la funció</strong>n<strong><strong> .get</strong></strong></strong></h3><p>En caso de que la clave proporcionada no exista en el diccionario, Python lanzará un &nbsp;<code>KeyError</code>. Hay una solución sencilla. Veamos como podemos evitar el &nbsp;<code>KeyError</code> utilizando la función &nbsp;<code>.get</code> incluida en los diccionarios.</p><pre><code class="language-python">dict_ = {}

# Una clave aleatoria
random_key = "random"

# La manera más sencilla de hacer esto es comprobar que existe la clave 
# en el diccionario o no y solo recupera la clave si existe. 
# En caso contrario no. 
if random_key in dict_:
  print(dict_[random_key])
else:
  print("Key = {} doesn't exist in the dictionary".format(dict_))</code></pre><p>Muchas veces podemos obtener un valor predeterminado cuando la clave no existe. Por ejemplo al construir un contador. Existe una manera mejor de obtener valores predeterminados del diccionario en caso de que falten claves en lugar de confiar en el <code>if-else</code> estándar.</p><pre><code class="language-python"># Digamos que queremos construir un contador de cuantas veces aparece un elemento en el siguiente arreglo
arr = [1,2,3,1,2,3,4,1,2,1,4,1,2,3,1]

freq = {}

for item in arr:
  # Trae un valor para 0 en caso de que no exista. En caso contrario trae el valor almacenado
  freq[item] = freq.get(item, 0) + 1</code></pre><p>Entonces, &nbsp;<code>get(&lt;key&gt;, &lt;defaultval&gt;)</code> es una operación útil para recuperar el valor predeterminado para cualquier clave dada del diccionario. El problema con este método surge cuando queremos tratar con estructuras de datos mutables como &nbsp;<code>list</code> o <code>set</code>.</p><pre><code class="language-python">dict_ = {}

# Alguna clave aleatoria
random_key = "random"

dict_[random_key] = dict_.get(random_key, []).append("Hello World!")
print(dict_) # {'random': None}

dict_ = {}
dict_[random_key] = dict_.get(random_key, set()).add("Hello World!")
print(dict_) # {'random': None}</code></pre><p>¿Has visto el problema?</p><p>El nuevo <code>set</code> o la <code>list</code> no se asigna a la clave del diccionario. Debemos asignar una nueva <code>list</code> o un <code>set</code> a la clave en caso de que falte un valor y luego <code>append</code> (append) o <code>add</code> (añadir) respectivamente. Mira un ejemplo para esto.</p><pre><code class="language-python">dict_ = {}
dict_[random_key] = dict_.get(random_key, set())
dict_[random_key].add("Hello World!")
print(dict_) # {'random': set(['Hello World!'])}. Yay!</code></pre><h2 id="evitar-keyerror-utiliza-defaultdict">Evitar KeyError: Utiliza defaultdict</h2><p>Esto funciona la mayoría de las veces. Sin embargo, existe una mejor forma de hacerlo. Una forma más pythónica. El <code>defaultdict</code> es una subclase de la clase dict incorporada. El <code>defaultdict</code> simplemente asigna el valor predeterminado que especificamos en caso de que falte una clave. Entonces, los dos pasos:</p><pre><code class="language-python">dict_[random_key] = dict_.get(random_key, set())
dict_[random_key].add("Hello World!")</code></pre><p>Ahora se pueden combinar en un único paso. Por ejemplo:</p><pre><code class="language-python">rom collections import defaultdict

# Otra clave aleatoria
random_key = "random_key"

# list como defaultdict
list_dict_ = defaultdict(list)

# set como defaultdict
set_dict_ = defaultdict(set)

# integer como defaultdict
int_dict_ = defaultdict(int)

list_dict_[random_key].append("Hello World!")
set_dict_[random_key].add("Hello World!")
int_dict_[random_key] += 1

"""
  defaultdict(&lt;class 'list'&gt;, {'random_key': ['Hello World!']}) 
  defaultdict(&lt;class 'set'&gt;, {'random_key': {'Hello World!'}}) 
  defaultdict(&lt;class 'int'&gt;, {'random_key': 1})
"""
print(list_dict_, set_dict_, int_dict_)</code></pre><p>Traducido del artículo <strong><strong><a href="https://www.freecodecamp.org/news/python-dictionary-data-structure-explained/">Python Dictionary Data Structure Explained</a></strong></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Configuración de Git por primera vez ]]>
                </title>
                <description>
                    <![CDATA[ Git es un sistema de control de versiones distribuidas de código abierto y gratuito. Git es el sistema de control de versiones moderno más utilizado en el mundo hoy en día. Git es un proyecto de código abierto distribuido y mantenido activamente, el cual fue desarrollado originalmente en el 2005 ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/configuracion-inicial-git/</link>
                <guid isPermaLink="false">5fdb00758c7cd154bb978617</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian J. Bustamante ]]>
                </dc:creator>
                <pubDate>Tue, 29 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/article-banner--9--1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Git es un sistema de control de versiones distribuidas de código abierto y gratuito.</p><p>Git es el sistema de control de versiones moderno más utilizado en el mundo hoy en día. Git es un proyecto de código abierto distribuido y mantenido activamente, el cual fue desarrollado originalmente en el 2005 por <a href="https://en.wikipedia.org/wiki/Linus_Torvalds">Linus Torvalds</a>, el famoso creador del kernel del sistema operativo Linux.</p><p>Git es muy diferente a los sistemas de control de versiones centralizados más antiguos, como SVN y CVS, Git se distribuye. Con Git cada desarrollador cuenta con el historial completo de su repositorio de código localmente. Git también funciona bien en una amplia gama de sistemas operativos e IDE (entornos de desarrollo integrados).</p><p>En este artículo, te mostraré cómo instalar Git, configurarlo por primera vez, consejos útiles y recursos para aprender más conceptos avanzados de git. ¡Vamos a ello!</p><p>Un resumen rápido de lo que significa el control de versiones: </p><p>El control de versiones es el proceso de administrar cambios en el código fuente o en un conjunto de archivos a lo largo del tiempo.</p><p>El software de control de versiones realiza un seguimiento de cada modificación del código en un tipo especial de base de datos. Si se comete un error, los desarrolladores pueden restaurar y comparar versiones anteriores del código para ayudar a corregir el error y minimizar la interrupción para todos los miembros del equipo o colaboradores.</p><hr><p>Ahora que sabes lo que significan Control de versiones y Git, vamos a instalarlo.</p><h3 id="para-el-sistema-operativo-mac-"><strong>PARA EL SISTEMA OPERATIVO MAC:</strong><br></h3><p><a href="http://git-scm.com/download/mac">Descarga Git para macOS</a> o instálalo utilizando <a href="https://brew.sh/">Homebrew</a></p><pre><code>brew install git
</code></pre><h3 id="para-el-sistema-operativo-linux-"><strong>PARA EL SISTEMA OPERATIVO LINUX:</strong><br></h3><p><a href="https://git-scm.com/download/linux">Descarga Git para Linux</a> o instálalo para:</p><p>Sistemas Linux basados en Debian</p><pre><code>sudo apt-get update
 sudo apt-get upgrade
 sudo apt-get install git
</code></pre><p>o<br>Instálalo para sistemas Linux basados en Red Hat</p><pre><code>sudo yum upgrade
 sudo yum install git
</code></pre><h3 id="para-el-sistema-operativo-windows-"><strong>PARA EL SISTEMA OPERATIVO WINDOWS:</strong><br></h3><p><a href="https://git-scm.com/download/win">Descargar Git para Windows</a></p><h4 id="en-la-documentaci-n-oficial-de-git-puedes-encontrar-una-guia-mas-detallada-de-instalaci-n-para-sistema-operativo-"><a href="https://git-scm.com/book/en/v2/Getting-Started-Installing-Git"><strong>EN LA DOCUMENTACIÓN OFICIAL DE GIT </strong></a><strong>PUEDES ENCONTRAR UNA GUIA MAS DETALLADA DE INSTALACIÓN PARA SISTEMA OPERATIVO, </strong></h4><hr><p>Ahora que tienes Git en tu sistema, configuremos el entorno de Git.<br>Git viene con una herramienta llamada <code>git config</code> que te permite obtener y establecer variables de configuración que controlan todos los aspectos de cómo se ve y funciona Git. </p><ul><li>Primero configura tu identidad, tu nombre y correo electrónico, por ejemplo:</li></ul><pre><code>git config --global user.name "bolajiayodeji"
 git config --global user.email mailtobolaji@gmail.com
</code></pre><p>la opción <code>--global</code> asegura que estos valores se utilizarán en todo tu sistema.</p><ul><li>A continuación, configure el editor de texto predeterminado que usarás siempre que necesites introducir un mensaje en Git. Este paso no es obligatorio, si no lo configuras, Git usará su editor predeterminado. Si deseas usar otro, puedes configurarlo así:</li></ul><pre><code>git config --global core.editor emacs
</code></pre><ul><li>A continuación, configura los colores para la consola de Git.</li></ul><p>Los usuarios del sistema operativo Linux, pueden usar configuradores Zsh de terceros como <a href="https://ohmyz.sh/">oh my zsh</a> para personalizar el aspecto del terminal con temas :).<br>Para configurar ejecuta:</p><pre><code>git config --global color.ui true
</code></pre><p>Color.ui es una metaconfiguración que incluye todas las diversas configuraciones de color.* disponibles con los comandos git.</p><p>Ahora Git está listo para usarse.</p><h2 id="comprueba-tu-configuraci-n"><strong>COMPRUEBA TU CONFIGURACIÓN</strong></h2><pre><code>git config --list
</code></pre><pre><code>user.name=bolajiayodeji
 user.email=mailtobolaji@gmail.com
 color.ui=true
</code></pre><hr><h1 id="conclusiones"><strong>CONCLUSIONES</strong></h1><p>El software de control de versiones es una parte esencial del día a día de las prácticas modernas del desarrollador de software de hoy en día. Una vez acostumbrados a los poderosos beneficios de los sistemas de control de versiones, muchos desarrolladores no considerarían trabajar sin él, incluso para proyectos que no son de software.</p><p>Traducido del artículo de<strong> <strong><a href="https://www.freecodecamp.org/news/author/bolajiayodeji/">Bolaji Ayodeji</a></strong></strong> - <strong><a href="https://www.freecodecamp.org/news/git-first-time-setup/">Git first time setup</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial Python bucles While -  Haz Ejemplos de Sentencias While Verdadero. ]]>
                </title>
                <description>
                    <![CDATA[ Los bucles son una secuencia de instrucciones que se ejecutan hasta que se cumple una condición. Veamos cómo funcionan los bucles while en Python. ¿Qué son los bucles? Si estás aprendiendo a programar, los bucles son uno de los conceptos principales que debe comprender. Los bucles te ayudan a ejecutar ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/curso-bucle-do-while-ejemplos/</link>
                <guid isPermaLink="false">5fd78a8a8c7cd154bb9763a1</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian J. Bustamante ]]>
                </dc:creator>
                <pubDate>Sat, 19 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/Blue-Engagement-Essentials-Blog-Banner-1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Los bucles son una secuencia de instrucciones que se ejecutan hasta que se cumple una condición. Veamos cómo funcionan los bucles while en Python.</p><h2 id="-qu-son-los-bucles">¿Qué son los bucles?</h2><p>Si estás aprendiendo a programar, los bucles son uno de los conceptos principales que debe comprender. Los bucles te ayudan a ejecutar una secuencia de instrucciones hasta que se cumple una condición.</p><p>Hay dos tipos principales de bucles en Python.</p><ul><li>Bucles For</li><li>Bucles While</li></ul><p>Ambos tipos de bucles se pueden utilizar para acciones similares. Pero a medida que aprendas a escribir programas eficientes, sabrás cuándo usar cual.</p><p>En este artículo, veremos los bucles while en Python. Para obtener más información sobre los bucles for, <a href="https://www.freecodecamp.org/espanol/news/bucles-for-en-python/">consulta este artículo publicado recientemente en freeCodeCamp</a>.</p><h2 id="bucles-while">Bucles While</h2><p>El concepto detrás de un ciclo while es simple: mientras una condición es verdadera -&gt; Ejecuta mis comandos.</p><p>El bucle while comprueba la condición cada vez, y si devuelve "true", ejecutará las instrucciones dentro del bucle.</p><p>Antes de comenzar a escribir código, veamos el diagrama de flujo para ver cómo funciona.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2020/12/while-loop.jpg" class="kg-image" alt="while-loop" width="456" height="466" loading="lazy"></figure><p>Ahora escribamos algo de código. Así es como se escribe un bucle while simple para imprimir números del 1 al 10.</p><pre><code class="language-python">#!/usr/bin/python

x = 1

while(x &lt;= 10):
	print(x)
	x = x+1</code></pre><p>Si observas el código anterior, el bucle sólo se ejecutará si x es menor o igual que 10. Si inicializa x como 20, el ciclo nunca se ejecutará.</p><p>Aquí está la salida del bucle while:</p><pre><code>&gt; python script.py
1
2
3
4
5
6
7
8
9
10</code></pre><h3 id="bucle-do-while"><strong>Bucle Do-While</strong></h3><p>Hay dos variantes del bucle while: while y do-While. La diferencia entre los dos es que do-while se ejecuta al menos una vez.</p><p>Es posible que un bucle while ni siquiera se ejecute una vez si no se cumple la condición. Sin embargo, do-while se ejecutará una vez, luego verificará la condición para bucles posteriores.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2020/12/do-while.jpg" class="kg-image" alt="do-while" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2020/12/do-while.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/2020/12/do-while.jpg 888w" sizes="(min-width: 720px) 720px" width="888" height="656" loading="lazy"></figure><p>A pesar de estar presente en la mayoría de los lenguajes de programación populares, Python no tiene una declaración nativa do-while. Pero puede emular fácilmente un bucle do-while utilizando otros enfoques, como funciones.</p><p>Probemos el enfoque de hacer mientras envuelve los comandos en una función.</p><pre><code>#!/usr/bin/python

x = 20

def run_commands():
	x = x+1
	print(x)


run_commands()
while(x &lt;= 10):
	run_commands()</code></pre><p>El código anterior ejecuta la función "run_commands ()" una vez antes de invocar el bucle while. Una vez que se inicia el bucle while, la función "run_commands" nunca se ejecutará ya que x es igual a 20.</p><h3 id="while-else"><strong>While - Else</strong></h3><p>Puedes agregar una instrucción <code>else</code> para ejecutar si falla la condición de bucle.</p><p>Agreguemos una condición <code>else</code> a nuestro código para imprimir "Done" una vez que hayamos impreso los números del 1 al 10.</p><pre><code>#!/usr/bin/python

x = 1

while(x &lt;= 10):
	print(x)
	x = x+1
else:
	print("Done")</code></pre><p>El código anterior imprimirá primero los números del 1 al 10. Cuando x es 11, la condición while fallará, desencadenando la condición <code>else</code>.</p><h2 id="sentencia-while-en-una-nica-l-nea">Sentencia While en una única línea</h2><p>Si solo tiene una sola línea de código dentro de tu &nbsp;bucle while, puedes usar la sintaxis de una sola línea.</p><pre><code>#!/usr/bin/python

x = 1
while (x): print(x)</code></pre><h2 id="bucles-infinitos"><br>Bucles infinitos</h2><p>Si no tienes cuidado al escribir bucles, creará bucles infinitos. Los bucles infinitos son aquellos en los que la condición siempre es cierta.</p><pre><code>#!/usr/bin/python

x = 1
while (x &gt;= 1):
	print(x)</code></pre><p>El código anterior es un ejemplo de un bucle infinito. No hay ningún comando para alterar el valor de x, por lo que la condición "x es mayor o igual que 1" es siempre verdadera. Esto hará que el bucle funcione para siempre.</p><p>Tenga siempre cuidado al escribir bucles. Un pequeño error puede provocar un bucle infinito y bloquear su aplicación.</p><h2 id="control-de-bucles"><strong>Control de bucles</strong></h2><p>Finalmente, veamos cómo controlar el flujo de un bucle mientras se está ejecutando.</p><p>Cuando esté escribiendo aplicaciones del mundo real, a menudo se encontrará con escenarios en los que necesita agregar condiciones adicionales para omitir un bucle o salir de un bucle.</p><h2 id="break">Break</h2><p>Veamos cómo salir del ciclo mientras la condición es verdadera.</p><pre><code>#!/usr/bin/python

x = 1
while (x &lt;= 10):
    if(x == 5):
    	break
    print(x)
    x += 1</code></pre><p>En el código anterior, el bucle detendrá la ejecución cuando x sea 5, a pesar de que x sea mayor o igual que 1.</p><h2 id="continue">Continue</h2><p>Aquí hay otro escenario: digamos que desea omitir el bucle si se cumple una determinada condición. Sin embargo, desea continuar con las ejecuciones posteriores hasta que la condición principal while se vuelva falsa.</p><p>Puede usar la palabra clave "continuar" para eso, así:</p><pre><code>#!/usr/bin/python

x = 1
while (x &lt;= 10):
    if(x == 5):
    	x += 1
    	continue
    print(x)</code></pre><p>En el ejemplo anterior, el bucle se imprimirá de 1 a 10, excepto 5. Cuando x es 5, el resto de los comandos se omiten y el flujo de control vuelve al inicio del bucle while.</p><h2 id="resumen">Resumen</h2><p>Los bucles son uno de los componentes más útiles en la programación que utilizará a diario.</p><p>For y while son los dos bucles principales en Python. El bucle while tiene dos variantes, while y do-while, pero Python solo admite la primera.</p><p>Puede controlar el flujo del programa utilizando los comandos 'interrumpir' y 'continuar'. Siempre tenga en cuenta la creación accidental de bucles infinitos.</p><p>Escribo regularmente sobre temas que incluyen Inteligencia Artificial y Ciberseguridad. Si te gustó este artículo, <a href="https://medium.com/manishmshiva">puedes leer mi blog aquí</a>.</p><p>Traducido del artículo de<a href="https://www.freecodecamp.org/news/author/manishmshiva/"><strong> </strong></a><strong><a href="https://www.freecodecamp.org/news/author/manishmshiva/"><strong>Manish Shivanandhan</strong></a></strong> - <strong><a href="https://www.freecodecamp.org/news/python-while-loop-tutorial-do-while-true-example-statement/">Python While Loop Tutorial – Do While True Example Statement</a></strong><br></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo crear documentación de tus pruebas de Python ]]>
                </title>
                <description>
                    <![CDATA[ ¿Qué pasaría si te dijera que puedes crear automáticamente documentación a partir de tus pruebas existentes que siempre estará actualizada? ¿Y si pudiera estar en formato Markdown, por lo que se distribuiría junto con el resto de tu código y se mostraría en GitLab / GitHub? Suena muy bien, ¿verdad? ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-crear-documentacion-de-tus-pruebas-de-python/</link>
                <guid isPermaLink="false">5fd790188c7cd154bb976460</guid>
                
                    <category>
                        <![CDATA[ Automatizacion ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian J. Bustamante ]]>
                </dc:creator>
                <pubDate>Sat, 19 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/docs-from_tests_example_graph-1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>¿Qué pasaría si te dijera que puedes crear automáticamente documentación a partir de tus pruebas existentes que siempre estará actualizada?</p><p>¿Y si pudiera estar en formato Markdown, por lo que se distribuiría junto con el resto de tu código y se mostraría en GitLab / GitHub?</p><p>Suena muy bien, ¿verdad? Veamos cómo se hace.</p><h2 id="contexto">Contexto</h2><p>Personas como Simon Brown hacen un gran trabajo al convencerme de que no tengo suficiente documentación para mis proyectos. Y que la documentación debe estar actualizada y mostrar información concisa en una variedad de niveles de abstracción.</p><p>Me encantaría trabajar en un base de código con documentación como esa.</p><h2 id="el-problema-con-la-documentaci-n">El Problema con la Documentación</h2><p>He leído una buena cantidad de libros y artículos sobre arquitectura de software y cosas relacionadas. Pero nunca he podido reunir suficiente energía, o suficiente capital político, para poder crear documentación de acuerdo con este estándar. Y mucho menos mantenerlo actualizado.</p><p>Entonces, al menos para mi situación, necesito una forma de crear y actualizar documentación automáticamente.</p><p>También me gustaría almacenar los diagramas "como código", para que puedan registrarse en el repositorio. De esta manera, los cambios en ellos se pueden ver y discutir fácilmente en solicitudes de extracción y otras revisiones de código.</p><p>Hay muchas herramientas que pueden generar diagramas de dependencia del tiempo de construcción a partir del código, y he usado bastantes de ellas.</p><p>Pero el problema parece ser que estos diagramas siempre parecen espaguetis, incluso cuando el código es bueno. Y son complejos de configurar.</p><p>Parece muy difícil conseguir el nivel de detalle correcto. No hay forma de mostrar código relacionado en grupos lógicos para diagramas de alto nivel. Tampoco hay forma de seleccionar relaciones de código que sean específicas de un contexto particular para diagramas de bajo nivel.</p><p>Tampoco le brindan información sobre las relaciones de tiempo de ejecución del código, que generalmente es un problema mayor que las relaciones de tiempo de diseño.</p><h2 id="una-soluci-n">Una solución</h2><p>Para capturar las relaciones en tiempo de ejecución, la única opción es generar diagramas a partir del código en ejecución. Y ya tenemos mucho código que se ejecuta regularmente, en forma de pruebas.</p><p>Los repositorios ya deberían tener un buen conjunto de pruebas (unidad, integración y de extremo a extremo, por ejemplo), y cada prueba debería ser relativamente corta y sencilla.</p><p>Estas pruebas ya deberían incorporar agrupaciones lógicas de código y niveles sensibles de abstracción. Por lo que son un excelente candidato para generar documentación.</p><p>La solución implica instrumentar el código importado por un prueba. Este código instrumentado mantiene un registro de la jerarquía de llamadas en tiempo de ejecución y es capaz de escribir los resultados como un diagrama Mermaid en markdown (técnicamente un diagrama de secuencia).</p><p>Para cada prueba existente, crea una prueba de "envoltura", que es responsable de inicializar la jerarquía de llamadas y guardar el diagrama. Si tiene muchas pruebas, es posible que desees introducir un decorador para evitar la repetición.</p><pre><code class="language-python">from docs_from_tests.instrument_call_hierarchy import instrument_and_import_package, instrument_and_import_module, initialise_call_hierarchy, finalise_call_hierarchy
from samples.hello_world_combiner import HelloWorldCombiner

# puedes instrumentar paquetes / carpetas completos a la vez de esta manera
instrument_and_import_package(os.path.join(Path(__file__).parent.absolute(), '..', 'samples'), 'samples')
# Puedes instrumentar módulos individuales como este
# instrument_and_import_module('tests.blah')

# este es un contenedor alrededor de la prueba que también genera el diagrama de documentación / secuencia
def test_hello_world():
    # la inicializa la grabación de la jerarquía de llamadas
    initialise_call_hierarchy('start')

    # Esto ejecuta la prueba real
    _test_hello_world()
    
    # esto finaliza la jerarquía de llamadas y devuelve la raíz
    root_call = finalise_call_hierarchy()

    # esto devuelve un diagrama de secuencia de la jerarquía de llamadas
    sequence_diagram = root_call.sequence_diagram(
        show_private_functions=False,
        excluded_functions=[
            'HelloWorldCombiner.__init__',
        ]
    )

    # esto escribe la rebaja en el disco    
    sequence_diagram_filename = os.path.join(os.path.dirname(__file__), '..', 'doc', 'top-level-sequence-diagram.md')
    Path(sequence_diagram_filename).write_text(sequence_diagram)

# esta es la prueba original / fuente
def _test_hello_world():
    assert HelloWorldCombiner().combine() == 'Hello world'</code></pre><p>Ejecutar <code>pytest</code> en este código dará como resultado la ejecución de la prueba y la creación del "diagrama como código" en markdown (a continuación) en el directorio doc:</p><pre><code>sequenceDiagram
  start-&gt;&gt;HelloWorldCombiner.combine: calls x1
  HelloWorldCombiner.combine-&gt;&gt;hello: calls x1
  hello--&gt;&gt;HelloWorldCombiner.combine: returns str
  HelloWorldCombiner.combine-&gt;&gt;world: calls x1
  world--&gt;&gt;HelloWorldCombiner.combine: returns str
  HelloWorldCombiner.combine--&gt;&gt;start: returns str</code></pre><p>Esto representa como el siguiente diagrama:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2020/12/docs-from_tests_example_graph-2.png" class="kg-image" alt="docs-from_tests_example_graph-2" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2020/12/docs-from_tests_example_graph-2.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2020/12/docs-from_tests_example_graph-2.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2020/12/docs-from_tests_example_graph-2.png 1280w" sizes="(min-width: 720px) 720px" width="1280" height="661" loading="lazy"></figure><p>Los cambios en el diagrama aparecerán en Git y se distribuirán junto con el código que provocó el cambio. Esto significa que el cambio en el código y el cambio en el diagrama están vinculados y se pueden ver juntos.</p><p>Los métodos privados generalmente se excluyen (aunque es opcional), y puede excluir otras funciones para que el gráfico tenga el aspecto deseado.</p><p>Debido a que la jerarquía de llamadas se almacena en una estructura de árbol, excluir una función también excluye todas las funciones incluidas en ella.</p><h2 id="calidad-del-c-digo">Calidad del código</h2><p>Es de esperar que ya tengas pruebas en los niveles apropiados de abstracción (normalmente tendrías prueba unitarios, de integración y de extremo a extremo). Esto facilita la creación de diagramas en estos niveles.</p><p>Si no, entonces el deseo de crear buenos diagramas debería guiarlo hacia la creación también de buenas pruebas.</p><p>A veces, los diagramas se verán un poco desordenados y es posible que termines ignorando muchas funciones. Esta es una pista de que el código probablemente podría simplificarse. Y en este caso, el deseo de crear buenos diagramas debería guiarte hacia la simplificación del código.</p><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>¡Esperamos que este artículo le sirva como inspiración para crear y mantener la documentación que tus compañeros de equipo y tu futuro yo te agradecerán! Es bastante fácil de hacer.</p><p>Toda la funcionalidad está en un paquete de Python (<a href="https://pypi.org/project/docs-from-tests/">docs-from-tests</a>), y hay un repositorio de ejemplo que demuestra cómo usarlo.</p><p>Traducido del artículo de<a href="https://www.freecodecamp.org/news/author/manishmshiva/"><strong> </strong></a><strong>C<a href="https://www.freecodecamp.org/news/author/cedd/"><strong>edd </strong>B<strong>urge</strong></a></strong> - <strong><a href="https://www.freecodecamp.org/news/how-to-create-documentation-from-your-python-tests/">How to Create Documentation from Your Python Tests</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué es un archivo SVG? Explicación de etiquetas e imágenes SVG ]]>
                </title>
                <description>
                    <![CDATA[ SVG SVG o Gráficos Vectoriales Escalables es un estándar web para definir gráficos basados en vectores en páginas web. Basado en XML, el estándar SVG proporciona marcado para describir rutas, formas y texto dentro de una ventana gráfica. El marcado se puede incrustar directamente en HTML para mostrarlo o guardarlo ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-svg-explicacion-de-etiquetas-imagenes/</link>
                <guid isPermaLink="false">5fd6499a8c7cd154bb975bb8</guid>
                
                    <category>
                        <![CDATA[ SVG ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian J. Bustamante ]]>
                </dc:creator>
                <pubDate>Fri, 18 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/04/photo-1482455480256-f49706deb391.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <h2 id="svg"><strong><strong><strong><strong>SVG</strong></strong></strong></strong></h2><p>SVG o Gráficos Vectoriales Escalables es un estándar web para definir gráficos basados en vectores en páginas web. Basado en XML, el estándar SVG proporciona marcado para describir rutas, formas y texto dentro de una ventana gráfica. El marcado se puede incrustar directamente en HTML para mostrarlo o guardarlo en un archivo <code>.svg</code> e insertarlo como cualquier otra imagen.</p><p>Puede escribir SVG a mano, pero se pueden diseñar gráficos más complicados en editores de gráficos vectoriales como Illustrator o InkScape y exportarlos a archivos o código SVG.</p><h2 id="conceptos-b-sicos-de-svg"><strong><strong>Conceptos b</strong>ásicos de <strong><strong><strong>SVG</strong></strong></strong></strong></h2><p>Los desarrolladores inician un gráfico <code>&lt;svg&gt;</code> con la etiqueta &nbsp;y el espacio de nombres XML así:</p><pre><code class="language-svg">&lt;svg xmlns="http://www.w3.org/2000/svg" version="1.1"&gt;

&lt;/svg&gt;</code></pre><p>El ejemplo incluye un atributo de <code>version</code>. El atributo <code>version</code> es opcional, pero se recomienda para cumplir con las especificaciones XML.</p><p>Este ejemplo no muestra nada, simplemente establece una ventana gráfica. Puede agregar los atributos <code>height</code> y <code>width</code> para establecer un tamaño de visualización para la ventana gráfica, esto esencialmente establece un canvas para que pueda trabajar.</p><p>Con una ventana gráfica en su lugar, puede agregar gráficos básicos, texto y elementos de ruta.</p><pre><code class="language-svg">&lt;svg
     version="1.1"
     width="100%"
     viewbox="0 0 600 300"
     xmlns="http://www.w3.org/2000/svg"&gt;
  &lt;rect x="10" y="10" width="100" height="100" fill="#f7b2c1" /&gt;
  &lt;circle cx="240" cy="60" r="50" fill="#c1b2f7" stroke="#b2c1f7" stroke width="15"/&gt;
  &lt;text x="450" y="70" font-size="20" text-anchor="middle"&gt;SVG Text es legible por el navegador!&lt;/text&gt;
  &lt;g stroke="#b2c1f7"&gt; &lt;!-- g es para el grupo --&gt;
    &lt;path stroke-width="2" d="M10 170 l590 0" /&gt;
    &lt;path stroke-width="4" d="M10 190 l590 0" /&gt;
    &lt;path stroke-width="6" d="M10 210 l590 0" /&gt;
  &lt;/g&gt;  
&lt;/svg&gt;  </code></pre><p>Puedes ver la salida y jugar con el código en <a href="https://codepen.io/SgiobairOg/pen/OxbNpW">este codepen</a>.</p><p>En la etiqueta <code>svg</code> de apertura agregamos un atributo <code>width</code> para establecer el ancho de la ventana gráfica al 100% del ancho del contenedor, puedes usar porcentajes o anchos de píxeles. La etiqueta svg de apertura también incluye el atributo viewbox que define una ventana a través de la cual los elementos de su svg son visibles, en este caso, el viewbox se extiende desde (0,0) a (600,300). En el espacio SVG, el eje X comienza con cero a la izquierda y aumenta a la derecha; el eje Y comienza con cero en la parte superior y aumenta hacia la parte inferior.</p><p>La etiqueta <code>&lt;rect /&gt;</code> define un rectángulo en la ventana gráfica SVG. En este caso, definimos un cuadrado que está a 10 unidades de la parte superior e izquierda y 100 unidades de alto y ancho. El atributo <code>fill</code> establece el color de relleno de la forma.</p><p>A continuación, definimos un círculo u óvalo con la etiqueta <code>&lt;circle /&gt;</code>. El ejemplo define un círculo centrado en (240,60) con un radio de 50 unidades. Los atributos <code>stroke</code> and <code>stroke-width</code> establecen un color de trazo y un tamaño para el trazo.</p><p>Puede agregar texto al gráfico con la etiqueta <code>text</code>. El texto de ejemplo está anclado desde la mitad del texto hasta un punto en (450, 70) y tiene un tamaño de fuente de 20 unidades. Lo bueno del texto en SVG es que se escalará con el resto de su gráfico, pero el navegador y los bots web aún lo pueden leer.</p><p>Cuando desees aplicar los mismos atributos o estilos CSS a varios elementos SVG, puedes agruparlos con la etiqueta <code>&lt;g&gt;</code>. Los atributos asignados a la etiqueta <code>&lt;g&gt;</code>, como el atributo <code>stroke</code>el ejemplo, se aplicarán a todos los elementos dentro del grupo. En este caso, tres <code>&lt;path /&gt;</code> elementos .</p><p>El elemento <code>&lt;path /&gt;</code> define una ruta vectorial en la ventana gráfica. La ruta está definida por el atributo <code>d</code>. En el primer ejemplo, la definición dice "muévase a la coordenada absoluta (10, 170) y dibuje una línea a las coordenadas relativas 590 en la dirección X y 0 en la dirección Y".<br>Los siguientes comandos se pueden utilizar para crear su ruta:<br>M = moverse a; L = línea a; H = línea horizontal a; V = línea vertical a; Z = cerrar ruta; C = curva (bezier cúbica) a; S = curva suave a; Q = curva bezier cuadrática a; T = curva bezier cuadrática suave a; A = arco</p><h3 id="el-elemento-canvas"><strong>El elemento canvas</strong></h3><p>Los gráficos del canvas se pueden dibujar en un </p><p>Se crea un contexto a través del método getContext en el </p><pre><code class="language-text">&lt;p&gt;Antes de canvas&lt;/p&gt;
&lt;canvas width ="120" height ="60"&gt;&lt;/canvas&gt;
&lt;p&gt;Después canvas&lt;/p&gt;
&lt;script&gt;
    var canvas = document.querySelector("canvas");
    var context = canvas.getContext("2d");
    context.fillStyle = "red";
    context.fillRect(10, 10, 100, 50);
&lt;/script&gt;</code></pre><p>Después de crear el objeto de contexto, el ejemplo dibuja un rectángulo rojo de 100 píxeles de ancho y 50 píxeles de alto, con su esquina superior izquierda en las coordenadas (10,10).</p><h3 id="dibujar-un-gr-fico-circular"><strong><strong><strong><strong>D</strong></strong></strong>ibujar un gráfico circular</strong></h3><p>La variable <code>resultados</code> contiene una serie de objetos que representan las respuestas de la encuesta.</p><pre><code class="language-text">var resultados = [
{ nombre : "satisfecho", cuenta: 1043, color: "lightblue"},
{ nombre : "Neutral", cuenta: 563, color: "lightgreen"},
{ nombre : "Insatisfecho", cuenta: 510, color: "pink"},
{ nombre : "No comentario", cuenta: 175, color: "silver"}
];</code></pre><p>Para dibujar un gráfico circular, dibujamos una serie de sectores circulares, cada uno formado por un arco y un par de líneas en el centro de ese arco. Podemos calcular el ángulo que toma cada arco dividiendo un círculo completo (2 π) por el número total de respuestas y luego multiplicando ese número (el ángulo por respuesta) por el número de personas que eligieron una opción determinada.</p><pre><code class="language-text">&lt;canvas width ="200" height ="200"&gt; &lt;/canvas&gt;
&lt;script&gt;
    var cx = document.querySelector("canvas").getContext("2d");
    var total = resultados.reduce(function (suma, opcion) {
    return suma + opcion.cuenta;
    }, 0);

    // Start at the top

    var anguloActual = -0.5 * Math.PI;
    resultados.forEach (function (resultado) {
    var anguloTejada = (resultado.cuenta / total) * 2 * Math.PI;
    cx.beginPath() ;
    // center = 100, 100, radius = 100
    // del angulo actual, en el setido del reloj por el angulo de la tajada
    cx.arc(100, 100, 100, anguloActual, anguloActual + anguloTejada);
    anguloActual += anguloTejada;
    cx.lineTo(100, 100);
    cx.fillStyle = resultado.color;
    cx.fill() ;
    });
&lt;/script&gt;</code></pre><p>El código anterior dibuja el siguiente gráfico:</p><figure class="kg-card kg-image-card"><img src="https://pbs.twimg.com/media/CTDvkA8UwAAdJg5.png" class="kg-image" alt="CTDvkA8UwAAdJg5" width="900" height="860" loading="lazy"></figure><h3 id="compatibilidad-de-los-navegadores"><strong>Compatibilidad de los navegadores</strong></h3><p><a href="https://caniuse.com/#feat=svg">La compatibilidad del navegador con SVG</a> está disponible en todos los navegadores modernos. Hay algunos problemas con el escalado en IE 9 hasta IE 11, sin embargo, se pueden solucionar con el uso de <code>width</code>, <code>height</code>, <code>viewbox</code> y CSS.</p><h2 id="editores"><strong><strong><strong><strong>Editor</strong></strong></strong>e<strong><strong><strong>s</strong></strong></strong></strong></h2><ul><li><a href="https://vectr.com/">Vectr</a> - herramienta web y de escritorio para crear y editar gráficos SVG, sin costes.</li></ul><h2 id="herramientas-para-crear-svg"><strong>Herramientas para crear <strong><strong><strong>SVG</strong></strong></strong></strong></h2><p>Hay pocas herramientas disponibles para crear SVG en forma de programa de dibujo.</p><ul><li><a href="https://www.inkscape.org/" rel="nofollow">Inkscape</a> - Es una herramienta de código abierto para el dibujo vectorial de última generación con una interfaz gráfica fácil de usar.</li><li><a href="https://www.adobe.com/products/illustrator/" rel="nofollow">Adobe Illustrator</a> - Adobe Illustrator es una herramienta comercial para imágenes vectoriales</li></ul><p>Para obtener más herramientas, <a href="https://https//www.w3.org/Graphics/SVG/WG/wiki/Implementations">consulte la lista W3C de herramientas que admiten SVG</a></p><h2 id="por-qu-deber-a-usar-svg">Por qué debería usar SVG</h2><p>Como formato de imagen vectorial, te permite cambiar el tamaño de una imagen sin pérdida de calidad y un peso particularmente ligero. Como formato XML, te permite beneficiarte de todo el poder de JavaScript y especialmente CSS.</p><h2 id="m-s-informaci-n-sobre-svg-">Más información sobre SVG:</h2><ul><li><a href="https://www.freecodecamp.org/news/a-fresh-perspective-at-why-when-and-how-to-use-svg/">Por qué deberías usar imágenes SVG</a></li><li><a href="https://www.freecodecamp.org/news/things-you-need-to-know-about-working-with-svg-in-vs-code-63be593444dd/">Lo que necesitas saber para trabajar con SVG en VS Code</a></li><li><a href="https://www.freecodecamp.org/news/how-to-make-your-fancy-svg-button-accessible-83c9172c3c15/">Cómo hacer que tu elegante botón SVG sea accesible</a></li></ul><p>Traducido del artículo - <strong><a href="https://www.freecodecamp.org/news/svg-basics-what-are-scalable-vector-graphics-and-how-do-you-use-them/">What Is an SVG File? SVG Image and Tags Explained</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Ejemplos de RSync – Opciones de Rsync y Cómo Copiar Archivos a través de SSH ]]>
                </title>
                <description>
                    <![CDATA[ Rsync significa "sincronización remota". Es una herramienta de sincronización de archivos local y remota que te ayuda a transferir archivos de manera eficiente. ¿Qué es RSync? Rsync es más rápido que herramientas como Secure Copy Protocol (SCP). Utiliza el algoritmo de transferencia delta que minimiza la transferencia de datos al ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/rsync-ejemplos-opciones-y-copiar-archivos-atraves-ssh/</link>
                <guid isPermaLink="false">5fd48f9e8c7cd154bb973f37</guid>
                
                    <category>
                        <![CDATA[ SSH ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian J. Bustamante ]]>
                </dc:creator>
                <pubDate>Mon, 14 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/rsync-1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Rsync significa "sincronización remota". Es una herramienta de sincronización de archivos local y remota que te ayuda a transferir archivos de manera eficiente.</p><h2 id="-qu-es-rsync">¿Qué es RSync?</h2><p>Rsync es más rápido que herramientas como Secure Copy Protocol (SCP). Utiliza el algoritmo de transferencia delta que minimiza la transferencia de datos al copiar solo las secciones de un archivo que se han actualizado.</p><p>Algunas de las características adicionales de Rsync incluyen:</p><ul><li>Admite la copia de enlaces, dispositivos, propietarios, grupos y permisos</li><li>No requiere privilegios de superusuario</li><li>Transferencias de archivos mediante pipelines para minimizar los costes de latencia</li></ul><p>Solo puedes transferir archivos de local a remoto o de remoto a local. Rsync no admite transferencias de archivos remotas a remotas.</p><h2 id="-c-mo-funciona-rsync"><strong>¿Cómo funciona RSync?</strong></h2><p>Ahora que sabe qué es Rsync, veamos cómo trabajar con él.</p><p>Rsync funciona de manera similar a otras herramientas de administración de servidores remotos como SSH y SCP.</p><p>Esta es la sintaxis básica de Rsync:</p><pre><code>rsync [options] source [destination]</code></pre><p>Esta es la sintaxis para transferir un archivo desde el sistema local a un servidor remoto. También se denomina operación "push".</p><pre><code>rsync local_file_path user@remote-host:remote_file_path</code></pre><p>Esta es la explicación de cómo transferir un archivo desde un servidor remoto al sistema local, también llamada operación "pull".</p><pre><code>rsync user@remote-host:remote_file_path local_file_path</code></pre><blockquote>Nota: cuando trabaje con sistemas remotos, asegúrese de tener acceso SSH al sistema remoto. Rsync establece la conexión mediante SSH para permitir la transferencia de archivos.</blockquote><h2 id="-c-mo-usar-indicadores-en-rsync">¿Cómo usar Indicadores en RSync?</h2><p>Rsync te permite agregar opciones adicionales a través de indicadores de línea de comandos. Veamos algunos indicadores útiles.</p><h3 id="recursivo">Recursivo</h3><p>Si agrega la opción <strong>-r</strong>, RSync ejecutará una transferencia de archivos recursiva. Esto es útil cuando se trabaja con directorios. Aquí hay un ejemplo:</p><pre><code>rsync -r user@remote-host:remote_directory/ local_directory</code></pre><h3 id="archivo">Archivo</h3><p>El indicador <strong>-a</strong> se usa para conservar los enlaces simbólicos mientras se transfieren archivos. El indicador de archivo también conserva los archivos especiales y de dispositivo, las horas de modificación y los permisos del directorio de origen.</p><p>El indicador archivo también sincroniza archivos de forma recursiva, por lo que se usa más que el indicador recursivo. Así es como se usa:</p><pre><code>rsync -a user@remote-host:remote_directory/ local_directory</code></pre><h3 id="compresi-n">Compresión</h3><p>También puedescomprimir archivos usando el indicador <strong>-z</strong>. La compresión de archivos puedes reducir la carga de la red y acelerar la transferencia de archivos.</p><pre><code>rsync -az user@remote-host:remote_directory/ local_directory</code></pre><h3 id="progreso">Progreso</h3><p>Para transferencias de archivos grandes, es útil conocer el progreso de la operación. Puedes utilizar el indicador <strong>-P</strong> para conocer el progreso de la transferencia de archivos. Con Rsync, también puedes reanudar las transferencias de archivos si se interrumpen.</p><pre><code>rsync -aP user@remote-host:remote_directory/ local_directory</code></pre><h3 id="verboso">Verboso</h3><p>Finalmente, el comando verboso nos ayuda &nbsp;a comprender cada paso de la transferencia de archivos. Puedes usar el indicador <strong>-v</strong> para esto.</p><pre><code>rsync -av user@remote-host:remote_directory/ local_directory</code></pre><p>También puedes usar el comando de ayuda con RSync para obtener una lista de todas las opciones y indicadores.</p><pre><code>rsync --help</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2020/12/Screenshot-2020-09-02-at-9.07.47-PM.png" class="kg-image" alt="Screenshot-2020-09-02-at-9.07.47-PM" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2020/12/Screenshot-2020-09-02-at-9.07.47-PM.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2020/12/Screenshot-2020-09-02-at-9.07.47-PM.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2020/12/Screenshot-2020-09-02-at-9.07.47-PM.png 1576w" sizes="(min-width: 720px) 720px" width="1576" height="1120" loading="lazy"><figcaption>ayuda rsync</figcaption></figure><h2 id="conclusi-n">Conclusión</h2><p>Rsync simplifica todo el proceso de transferencia de archivos al ofrecer una herramienta robusta, versátil y flexible en comparación con alternativas como SCP.</p><p>RSync es ideal para operaciones de mantenimiento, copias de seguridad y operaciones generales de archivos entre máquinas locales y remotas.</p><h2 id="referencias"><strong><strong>Referenc</strong>ias</strong></h2><ul><li><a href="https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories-on-a-vps" rel="nofollow noopener">https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories-on-a-vps</a></li><li><a href="https://linux.die.net/man/1/rsync" rel="nofollow noopener">https://linux.die.net/man/1/rsync</a></li><li><a href="https://www.geeksforgeeks.org/rsync-command-in-linux-with-examples/" rel="nofollow noopener">https://www.geeksforgeeks.org/rsync-command-in-linux-with-examples/</a></li></ul><p>Soy Manish y escribo sobre Ciberseguridad, Inteligencia Artificial y DevOps. Si te gustó este artículo, <a href="https://medium.com/manishmshiva">puedes encontrar mi blog aquí</a>.</p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/manishmshiva/"><strong>Manish Shivanandhan</strong></a> - <strong><a href="https://www.freecodecamp.org/news/rsync-examples-rsync-options-and-how-to-copy-files-over-ssh/">RSync Examples – Rsync Options and How to Copy Files Over SSH</a></strong><br></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
