From 342d84b7c40d021ad2cf7aa95643ed145e135b8a Mon Sep 17 00:00:00 2001
From: Jorge Cordova <55065873+jcordovaj@users.noreply.github.com>
Date: Sun, 22 Jan 2023 02:01:29 -0300
Subject: [PATCH 01/16] Creado con Colaboratory
---
...B\303\241sico_Interactivo_de_Python.ipynb" | 982 ++++++++++++++++++
1 file changed, 982 insertions(+)
create mode 100644 "Copia_de_Tutorial_B\303\241sico_Interactivo_de_Python.ipynb"
diff --git "a/Copia_de_Tutorial_B\303\241sico_Interactivo_de_Python.ipynb" "b/Copia_de_Tutorial_B\303\241sico_Interactivo_de_Python.ipynb"
new file mode 100644
index 000000000..8a4ee6328
--- /dev/null
+++ "b/Copia_de_Tutorial_B\303\241sico_Interactivo_de_Python.ipynb"
@@ -0,0 +1,982 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+ "colab": {
+ "provenance": [],
+ "private_outputs": true,
+ "include_colab_link": true
+ },
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3"
+ },
+ "language_info": {
+ "name": "python"
+ },
+ "gpuClass": "standard"
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "view-in-github",
+ "colab_type": "text"
+ },
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# Tutorial Básico Interactivo de Python de Código Pitón\n",
+ "\n",
+ "![cp.png](data:image/png;base64,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)\n",
+ "\n",
+ "¡Hola! **Bienvenido al Tutorial Básico Interactivo de Python de [Código Pitón](https://www.codigopiton.com/)**.\n",
+ "\n",
+ "Este tutorial recoge una guía básica de los fundamentos de Python en forma de cuaderno de Jupyter alojado en Google Colab (Colaboratory).\n",
+ "\n",
+ "Está estrechamente ligado a la [Hoja de Referencia de Python de Código Pitón](https://www.codigopiton.com/la-hoja-de-referencia-de-python/) que recibiste cuando te suscribiste a la lista de correo de Código Pitón.\n",
+ "\n",
+ "Si no tienes la Hoja de Referencia (por ejemplo, porque alguien te compartió este tutorial) puedes [conseguirla de manera gratuita al susbscribirte a Código Pitón](https://www.codigopiton.com/la-hoja-de-referencia-de-python/) y te llegará inmediatamente por correo electrónico.\n",
+ "\n",
+ "La **idea principal de este tutorial** es que tengas una guía interactiva para complementar perfectamente a la Hoja de Referencia y a la que puedas recurrir durante tu aprendizaje si te surge alguna duda. Espero que te sea de mucha utilidad.\n",
+ "\n",
+ "El tutorial tiene 15 apartados, exactamente igual que la Hoja de Referencia, y en el mismo orden, para que no te pierdas en ningún momento. Además, les he puesto el mismo nombre para que no quede lugar a ningún tipo de duda.\n",
+ "\n",
+ "¡Vamos allá!\n",
+ "\n",
+ "## Antes de empezar\n",
+ "\n",
+ "Si no estás muy familiarizado con los cuadernos de Jupyter, ¡no te preocupes! Aquí es todo muy fácil. Todo se organiza en celdas. Podrás ver celdas de texto explicativo (como este) y celdas con fragmentos de código Python ejecutable, como el siguiente:\n"
+ ],
+ "metadata": {
+ "id": "EZslL1PpIsde"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "9NrJqYoyINXn"
+ },
+ "outputs": [],
+ "source": [
+ "print('¡Hola desde el Tutorial Básico Interactivo de Código Pitón! 😊') "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Siéntete libre de ejecutar los fragmentos de código que quieras y de modificarlos a tu gusto para experimentar y aprender, ¡ese es el objetivo de este tutorial interactivo!\n",
+ "\n",
+ "Para ejecutar un fragmento de código basta con que hagas click en el icono de ejecutar a la izquierda de cada celda. También puedes ejecutarlos con la combinación de teclas Ctrl + Enter y verás el resultado justo debajo.\n",
+ "\n",
+ "Y ahora sí, vamos con el tutorial.\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "Los contenidos son los siguientes:\n",
+ "\n",
+ "\n",
+ "1. Asignación de variables\n",
+ "2. Acceso a valor de variables\n",
+ "3. Aritmética básica\n",
+ "4. Importación de módulos\n",
+ "5. Gestión de excepciones\n",
+ "6. Salida y formato de texto\n",
+ "7. Listas\n",
+ "8. Condicionales\n",
+ "9. Booleanos y comparaciones\n",
+ "10. Comprensión de listas\n",
+ "11. Comentarios\n",
+ "12. Funciones\n",
+ "13. Bucles\n",
+ "14. Notación de porciones\n",
+ "15. Entrada por teclado\n",
+ "\n",
+ "\n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "IAHwNotEQtNy"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 1. Asignación de variables\n",
+ "\n",
+ "Los principales tipos de datos son números enteros (int), números decimales (float), cadenas de texto (str) y valores booleanos (verdadero o falso, te cuento más sobre esto más adelante).\n",
+ "\n",
+ "Para realizar asignaciones utiliza nombres de variables identificativos, el símbolo = y el valor que quieras asociar a la variable."
+ ],
+ "metadata": {
+ "id": "qhinAwWbPwsG"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x = 10 # enteros\n",
+ "y = 0.5 # decimales\n",
+ "z = 'hola' # texto\n",
+ "b = True # booleanos\n",
+ "print(x)\n",
+ "print(y)\n",
+ "print(z)\n",
+ "print(b)"
+ ],
+ "metadata": {
+ "id": "bl-PHta-TM7D"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Las principales colecciones de datos son las listas (modificables), las tuplas (no modificables), los conjuntos (que no admiten repetidos) y los diccionarios (que guardan pares clave-valor)."
+ ],
+ "metadata": {
+ "id": "ltpQ4vgOTgx6"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "tupla = (1, 2, 3)\n",
+ "lista = [4, 5.5, 'a6']\n",
+ "conjunto = ('a', 'b', 'c')\n",
+ "\n",
+ "print(tupla)\n",
+ "print(lista)\n",
+ "print(conjunto)\n",
+ "\n",
+ "diccionario = {10: 1.1, 20: 1.0, 30: 1.3}\n",
+ "diccionario[40] = 1.5 # asignando un valor (1.5) a una nueva clave (40)\n",
+ "print(diccionario)\n",
+ "\n",
+ "x, y, z = 1, 2, 3 # asignación múltiple\n",
+ "print('Tras la asignación múltiple: ')\n",
+ "print(x)\n",
+ "print(y)\n",
+ "print(z)\n",
+ "\n",
+ "print('Tras intercambiar valores: ')\n",
+ "x, y = y, x # intercambio de valores\n",
+ "print(x)\n",
+ "print(y)\n",
+ "\n",
+ "print('Tras desempaquetar una tupla en variables: ')\n",
+ "x, y, z = (10, 20, 30)\n",
+ "print(x)\n",
+ "print(y)\n",
+ "print(z)\n"
+ ],
+ "metadata": {
+ "id": "mBTQ6WUbTmSX"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 2. Acceso a valor de variables\n",
+ "\n",
+ "Cuando ya hemos hecho asignaciones y tenemos variables con valores, podemos acceder a esos valores utilizando el nombre de las variables en otras expresiones.\n",
+ "\n",
+ "Además, podemos acceder a los elementos de una lista o una tupla a través de su índice (número de posición, comenzando en 0) indicándolo entre corchetes \\[ y \\].\n",
+ "\n",
+ "Para acceder a los valores de un diccionario utilizaremos la clave asociada a cada valor, de nuevo entre corchetes.\n",
+ "\n",
+ "También podemos acceder a los atributos de una clase utilizando el nombre de la clase, un punto y a continuación el nombre del atributo. De igual manera, podemos acceder a los atributos de un objeto o instancia utilizando el nombre del objeto, un punto y a continuación el nombre del atributo.\n"
+ ],
+ "metadata": {
+ "id": "xUu-z6MPQTn8"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "lista = [10, 20, 30, 40, 50]\n",
+ "valor = lista[2]\n",
+ "print(valor)\n",
+ "\n",
+ "diccionario = {10: 5, 20: 7, 30: 9}\n",
+ "valor = diccionario[20]\n",
+ "print(valor)\n",
+ "valor = diccionario.get(40, '0') # valor por defecto 0 si clave (40) no existe\n",
+ "\n",
+ "class Clase:\n",
+ "\n",
+ " atributo_de_clase = 10\n",
+ "\n",
+ " def __init__(self):\n",
+ " self.atributo_de_instancia = 20\n",
+ "\n",
+ "\n",
+ "print(Clase.atributo_de_clase)\n",
+ "\n",
+ "instancia = Clase()\n",
+ "print(instancia.atributo_de_instancia)"
+ ],
+ "metadata": {
+ "id": "Dv3EgoExVqhr"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Más información sobre variables: https://www.codigopiton.com/variables-locales-y-globales-en-python/"
+ ],
+ "metadata": {
+ "id": "hllJO5IAMPS1"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 3. Aritmética básica\n",
+ "\n",
+ "Podemos realizar operaciones matemáticas aritméticas básicas utilizando los símbolos +, -, * (multiplicación), / (división), // (división entera), % (resto de la división entera o módulo) y \\*\\* (potencia).\n"
+ ],
+ "metadata": {
+ "id": "GXjjRcl4QzB8"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "print(3 + 5)\n",
+ "print(5 - 3)\n",
+ "print(5 * 3)\n",
+ "print(5 / 3)\n",
+ "print(5 // 3)\n",
+ "print(5 % 3)\n",
+ "print(5 ** 3)"
+ ],
+ "metadata": {
+ "id": "SSDZqkv8XRer"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 4. Importación de módulos\n",
+ "\n",
+ "Si necesitas utilizar una librería (tanto de Python como externa) tendrás que importar el módulo correspondiente con import. \n",
+ "\n",
+ "Podrás darle un alias al módulo si utilizas as.\n",
+ "\n",
+ "También puedes importar un componente concreto de un módulo a través de from."
+ ],
+ "metadata": {
+ "id": "WItnb6q8Q-fp"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "import datetime\n",
+ "\n",
+ "print(datetime.datetime.now())"
+ ],
+ "metadata": {
+ "id": "aVd-5GYuYY8f"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "import datetime as dt\n",
+ "\n",
+ "print(dt.datetime.now())"
+ ],
+ "metadata": {
+ "id": "pmez2i-FYx0G"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "from datetime import datetime as dt\n",
+ "\n",
+ "print(dt.now())"
+ ],
+ "metadata": {
+ "id": "u52AMnEFY3Cf"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 5. Gestión de excepciones\n",
+ "\n",
+ "Para manejar errores y excepciones tienes que usar la construcción try - except - finally. De no hacerlo, el código interrumpe su ejecución en caso de surgir algún error.\n",
+ "\n",
+ "Algunos de los errores más comunes son los siguientes:\n",
+ "* SyntaxError: sintaxis incorrecta\n",
+ "* ValueError: valor argumento no válido\n",
+ "* ZeroDivisionError: división por cero\n",
+ "* NameError: variable no definida\n",
+ "* ModuleNotFoundError: modulo no existe\n",
+ "* FileNotFoundError: fichero no existe\n",
+ "* IndexError: índice no existe\n",
+ "* KeyError: clave no existe\n",
+ "\n",
+ "\n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "j_bTR38XRB1Y"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# El siguiente código genera un error\n",
+ "\n",
+ "a = 10\n",
+ "b = 0\n",
+ "\n",
+ "print(a/b) # no se puede dividir por cero"
+ ],
+ "metadata": {
+ "id": "-XPkB0XRbR88"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# Vamos a controlar el error para que no se interrumpa la ejecución\n",
+ "\n",
+ "a = 10\n",
+ "b = 0\n",
+ "\n",
+ "try:\n",
+ " print(a/b)\n",
+ "except ZeroDivisionError:\n",
+ " print('Lo siento, no puedo dividir por cero.')\n",
+ "finally:\n",
+ " print('Bloque try-except finalizado') # esto, que es opcional, se ejecuta siempre, haya error o no\n",
+ " "
+ ],
+ "metadata": {
+ "id": "fp6wj4dybZI4"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 6. Salida y formato de texto\n",
+ "\n",
+ "Ya has visto que la función *print* se utiliza para mostrar información por pantalla.\n",
+ "\n",
+ "Podemos personalizar la manera en que se muestra esa información de múltiples maneras. Algunas formas sencillas y básicas son la siguientes:"
+ ],
+ "metadata": {
+ "id": "e-4K3kjIRIee"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "a = 10\n",
+ "b = 20\n",
+ "c = 30.158\n",
+ "print(a)\n",
+ "print('b=' + str(b)) # convertimos un numero a string con str\n",
+ "\n",
+ "print('a=%i' % a) # usamos una máscara de número entero (%i) dentro de la cadena de texto\n",
+ "print('a=%i, b=%i' % (a, b))\n",
+ "\n",
+ "print('a={}, b={}'.format(a, b))\n",
+ "print('c={:.2f}'.format(c)) # puedes indicar se se usen solo dos decimales para un float\n",
+ "\n",
+ "print(f'a={a}, b={b}') # usamos f-strings, la forma preferida\n"
+ ],
+ "metadata": {
+ "id": "soEeTeTKcHDu"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 7. Listas\n",
+ "\n",
+ "Podemos hacer muchas cosas con las listas, pues son secuencias muy potentes. Veamos algunas:"
+ ],
+ "metadata": {
+ "id": "OowBr9SiOINH"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "lista = [5, 6, 7]\n",
+ "\n",
+ "lista.append(8) # añadimos un elemento al final\n",
+ "print(lista)\n",
+ "\n",
+ "lista.insert(1, 10) # insertamos un elemento en la posición que queramos\n",
+ "print(lista)\n",
+ "\n",
+ "lista.remove(6) # eliminamos un elemento\n",
+ "del lista[0] # eliminamos una posición\n",
+ "print(lista)\n",
+ "\n",
+ "lista.clear() # vacíamos la lista\n",
+ "print(lista)\n",
+ "\n",
+ "lista = [5, 6, 7]\n",
+ "elementos = [8, 9]\n",
+ "\n",
+ "lista.extend(elementos) # añadimos al final los elementos de otra lista\n",
+ "print(lista)\n",
+ "\n",
+ "lista.reverse() # invertimos la lista (le damos la vuelta)\n",
+ "print(lista)\n",
+ "\n",
+ "print(len(lista)) # obtenemos el número de elementos (o longitud) de una lista\n",
+ "\n",
+ "print(lista.index(7)) # obtenemos el índice de un elemento\n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "ahagt7kyeE5J"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Aquí tienes más información sobre cómo obtener la posición o índice de un elemento en una lista: https://www.codigopiton.com/encontrar-indice-de-elemento-en-lista-en-python/"
+ ],
+ "metadata": {
+ "id": "nyQRye6VfOcC"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 8. Condicionales\n",
+ "\n",
+ "Las condicionales nos permiten ejecutar un determinado fragmento de código si se cumple una determinada condición (rama if).\n",
+ "\n",
+ "Además, podemos indicar que, si no se cumple dicha condición, se ejecute otro código (rama else).\n",
+ "\n",
+ "Finalmente, se permite encadenar varias ramas ifs con distintas condiciones (elif) y una rama else si no se cumple ninguna de las condiciones indicadas. Las ramas aquí son excluyentes."
+ ],
+ "metadata": {
+ "id": "ju3H-DAjOId7"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "a = 10\n",
+ "b = 20\n",
+ "\n",
+ "if a < 15:\n",
+ " print('a es menor que 15') # esto se ejecutará ya que se cumple la condición\n",
+ "\n",
+ "\n",
+ "if a > 15:\n",
+ " print('a es mayor que 15') # esto no se ejecutará ya que no se cumple la condición\n",
+ "\n",
+ "if a > 30:\n",
+ " print('a es mayor que 30') # esto no se ejecutará ya que no se cumple la condición\n",
+ "else:\n",
+ " print('a no es mayor que 30') # esto sí se ejecutará ya que no se cumple la condición\n",
+ "\n",
+ "\n",
+ "if b > 10:\n",
+ " print('b es mayor que 10') # esto se ejecutará ya que se cumple la condición\n",
+ "else:\n",
+ " print('b no es mayor que 10') # esto no se ejecutará ya que se cumple la condición\n",
+ "\n",
+ "\n",
+ "# a continuación se comprobaran las condiciones secuencialmente y se ejecutara \n",
+ "# solo el fragmento de código de la condición que se cumpla (condiciones excluyentes)\n",
+ "\n",
+ "if a < 10:\n",
+ " print('a es menor que 10')\n",
+ "elif a > 12:\n",
+ " print('a es mayor que 12')\n",
+ "elif b > 15:\n",
+ " print('b es mayor que 15') # esta es la rama que se ejecuta\n",
+ "elif b == 20:\n",
+ " print('b es igual a 20') # aunque la condición de esta rama es cierta no se ejcuta\n",
+ " # pues ya se ejecutó otra rama antes\n",
+ "else:\n",
+ " print('no se ha cumplido ninguna de las condiciones anteriores')"
+ ],
+ "metadata": {
+ "id": "JV2mITN3a2TG"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Más información sobre condicionales: https://www.codigopiton.com/condicionales-en-python-mucho-mas-que-if-else/\n",
+ "\n",
+ "La estrucutura de control switch no existe en Python. Más información sobre cómo hacer switch en Python: https://www.codigopiton.com/como-hacer-switch-case-en-python/\n",
+ "\n",
+ "En Python existe, además, un operador ternario condicional: https://www.codigopiton.com/el-operador-ternario-condicional-en-python/\n",
+ "\n",
+ "Aunque desde la versión 3.10 de Python existe un mecanismo de \"pattern matching\" que se puede utilizar para emular un switch. Más información: https://peps.python.org/pep-0636/"
+ ],
+ "metadata": {
+ "id": "EPh-Axa2cc1L"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 9. Booleanos y comparaciones\n",
+ "\n",
+ "Ahora que ya sabes cómo hacer condicionales, vamos a revisar los valores booleanos y las principales posibles comparaciones y comprobaciones que se pueden hacer en Python que devuelven valores booleanos.\n",
+ "\n",
+ "Los valores booleanos, son True y False (escritos con inicial mayúscula) y cuyo significado es \"cierto\" y \"falso\" respectivamente.\n",
+ "\n",
+ "Comparaciones y comprobaciones principales:\n",
+ "* Mayor: >\n",
+ "* Mayor o igual: >=\n",
+ "* Menor: <\n",
+ "* Menor o igual: <=\n",
+ "* Igual: ==\n",
+ "* Diferente: !=\n",
+ "* Pertenencia: in\n",
+ "\n",
+ "Puedes negar un valor booleano o condición para obtener el valor contrario con la palabra reservada \"not\"."
+ ],
+ "metadata": {
+ "id": "rQKB2F9AOIr2"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "a = 2\n",
+ "b = 3\n",
+ "\n",
+ "print('Comparaciones simples:')\n",
+ "print(a > b)\n",
+ "print(a >= b)\n",
+ "print(a < b)\n",
+ "print(a <= b)\n",
+ "print(a == b)\n",
+ "print(a != b)\n",
+ "\n",
+ "print('Comprobación de pertenencia:')\n",
+ "lista = [1, 3, 5]\n",
+ "print(a in lista)\n",
+ "print(b in lista)\n",
+ "\n",
+ "print('Negación con not')\n",
+ "print(not True)\n",
+ "print(not False)\n",
+ "print(not a > b)\n",
+ "print(not a == b)\n"
+ ],
+ "metadata": {
+ "id": "aBjkpZRyd8V9"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Más información sobre booleanos, comparaciones, condicionales, etc.: https://www.codigopiton.com/condicionales-en-python-mucho-mas-que-if-else/"
+ ],
+ "metadata": {
+ "id": "ZZKF7GPaeoZO"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Puedes combinar distintas comparaciones para crear una más compleja con las palabras reservadas \"and\" y \"or\".\n",
+ "\n",
+ "Cuando usas and entre dos comparaciones o condiciones, ambas deben ser True para que la condición combinada sea True.\n",
+ "\n",
+ "Cuando usas or entre dos comparaciones o condiciones, al menos una de ellas tiene que ser True para que la condición combinada sea True."
+ ],
+ "metadata": {
+ "id": "2tzz0ZRjwqHo"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "a = 2\n",
+ "b = 3\n",
+ "print(b >= 3 and a == 2)\n",
+ "print(a < 10 and b < 2)\n",
+ "print(a == 2 or b == 0)\n",
+ "print(a < 0 or b < 0)"
+ ],
+ "metadata": {
+ "id": "Mu96IFV6xECQ"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 10. Comprensión de listas\n",
+ "\n",
+ "En Python podemos generar listas \"al vuelo\" utilizando un bucle for que devuelva un elemento e en cada iteración, aplicando un cálculo o expresión sobre e y encerrándolo todo entre [corchetes](https://www.codigopiton.com/parentesis-corchetes-llaves-en-python/). \n",
+ "\n",
+ "De esta manera se genera una lista con todos los elementos generados a partir de e.\n",
+ "\n",
+ "Ejemplos:"
+ ],
+ "metadata": {
+ "id": "MVkNPcwDOI6A"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "lista = [10, 20, 30]\n",
+ "\n",
+ "lista_negada = [ -e for e in lista ]\n",
+ "lista_doble = [ e*2 for e in lista]\n",
+ "\n",
+ "print(lista_negada)\n",
+ "print(lista_doble)"
+ ],
+ "metadata": {
+ "id": "gEhGP1_bfcp2"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 11. Comentarios\n",
+ "\n",
+ "En el código que escribas puedes (y debes) incluir comentarios explicativos.\n",
+ "\n",
+ "Los comentarios no son interpretados por el interprete de Python y no afectan al código ni a su ejecución.\n",
+ "\n",
+ "Puedes usar el símbolo \\# para añadir un comentario al principio o al final de una línea (como ya has visto en este tutorial).\n",
+ "\n",
+ "Además, si necesitas hacer un comentario de varias líneas basta con que lo encierres en triples comillas ' ' ' o \" \" \".\n",
+ "\n",
+ "Ejemplos:\n"
+ ],
+ "metadata": {
+ "id": "NZjQEM3MOJGX"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# inicialización de variables (este es un comentario de una línea)\n",
+ "a = 10\n",
+ "b = 20\n",
+ "\n",
+ "''' En este comentario de varias líneas\n",
+ "voy a explicar lo que hago a continuación:\n",
+ "sumaré los valores de a y b y si suman más de 25\n",
+ "mostraré un mensaje de éxito por pantalla '''\n",
+ "\n",
+ "if a + b > 25:\n",
+ " print('¡Éxito!') # este será mi mensaje de éxito"
+ ],
+ "metadata": {
+ "id": "HtJvtFjbgbMA"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 12. Funciones\n",
+ "\n",
+ "Tanto para estructurar nuestro código así como para favorecer la reutilización del mismo se utilizan funciones.\n",
+ "\n",
+ "Las funciones nos permiten encapsular un fragmento de código y darle un nombre.\n",
+ "\n",
+ "Para definir una función usamos la palabra reservada \"def\" a continuación el nombre de la función y los parámetros que necesitemos entre paréntesis. La función puede devolver uno o varios valores si lo necesita (o ninguno).\n",
+ "\n",
+ "Después se puede invocar una función creada a través de su nombre."
+ ],
+ "metadata": {
+ "id": "QWnzNyKROJSs"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "def suma(a, b):\n",
+ " return a + b\n",
+ "\n",
+ "\n",
+ "# min y max son funciones integradas en Python que nos devuelven\n",
+ "# los valores mínimo y máximo de un iterable (como las listas o las tuplas)\n",
+ "def min_y_max(lista):\n",
+ " return min(lista), max(lista)\n",
+ "\n",
+ "\n",
+ "# ahora vamos a usar estas funciones\n",
+ "valor = suma(10, 15)\n",
+ "print(valor)\n",
+ "\n",
+ "minimo, maximo = min_y_max([30, 10, 50, 40, 20])\n",
+ "print(f'min y max son {minimo} y {maximo}')\n"
+ ],
+ "metadata": {
+ "id": "DD5-_oeLsiNX"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 13. Bucles\n",
+ "\n",
+ "Los bucles son un mecanismo de control de flujo que nos permite repetir un fragmento de código un número determinado de veces.\n",
+ "\n",
+ "Hay dos tipos:\n",
+ "\n",
+ "\n",
+ "1. while, que nos permite controlar mediante una condición el número de repeticiones.\n",
+ "2. for, que nos permite iterar por los elementos de una colección de manera sencilla y cómoda.\n",
+ "\n",
+ "El código que queremos repetir, también llamado \"cuerpo del bucle\" debe indentarse tras el for o el while.\n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "yJaf1DpiOJeh"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# ejemplo de while\n",
+ "a = 0\n",
+ "\n",
+ "while (a < 10): # mientras a sea < 10 el cuerpo del bucle se repetirá\n",
+ " print(a)\n",
+ " a = a + 1 # sumamos 1 a la variable a para asegurarnos de que la condición del bucle será False en algún momento\n",
+ "\n",
+ "# ejemplo de for\n",
+ "lista = [10, 20, 30, 40]\n",
+ "\n",
+ "for elemento in lista:\n",
+ " print(elemento)\n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "lIfvC-pN_QhY"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Dentro de los bucles puedes utilizar las sentencias de control break y continue:\n",
+ "* break termina anticipadamente el bucle\n",
+ "* continue interrumpe la vuelta actual del bucle y continúa con la siguiente."
+ ],
+ "metadata": {
+ "id": "6_U1A3i9AEdq"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 14. Notación de porciones\n",
+ "\n",
+ "Cuando tenemos una colección de elementos indexados por posición (como una lista o una tupla), podemos acceder a una porción concreta utilizando la notación de porciones.\n",
+ "\n",
+ "Se utilizan los corchetes entre los que indicamos tres números separados por el carácter ':'. De esta manera\n",
+ "\n",
+ "lista\\[ini:fin:paso\\]\n",
+ "\n",
+ "Donde:\n",
+ "* ini es la posición del elemento primero en nuestra porción.\n",
+ "* fin es la posición del elemeto último (no incluido) de nuestra porción (el último incluido será el correspondiente a la posición fin -1).\n",
+ "* paso (optativo) indica la manera en la que tomaremos la porción: si es un número positivo tomaremos los elementos en el orden en el que aparecen, si es negativo los tomaremos en orden inverso (fin tiene que ser anterior a ini). Si la magnitud es 1, tomaremos todos los elementos, si es 2, tomaremos uno y saltaremos otro, si es 3, tomaremos uno y saltaremos 2, etc.\n",
+ "\n",
+ "Si dejamos ini o fin sin indicar se interpreta que la porción se toma desde el comienzo o el final respectivamente.\n",
+ "\n",
+ "Veamos algunos ejemplos:\n"
+ ],
+ "metadata": {
+ "id": "WQw19GRlOJrp"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "lista = [10, 20, 30, 40, 50, 60]\n",
+ "\n",
+ "print(lista[2:5]) # tomamos del 2 al 5 (sin incluir el 5)\n",
+ "print(lista[4:]) # tomamos del 4 hasta el final\n",
+ "print(lista[:2]) # tomamos desde el principio hasta el 2 (sin incluir)\n",
+ "print(lista[1:6:2]) # tomamos 1 de cada 2 elementos desde el 1 hasta el 6 (sin incluir)\n",
+ "print(lista[4:1:-1]) # tomamos en orden inverso desde el 4 al 1 (sin incluir)\n",
+ "print(lista[:]) # tomamos desde el principio hasta el final (es como hacer una copia de la lista)\n",
+ "print(lista[::-1]) # tomamos desde el final hasta el principip (orden inverso) "
+ ],
+ "metadata": {
+ "id": "rxqQW9h2Hvja"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 15. Entrada por teclado\n",
+ "\n",
+ "Si necesitamos hacer un programa o script interactivo, a menudo necesitaremos pedir algún valor al usuario por teclado.\n",
+ "\n",
+ "Python nos proporciona la función integrada \"input\" que nos sirve precisamente para eso. Al ejecutarse \"input\" el programa se queda esperando a que el usuario introduzca un valor y pulse intro. Posteriormente ese valor se guarda en la variable que queramos en formato string.\n",
+ "\n",
+ "Podemos hacer la conversión a un tipo numérico si así lo deseamos llamando a las funciones int o float."
+ ],
+ "metadata": {
+ "id": "BBXUukIZOJ3n"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "entrada = input('Dame tu nombre, por favor: ')\n",
+ "print(f'¡Hola, {entrada}!')\n",
+ "entrada = input('Dame un número entero, por favor: ')\n",
+ "numero = int(entrada) # convertimos entrada a int\n",
+ "print(f'El número es {numero}')"
+ ],
+ "metadata": {
+ "id": "RnvW1ddeJU-1"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# Ejercicio final: juego de adivinar un número entre 1 y 10\n",
+ "\n",
+ "Para finalizar este tutorial, voy a realizar un pequeño juego en el que el usuario tiene que adivinar un número generado al azar entre 1 y 10 y en el que solo tendrá 3 intentos para hacerlo.\n",
+ "\n",
+ "Para esto voy a utilizar muchas de las cosas contadas arriba. Además, comentaré el código para que todo quede perfectamente claro. Léelo con calma intentando comprender cada línea.\n",
+ "\n",
+ "Y, por supuesto, ¡puedes ejecutarlo para jugar tú!\n"
+ ],
+ "metadata": {
+ "id": "XCN38-bphFTC"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "import random # necesitamos esta librería para poder generar un número al azar\n",
+ "\n",
+ "numero_secreto = random.randint(1, 10) # esto nos genera un número aleatorio entre 1 y 10\n",
+ "oportunidades = 3 # el número de oportunidades que nos quedan\n",
+ "acertado = False # esta variable nos servirá para saber si el usuario ha acertado\n",
+ "\n",
+ "print('* Bienvenido a nuestro pequeño juego del Tutorial Básico Interactivo de Código Pitón')\n",
+ "print() # imprimimos por pantalla una línea en blanco\n",
+ "print('Acabo de pensar un número secreto entre 1 y 10. Tienes tres oportunidades para')\n",
+ "print('adivinarlo. Te iré guiando un poco hacia la solución. ¡Suerte!')\n",
+ "print()\n",
+ "\n",
+ "# Hacemos un bucle mientras queden oportunidades y mientras no se haya acertado el número secreto\n",
+ "while oportunidades > 0 and not acertado:\n",
+ " \n",
+ " # Pedimos un número al usuario (y transformamos lo que escriba a entero mediante la función int)\n",
+ " # ¡Cuidado! Si lo que escribe el usuario no es un entero el programa generará un error\n",
+ " # El error puede ser controlado con try-except como vimos más arriba\n",
+ " numero = int(input('Dime un número entre 1 y 10: '))\n",
+ "\n",
+ " # Ahora vamos a hacer la comprobación\n",
+ " # e indicamos al usuario si el número secreto es mayor, menor o si lo ha averiguado\n",
+ " if numero < numero_secreto:\n",
+ " print('Te has quedado corto, el número secreto es más grande.')\n",
+ " elif numero > numero_secreto:\n",
+ " print('Te has pasado, el número secreto es más pequeño.')\n",
+ " else:\n",
+ " print(f'¡Enhorabuena! Has acertado en el intento {4-oportunidades}.')\n",
+ " acertado = True # ponemos acertado a cierto para que se detenga el bucle\n",
+ "\n",
+ " if not acertado: # si no ha acertado indicamos las oprtunidades que le quedan\n",
+ " oportunidades = oportunidades - 1 # restamos 1 a las oportunidades\n",
+ " print(f'Te quedan {oportunidades} oportunidades.')\n",
+ "\n",
+ " print()\n",
+ "\n",
+ "# cuando termine el bucle de juego mostramos el número de adinivinar\n",
+ "# y nos despedimos del usuario\n",
+ "\n",
+ "if not acertado: # si no se acierta el número se muestra por pantalla\n",
+ " print(f'* El número secreto era {numero_secreto}.')\n",
+ "\n",
+ "print('* ¡Gracias por jugar! ¡Hasta pronto!') \n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "8hziKM46ho_K"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "**¡Muchas gracias por haber usado este tutorial!**\n",
+ "\n",
+ "Recurre a él todas las veces que te haga falta hasta que te queden claros sus conceptos.\n",
+ "\n",
+ "Y no dejes de visitar [Código Pitón](https://www.codigopiton.com/).\n",
+ "\n",
+ "Un saludo,\n",
+ " \n",
+ "Juan.-\n",
+ "\n",
+ "P.S. ¿Te atreves a modificar el juego que hemos visto para que al terminar el juego el programa le pregunte al usuario si quiere volver a jugar? Si el usuario dice que sí, se vuelve a \"pensar\" un número secreto y se juega de nuevo. Si el usuario dice que no, se termina el programa."
+ ],
+ "metadata": {
+ "id": "0MrEzDjjnuD8"
+ }
+ }
+ ]
+}
\ No newline at end of file
From 6ae55380ac4331d6dc8b6325fc27c3bc6381a3d9 Mon Sep 17 00:00:00 2001
From: Jorge Cordova <55065873+jcordovaj@users.noreply.github.com>
Date: Sun, 22 Jan 2023 02:36:24 -0300
Subject: [PATCH 02/16] =?UTF-8?q?Actualizaci=C3=B3n=20220123?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Workbench/Taller/Apuntes01.ipynb | 80 ++++
Workbench/Taller/EstructurasControl.py | 1 +
Workbench/Taller/Funciones | 33 ++
Workbench/Taller/Hello-world.py | 2 +
Workbench/Taller/Mix_ejercicios.py | 634 +++++++++++++++++++++++++
Workbench/Taller/aritmetica.py | 22 +
Workbench/Taller/comment.py | 16 +
Workbench/Taller/datatypes.py | 51 ++
Workbench/Taller/listas.py | 77 +++
Workbench/Taller/variables.py | 11 +
10 files changed, 927 insertions(+)
create mode 100644 Workbench/Taller/Apuntes01.ipynb
create mode 100644 Workbench/Taller/EstructurasControl.py
create mode 100644 Workbench/Taller/Funciones
create mode 100644 Workbench/Taller/Hello-world.py
create mode 100644 Workbench/Taller/Mix_ejercicios.py
create mode 100644 Workbench/Taller/aritmetica.py
create mode 100644 Workbench/Taller/comment.py
create mode 100644 Workbench/Taller/datatypes.py
create mode 100644 Workbench/Taller/listas.py
create mode 100644 Workbench/Taller/variables.py
diff --git a/Workbench/Taller/Apuntes01.ipynb b/Workbench/Taller/Apuntes01.ipynb
new file mode 100644
index 000000000..a07c97eb9
--- /dev/null
+++ b/Workbench/Taller/Apuntes01.ipynb
@@ -0,0 +1,80 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Hello World\n"
+ ]
+ }
+ ],
+ "source": [
+ "print (\"Hello World\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "página1\n",
+ "página2\n",
+ "página3\n",
+ "página4\n"
+ ]
+ }
+ ],
+ "source": [
+ "libro = ['página1', 'página2', 'página3', 'página4']\n",
+ "marcapaginas = iter(libro)\n",
+ "print(next(marcapaginas))\n",
+ "print(next(marcapaginas))\n",
+ "print(next(marcapaginas))\n",
+ "print(next(marcapaginas))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.6"
+ },
+ "orig_nbformat": 4,
+ "vscode": {
+ "interpreter": {
+ "hash": "d3777ed8f5fe800f0d3d1926318eb186c93d9a88e13881725c87e5bdd2f1dd1d"
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/Workbench/Taller/EstructurasControl.py b/Workbench/Taller/EstructurasControl.py
new file mode 100644
index 000000000..36623ca54
--- /dev/null
+++ b/Workbench/Taller/EstructurasControl.py
@@ -0,0 +1 @@
+# Uso de IF/ELIF/ELSE, FOR, WHILE, otros ciclos
diff --git a/Workbench/Taller/Funciones b/Workbench/Taller/Funciones
new file mode 100644
index 000000000..41dcd2983
--- /dev/null
+++ b/Workbench/Taller/Funciones
@@ -0,0 +1,33 @@
+
+def misuma (a,b):
+ return a+b
+
+res= misuma (2,3)
+print (res)
+
+def suma(a, b):
+ return a + b
+
+
+
+# min y max son funciones integradas en Python que nos devuelven
+# los valores mínimo y máximo de un iterable (como las listas o las tuplas)
+def min_y_max(lista):
+ return min(lista), max(lista)
+
+
+# ahora vamos a usar estas funciones
+valor = suma(10, 15)
+print(valor)
+
+minimo, maximo = min_y_max([30, 10, 50, 40, 20])
+print(f'min y max son {minimo} y {maximo}')
+
+"""
+def test_OrdenarDiccionario_03(self):
+ dicc = {'clave1':['c','a','b'], 'clave2':['casa','auto','barco'], 'clave3':[3,1,2]}
+ valor_test = ch.OrdenarDiccionario(dicc, 'clave3', False)
+ valor_esperado = {'clave1':['b','a','c'], 'clave2':['barco','auto','casa'], 'clave3':[3,2,1]}
+ """
+
+"""
\ No newline at end of file
diff --git a/Workbench/Taller/Hello-world.py b/Workbench/Taller/Hello-world.py
new file mode 100644
index 000000000..c7a3e0986
--- /dev/null
+++ b/Workbench/Taller/Hello-world.py
@@ -0,0 +1,2 @@
+print ("Hello World")
+print ("hello", "world", 2023)
diff --git a/Workbench/Taller/Mix_ejercicios.py b/Workbench/Taller/Mix_ejercicios.py
new file mode 100644
index 000000000..c7df605fb
--- /dev/null
+++ b/Workbench/Taller/Mix_ejercicios.py
@@ -0,0 +1,634 @@
+Variables
+a = 'Hola '
+b = 'Mundo !'
+print(a + b)
+# Hola Mundo !
+x = 3
+y = 12
+print(x + y)
+15
+print(a + x)
+"""
+"---------------------------------------------------------------------------"
+
+TypeError Traceback (most recent call last)
+~\AppData\Local\Temp/ipykernel_18232/136165486.py in
+----> 1 print(a + x)
+
+TypeError: can only concatenate str (not "int") to str
+"""
+# Dividir "y" entre "x"
+y = 9
+x = 3
+print(y/x)
+3.0
+# Potencia de "y" elevado a la "x"
+y = 2
+x = 4
+print(y**x)
+16
+# Devolver el resto de la división
+y = 13
+x = 3
+print(y%x)
+1
+# Ciclo IF/ELIF/ELSE
+valor = 0
+if (valor < 0):
+ print('El número es negativo')
+elif (valor > 0):
+ print('El número es positivo')
+else:
+ print('El número es igual a cero')
+# El número es igual a cero
+
+# Ciclo FOR - Caso 1
+for n in range(1,10): #Incluye el primero y excluye el último
+ print(n, end(", "))
+
+# Ciclo WHILE
+n = 1
+while (n < 10):
+ print(n)
+ n = n + 1
+"""
+1
+2
+3
+4
+5
+6
+7
+8
+9
+"""
+# Lista
+
+# Caso 1 - Inicializa una lista y muestra la cantidad de elementos
+
+edad = (3,1,0.2,8,7) #Declara un objeto lista y le asigna elementos
+print (len(edad)) #Imprime la cantidad de elementos de la lista usando la función LEN
+#5 # La función retorno 5
+
+# Caso 2 - Identificar el tipo de variable usando la función TYPE, retorno el tipo de dato
+mi_lista = ['Rojo','Azul','Amarillo','Naranja','Violeta','Verde']
+type(mi_lista)
+# list
+print(mi_lista)
+['Rojo', 'Azul', 'Amarillo', 'Negro', 'Naranja', 'Violeta', 'Verde']
+print(mi_lista[0:2])
+['Rojo', 'Azul']
+print(mi_lista[:2])
+['Rojo', 'Azul']
+print(mi_lista[1:])
+['Azul', 'Amarillo']
+mi_lista.insert(3,'Negro')
+print(mi_lista.index('Azul'))
+# 1
+mi_lista.insert(3,'Negro')
+mi_lista.extend(['Marrón','Gris'])
+print(['a','b','c'] * 3)
+# ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
+print(mi_lista.index('Azul'))
+# 1
+mi_lista.remove('Blanco')
+
+"""
+---------------------------------------------------------------------------
+ValueError Traceback (most recent call last)
+~\AppData\Local\Temp/ipykernel_10044/2480624766.py in
+----> 1 mi_lista.remove('Blanco')
+
+ValueError: list.remove(x): x not in list
+mi_lista.remove('Negro')
+---------------------------------------------------------------------------
+ValueError Traceback (most recent call last)
+~\AppData\Local\Temp/ipykernel_10044/298389232.py in
+----> 1 mi_lista.remove('Negro')
+
+ValueError: list.remove(x): x not in list
+"""
+ultimo = mi_lista.pop()
+ultimo = mi_lista.pop()
+print(ultimo)
+# Gris
+ultimo = mi_lista.pop()
+ultimo
+# 'Amarillo'
+mi_tupla=tuple(mi_lista)
+print(mi_tupla[1])
+# Azul
+'Rojo' in mi_tupla
+# True
+mi_tupla.count('Rojo')
+# 1
+print(mi_lista[:] * 3)
+# ['Rojo', 'Azul', 'Amarillo', 'Negro', 'Marrón', 'Gris', 'Rojo', 'Azul', 'Amarillo', 'Negro', 'Marrón', 'Gris', 'Rojo', 'Azul', 'Amarillo', 'Negro', 'Marrón', 'Gris']
+mi_tupla.count('Rojo')
+# 1
+mi_tupla='Gaspar', 5, 8, 1999
+nombre, dia, mes, año = mi_tupla
+print("Nombre: ", nombre, " - Dia:", dia, " - Mes: ", mes, " - Año: ", año)
+# Nombre: Gaspar - Dia: 5 - Mes: 8 - Año: 1999
+nombre = 'Darío'
+edad = 39
+print(nombre, edad)
+print("Mi nombre es", nombre, ". Mi edad es", edad, "años")
+print("Mi nombre es {}. Mi edad es {} años". format(nombre, edad))
+# Darío 39
+# Mi nombre es Darío . Mi edad es 39 años
+# Mi nombre es Darío. Mi edad es 39 años
+
+mi_diccionario = { 'Colores Primarios': ['Rojo','Azul','Amarillo'],
+ 'Colores secundarios': ['Naranja','Violeta','Verde'],
+ 'Clave3': 10,
+ 'Clave4': False}
+print(mi_diccionario['Colores secundarios'])
+# ['Naranja', 'Violeta', 'Verde']
+
+mi_diccionario={'Clave1':'Valor1', 'Clave2':{'numeros':[1,2,3,4,5]}}
+print(mi_diccionario.keys())
+# dict_keys(['Clave1', 'Clave2'])
+print(mi_diccionario.values())
+# dict_values(['Valor1', {'numeros': [1, 2, 3, 4, 5]}])
+len (mi_diccionario)
+# 2
+
+edad = 60
+edad_compa = 50
+if (edad < edad_compa):
+ print(edad)
+ if (edad < 100):
+ print(edad + 100)
+ else:
+ print(edad - 100)
+else:
+ print(edad_compa)
+# 50
+
+primeros_10 = [0,1,2,3,4,5,6,7,8,9]
+print(primeros_10)
+# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+
+for n in primeros_10:
+ if (n%2 == 0):
+ print(n)
+ primeros_10[n]=0
+print("\va de nuevo....\n")
+"""
+0
+2
+4
+6
+8
+# va de nuevo....
+"""
+
+print(primeros_10)
+# [0, 1, 0, 3, 0, 5, 0, 7, 0, 9]
+
+for n in primeros_10:
+ print(primeros_10[n])
+print("\va de nuevo....\n")
+"""
+0
+1
+0
+3
+0
+5
+0
+7
+0
+9
+va de nuevo....
+"""
+
+print(primeros_10[9])
+# 9
+primeros_10 = ['a','b','c','d']
+primeros_10[4]
+"""
+---------------------------------------------------------------------------
+IndexError Traceback (most recent call last)
+ in
+----> 1 primeros_10[4]
+
+IndexError: list index out of range
+"""
+n = 40
+sequence = [0,1]
+for i in range(2,n):
+ sequence.append(sequence[i-1]+sequence[i-2])
+print (sequence)
+# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181,
+# 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269,
+# 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986]
+
+mi_diccionario = { 'Colores Primarios': ['Rojo','Azul','Amarillo'],
+ 'Colores secundarios': ['Naranja','Violeta','Verde'],
+ 'Clave3': 10,
+ 'Clave4': False}
+print(mi_diccionario['Colores secundarios'])
+# ['Naranja', 'Violeta', 'Verde']
+
+mi_diccionario['Clave3']=2
+
+mi_diccionario
+{'Argentina': 'Buenos Aires', 'Italia': 'Roma', 'Inglaterra': 'Londres'}
+mi_diccionario['Clave5']='Otro ejemplo'
+mi_tupla=("Argentina", "Italia", "Inglaterra")
+mi_diccionario={mi_tupla[0]:"Buenos Aires", mi_tupla[1]:"Roma", mi_tupla[2]:"Londres"}
+mi_diccionario={'Clave1':'Valor1', 'Clave2':(1,2,3,4,5)}
+type(mi_diccionario['Clave2'])
+# tuple
+mi_diccionario={'Clave1':'Valor1', 'Clave2':{'numeros':[1,2,3,4,5]}}
+type(mi_diccionario['Clave2'])
+# dict
+mi_diccionario={'Clave1':'Valor1', 'Clave2':[1,2,3,4,5]}
+type(mi_diccionario['Clave2'])
+# list
+print(mi_diccionario.keys())
+# dict_keys(['Clave1', 'Clave2'])
+print(mi_diccionario.values())
+# dict_values(['Valor1', [1, 2, 3, 4, 5]])
+len(mi_tupla)
+# 3
+
+def imprimir_valor_variable(var):
+ print('El valor de la variable es' + str(var))
+imprimir_valor_variable(mi_lista)
+# El valor de la variable es['Rojo', 'Azul', 'Amarillo', 'Negro', 'Marrón', 'Gris']
+
+def ordenar_dos_numeros(num1, num2):
+ if (num1 > num2):
+ return num2, num1
+ else:
+ return num1, num2
+
+ordenar_dos_numeros(8,1)
+# (1, 8)
+
+def factorial(numero):
+# Devuelve el factorial
+ if (numero > 1):
+ numero = numero * factorial(numero - 1)
+ return numero
+
+factorial(3)
+# 6
+#help(factorial)
+#Help on function factorial in module __main__:
+
+#factorial(numero)
+# Devuelve el factorial
+
+def dividir(dividendo, divisor = 1):
+ if (divisor == 0):
+ return 'No se puede dividir por cero'
+ else:
+ return dividendo / divisor
+print(dividir(10))
+# 10.0
+print(divisor)
+"""
+---------------------------------------------------------------------------
+NameError Traceback (most recent call last)
+~\AppData\Local\Temp/ipykernel_10044/1862935505.py in
+----> 1 print(divisor)
+
+NameError: name 'divisor' is not defined
+"""
+
+divisor = 5
+def dividir(dividendo):
+ if (divisor == 0):
+ return 'No se puede dividir por cero'
+ else:
+ return dividendo / divisor
+print(dividir(10))
+# 2.0
+print(divisor)
+# 5
+
+divisor = 5
+
+def dividir(dividendo, divisor = 1):
+ if (divisor == 0):
+ return 'No se puede dividir por cero'
+ else:
+ return dividendo / divisor
+
+print(dividir(10))
+# 10.0
+
+print(divisor)
+# 5
+
+lambda_producto = lambda x, y: x * y
+lambda_producto(3, 4)
+# 12
+
+class Animal:
+ '''
+ En esta clase se crean los animales
+ '''
+ def __init__(self, especie, edad, color):
+ self.especie = especie
+ self.edad = edad
+ self.color = color
+ def mePresento(self):
+ print('Hola, soy ', self.especie, ', de color', self.color, ' y tengo ', self.edad, ' años')
+ def cumplirAños(self):
+ self.edad = self.edad + 1
+
+a1 = Animal('Ratón', 2, 'Marrón')
+
+print(a1.especie)
+print(a1.edad)
+
+a2 = Animal('Liebre', 3, 'Gris')
+print(a2.especie)
+print(a2.edad)
+# Ratón
+# 2
+# Liebre
+# 3
+
+a1.mePresento()
+# Hola, soy Ratón , de color Marrón y tengo 2 años
+a2.mePresento()
+# Hola, soy Liebre , de color Gris y tengo 3 años
+a1.cumplirAños()
+a1.mePresento()
+# Hola, soy Ratón , de color Marrón y tengo 3 años
+
+# Caja Negra
+import unittest
+def suma(num_1, num_2):
+ return num_1 + num_2
+class CajaNegraTest(unittest.TestCase):
+
+ def test_suma_dos_positivos(self):
+ num_1 = 10
+ num_2 = 5
+
+ resultado = suma(num_1, num_2)
+
+ self.assertEqual(resultado, 15)
+
+ def test_suma_dos_negativos(self):
+ num_1 = -10
+ num_2 = -7
+
+ resultado = suma(num_1, num_2)
+
+ self.assertEqual(resultado, -17)
+
+unittest.main(argv=[''], verbosity=2, exit=False)
+
+"""
+" test_suma_dos_negativos (__main__.CajaNegraTest) ... ok
+" test_suma_dos_positivos (__main__.CajaNegraTest) ... ok
+
+----------------------------------------------------------------------
+Ran 2 tests in 0.004s
+
+OK
+
+if __name__ == '__main__':
+ unittest.main()
+"""
+#Caja de Cristal
+
+import unittest
+
+def es_mayor_de_edad(edad):
+ if edad >= 18:
+ return True
+ else:
+ return False
+
+class PruebaDeCristalTest(unittest.TestCase):
+
+ def test_es_mayor_de_edad(self):
+ edad = 20
+
+ resultado = es_mayor_de_edad(edad)
+
+ self.assertEqual(resultado, True)
+
+ def test_es_menor_de_edad(self):
+ edad = 15
+
+ resultado = es_mayor_de_edad(edad)
+
+ self.assertEqual(resultado, False)
+
+unittest.main(argv=[''], verbosity=2, exit=False)
+
+"""
+test_suma_dos_negativos (__main__.CajaNegraTest) ... ok
+test_suma_dos_positivos (__main__.CajaNegraTest) ... ok
+test_es_mayor_de_edad (__main__.PruebaDeCristalTest) ... ok
+test_es_menor_de_edad (__main__.PruebaDeCristalTest) ... ok
+
+----------------------------------------------------------------------
+Ran 4 tests in 0.006s
+
+OK
+
+if __name__ == '__main__':
+ unittest.main()
+"""
+
+# Python
+
+def busca_pais(paises, pais):
+# Paises es un diccionario. Pais es la llave.
+# Codigo con el principio EAFP (Easier to Ask Forgiveness than Permission/Mejor pedir perdón que pedir permiso)
+# Otro LBYL (Look Before You Leap/Piensa antes de actuar 🤐).
+
+ try:
+ return paises[pais]
+ except KeyError:
+ return None
+
+def divide_elementos_de_lista(lista, divisor):
+
+ '''
+ Cada elemento de una lista es dividida por un divisor definido.
+ En caso de error de tipo ZeroDivisionError que
+ significa error al dividir en cero
+ la función devuelve la lista inicial
+ '''
+ try:
+ return [i / divisor for i in lista]
+
+ except ZeroDivisionError as e:
+ print(e)
+ return lista
+
+lista = list(range(10))
+divisor = 0
+
+print(divide_elementos_de_lista(lista, divisor))
+# division by zero
+# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+
+divisor = 3
+print(divide_elementos_de_lista(lista, divisor))
+# [0.0, 0.3333333333333333, 0.6666666666666666, 1.0, 1.3333333333333333,
+# 1.6666666666666667, 2.0, 2.3333333333333335, 2.6666666666666665, 3.0]
+
+lista = [5, 4, 9, 2]
+i = 0
+while i < len(lista):
+ elemento = lista[i]
+ print(elemento)
+ i += 1
+
+"""
+5
+4
+9
+2
+"""
+
+lista = [5, 4, 9, 2]
+for elemento in lista:
+ print(elemento)
+
+"""
+5
+4
+9
+2
+"""
+from collections import Iterable
+cadena = "Hola"
+numero = 3
+print("cadena", isinstance(cadena, Iterable))
+print("numero", isinstance(numero, Iterable))
+
+"""
+cadena True
+numero False
+C:\Users\lopez\AppData\Local\Temp/ipykernel_10044/1562366592.py:1: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.10 it will stop working
+ from collections import Iterable
+"""
+
+print(list("Hola"))
+# ['H', 'o', 'l', 'a']
+print(sum([1, 2, 3]))
+# 6
+print("-".join("Hola"))
+# H-o-l-a
+
+mi_dict = {'a':1, 'b':2, 'c':3}
+for i in mi_dict:
+ print(i)
+"""
+a
+b
+c
+"""
+
+libro = ['página1', 'página2', 'página3', 'página4']
+marcapaginas = iter(libro)
+print(next(marcapaginas))
+print(next(marcapaginas))
+print(next(marcapaginas))
+print(next(marcapaginas))
+"""
+página1
+página2
+página3
+página4
+print(next(marcapaginas))
+---------------------------------------------------------------------------
+StopIteration Traceback (most recent call last)
+~\AppData\Local\Temp/ipykernel_10044/1391636315.py in
+----> 1 print(next(marcapaginas))
+
+StopIteration:
+14 % 3
+2
+14 // 3
+4
+"""
+a = [1,2]
+b = a.copy()
+b.append(3)
+print(a)
+# [1, 2]
+
+print(b)
+# [1, 2, 3]
+b.append(4)
+print(a)
+# [1, 2, 3]
+print(b)
+# [1, 2, 3, 4]
+x = 7
+# 7 & 7
+# 2
+print(x)
+# 2
+a = [1, 2]
+b = ["Uno", "Dos"]
+c = zip(a, b)
+type(c)
+# zip
+list(c)
+[(1, 'Uno'), (2, 'Dos')]
+frase = "El perro de san roque no tiene rabo"
+errores = [i for i in frase if i == 'r']
+print(errores)
+# ['r', 'r', 'r', 'r']
+n = 40
+sequence = [0,1]
+for i in range(2,n):
+ sequence.append(sequence[i-1]+sequence[i-2])
+ print (sequence)
+
+"""2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+4 << 1
+8"""
\ No newline at end of file
diff --git a/Workbench/Taller/aritmetica.py b/Workbench/Taller/aritmetica.py
new file mode 100644
index 000000000..7fd04e8f3
--- /dev/null
+++ b/Workbench/Taller/aritmetica.py
@@ -0,0 +1,22 @@
+#print (3.5 // 4)
+#print ("7"+"0")
+#print (int("7"+"0")/2) #Este es un ejemplo de casteo
+#print ( 2**1 / 12)
+#print (4*9)
+#Intersante como se pueden declarar variables
+"""
+a, b, c, d = 26, 11.3, 5, 3.5
+print (a)
+print (c)
+print (b)
+print (d)
+print (type (a))
+print (type (b))
+print (type (d))
+"""
+#print (4*9)
+#print (2+4)
+print (30%10)
+i = 5
+i -= 1
+print(i) # 4
\ No newline at end of file
diff --git a/Workbench/Taller/comment.py b/Workbench/Taller/comment.py
new file mode 100644
index 000000000..e26328386
--- /dev/null
+++ b/Workbench/Taller/comment.py
@@ -0,0 +1,16 @@
+# Este es un comentario en Python
+print ("This is an example of comments")
+print ("also, this is an other example of comments")
+print ("comments are preceded by a hash symbol #")
+print ("and other way to do this it's preceeding a paragraph")
+print ("by 3 dots at the beginig, and 3 at the end")
+
+"""este es un ejemplo de comentarios en varias líneas
+es otra forma para organizar textos largos..."""
+'''
+otro
+ejemplo
+de lineas
+múltiple
+'''
+print ("fin de los comments")
\ No newline at end of file
diff --git a/Workbench/Taller/datatypes.py b/Workbench/Taller/datatypes.py
new file mode 100644
index 000000000..41f532a07
--- /dev/null
+++ b/Workbench/Taller/datatypes.py
@@ -0,0 +1,51 @@
+#On this file we going to learn about different data types
+#Boolean, int, float, cmplex mumbers
+#Boolean true or false
+#String, list (dictionary
+current_year=2023
+print (current_year)
+next_year=current_year+1
+print (next_year)
+print (type (current_year))
+print(type (3.14))
+print (type (1+2j))
+print (type (9.81))
+#a = input ("Ingresa un texto")
+#print ("El texto ingresado es", a)
+#converting data type e.g int to float o vs
+print (int(9.81))
+print (round (9.81))
+#BOOLEAN CASES
+enjoying_lesson=True
+is_light_on=True
+is_single=False
+value = 3 < 2 #almacena el valor lógico de la expresión
+print (value)
+#STRINGS ==> Son datos almacenados del tipo cadena de texto
+#Concatenación se suman las variables de texto
+firstname = "Jota"
+print (firstname)
+lastname="Cordova"
+print (lastname)
+print (firstname+" "+ lastname)
+country = "Finland"
+print (country)
+#Recordar
+fullname = firstname + " "+lastname
+print (fullname,", aquí usamos la variable concatenada")
+print (type (firstname))
+print (country.upper()) #métodos de la clase print
+print (fullname.title())
+#LIST ==> It's a list of something, could be task, groceries
+empty_list1 = list() #dos formas de inicializar listas
+empty_list2 = [] #la nombro y luego declaro como list()
+# la nombre y asigno una lista vacia con corchetes []
+print (empty_list1, "esta es la lista 1")
+print (empty_list2, "esta es la lista 2")
+numbers = [1,2,3,4,5,6]
+groceries = ["tomato", "carrot", "letuce"]
+print (groceries [0]) #el puntero va con corchete y parte de 0
+print (numbers [3]) #es una COLECCION
+print (len(groceries)) #conocer el largo de la la lista con len
+mix_of_data_types_list = [1, "Jota", lastname, 2+5, 1-3j, 3.14]
+#podemos almacenar un mix de datos
diff --git a/Workbench/Taller/listas.py b/Workbench/Taller/listas.py
new file mode 100644
index 000000000..731dbf055
--- /dev/null
+++ b/Workbench/Taller/listas.py
@@ -0,0 +1,77 @@
+#Ejericio 1
+
+listadeletras = [] # Crea un objeto list llamado lista
+for unaletra in "paralelepipedo": # Define una variable car para recorrer el string "casa"
+ listadeletras.append(unaletra) # Agrega cada caracter del string en la lista
+print(listadeletras) # Imprime los valores de la lista que son los caracteres de la palabra casa o pera, lo que sea
+ # Salida esperada ['c', 'a', 's', 'a']
+
+"""
+#Ejercicio 2
+# Lista de 4 elementos y para cada elemento calcularle la potencia de 2, usando el método tradicional, eso seria así:
+#Alternativa 1
+
+lista_potencias = [] #Crea una lista llamada "lista_potencias"
+for i in range(4): #ciclo for para recorrer lista de 4 elementos, va de 0 a 3, el índice lo llamamos "i"
+ lista_potencias.append(i**2) #a la lista "lista_potencias", la voy poblando con el dato calculado.
+print(lista_potencias) #Imprime los 4 valores almacendaos en la lista #Obs: como no cambié el nombre, concatenó los valores de la lista al final
+# [0, 1, 4, 9]
+
+#Alternativa 2
+# Entonces el ejemplo anterior usando listas de comprensión, eso seria así:
+lista_potencias2 = [i**2 for i in range(4)]
+print ("Esta es la lista de potencias Nr2", lista_potencias2)
+# [0, 1, 4, 9]
+
+#Ejercicio 3
+#Lista con las potencias de 2 de los primeros 10 números, método tradicional:
+"""
+"""
+Método 3-1
+lista1_pot10_2 = [] #Creamos un objeto lista vacio []
+for num in range (0, 11): #incluye el primero y no el últimmo. Usando un ciclo FOR usando la var "num" en el tramo de 0-10, ambos incluidos
+ lista1_pot10_2.append (num**2) #Llenamos la lista con potencias PARTIENDO DE 0, a 10 (11-1)
+print(lista1_pot10_2)
+
+#[4, 9, 16]
+#[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
+#Método 3-2
+#Entonces el ejemplo anterior usando listas de comprensión, eso seria así:
+#lista2_pot10_2 = [num2**2 for num2 in range(0, 11)] #Creamos la lista con los valores según condición
+#print("Este es el método 3-2, para crear la lista de 10 números y sus potencias",lista2_pot10_2)
+#[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
+#De este código anterior usted puede aprender que es posible modificar al vuelo los elementos los cuales van a formar la lista.
+
+# Ej
+# Con este ejemplo se ve como funciona el conteo de posiciones en una lista (cada elemento es una posX)
+lista = ["pos0", "pos1", "pos2", "pos3", "pos4", "pos5"]
+print("Esta es la lista:\n", lista, "\n")
+print("1° Mostrar 'lista[2:5]', significa la pos2, pero excluye la 5, ojo!\n", lista[2:5]) # tomamos del 2 al 5 (sin incluir el 5)
+print("2° Mostrar 'lista[4:]', significa desde la pos4 hasta la última\n",lista[4:]) # tomamos del 4 hasta el final
+print("3° Mostrar 'lista[:2]', significa desde el BOF hasta la pos2, excluye la pos2\n", lista[:2]) # tomamos desde el principio hasta el 2 (sin incluir)
+print("4° Mostrar 'lista[1:6:2]', significa 1 por medio, desde la pos1, incluye la 5\n", lista[1:6:2]) # tomamos 1 de cada 2 elementos desde el 1 hasta el 6 (sin incluir)
+print("5° Mostrar 'lista[4:1:-1]', significa orden desc de la pos4 a la 2, excluye la pos1",lista[4:1:-1])
+print("6° Mostrar 'lista[:]', significa mostrar todos los elementos de la lista\n",lista[:]) # tomamos desde el principio hasta el final (es como hacer una copia de la lista)
+print("7° Mostrar 'lista[::-1]', significa mostrar todos los elementos de la lista en orden inverso\n",lista[::-1]) # tomamos desde el final hasta el principip (orden inverso)
+"""
+# EJ 5
+# Con este ejemplo usamos un truco para controlar la salida, un método de print llamado end
+#
+for i in range (15):
+ if i < 14:
+ print (i, end=", ")
+ else:
+ print (i)
+
+"""
+# Ej 6
+# Mismo ejemplo sin controlar la salida, cada linea se ejecuta y se apilan.
+#for i in range (15):
+# print (i)
+"""
+"""
+# Revisar formas de ordenar listas
+lista_desordenada = (5,7,2,8,3,6)
+print (lista_desordenada)
+print (lista_desordenada.sort())
+"""
\ No newline at end of file
diff --git a/Workbench/Taller/variables.py b/Workbench/Taller/variables.py
new file mode 100644
index 000000000..cb71de421
--- /dev/null
+++ b/Workbench/Taller/variables.py
@@ -0,0 +1,11 @@
+#Variables
+#It's memory location to assign data to store and use ir later
+a=10
+b=3
+print (a)
+
+print ("what's the value of a", a)
+print ("what's the value of b", b)
+print (a+b)
+total =2+4
+print (total)
\ No newline at end of file
From 4bf5e17acc8ca378c99d3b28df2f1ef6367a0ab1 Mon Sep 17 00:00:00 2001
From: Jorge Cordova <55065873+jcordovaj@users.noreply.github.com>
Date: Sun, 22 Jan 2023 20:48:44 -0300
Subject: [PATCH 03/16] 220123...tratando de avanzar
---
...urse_Homework_03-Resuelto-checkpoint.ipynb | 12 +-
...ep_Course_Homework_03-Resuelto Clase.ipynb | 16 +-
.../Prep_Course_Homework_03-Resuelto.ipynb | 12 +-
Workbench/Taller/Apuntes01.ipynb | 2 +-
Workbench/Taller/Ciclos.py | 26 +++
.../Taller/{comment.py => ComoComentar.py} | 0
Workbench/Taller/CrearMenu.py | 105 ++++++++++
Workbench/Taller/Diccionarios.py | 139 +++++++++++++
Workbench/Taller/Funciones | 59 +++---
Workbench/Taller/Matrices.py | 27 +++
Workbench/Taller/datatypes.py | 31 +--
Workbench/Taller/listas.py | 184 +++++++++++++-----
Workbench/Taller/variables.py | 4 +-
13 files changed, 505 insertions(+), 112 deletions(-)
create mode 100644 Workbench/Taller/Ciclos.py
rename Workbench/Taller/{comment.py => ComoComentar.py} (100%)
create mode 100644 Workbench/Taller/CrearMenu.py
create mode 100644 Workbench/Taller/Diccionarios.py
create mode 100644 Workbench/Taller/Matrices.py
diff --git a/03 - Flujos de Control/.ipynb_checkpoints/Prep_Course_Homework_03-Resuelto-checkpoint.ipynb b/03 - Flujos de Control/.ipynb_checkpoints/Prep_Course_Homework_03-Resuelto-checkpoint.ipynb
index 8b24b6405..24c961bd1 100644
--- a/03 - Flujos de Control/.ipynb_checkpoints/Prep_Course_Homework_03-Resuelto-checkpoint.ipynb
+++ b/03 - Flujos de Control/.ipynb_checkpoints/Prep_Course_Homework_03-Resuelto-checkpoint.ipynb
@@ -716,11 +716,8 @@
}
],
"metadata": {
- "interpreter": {
- "hash": "c85384e4cb51c8b72350f3a8712cc8351fdc3955e32a27f9b60c6242ab125f01"
- },
"kernelspec": {
- "display_name": "Python 3.9.7 64-bit ('henry': conda)",
+ "display_name": "Python 3",
"language": "python",
"name": "python3"
},
@@ -734,7 +731,12 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.9.7"
+ "version": "3.10.6 (tags/v3.10.6:9c7b4bd, Aug 1 2022, 21:53:49) [MSC v.1932 64 bit (AMD64)]"
+ },
+ "vscode": {
+ "interpreter": {
+ "hash": "d3777ed8f5fe800f0d3d1926318eb186c93d9a88e13881725c87e5bdd2f1dd1d"
+ }
}
},
"nbformat": 4,
diff --git a/03 - Flujos de Control/Prep_Course_Homework_03-Resuelto Clase.ipynb b/03 - Flujos de Control/Prep_Course_Homework_03-Resuelto Clase.ipynb
index ce4105c8d..e031e08b2 100644
--- a/03 - Flujos de Control/Prep_Course_Homework_03-Resuelto Clase.ipynb
+++ b/03 - Flujos de Control/Prep_Course_Homework_03-Resuelto Clase.ipynb
@@ -443,8 +443,8 @@
" num2 = num * num2\n",
" num = num - 1\n",
" print(num2) \n",
- " else:\n",
- " print('el número {num} es menor que 0') \n"
+ "else:\n",
+ " print('el número {num} es menor que 0') \n"
]
},
{
@@ -34589,11 +34589,8 @@
}
],
"metadata": {
- "interpreter": {
- "hash": "c85384e4cb51c8b72350f3a8712cc8351fdc3955e32a27f9b60c6242ab125f01"
- },
"kernelspec": {
- "display_name": "Python 3 (ipykernel)",
+ "display_name": "Python 3",
"language": "python",
"name": "python3"
},
@@ -34607,7 +34604,12 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.9.7"
+ "version": "3.10.6 (tags/v3.10.6:9c7b4bd, Aug 1 2022, 21:53:49) [MSC v.1932 64 bit (AMD64)]"
+ },
+ "vscode": {
+ "interpreter": {
+ "hash": "d3777ed8f5fe800f0d3d1926318eb186c93d9a88e13881725c87e5bdd2f1dd1d"
+ }
}
},
"nbformat": 4,
diff --git a/03 - Flujos de Control/Prep_Course_Homework_03-Resuelto.ipynb b/03 - Flujos de Control/Prep_Course_Homework_03-Resuelto.ipynb
index 39f94f511..f2e303cbf 100644
--- a/03 - Flujos de Control/Prep_Course_Homework_03-Resuelto.ipynb
+++ b/03 - Flujos de Control/Prep_Course_Homework_03-Resuelto.ipynb
@@ -716,11 +716,8 @@
}
],
"metadata": {
- "interpreter": {
- "hash": "c85384e4cb51c8b72350f3a8712cc8351fdc3955e32a27f9b60c6242ab125f01"
- },
"kernelspec": {
- "display_name": "Python 3 (ipykernel)",
+ "display_name": "Python 3",
"language": "python",
"name": "python3"
},
@@ -734,7 +731,12 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.9.7"
+ "version": "3.10.6 (tags/v3.10.6:9c7b4bd, Aug 1 2022, 21:53:49) [MSC v.1932 64 bit (AMD64)]"
+ },
+ "vscode": {
+ "interpreter": {
+ "hash": "d3777ed8f5fe800f0d3d1926318eb186c93d9a88e13881725c87e5bdd2f1dd1d"
+ }
}
},
"nbformat": 4,
diff --git a/Workbench/Taller/Apuntes01.ipynb b/Workbench/Taller/Apuntes01.ipynb
index a07c97eb9..7b28b9a52 100644
--- a/Workbench/Taller/Apuntes01.ipynb
+++ b/Workbench/Taller/Apuntes01.ipynb
@@ -66,7 +66,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.10.6"
+ "version": "3.10.6 (tags/v3.10.6:9c7b4bd, Aug 1 2022, 21:53:49) [MSC v.1932 64 bit (AMD64)]"
},
"orig_nbformat": 4,
"vscode": {
diff --git a/Workbench/Taller/Ciclos.py b/Workbench/Taller/Ciclos.py
new file mode 100644
index 000000000..bf1ab9a44
--- /dev/null
+++ b/Workbench/Taller/Ciclos.py
@@ -0,0 +1,26 @@
+print ("Inicio de números pares")
+lista_p=[] # Creo lista pares, para poder imprimirlos hor.
+lista_i=[] # Creo lista impares, para poder imprmirlos ver.
+for par in range(0, 21, 2): # En el rango 0-20, cada 2, partiendo de 0
+ lista_p.append(par)
+ print (par)
+print(lista_p) # Escribe la lista vertical
+print ("Fin de números pares") # Escribe la lista horizontal
+print ("Inicio de números impares")
+for impar in range(1, 21, 2): # En el rango 1-20, cada 2, partiendo de 1
+ lista_i.append(impar)
+ print (impar) # Escrbe la lista vertical
+ # Escribe la lista horizontal
+print(lista_i)
+print ("Fin de números impares")
+"""
+"""# Dado un valor entero, ejecutar el mismo número de ciclos con un while
+a= 5
+num=1
+while num < a+1:
+ #print ("a vale ", a)
+ #print ("num vale ", num)
+ print ("Este es el ciclo", num)
+ num=num+1
+
+
diff --git a/Workbench/Taller/comment.py b/Workbench/Taller/ComoComentar.py
similarity index 100%
rename from Workbench/Taller/comment.py
rename to Workbench/Taller/ComoComentar.py
diff --git a/Workbench/Taller/CrearMenu.py b/Workbench/Taller/CrearMenu.py
new file mode 100644
index 000000000..ebe1a4193
--- /dev/null
+++ b/Workbench/Taller/CrearMenu.py
@@ -0,0 +1,105 @@
+
+"""
+def accion1():
+ print('Has elegido la opción 1')
+
+
+def accion2():
+ print('Has elegido la opción 2')
+
+
+def accion3():
+ print('Has elegido la opción 3')
+
+
+def salir():
+ print('Saliendo')
+
+#Guardamos en en un diccionario de tuplas, la opción y la acción
+opciones = {
+ '1': ('Opción 1', accion1),
+ '2': ('Opción 2', accion2),
+ '3': ('Opción 3', accion3),
+ '4': ('Salir', salir)
+}
+
+def generar_menu(opciones, opcion_salida):
+ opcion = None
+ while opcion != opcion_salida:
+ mostrar_menu(opciones)
+ opcion = leer_opcion(opciones)
+ ejecutar_opcion(opcion, opciones)
+ print() # se imprime una línea en blanco para clarificar la salida por pantalla
+
+def mostrar_menu(opciones):
+ print('Seleccione una opción:')
+ for clave in sorted(opciones):
+ print(f' {clave}) {opciones[clave][0]}')
+
+def leer_opcion(opciones):
+ while (a := input('Opción: ')) not in opciones:
+ print('Opción incorrecta, vuelva a intentarlo.')
+ return a
+
+def ejecutar_opcion(opcion, opciones):
+ opciones[opcion][1]()
+
+def menu_principal():
+ opciones = {
+ '1': ('Opción 1', accion1),
+ '2': ('Opción 2', accion2),
+ '3': ('Opción 3', accion3),
+ '4': ('Salir', salir)
+ }
+generar_menu(opciones, '4')"""
+
+# Creamos funciones asociadas a cada acción del menú
+# Tercer paso es unir la lógica y para ellos crearemos con tres objetivos:
+# 1) Mostrar el menú al usuario
+# 2) Pedir una opción al usuario y leer esa opción por teclado.
+# 3) Ejecutar la opción correspondiente.
+
+def mostrar_menu(opciones):
+ print('Seleccione una opción:')
+ for clave in sorted(opciones):
+ print(f' {clave}) {opciones[clave][0]}')
+
+def leer_opcion(opciones):
+ while (a := input('Opción: ')) not in opciones:
+ print('Opción incorrecta, vuelva a intentarlo.')
+ return a
+
+def ejecutar_opcion(opcion, opciones):
+ opciones[opcion][1]()
+
+def generar_menu(opciones, opcion_salida):
+ opcion = None
+ while opcion != opcion_salida:
+ mostrar_menu(opciones)
+ opcion = leer_opcion(opciones)
+ ejecutar_opcion(opcion, opciones)
+ print()
+
+def menu_principal():
+ opciones = {
+ '1': ('Opción 1', accion1),
+ '2': ('Opción 2', accion2),
+ '3': ('Opción 3', accion3),
+ '4': ('Salir', salir)
+ }
+ generar_menu(opciones, '4')
+
+def accion1():
+ print('Has elegido la opción 1')
+
+def accion2():
+ print('Has elegido la opción 2')
+
+def accion3():
+ print('Has elegido la opción 3')
+
+def salir():
+ print('Saliendo')
+
+if __name__ == '__main__':
+ menu_principal()
\ No newline at end of file
diff --git a/Workbench/Taller/Diccionarios.py b/Workbench/Taller/Diccionarios.py
new file mode 100644
index 000000000..3479a15af
--- /dev/null
+++ b/Workbench/Taller/Diccionarios.py
@@ -0,0 +1,139 @@
+#*******************************************************************
+#* *
+#* TEORIA DICCIONARIOS *
+#* *
+#*******************************************************************
+# Un dict es una colección de pares, no ordenados, compuestos por una KEY y un VALUE (valor)
+# La KEY debe ser HASHEABLE, INMUTABLE, ÚNICA, NO REPETIBLE, los valores pueden ser cualquier cosa MUTABLE.
+# Un VALUE puede ser otro DICCIONARIO, TUPLA, LISTA, más los tipos clásicos, como BOOLEAN, etc.
+# Otras caracteristicas: Similar al tipo MAPA en otros lenguajes, no confundir con función map(),
+# aunque retorna un DICT. La funicón map() es para objetos iterables como listas.
+# Método keys() => nom_dic.keys() retorna una clase especial llamada dict_keys, sólo nombra las keys,
+# Para acceder a las KEYS, se debe pasar a LISTA ==> nom_var = list(nom_dic.keys())
+# para poder iterar sobre cada LLAVE
+# Método clear() => Borra todos los elementos del diccionario mi_dic.clear(), retorna {}
+# Método del(key) => Elimina un elemento con su clave, le paso la clave como parámetro
+# Método values() => devuelve todos los VALORES
+# Método dict.items()=> Retorna tuplas (clave, valor), también se pasa a list siguen siendo TUPLAS.
+# Función in retorna bool si encuentra valor de una clave "mi_key" in "mi_dic"
+# Sólo sirve para claves, y es un booleano, TRUE o FALSE, si quiero preguntar po un valor, agregro
+# VALUE de esta forma "mi_valor" in "mi_dic.value".
+# Recorridos en diccionarios
+
+
+
+# Inicialización de DICCIONARIOS (dict)
+# El constructor dict y argumentos. Ej: dict(color='Azul', num=4)
+# Constructor dict y pares de valores. Ej: dict([('color', 'Azul'), ('num', 4)])
+# Usando un literal de pares separados por ':' y rodeado por {}. Ej: {'color': 'Azul', 'num': 4}
+#
+
+# Ejemplo 1
+# Este es un dic de 4 elementos o pares cualquiera str, int, str y str.
+# Obtenemos sus claves y las pasamos a una lista
+d = {1: 'str cualquiera', 89: 'soy un valor', 'clave a': 'b', 'clave c': 27} # Inicializa el dict
+listkey_d = list(d.keys()) # Hay que convertirlo a lista para acceder a las keys como índice
+print (listkey_d) # Ahora veo los índices y los puedo trabajar como LISTA
+print ("'D' es del tipo ", type (d)) # Retorna
+print ("'listkey_d' es del tipo ", type (listkey_d)) # Retorna , se ve la diferencia
+print ("El nombre de la clave en la posición 1 es ", listkey_d [1], " y es de tipo", type(listkey_d [1]))
+print ("El nombre de la clave en la posición 3 es ", listkey_d [3], " y es de tipo", type(listkey_d [3]))
+print ("")
+
+# Ejemplo 2
+# Crea un diccionario con 4 pares lógicos, colores primarios, colores secundarios, clave 3 y clave 4
+
+mi_dic = {'Colores Primarios': ['Rojo','Azul','Amarillo'],
+ 'Colores secundarios': ['Naranja','Violeta','Verde'],
+ 'Clave3': 10,
+ 'Clave4': False}
+mi_dic_keys = list (mi_dic.keys()) # Obtenemos las keys y las pasamos a una list "mi_dic_keys"
+print (mi_dic_keys) # Imprime la lista
+print (type (mi_dic_keys)) # Imprime el tipo de la variable mi_dic_keys, retorna
+print ("Los colores de la clave ", mi_dic_keys [1], "son ", mi_dic['Colores secundarios'])
+print ("")
+print (mi_dic.keys())
+
+print ("Los colores de la clave ", mi_dic_keys [0], "son ", mi_dic['Colores Primarios'])
+print ("El valor de la clave 3", mi_dic_keys [2], "es ", mi_dic['Clave3'])
+print ("El valor de la clave 4", mi_dic_keys [3], "son ", mi_dic['Clave4'])
+
+# Ejemplo 3
+dd2 = dict (width=4, members=['1', False], name='Pepe') # 3 elementos, 1 int, 1 dict, un str
+print ("El contenido de 'dd2' es ", dd2) # # Retorna {'width': 4, 'members': ['1', False], 'name': 'Pepe'}
+print (dd2.values()) # Retorna 4, ['1', False], "Pepe"
+
+
+# Ejemplo 4
+print("")
+dict2 = {} # Inicializa un diccionario vacío
+print ("El contenido de 'dict2' debe ser vacío ", dict2) # Mostrará {}
+# El contenido de 'dict2' debe ser {}
+
+# Ejemplo 5
+print ("")
+# Observar varias formas de declarar diccionarios
+{'1': 'primero', '2': 'segundo', 'tercero': 4 * 5 * 6} # Tres pares, str-str, str-str y str-int
+{'1': 'primero', '2': 'segundo', 'tercero': 120} # Igual que el anterior, pero el último no es una operación
+{str(x): x + 1 for x in range(5)} # Clave es un str x, el valor de x+1 en el rango 0-5
+{'0': 1, '1': 2, '2': 3, '3': 4, '4': 5} # 4 pare, str-int, str-int, str-int, str-int
+dict(enumerate(range(5), start=10))
+{10: 0, 11: 1, 12: 2, 13: 3, 14: 4}
+[(x, chr(x)) for x, idx in enumerate(range(5), start=65)]
+[(65, 'A'), (66, 'B'), (67, 'C'), (68, 'D'), (69, 'E')]
+#Este ejemplo crea un diccionario compuesto por un int (start=65), y el valor es un str que se calcula
+# usando la función chr(), al pasarle el valor de x, retornará 5 letras sucesivas entre 65 y 69 (5 valores)
+letters = [(x, chr(x)) for x, idx in enumerate(range(5), start=65)]
+dict(letters)
+print (letters)
+{65: 'A', 66: 'B', 67: 'C', 68: 'D', 69: 'E'}
+
+# Ejemplo 6
+# Este es un diccionario
+# Se define como nombre_dic = dict(pos=valor, key=valor, valor=valor), hay otras formas
+#
+miprimer_dic = dict(tipo='Moto', marca='Honda', power=599)
+print(list(enumerate(miprimer_dic))) #convertimos el dict en lista.
+#[(0, 'tipo'), (1, 'marca'), (2, 'power')]
+print("")
+print ("Inicio del ciclo for")
+# En este ejemplo iteramos los elementos de un diccionario y me muestran los pares según posición
+# Usamos el método "enumerate" que pertenece al tipo list, para recorrer el dict convertido en lista
+#
+print ("caso con f")
+for idx, key in enumerate(miprimer_dic): # El enumerador de la forma ind, key, recorre el diccionario
+ print(f'Pos: {idx} - dict_key {key} - value {miprimer_dic[key]}')
+ #print('Pos: {idx} - dict_key {key} - value {miprimer_dic[key]}')
+print("")
+print ("caso sin f")
+for idx, key in enumerate(miprimer_dic): # El enumerador de la forma ind, key, recorre el diccionario
+ #print(f'Pos: {idx} - dict_key {key} - value {miprimer_dic[key]}')
+ print('Pos: {idx} - dict_key {key} - value {miprimer_dic[key]}')
+
+#Pos: 0 - dict_key tipo - value Moto
+#Pos: 1 - dict_key marca - value Honda
+#Pos: 2 - dict_key power - value 599
+
+# Ejemplo 7
+# Consultar a un dicc, si una clase existe => retorna un booleano TRUE o FALSE
+# Ojo si preguntas por un valor, puede existir, pero retornará FALSE
+# Si quiero preguntar por un valor, agrego el método .value()
+
+print ("")
+letters2 = [(x, chr(x)) for x, idx in enumerate(range(5), start=65)]
+dd = dict(letters2)
+print ("Este es el diccionario dd", dd)
+mi_key1=65
+print (type(letters2))
+if mi_key1 in dd:
+ print ("La clave ", mi_key1," existe")
+else:
+ print ("La clave ", mi_key1, ". No existe")
+print ("")
+
+restaurant = {"Hamburguesa": 100, "Pizza": 50, "Jugo": 30}
+if "Hamburguesa" in restaurant:
+ print ("SI está")
+else:
+ print ("NO está")
+print (restaurant)
\ No newline at end of file
diff --git a/Workbench/Taller/Funciones b/Workbench/Taller/Funciones
index 41dcd2983..cdcc063de 100644
--- a/Workbench/Taller/Funciones
+++ b/Workbench/Taller/Funciones
@@ -1,33 +1,38 @@
-
-def misuma (a,b):
- return a+b
-
-res= misuma (2,3)
-print (res)
-
-def suma(a, b):
- return a + b
-
-
-
+#*******************************************************************
+#* *
+#* B I E N V E N I D O A F U N C I O N E S *
+#* *
+#*******************************************************************
+# Una función es una operación o procedimiento que retorna un valor o acción
+# Se declaran con la palabra reservada 'def' y se cierra con ':', debe incluir 'return' y la logica
+# del cálculo o lo que hace la función.
+# Operaciones o métodos habituales como insert, append, sort...son funciones, porque hacen o retornan cosas.
+# Para usar la función, le paso los parámetros definidos, ojo con los tipos y el control de las excepciones
+
+# Ejemplo 1
+def misuma (a,b): # Esta es una función, toma dos enteros a,b y los suma
+ return a+b # El calculo viene después de la palabra return
+
+res= misuma (2,3) # Uso la función, le paso los parámetros 2,3 y, el resultado lo almaceno en la variable res
+print ("Resultado de sumar 2 y 3, es ", res) # Puedo ver su contenido con un print
+
+# Ejemplo 2
# min y max son funciones integradas en Python que nos devuelven
# los valores mínimo y máximo de un iterable (como las listas o las tuplas)
-def min_y_max(lista):
- return min(lista), max(lista)
-
+def min_y_max(lista): # Declaro la función y le digo que le pasaré un argumento de tipo lista
+ return min(lista), max(lista) # Usando la funciones min y max que pertenecen a objetos iterables
+ # obtengo los valores y los devuelvo
# ahora vamos a usar estas funciones
-valor = suma(10, 15)
-print(valor)
+valor = misuma(10, 15)
+print("Usando la función 'misuma', el resultado de sumar 10 y 15 es ", valor)
minimo, maximo = min_y_max([30, 10, 50, 40, 20])
-print(f'min y max son {minimo} y {maximo}')
-
-"""
-def test_OrdenarDiccionario_03(self):
- dicc = {'clave1':['c','a','b'], 'clave2':['casa','auto','barco'], 'clave3':[3,1,2]}
- valor_test = ch.OrdenarDiccionario(dicc, 'clave3', False)
- valor_esperado = {'clave1':['b','a','c'], 'clave2':['barco','auto','casa'], 'clave3':[3,2,1]}
- """
-
-"""
\ No newline at end of file
+print("Para el vector 30,10,50,40 y 20, los ",f'min y max son {minimo} y {maximo}')
+
+# Ejemplo 3 #Lo veremos más adelante
+# En este ejemplo, creamos una función que realiza un test unitario
+#def test_OrdenarDiccionario_03(self):
+# dicc = {'clave1':['c','a','b'], 'clave2':['casa','auto','barco'], 'clave3':[3,1,2]}
+# valor_test = ch.OrdenarDiccionario(dicc, 'clave3', False)
+# valor_esperado = {'clave1':['b','a','c'], 'clave2':['barco','auto','casa'], 'clave3':[3,2,1]}
\ No newline at end of file
diff --git a/Workbench/Taller/Matrices.py b/Workbench/Taller/Matrices.py
new file mode 100644
index 000000000..ed2f911ab
--- /dev/null
+++ b/Workbench/Taller/Matrices.py
@@ -0,0 +1,27 @@
+# Ejemplo 1
+# Uso de 'enumerate' para recorrer matrices
+m = [['enteros', 1, 2, 3, 4], #Define una matriz 'm'
+ ['complex', 1j, 2j, 3j, 4j],
+ ['float', 1.0, 2.0, 3.0, 4.0]]
+# [['enteros', 1, 2, 3, 4], ['complex', 1j, 2j, 3j, 4j], ['float', 1.0, 2.0, 3.0, 4.0]]
+for i, elems in enumerate(m):
+ for j, jelem in enumerate(elems):
+ print(f'row {i} - column {j}: {jelem}')
+
+"""
+row 0 - column 0: enteros
+row 0 - column 1: 1
+row 0 - column 2: 2
+row 0 - column 3: 3
+row 0 - column 4: 4
+row 1 - column 0: complex
+row 1 - column 1: 1j
+row 1 - column 2: 2j
+row 1 - column 3: 3j
+row 1 - column 4: 4j
+row 2 - column 0: float
+row 2 - column 1: 1.0
+row 2 - column 2: 2.0
+row 2 - column 3: 3.0
+row 2 - column 4: 4.0
+"""
\ No newline at end of file
diff --git a/Workbench/Taller/datatypes.py b/Workbench/Taller/datatypes.py
index 41f532a07..642414419 100644
--- a/Workbench/Taller/datatypes.py
+++ b/Workbench/Taller/datatypes.py
@@ -1,7 +1,9 @@
-#On this file we going to learn about different data types
-#Boolean, int, float, cmplex mumbers
-#Boolean true or false
-#String, list (dictionary
+
+# On this file we going to learn about different data types
+# Boolean, int, float, complex mumbers
+# Boolean true or false
+# String, list (dictionary)
+
current_year=2023
print (current_year)
next_year=current_year+1
@@ -10,9 +12,9 @@
print(type (3.14))
print (type (1+2j))
print (type (9.81))
-#a = input ("Ingresa un texto")
-#print ("El texto ingresado es", a)
-#converting data type e.g int to float o vs
+a = input ("Ingresa un texto")
+print ("El texto ingresado es", a)
+# Convertir data type e.g int to float o viceversa
print (int(9.81))
print (round (9.81))
#BOOLEAN CASES
@@ -35,17 +37,4 @@
print (fullname,", aquí usamos la variable concatenada")
print (type (firstname))
print (country.upper()) #métodos de la clase print
-print (fullname.title())
-#LIST ==> It's a list of something, could be task, groceries
-empty_list1 = list() #dos formas de inicializar listas
-empty_list2 = [] #la nombro y luego declaro como list()
-# la nombre y asigno una lista vacia con corchetes []
-print (empty_list1, "esta es la lista 1")
-print (empty_list2, "esta es la lista 2")
-numbers = [1,2,3,4,5,6]
-groceries = ["tomato", "carrot", "letuce"]
-print (groceries [0]) #el puntero va con corchete y parte de 0
-print (numbers [3]) #es una COLECCION
-print (len(groceries)) #conocer el largo de la la lista con len
-mix_of_data_types_list = [1, "Jota", lastname, 2+5, 1-3j, 3.14]
-#podemos almacenar un mix de datos
+print (fullname.title())
\ No newline at end of file
diff --git a/Workbench/Taller/listas.py b/Workbench/Taller/listas.py
index 731dbf055..704f13cbe 100644
--- a/Workbench/Taller/listas.py
+++ b/Workbench/Taller/listas.py
@@ -1,49 +1,79 @@
-#Ejericio 1
+#*******************************************************************
+#* *
+#* TEORIA LISTAS *
+#* *
+#*******************************************************************
-listadeletras = [] # Crea un objeto list llamado lista
-for unaletra in "paralelepipedo": # Define una variable car para recorrer el string "casa"
- listadeletras.append(unaletra) # Agrega cada caracter del string en la lista
-print(listadeletras) # Imprime los valores de la lista que son los caracteres de la palabra casa o pera, lo que sea
- # Salida esperada ['c', 'a', 's', 'a']
+# Una LIST, es un objeto, es una colección de cosas, pueden ser tareas,
+# vegetales, nombres
+# mercaderías, cualquier cosa.
-"""
-#Ejercicio 2
-# Lista de 4 elementos y para cada elemento calcularle la potencia de 2, usando el método tradicional, eso seria así:
-#Alternativa 1
+# Dos formas paa declararlas e iniciaizarlas
+
+# 1) Defino una variable y le asigno un tipo lista VACÍO con paréntesis
+empty_list1 = list() # Note que se debe indicar el tipo lista o lo considerará una TUPLA
+print (empty_list1, "esta es la lista 1 con '()'")
+print (type(empty_list1))
+
+# 2) Defino una variable y sé que es del tipo lista por los corchetes '[]'
+empty_list2 = [] # A la variable se le asigna una lista vacía con CORCHETES
+print (empty_list2, "esta es la lista 2")
+print (type (empty_list2))
+
+# Ejemplo 1
+numbers = [1,2,3,4,5,6] # Lista de números
+print("'numbers' es del tipo ", type(numbers)) # De devolver el texto+ type 'list'
+
+# Ejemplo 2
+groceries = ["tomato", "carrot", "letuce"] # Una lista con 3 strings de 'vegentales'
+print (groceries [0]) # El puntero va con corchetes y parte de 0, imprime "tomato"
+print (numbers [3]) # Es una COLECCION, imprime todos los elementos
+print (len(groceries)) # Conocer el largo de la la lista con len, devuelve 3
+
+# Ejemplo 3
+lastname = "cordova" # Variable de tipo string, contiene "cordova"
+mix_of_data_types_list = [1, "Jota", lastname, 2+5, 1-3j, 3.14] # Lista con distintos tipos de var
+print ("'mix_of_data_types_list' es del tipo-", type(mix_of_data_types_list)) #devuelve 'list'
+#podemos almacenar un mix de datos
+
+# Ejemplo 4
+listadeletras = [] # Crea un objeto list llamado listadeletras
+for unaletra in "paralelepipedo": # Define una variable 'unaletra' y recorre el string "paralelepípedo"
+ listadeletras.append(unaletra)# Agrega cada caracter del string a 'listadeletras' usando el método 'append'
+print (listadeletras) # Imprime los valores de la lista que son los caracteres de la palabra 'paralelepípedo'', lo que sea
+ # Salida esperada ['p', 'a', 'r', 'a', 'l', 'e', 'l', 'e', 'p', 'i', 'p', 'e', 'd', 'o']
-lista_potencias = [] #Crea una lista llamada "lista_potencias"
-for i in range(4): #ciclo for para recorrer lista de 4 elementos, va de 0 a 3, el índice lo llamamos "i"
- lista_potencias.append(i**2) #a la lista "lista_potencias", la voy poblando con el dato calculado.
-print(lista_potencias) #Imprime los 4 valores almacendaos en la lista #Obs: como no cambié el nombre, concatenó los valores de la lista al final
-# [0, 1, 4, 9]
+# Ejemplo 5
+# Crear una lista de 4 elementos y, para cada elemento, calcularle la potencia de 2, usando
+# el método tradicional, eso seria así:
+# Alternativa 1
+lista_potencias = [] # Crea una lista llamada "lista_potencias"
+for i in range(4): # Ciclo for para recorrer lista de 4 elementos, va de 0 a 3, el índice lo llamamos "i"
+ lista_potencias.append(i**2)# La lista "lista_potencias", la voy poblando con el dato calculado.
+print(lista_potencias) # Imprime los 4 valores almacendaos en la lista [0, 1, 4, 9]
-#Alternativa 2
+# Ejemplo 6
# Entonces el ejemplo anterior usando listas de comprensión, eso seria así:
-lista_potencias2 = [i**2 for i in range(4)]
-print ("Esta es la lista de potencias Nr2", lista_potencias2)
-# [0, 1, 4, 9]
+lista_potencias2 = [i**2 for i in range(4)] # Usa un for
+print ("Esta es la lista de potencias Nr2", lista_potencias2) # Imprime [0, 1, 4, 9]
-#Ejercicio 3
-#Lista con las potencias de 2 de los primeros 10 números, método tradicional:
-"""
-"""
-Método 3-1
-lista1_pot10_2 = [] #Creamos un objeto lista vacio []
-for num in range (0, 11): #incluye el primero y no el últimmo. Usando un ciclo FOR usando la var "num" en el tramo de 0-10, ambos incluidos
- lista1_pot10_2.append (num**2) #Llenamos la lista con potencias PARTIENDO DE 0, a 10 (11-1)
-print(lista1_pot10_2)
+# Ejemplo 7
+# Lista con las potencias de 2 de los primeros 10 números, método tradicional:
+# Alternativa 1
+lista1_pot10_2 = [] # Creamos un objeto lista vacio []
+for num in range (0, 11): # Incluye el primero y no el últimmo. Usando un ciclo FOR usando la var "num" en el tramo de 0-10, ambos incluidos
+ lista1_pot10_2.append (num**2) # Llenamos la lista con potencias PARTIENDO DE 0, a 10 (11-1)
+print(lista1_pot10_2) # Salida por pantalla [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
-#[4, 9, 16]
-#[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
-#Método 3-2
+# Alternativa 2
#Entonces el ejemplo anterior usando listas de comprensión, eso seria así:
#lista2_pot10_2 = [num2**2 for num2 in range(0, 11)] #Creamos la lista con los valores según condición
#print("Este es el método 3-2, para crear la lista de 10 números y sus potencias",lista2_pot10_2)
#[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
#De este código anterior usted puede aprender que es posible modificar al vuelo los elementos los cuales van a formar la lista.
-# Ej
-# Con este ejemplo se ve como funciona el conteo de posiciones en una lista (cada elemento es una posX)
+# Ejemplo 8
+# Este ejemplo muestra como operan las posiciones en una lista (cada elemento es una posX)
lista = ["pos0", "pos1", "pos2", "pos3", "pos4", "pos5"]
print("Esta es la lista:\n", lista, "\n")
print("1° Mostrar 'lista[2:5]', significa la pos2, pero excluye la 5, ojo!\n", lista[2:5]) # tomamos del 2 al 5 (sin incluir el 5)
@@ -53,8 +83,8 @@
print("5° Mostrar 'lista[4:1:-1]', significa orden desc de la pos4 a la 2, excluye la pos1",lista[4:1:-1])
print("6° Mostrar 'lista[:]', significa mostrar todos los elementos de la lista\n",lista[:]) # tomamos desde el principio hasta el final (es como hacer una copia de la lista)
print("7° Mostrar 'lista[::-1]', significa mostrar todos los elementos de la lista en orden inverso\n",lista[::-1]) # tomamos desde el final hasta el principip (orden inverso)
-"""
-# EJ 5
+
+# Ejemplo 9
# Con este ejemplo usamos un truco para controlar la salida, un método de print llamado end
#
for i in range (15):
@@ -63,15 +93,81 @@
else:
print (i)
-"""
-# Ej 6
+# Ejemplo 10
# Mismo ejemplo sin controlar la salida, cada linea se ejecuta y se apilan.
-#for i in range (15):
-# print (i)
+for i in range (15):
+ print (i)
+
+# Ejemplo 11
+# Revisar otra formas de ordenar listas
+lista_desordenada = [5,7,2,8,3,6]
+lista_desordenada.sort()
+print ("Resultado esperado 2,3,5,6,7,8, lista generada :", lista_desordenada)
+print (type(lista_desordenada))
+
+# Ejemplo 12
+# Lista negada = los inversos y lista doble = multiplicadas por algo
+lista = [10, 20, 30]
+lista_negada = [ -e for e in lista ] # Los inversos de los elementos
+lista_doble = [ e*2 for e in lista] # Los elementos multiplicados por 2
+print(lista_negada)
+print(lista_doble)
+
+# Ejemplo 13
+# Una lista de valores float, no se pueden negar strings
+lista2 = [True, True, False, 5, 2-3j]
+lista_negada2 = [ -e for e in lista2] # Los inversos de los elementos numéricos
+lista_doble2 = [ e*2 for e in lista2] # Los elementos multiplicados por 2
+print(lista_negada2) # Nótese la salida [-1, -1, 0, -5, (-2+3j)], los booleanos los tomo como 1 y 0
+print(lista_doble2) # Nótese la salida [2, 2, 0, 10, (4-6j)], fijarse en los booleanos
+
+# Ejemplo 14
+# Con un ciclo for, alimenta dos listas dependiendo de una condición y muestra la información horizontal.
+lista_i = []
+lista_p = []
+for i in range (1,21):
+ n=(i%2)
+ if n==1:
+ lista_i.append (i)
+ elif n==0:
+ lista_p.append (i)
+print ("Los números impares entre 1 y 20 son ", lista_i)
+print ("Los números pares entre 1 y 20 son ", lista_p)
+
+# Ejemplo 15
+# Usos de 'enumerate' en listas, tuplas, diccionarios, cadenas
+for i, val in enumerate(['A', 'B', 'C']):
+ print(i, val)
"""
+0 A
+1 B
+2 C
"""
-# Revisar formas de ordenar listas
-lista_desordenada = (5,7,2,8,3,6)
-print (lista_desordenada)
-print (lista_desordenada.sort())
-"""
\ No newline at end of file
+
+# En este caso imprime la posición o puntero, y e contenido de la posición, vertical
+
+# Ejemplo 16
+
+for i, val in enumerate(['A', 'B', 'C'], start=5): # Mismo anterior, pero cambia el valor del puntero que parte en 5
+ print(i, val)
+"""
+5 A
+6 B
+7 C
+"""
+# La salida va de 5 a 7
+
+# Ejemplo 17
+# En este caso va de 5 a 14, se salta 3, y el puntero inicia en 1
+for i, val in enumerate(range(5, 15, 3), start=1):
+ print(f'Pos: {i} -> {val}')
+"""
+Pos: 1 -> 5
+Pos: 2 -> 8
+Pos: 3 -> 11
+Pos: 4 -> 14
+"""
+# La salida va con los textos 'Pos: ' y '->'
+print ("")
+
+# Ejemplo
\ No newline at end of file
diff --git a/Workbench/Taller/variables.py b/Workbench/Taller/variables.py
index cb71de421..bfd2c9c5b 100644
--- a/Workbench/Taller/variables.py
+++ b/Workbench/Taller/variables.py
@@ -1,5 +1,5 @@
#Variables
-#It's memory location to assign data to store and use ir later
+#It's a memory location to assign data to store and use it later
a=10
b=3
print (a)
@@ -8,4 +8,4 @@
print ("what's the value of b", b)
print (a+b)
total =2+4
-print (total)
\ No newline at end of file
+print (total)
From c1ca111b4efb2652840a75f3cd79264f12371132 Mon Sep 17 00:00:00 2001
From: Jorge Cordova <55065873+jcordovaj@users.noreply.github.com>
Date: Mon, 23 Jan 2023 04:26:48 -0300
Subject: [PATCH 04/16] 230123-0432 Atualizacion
---
...B\303\241sico_Interactivo_de_Python.ipynb" | 982 ------------------
Workbench/Taller/listas.py | 2 +-
2 files changed, 1 insertion(+), 983 deletions(-)
delete mode 100644 "Copia_de_Tutorial_B\303\241sico_Interactivo_de_Python.ipynb"
diff --git "a/Copia_de_Tutorial_B\303\241sico_Interactivo_de_Python.ipynb" "b/Copia_de_Tutorial_B\303\241sico_Interactivo_de_Python.ipynb"
deleted file mode 100644
index 8a4ee6328..000000000
--- "a/Copia_de_Tutorial_B\303\241sico_Interactivo_de_Python.ipynb"
+++ /dev/null
@@ -1,982 +0,0 @@
-{
- "nbformat": 4,
- "nbformat_minor": 0,
- "metadata": {
- "colab": {
- "provenance": [],
- "private_outputs": true,
- "include_colab_link": true
- },
- "kernelspec": {
- "name": "python3",
- "display_name": "Python 3"
- },
- "language_info": {
- "name": "python"
- },
- "gpuClass": "standard"
- },
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "view-in-github",
- "colab_type": "text"
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "source": [
- "# Tutorial Básico Interactivo de Python de Código Pitón\n",
- "\n",
- "![cp.png](data:image/png;base64,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)\n",
- "\n",
- "¡Hola! **Bienvenido al Tutorial Básico Interactivo de Python de [Código Pitón](https://www.codigopiton.com/)**.\n",
- "\n",
- "Este tutorial recoge una guía básica de los fundamentos de Python en forma de cuaderno de Jupyter alojado en Google Colab (Colaboratory).\n",
- "\n",
- "Está estrechamente ligado a la [Hoja de Referencia de Python de Código Pitón](https://www.codigopiton.com/la-hoja-de-referencia-de-python/) que recibiste cuando te suscribiste a la lista de correo de Código Pitón.\n",
- "\n",
- "Si no tienes la Hoja de Referencia (por ejemplo, porque alguien te compartió este tutorial) puedes [conseguirla de manera gratuita al susbscribirte a Código Pitón](https://www.codigopiton.com/la-hoja-de-referencia-de-python/) y te llegará inmediatamente por correo electrónico.\n",
- "\n",
- "La **idea principal de este tutorial** es que tengas una guía interactiva para complementar perfectamente a la Hoja de Referencia y a la que puedas recurrir durante tu aprendizaje si te surge alguna duda. Espero que te sea de mucha utilidad.\n",
- "\n",
- "El tutorial tiene 15 apartados, exactamente igual que la Hoja de Referencia, y en el mismo orden, para que no te pierdas en ningún momento. Además, les he puesto el mismo nombre para que no quede lugar a ningún tipo de duda.\n",
- "\n",
- "¡Vamos allá!\n",
- "\n",
- "## Antes de empezar\n",
- "\n",
- "Si no estás muy familiarizado con los cuadernos de Jupyter, ¡no te preocupes! Aquí es todo muy fácil. Todo se organiza en celdas. Podrás ver celdas de texto explicativo (como este) y celdas con fragmentos de código Python ejecutable, como el siguiente:\n"
- ],
- "metadata": {
- "id": "EZslL1PpIsde"
- }
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "id": "9NrJqYoyINXn"
- },
- "outputs": [],
- "source": [
- "print('¡Hola desde el Tutorial Básico Interactivo de Código Pitón! 😊') "
- ]
- },
- {
- "cell_type": "markdown",
- "source": [
- "Siéntete libre de ejecutar los fragmentos de código que quieras y de modificarlos a tu gusto para experimentar y aprender, ¡ese es el objetivo de este tutorial interactivo!\n",
- "\n",
- "Para ejecutar un fragmento de código basta con que hagas click en el icono de ejecutar a la izquierda de cada celda. También puedes ejecutarlos con la combinación de teclas Ctrl + Enter y verás el resultado justo debajo.\n",
- "\n",
- "Y ahora sí, vamos con el tutorial.\n",
- "\n",
- "\n",
- "\n",
- "\n",
- "\n",
- "Los contenidos son los siguientes:\n",
- "\n",
- "\n",
- "1. Asignación de variables\n",
- "2. Acceso a valor de variables\n",
- "3. Aritmética básica\n",
- "4. Importación de módulos\n",
- "5. Gestión de excepciones\n",
- "6. Salida y formato de texto\n",
- "7. Listas\n",
- "8. Condicionales\n",
- "9. Booleanos y comparaciones\n",
- "10. Comprensión de listas\n",
- "11. Comentarios\n",
- "12. Funciones\n",
- "13. Bucles\n",
- "14. Notación de porciones\n",
- "15. Entrada por teclado\n",
- "\n",
- "\n",
- "\n"
- ],
- "metadata": {
- "id": "IAHwNotEQtNy"
- }
- },
- {
- "cell_type": "markdown",
- "source": [
- "# 1. Asignación de variables\n",
- "\n",
- "Los principales tipos de datos son números enteros (int), números decimales (float), cadenas de texto (str) y valores booleanos (verdadero o falso, te cuento más sobre esto más adelante).\n",
- "\n",
- "Para realizar asignaciones utiliza nombres de variables identificativos, el símbolo = y el valor que quieras asociar a la variable."
- ],
- "metadata": {
- "id": "qhinAwWbPwsG"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "x = 10 # enteros\n",
- "y = 0.5 # decimales\n",
- "z = 'hola' # texto\n",
- "b = True # booleanos\n",
- "print(x)\n",
- "print(y)\n",
- "print(z)\n",
- "print(b)"
- ],
- "metadata": {
- "id": "bl-PHta-TM7D"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "Las principales colecciones de datos son las listas (modificables), las tuplas (no modificables), los conjuntos (que no admiten repetidos) y los diccionarios (que guardan pares clave-valor)."
- ],
- "metadata": {
- "id": "ltpQ4vgOTgx6"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "tupla = (1, 2, 3)\n",
- "lista = [4, 5.5, 'a6']\n",
- "conjunto = ('a', 'b', 'c')\n",
- "\n",
- "print(tupla)\n",
- "print(lista)\n",
- "print(conjunto)\n",
- "\n",
- "diccionario = {10: 1.1, 20: 1.0, 30: 1.3}\n",
- "diccionario[40] = 1.5 # asignando un valor (1.5) a una nueva clave (40)\n",
- "print(diccionario)\n",
- "\n",
- "x, y, z = 1, 2, 3 # asignación múltiple\n",
- "print('Tras la asignación múltiple: ')\n",
- "print(x)\n",
- "print(y)\n",
- "print(z)\n",
- "\n",
- "print('Tras intercambiar valores: ')\n",
- "x, y = y, x # intercambio de valores\n",
- "print(x)\n",
- "print(y)\n",
- "\n",
- "print('Tras desempaquetar una tupla en variables: ')\n",
- "x, y, z = (10, 20, 30)\n",
- "print(x)\n",
- "print(y)\n",
- "print(z)\n"
- ],
- "metadata": {
- "id": "mBTQ6WUbTmSX"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "# 2. Acceso a valor de variables\n",
- "\n",
- "Cuando ya hemos hecho asignaciones y tenemos variables con valores, podemos acceder a esos valores utilizando el nombre de las variables en otras expresiones.\n",
- "\n",
- "Además, podemos acceder a los elementos de una lista o una tupla a través de su índice (número de posición, comenzando en 0) indicándolo entre corchetes \\[ y \\].\n",
- "\n",
- "Para acceder a los valores de un diccionario utilizaremos la clave asociada a cada valor, de nuevo entre corchetes.\n",
- "\n",
- "También podemos acceder a los atributos de una clase utilizando el nombre de la clase, un punto y a continuación el nombre del atributo. De igual manera, podemos acceder a los atributos de un objeto o instancia utilizando el nombre del objeto, un punto y a continuación el nombre del atributo.\n"
- ],
- "metadata": {
- "id": "xUu-z6MPQTn8"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "lista = [10, 20, 30, 40, 50]\n",
- "valor = lista[2]\n",
- "print(valor)\n",
- "\n",
- "diccionario = {10: 5, 20: 7, 30: 9}\n",
- "valor = diccionario[20]\n",
- "print(valor)\n",
- "valor = diccionario.get(40, '0') # valor por defecto 0 si clave (40) no existe\n",
- "\n",
- "class Clase:\n",
- "\n",
- " atributo_de_clase = 10\n",
- "\n",
- " def __init__(self):\n",
- " self.atributo_de_instancia = 20\n",
- "\n",
- "\n",
- "print(Clase.atributo_de_clase)\n",
- "\n",
- "instancia = Clase()\n",
- "print(instancia.atributo_de_instancia)"
- ],
- "metadata": {
- "id": "Dv3EgoExVqhr"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "Más información sobre variables: https://www.codigopiton.com/variables-locales-y-globales-en-python/"
- ],
- "metadata": {
- "id": "hllJO5IAMPS1"
- }
- },
- {
- "cell_type": "markdown",
- "source": [
- "# 3. Aritmética básica\n",
- "\n",
- "Podemos realizar operaciones matemáticas aritméticas básicas utilizando los símbolos +, -, * (multiplicación), / (división), // (división entera), % (resto de la división entera o módulo) y \\*\\* (potencia).\n"
- ],
- "metadata": {
- "id": "GXjjRcl4QzB8"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "print(3 + 5)\n",
- "print(5 - 3)\n",
- "print(5 * 3)\n",
- "print(5 / 3)\n",
- "print(5 // 3)\n",
- "print(5 % 3)\n",
- "print(5 ** 3)"
- ],
- "metadata": {
- "id": "SSDZqkv8XRer"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "# 4. Importación de módulos\n",
- "\n",
- "Si necesitas utilizar una librería (tanto de Python como externa) tendrás que importar el módulo correspondiente con import. \n",
- "\n",
- "Podrás darle un alias al módulo si utilizas as.\n",
- "\n",
- "También puedes importar un componente concreto de un módulo a través de from."
- ],
- "metadata": {
- "id": "WItnb6q8Q-fp"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "import datetime\n",
- "\n",
- "print(datetime.datetime.now())"
- ],
- "metadata": {
- "id": "aVd-5GYuYY8f"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "code",
- "source": [
- "import datetime as dt\n",
- "\n",
- "print(dt.datetime.now())"
- ],
- "metadata": {
- "id": "pmez2i-FYx0G"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "code",
- "source": [
- "from datetime import datetime as dt\n",
- "\n",
- "print(dt.now())"
- ],
- "metadata": {
- "id": "u52AMnEFY3Cf"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "# 5. Gestión de excepciones\n",
- "\n",
- "Para manejar errores y excepciones tienes que usar la construcción try - except - finally. De no hacerlo, el código interrumpe su ejecución en caso de surgir algún error.\n",
- "\n",
- "Algunos de los errores más comunes son los siguientes:\n",
- "* SyntaxError: sintaxis incorrecta\n",
- "* ValueError: valor argumento no válido\n",
- "* ZeroDivisionError: división por cero\n",
- "* NameError: variable no definida\n",
- "* ModuleNotFoundError: modulo no existe\n",
- "* FileNotFoundError: fichero no existe\n",
- "* IndexError: índice no existe\n",
- "* KeyError: clave no existe\n",
- "\n",
- "\n",
- "\n"
- ],
- "metadata": {
- "id": "j_bTR38XRB1Y"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "# El siguiente código genera un error\n",
- "\n",
- "a = 10\n",
- "b = 0\n",
- "\n",
- "print(a/b) # no se puede dividir por cero"
- ],
- "metadata": {
- "id": "-XPkB0XRbR88"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "code",
- "source": [
- "# Vamos a controlar el error para que no se interrumpa la ejecución\n",
- "\n",
- "a = 10\n",
- "b = 0\n",
- "\n",
- "try:\n",
- " print(a/b)\n",
- "except ZeroDivisionError:\n",
- " print('Lo siento, no puedo dividir por cero.')\n",
- "finally:\n",
- " print('Bloque try-except finalizado') # esto, que es opcional, se ejecuta siempre, haya error o no\n",
- " "
- ],
- "metadata": {
- "id": "fp6wj4dybZI4"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "# 6. Salida y formato de texto\n",
- "\n",
- "Ya has visto que la función *print* se utiliza para mostrar información por pantalla.\n",
- "\n",
- "Podemos personalizar la manera en que se muestra esa información de múltiples maneras. Algunas formas sencillas y básicas son la siguientes:"
- ],
- "metadata": {
- "id": "e-4K3kjIRIee"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "a = 10\n",
- "b = 20\n",
- "c = 30.158\n",
- "print(a)\n",
- "print('b=' + str(b)) # convertimos un numero a string con str\n",
- "\n",
- "print('a=%i' % a) # usamos una máscara de número entero (%i) dentro de la cadena de texto\n",
- "print('a=%i, b=%i' % (a, b))\n",
- "\n",
- "print('a={}, b={}'.format(a, b))\n",
- "print('c={:.2f}'.format(c)) # puedes indicar se se usen solo dos decimales para un float\n",
- "\n",
- "print(f'a={a}, b={b}') # usamos f-strings, la forma preferida\n"
- ],
- "metadata": {
- "id": "soEeTeTKcHDu"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "# 7. Listas\n",
- "\n",
- "Podemos hacer muchas cosas con las listas, pues son secuencias muy potentes. Veamos algunas:"
- ],
- "metadata": {
- "id": "OowBr9SiOINH"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "lista = [5, 6, 7]\n",
- "\n",
- "lista.append(8) # añadimos un elemento al final\n",
- "print(lista)\n",
- "\n",
- "lista.insert(1, 10) # insertamos un elemento en la posición que queramos\n",
- "print(lista)\n",
- "\n",
- "lista.remove(6) # eliminamos un elemento\n",
- "del lista[0] # eliminamos una posición\n",
- "print(lista)\n",
- "\n",
- "lista.clear() # vacíamos la lista\n",
- "print(lista)\n",
- "\n",
- "lista = [5, 6, 7]\n",
- "elementos = [8, 9]\n",
- "\n",
- "lista.extend(elementos) # añadimos al final los elementos de otra lista\n",
- "print(lista)\n",
- "\n",
- "lista.reverse() # invertimos la lista (le damos la vuelta)\n",
- "print(lista)\n",
- "\n",
- "print(len(lista)) # obtenemos el número de elementos (o longitud) de una lista\n",
- "\n",
- "print(lista.index(7)) # obtenemos el índice de un elemento\n",
- "\n"
- ],
- "metadata": {
- "id": "ahagt7kyeE5J"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "Aquí tienes más información sobre cómo obtener la posición o índice de un elemento en una lista: https://www.codigopiton.com/encontrar-indice-de-elemento-en-lista-en-python/"
- ],
- "metadata": {
- "id": "nyQRye6VfOcC"
- }
- },
- {
- "cell_type": "markdown",
- "source": [
- "# 8. Condicionales\n",
- "\n",
- "Las condicionales nos permiten ejecutar un determinado fragmento de código si se cumple una determinada condición (rama if).\n",
- "\n",
- "Además, podemos indicar que, si no se cumple dicha condición, se ejecute otro código (rama else).\n",
- "\n",
- "Finalmente, se permite encadenar varias ramas ifs con distintas condiciones (elif) y una rama else si no se cumple ninguna de las condiciones indicadas. Las ramas aquí son excluyentes."
- ],
- "metadata": {
- "id": "ju3H-DAjOId7"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "a = 10\n",
- "b = 20\n",
- "\n",
- "if a < 15:\n",
- " print('a es menor que 15') # esto se ejecutará ya que se cumple la condición\n",
- "\n",
- "\n",
- "if a > 15:\n",
- " print('a es mayor que 15') # esto no se ejecutará ya que no se cumple la condición\n",
- "\n",
- "if a > 30:\n",
- " print('a es mayor que 30') # esto no se ejecutará ya que no se cumple la condición\n",
- "else:\n",
- " print('a no es mayor que 30') # esto sí se ejecutará ya que no se cumple la condición\n",
- "\n",
- "\n",
- "if b > 10:\n",
- " print('b es mayor que 10') # esto se ejecutará ya que se cumple la condición\n",
- "else:\n",
- " print('b no es mayor que 10') # esto no se ejecutará ya que se cumple la condición\n",
- "\n",
- "\n",
- "# a continuación se comprobaran las condiciones secuencialmente y se ejecutara \n",
- "# solo el fragmento de código de la condición que se cumpla (condiciones excluyentes)\n",
- "\n",
- "if a < 10:\n",
- " print('a es menor que 10')\n",
- "elif a > 12:\n",
- " print('a es mayor que 12')\n",
- "elif b > 15:\n",
- " print('b es mayor que 15') # esta es la rama que se ejecuta\n",
- "elif b == 20:\n",
- " print('b es igual a 20') # aunque la condición de esta rama es cierta no se ejcuta\n",
- " # pues ya se ejecutó otra rama antes\n",
- "else:\n",
- " print('no se ha cumplido ninguna de las condiciones anteriores')"
- ],
- "metadata": {
- "id": "JV2mITN3a2TG"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "Más información sobre condicionales: https://www.codigopiton.com/condicionales-en-python-mucho-mas-que-if-else/\n",
- "\n",
- "La estrucutura de control switch no existe en Python. Más información sobre cómo hacer switch en Python: https://www.codigopiton.com/como-hacer-switch-case-en-python/\n",
- "\n",
- "En Python existe, además, un operador ternario condicional: https://www.codigopiton.com/el-operador-ternario-condicional-en-python/\n",
- "\n",
- "Aunque desde la versión 3.10 de Python existe un mecanismo de \"pattern matching\" que se puede utilizar para emular un switch. Más información: https://peps.python.org/pep-0636/"
- ],
- "metadata": {
- "id": "EPh-Axa2cc1L"
- }
- },
- {
- "cell_type": "markdown",
- "source": [
- "# 9. Booleanos y comparaciones\n",
- "\n",
- "Ahora que ya sabes cómo hacer condicionales, vamos a revisar los valores booleanos y las principales posibles comparaciones y comprobaciones que se pueden hacer en Python que devuelven valores booleanos.\n",
- "\n",
- "Los valores booleanos, son True y False (escritos con inicial mayúscula) y cuyo significado es \"cierto\" y \"falso\" respectivamente.\n",
- "\n",
- "Comparaciones y comprobaciones principales:\n",
- "* Mayor: >\n",
- "* Mayor o igual: >=\n",
- "* Menor: <\n",
- "* Menor o igual: <=\n",
- "* Igual: ==\n",
- "* Diferente: !=\n",
- "* Pertenencia: in\n",
- "\n",
- "Puedes negar un valor booleano o condición para obtener el valor contrario con la palabra reservada \"not\"."
- ],
- "metadata": {
- "id": "rQKB2F9AOIr2"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "a = 2\n",
- "b = 3\n",
- "\n",
- "print('Comparaciones simples:')\n",
- "print(a > b)\n",
- "print(a >= b)\n",
- "print(a < b)\n",
- "print(a <= b)\n",
- "print(a == b)\n",
- "print(a != b)\n",
- "\n",
- "print('Comprobación de pertenencia:')\n",
- "lista = [1, 3, 5]\n",
- "print(a in lista)\n",
- "print(b in lista)\n",
- "\n",
- "print('Negación con not')\n",
- "print(not True)\n",
- "print(not False)\n",
- "print(not a > b)\n",
- "print(not a == b)\n"
- ],
- "metadata": {
- "id": "aBjkpZRyd8V9"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "Más información sobre booleanos, comparaciones, condicionales, etc.: https://www.codigopiton.com/condicionales-en-python-mucho-mas-que-if-else/"
- ],
- "metadata": {
- "id": "ZZKF7GPaeoZO"
- }
- },
- {
- "cell_type": "markdown",
- "source": [
- "Puedes combinar distintas comparaciones para crear una más compleja con las palabras reservadas \"and\" y \"or\".\n",
- "\n",
- "Cuando usas and entre dos comparaciones o condiciones, ambas deben ser True para que la condición combinada sea True.\n",
- "\n",
- "Cuando usas or entre dos comparaciones o condiciones, al menos una de ellas tiene que ser True para que la condición combinada sea True."
- ],
- "metadata": {
- "id": "2tzz0ZRjwqHo"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "a = 2\n",
- "b = 3\n",
- "print(b >= 3 and a == 2)\n",
- "print(a < 10 and b < 2)\n",
- "print(a == 2 or b == 0)\n",
- "print(a < 0 or b < 0)"
- ],
- "metadata": {
- "id": "Mu96IFV6xECQ"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "# 10. Comprensión de listas\n",
- "\n",
- "En Python podemos generar listas \"al vuelo\" utilizando un bucle for que devuelva un elemento e en cada iteración, aplicando un cálculo o expresión sobre e y encerrándolo todo entre [corchetes](https://www.codigopiton.com/parentesis-corchetes-llaves-en-python/). \n",
- "\n",
- "De esta manera se genera una lista con todos los elementos generados a partir de e.\n",
- "\n",
- "Ejemplos:"
- ],
- "metadata": {
- "id": "MVkNPcwDOI6A"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "lista = [10, 20, 30]\n",
- "\n",
- "lista_negada = [ -e for e in lista ]\n",
- "lista_doble = [ e*2 for e in lista]\n",
- "\n",
- "print(lista_negada)\n",
- "print(lista_doble)"
- ],
- "metadata": {
- "id": "gEhGP1_bfcp2"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "# 11. Comentarios\n",
- "\n",
- "En el código que escribas puedes (y debes) incluir comentarios explicativos.\n",
- "\n",
- "Los comentarios no son interpretados por el interprete de Python y no afectan al código ni a su ejecución.\n",
- "\n",
- "Puedes usar el símbolo \\# para añadir un comentario al principio o al final de una línea (como ya has visto en este tutorial).\n",
- "\n",
- "Además, si necesitas hacer un comentario de varias líneas basta con que lo encierres en triples comillas ' ' ' o \" \" \".\n",
- "\n",
- "Ejemplos:\n"
- ],
- "metadata": {
- "id": "NZjQEM3MOJGX"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "# inicialización de variables (este es un comentario de una línea)\n",
- "a = 10\n",
- "b = 20\n",
- "\n",
- "''' En este comentario de varias líneas\n",
- "voy a explicar lo que hago a continuación:\n",
- "sumaré los valores de a y b y si suman más de 25\n",
- "mostraré un mensaje de éxito por pantalla '''\n",
- "\n",
- "if a + b > 25:\n",
- " print('¡Éxito!') # este será mi mensaje de éxito"
- ],
- "metadata": {
- "id": "HtJvtFjbgbMA"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "# 12. Funciones\n",
- "\n",
- "Tanto para estructurar nuestro código así como para favorecer la reutilización del mismo se utilizan funciones.\n",
- "\n",
- "Las funciones nos permiten encapsular un fragmento de código y darle un nombre.\n",
- "\n",
- "Para definir una función usamos la palabra reservada \"def\" a continuación el nombre de la función y los parámetros que necesitemos entre paréntesis. La función puede devolver uno o varios valores si lo necesita (o ninguno).\n",
- "\n",
- "Después se puede invocar una función creada a través de su nombre."
- ],
- "metadata": {
- "id": "QWnzNyKROJSs"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "def suma(a, b):\n",
- " return a + b\n",
- "\n",
- "\n",
- "# min y max son funciones integradas en Python que nos devuelven\n",
- "# los valores mínimo y máximo de un iterable (como las listas o las tuplas)\n",
- "def min_y_max(lista):\n",
- " return min(lista), max(lista)\n",
- "\n",
- "\n",
- "# ahora vamos a usar estas funciones\n",
- "valor = suma(10, 15)\n",
- "print(valor)\n",
- "\n",
- "minimo, maximo = min_y_max([30, 10, 50, 40, 20])\n",
- "print(f'min y max son {minimo} y {maximo}')\n"
- ],
- "metadata": {
- "id": "DD5-_oeLsiNX"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "# 13. Bucles\n",
- "\n",
- "Los bucles son un mecanismo de control de flujo que nos permite repetir un fragmento de código un número determinado de veces.\n",
- "\n",
- "Hay dos tipos:\n",
- "\n",
- "\n",
- "1. while, que nos permite controlar mediante una condición el número de repeticiones.\n",
- "2. for, que nos permite iterar por los elementos de una colección de manera sencilla y cómoda.\n",
- "\n",
- "El código que queremos repetir, también llamado \"cuerpo del bucle\" debe indentarse tras el for o el while.\n",
- "\n"
- ],
- "metadata": {
- "id": "yJaf1DpiOJeh"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "# ejemplo de while\n",
- "a = 0\n",
- "\n",
- "while (a < 10): # mientras a sea < 10 el cuerpo del bucle se repetirá\n",
- " print(a)\n",
- " a = a + 1 # sumamos 1 a la variable a para asegurarnos de que la condición del bucle será False en algún momento\n",
- "\n",
- "# ejemplo de for\n",
- "lista = [10, 20, 30, 40]\n",
- "\n",
- "for elemento in lista:\n",
- " print(elemento)\n",
- "\n"
- ],
- "metadata": {
- "id": "lIfvC-pN_QhY"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "Dentro de los bucles puedes utilizar las sentencias de control break y continue:\n",
- "* break termina anticipadamente el bucle\n",
- "* continue interrumpe la vuelta actual del bucle y continúa con la siguiente."
- ],
- "metadata": {
- "id": "6_U1A3i9AEdq"
- }
- },
- {
- "cell_type": "markdown",
- "source": [
- "# 14. Notación de porciones\n",
- "\n",
- "Cuando tenemos una colección de elementos indexados por posición (como una lista o una tupla), podemos acceder a una porción concreta utilizando la notación de porciones.\n",
- "\n",
- "Se utilizan los corchetes entre los que indicamos tres números separados por el carácter ':'. De esta manera\n",
- "\n",
- "lista\\[ini:fin:paso\\]\n",
- "\n",
- "Donde:\n",
- "* ini es la posición del elemento primero en nuestra porción.\n",
- "* fin es la posición del elemeto último (no incluido) de nuestra porción (el último incluido será el correspondiente a la posición fin -1).\n",
- "* paso (optativo) indica la manera en la que tomaremos la porción: si es un número positivo tomaremos los elementos en el orden en el que aparecen, si es negativo los tomaremos en orden inverso (fin tiene que ser anterior a ini). Si la magnitud es 1, tomaremos todos los elementos, si es 2, tomaremos uno y saltaremos otro, si es 3, tomaremos uno y saltaremos 2, etc.\n",
- "\n",
- "Si dejamos ini o fin sin indicar se interpreta que la porción se toma desde el comienzo o el final respectivamente.\n",
- "\n",
- "Veamos algunos ejemplos:\n"
- ],
- "metadata": {
- "id": "WQw19GRlOJrp"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "lista = [10, 20, 30, 40, 50, 60]\n",
- "\n",
- "print(lista[2:5]) # tomamos del 2 al 5 (sin incluir el 5)\n",
- "print(lista[4:]) # tomamos del 4 hasta el final\n",
- "print(lista[:2]) # tomamos desde el principio hasta el 2 (sin incluir)\n",
- "print(lista[1:6:2]) # tomamos 1 de cada 2 elementos desde el 1 hasta el 6 (sin incluir)\n",
- "print(lista[4:1:-1]) # tomamos en orden inverso desde el 4 al 1 (sin incluir)\n",
- "print(lista[:]) # tomamos desde el principio hasta el final (es como hacer una copia de la lista)\n",
- "print(lista[::-1]) # tomamos desde el final hasta el principip (orden inverso) "
- ],
- "metadata": {
- "id": "rxqQW9h2Hvja"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "# 15. Entrada por teclado\n",
- "\n",
- "Si necesitamos hacer un programa o script interactivo, a menudo necesitaremos pedir algún valor al usuario por teclado.\n",
- "\n",
- "Python nos proporciona la función integrada \"input\" que nos sirve precisamente para eso. Al ejecutarse \"input\" el programa se queda esperando a que el usuario introduzca un valor y pulse intro. Posteriormente ese valor se guarda en la variable que queramos en formato string.\n",
- "\n",
- "Podemos hacer la conversión a un tipo numérico si así lo deseamos llamando a las funciones int o float."
- ],
- "metadata": {
- "id": "BBXUukIZOJ3n"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "entrada = input('Dame tu nombre, por favor: ')\n",
- "print(f'¡Hola, {entrada}!')\n",
- "entrada = input('Dame un número entero, por favor: ')\n",
- "numero = int(entrada) # convertimos entrada a int\n",
- "print(f'El número es {numero}')"
- ],
- "metadata": {
- "id": "RnvW1ddeJU-1"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "# Ejercicio final: juego de adivinar un número entre 1 y 10\n",
- "\n",
- "Para finalizar este tutorial, voy a realizar un pequeño juego en el que el usuario tiene que adivinar un número generado al azar entre 1 y 10 y en el que solo tendrá 3 intentos para hacerlo.\n",
- "\n",
- "Para esto voy a utilizar muchas de las cosas contadas arriba. Además, comentaré el código para que todo quede perfectamente claro. Léelo con calma intentando comprender cada línea.\n",
- "\n",
- "Y, por supuesto, ¡puedes ejecutarlo para jugar tú!\n"
- ],
- "metadata": {
- "id": "XCN38-bphFTC"
- }
- },
- {
- "cell_type": "code",
- "source": [
- "import random # necesitamos esta librería para poder generar un número al azar\n",
- "\n",
- "numero_secreto = random.randint(1, 10) # esto nos genera un número aleatorio entre 1 y 10\n",
- "oportunidades = 3 # el número de oportunidades que nos quedan\n",
- "acertado = False # esta variable nos servirá para saber si el usuario ha acertado\n",
- "\n",
- "print('* Bienvenido a nuestro pequeño juego del Tutorial Básico Interactivo de Código Pitón')\n",
- "print() # imprimimos por pantalla una línea en blanco\n",
- "print('Acabo de pensar un número secreto entre 1 y 10. Tienes tres oportunidades para')\n",
- "print('adivinarlo. Te iré guiando un poco hacia la solución. ¡Suerte!')\n",
- "print()\n",
- "\n",
- "# Hacemos un bucle mientras queden oportunidades y mientras no se haya acertado el número secreto\n",
- "while oportunidades > 0 and not acertado:\n",
- " \n",
- " # Pedimos un número al usuario (y transformamos lo que escriba a entero mediante la función int)\n",
- " # ¡Cuidado! Si lo que escribe el usuario no es un entero el programa generará un error\n",
- " # El error puede ser controlado con try-except como vimos más arriba\n",
- " numero = int(input('Dime un número entre 1 y 10: '))\n",
- "\n",
- " # Ahora vamos a hacer la comprobación\n",
- " # e indicamos al usuario si el número secreto es mayor, menor o si lo ha averiguado\n",
- " if numero < numero_secreto:\n",
- " print('Te has quedado corto, el número secreto es más grande.')\n",
- " elif numero > numero_secreto:\n",
- " print('Te has pasado, el número secreto es más pequeño.')\n",
- " else:\n",
- " print(f'¡Enhorabuena! Has acertado en el intento {4-oportunidades}.')\n",
- " acertado = True # ponemos acertado a cierto para que se detenga el bucle\n",
- "\n",
- " if not acertado: # si no ha acertado indicamos las oprtunidades que le quedan\n",
- " oportunidades = oportunidades - 1 # restamos 1 a las oportunidades\n",
- " print(f'Te quedan {oportunidades} oportunidades.')\n",
- "\n",
- " print()\n",
- "\n",
- "# cuando termine el bucle de juego mostramos el número de adinivinar\n",
- "# y nos despedimos del usuario\n",
- "\n",
- "if not acertado: # si no se acierta el número se muestra por pantalla\n",
- " print(f'* El número secreto era {numero_secreto}.')\n",
- "\n",
- "print('* ¡Gracias por jugar! ¡Hasta pronto!') \n",
- "\n"
- ],
- "metadata": {
- "id": "8hziKM46ho_K"
- },
- "execution_count": null,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "source": [
- "**¡Muchas gracias por haber usado este tutorial!**\n",
- "\n",
- "Recurre a él todas las veces que te haga falta hasta que te queden claros sus conceptos.\n",
- "\n",
- "Y no dejes de visitar [Código Pitón](https://www.codigopiton.com/).\n",
- "\n",
- "Un saludo,\n",
- " \n",
- "Juan.-\n",
- "\n",
- "P.S. ¿Te atreves a modificar el juego que hemos visto para que al terminar el juego el programa le pregunte al usuario si quiere volver a jugar? Si el usuario dice que sí, se vuelve a \"pensar\" un número secreto y se juega de nuevo. Si el usuario dice que no, se termina el programa."
- ],
- "metadata": {
- "id": "0MrEzDjjnuD8"
- }
- }
- ]
-}
\ No newline at end of file
diff --git a/Workbench/Taller/listas.py b/Workbench/Taller/listas.py
index 704f13cbe..fc5b6cc56 100644
--- a/Workbench/Taller/listas.py
+++ b/Workbench/Taller/listas.py
@@ -144,7 +144,7 @@
2 C
"""
-# En este caso imprime la posición o puntero, y e contenido de la posición, vertical
+# En este caso imprime la posición o puntero, y el contenido de la posición, vertical
# Ejemplo 16
From eb3f44e7d3c39f1e96f185c2a7c1ee4dc48a0c82 Mon Sep 17 00:00:00 2001
From: Jorge Cordova <55065873+jcordovaj@users.noreply.github.com>
Date: Mon, 23 Jan 2023 04:38:09 -0300
Subject: [PATCH 05/16] =?UTF-8?q?230123=5F0437=20Actualizaci=C3=B3n=20Root?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
From 7f0397d2f4b817d811aede3f42de0a412322a3d0 Mon Sep 17 00:00:00 2001
From: Jorge Cordova <55065873+jcordovaj@users.noreply.github.com>
Date: Mon, 23 Jan 2023 04:50:38 -0300
Subject: [PATCH 06/16] Actualizar
From 572d2aabfe8739774def48a43088b973e25f76d0 Mon Sep 17 00:00:00 2001
From: Jorge Cordova <55065873+jcordovaj@users.noreply.github.com>
Date: Mon, 23 Jan 2023 08:44:25 -0300
Subject: [PATCH 07/16] 230123-0843 Mover Apuntes01.ipynb y cambio extension py
---
Workbench/Taller/Apuntes01.ipynb | 80 --------------------
Workbench/Taller/{Funciones => Funciones.py} | 0
2 files changed, 80 deletions(-)
delete mode 100644 Workbench/Taller/Apuntes01.ipynb
rename Workbench/Taller/{Funciones => Funciones.py} (100%)
diff --git a/Workbench/Taller/Apuntes01.ipynb b/Workbench/Taller/Apuntes01.ipynb
deleted file mode 100644
index 7b28b9a52..000000000
--- a/Workbench/Taller/Apuntes01.ipynb
+++ /dev/null
@@ -1,80 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Hello World\n"
- ]
- }
- ],
- "source": [
- "print (\"Hello World\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "página1\n",
- "página2\n",
- "página3\n",
- "página4\n"
- ]
- }
- ],
- "source": [
- "libro = ['página1', 'página2', 'página3', 'página4']\n",
- "marcapaginas = iter(libro)\n",
- "print(next(marcapaginas))\n",
- "print(next(marcapaginas))\n",
- "print(next(marcapaginas))\n",
- "print(next(marcapaginas))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.10.6 (tags/v3.10.6:9c7b4bd, Aug 1 2022, 21:53:49) [MSC v.1932 64 bit (AMD64)]"
- },
- "orig_nbformat": 4,
- "vscode": {
- "interpreter": {
- "hash": "d3777ed8f5fe800f0d3d1926318eb186c93d9a88e13881725c87e5bdd2f1dd1d"
- }
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/Workbench/Taller/Funciones b/Workbench/Taller/Funciones.py
similarity index 100%
rename from Workbench/Taller/Funciones
rename to Workbench/Taller/Funciones.py
From edef9841cba5a460194bdeaec337c040d143457b Mon Sep 17 00:00:00 2001
From: Jorge Cordova <55065873+jcordovaj@users.noreply.github.com>
Date: Mon, 23 Jan 2023 09:00:41 -0300
Subject: [PATCH 08/16] 230123-0900 Creacion Archivo txt, simula prueba
---
Estaesunaprueba.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 Estaesunaprueba.txt
diff --git a/Estaesunaprueba.txt b/Estaesunaprueba.txt
new file mode 100644
index 000000000..fd5fe2a25
--- /dev/null
+++ b/Estaesunaprueba.txt
@@ -0,0 +1 @@
+Subir prueba
\ No newline at end of file
From 08633da0897604297cefba45bba26a987a08ecdc Mon Sep 17 00:00:00 2001
From: Jorge Cordova <55065873+jcordovaj@users.noreply.github.com>
Date: Wed, 25 Jan 2023 05:51:06 -0300
Subject: [PATCH 09/16] 2501230549 Sync
---
Workbench/Substrings.py | 29 +++++++++++++++++++++++++++
Workbench/Taller/Clases.py | 34 ++++++++++++++++++++++++++++++++
Workbench/Taller/Funciones.py | 7 ++++++-
Workbench/Taller/Prueba240123.py | 0
4 files changed, 69 insertions(+), 1 deletion(-)
create mode 100644 Workbench/Substrings.py
create mode 100644 Workbench/Taller/Clases.py
create mode 100644 Workbench/Taller/Prueba240123.py
diff --git a/Workbench/Substrings.py b/Workbench/Substrings.py
new file mode 100644
index 000000000..40ea5c555
--- /dev/null
+++ b/Workbench/Substrings.py
@@ -0,0 +1,29 @@
+# Buscar una subcadena con index
+import re
+obj_iter="palabra"
+varany = int
+pos_ini = int
+pos_fin = int
+obj_iter.sub[varany, pos_ini, pos_fin])
+#es similar a find() pero en caso de que no se encuentre la subcadena sub lanza la excepción ValueError.
+cadena = 'me gusta la mermelada'
+cadena.index('lo')
+#La cadena 'lo' no existe, por lo que provocará un error
+# Traceback (most recent call last):
+# File "", line 1, in
+# ValueError: substring not found
+
+cadena.index('la')
+9
+# Encontrar la última posición de una subcadena con RFIND
+cadena = 'me gusta la mermelada'
+cadena.rfind('la')
+print (cadena.rfind('la'))
+# 17
+print (cadena.rfind('lo'))
+# -1
+# Encontrar la última posición de una subcadena con RINDEX
+print (cadena.rindex('la'))
+# 17
+# print (cadena.rindex('lo'))
+# Debe arrojar un error porque no existe la cadena (ValueError: substring not found)
diff --git a/Workbench/Taller/Clases.py b/Workbench/Taller/Clases.py
new file mode 100644
index 000000000..f37c01c35
--- /dev/null
+++ b/Workbench/Taller/Clases.py
@@ -0,0 +1,34 @@
+class Car1:
+ def __init__(self, color, aceleracion):
+ self.color = color
+ self.aceleracion = aceleracion
+ self.velocidad = 0
+ self.ruedas = 4
+ self.direccion = 90
+ def Acelera(self):
+ self.acelera = self.aceleracion + self.velocidad
+ def frena(self):
+ v.frena = self.aceleracion - self.velocidad
+ if v < 0:
+ v = 0
+ self.velocidad = 0
+
+
+class Perro ():
+ # El método __init__ es llamado al crear el objeto
+ def __init__(self, nombre, raza):
+ print(f"Creando perro {nombre}, {raza}")
+ # Atributos de instancia
+ self.nombre = nombre
+ self.raza = raza
+
+c1 = Car1('rojo', 20)
+print (c1.color)
+# rojo
+print (c1.ruedas)
+# 4
+c2 = Car1('azul', 30)
+print(c2.color)
+# azul
+print(c2.ruedas)
+# 4
\ No newline at end of file
diff --git a/Workbench/Taller/Funciones.py b/Workbench/Taller/Funciones.py
index cdcc063de..82282c2f9 100644
--- a/Workbench/Taller/Funciones.py
+++ b/Workbench/Taller/Funciones.py
@@ -11,7 +11,12 @@
# Ejemplo 1
def misuma (a,b): # Esta es una función, toma dos enteros a,b y los suma
- return a+b # El calculo viene después de la palabra return
+ """
+ Los valores deben ser números
+ """
+ suma =a+b
+ return suma # El calculo viene después de la palabra return
+print (misuma(5,6))
res= misuma (2,3) # Uso la función, le paso los parámetros 2,3 y, el resultado lo almaceno en la variable res
print ("Resultado de sumar 2 y 3, es ", res) # Puedo ver su contenido con un print
diff --git a/Workbench/Taller/Prueba240123.py b/Workbench/Taller/Prueba240123.py
new file mode 100644
index 000000000..e69de29bb
From 00e22c49bcc2c31b8d3031dc2c3290d835aaaf6d Mon Sep 17 00:00:00 2001
From: Jorge Cordova <55065873+jcordovaj@users.noreply.github.com>
Date: Thu, 26 Jan 2023 16:47:23 -0300
Subject: [PATCH 10/16] 26011646 Up
---
.../Preliminares - 01-checkpoint.ipynb" | 29 +-
.../Preliminares - 01.ipynb" | 9 +-
Workbench/Substrings.py | 72 ++-
Workbench/Taller/Clases.py | 177 +++++-
Workbench/Taller/HW08_POO_Sol.py | 352 +++++++++++
Workbench/Taller/Herramientas.py | 0
Workbench/Taller/LibroAlumnos.py | 76 +++
Workbench/Taller/Mix_ejercicios.py | 302 ++++-----
Workbench/Taller/Problemasumas.py | 36 ++
Workbench/Taller/TodasLasOperaciones.py | 27 +
Workbench/Taller/listas.py | 367 ++++++++---
Workbench/Taller/pruebaerror.ipynb | 586 ++++++++++++++++++
12 files changed, 1745 insertions(+), 288 deletions(-)
create mode 100644 Workbench/Taller/HW08_POO_Sol.py
create mode 100644 Workbench/Taller/Herramientas.py
create mode 100644 Workbench/Taller/LibroAlumnos.py
create mode 100644 Workbench/Taller/Problemasumas.py
create mode 100644 Workbench/Taller/TodasLasOperaciones.py
create mode 100644 Workbench/Taller/pruebaerror.ipynb
diff --git "a/01 - Introducci\303\263n a la Programaci\303\263n/.ipynb_checkpoints/Preliminares - 01-checkpoint.ipynb" "b/01 - Introducci\303\263n a la Programaci\303\263n/.ipynb_checkpoints/Preliminares - 01-checkpoint.ipynb"
index a62bcd0ee..b91bde2df 100644
--- "a/01 - Introducci\303\263n a la Programaci\303\263n/.ipynb_checkpoints/Preliminares - 01-checkpoint.ipynb"
+++ "b/01 - Introducci\303\263n a la Programaci\303\263n/.ipynb_checkpoints/Preliminares - 01-checkpoint.ipynb"
@@ -564,7 +564,7 @@
}
],
"source": [
- " mi_tupla.count('Rojo')"
+ "mi_tupla.count('Rojo')"
]
},
{
@@ -1308,23 +1308,11 @@
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": 1,
"metadata": {},
- "outputs": [
- {
- "ename": "NameError",
- "evalue": "name 'divisor' is not defined",
- "output_type": "error",
- "traceback": [
- "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
- "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_10044/1862935505.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdivisor\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
- "\u001b[1;31mNameError\u001b[0m: name 'divisor' is not defined"
- ]
- }
- ],
+ "outputs": [],
"source": [
- "print(divisor)"
+ "# print(divisor)"
]
},
{
@@ -2322,7 +2310,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3 (ipykernel)",
+ "display_name": "Python 3",
"language": "python",
"name": "python3"
},
@@ -2336,7 +2324,12 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.9.7"
+ "version": "3.10.6"
+ },
+ "vscode": {
+ "interpreter": {
+ "hash": "d3777ed8f5fe800f0d3d1926318eb186c93d9a88e13881725c87e5bdd2f1dd1d"
+ }
}
},
"nbformat": 4,
diff --git "a/01 - Introducci\303\263n a la Programaci\303\263n/Preliminares - 01.ipynb" "b/01 - Introducci\303\263n a la Programaci\303\263n/Preliminares - 01.ipynb"
index a0181f9c0..325046170 100644
--- "a/01 - Introducci\303\263n a la Programaci\303\263n/Preliminares - 01.ipynb"
+++ "b/01 - Introducci\303\263n a la Programaci\303\263n/Preliminares - 01.ipynb"
@@ -2342,7 +2342,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3 (ipykernel)",
+ "display_name": "Python 3",
"language": "python",
"name": "python3"
},
@@ -2356,7 +2356,12 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.9.7"
+ "version": "3.10.6 (tags/v3.10.6:9c7b4bd, Aug 1 2022, 21:53:49) [MSC v.1932 64 bit (AMD64)]"
+ },
+ "vscode": {
+ "interpreter": {
+ "hash": "d3777ed8f5fe800f0d3d1926318eb186c93d9a88e13881725c87e5bdd2f1dd1d"
+ }
}
},
"nbformat": 4,
diff --git a/Workbench/Substrings.py b/Workbench/Substrings.py
index 40ea5c555..0c47a6cad 100644
--- a/Workbench/Substrings.py
+++ b/Workbench/Substrings.py
@@ -4,21 +4,67 @@
varany = int
pos_ini = int
pos_fin = int
-obj_iter.sub[varany, pos_ini, pos_fin])
-#es similar a find() pero en caso de que no se encuentre la subcadena sub lanza la excepción ValueError.
-cadena = 'me gusta la mermelada'
-cadena.index('lo')
-#La cadena 'lo' no existe, por lo que provocará un error
+# obj_iter.sub[varany, pos_ini, pos_fin])
+# es similar a find() pero en caso de que no se encuentre la subcadena sub lanza la excepción ValueError.
+# TypeError : Ocurre cuando se aplica una operación o función a un dato del tipo inapropiado.
+# ZeroDivisionError : Ocurre cuando se itenta dividir por cero.
+# OverflowError : Ocurre cuando un cálculo excede el límite para un tipo de dato numérico.
+# IndexError : Ocurre cuando se intenta acceder a una secuencia con un índice que no existe.
+# KeyError : Ocurre cuando se intenta acceder a un diccionario con una clave que no existe.
+# FileNotFoundError : Ocurre cuando se intenta acceder a un fichero que no existe en la ruta indicada.
+# ImportError : Ocurre c
+# Manejo de excepciones con TRY y EXCEPT
+# try:
+ # Codigo a ejecutar
+ # Pero podria haber errores en este bloque
+#
+# except :
+ # Haz esto para manejar la excepcion
+ # El bloque except se ejecutara si el bloque try lanza un error
+#
+# else:
+ # Esto se ejecutara si el bloque try se ejecuta sin errores
+#
+# finally:
+ # Este bloque se ejecutara siempre
+print ("")
+frase = 'me gusta la mermelada'
+busca = "lo"
+try:
+ cadena = frase
+ print (cadena.index(busca))
+ # La cadena 'lo' no existe, por lo que provocará un error
+except ValueError:
+ print ("En el texto ", "'",cadena,"'", "no existe la cadena", busca)
+
+# Otro ejemplo, creamos una función "dividir" que divide dos números
+num = 10
+div = 0
+def dividir(num,div):
+ try:
+ res = dividir(num, div)
+ print(res)
+ except ZeroDivisionError:
+ print("Trataste de dividir entre cero :( ")
+ return num/div
+#Sin embargo no controla la división por 0, que no esta definida y devolverá un error
+#Aquí usamos el control de errores con try y except
+
# Traceback (most recent call last):
-# File "", line 1, in
+# File "", line 1, in
# ValueError: substring not found
-cadena.index('la')
-9
-# Encontrar la última posición de una subcadena con RFIND
+# Ejemplo
+# Buscar la posición de una cadena, en el ejemplo "la"
+# Debe retornar la pos anterior a dónde incia la cadena, en este caso 9
+print ("La posición anterior a iniciar la primera cadena 'la' que encuentra, es la pos ", cadena.index('la'))
+print ("")
+
+# Ejemplo
+# Encontrar la última posición de una subcadena con RFIND, la busca todas y devuelve la ÚLTIMA
cadena = 'me gusta la mermelada'
-cadena.rfind('la')
-print (cadena.rfind('la'))
+cadena.rfind('la') # ocupan las pos 18 y 19
+print ("La última posición anterior, a iniciar la cadena 'la', es la pos ", cadena.rfind('la'))
# 17
print (cadena.rfind('lo'))
# -1
@@ -27,3 +73,7 @@
# 17
# print (cadena.rindex('lo'))
# Debe arrojar un error porque no existe la cadena (ValueError: substring not found)
+import re
+texto = "tres tristes tigres comen trigo en un trigal"
+busqueda = re.sub(" ", "-", texto)
+print(busqueda)
\ No newline at end of file
diff --git a/Workbench/Taller/Clases.py b/Workbench/Taller/Clases.py
index f37c01c35..d071497fb 100644
--- a/Workbench/Taller/Clases.py
+++ b/Workbench/Taller/Clases.py
@@ -1,3 +1,40 @@
+#*******************************************************************
+#* *
+#* TALLLER CLASES y OBJETOS *
+#* *
+#*******************************************************************
+# En Python todo son clases, porque es un lenguaje flexible
+# Una clase es la abstracción de un objeto, un molde para crear entidades similares.
+# Una clase consta de ATRIBUTOS y MÉTODOS
+# Con los atributos o CONSTRUCTOR se instancia (crea) el objeto, es una copia
+# Con los métodos se manipula, se hacen cálculos, se accede al objeto.
+# Un ATRIBUTO es una carcterística, cuantificable o no, que define al objeto, ej, su color, número de patas
+# Como ATRIBUTO, a un objeto le puedo definir cualquuier cosa ej diccionario, listas, tuplas
+# Agregamos los atributos que necesitemos y si es numérico se inicializan con algún valor, ej velocidad=0.
+# Los ATRIBUTOS o se deben acceder desde fuera de la clase(ej print(a1.color), a1 es un objeto animal,
+# con un atributo llamado color, en principio, la sentencia devolvería el color de a1, con el que fue
+# creado, pero la buena práctica dice que debemos crear un método para acceder a su color y luego podemos
+# imprimir lo que retorna el método.
+# Para proteger un ATRIBUTO, se le agregan dos lineas bajas o underscore al INICIO del atributo.
+# Luego creo los métodos o funciones asociados a él o los ATRIBUTOS, similar a los geters y seters.
+# Este es un ejemplo de ENCAPSULACIÓN
+# Un MÉTODO, básicamente, es una FUNCIóN, usada para ejecutar procedimientos u operaciones sobre la CLASE
+# con los ATRIBUTOS de la CLASE. Por ejemplo, un objeto auto, tiene un atributo velocidad, por lo que puede acelerar o frenar.
+# Qué es ABSTRACCIÓN => Separar los datos
+# Qué es ENCAPSULAMIENTO => Proteger el objeto (lo accedo o conozco a través de sus métodos)
+# Qué es HERENCIA => Permite crear nuevas clases heredando sus atributos,métodos y agregando nuevos,
+# ej. Animales=>Humano
+# Qué es POLIMORFISMO => Mismo nombre pero distinto comportamiento
+# Se usa la palabara reservada class, seguida de __INIT__, y detro de los paréntesis (), la primera palabra
+# DEBE ser self, seguido de sus atributos. A esto se denomina el método CONSTRUCTOR de la clase.
+# SELF es una palabra reservada que le dice a Python que lo que viene son atributos y no genere conflictos.
+# Para que la ayuda o help(), despliegue un mensaje de qué hace una CLASE o FUNCIÓN, se abren
+# tres comillas dobles, se agrega una breve descripción con los tipos de varibles o sintaxis, y se vuelve
+# a cerrar con tres comillas dobles.
+#
+
+# Ej 1) Crear una clase que cree objetos del tipo automóvil con los atributos color y aceleración
+
class Car1:
def __init__(self, color, aceleracion):
self.color = color
@@ -31,4 +68,142 @@ def __init__(self, nombre, raza):
print(c2.color)
# azul
print(c2.ruedas)
-# 4
\ No newline at end of file
+# 4
+
+# Ej 5 Crear una función que cree la clase Emprendedor
+# El constructor de la clase Emprenddedor recibe los valores
+# nombre (str), apellido (str), libros (array), mascotas (array de str)
+# Inicializar las propiedades de la clase Emprendedor con los valores recibidos
+class Emprendedor:
+ """
+ recibe los valores nombre (str), apellido (str), libros (array),
+ mascotas (array de str)
+ """
+ def __init__(self, nombre, apellido, libros, mascotas):
+ self.nombre = nombre
+ self. apellido = apellido #Este es el constructor de la clase
+ self.libros = libros
+ self. mascotas = mascotas
+
+# Estos los métodos de la clase Emprendedor
+ def getNombre (self):
+ pass
+ def getApellido (self):
+ pass
+ def getLibros (self):
+ pass
+ def getMascotas (self):
+ pass
+ def setNombre (self):
+ pass
+ def setApellido (self):
+ pass
+ def setLibros (self):
+ pass
+ def setMascotas (self):
+ pass
+
+# Ej 6 Creamos el objeto emp1 con el constructor Emprendedor
+emp1 = Emprendedor ("Lionel", "Cordova", ["Dos palmeras", 1917, 'abc123'], ('Perro', 'Gato'))
+print ("")
+print (type(emp1)) # Debe retornar
+print (type(emp1.nombre)) # Debe retornar
+print (type(emp1.apellido)) # Debe retornar
+print (type(emp1.libros)) # Debe retornar
+print (type(emp1.mascotas)) # Debe retornar
+print("")
+
+# Ej 8 ENCAPSULAMIENTO
+# Encapsular, consiste en hacer que los atributos o métodos internos a una clase no se puedan
+# acceder ni modificar desde fuera, sino que tan solo el propio objeto pueda acceder a ellos.
+# Python por defecto NO OCULTA los atributos y métodos de una clase al exterior.
+#
+class miSaludo:
+ atributo_clase = "Hola"
+ def __init__(self, atributo_instancia):
+ self.atributo_instancia = atributo_instancia
+# Mira lo que pasa
+prueba_mi_clase = miSaludo("Que tal") #Instancio el objeto con el parámetro 'Que tal'=atributo_instancia
+print (prueba_mi_clase.atributo_clase) # Le he pasado el valor de la variable
+print (prueba_mi_clase.atributo_instancia) # Le he pasado el parámetro de la instancición de la clase
+
+# 'Hola'
+# 'Que tal'
+
+# Primera reflexión: Ambos atributos son perfectamente accesibles desde el exterior!, va contra las buenas prácticas.
+# Hay métodos o atributos que queremos que pertenezcan sólo a la clase o al objeto, y que sólo puedan ser accedidos
+# por los mismos. Para ello podemos usar la doble __ (underscore) para ocultar un atributo o método.
+# Esto hará que Python los interprete como “privados”, y ya no podrán ser accedidos desde el exterior.
+# Eso es "ENCAPSULAMIENTO"
+# Volvamos a revisar el ejemplo
+class Clase:
+ atributo_clase = "Hola" # Es accesible desde el exterior
+ __atributo_clase = "Hola" # No es accesible desde el exterior de la clase
+ # Acá protegemos el método, ahora no es accesible desde el exterior
+ def __mi_metodo(self):
+ print("Este es un ejemplo de ENCAPSULAMIENTO")
+ self.__variable = 0 # La variable, también la hacemos privada
+
+ # Este método lo exponemos para acceder a la clase, debe ser accesible desde el exterior
+ def metodo_normal(self):
+ # El método si es accesible desde el interior
+ self.__mi_metodo()
+
+mi_clase = Clase()
+#mi_clase.__atributo_clase # Error! El atributo no es accesible
+#mi_clase.__mi_metodo() # Error! El método no es accesible
+mi_clase.atributo_clase # Ok!
+mi_clase.metodo_normal() # Ok!
+# Podemos hacer uso de 'dir' para ver el listado de métodos y atributos de nuestra clase que son PUBLICOS.
+# Al hacer 'privados' el '_atributo_clase' y '_mi_metodo', no los podremos encontrar en la lista.
+print(dir(mi_clase))
+#['_Clase__atributo_clase', '_Clase__mi_metodo', '_Clase__variable',
+#'__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
+#'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
+#'__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
+#'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
+#'__str__', '__subclasshook__', '__weakref__', 'atributo_clase', 'metodo_normal']
+
+# Se puede acceder a los atribtos y métodos ocultos de una clase, como '__atributo_clase' y a '__mi_metodo',
+# haciendo un poco de trampa.
+# Python los guarda con un nombre distinto para ocultarlos (encapsularlos) y evitar su uso indebido.
+# Podemos llamarlos con un 'truco sucio' de la siguiente manera aunque, por buenas prácticas, no es recomendable.
+print("")
+a = mi_clase._Clase__atributo_clase
+print ("Escribiendo 'la ruta completa' del atributo oculto")
+print ("de esta forma: 'mi_clase._Clase__atributo_clase', retornará su contenido")
+print ("en este caso ", a)
+# 'Hola'
+print ("Caso 2, al escribir 'la ruta completa' del método así 'mi_clase._Clase__mi_metodo', retorna su contenido.")
+print ("en este caso ", mi_clase._Clase__mi_metodo())
+# Conclusión, hay una precedencia en las operaciones...la función primero que el
+# print, y se repite porque imprime la función y lo que retorna que es none.
+# Por esa razón, a veces parece que se imprime en otra parte.
+
+
+# Ej 7 POLIMORFISMO
+# Suponga que tiene una clase ANIMAL, que tiene un atributo HABLAR
+print("")
+class Animal: # Creamos la clase con 1 atributo hablar
+ def hablar(self):
+ pass
+# Por otro lado, creamos dos clases: Perro y Gato, que heredan de la anterior.
+# Además, implementan el método hablar() de formas distintas.
+# Entonces:
+print ("")
+class Perro(Animal): # Nótese que en este caso se le pasa como parámetro, la otra
+ def hablar(self): # clase entre paréntesis.
+ print("Guau!")
+
+class Gato(Animal):
+ def hablar(self):
+ print("Miau!")
+
+# Ahora creamos un objeto de cada clase y llamamos al método hablar().
+# Podemos observar que cada animal se comporta de manera distinta al usar hablar().
+
+for sonidos in Perro(), Gato():
+ sonidos.hablar()
+# Guau!
+# Miau!
+
diff --git a/Workbench/Taller/HW08_POO_Sol.py b/Workbench/Taller/HW08_POO_Sol.py
new file mode 100644
index 000000000..b411e5ab9
--- /dev/null
+++ b/Workbench/Taller/HW08_POO_Sol.py
@@ -0,0 +1,352 @@
+
+# 1) Crear la clase vehículo que contenga los atributos:
+# 'Color'
+# 'Tipo' (Si es moto, auto, camioneta ó camión)
+# 'Cilindrada' (en decimal, e.g. 1200cc = 1.2 cc de motor)
+
+class Vehiculo:
+ def __init__(self, color, tipo, cilindrada):
+ self.color = color
+ self.tipo = tipo
+ self.cilindrada = cilindrada
+
+# 2) A la clase Vehiculo creada en el punto 1, agregar los siguientes métodos:
+# Acelerar => El ejercicio no lo dice, pero necesito crear lo atributos que usaré
+# Frenar para mostrar que mi objeto vehículo acelera y frena.
+# Doblar Las acciones requieren de respectivo atributo, si doblo (acción),
+# necesito que se refiera a un atributo de la clase, en este caso
+# la 'dirección' o rumbo que lleva el móvil.
+
+class Vehiculo:
+ def __init__(self, color, tipo, cilindrada):
+ self.color = color
+ self.tipo = tipo
+ self.cilindrada = cilindrada
+ self.velocidad = 0 # Aquí creamos el atributo velocidad, no se requieren 2
+ self.direccion = 0 # Aquí creamos el atributo velocidad
+
+ def Acelerar(self, vel): # Recibe un parámetro velocidad
+ self.velocidad += vel # Este es método que modifica el atributo velocidad
+
+ def Frenar(self, vel): # Recibe un parámetro velocidad, es sólo un valor
+ self.velocidad -= vel # Calcula la nueva velocidad
+
+ def Doblar(self, grados): # Recibe la cantidad de grados del giro (0-360)
+ self.direccion += grados # Calcula la nueva dirección
+
+# 3) Instanciar 3 objetos de la clase vehículo y ejecutar sus métodos, probar luego el resultado
+
+a1 = Vehiculo ('rojo', 'auto', 2)
+a2 = Vehiculo ('blanco', 'camioneta', 3.6)
+a3 = Vehiculo ('negro', 'moto', 1)
+
+a1.Acelerar(40) # Si se hace un print se verá que el contenido de los atributos
+a2.Acelerar(60) # velocidad y dirección, han cambiado
+a3.Acelerar(30) # Para mostrar el contenido del atributo usar la sentencia
+a1.Doblar(30)
+a3.Doblar(-30)
+a2.Frenar(-50)
+
+# 4) Agregar a la clase Vehiculo, un método que muestre su estado, es decir, a que velocidad se encuentra y su dirección. Y otro método que muestre color, tipo y cilindrada
+
+class Vehiculo:
+ def __init__(self, color, tipo, cilindrada):
+ self.color = color
+ self.tipo = tipo
+ self.cilindrada = cilindrada
+ self.velocidad = 0
+ self.direccion = 0
+
+ def Acelerar(self, vel):
+ self.velocidad += vel
+
+ def Frenar(self, vel):
+ self.velocidad -= vel
+
+ def Doblar(self, grados):
+ self.direccion += grados
+
+ def Estado(self):
+ print('La velocidad actual es :', self.velocidad, '- y su rumbo actual es:', self.direccion, 'grados')
+
+ def Detalle(self):
+ print('Soy del tipo ', self.tipo, 'de color', self.color, 'y mi cilindrada es de', self.cilindrada, 'litros')
+
+a1 = Vehiculo('rojo', 'auto', 2)
+a1.Detalle()
+
+a1.Estado()
+a1.Acelerar(30)
+a1.Estado()
+
+
+# 5) Crear una clase que permita utilizar las funciones creadas en la práctica del módulo 6
+# Verificar Primo
+# Valor modal
+# Conversión grados
+# Factorial
+
+# In[33]:
+
+
+class Herramientas:
+ def __init__(self) -> None:
+ pass
+
+ def verifica_primo(self, nro):
+ es_primo = True
+ for i in range(2, nro):
+ if nro % i == 0:
+ es_primo = False
+ break
+ return es_primo
+
+ def valor_modal(self, lista, menor):
+ lista_unicos = []
+ lista_repeticiones = []
+ if len(lista) == 0:
+ return None
+ if (menor):
+ lista.sort()
+ else:
+ lista.sort(reverse=True)
+ for elemento in lista:
+ if elemento in lista_unicos:
+ i = lista_unicos.index(elemento)
+ lista_repeticiones[i] += 1
+ else:
+ lista_unicos.append(elemento)
+ lista_repeticiones.append(1)
+ moda = lista_unicos[0]
+ maximo = lista_repeticiones[0]
+ for i, elemento in enumerate(lista_unicos):
+ if lista_repeticiones[i] > maximo:
+ moda = lista_unicos[i]
+ maximo = lista_repeticiones[i]
+ return moda, maximo
+
+ def conversion_grados(self, valor, origen, destino):
+ valor_destino = None
+ if (origen == 'celsius'):
+ if (destino == 'celsius'):
+ valor_destino = valor
+ elif (destino == 'farenheit'):
+ valor_destino = (valor * 9 / 5) + 32
+ elif (destino == 'kelvin'):
+ valor_destino = valor + 273.15
+ else:
+ print('Parámetro de Destino incorrecto')
+ elif (origen == 'farenheit'):
+ if (destino == 'celsius'):
+ valor_destino = (valor - 32) * 5 / 9
+ elif (destino == 'farenheit'):
+ valor_destino = valor
+ elif (destino == 'kelvin'):
+ valor_destino = ((valor - 32) * 5 / 9) + 273.15
+ else:
+ print('Parámetro de Destino incorrecto')
+ elif (origen == 'kelvin'):
+ if (destino == 'celsius'):
+ valor_destino = valor - 273.15
+ elif (destino == 'farenheit'):
+ valor_destino = ((valor - 273.15) * 9 / 5) + 32
+ elif (destino == 'kelvin'):
+ valor_destino = valor
+ else:
+ print('Parámetro de Destino incorrecto')
+ else:
+ print('Parámetro de Origen incorrecto')
+ return valor_destino
+
+ def factorial(self, numero):
+ if(type(numero) != int):
+ return 'El numero debe ser un entero'
+ if(numero < 0):
+ return 'El numero debe ser pisitivo'
+ if (numero > 1):
+ numero = numero * self.factorial(numero - 1)
+ return numero
+
+
+# In[34]:
+
+
+h = Herramientas()
+
+
+# 6) Probar las funciones incorporadas en la clase del punto 5
+
+# In[28]:
+
+
+h.verifica_primo(7)
+
+
+# In[29]:
+
+
+listado = [1,8,2,5,4,8,10,7]
+moda, repe = h.valor_modal(listado, True)
+print('El valor modal es', moda, 'y se reptie', repe, 'veces')
+
+
+# In[31]:
+
+
+h.conversion_grados(10, 'celsius', 'kelvin')
+
+
+# In[35]:
+
+
+h.factorial(6)
+
+
+# 7) Es necesario que la clase creada en el punto 5 contenga una lista, sobre la cual se aplquen las funciones incorporadas
+
+# In[55]:
+
+
+class Herramientas:
+ def __init__(self, lista_numeros):
+ self.lista = lista_numeros
+
+ def verifica_primo(self):
+ for i in self.lista:
+ if (self.__verifica_primo(i)):
+ print('El elemento', i, 'SI es un numero primo')
+ else:
+ print('El elemento', i, 'NO es un numero primo')
+
+ def conversion_grados(self, origen, destino):
+ for i in self.lista:
+ print(i, 'grados', origen, 'son', self.__conversion_grados(i, origen, destino),'grados',destino)
+
+ def factorial(self):
+ for i in self.lista:
+ print('El factorial de ', i, 'es', self.__factorial(i))
+
+ def __verifica_primo(self, nro):
+ es_primo = True
+ for i in range(2, nro):
+ if nro % i == 0:
+ es_primo = False
+ break
+ return es_primo
+
+ def valor_modal(self, menor):
+ lista_unicos = []
+ lista_repeticiones = []
+ if len(self.lista) == 0:
+ return None
+ if (menor):
+ self.lista.sort()
+ else:
+ self.lista.sort(reverse=True)
+ for elemento in self.lista:
+ if elemento in lista_unicos:
+ i = lista_unicos.index(elemento)
+ lista_repeticiones[i] += 1
+ else:
+ lista_unicos.append(elemento)
+ lista_repeticiones.append(1)
+ moda = lista_unicos[0]
+ maximo = lista_repeticiones[0]
+ for i, elemento in enumerate(lista_unicos):
+ if lista_repeticiones[i] > maximo:
+ moda = lista_unicos[i]
+ maximo = lista_repeticiones[i]
+ return moda, maximo
+
+ def __conversion_grados(self, valor, origen, destino):
+ valor_destino = None
+ if (origen == 'celsius'):
+ if (destino == 'celsius'):
+ valor_destino = valor
+ elif (destino == 'farenheit'):
+ valor_destino = (valor * 9 / 5) + 32
+ elif (destino == 'kelvin'):
+ valor_destino = valor + 273.15
+ else:
+ print('Parámetro de Destino incorrecto')
+ elif (origen == 'farenheit'):
+ if (destino == 'celsius'):
+ valor_destino = (valor - 32) * 5 / 9
+ elif (destino == 'farenheit'):
+ valor_destino = valor
+ elif (destino == 'kelvin'):
+ valor_destino = ((valor - 32) * 5 / 9) + 273.15
+ else:
+ print('Parámetro de Destino incorrecto')
+ elif (origen == 'kelvin'):
+ if (destino == 'celsius'):
+ valor_destino = valor - 273.15
+ elif (destino == 'farenheit'):
+ valor_destino = ((valor - 273.15) * 9 / 5) + 32
+ elif (destino == 'kelvin'):
+ valor_destino = valor
+ else:
+ print('Parámetro de Destino incorrecto')
+ else:
+ print('Parámetro de Origen incorrecto')
+ return valor_destino
+
+ def __factorial(self, numero):
+ if(type(numero) != int):
+ return 'El numero debe ser un entero'
+ if(numero < 0):
+ return 'El numero debe ser pisitivo'
+ if (numero > 1):
+ numero = numero * self.__factorial(numero - 1)
+ return numero
+
+
+# In[56]:
+
+
+h = Herramientas([1,1,2,5,8,8,9,11,15,16,16,16,18,20])
+
+
+# In[57]:
+
+
+h.conversion_grados('celsius','farenheit')
+
+
+# In[58]:
+
+
+h.verifica_primo()
+
+
+# In[59]:
+
+
+moda, repe = h.valor_modal(False)
+print('El valor modal es', moda, 'y se reptie', repe, 'veces')
+
+
+# In[60]:
+
+
+h.factorial()
+
+
+# 8) Crear un archivo .py aparte y ubicar allí la clase generada en el punto anterior. Luego realizar la importación del módulo y probar alguna de sus funciones
+
+# In[1]:
+
+
+from herramientas import *
+
+
+# In[2]:
+
+
+h2 = Herramientas([1,1,2,3,5,6,8,8])
+
+
+# In[3]:
+
+
+h2.verifica_primo()
\ No newline at end of file
diff --git a/Workbench/Taller/Herramientas.py b/Workbench/Taller/Herramientas.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/Workbench/Taller/LibroAlumnos.py b/Workbench/Taller/LibroAlumnos.py
new file mode 100644
index 000000000..dc300f7d8
--- /dev/null
+++ b/Workbench/Taller/LibroAlumnos.py
@@ -0,0 +1,76 @@
+
+class Alumnos:
+
+ def __init__(self):
+ self.nombres=[]
+ self.notas=[]
+
+# El método menu muestra una serie de opciones y solicita al usuario que
+# elija una de ellas, según cual de ellas selecciona procede a llamar al método respectivo:
+ def menu(self):
+ opcion=0
+ while opcion!=4:
+ print("1- Cargar alumnos")
+ print("2- Listar alumnos")
+ print("3- Listado de alumnos con notas mayores o iguales a 7")
+ print("4- Finalizar programa")
+ opcion=int(input("Ingrese su opcion:"))
+ if opcion==1:
+ self.cargar()
+ elif opcion==2:
+ self.listar()
+ elif opcion==3:
+ self.notas_altas()
+# Algo que no utilizamos hasta ahora del lenguaje Python, es una forma
+# simplificada de if anidados con la sentencia elif:
+ if opcion==1:
+ self.cargar()
+ elif opcion==2:
+ self.listar()
+ elif opcion==3:
+ self.notas_altas()
+# Nosotros, hasta ahora, lo resolvíamos y podemos sin problema seguir utilizando
+# la sintaxis::
+ if opcion==1:
+ self.cargar()
+ else:
+ if opcion==2:
+ self.listar()
+ else:
+ if opcion==3:
+ self.notas_altas()
+# Pero podemos comprobar que, si hay muchos if anidados la nueva sintaxis es más
+# clara.
+# Un ciclo WHILE, repite el método menu, mientras no se ingrese como opción en la
+# variable local, el valor 4.
+
+# El método cargar, se llama desde el método menu, en el mismo procedemos a cargar
+# las dos listas paralelas, con los nombres de alumnos y sus notas:
+
+ def cargar(self):
+ for x in range(5):
+ nom=input("Ingrese nombre del alumno:")
+ self.nombres.append(nom)
+ no=int(input("Nota del alumno:"))
+ self.notas.append(no)
+
+# El método listar muestra las dos listas paralelas por completo e imprime una línea separadora para que se vea in forma más clara:
+
+ def listar(self):
+ print("Listado completo de alumnos")
+ for x in range(5):
+ print(self.nombres[x],self.notas[x])
+ print("_____________________")
+# Finalmente el método notas_altas muestra solo los elementos de las listas cuyas
+# notas sean igual o superior a 7:
+
+ def notas_altas(self):
+ print("Alumnos con notas superiores o iguales a 7")
+ for x in range(5):
+ if self.notas[x]>=7:
+ print(self.nombres[x],self.notas[x])
+ print("_____________________")
+# bloque principal
+
+alumnos=Alumnos()
+alumnos.menu()
diff --git a/Workbench/Taller/Mix_ejercicios.py b/Workbench/Taller/Mix_ejercicios.py
index c7df605fb..56a8fa9d0 100644
--- a/Workbench/Taller/Mix_ejercicios.py
+++ b/Workbench/Taller/Mix_ejercicios.py
@@ -1,221 +1,153 @@
-Variables
+# Variables
+
+# Ej 1) Cocatenar cadenas de caracteres, deben ser del mismo tipo (str+str)
+
a = 'Hola '
b = 'Mundo !'
+# Ej 2) Sumar dos enteros, puedo imprimir directo el resultado
+
print(a + b)
-# Hola Mundo !
+
+# Ej 3) Mismo ejemplo, almaceno en variable
x = 3
y = 12
-print(x + y)
-15
-print(a + x)
-"""
-"---------------------------------------------------------------------------"
+print(x + y) # 15
-TypeError Traceback (most recent call last)
-~\AppData\Local\Temp/ipykernel_18232/136165486.py in
-----> 1 print(a + x)
+# Ej 4) Manejo de errores por tipo, no sumar tipos distintos.
+# print(a + x)==> Da un error porque son de distinto tipo, concatencación
+# a= string Para que funcione, puedo cambiar el tipo a str(3)
+# x= int quedaría como 'Hola 3'
-TypeError: can only concatenate str (not "int") to str
-"""
-# Dividir "y" entre "x"
+# Ej 5) Dividir "y" entre "x"
y = 9
x = 3
-print(y/x)
-3.0
-# Potencia de "y" elevado a la "x"
+print(y/x) # => 3.0
+
+# Ej 6) Potencia de "y" elevado a la "x"
y = 2
x = 4
-print(y**x)
-16
-# Devolver el resto de la división
+print(y**x) # si elevo a 0.5, Python entiende que es raíz cuadrada igual que 1/2
+# R=> 16
+
+# Ej 7) Devolver el resto de la división
y = 13
x = 3
-print(y%x)
-1
-# Ciclo IF/ELIF/ELSE
-valor = 0
+print(y%x) # Sirve para todas las operaciones en que deba detectar pares, impares, primos
+
+# Ej 8) Ciclo IF/ELIF/ELSE
+valor = 0 # Inicializo un contador para entrar al ciclo
if (valor < 0):
print('El número es negativo')
elif (valor > 0):
print('El número es positivo')
else:
- print('El número es igual a cero')
-# El número es igual a cero
-
-# Ciclo FOR - Caso 1
-for n in range(1,10): #Incluye el primero y excluye el último
- print(n, end(", "))
-
-# Ciclo WHILE
-n = 1
-while (n < 10):
- print(n)
- n = n + 1
-"""
-1
-2
-3
-4
-5
-6
-7
-8
-9
-"""
-# Lista
-
-# Caso 1 - Inicializa una lista y muestra la cantidad de elementos
-
-edad = (3,1,0.2,8,7) #Declara un objeto lista y le asigna elementos
-print (len(edad)) #Imprime la cantidad de elementos de la lista usando la función LEN
-#5 # La función retorno 5
-
-# Caso 2 - Identificar el tipo de variable usando la función TYPE, retorno el tipo de dato
-mi_lista = ['Rojo','Azul','Amarillo','Naranja','Violeta','Verde']
-type(mi_lista)
-# list
-print(mi_lista)
-['Rojo', 'Azul', 'Amarillo', 'Negro', 'Naranja', 'Violeta', 'Verde']
-print(mi_lista[0:2])
-['Rojo', 'Azul']
-print(mi_lista[:2])
-['Rojo', 'Azul']
-print(mi_lista[1:])
-['Azul', 'Amarillo']
-mi_lista.insert(3,'Negro')
-print(mi_lista.index('Azul'))
-# 1
-mi_lista.insert(3,'Negro')
-mi_lista.extend(['Marrón','Gris'])
-print(['a','b','c'] * 3)
-# ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
-print(mi_lista.index('Azul'))
-# 1
-mi_lista.remove('Blanco')
-
-"""
----------------------------------------------------------------------------
-ValueError Traceback (most recent call last)
-~\AppData\Local\Temp/ipykernel_10044/2480624766.py in
-----> 1 mi_lista.remove('Blanco')
-
-ValueError: list.remove(x): x not in list
-mi_lista.remove('Negro')
----------------------------------------------------------------------------
-ValueError Traceback (most recent call last)
-~\AppData\Local\Temp/ipykernel_10044/298389232.py in
-----> 1 mi_lista.remove('Negro')
-
-ValueError: list.remove(x): x not in list
-"""
-ultimo = mi_lista.pop()
-ultimo = mi_lista.pop()
-print(ultimo)
-# Gris
-ultimo = mi_lista.pop()
-ultimo
-# 'Amarillo'
-mi_tupla=tuple(mi_lista)
-print(mi_tupla[1])
-# Azul
-'Rojo' in mi_tupla
-# True
-mi_tupla.count('Rojo')
-# 1
-print(mi_lista[:] * 3)
-# ['Rojo', 'Azul', 'Amarillo', 'Negro', 'Marrón', 'Gris', 'Rojo', 'Azul', 'Amarillo', 'Negro', 'Marrón', 'Gris', 'Rojo', 'Azul', 'Amarillo', 'Negro', 'Marrón', 'Gris']
-mi_tupla.count('Rojo')
-# 1
-mi_tupla='Gaspar', 5, 8, 1999
-nombre, dia, mes, año = mi_tupla
-print("Nombre: ", nombre, " - Dia:", dia, " - Mes: ", mes, " - Año: ", año)
-# Nombre: Gaspar - Dia: 5 - Mes: 8 - Año: 1999
-nombre = 'Darío'
-edad = 39
-print(nombre, edad)
-print("Mi nombre es", nombre, ". Mi edad es", edad, "años")
-print("Mi nombre es {}. Mi edad es {} años". format(nombre, edad))
-# Darío 39
-# Mi nombre es Darío . Mi edad es 39 años
-# Mi nombre es Darío. Mi edad es 39 años
-
-mi_diccionario = { 'Colores Primarios': ['Rojo','Azul','Amarillo'],
- 'Colores secundarios': ['Naranja','Violeta','Verde'],
- 'Clave3': 10,
+ print('El número es igual a cero') # R=> El número es igual a cero
+
+# Ej 9) Ciclo FOR - Simple (ver ciclos listas dobles)
+for n in range(1,11): #Incluye el primero y excluye el último
+ print(n,(')'))
+
+# Ej 10) Ciclo WHILE - Simple con un contador
+n = 1 # Contador definido en 0
+while (n < 10): # Mientras n sea menor que 10, haga lo que está dentro
+ print(n) # Imprimir el contenido de la variable en cada ciclo
+ n = n + 1 # El contador es la condición de termino. Al llegar a 11, no entra el nuevo ciclo.
+
+# Ej 11) Lista Simple - Inicializa una lista y obtener la cantidad de elementos con LEN
+
+edad = (3,1,0.2,8,7) # Declara un objeto lista y le asigna elementos, la lista es mutable, no ordenada
+print (len(edad)) # Imprime la cantidad de elementos de la lista usando la función LEN
+#5 # La función retornó 5
+
+# Ej 12) Lista - Retornar tipo de variable usando TYPE, isertar con INSERT, pegar dos listas con EXTEND,
+# eliminar un elemento con REMOVE, retornar un elemento usando su índice con INDEX[]y modificadores en la salida
+
+mi_lista = ['Rojo','Azul','Amarillo','Naranja','Violeta','Verde'] # Lista de 6 elementos
+type(mi_lista) # la lista, como objeto es de tipo list, pero sus objetos no, pueden ser de cualquier tipo.
+# R => list
+print(mi_lista) # Imprime los elementos de la lista, en el orden que están...se pueden ordenar
+# R=> ['Rojo', 'Azul', 'Amarillo', 'Negro', 'Naranja', 'Violeta', 'Verde']
+print(mi_lista[0:2]) # Imprimo la lista desde el índice 0, al 2, es decir el 0 y el 1, excluye el 2
+# R=> ['Rojo', 'Azul']
+print(mi_lista[:2]) # Imprime la lista desde el inicio, hasta el indice, desde el 0 al 1, excluye el 2
+# R=> ['Rojo', 'Azul']
+print(mi_lista[1:]) # Imprime la lista desde la posición 1, hasta el final, excluye la posición 0.
+# R=> ['Azul', 'Amarillo', 'Naranja', 'Violeta', 'Verde']
+mi_lista.insert(3,'Negro') # INSERT, inserta un elemento en la posición del índice dado.
+print(mi_lista.index('Azul')) #Retorna el valor (int) del índice cuando halla la coincidencia, este caso=1.
+print(mi_lista [1]) # => Azul, retorna el valor del elemento en el indice, en este caso [1]= Azul
+mi_lista.insert(3,'Negro') # Inserta el elemento 'Negro', en la posición 3.
+mi_lista.extend(['Marrón','Gris']) # EXTEND, 'pega' la lista ('Marrón','Gris'), al final de mi_lista
+print(['a','b','c'] * 3 ) # Igual que la concatenación, puedo 'multiplizar str =>['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
+mi_lista.remove('Blanco') # Recorre la lista, si existe el elemento, lo borra 1 vez, si no, da ERROR (not in list).
+ultimo = mi_lista.pop() # Remueve el último elemento de la lista
+print(ultimo) # Conserva el último elemento eliminado con POP, si ejecuto otra vez, elimina el anterior.
+
+# Ej 13) Tuplas - Operaciones de cambio de tipo, recorrer la tupla, contar elementos, imprimir, asignar
+mi_tupla=tuple(mi_lista) # La lista fue 'casteada?, se le ambio el tipo a TUPLE (lista INMUTABLE)
+print(mi_tupla[1]) # Se accede a sus elementos igual que la lista, NO SE PUEDE ORDENAR R=> Index 1 = Azul
+'Rojo' in mi_tupla # Puedo hacer evaluaciones BOOLEANAS (T/F), está el elemento en la tupla, retorna T/F =>T
+mi_tupla.count('Rojo') # Puedo contar los elementos que coinciden con un valor, retorna 1 entero
+print(mi_lista[:] * 3) # Concatena la lista veces, igual que los strings.
+# R=> ['Rojo', 'Azul', 'Amarillo', 'Negro', 'Marrón', 'Gris', 'Rojo', 'Azul', 'Amarillo', 'Negro', 'Marrón', 'Gris', 'Rojo', 'Azul', 'Amarillo', 'Negro', 'Marrón', 'Gris']
+mi_tupla='Gaspar', 5, 8, 1999 # Crea una tupla a partir asignarle elementos
+nombre, dia, mes, año = mi_tupla # Asigna los valores de la tupla a variables
+print("Nombre: ", nombre, " - Dia:", dia, " - Mes: ", mes, " - Año: ", año) # Imprime el contenido de las variables
+# R=> Nombre: Gaspar - Dia: 5 - Mes: 8 - Año: 1999
+
+# Ej 14) Formateo de impresión - 3 casos (sólo variables, con texto y con formato)
+nombre = 'Darío' # Inicializo var nombre con el str 'Darío'
+edad = 39 # Inicializo var edad con el int 39
+print(nombre, edad) # Caso 1) Imprimo el contenido de las variables. Puede ser cualquier variable.
+print("Mi nombre es", nombre, ". Mi edad es", edad, "años") # Caso 2) Impresión tradicional con variables.
+print("Mi nombre es {}. Mi edad es {} años". format(nombre, edad)) # Caso 3) Impresión con FORMATO
+# Caso 1) Darío 39
+# Caso 2) Mi nombre es Darío . Mi edad es 39 años
+# Casi 3) Mi nombre es Darío. Mi edad es 39 años
+
+# Ej 15) Diccionarios - Creación y operaciones (pares de elementos, {key:elemento})
+mi_diccionario = { 'Colores Primarios': ['Rojo','Azul','Amarillo'], # Crear con {key:Elm, key:Elm...}
+ 'Colores secundarios': ['Naranja','Violeta','Verde'], # Elm= Cualquier cosa, mutable
+ 'Clave3': 10, # Key= Hasheable, inmutable
'Clave4': False}
-print(mi_diccionario['Colores secundarios'])
-# ['Naranja', 'Violeta', 'Verde']
+print (mi_diccionario['Colores secundarios']) # Lo puedo acceder por sus claves o índices y retorna los VALORES
+# R=> ['Naranja', 'Violeta', 'Verde'] # Para la clave dad, retorno los elementos respectivos
-mi_diccionario={'Clave1':'Valor1', 'Clave2':{'numeros':[1,2,3,4,5]}}
-print(mi_diccionario.keys())
-# dict_keys(['Clave1', 'Clave2'])
-print(mi_diccionario.values())
-# dict_values(['Valor1', {'numeros': [1, 2, 3, 4, 5]}])
-len (mi_diccionario)
-# 2
+mi_diccionario = {'Clave1':'Valor1', 'Clave2':{'numeros':[1,2,3,4,5]}} # Dic key1=str y val1=str, key2=str, val2=lista
+print (mi_diccionario.keys()) # Retorna R=> dict_keys(['Clave1', 'Clave2'])
+print(mi_diccionario.values()) # Retorna R=> dict_values(['Valor1', {'numeros': [1, 2, 3, 4, 5]}])
+len (mi_diccionario) # R=> 2, la función LEN es útil cuando se debe recorrer el DICT
+
+# Ej 16) Ciclo IF/ELIF/ELSE
edad = 60
edad_compa = 50
-if (edad < edad_compa):
+if (edad < edad_compa): # Compara dos números, y establece dos condiciones
print(edad)
if (edad < 100):
print(edad + 100)
else:
- print(edad - 100)
+ print(edad - 100)
else:
- print(edad_compa)
-# 50
+ print(edad_compa) # No cumple ninguna e imprime el contenido de la var edd_compa R=> 50
-primeros_10 = [0,1,2,3,4,5,6,7,8,9]
-print(primeros_10)
-# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+# Ej 17) Recorre una lista con un ciclo FOR y extrae los PARES
-for n in primeros_10:
- if (n%2 == 0):
- print(n)
- primeros_10[n]=0
-print("\va de nuevo....\n")
-"""
-0
-2
-4
-6
-8
-# va de nuevo....
-"""
+primeros_10 = [0,1,2,3,4,5,6,7,8,9]
+print(primeros_10) # R=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+outlist = [] # Esta lista acumula los valores encontrados
+for n in primeros_10: # For 'var' in 'lista/tupla/dict'
+ if (n%2 == 0): # Uso la función resto para reconocer los PARES
+ outlist.append(n) # Los guardo en una lista para poder mostrarlos horizontalmente
+print ('Los pares son', outlist) # R=> Los pares son [0, 2, 4, 6, 8]
-print(primeros_10)
-# [0, 1, 0, 3, 0, 5, 0, 7, 0, 9]
+# Ej 18) Recorrer una lista con su índice y ver error fuera de rango
-for n in primeros_10:
- print(primeros_10[n])
-print("\va de nuevo....\n")
-"""
-0
-1
-0
-3
-0
-5
-0
-7
-0
-9
-va de nuevo....
-"""
+print(primeros_10[9]) # R=> 9, el valor existe dentro del rango
+primeros_10 = ['a','b','c','d'] # Esta lista de str, tiene 4 elm, índices del 0 al 3.
+primeros_10[4] # Al intentar accesar a una posición que NO existe, retornará un error (out of range)
-print(primeros_10[9])
-# 9
-primeros_10 = ['a','b','c','d']
-primeros_10[4]
-"""
----------------------------------------------------------------------------
-IndexError Traceback (most recent call last)
- in
-----> 1 primeros_10[4]
-
-IndexError: list index out of range
-"""
+# Ej 19) Uso de la función SEQUENCE - Recorre un rango
n = 40
sequence = [0,1]
for i in range(2,n):
diff --git a/Workbench/Taller/Problemasumas.py b/Workbench/Taller/Problemasumas.py
new file mode 100644
index 000000000..93d84b855
--- /dev/null
+++ b/Workbench/Taller/Problemasumas.py
@@ -0,0 +1,36 @@
+# Crear una clase Operación que solicite en el método __init__
+# la carga de dos enteros e inmediatamente muestre
+# su suma, resta, multiplicación y división.
+# Hacer cada operación en otro método de la clase Operación y llamarlos
+# desde el mismo método __init__
+
+class Operacion:
+
+ def __init__(self):
+ self.valor1=int(input("Ingrese primer valor:"))
+ self.valor2=int(input("Ingrese segundo valor:"))
+ self.sumar()
+ self.restar()
+ self.multiplicar()
+ self.dividir()
+
+ def sumar(self):
+ suma=self.valor1+self.valor2
+ print("La suma es",suma)
+
+ def restar(self):
+ resta=self.valor1-self.valor2
+ print("La resta es",resta)
+
+ def multiplicar(self):
+ multi=self.valor1*self.valor2
+ print("El producto es",multi)
+
+ def dividir(self):
+ divi=self.valor1/self.valor2
+ print("La division es",divi)
+
+
+# bloque principal
+
+operacion1=Operacion()
\ No newline at end of file
diff --git a/Workbench/Taller/TodasLasOperaciones.py b/Workbench/Taller/TodasLasOperaciones.py
new file mode 100644
index 000000000..1b7ae6522
--- /dev/null
+++ b/Workbench/Taller/TodasLasOperaciones.py
@@ -0,0 +1,27 @@
+class Operacion:
+
+ def __init__(self):
+ self.valor1=int(input("Ingrese primer valor:"))
+ self.valor2=int(input("Ingrese segundo valor:"))
+ self.sumar()
+ self.restar()
+ self.multiplicar()
+ self.dividir()
+
+ def sumar(self):
+ suma=self.valor1+self.valor2
+ print("La suma es",suma)
+
+ def restar(self):
+ resta=self.valor1-self.valor2
+ print("La resta es",resta)
+
+ def multiplicar(self):
+ multi=self.valor1*self.valor2
+ print("El producto es",multi)
+
+ def dividir(self):
+ divi=self.valor1/self.valor2
+ print("La division es",divi)
+
+operacion1=Operacion()
\ No newline at end of file
diff --git a/Workbench/Taller/listas.py b/Workbench/Taller/listas.py
index fc5b6cc56..964da9bd3 100644
--- a/Workbench/Taller/listas.py
+++ b/Workbench/Taller/listas.py
@@ -1,51 +1,51 @@
#*******************************************************************
#* *
-#* TEORIA LISTAS *
-#* *
+#* TEORIA LISTAS - TUPLAS - DICCIONARIOS - ETC *
+#* C O L E C C I O N E S Y MUCHO MAAASSSS *
#*******************************************************************
# Una LIST, es un objeto, es una colección de cosas, pueden ser tareas,
-# vegetales, nombres
-# mercaderías, cualquier cosa.
+# vegetales, nombres, mercaderías, cualquier cosa.
-# Dos formas paa declararlas e iniciaizarlas
+# Dos formas para declararlas o iniciaizarlas, aunque hay otras.
# 1) Defino una variable y le asigno un tipo lista VACÍO con paréntesis
-empty_list1 = list() # Note que se debe indicar el tipo lista o lo considerará una TUPLA
-print (empty_list1, "esta es la lista 1 con '()'")
+empty_list1 = list() # Note que se debe indicar el tipo lista o lo
+print (empty_list1, "esta es la lista 1 con '()'") # considerará una TUPLA
print (type(empty_list1))
# 2) Defino una variable y sé que es del tipo lista por los corchetes '[]'
-empty_list2 = [] # A la variable se le asigna una lista vacía con CORCHETES
-print (empty_list2, "esta es la lista 2")
+empty_list2 = [] # A la variable se le asigna una lista vacía con
+print (empty_list2, "esta es la lista 2") # CORCHETES
print (type (empty_list2))
# Ejemplo 1
numbers = [1,2,3,4,5,6] # Lista de números
-print("'numbers' es del tipo ", type(numbers)) # De devolver el texto+ type 'list'
+print("'numbers' es del tipo ", type(numbers)) # Imprime un texto + su 'type'
# Ejemplo 2
-groceries = ["tomato", "carrot", "letuce"] # Una lista con 3 strings de 'vegentales'
-print (groceries [0]) # El puntero va con corchetes y parte de 0, imprime "tomato"
-print (numbers [3]) # Es una COLECCION, imprime todos los elementos
-print (len(groceries)) # Conocer el largo de la la lista con len, devuelve 3
+groceries = ["tomato", "carrot", "letuce"] # Una lista con 3 str de 'vegetales'
+print (groceries [0]) # El índice va con [] y parte en 0, imprime "tomato"
+print (numbers [3]) # Es 'la' COLECCION, imprime todos sus elementos
+print (len(groceries)) # LEN devuelve el largo de la lista con len, retorna 3
# Ejemplo 3
-lastname = "cordova" # Variable de tipo string, contiene "cordova"
-mix_of_data_types_list = [1, "Jota", lastname, 2+5, 1-3j, 3.14] # Lista con distintos tipos de var
-print ("'mix_of_data_types_list' es del tipo-", type(mix_of_data_types_list)) #devuelve 'list'
-#podemos almacenar un mix de datos
+lastname = "Cordova" # Variable de tipo string, contiene "Cordova"
+mix_of_data_types_list = [1, "Jota", lastname, 2+5, 1-3j, 3.14] # Lista con distintos tipos de var
+print ("'mix_of_data_types_list' es del tipo-", type(mix_of_data_types_list)) # devuelve un 'list'
+
+# Podemos almacenar cualquier 'mix' de datos u objetos, en Python TODO es un objeto
# Ejemplo 4
-listadeletras = [] # Crea un objeto list llamado listadeletras
-for unaletra in "paralelepipedo": # Define una variable 'unaletra' y recorre el string "paralelepípedo"
+listadeletras = [] # Crea un objeto list llamado listadeletras vacío
+for unaletra in "paralelepipedo": # Define una var 'unaletra' y recorre el string "paralelepípedo"
listadeletras.append(unaletra)# Agrega cada caracter del string a 'listadeletras' usando el método 'append'
print (listadeletras) # Imprime los valores de la lista que son los caracteres de la palabra 'paralelepípedo'', lo que sea
- # Salida esperada ['p', 'a', 'r', 'a', 'l', 'e', 'l', 'e', 'p', 'i', 'p', 'e', 'd', 'o']
+ # Salida esperada ['p', 'a', 'r', 'a', 'l', 'e', 'l', 'e', 'p', 'í', 'p', 'e', 'd', 'o']
# Ejemplo 5
-# Crear una lista de 4 elementos y, para cada elemento, calcularle la potencia de 2, usando
-# el método tradicional, eso seria así:
+# Crear una lista de 4 elementos y, para cada elemento, calcularle su potencia de 2, usando
+# el método tradicional, eso seria así, luego veremos con expresiones o por comprensión:
# Alternativa 1
lista_potencias = [] # Crea una lista llamada "lista_potencias"
for i in range(4): # Ciclo for para recorrer lista de 4 elementos, va de 0 a 3, el índice lo llamamos "i"
@@ -53,24 +53,24 @@
print(lista_potencias) # Imprime los 4 valores almacendaos en la lista [0, 1, 4, 9]
# Ejemplo 6
-# Entonces el ejemplo anterior usando listas de comprensión, eso seria así:
-lista_potencias2 = [i**2 for i in range(4)] # Usa un for
+# El ejemplo 5, usando listas por comprensión (es decir, fórmulas o expresiones), seria así:
+lista_potencias2 = [i**2 for i in range(4)] # Usa un FOR
print ("Esta es la lista de potencias Nr2", lista_potencias2) # Imprime [0, 1, 4, 9]
# Ejemplo 7
# Lista con las potencias de 2 de los primeros 10 números, método tradicional:
# Alternativa 1
lista1_pot10_2 = [] # Creamos un objeto lista vacio []
-for num in range (0, 11): # Incluye el primero y no el últimmo. Usando un ciclo FOR usando la var "num" en el tramo de 0-10, ambos incluidos
+for num in range (0, 11): # Incluye el 1ro, pero no el últimmo. Recorremos el rangoUsando un ciclo FOR usando la var "num" en el tramo de 0-10, ambos incluidos
lista1_pot10_2.append (num**2) # Llenamos la lista con potencias PARTIENDO DE 0, a 10 (11-1)
print(lista1_pot10_2) # Salida por pantalla [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# Alternativa 2
-#Entonces el ejemplo anterior usando listas de comprensión, eso seria así:
-#lista2_pot10_2 = [num2**2 for num2 in range(0, 11)] #Creamos la lista con los valores según condición
-#print("Este es el método 3-2, para crear la lista de 10 números y sus potencias",lista2_pot10_2)
-#[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
-#De este código anterior usted puede aprender que es posible modificar al vuelo los elementos los cuales van a formar la lista.
+# Usando listas por comprensión, seria así:
+lista2_pot10_2 = [num2**2 for num2 in range(0, 11)] #Creamos la lista con los valores según condición
+print("Aquí usamos una expresión para crear la lista de 10 nros. y sus potencias",lista2_pot10_2)
+# R=> Aquí usamos una expresión para crear la lista de 10 nros. y sus potencias [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
+# Con este método, es más simple modificar los elementos que van a la lista.
# Ejemplo 8
# Este ejemplo muestra como operan las posiciones en una lista (cada elemento es una posX)
@@ -85,7 +85,7 @@
print("7° Mostrar 'lista[::-1]', significa mostrar todos los elementos de la lista en orden inverso\n",lista[::-1]) # tomamos desde el final hasta el principip (orden inverso)
# Ejemplo 9
-# Con este ejemplo usamos un truco para controlar la salida, un método de print llamado end
+# Usamos un truco para controlar la salida, un método de print llamado end
#
for i in range (15):
if i < 14:
@@ -94,80 +94,305 @@
print (i)
# Ejemplo 10
-# Mismo ejemplo sin controlar la salida, cada linea se ejecuta y se apilan.
+# Mismo ejemplo sin controlar la salida, cada linea se ejecuta y se apila.
for i in range (15):
- print (i)
+ print (i) # No agregué el print por espacio ...se ve muy feo
# Ejemplo 11
-# Revisar otra formas de ordenar listas
+# Revisar otra formas de ordenar listas (pero en este archivo van muchas)
lista_desordenada = [5,7,2,8,3,6]
-lista_desordenada.sort()
+lista_desordenada.sort() # Usamos el método SORT
print ("Resultado esperado 2,3,5,6,7,8, lista generada :", lista_desordenada)
-print (type(lista_desordenada))
+print (type(lista_desordenada)) # Verifico, como medida extra, el tipo de dato generado
# Ejemplo 12
# Lista negada = los inversos y lista doble = multiplicadas por algo
+# Hay que acostumbrarse a usar 'trucos' para resolver la lógica de los problemas
lista = [10, 20, 30]
-lista_negada = [ -e for e in lista ] # Los inversos de los elementos
-lista_doble = [ e*2 for e in lista] # Los elementos multiplicados por 2
-print(lista_negada)
-print(lista_doble)
+lista_negada = [ -e for e in lista ] # Es por comprensión. Genera los inversos de los elementos
+lista_doble = [ e*2 for e in lista] # Esta genera los elementos multiplicados por 2
+print(lista_negada) # Todos negativos
+print(lista_doble) # Todos x 2
# Ejemplo 13
-# Una lista de valores float, no se pueden negar strings
-lista2 = [True, True, False, 5, 2-3j]
-lista_negada2 = [ -e for e in lista2] # Los inversos de los elementos numéricos
-lista_doble2 = [ e*2 for e in lista2] # Los elementos multiplicados por 2
+# Ojo!! No se pueden negar valores float o strings.
+lista2 = [True, True, False, 5, 2-3j] # Ojo con los BOOLEANOS
+lista_negada2 = [ -e for e in lista2] # Los inversos de los elementos numéricos
+lista_doble2 = [ e*2 for e in lista2] # Los elementos multiplicados por 2
print(lista_negada2) # Nótese la salida [-1, -1, 0, -5, (-2+3j)], los booleanos los tomo como 1 y 0
print(lista_doble2) # Nótese la salida [2, 2, 0, 10, (4-6j)], fijarse en los booleanos
# Ejemplo 14
-# Con un ciclo for, alimenta dos listas dependiendo de una condición y muestra la información horizontal.
+# Usando 1 ciclo FOR, poblar 2 listas dependiendo de una condición y mostrar la información horizontal.
lista_i = []
lista_p = []
-for i in range (1,21):
+for i in range (1,11):
n=(i%2)
if n==1:
lista_i.append (i)
elif n==0:
lista_p.append (i)
-print ("Los números impares entre 1 y 20 son ", lista_i)
-print ("Los números pares entre 1 y 20 son ", lista_p)
+print ("Los números impares entre 1 y 10 son ", lista_i)
+print ("Los números pares entre 1 y 10 son ", lista_p)
# Ejemplo 15
# Usos de 'enumerate' en listas, tuplas, diccionarios, cadenas
-for i, val in enumerate(['A', 'B', 'C']):
+for i, val in enumerate(['A', 'B', 'C']): # ENUMERATE recorre la lista y su ÍNDICE
print(i, val)
-"""
-0 A
-1 B
-2 C
-"""
-
-# En este caso imprime la posición o puntero, y el contenido de la posición, vertical
+# 0 A
+# 1 B
+# 2 C
+# En este caso imprime la posición, índice, o puntero, y el contenido de la posición, verticamente
+# Cómo o haría para mostrarlo horizontalmente?
+#
# Ejemplo 16
for i, val in enumerate(['A', 'B', 'C'], start=5): # Mismo anterior, pero cambia el valor del puntero que parte en 5
print(i, val)
-"""
-5 A
-6 B
-7 C
-"""
-# La salida va de 5 a 7
+# 5 A
+# 6 B
+# 7 C La salida va de 5 a 7
+
# Ejemplo 17
-# En este caso va de 5 a 14, se salta 3, y el puntero inicia en 1
+# En este caso va de 5 a 14, se salta de a 3, y el puntero inicia en 1
for i, val in enumerate(range(5, 15, 3), start=1):
print(f'Pos: {i} -> {val}')
-"""
-Pos: 1 -> 5
-Pos: 2 -> 8
-Pos: 3 -> 11
-Pos: 4 -> 14
-"""
# La salida va con los textos 'Pos: ' y '->'
+# Pos: 1 -> 5
+# Pos: 2 -> 8
+# Pos: 3 -> 11
+# Pos: 4 -> 14
print ("")
-# Ejemplo
\ No newline at end of file
+# Ejemplo 18
+# Iterar 2 listas usando un FOR y ZIP
+a = [1, 2]
+b = ["Uno", "Dos"]
+c = zip(a, b)
+for numero, texto in zip(a, b):
+ print("Número", numero, "Letra", texto)
+ print(type(numero), type(texto))
+# Número 1 Letra Uno
+#
+# Número 2 Letra Dos
+#
+
+# Ejemplo 19) zip() con n argumentos - Ejemplo con varias listas
+# Como ZIP está definida como, zip(*iterables) o cualquier iterable,
+# es posible pasar un número arbitrario de iterables como entrada.
+# Es importante notar, que todas tienen la misma longitud, dos.
+# Es necesario experimentar para tener una 'idea' cuando toque
+
+numeros = [1, 2]
+espanol = ["Uno", "Dos"]
+ingles = ["One", "Two"]
+frances = ["Un", "Deux"]
+c = zip(numeros, espanol, ingles, frances)
+for n, e, i, f in zip(numeros, espanol, ingles, frances):
+ print(n, e, i, f)
+# Note la forma en que organiza la salida de los datos en pares
+# 1 Uno One Un
+# 2 Dos Two Deux
+
+# Ejemplo 20 - Caso: Hacer zip() con listas de diferentes longitudes
+# Podemos usar zip con iterables de diferentes longitudes.
+# En este caso, el iterador se detiene, cuando la lista más pequeña se acaba.
+
+numeros = [1, 2, 3, 4, 5]
+espanol = ["Uno", "Dos"]
+for n, e in zip(numeros, espanol):
+ print(n, e)
+# Ojo!, sólo completa los dos primeros pares
+# 1 Uno
+# 2 Dos
+
+# Ejemplo 21 - Caso: zip() con un argumento
+# Por definición, se puede hacer, porque ZIP está definido para un 'n' arbitrario
+# de listas, ergo, también es posible usar un único valor.
+# El resultado son tuplas de un elemento...raras, pero se puede.
+
+numeros = [1, 2, 3, 4, 5]
+zz = zip(numeros) # ZIP de si mismo
+print (list(zz)) # R=> [(1,), (2,), (3,), (4,), (5,)]
+
+# Ejemplo 22 - Caso: zip() con diccionarios
+# Lo común es usar ZIP con listas, pero al estar definida para cualquier clase iterable.
+# Podemos usarla con DICCIONARIOS.
+
+# Por ejemplo, si (a,b) toman los valores de las key del diccionario, no parece muy interesante.
+
+esp = {'1': 'Uno', '2': 'Dos', '3': 'Tres'}
+eng = {'1': 'One', '2': 'Two', '3': 'Three'}
+
+for a, b in zip(esp, eng):
+ print(a, b)
+# 1 1
+# 2 2
+# 3 3
+
+# Sin embargo, si usamos la función items del tipo DICT, podemos acceder
+# al key y al value de cada elemento.
+# Se puede facilitar para modificar valores usando, e.g casteo de dict a list y viceversa
+esp = {'1': 'Uno', '2': 'Dos', '3': 'Tres'}
+eng = {'1': 'One', '2': 'Two', '3': 'Three'}
+
+for (k1, v1), (k2, v2) in zip(esp.items(), eng.items()):
+ print(k1, v1, v2)
+# Nótese que en este caso ambas key k1 y k2 son iguales.
+# 1 Uno One
+# 2 Dos Two
+# 3 Tres Three
+
+# Ejemplo 23 - Caso: Deshacer el zip()
+# Es posible deshacer un zip, en una sola línea de código.
+# Supongamos que hemos usado zip para obtener 'c'.
+
+a = [1, 2, 3]
+b = ["One", "Two", "Three"]
+c = zip(a, b)
+
+print (list(c)) # R=> [(1, 'One'), (2, 'Two'), (3, 'Three')]
+# ¿Es posible obtener a y b desde c? Sí, tan sencillo como:
+c = [(1, 'One'), (2, 'Two'), (3, 'Three')]
+a, b = zip(*c)
+print(a) # (1, 2, 3)
+print(b) # ('One', 'Two', 'Three')
+
+# Uso de STRIP Ejemplo 24 - STRIP eliminar espacios, cadenas de texto, incluso comparar
+# Este ejemplo es como un "A inter B"
+colores = ['yellow', 'wine', 'blue', 'green', 'red', 'brown', 'red']
+sec_colr = ['blue', 'green', 'red']
+
+strColores = str(colores).strip("[]")
+strSec_colr = str(sec_colr).strip("[]")
+
+if strSec_colr in strColores:
+ print("Si")
+else:
+ print("No")
+
+# Ejemplo 24 - Usar listas como PILAS
+# Los métodos de lista, facilitan usar una lista como una pila (stack), donde el
+# último elemento añadido es el primer elemento retirado (LIFO). Para agregar un
+# elemento a la cima de la pila, utilizamos APPEND(). Para retirar un elemento de la
+# cima de la pila, se utiliza POP() sin un índice explícito. Por ejemplo:
+
+mi_pila = [3, 4, 5]
+mi_pila.append(6)
+mi_pila.append(7)
+print (mi_pila) # R=> [3, 4, 5, 6, 7]
+mi_pila.pop() # R=> Elimina el 7, y lo guarda en memoria hasta que lo ocupe otro
+print (mi_pila) # Chequeamos si está el 7 y no está en la lista R=> [3, 4, 5, 6]
+mi_pila.pop() # El siguiente elemento eliminado será el 6. R=> 6
+mi_pila.pop() # Ahora elimina el 5, R=> 5
+print (mi_pila) # verificamos y vemos que se han borrado los elementos. R=> [3, 4]
+
+# Ejemplo 25 - Usar listas como COLAS
+# También es posible usar una lista como una cola, donde el primer elemento añadido
+# es el primer elemento retirado (FIFO); sin embargo, las listas no son eficientes
+# para este propósito. Agregar y sacar del final de la lista es rápido, pero
+# insertar o sacar del comienzo de una lista es lento (porque todos los otros
+# elementos tienen que ser desplazados en uno).
+# Para implementar una cola, utiliza 'COLLECTIONS.DEQUE', el cual fue diseñado para
+# añadir y quitar de ambas puntas de forma rápida. Por ejemplo:
+
+from collections import deque
+
+mi_Cola = deque(["Pedro", "Juan", "Diego"]) # Están Pedro, Juan y Diego en la cola
+mi_Cola.append("Luis") # Llega Luis
+print (mi_Cola) # R=> (['Pedro', 'Juan', 'Diego', 'Luis'])
+mi_Cola.append("Jorge") # Llega Jorge
+print (mi_Cola) # R=> (['Pedro', 'Juan', 'Diego', 'Luis', 'Jorge'])
+print(mi_Cola.popleft()) # El primero en llegar se va => Pedro
+print(mi_Cola) # R=> ('Juan', 'Diego', 'Luis', 'Jorge'])
+print(mi_Cola.popleft()) # Ahora se va el segundo en llegar R=> Juan
+print(mi_Cola) # R=> ('Diego', 'Luis', 'Jorge'])
+ # La lista restante en orden de llegada
+
+# Ejemplo 26 - Comprensión de listas . MUY IMPORTANTE ENTENDERLO BIEN !!
+# Permite usar expresiones y condiciones para poblar una lista.
+# Sus usos comunes son para hacer nuevas colecciones donde cada elemento es el resultado
+# de algunas operaciones aplicadas a cada miembro de otra secuencia o iterable, o
+# para crear un segmento de la secuencia de esos elementos para satisfacer una
+# condición determinada ==> Es muy parecido a EXRESIONES REGULARES (import re),
+# que son fundamentales en ciencia de datos.
+
+# Por ejemplo, queremos crear una lista de cuadrados, como:
+
+cuadrados1 = []
+for x in range(10):
+ cuadrados1.append(x**2) # Agrega los cuadrados en el rango 0-10, a lista cuadrados
+print (cuadrados1) # => [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
+
+# Nótese que esto crea (o sobreescribe) una variable llamada x que sigue existiendo
+# luego de que el bucle haya terminado. sin embargo, podemos aplicar listas por
+# COMPRENSIÓN, poblando la lista de cuadrados sin efecto secundario haciendo:
+
+cuadrados2 = list(map(lambda x: x**2, range(10))) # Usamos una función lambda y map
+cuadrados3 = [x**2 for x in range(10)] # otra expresión equivalente sería:
+ # lo cual es más conciso y legible.
+
+# Una lista por comprensión, consta de corchetes rodeando una expresión seguida de la
+# declaración FOR, y luego 0 o más declaraciones FOR o IF. El resultado será una
+# nueva lista que sale de evaluar la expresión, en el contexto de los FOR o IF que le
+# siguen. Por ejemplo, esta lista de comprensión combina los elementos de 2 listas
+# si no son iguales:
+
+# Ejemplo 27 Lista Distintos
+#
+[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y] # R=> [(1, 3), (1, 4), (2, 3),
+ # (2, 1), (2, 4), (3, 1), (3, 4)]
+
+# y es equivalente a:
+
+combinar_listaDistintos = []
+for x in [1,2,3]:
+ for y in [3,1,4]:
+ if x != y:
+ combinar_listaDistintos.append((x, y))
+print (combinar_listaDistintos) # R=> [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1),
+ # (3, 4)]
+# Nótese como el orden de los for e if es el mismo en ambos pedacitos de código.
+# Si la expresión es una tupla (como el (x, y) en el ejemplo anterior), debe estar entre paréntesis.
+
+# Ejemplo 28 - Operaciones con vectores
+vector1 = [-4, -2, 0, 2, 4] # Crear un nueva lista con los valores *2
+vector2 = [x*2 for x in vector1] # Llenamos la lista, usando una expresión que calcula x^2
+print ("La lista de los x^2, del Vector 1 es ", vector2) # Comprobamos el resultado imprimiento la lista, OK! R=> [-8, -4, 0, 4, 8]
+# Filtrar la lista para excluir los valores negativos
+vector3 = [x for x in vector2 if x >= 0] # Esta expresión, llena la lista, separando positivos de negativos.
+print (vector3) # Comprobamos el resultado imprimiento la lista, OK! R=> [0, 2, 4]
+# Creamos una nueva lista, aplicado una función de valor absoluto (abs) a todos los elementos del vector1
+vector4 = [abs(x) for x in vector1] # Llenamos vector 4 con el resultado
+print (vector4) # Comprobamos el resultado imprimiento la lista, OK! R=> [4, 2, 0, 2, 4]
+
+# Ejemplo 29 Limpiar datos usando STRIP
+# También usamos expresiones para tareas repetitivas.
+# En este ejemplo se usa la función STRIP para recortar los espacios en blanco
+
+fruta_fresca = [' banana', ' mora ', 'kiwi '] # Nótese que el 'raw data', viene con espacios a ambos lados del str
+[cortar_espacios.strip() for cortar_espacios in fruta_fresca] # Al aplicar la función STRIP, se recortan los espacios
+# La lista resultante queda R=> ['banana', 'mora', 'kiwi']
+
+# Ejemplo 30 - Crear una lista de 2 tuplas como (número, su_cuadrado)
+#
+lista_cuad = [(x, x**2) for x in range(6)] # Recordar, va de 0 a 5, excluye el lim_sup del intervalo
+print ('La lista de pares (x, x^2), es ', lista_cuad)
+# La lista de pares (x, x^2), es [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
+# La expresión a comparar (x, x**2), debe estar entre paréntesis, de lo contrario se genera un error
+
+# Ejemplo 31 - Aplanar una lista usando listas compuestas (listcomp) con dos 'FOR'
+
+vec = [[1,2,3], [4,5,6], [7,8,9]] # vec es un arreglo de listas y queremos ponerlas en una sola lista
+flat_vec= [num for elem in vec for num in elem] # Nótese que en este caso no uso paréntesis, no es comparación o formula
+print ("La lista 'aplanada' es ", flat_vec) # La lista esperada R=>[1, 2, 3, 4, 5, 6, 7, 8, 9]
+
+# Ejemplo 32 - Listas anidades con expresiones complejas
+# Las listas por comprensión pueden contener expresiones complejas y funciones anidadas:
+
+from math import pi # Importamos una librería "MATH" que nos permite hacer cálculos científicos y usar constantes
+pi_evol= [str(round(pi, i)) for i in range(1, 6)] # Creamos una lista con incrementales de pi
+print ('Los valores incrementales de pi, son ', pi_evol)
+# R=> Los valores incrementales de pi, son ['3.1', '3.14', '3.142', '3.1416', '3.14159']
\ No newline at end of file
diff --git a/Workbench/Taller/pruebaerror.ipynb b/Workbench/Taller/pruebaerror.ipynb
new file mode 100644
index 000000000..a4c670a96
--- /dev/null
+++ b/Workbench/Taller/pruebaerror.ipynb
@@ -0,0 +1,586 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "class Clase:\n",
+ " atributo_clase = \"Hola\" # Accesible desde el exterior\n",
+ " __atributo_clase = \"Hola\" # No accesible\n",
+ "\n",
+ " # No accesible desde el exterior usando guión bajo\n",
+ " def __mi_metodo(self):\n",
+ " print(\"Haz algo\")\n",
+ " self.__variable = 0\n",
+ "\n",
+ " # Este código es accesible desde el exterior\n",
+ " def metodo_normal(self):\n",
+ " # El método si es accesible desde el interior\n",
+ " self.__mi_metodo()\n",
+ "\n",
+ "mi_clase = Clase()\n",
+ "#mi_clase.__atributo_clase # Error! El atributo no es accesible\n",
+ "#mi_clase.__mi_metodo() # Error! El método no es accesible\n",
+ "mi_clase.atributo_clase # Ok!\n",
+ "mi_clase.metodo_normal() # Ok!\n",
+ "print (mi_clase._Clase__atributo_clase)\n",
+ "# 'Hola'\n",
+ "mi_clase._Clase__mi_metodo()\n",
+ "# 'Haz algo'"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "class Vehiculo:\n",
+ " def __init__(self, color, tipo, cilindrada):\n",
+ " self.color = color\n",
+ " self.tipo = tipo\n",
+ " self.cilindrada = cilindrada\n",
+ " self.velocidad = 0 # Aquí creamos el atributo velocidad, no se requieren 2\n",
+ " self.direccion = 0 # Aquí creamos el atributo velocidad\n",
+ "\n",
+ " def Acelerar(self, vel): # Recibe un parámetro velocidad\n",
+ " self.velocidad += vel # Este es método que modifica el atributo velocidad\n",
+ "\n",
+ " def Frenar(self, vel): # Recibe un parámetro velocidad, es sólo un valor\n",
+ " self.velocidad -= vel # Calcula la nueva velocidad\n",
+ " \n",
+ " def Doblar(self, grados): # Recibe la cantidad de grados de l giro (0-360)\n",
+ " self.direccion += grados # Calcula la nueva dirección\n",
+ " \n",
+ " def Estado(self):\n",
+ " print('La velocidad actual es :', self.velocidad, '- y su rumbo es:', self.direccion, 'grados')\n",
+ "\n",
+ " def Detalle(self):\n",
+ " print('Soy del tipo ', self.tipo, 'de color', self.color, 'y mi cilindrada es de', self.cilindrada, 'litros')\n",
+ "\n",
+ "# 3) Instanciar 3 objetos de la clase vehículo y ejecutar sus métodos, probar luego\n",
+ "# el resultado\n",
+ "\n",
+ "a1 = Vehiculo ('rojo', 'auto', 2)\n",
+ "a2 = Vehiculo ('blanco', 'camioneta', 3.6)\n",
+ "a3 = Vehiculo ('negro', 'moto', 1)\n",
+ "\n",
+ "#a1.Acelerar(40)\n",
+ "a2.Acelerar(60)\n",
+ "a3.Acelerar(30)\n",
+ "#a1.Doblar(30)\n",
+ "a3.Doblar(30)\n",
+ "a2.Frenar(50)\n",
+ "a1.Doblar(100)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "blanco 10 3.6\n",
+ "Soy del tipo auto de color rojo y mi cilindrada es de 2 litros\n",
+ "La velocidad actual es : 0 - y su rumbo es: 0 grados\n"
+ ]
+ }
+ ],
+ "source": [
+ "print (a2. color, a2.velocidad, a2.cilindrada)\n",
+ "a1 = Vehiculo('rojo', 'auto', 2)\n",
+ "a1.Detalle()\n",
+ "a1.Estado()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print (a1.velocidad) # Tenía 0, le sume 40, queda en 40\n",
+ "print (a2.velocidad) # Tenía 0, le sume 40, queda en 60\n",
+ "print (a3.velocidad) # Tenía 0, le sume 40, queda en 30\n",
+ "print (a1.direccion) # Tenía 0 grados, queda en 30\n",
+ "print (a3.direccion) # Tenía 0 grados, queda en -30\n",
+ "print (a2.velocidad) # Frena y DISMINUYE (resta -50), debe quedar en 10"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "class Operacion:\n",
+ "\n",
+ " def __init__(self):\n",
+ " self.valor1=int(input(\"Ingrese primer valor:\"))\n",
+ " self.valor2=int(input(\"Ingrese segundo valor:\"))\n",
+ " self.sumar()\n",
+ " self.restar()\n",
+ " self.multiplicar()\n",
+ " self.dividir()\n",
+ "\n",
+ " def sumar(self):\n",
+ " suma=self.valor1+self.valor2\n",
+ " print(\"La suma es\",suma)\n",
+ "\n",
+ " def restar(self):\n",
+ " resta=self.valor1-self.valor2\n",
+ " print(\"La rersta es\",resta)\n",
+ "\n",
+ " def multiplicar(self):\n",
+ " multi=self.valor1*self.valor2\n",
+ " print(\"El producto es\",multi)\n",
+ "\n",
+ " def dividir(self):\n",
+ " divi=self.valor1/self.valor2\n",
+ " print(\"La division es\",divi)\n",
+ "\n",
+ "\n",
+ "# bloque principal\n",
+ "\n",
+ "#operacion1=Operacion5\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "\n",
+ "for n in range(1,11): #Incluye el primero y excluye el último\n",
+ " print(n,(')'))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "n = 1\n",
+ "while (n < 11):\n",
+ " print(n)\n",
+ " n = n + 1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['Azul', 'Amarillo', 'Naranja', 'Violeta', 'Verde']\n"
+ ]
+ }
+ ],
+ "source": [
+ "mi_lista = ['Rojo','Azul','Amarillo','Naranja','Violeta','Verde'] # Lista de 6 elementos\n",
+ "\n",
+ "print(mi_lista[1:]) # Imprime la lista desde la posición 1, hasta el final, \n",
+ "#"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['Rojo', 'Azul', 'Amarillo', 'Negro', 'Naranja', 'Violeta', 'Verde']\n"
+ ]
+ }
+ ],
+ "source": [
+ "#mi_lista.insert(3,'Negro')\n",
+ "print(mi_lista)\n",
+ "#print(type(mi_lista.index('Azul')))\n",
+ "#print(mi_lista[1])\n",
+ "#mi_lista.insert(3,'Negro')\n",
+ "\n",
+ "#n = 1\n",
+ "#while (n < 11):\n",
+ "# mi_lista.remove('Negro')\n",
+ "# n = n + 1\n",
+ "#mi_lista.remove('Blanco')\n",
+ " \n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# ultimo = mi_lista.pop() # Remueve el último elemento de la lista,\n",
+ "# print (mi_lista) # Falta el 'Verde'\n",
+ "#ultimo = mi_lista.pop()\n",
+ "#print(ultimo) #Conserva el último elemento eliminado con POP, si ejecuto otra vez, elimina violeta."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "mi_tupla = ('Rojo','Azul','Amarillo','Naranja','Rojo','Violeta','Rojo','Verde')\n",
+ "mi_tupla.count('Rojo')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "mi_tupla='Gaspar', 5, 8, 1999\n",
+ "#print (type(mi_tupla[3]))\n",
+ "nombre, dia, mes, año = mi_tupla\n",
+ "print (mi_tupla)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "nombre = 'Darío' # Inicializo var nombre con el str 'Darío'\n",
+ "edad = 39 # Inicilizo var edad con el int 39\n",
+ "print(nombre, edad) # Imprimo el contenido de las variables.\n",
+ "print(\"Mi nombre es\", nombre, \". Mi edad es\", edad, \"años\")\n",
+ "print(\"Mi nombre es {}. Mi edad es {} años\". format(nombre, edad))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "mi_diccionario = { 'Colores Primarios': ['Rojo','Azul','Amarillo'], # Crear con {key:Elm, key:Elm...}\n",
+ " 'Colores secundarios': ['Naranja','Violeta','Verde'], # Elm= Cualquier cosa, mutable\n",
+ " 'Clave3': 10, # Key= Hasheable, inmutable\n",
+ " 'Clave4': False}\n",
+ "#print (mi_diccionario['Colores secundarios']) # Lo puedo acceder por sus claves o índices y retorna los VALORES\n",
+ "# R=> ['Naranja', 'Violeta', 'Verde'] # Para la clave dad, retorno los elementos respectivos\n",
+ "\n",
+ "mi_diccionario2 = {'Clave1':'Valor1', 'Clave2':{'numeros':[1,2,3,4,5]}} # Dic key1=str y val1=str, key2=str, val2=lista\n",
+ "print (mi_diccionario2.keys()) # Retorna R=> dict_keys(['Clave1', 'Clave2'])\n",
+ "print(mi_diccionario2.values()) # Retorna R=> dict_values(['Valor1', {'numeros': [1, 2, 3, 4, 5]}])\n",
+ "len (mi_diccionario) # Retorna el número de pares R=>2\n",
+ "print(mi_diccionario2)\n",
+ "print(type(mi_diccionario2.keys[1]))\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "edad = 60\n",
+ "edad_compa = 50\n",
+ "if (edad < edad_compa):\n",
+ " print(edad)\n",
+ " if (edad < 100):\n",
+ " print(edad + 100)\n",
+ " else:\n",
+ " print(edad - 100)\n",
+ "else:\n",
+ " print(edad_compa)\n",
+ "# 50\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "primeros_10 = [0,1,2,3,4,5,6,7,8,9]\n",
+ "# print(primeros_10) # R=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n",
+ "outlist = []\n",
+ "for n in primeros_10: # For 'var' in 'lista/tupla/dict'\n",
+ " if (n%2 == 0): # Uso la función resto para reconocer los PARES \n",
+ " outlist.append(n)\n",
+ " #primeros_10[n]=0\n",
+ "print ('Los pares son', outlist)\n",
+ "#print(\"\\va de nuevo....\\n\")\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "outlist = []\n",
+ "for n in primeros_10: # For 'var' in 'lista/tupla/dict'\n",
+ " if (n%2 == 0): # Uso la función resto para reconocer los PARES \n",
+ " outlist.append(n) # Los guardo en una lista para poder mostrarlos horizontalmente \n",
+ "print ('Los pares son', outlist) "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "n = 40\n",
+ "sequence = [0,1]\n",
+ "for i in range(2,n):\n",
+ " sequence.append(sequence[i-1]+sequence[i-2])\n",
+ "print (sequence)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "a = [1, 2]\n",
+ "b = [\"Uno\", \"Dos\"]\n",
+ "c = zip(a, b)\n",
+ "for numero, texto in zip(a, b):\n",
+ " print(\"Número\", numero, \"Letra\", texto)\n",
+ " print(type(numero), type(texto))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "colores = ['yellow', 'wine', 'blue', 'green', 'red', 'brown', 'red']\n",
+ "sec_colr = ['blue', 'green', 'red']\n",
+ "\n",
+ "\n",
+ "strColores = str(colores).strip(\"[]\")\n",
+ "strSec_colr = str(sec_colr).strip(\"[]\")\n",
+ "\n",
+ "if strSec_colr in strColores:\n",
+ " print(\"Si\")\n",
+ "else:\n",
+ " print(\"No\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "hola = ' \\t\\t\\n\\tHola \\n '\n",
+ "print(hola)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "hola_limpio = hola.strip()\n",
+ "print(type(hola_limpio))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "texto = ' hola mundo hola \\ni'\n",
+ "print(texto.strip(' oahl'))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "colores = ['yellow', 'wine', 'blue', 'green', 'red', 'brown', 'red']\n",
+ "sec_colr = ['blue', 'green', 'red']\n",
+ "\n",
+ "strColores = str(colores).strip(\"[]\")\n",
+ "strSec_colr = str(sec_colr).strip(\"[]\")\n",
+ "\n",
+ "if strSec_colr in strColores:\n",
+ " print(\"Si\")\n",
+ "else:\n",
+ " print(\"No\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from collections import deque\n",
+ "\n",
+ "mi_Cola = deque([\"Pedro\", \"Juan\", \"Diego\"]) # Están Pedro, Juan y Diego en la cola\n",
+ "mi_Cola.append(\"Luis\") # Llega Luis\n",
+ "print (mi_Cola) # R=> (['Pedro', 'Juan', 'Diego', 'Luis'])\n",
+ "mi_Cola.append(\"Jorge\") # Llega Jorge\n",
+ "print (mi_Cola) # R=> (['Pedro', 'Juan', 'Diego', 'Luis', 'Jorge'])\n",
+ "print(mi_Cola.popleft()) # El primero en llegar se va => Pedro\n",
+ "print(mi_Cola) # R=> ('Juan', 'Diego', 'Luis', 'Jorge'])\n",
+ "print(mi_Cola.popleft()) # Ahora se va el segundo en llegar R=> Juan\n",
+ "print(mi_Cola) # R=> ('Diego', 'Luis', 'Jorge'])\n",
+ " # La lista restante en orden de llegada"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from collections import deque\n",
+ "\n",
+ "queue = deque([\"Eric\", \"John\", \"Michael\"])\n",
+ "queue.append(\"Terry\") # Terry arrives\n",
+ "print (queue) # (['Eric', 'John', 'Michael', 'Terry'])\n",
+ "queue.append(\"Graham\") # Graham arrives\n",
+ "print (queue) # (['Eric', 'John', 'Michael', 'Terry', 'Graham'])\n",
+ "print(queue.popleft()) # The first to arrive now leaves\n",
+ "#print(queue.popleft()) # 'Eric'\n",
+ "print (queue) # (['John', 'Michael', 'Terry', 'Graham'])\n",
+ "print(queue.popleft()) # The second to arrive now leaves\n",
+ "print(queue.popleft()) #'John'\n",
+ "queue # Remaining queue in order of arrival\n",
+ "deque(['Michael', 'Terry', 'Graham'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "n = 40\n",
+ "sequence = [0,1]\n",
+ "for i in range(2,n):\n",
+ " sequence.append(sequence[i-1]+sequence[i-2])\n",
+ "print (sequence)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "cuadrados1 = []\n",
+ "for x in range(10):\n",
+ " cuadrados1.append(x**2) # Agrega los cuadrados en el rango 0-10, a lista cuadrados\n",
+ "print (cuadrados1) # => [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] \n",
+ "\n",
+ "# Nótese que esto crea (o sobreescribe) una variable llamada x que sigue existiendo \n",
+ "# luego de que el bucle haya terminado. sin embargo, podemos aplicar listas por \n",
+ "# COMPRENSIÓN, poblando la lista de cuadrados sin efecto secundario haciendo:\n",
+ "\n",
+ "cuadrados2 = list(map(lambda x: x**2, range(10))) # Usamos una función lambda y map\n",
+ "print (cuadrados1)\n",
+ "cuadrados3 = [x**2 for x in range(10)] # otra equivalente sería:\n",
+ "print (cuadrados1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "\n",
+ "lista_cuad = [(x, x**2) for x in range(6)]\n",
+ "print ('La lista de pares (x, x^2), es ', lista_cuad)\n",
+ "#[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Ejemplo - aplanar una lista usando un listas compuestas (listcomp) con dos 'FOR'\n",
+ "\n",
+ "vec = [[1,2,3], [4,5,6], [7,8,9]] # vec es un arreglo de listas\n",
+ "flat_vec= [num for elem in vec for num in elem] # Nótese que en este caso no uso paréntesis, no es comparación o formula\n",
+ "\n",
+ "print (\"La lista 'aplanada' es \", flat_vec) # La lista esperada R=>[1, 2, 3, 4, 5, 6, 7, 8, 9]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 148,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Los valores incrementales de pi, son ['3.1', '3.14', '3.142', '3.1416', '3.14159']\n"
+ ]
+ }
+ ],
+ "source": [
+ "from math import pi # Importamos una librería \"MATH\" que nos permite hacer cálculos científicos y usar constantes \n",
+ "pi_evol= [str(round(pi, i)) for i in range(1, 6)] # Creamos una lista con incrementales de pi\n",
+ "print ('Los valores incrementales de pi, son ', pi_evol)\n",
+ "# R=> Los valores incrementales de pi, son ['3.1', '3.14', '3.142', '3.1416', '3.14159']"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.6"
+ },
+ "orig_nbformat": 4,
+ "vscode": {
+ "interpreter": {
+ "hash": "d3777ed8f5fe800f0d3d1926318eb186c93d9a88e13881725c87e5bdd2f1dd1d"
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
From 1b3d34584484f53e76c21e2c0f88502976483b2a Mon Sep 17 00:00:00 2001
From: Jorge Cordova <55065873+jcordovaj@users.noreply.github.com>
Date: Sat, 28 Jan 2023 03:44:20 -0300
Subject: [PATCH 11/16] 2801230343 Up ejercicios de todo tipo
---
Workbench/OrdenaTuplas.py | 19 +
Workbench/Taller/AgregarElementosaObj.py | 30 +
Workbench/Taller/Clases.py | 57 ++
Workbench/Taller/DesafioProgra.py | 335 +++++++++
Workbench/Taller/Diccionarios.py | 42 +-
Workbench/Taller/EjerciciosVarios.py | 50 ++
Workbench/Taller/FuncionFactorial.py | 22 +
Workbench/Taller/ListaEnteros.py | 34 +
Workbench/Taller/Mix_ejercicios.py | 17 +-
Workbench/Taller/NumeroCapicua.py | 36 +
Workbench/Taller/OrdenaDic | 55 ++
Workbench/Taller/aritmetica.py | 2 +-
Workbench/Taller/listas.py | 12 +-
Workbench/Taller/pruebaerror.ipynb | 911 ++++++++++++++++++++++-
Workbench/Taller/variables.py | 23 +
15 files changed, 1620 insertions(+), 25 deletions(-)
create mode 100644 Workbench/OrdenaTuplas.py
create mode 100644 Workbench/Taller/AgregarElementosaObj.py
create mode 100644 Workbench/Taller/DesafioProgra.py
create mode 100644 Workbench/Taller/EjerciciosVarios.py
create mode 100644 Workbench/Taller/FuncionFactorial.py
create mode 100644 Workbench/Taller/ListaEnteros.py
create mode 100644 Workbench/Taller/NumeroCapicua.py
create mode 100644 Workbench/Taller/OrdenaDic
diff --git a/Workbench/OrdenaTuplas.py b/Workbench/OrdenaTuplas.py
new file mode 100644
index 000000000..34db83f4f
--- /dev/null
+++ b/Workbench/OrdenaTuplas.py
@@ -0,0 +1,19 @@
+#
+# Ordenar una lista de coches almacenados como tuplas
+#
+tuplas_coches = [('Rojo', '4859-A', 'A'), ('Azul', '2901-Z', 'M'), ('Gris', '1892-B', 'M')
+ ]
+# Ordenar los coches por matrícula
+ordenados = sorted(tuplas_coches, key=lambda coche : coche[1])
+print (ordenados)
+#[('Gris', '1892-B', 'M'), ('Azul', '2901-Z', 'M'), ('Rojo', '4859-A', 'A')]
+# Ordenar una lista de coches almacenados como diccionarios
+diccionarios_coches = [
+ {'color': 'Rojo', 'matricula': '4859-A', 'cambio': 'A'},
+ {'color': 'Azul', 'matricula': '2901-Z', 'cambio': 'M'},
+ {'color': 'Gris', 'matricula': '1892-B', 'cambio': 'M'}
+]
+ordenados = sorted(diccionarios_coches, key=lambda coche : coche['matricula'])
+print (ordenados)
+
+#[{'color': 'Gris', 'matricula': '1892-B', 'cambio': 'M'}, {'color': 'Azul', 'matricula': '2901-Z', 'cambio': 'M'}, {'color': 'Rojo', 'matricula': '4859-A', 'cambio': 'A'}]
\ No newline at end of file
diff --git a/Workbench/Taller/AgregarElementosaObj.py b/Workbench/Taller/AgregarElementosaObj.py
new file mode 100644
index 000000000..7765b0f21
--- /dev/null
+++ b/Workbench/Taller/AgregarElementosaObj.py
@@ -0,0 +1,30 @@
+# Ejercicio 442: Agregar elementos a un objeto conjunto con el método de instancia add().
+
+lenguajes = set()
+
+print(len(lenguajes))
+print(lenguajes)
+
+print()
+
+lenguajes.add('Python')
+print(len(lenguajes))
+print(lenguajes)
+
+print()
+
+lenguajes.add('Java')
+print(len(lenguajes))
+print(lenguajes)
+
+print()
+
+lenguajes.add('Java')
+print(len(lenguajes))
+print(lenguajes)
+
+print()
+
+lenguajes.add('java')
+print(len(lenguajes))
+print(lenguajes)
\ No newline at end of file
diff --git a/Workbench/Taller/Clases.py b/Workbench/Taller/Clases.py
index d071497fb..1bf3669b9 100644
--- a/Workbench/Taller/Clases.py
+++ b/Workbench/Taller/Clases.py
@@ -207,3 +207,60 @@ def hablar(self):
# Guau!
# Miau!
+# Ejercicio 8 - Crear clase Persona
+
+class Persona():
+
+ def __init__(self,nombre="",edad=0,dni=""):
+ self.nombre=nombre
+ self.edad=edad
+ self.dni=dni
+
+ @property
+ def nombre(self):
+ return self.__nombre
+
+ @property
+ def edad(self):
+ return self.__edad
+
+ @property
+ def dni(self):
+ return self.__dni
+
+ @nombre.setter
+ def nombre(self,nombre):
+ self.__nombre=nombre
+
+ def validar_dni(self):
+ letras = "TRWAGMYFPDXBNJZSQVHLCKE"
+ if len(self.__dni)!=9:
+ print("DNI incorrecto")
+ self.__dni = ""
+ else:
+ letra = self.__dni[8]
+ num = int(self.__dni[:8])
+ if letra.upper() != letras[num % 23]:
+ print("DNI incorrecto")
+ self.__dni = ""
+
+ @dni.setter
+ def dni(self,dni):
+ self.__dni=dni
+ self.validar_dni()
+
+ @edad.setter
+ def edad(self,edad):
+ if edad < 0:
+ print("Edad incorrecta")
+ self.__edad=0
+ else:
+ self.__edad=edad
+
+
+ def mostrar(self):
+ return "Nombre:"+self.nombre+" - Edad:"+str(self.edad)+" - DNI:"+self.dni
+
+ def esMayorDeEdad(self):
+ return self.edad>=18
+
diff --git a/Workbench/Taller/DesafioProgra.py b/Workbench/Taller/DesafioProgra.py
new file mode 100644
index 000000000..80a644552
--- /dev/null
+++ b/Workbench/Taller/DesafioProgra.py
@@ -0,0 +1,335 @@
+#*******************************************************************
+#* *
+#* SIMULACRO HENRY CHALLENGE *
+#* *
+#*******************************************************************
+
+def ListaDivisibles(numero, tope):
+ '''
+ Esta función devuelve una lista ordenada de menor a mayor con los números divisibles
+ por el parámetro número entre uno (1) y el valor del parámetro "tope"
+ Recibe dos argumentos:
+ numero: Numero entero divisor
+ tope: Máximo valor a evaluar a partir de uno (1)
+ Ej:
+ ListaDivisibles(6,30) debe retornar [6,12,18,24]
+ ListaDivisibles(10,5) debe retornar []
+ ListaDivisibles(7,50) debe retornar [7,14,21,28,35,42,49]
+ '''
+ #Tu código aca:
+ lista=[]
+ for i in range((tope)):
+ if (i+1)%numero==0:
+ lista.append(i+1)
+
+ return lista
+
+def Exponente(numero, exponente):
+ '''
+ Esta función devuelve el resultado de elevar el parámetro "numero" al parámetro "exponente"
+ Recibe dos argumentos:
+ numero: El número base en la operación exponencial
+ exponente: El número exponente en la operación exponencial
+ Ej:
+ Exponente(10,3) debe retornar 1000
+ '''
+ #Tu código aca:
+ exp=numero**exponente
+ return exp
+
+def ListaDeListas(lista):
+ '''
+ Esta función recibe una lista, que puede contener elementos que a su vez sean listas y
+ devuelve esos elementos por separado en una lista única.
+ En caso de que el parámetro no sea de tipo lista, debe retornar nulo.
+ Recibe un argumento:
+ lista: La lista que puede contener otras listas y se convierte a una
+ lista de elementos únicos o no iterables.
+ Ej:
+ ListaDeListas([1,2,['a','b'],[10]]) debe retornar [1,2,'a','b',10]
+ ListaDeListas(108) debe retornar el valor nulo.
+ ListaDeListas([[1,2,[3]],[4]]) debe retornar [1,2,3,4]
+ '''
+ #Tu código aca:
+ if type(lista) != list:
+ return None
+ else:
+ lista_final=[]
+ for elem in lista:
+ if isinstance(elem, list):
+ lista_final.extend(ListaDeListas(elem))
+ else:
+ lista_final.append(elem)
+ return lista_final
+
+
+
+ #return 'Funcion incompleta'
+
+def Factorial(numero):
+ '''
+ Esta función devuelve el factorial del número pasado como parámetro.
+ En caso de que no sea de tipo entero y/o sea menor que 0, debe retornar nulo.
+ Recibe un argumento:
+ numero: Será el número con el que se calcule el factorial
+ Ej:
+ Factorial(4) debe retornar 24
+ Factorial(-2) debe retornar nulo
+ Factorial(0) debe retornar 1
+ '''
+ #Tu código aca:
+ if (type(numero) != int):
+ return None
+ if (numero < 0):
+ return None
+ factorial = 1
+ for n in range(1, (numero)+1):
+ factorial = factorial * n
+ return factorial
+ #return 'Funcion incompleta'
+
+def ListaPrimos(desde, hasta):
+ '''
+ Esta función devuelve una lista con los números primos entre los valores "desde" y "hasta"
+ pasados como parámetro, siendo ambos inclusivos.
+ En caso de que alguno de los parámetros no sea de tipo entero y/o no sea mayor a cero, debe retornar nulo.
+ En caso de que el segundo parámetro sea mayor al primero, pero ambos mayores que cero,
+ debe retornar una lista vacía.
+ Recibe un argumento:
+ desde: Será el número a partir del cual se toma el rango
+ hasta: Será el número hasta el cual se tome el rango
+ Ej:
+ ListaPrimos(7,15) debe retornar [7,11,13]
+ ListaPrimos(100,99) debe retornar []
+ ListaPrimos(1,7) debe retonan [1,2,3,5,7]
+ '''
+ #Tu código aca:
+ lista=[]
+ if (type(desde) != int or type(hasta) != int):
+ return None
+ if (desde < 0 or hasta < 0):
+ return None
+ if (desde > hasta):
+ return lista
+ def esPrimo(num):
+ if num==2:
+ return True
+ for n in range (2,num):
+ if(num%n!=0):
+ continue
+ else:
+ return False
+ return True
+ for i in range(desde,(hasta+1)):
+ if esPrimo(i):
+ lista.append(i)
+
+ return lista
+
+
+def ListaRepetidos(lista):
+ '''
+ Esta función recibe como parámetro una lista y devuelve una lista de tuplas donde cada
+ tupla contiene un valor de la lista original y las veces que se repite. Los valores
+ de la lista original no deben estar repetidos.
+ Debe respetarse el orden original en el que aparecen los elementos.
+ En caso de que el parámetro no sea de tipo lista debe retornar nulo.
+ Recibe un argumento:
+ lista: Será la lista que se va a evaluar.
+ Ej:
+ ListaRepetidos([]) debe retornar []
+ ListaRepetidos(['hola', 'mundo', 'hola', 13, 14])
+ debe retornar [('hola',2),('mundo',1),(13,1),(14,1)]
+ ListaRepetidos([1,2,2,4]) debe retornar [(1,1),(2,1),(4,1)]
+ '''
+ #Tu código aca:
+ l=[]
+ if type(lista) != list:
+ return None
+ while len(lista)>0:
+ elemento=lista[0]
+ cuenta=lista.count(lista[0])
+ l.append((elemento,cuenta))
+ for i in range(lista.count(lista[0])):
+ lista.remove(elemento)
+ continue
+ return l
+
+def ClaseVehiculo(tipo, color):
+ '''
+ Esta función devuelve un objeto instanciado de la clase Vehiculo,
+ la cual debe tener los siguientes atributos:
+ Tipo: Un valor dentro de los valores posibles: ['auto','camioneta','moto']
+ Color: Un valor de tipo de dato string.
+ Velocidad: Un valor de tipo de dato float, que debe inicializarse en cero.
+ y debe tener el siguiente método:
+ Acelerar(): Este método recibe un parámetro con el valor que debe incrementar a la
+ propiedad Velocidad y luego retornarla.
+ Si la propiedad Velocidad cobra un valor menor a cero, debe quedar en cero.
+ Si la propiedad Velocidad cobra un valor mayor a cien, debe quedar en cien.
+ Recibe dos argumento:
+ tipo: Dato que se asignará al atributo Tipo del objeto de la clase Vehiculo
+ color: Dato que se asignará al atributo Color del objeto de la clase Vehiculo
+ Ej:
+ a = ClaseVehículo('auto','gris')
+ a.Acelerar(10) -> debe devolver 10
+ a.Acelerar(15) -> debe devolver 25
+ a.Acelerar(-10) -> debe devolver 15
+ '''
+ #Tu código aca:
+ class Vehiculo:
+ def __init__(self, tipo, color):
+ if (tipo=='auto' or tipo =='camioneta' or tipo=='moto'):
+ self.Tipo = tipo
+ else:
+ raise TypeError ('el tipo de vehículo tiene que ser auto, camioneta o moto')
+ self.Color = color
+ self.Velocidad = 0
+
+ def Acelerar(self, acel):
+ self.Velocidad += acel
+ if self.Velocidad < 0:
+ self.Velocidad=0
+ if self.Velocidad>100:
+ self.Velocidad=100
+ return self.Velocidad
+
+ a = Vehiculo(tipo, color)
+ return a
+
+
+def OrdenarDiccionario(diccionario_par, clave, descendente=True):
+ '''
+ Esta función recibe como parámetro un diccionario, cuyas listas de valores tienen el mismo
+ tamaño y sus elementos enésimos están asociados. Y otros dos parámetros que indican
+ la clave por la cual debe ordenarse y si es descendente o ascendente.
+ La función debe devolver el diccionario ordenado, teniendo en cuenta de no perder la
+ relación entre los elementos enésimos.
+ Recibe tres argumentos:
+ diccionario: Diccionario a ordenar.
+ clave: Clave del diccionario recibido, por la cual ordenar.
+ descendente: Un valor booleano, que al ser verdadero indica ordenamiento descendente y
+ ascendente si es falso.
+ Debe tratarse de un parámetro por defecto en True.
+ Si el parámetro diccionario no es un tipo de dato diccionario ó el parámetro clave no
+ se encuentra dentro de las claves del diccionario, debe devolver nulo.
+ Ej:
+ dicc = {'clave1':['c','a','b'],
+ 'clave2':['casa','auto','barco'],
+ 'clave3':[3,1,2]}
+ OrdenarDiccionario(dicc, 'clave1') debe retornar {'clave1':['a','b','c'],
+ 'clave2':['auto','barco','casa'],
+ 'clave3':[1,2,3]}
+ OrdenarDiccionario(dicc, 'clave3', False) debe retornar {'clave1':['c','b','a'],
+ 'clave2':['casa','barco','auto'],
+ 'clave3':[3,2,1]}
+ '''
+ #Tu código aca:
+ if type(diccionario_par) != dict:
+ return None
+ diccion_lista=[]
+ diccion_lista=list(diccionario_par.keys())
+ if clave not in diccion_lista:
+ return None
+ for key, value in diccionario_par.items():
+ value.sort(reverse=descendente)
+
+ return diccionario_par
+
+def Factorial(numero):
+ '''
+ Esta función devuelve el factorial del número pasado como parámetro.
+ En caso de que no sea de tipo entero y/o sea menor que 1, debe retornar nulo.
+ Recibe un argumento:
+ numero: Será el número con el que se calcule el factorial
+ Ej:
+ Factorial(4) debe retornar 24
+ Factorial(-2) debe retornar nulo
+ '''
+ #Tu código aca:
+ if (type(numero) != int):
+ return None
+ if (numero < 1):
+ return None
+ factorial = 1
+ while(numero > 1):
+ factorial = factorial * numero
+ numero -= 1
+ return factorial
+
+def EsPrimo(valor):
+ '''
+ Esta función devuelve el valor booleano True si el número reibido como parámetro es primo, de lo
+ contrario devuelve False..
+ En caso de que el parámetro no sea de tipo entero debe retornar nulo.
+ Recibe un argumento:
+ valor: Será el número a evaluar
+ Ej:
+ EsPrimo(7) debe retornar True
+ EsPrimo(8) debe retornar False
+ '''
+ #Tu código aca:
+ if (type(valor) != int):
+ return None
+ for i in range(2, (int(valor / 2) + 1)):
+ if valor % i == 0:
+ return False
+ return True
+
+def ClaseAnimal(especie, color):
+ '''
+ Esta función devuelve un objeto instanciado de la clase Animal,
+ la cual debe tener los siguientes atributos:
+ Edad (Un valor de tipo de dato entero, que debe inicializarse en cero)
+ Especie (Un valor de tipo de dato string)
+ Color (Un valor de tipo de dato string)
+ y debe tener el siguiente método:
+ CumplirAnios (este método debe sumar uno al atributo Edad y debe devolver ese valor)
+ Recibe dos argumento:
+ especie: Dato que se asignará al atributo Especie del objeto de la clase Animal
+ color: Dato que se asignará al atributo Color del objeto de la clase Animal
+ Ej:
+ a = ClaseAnimal('perro','blanco')
+ a.CumpliAnios() -> debe devolver 1
+ a.CumpliAnios() -> debe devolver 2
+ a.CumpliAnios() -> debe devolver 3
+ '''
+ #Tu código aca:
+ class Animal:
+ def __init__(self, especie, color):
+ self.Especie = especie
+ self.Color = color
+ self.Edad = 0
+
+ def CumplirAnios(self):
+ self.Edad += 1
+ return self.Edad
+
+ a = Animal(especie, color)
+ return a
+
+
+# Caso 1
+# El constructor de la clase Emprendedor recibe nombre (str), apellido (str),
+# libros (lista), mascotas (lista).
+
+# a) Inicializar la clase con sus atributos
+
+class Emprendedor:
+ """En esta clase se crean emprenderes"""
+ mascotas = [] # Acumulará las mascotas del Emprendedor
+ libros = [] # Es una lista de libros del Emprendedor
+ def __init__(self, nombre, apellido, libros, mascotas):
+ self.nombre = nombre
+ self.apellido = apellido
+ self.libros = libros
+ self.mascotas = mascotas
+
+# b) Crear un Método que agregue una mascota (mascota) a la lista, no debe
+# retornar nada. Mascotas es una lista
+#
+
+ def addMascotas (self, newPet):
+ self.mascotas.add()
+
+
\ No newline at end of file
diff --git a/Workbench/Taller/Diccionarios.py b/Workbench/Taller/Diccionarios.py
index 3479a15af..54d32aecc 100644
--- a/Workbench/Taller/Diccionarios.py
+++ b/Workbench/Taller/Diccionarios.py
@@ -116,7 +116,7 @@
# Ejemplo 7
# Consultar a un dicc, si una clase existe => retorna un booleano TRUE o FALSE
-# Ojo si preguntas por un valor, puede existir, pero retornará FALSE
+# Ojo si preguntas por un VALUE, puede que existe la KEY, pero retornará FALSE
# Si quiero preguntar por un valor, agrego el método .value()
print ("")
@@ -134,6 +134,44 @@
restaurant = {"Hamburguesa": 100, "Pizza": 50, "Jugo": 30}
if "Hamburguesa" in restaurant:
print ("SI está")
+ print()
else:
print ("NO está")
-print (restaurant)
\ No newline at end of file
+ print()
+print (restaurant)
+print()
+
+# Ejemplo 8 - Unir dos diccionarios
+
+def unirDics (dic1, dic2):
+ temp=dic1.copy()
+ temp.update(dic2)
+ return temp
+miDic1={'manzana':10.50, 'pera':12.8}
+miDic2={'durazno':11.10, 'ciruela':23.8}
+
+dicUni2= unirDics (miDic1, miDic2)
+print (dicUni2)
+print()
+
+# Ejemplo 9 - Unir dos diccionarios
+# Unir dos LISTAS y crear un Diccionario
+# necesitamos una lsta que provea las llaves y otra que provea los values
+
+def lisADicc (liskey, lisval):
+ return dict(zip(liskey, lisval))
+newkeys = ['enero', 'febrero', 'marzo', 'abril']
+newval = [10, 50,12, 9, 11, 10, 23, 8]
+
+d=lisADicc (newkeys, newval)
+print (d)
+#print()
+
+# Ejemplo 9 - Encontrar el elemento más frecuente de una lista o MODA
+#
+def moda (lista):
+ return print (max(lista, key= lista.count))
+print()
+lista = [3,1,3,2,1,5,2,3,2,1,5,4,3,3,3]
+moda (lista)
+
diff --git a/Workbench/Taller/EjerciciosVarios.py b/Workbench/Taller/EjerciciosVarios.py
new file mode 100644
index 000000000..c7d89db4a
--- /dev/null
+++ b/Workbench/Taller/EjerciciosVarios.py
@@ -0,0 +1,50 @@
+# Ejercicio 1 - Obtener la inversa de un string
+# Invertir cualquier cadena de caracteres
+
+cadena1 = "cebolla" # R=> allobec
+cadena2 = "somos" # R=> 'somos', es palíndroma
+
+for i in range(len(cadena1) -1, -1, -1):
+ print (cadena1[i], end="")
+
+print()
+
+# Ejercicio 2 - Palabra inversa, caso PALÍNDROMO (se lee igual al revés)
+# Detectar si es palíndromo y mandar un mensaje
+
+cadena3 = "coco" # R=> ococ
+cadena4 = "reconocer" # R=> 'reconocer', es palíndroma
+pali = []
+pali2 = []
+for i in range(len(cadena3) -1, -1, -1):
+ pali.append(cadena3[i])
+for j in range(len(pali)-1, -1, -1):
+ pali2.append(pali[j])
+#print (pali) # Se puede eliminar, es sólo para controlar la salida y sirven de manejo de errores
+#print (pali2) # Se puede eliminar, es sólo para controlar la salida y sirven de manejo de errores
+if (pali == pali2):
+ print ("Felicitaciones", cadena3, "es un palíndromo", end="")
+else:
+ print ("La palabra","'", cadena3,"'", "no es palíndroma e invertida, es", pali, end="")
+print()
+
+# Ejercicio 3 - Palabra inversa usando propiedades del método print - SLICING
+print ('')
+cadena= 'Pepino'
+print (cadena[::-1]) # '::' Indica de 0 hasta el último de los caracteres,
+ # para variantes, funciona igual que los indices separados
+ # por ':', con un desde y hasta, finalmente el '-1', le
+ # indica al método que es en orden inverso.
+
+# Ejercicio 4 - Ordenar una lista de cadenas de caracteres según el último carácter con la
+# función sorted()
+#
+
+# Creamos un diccionario dic_cadenas y que almacena 8 str (ciudades)
+#
+
+dic_cadenas = ['Talca', 'París', 'Londres', 'Bogotá', 'San José', 'Santiago', 'Lima', 'Sao Paulo']
+print (dic_cadenas)
+
+print()
+
diff --git a/Workbench/Taller/FuncionFactorial.py b/Workbench/Taller/FuncionFactorial.py
new file mode 100644
index 000000000..c004bb55e
--- /dev/null
+++ b/Workbench/Taller/FuncionFactorial.py
@@ -0,0 +1,22 @@
+#def factorizar_numero(numero):
+# if (type(numero) != int):
+# return None
+# if (numero < 0):
+# return None
+# factorial = 1
+# for n in range(1, (numero)+1):
+# factorial = factorial * n
+# return factorial
+
+#factorizar_numero()
+def factorial(n):
+ if (n <1):
+ return None
+ if n==0 or n==1:
+ resultado=1
+ elif n>1:
+ resultado=n*factorial(n-1)
+ return resultado
+
+fact=factorial(5)
+print (fact)
\ No newline at end of file
diff --git a/Workbench/Taller/ListaEnteros.py b/Workbench/Taller/ListaEnteros.py
new file mode 100644
index 000000000..297be6e85
--- /dev/null
+++ b/Workbench/Taller/ListaEnteros.py
@@ -0,0 +1,34 @@
+""" def test_ListaEnteros_01(self):
+ lista_test = ch.ListaEnteros(1, 10)
+ lista_esperada = [1,2,3,4,5,6,7,8,9,10]
+ self.assertEqual(lista_test, lista_esperada)
+
+ def test_ListaEnteros_02(self):
+ lista_test = ch.ListaEnteros(3, 7)
+ lista_esperada = [3,4,5,6,7,8,9,10]
+ self.assertEqual(lista_test, lista_esperada)
+
+ def test_ListaEnteros_03(self):
+ lista_test = ch.ListaEnteros(-2, 4)
+ lista_esperada = [-2,-1,0,1]
+ self.assertEqual(lista_test, lista_esperada)
+
+Esta función devuelve una lista de números enteros
+Recibe dos argumentos:
+ inicio: Numero entero donde inicia la lista
+ tamanio: Cantidad de números enteros consecutivos
+ Ej:
+ ListaEnteros(10,5) debe retornar [10,11,12,13,14]
+
+"""
+
+def ListaEnteros (inicio, tamanio):
+ lista = []
+ for i in range(inicio, inicio + tamanio):
+ lista.append(i)
+ return lista
+
+print (ListaEnteros (10,5))
+print (ListaEnteros (1,10))
+print (ListaEnteros (3,7))
+print (ListaEnteros (-2,4))
\ No newline at end of file
diff --git a/Workbench/Taller/Mix_ejercicios.py b/Workbench/Taller/Mix_ejercicios.py
index 56a8fa9d0..0c0ebdef6 100644
--- a/Workbench/Taller/Mix_ejercicios.py
+++ b/Workbench/Taller/Mix_ejercicios.py
@@ -1,5 +1,9 @@
-# Variables
-
+#*******************************************************************
+#* *
+#* MIX DE EJERCICIOS Y REVISIÓN DE EJEMPLOS *
+#* CON COMENTARIOS Y CITAS *
+#*******************************************************************
+#
# Ej 1) Cocatenar cadenas de caracteres, deben ser del mismo tipo (str+str)
a = 'Hola '
@@ -334,29 +338,20 @@ def test_suma_dos_negativos(self):
#Caja de Cristal
import unittest
-
def es_mayor_de_edad(edad):
if edad >= 18:
return True
else:
return False
-
class PruebaDeCristalTest(unittest.TestCase):
-
def test_es_mayor_de_edad(self):
edad = 20
-
resultado = es_mayor_de_edad(edad)
-
self.assertEqual(resultado, True)
-
def test_es_menor_de_edad(self):
edad = 15
-
resultado = es_mayor_de_edad(edad)
-
self.assertEqual(resultado, False)
-
unittest.main(argv=[''], verbosity=2, exit=False)
"""
diff --git a/Workbench/Taller/NumeroCapicua.py b/Workbench/Taller/NumeroCapicua.py
new file mode 100644
index 000000000..112932398
--- /dev/null
+++ b/Workbench/Taller/NumeroCapicua.py
@@ -0,0 +1,36 @@
+def NumeroCapicua(numero):
+ '''
+ En matemáticas, la palabra capicúa (del catalán cap i cua, 'cabeza y cola')
+ se refiere a cualquier número que se lee igual de izquierda a derecha que
+ de derecha a izquierda. Se denominan también números palíndromos.
+ Esta función devuelve el valor booleano True si el número es capicúa, de lo contrario
+ devuelve el valor booleano False
+ En caso de que el parámetro no sea de tipo entero, debe retornar nulo.
+ Recibe un argumento:
+ numero: Será el número sobre el que se evaluará si es capicúa o no lo es.
+ Ej:
+ NumeroCapicua(787) debe retornar True
+ NumeroCapicua(108) debe retornar False
+ '''
+ cadena3 = str(numero)
+ pali = []
+ pali2 = []
+ if type(numero) == int:
+ for i in range(len(cadena3) -1, -1, -1):
+ pali.append(cadena3[i])
+ for j in range(len(pali)-1, -1, -1):
+ pali2.append(pali[j])
+ if (pali == pali2):
+ return True
+ else:
+ return False
+ else:
+ return None
+
+
+# Probar
+numeros = [11, 20, 123, 9889, 2811, 1801, 777, 12321, ]
+
+for num in numeros:
+ es_capicua = NumeroCapicua(num)
+ print(f"El número {num} es capicúa? {es_capicua}")
\ No newline at end of file
diff --git a/Workbench/Taller/OrdenaDic b/Workbench/Taller/OrdenaDic
new file mode 100644
index 000000000..06e30b663
--- /dev/null
+++ b/Workbench/Taller/OrdenaDic
@@ -0,0 +1,55 @@
+dicc ={
+'clave1':['c', 'a', 'b'],
+'clave2':['casa', 'auto', 'barco'],
+'clave3':[3,2,1]}
+# 1) Convertir este dic de listas en una lista de dicts
+# 2) verificar que no pasan datos nulos o que no cumplen las condciones a) calaves no vacías y que el dic, sea un DICT
+# No se puede perder la hilación, or eso tarbajamos con listas.
+# Crequear condiciones
+clave='clave1'
+
+# def ordenaDic (dicc_rec, clave):
+newArr=[] # Va a recibir mi lista de diccionarios originales convertidos a listas
+newArrSorted=[] # Va a recibir los diccionarios ordenados por la clave ingresada
+res = []
+cantidadValores = 0
+numKeys = 0 # Recibe la cantidad de elementos del tipo llave que tiene el diccionario DICC, para ejecutar los ciclos.
+if not (type(dicc) is dict): #dict_rec= Debería ser el DICC recibido
+ pass #return 'Null' #None
+if not (clave in dicc.keys()): #clave=clave del parámetro
+ pass #return 'Null'
+ # definir variables a usar, incluye nuevas listas
+ # Convertimos el dicc de list a list de dict
+ # print (len(dicc_rec[list(dicc_par.keys())[0]]))
+ # chequeamos qué valor estamos reciendo
+ # print()
+print (len(dicc[list(dicc.keys())[0]]))
+if len(dicc[list(dicc.keys())[0]])>0: # convertimos el diccionario de listas, a una lista de diccionarios:
+ cantidadValores = len(dicc[list(dicc.keys())[0]])
+ print (cantidadValores)
+ for i in range(0, cantidadValores):
+ newObj={}
+ for key in dicc:
+ newObj[key]=dicc[key][i]
+ newArr.append(newObj) #print(newArr) #aquí se generó una lista de diccionarios
+ newArrSorted = sorted(newArr, key=lambda d: d[clave], reverse=not) # (descendente) Ahora ordenemos
+ #print (newArrSorted) #verificar contenido del nuevo arreglo
+ # Convertimos la lista de diccionarios, en un diccionario de listas:
+ for key in dicc:
+ newArr2 = []
+ for i in range(0, cantidadValores):
+ newArr2.append(newArrSorted[i][key])
+ res[key] = newArr2
+ #Si no tienen valores devolvemos el mismo diccionario:
+else:
+ #return dicc_par
+ print (dicc)
+ print (res)
+
+#dicc ={
+#'clave1':['c', 'a', 'b'],
+#'clave2':['casa', 'auto', 'barco'],
+#'clave3':[3,2,1]}
+# print (OrdenarDiccionario(dicc,"clave3",false))
+
+# ordenaDic (dicc, 'clave1')
\ No newline at end of file
diff --git a/Workbench/Taller/aritmetica.py b/Workbench/Taller/aritmetica.py
index 7fd04e8f3..ef449849a 100644
--- a/Workbench/Taller/aritmetica.py
+++ b/Workbench/Taller/aritmetica.py
@@ -1,4 +1,4 @@
-#print (3.5 // 4)
+print (3.5 // 3)
#print ("7"+"0")
#print (int("7"+"0")/2) #Este es un ejemplo de casteo
#print ( 2**1 / 12)
diff --git a/Workbench/Taller/listas.py b/Workbench/Taller/listas.py
index 964da9bd3..c50e047bf 100644
--- a/Workbench/Taller/listas.py
+++ b/Workbench/Taller/listas.py
@@ -209,8 +209,8 @@
# 2 Dos
# Ejemplo 21 - Caso: zip() con un argumento
-# Por definición, se puede hacer, porque ZIP está definido para un 'n' arbitrario
-# de listas, ergo, también es posible usar un único valor.
+# Por definición, se puede hacer, porque ZIP está definido para un 'n'
+# arbitrario de listas, ergo, también es posible usar un único valor.
# El resultado son tuplas de un elemento...raras, pero se puede.
numeros = [1, 2, 3, 4, 5]
@@ -218,10 +218,12 @@
print (list(zz)) # R=> [(1,), (2,), (3,), (4,), (5,)]
# Ejemplo 22 - Caso: zip() con diccionarios
-# Lo común es usar ZIP con listas, pero al estar definida para cualquier clase iterable.
+# Lo común es usar ZIP con listas, pero al estar definida para cualquier
+# clase iterable.
# Podemos usarla con DICCIONARIOS.
-# Por ejemplo, si (a,b) toman los valores de las key del diccionario, no parece muy interesante.
+# Por ejemplo, si (a,b) toman los valores de las key del diccionario, no parece
+# muy interesante.
esp = {'1': 'Uno', '2': 'Dos', '3': 'Tres'}
eng = {'1': 'One', '2': 'Two', '3': 'Three'}
@@ -311,7 +313,7 @@
print(mi_Cola) # R=> ('Diego', 'Luis', 'Jorge'])
# La lista restante en orden de llegada
-# Ejemplo 26 - Comprensión de listas . MUY IMPORTANTE ENTENDERLO BIEN !!
+# Ejemplo 26 - Listas por Comprensión . MUY IMPORTANTE ENTENDERLO BIEN !!
# Permite usar expresiones y condiciones para poblar una lista.
# Sus usos comunes son para hacer nuevas colecciones donde cada elemento es el resultado
# de algunas operaciones aplicadas a cada miembro de otra secuencia o iterable, o
diff --git a/Workbench/Taller/pruebaerror.ipynb b/Workbench/Taller/pruebaerror.ipynb
index a4c670a96..3c875a91e 100644
--- a/Workbench/Taller/pruebaerror.ipynb
+++ b/Workbench/Taller/pruebaerror.ipynb
@@ -537,22 +537,921 @@
},
{
"cell_type": "code",
- "execution_count": 148,
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from math import pi # Importamos una librería \"MATH\" que nos permite hacer cálculos científicos y usar constantes \n",
+ "pi_evol= [str(round(pi, i)) for i in range(1, 6)] # Creamos una lista con incrementales de pi\n",
+ "print ('Los valores incrementales de pi, son ', pi_evol)\n",
+ "# R=> Los valores incrementales de pi, son ['3.1', '3.14', '3.142', '3.1416', '3.14159']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 149,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "class Persona():\n",
+ "\n",
+ " def __init__(self,nombre=\"\",edad=0,dni=\"\"):\n",
+ " self.nombre=nombre\n",
+ " self.edad=edad\n",
+ " self.dni=dni\n",
+ " \n",
+ " @property\n",
+ " def nombre(self):\n",
+ " return self.__nombre\n",
+ "\n",
+ " @property\n",
+ " def edad(self):\n",
+ " return self.__edad\n",
+ "\n",
+ " @property\n",
+ " def dni(self):\n",
+ " return self.__dni\n",
+ " \n",
+ " @nombre.setter\n",
+ " def nombre(self,nombre):\n",
+ " self.__nombre=nombre\n",
+ "\n",
+ " def validar_dni(self):\n",
+ " letras = \"TRWAGMYFPDXBNJZSQVHLCKE\"\n",
+ " if len(self.__dni)!=9:\n",
+ " print(\"DNI incorrecto\")\n",
+ " self.__dni = \"\"\n",
+ " else:\n",
+ " letra = self.__dni[8]\n",
+ " num = int(self.__dni[:8])\n",
+ " if letra.upper() != letras[num % 23]:\n",
+ " print(\"DNI incorrecto\")\n",
+ " self.__dni = \"\"\n",
+ "\n",
+ " @dni.setter\n",
+ " def dni(self,dni):\n",
+ " self.__dni=dni\n",
+ " self.validar_dni()\n",
+ " \n",
+ " @edad.setter\n",
+ " def edad(self,edad):\n",
+ " if edad < 0:\n",
+ " print(\"Edad incorrecta\")\n",
+ " self.__edad=0\n",
+ " else:\n",
+ " self.__edad=edad\n",
+ " \n",
+ " \n",
+ " def mostrar(self):\n",
+ " return \"Nombre:\"+self.nombre+\" - Edad:\"+str(self.edad)+\" - DNI:\"+self.dni\n",
+ "\n",
+ " def esMayorDeEdad(self):\n",
+ " return self.edad>=18\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def swap(a,b):\n",
+ " c=a\n",
+ " a=b\n",
+ " b=c\n",
+ " return (a,b)\n",
+ "\n",
+ "x = ['ab', 'cd','ef',5]\n",
+ "y = 4\n",
+ "print (x,y)\n",
+ "x,y= swap(x,y)\n",
+ "print (x,y)\n",
+ "print ()\n",
+ "\n",
+ "# caso 2) Directo y,x = x,y, propiedades de Python\n",
+ "# \n",
+ "x= 'diez'\n",
+ "y= True\n",
+ "print (x,y)\n",
+ "x,y=y,x\n",
+ "print (x,y)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "class Complex:\n",
+ " def __init__(self, realpart, imagpart):\n",
+ " self.r = realpart\n",
+ " self.i = imagpart\n",
+ "\n",
+ "x = Complex(3.0, -4.5)\n",
+ "x.r, x.i\n",
+ "print (type (x.r))\n",
+ "3.0, -4.5"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 171,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "class Emprendedor:\n",
+ " \"\"\"En esta clase se crean emprendedores\n",
+ " Recibe: str (nombre), str (apellido), list (libros), list (mascotas) \n",
+ " \"\"\"\n",
+ " mascotas = [] # Lista que acumulará las mascotas del Emprendedor\n",
+ " libros = [] # Lista que colectará los libros del Emprendedor\n",
+ " \n",
+ " def __init__(self, nombre, apellido, libros, mascotas):\n",
+ " self.nombre = nombre\n",
+ " self.apellido = apellido\n",
+ " self.libros = libros\n",
+ " self.mascotas = mascotas\n",
+ "\n",
+ "# b) Crear un Método que agregue una mascota (mascota) a la lista, no debe \n",
+ "# retornar nada. Mascotas es una lista\n",
+ "# \n",
+ "\n",
+ " def addMascotas (self, newPet): # Si el Empredendor tiene perro y gato, agregué una tortuga\n",
+ " self.mascotas.append(newPet) #\n",
+ "\n",
+ " def getmascotas (self): #\n",
+ " pass #\n",
+ "\n",
+ " def addBook (self, book, newautor): # El método addBook, recibe un str (book) y un str (autor)\n",
+ " self.libros.append(book) # Debe agregar un objeto DICT que recibe y guarda los parámetros\n",
+ " pass # dic = {nombre:book, autor:autor} \n",
+ " # No retorna nada\n",
+ "\n",
+ " def getCase (self): # Retorna qtty de mascotas que tiene el emprendedor\n",
+ " pass # Ej. Si tiene 2 mascotas, debe retornar 2\n",
+ " # Como es una lista, puedo hacer list.len(self.mascotas)\n",
+ "\n",
+ " def getBooks (self): # Debe retornar sólo los nombres de los libros\n",
+ " pass # Debería devolver ['El Señor de las Moscas', 'Fundación']\n",
+ "\n",
+ " \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 401,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Los valores incrementales de pi, son ['3.1', '3.14', '3.142', '3.1416', '3.14159']\n"
+ "la lista de primos es [5, 7, 11, 13]\n"
]
}
],
"source": [
- "from math import pi # Importamos una librería \"MATH\" que nos permite hacer cálculos científicos y usar constantes \n",
- "pi_evol= [str(round(pi, i)) for i in range(1, 6)] # Creamos una lista con incrementales de pi\n",
- "print ('Los valores incrementales de pi, son ', pi_evol)\n",
- "# R=> Los valores incrementales de pi, son ['3.1', '3.14', '3.142', '3.1416', '3.14159']"
+ "# LISTA PRIMOS\n",
+ "\n",
+ "def ListaPrimos(desde, hasta):\n",
+ " List_pri=[]\n",
+ " tope=hasta\n",
+ " n=desde\n",
+ " primo = True\n",
+ " if(type(n) != int):\n",
+ " return None\n",
+ " if(type(tope)!= int):\n",
+ " return None\n",
+ " while (n<=tope):\n",
+ " for div in range(2,n):\n",
+ " if(n%div==0):\n",
+ " primo=False\n",
+ " if (primo):\n",
+ " List_pri.insert(n-1,n)\n",
+ " else:\n",
+ " primo = True\n",
+ " n +=1\n",
+ " return List_pri\n",
+ "\n",
+ "imprime=ListaPrimos (5, 15)\n",
+ "print ('la lista de primos es',imprime)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 252,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'clave1': ['c', 'b', 'a'],\n",
+ " 'clave2': ['casa', 'barco', 'auto'],\n",
+ " 'clave3': [3, 2, 1]}"
+ ]
+ },
+ "execution_count": 252,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "\n",
+ "# Esta función recibe como parámetro un diccionario, cuyas listas de valores tienen el mismo\n",
+ "# tamaño y sus elementos enésimos están asociados. Y otros dos parámetros que indican\n",
+ "# la clave por la cual debe ordenarse y si es descendente o ascendente.\n",
+ "# La función debe devolver el diccionario ordenado, teniendo en cuenta de no perder la\n",
+ "# relación entre los elementos enésimos.\n",
+ "# Recibe tres argumentos:\n",
+ "#\n",
+ "# diccionario: Diccionario a ordenar.\n",
+ "# clave: Clave del diccionario recibido, por la cual ordenar.\n",
+ "# descendente: Un valor booleano, que al ser verdadero indica ordenamiento ascendente y \n",
+ "# descendente si es falso. \n",
+ "# Debe tratarse de un parámetro por defecto en True.\n",
+ "# Si el parámetro diccionario no es un tipo de dato diccionario ó el parámetro clave no \n",
+ "# se encuentra dentro de las claves del diccionario, debe devolver nulo.\n",
+ "# Ej:\n",
+ "# dicc = {'clave1':['c','a','b'],\n",
+ "# 'clave2':['casa','auto','barco'],\n",
+ "# 'clave3':[1,2,3]}\n",
+ "#\n",
+ "# OrdenarDiccionario(dicc, 'clave1') debe retornar {'clave1':['a','b','c'],\n",
+ "# 'clave2':['auto','barco','casa'],\n",
+ "# 'clave3':[2,3,1]}\n",
+ "# OrdenarDiccionario(dicc, 'clave3', False) debe retornar {'clave1':['b','a','c'],\n",
+ "# 'clave2':['barco','auto','casa'],\n",
+ "# 'clave3':[3,2,1]}\n",
+ "#debe retornar\n",
+ "\n",
+ "# {'clave1':['b','a','c'], 'clave2':['barco','auto','casa'],'clave3':[3,2,1]}\n",
+ "# \n",
+ "dicc = {'clave1':['c','a','b'],\n",
+ " 'clave2':['casa','auto','barco'],\n",
+ " 'clave3':[1,2,3]}\n",
+ "\n",
+ "def OrdenarDiccionario(diccionario_par, clave, descendente=True):\n",
+ " listet = list(diccionario_par.keys())\n",
+ " #print = (listet)\n",
+ " for i in diccionario_par:\n",
+ " if i == clave:\n",
+ " for j in diccionario_par:\n",
+ " diccionario_par[j].sort()\n",
+ " if descendente == True:\n",
+ " diccionario_par[j].reverse()\n",
+ " \n",
+ " return diccionario_par\n",
+ " #return(print (listet))\n",
+ "\n",
+ "# print (dicc)\n",
+ "OrdenarDiccionario(dicc, 'clave1') \n",
+ "\n",
+ "#OrdenarDiccionario(dicc, 'clave3', False)\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Sin embargo, si usamos la función items del tipo DICT, podemos acceder\n",
+ "# al key y al value de cada elemento.\n",
+ "# Se puede facilitar para modificar valores usando, e.g casteo de dict a list y viceversa\n",
+ "#esp = {'1': 'Uno', '2': 'Dos', '3': 'Tres'}\n",
+ "#eng = {'1': 'One', '2': 'Two', '3': 'Three'}\n",
+ "\n",
+ "#for (k1, v1), (k2, v2) in zip(esp.items(), eng.items()):\n",
+ "# print(k1, v1, v2)\n",
+ "# Nótese que en este caso ambas key k1 y k2 son iguales.\n",
+ "# 1 Uno One\n",
+ "# 2 Dos Two\n",
+ "# 3 Tres Three\n",
+ "dicc = {'clave1':['c','a','b'],\n",
+ " 'clave2':['casa','auto','barco'],\n",
+ " 'clave3':[1,2,3]}\n",
+ "dicc_list = dicc.items()\n",
+ "dicc_list = list (dicc_list)\n",
+ "#print (dicc_items[1:3]) \n",
+ "k0 = ['clave1', 'clave2', 'clave3']\n",
+ "v1 = ['c', 'b', 'a']\n",
+ "v2 = ['casa', 'barco', 'auto']\n",
+ "v3 = [3, 2, 1]\n",
+ "i=1\n",
+ "#print(k0[0], v1[0], v2[0], v3[0])\n",
+ "#keyword=\n",
+ "#for i (k[i], v1), (k[i], v2), (k[i],v3) in dicc.items():\n",
+ "for i in dicc_list:\n",
+ " print(dicc_list(i), dicc_items.values(i), dicc_items.values(i), dicc_items.values(3))\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "valor=777\n",
+ "print (valor)\n",
+ "print ()\n",
+ "cadena=str(valor)\n",
+ "indice=-1\n",
+ "iguales=0\n",
+ "for x in range(0,len(cadena)/2):\n",
+ " if cadena[x]==cadena[indice]:\n",
+ " iguales=iguales+1\n",
+ " indice=indice-1\n",
+ "if iguales==(len(cadena)/2):\n",
+ " print ('Es capicua')\n",
+ "else:\n",
+ " print ('No es capicua')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "'''\n",
+ " En matemáticas, la palabra capicúa (del catalán cap i cua, 'cabeza y cola') \n",
+ " se refiere a cualquier número que se lee igual de izquierda a derecha que \n",
+ " de derecha a izquierda. Se denominan también números palíndromos.\n",
+ " Esta función devuelve el valor booleano True si el número es capicúa, de lo contrario\n",
+ " devuelve el valor booleano False \n",
+ " En caso de que el parámetro no sea de tipo entero, debe retornar nulo.\n",
+ " Recibe un argumento:\n",
+ " numero: Será el número sobre el que se evaluará si es capicúa o no lo es.\n",
+ " Ej:\n",
+ " NumeroCapicua(787) debe retornar True\n",
+ " NumeroCapicua(108) debe retornar False\n",
+ "'''\n",
+ "def NumeroCapicua(numero):\n",
+ " cadena3 = str(numero)\n",
+ " pali = []\n",
+ " pali2 = []\n",
+ " if type(numero) == int:\n",
+ " for i in range(len(cadena3) -1, -1, -1):\n",
+ " pali.append(cadena3[i])\n",
+ " for j in range(len(pali)-1, -1, -1):\n",
+ " pali2.append(pali[j])\n",
+ " if (pali == pali2):\n",
+ " return True\n",
+ " else:\n",
+ " return False\n",
+ " else:\n",
+ " return None\n",
+ " \n",
+ " \n",
+ "print (NumeroCapicua(92529))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# factorizar_numero(5)\n",
+ "# valor_esperado = [[5],[1]]\n",
+ "# \n",
+ "# factorizar_numero(1428)\n",
+ "# valor_esperado = [[2,3,7,17], [2,1,1,1]]\n",
+ "# \n",
+ "# factorizar_numero('cinco')\n",
+ "# valor_esperado = None\n",
+ "# \n",
+ "\n",
+ "def factorizar_numero(numero):\n",
+ " '''\n",
+ " Esta función recibe como parámetro un número entero mayor a cero y devuelva dos listas, \n",
+ " una con cada factor común y otra con su exponente, \n",
+ " esas dos listas tienen que estar contenidas en otra lista.\n",
+ " En caso de que el parámetro no sea de tipo entero y/ó mayor a cero debe retornar nulo.\n",
+ " Recibe un argumento:\n",
+ " numero: Será el número sobre el que se hará la factorización.\n",
+ " Ej:\n",
+ "\n",
+ " factorizar_numero(12) debe retornar [[2,3],[2,1]]\n",
+ " factorizar_numero(13) debe retornar [[13],[1]]\n",
+ " factorizar_numero(14) debe retornar [[2,7],[1,1]]\n",
+ " '''\n",
+ " lista_factores = []\n",
+ " lista_exponentes = []\n",
+ " if type(numero) == int:\n",
+ " #i= \n",
+ " while numero%2 != 1:\n",
+ " n=(i%2)\n",
+ " if n==1:\n",
+ " lista_i.append (i)\n",
+ " elif n==0:\n",
+ " lista_p.append (i)\n",
+ " print (\"Los números impares entre 1 y 10 son \", lista_i)\n",
+ " print (\"Los números pares entre 1 y 10 son \", lista_p)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def factoriza(n):\n",
+ " l = []\n",
+ " i = 2\n",
+ " while (i * i) <= n:\n",
+ " while (n % i) == 0:\n",
+ " l.append(i)\n",
+ " n = n / i\n",
+ " i = i + 1\n",
+ " if n != 1:\n",
+ " l.append(n)\n",
+ " return l\n",
+ "factoriza (10)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 414,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "2\n"
+ ]
+ }
+ ],
+ "source": [
+ "print (27%5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 406,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1\n",
+ "3\n",
+ "17\n",
+ "51\n"
+ ]
+ }
+ ],
+ "source": [
+ "#def divisores ():\n",
+ "num = int (input ('Escribe un entero'))\n",
+ "listaFC = []\n",
+ "i=1\n",
+ "while i<=num:\n",
+ " if num%i==0:\n",
+ " listaFC.append(num//i)\n",
+ " listaFC.sort()\n",
+ " i+=1\n",
+ "for f in listaFC:\n",
+ " print (f)\n",
+ " #, end=',')\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 376,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "La palabra ' 777 ' no es palíndroma e invertida, es []\n"
+ ]
+ }
+ ],
+ "source": [
+ "num = input ('Ingrese número _')\n",
+ "cadena3 = str(num)\n",
+ "cadena4 = \"reconocer\" # R=> 'reconocer', es palíndroma\n",
+ "pali = []\n",
+ "pali2 = []\n",
+ "if (num!=int):\n",
+ " print (\"La palabra\",\"'\", cadena3,\"'\", \"no es palíndroma e invertida, es\", pali, end=\"\") \n",
+ " \n",
+ "elif (nun>0):\n",
+ " for i in range(len(cadena3) -1, -1, -1):\n",
+ " pali.append(cadena3[i])\n",
+ " for j in range(len(pali)-1, -1, -1):\n",
+ " pali2.append(pali[j])\n",
+ " if (pali == pali2):\n",
+ " #return True\n",
+ " print(\"es palíndromo\")\n",
+ "else:\n",
+ " #return False\n",
+ " print (\"La palabra\",\"'\", cadena3,\"'\", \"no es palíndroma e invertida, es\", pali, end=\"\")\n",
+ "print()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 353,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[('Rojo', '4859-A', 'A'), ('Gris', '1892-B', 'M'), ('Azul', '2901-Z', 'M')]"
+ ]
+ },
+ "execution_count": 353,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tuplas_coches = [\n",
+ " ('Rojo', '4859-A', 'A'),\n",
+ " ('Azul', '2901-Z', 'M'),\n",
+ " ('Gris', '1892-B', 'M')\n",
+ "]\n",
+ "ordenarpor='0'\n",
+ "\n",
+ "if ordenarpor == 0:\n",
+ "\n",
+ "sorted(tuplas_coches, key=itemgetter(2, 1))\n",
+ "#[('Rojo', '4859-A', 'A'), ('Gris', '1892-B', 'M'), ('Azul', '2901-Z', 'M')]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 335,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['c', 'a', 'b']\n"
+ ]
+ }
+ ],
+ "source": [
+ "from operator import itemgetter\n",
+ "def OrdenarDiccionario(diccionario_par, clave, descendente=True):\n",
+ " dicc = {'clave1':['c','a','b'], 'clave2':['casa','auto','barco'], 'clave3':[1,2,3]}\n",
+ "\n",
+ " for n in sorted(dicc), str(\"clave1\"):\n",
+ " return n\n",
+ "\n",
+ "def ordenardiccionario2(self):\n",
+ " dicc = ['c','a','b']\n",
+ " for x in sorted(dicc, str(\"clave1\"), True):\n",
+ " return None\n",
+ " \n",
+ "def ordenardiccionario3(self): \n",
+ " dicc = {'clave1':['c','a','b'], 'clave2':['casa','auto','barco'], 'clave3':[3,1,2]}\n",
+ " for j in sorted(dicc, str(\"clave3\"), False):\n",
+ " return j\n",
+ "\n",
+ "OrdenarDiccionario(dicc, 'clave3') \n",
+ "print(dicc.get('clave1')) #Sara"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dicc = {\n",
+ " 'clave1':['c','a','b'],\n",
+ " 'clave2':['casa','auto','barco'],\n",
+ " 'clave3':[1,2,3]\n",
+ " }\n",
+ "bykey=dicc.keys () # Guardo las llaves en una var\n",
+ "keyord='clave1' # Guardo la la clave por la que quiero ordenar\n",
+ "# sorted_bykey={}\n",
+ "# print (bykey)\n",
+ "# sorted_bykey=sorted(bykey)\n",
+ "# print (sorted_bykey)\n",
+ "# sorted_bykey={}\n",
+ "#for\n",
+ "dic_ord_by_key = sorted(dicc, key=keyord)\n",
+ "print (\"Ordenada por calificación ascendente: \")\n",
+ "for algo in dic_ord_by_key:\n",
+ " print (keyword)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 275,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{'clave1': ['c', 'a', 'b'], 'clave2': ['casa', 'auto', 'barco'], 'clave3': [1, 2, 3]}\n"
+ ]
+ }
+ ],
+ "source": [
+ "dicc = {\n",
+ " 'clave1':['c','a','b'],\n",
+ " 'clave2':['casa','auto','barco'],\n",
+ " 'clave3':[1,2,3]\n",
+ " }\n",
+ "\n",
+ "#for x in dicc:\n",
+ "# print(dicc[x])\n",
+ "# ['c', 'a', 'b']\n",
+ "# ['casa', 'auto', 'barco']\n",
+ "# [1, 2, 3]\n",
+ "print(dicc)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 325,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{'clave1': ['c', 'a', 'b'], 'clave2': ['casa', 'auto', 'barco'], 'clave3': [1, 2, 3]}\n"
+ ]
+ }
+ ],
+ "source": [
+ "key_list = ['clave1', 'clave2', 'clave3']\n",
+ "value_list1 = [['c', 'a', 'b'], ['casa', 'auto', 'barco'], [1, 2, 3]]\n",
+ "\n",
+ "# ['c', 'a', 'b']\n",
+ "# ['casa', 'auto', 'barco']\n",
+ "# [1, 2, 3]\n",
+ "dict_from_list = dict(zip(key_list, value_list1))\n",
+ "print(dict_from_list)\n",
+ "# {'clave1':['b','a','c'], 'clave2':['barco','auto','casa'],'clave3':[3,2,1]}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 330,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{'nombre': 'Juan', 'edad': '27', 'ciudad': 'Nueva York'}\n"
+ ]
+ }
+ ],
+ "source": [
+ "key_list = ['clave1', 'clave2', 'clave3']\n",
+ "value_list = ['Juan', '27', 'Nueva York']\n",
+ "\n",
+ "dict_from_list = {k: v for k, v in zip(key_list, value_list)}\n",
+ "print(dict_from_list)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def sum (a,b):\n",
+ " return 'Null'\n",
+ " \n",
+ "sum (2,3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "\n",
+ "dicc = {\n",
+ " 'clave1':['c','a','b'],\n",
+ " 'clave2':['casa','auto','barco'],\n",
+ " 'clave3':[1,2,3]\n",
+ " }\n",
+ "varkeys=len()\n",
+ "\n",
+ "if len(varkeys[list(dicc.keys()]>0) \n",
+ "\tvalores=len(dicc_par[list(dicc_par.keys())[0]])\n",
+ "# convertimos el diccionario de listas, a una lista de diccionarios:\t\n",
+ "\tfor i in range(0, valores):\n",
+ "\t\tnewObj[key] = dicc_par[key][i]\n",
+ "\tnewArr.append(newObj)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dicc ={\n",
+ "'clave1':['c', 'a', 'b'],\n",
+ "'clave2':['casa', 'auto', 'barco'],\n",
+ "'clave3':[3,2,1]}\n",
+ "dicc_swp= {} # Recibe dic transitorios no ordenados, ver si es lista o no\n",
+ "dicc_ord= {} # Recibe el nuevo dic ordenado \n",
+ "listkeys =list(dicc.keys())\n",
+ "listvalues = list(dicc.values())\n",
+ "print (listvalues)\n",
+ "print (type(listkeys))\n",
+ "print (len(listkeys)) # List horz de las keys\n",
+ "print (listkeys) # Ahora sabemos cuantos elementos tiene\n",
+ "for k in listkeys:\n",
+ " print (k)\n",
+ "for v in listvalues:\n",
+ " print (v)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 324,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Ord1= [('Gris', '1892-B', 'M'), ('Azul', '2901-Z', 'M'), ('Rojo', '4859-A', 'A')]\n",
+ "Ord2= [{'color': 'Gris', 'matricula': '1892-B', 'cambio': 'M'}, {'color': 'Azul', 'matricula': '2901-Z', 'cambio': 'M'}, {'color': 'Rojo', 'matricula': '4859-A', 'cambio': 'A'}]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Ordenar una lista de coches almacenados como tuplas\n",
+ "tuplas_coches = [\n",
+ " ('Rojo', '4859-A', 'A'),\n",
+ " ('Azul', '2901-Z', 'M'),\n",
+ " ('Gris', '1892-B', 'M')\n",
+ " ]\n",
+ "\n",
+ "# Ordenar los coches por matrícula\n",
+ "ordenados1 = sorted(tuplas_coches, key=lambda coche : coche[1])\n",
+ "print ('Ord1=', ordenados1)\n",
+ "# [('Gris', '1892-B', 'M'), ('Azul', '2901-Z', 'M'), ('Rojo', '4859-A', 'A')]\n",
+ "\n",
+ "# Ordenar una lista de coches almacenados como diccionarios\n",
+ "diccionarios_coches = [\n",
+ " {'color': 'Rojo', 'matricula': '4859-A', 'cambio': 'A'},\n",
+ " {'color': 'Azul', 'matricula': '2901-Z', 'cambio': 'M'},\n",
+ " {'color': 'Gris', 'matricula': '1892-B', 'cambio': 'M'}\n",
+ "]\n",
+ "ordenados2 = sorted (diccionarios_coches, key=lambda coche : coche['matricula'])\n",
+ "print ('Ord2=', ordenados2)\n",
+ "# [{'color': 'Gris', 'matricula': '1892-B', 'cambio': 'M'}, \n",
+ "# {'color': 'Azul', 'matricula': '2901-Z', 'cambio': 'M'}, \n",
+ "# {'color': 'Rojo', 'matricula': '4859-A', 'cambio': 'A'}]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 281,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "este es el dicc ordenado por la clave X {'clave1': ['b', 'a', 'c'], 'clave2': ['barco', 'auto', 'casa'], 'clave3': [3, 2, 1]}\n"
+ ]
+ }
+ ],
+ "source": [
+ "dicc={'midic':('a',b'')}\n",
+ "if type(diccionario_pa) != dict:\n",
+ " if type(get)\n",
+ " return None\n",
+ "dicc2={'clave1':['b','a','c'], 'clave2':['barco','auto','casa'],'clave3':[3,2,1]}\n",
+ "print ('este es el dicc ordenado por la clave X', dicc2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "juegos = [\n",
+ " {\n",
+ " \"nombre\": \"Resident Evil 2\",\n",
+ " \"calificacion\": 99,\n",
+ " },\n",
+ " {\n",
+ " \"nombre\": \"Crash Bandicoot N. Sane Trilogy\",\n",
+ " \"calificacion\": 76,\n",
+ " },\n",
+ "\n",
+ " {\n",
+ " \"nombre\": \"Cuphead\",\n",
+ " \"calificacion\": 100,\n",
+ " },\n",
+ " {\n",
+ " \"nombre\": \"Minecraft\",\n",
+ " \"calificacion\": 80,\n",
+ " },\n",
+ " {\n",
+ " \"nombre\": \"Bioshock\",\n",
+ " \"calificacion\": 95,\n",
+ " },\n",
+ "]\n",
+ "def funcion_que_devuelve_clave(juego):\n",
+ " # Vamos a ordenar basándonos en su calificación, y como se nos\n",
+ " # va a pasar un diccionario, devolvemos el elemento \"calificacion\"\n",
+ " return juego[\"calificacion\"]\n",
+ "\n",
+ "# La ordenamos\n",
+ "juegos_ordenados = sorted(juegos, key=funcion_que_devuelve_clave)\n",
+ "print(\"Ordenada por calificación ascendente: \")\n",
+ "for juego in juegos_ordenados:\n",
+ " print(juego)\n",
+ "# También se puede en orden inverso\n",
+ "juegos_ordenados = sorted(juegos, key=funcion_que_devuelve_clave, reverse=True)\n",
+ "print(\"Ordenada por calificación descendente: \")\n",
+ "\n",
+ "for juego in juegos_ordenados:\n",
+ " print(juego)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 250,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "nuemero e claves 6\n",
+ "{'clave1': 1.97, 'clave2': 8.49, 'clave3': 9.79, 'clave4': 1.2, 'clave5': 0.43, 'clave6': ['a', 'b', 'c']}\n"
+ ]
+ }
+ ],
+ "source": [
+ "clients = {'clave1': 1.97,\n",
+ " 'clave2': 8.49,\n",
+ " 'clave3': 9.79,\n",
+ " 'clave4': 8.53,\n",
+ " 'clave5': 0.43}\n",
+ "\n",
+ "dicc = {'clave1':['c','a','b'],\n",
+ " 'clave2':['casa','auto','barco'],\n",
+ " 'clave3':[1,2,3]}\n",
+ "\n",
+ "clients ['clave1']\n",
+ "clients ['clave4'] = 1.20\n",
+ "clients ['clave6'] = ['a', 'b', 'c']\n",
+ "# print (clients)\n",
+ "#for idx in enumerate (clients): # Creo una variable cualquiera\n",
+ "# print (idx[0], 'ha gastado', clients[idx[1]]) # \"algo\" para recorrer clients\n",
+ "#clients_sort=sorted(clients)\n",
+ "orden = len (clients.keys())\n",
+ "print ('nuemero e claves', orden)\n",
+ "print (clients) #\n",
+ " \n",
+ " \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 232,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{'clave1': 1.97, 'clave2': 8.49, 'clave3': 9.79, 'clave4': 8.53, 'clave5': 0.43}\n",
+ "{'clave1': 1.97, 'clave2': 8.49, 'clave3': 9.79, 'clave4': 8.53, 'clave5': 0.43, 'clave6': ['a', 'b', 'c']}\n"
+ ]
+ }
+ ],
+ "source": [
+ "clients = {'clave1': 1.97,\n",
+ " 'clave2': 8.49,\n",
+ " 'clave3': 9.79,\n",
+ " 'clave4': 8.53,\n",
+ " 'clave5': 0.43}\n",
+ "print (clients)\n",
+ "clients ['clave6']= ['a','b','c']\n",
+ "print (clients)\n"
]
}
],
diff --git a/Workbench/Taller/variables.py b/Workbench/Taller/variables.py
index bfd2c9c5b..feb9d0f3f 100644
--- a/Workbench/Taller/variables.py
+++ b/Workbench/Taller/variables.py
@@ -9,3 +9,26 @@
print (a+b)
total =2+4
print (total)
+# Ejemplo 10 - SWAP de variable - Deben ser del mismo tipo (INT)
+# caso 1) Creamos una Función
+
+def swap(a,b):
+ c=a
+ a=b
+ b=c
+ return a,b
+
+x = 5
+y = 4
+print (x,y)
+x,y= swap(x,y)
+print (x,y)
+print ()
+
+# caso 2) Directo y,x = x,y, propiedades de Python
+#
+x=10
+y=20
+print (x,y)
+x,y=y,x
+print (x,y)
\ No newline at end of file
From 02a9c8789d6da70f66a8ab6384442057d8757728 Mon Sep 17 00:00:00 2001
From: Jorge Cordova <55065873+jcordovaj@users.noreply.github.com>
Date: Sat, 28 Jan 2023 13:58:51 -0300
Subject: [PATCH 12/16] 28011358-Prueba Sync
---
Workbench/Taller/EjMix_DicLis.py | 446 +++++++++++++++++++++++++++++
Workbench/Taller/HC280123.ipynb | 302 +++++++++++++++++++
Workbench/Taller/pruebaerror.ipynb | 291 ++++++++-----------
3 files changed, 872 insertions(+), 167 deletions(-)
create mode 100644 Workbench/Taller/EjMix_DicLis.py
create mode 100644 Workbench/Taller/HC280123.ipynb
diff --git a/Workbench/Taller/EjMix_DicLis.py b/Workbench/Taller/EjMix_DicLis.py
new file mode 100644
index 000000000..e3ff8a747
--- /dev/null
+++ b/Workbench/Taller/EjMix_DicLis.py
@@ -0,0 +1,446 @@
+# Importante: No modificar ni el nombre ni los argumetos que reciben las funciones, sólo deben escribir
+# código dentro de las funciones ya definidas.
+
+def ListaDivisibles(numero, tope):
+ '''
+ Esta función devuelve una lista ordenada de menor a mayor con los números divisibles
+ por el parámetro número entre uno (1) y el valor del parámetro "tope"
+ Recibe dos argumentos:
+ numero: Numero entero divisor
+ tope: Máximo valor a evaluar a partir de uno (1)
+ Ej:
+ ListaDivisibles(6,30) debe retornar [6,12,18,24,30]
+ ListaDivisibles(10,5) debe retornar []
+ ListaDivisibles(7,50) debe retornar [7,14,21,28,35,42,49]
+ '''
+ #Tu código aca:
+ lista_rango = list(range(numero,tope+1))
+ lista_num_divisibles = []
+
+ if numero > tope:
+ print(lista_num_divisibles)
+ return lista_num_divisibles
+ if numero <= 0:
+ print(str(numero) + ', que corresponde a ser el divisor, NO puede ser = 0.')
+ return None
+
+ for i in lista_rango:
+ if (i % numero) == 0:
+ lista_num_divisibles.append(i)
+ lista_num_divisibles.sort(reverse=False)
+ print(lista_num_divisibles)
+ return lista_num_divisibles
+
+#ListaDivisibles(6,30)
+#ListaDivisibles(10,5)
+#ListaDivisibles(7,50)
+
+#O.K. - Revisado y testeado!
+
+
+def Exponente(numero, exponente):
+ '''
+ Esta función devuelve el resultado de elevar el parámetro "numero" al parámetro "exponente"
+ Recibe dos argumentos:
+ numero: El número base en la operación exponencial
+ exponente: El número exponente en la operación exponencial
+ Ej:
+ Exponente(10,3) debe retornar 1000
+ '''
+ #Tu código aca:
+ exponente = numero**exponente
+ print(exponente)
+ return exponente
+
+#Exponente(10,3)
+
+#O.K. - Revisado y testeado!
+
+
+def ListaDeListas(lista):
+ '''
+ Esta función recibe una lista, que puede contener elementos que a su vez sean listas y
+ devuelve esos elementos por separado en una lista única.
+ En caso de que el parámetro no sea de tipo lista, debe retornar nulo. Listo!
+ Recibe un argumento:
+ lista: La lista que puede contener otras listas y se convierte a una
+ lista de elementos únicos o no iterables.
+ Ej:
+ ListaDeListas([1,2,['a','b'],[10]]) debe retornar [1,2,'a','b',10]
+ ListaDeListas(108) debe retornar el valor nulo.
+ ListaDeListas([[1,2,[3]],[4]]) debe retornar [1,2,3,4]
+ '''
+ #Tu código aca:
+ listaplana = list()
+
+ if type(lista) != list:
+ print('No es una lista.')
+ return None
+
+ for elemento in lista:
+ if type(elemento) != list:
+ listaplana.append(elemento)
+ if type(elemento) == list:
+ for elemento2 in list(elemento):
+ if type(elemento2) != list:
+ listaplana.append(elemento2)
+ if type(elemento2) == list:
+ listaplana.extend(ListaDeListas(elemento2))
+
+
+
+ print(listaplana)
+ return listaplana
+
+
+#ListaDeListas([1,2,['a','b'],[10]])
+#ListaDeListas(108)
+#ListaDeListas([[1,2,[3]],[4]])
+#ListaDeListas([[1,2,[3,[6,6,6,[7,[['iri'],8,9,[11]],],6,6]]],[4]]) #extra prueba
+
+
+def Factorial(numero):
+ '''
+ Esta función devuelve el factorial del número pasado como parámetro.
+ En caso de que no sea de tipo entero y/o sea menor que 0, debe retornar nulo. ok
+ Recibe un argumento:
+ numero: Será el número con el que se calcule el factorial
+ Ej:
+ Factorial(4) debe retornar 24
+ Factorial(-2) debe retornar nulo
+ Factorial(0) debe retornar 1
+ '''
+ #Tu código aca:
+ if (type(numero) != int) or (numero < 0):
+ print('El numero no pertence a los enteros positivos.')
+ return None
+
+ import math
+
+ factorial = math.factorial(numero)
+ print(factorial)
+ return factorial
+
+#Factorial(9)
+#Factorial(4)
+#Factorial(-2)
+#Factorial(0)
+
+# O.K. tested & ok
+
+
+def ListaPrimos(desde, hasta):
+ '''
+ Esta función devuelve una lista con los números primos entre los valores "desde" y "hasta"
+ pasados como parámetro, siendo ambos inclusivos.
+
+ En caso de que alguno de los parámetros no sea de tipo entero y/o no sea mayor a cero,
+ debe retornar nulo. ok
+
+ En caso de que el segundo parámetro sea mayor al primero, pero ambos mayores que cero,
+ debe retornar una lista vacía. ok
+
+ Recibe un argumento:
+ desde: Será el número a partir del cual se toma el rango
+ hasta: Será el número hasta el cual se tome el rango
+
+ Ej:
+ ListaPrimos(7,15) debe retornar [7,11,13]
+ ListaPrimos(100,99) debe retornar []
+ ListaPrimos(1,7) debe retonan [1,2,3,5,7]
+ '''
+ #Tu código aca:
+
+ # 1. En caso de que alguno de los parámetros no sea de tipo entero y/o no sea mayor a cero,
+ # debe retornar nulo.
+
+ if(type(desde or hasta) != int) or ((desde or hasta) < 0):
+ print('Valores no son enteros reales positivos.')
+ return None
+
+ # 2. En caso de que el segundo parámetro sea mayor al primero, pero ambos mayores que cero,
+ # debe retornar una lista vacía.
+ # entiendo que hay un error en la consigna, si no deberíamos utilizar valores absolutos ya que la cuenta seria regresiva en -1, -2, -3 etc
+ # y supongo que lo que no quiere es que hagamos esto. obtener un desplazamiento negatico coodenada final(hasta) menos inicial(desde)..
+
+ if desde > hasta:
+ print('Parametros incorrectos.El valor "desde" debe ser menor que "hasta".')
+ return []
+
+
+ # 3. Esta función devuelve una lista con los números primos entre los valores "desde" y "hasta"
+ # pasados como parámetro, siendo ambos inclusivos.
+
+ # 3.1 Desde" y "hasta" pasados como parámetro, siendo ambos inclusivos.
+
+ lista_a_analizar = range(desde,hasta+1)
+ lista_ya_analizados = []
+ es_primo = True
+ lista_primos = []
+ import math
+
+ for elemento in lista_a_analizar:
+ for i in range(2,elemento):
+ if (elemento % i == 0):
+ es_primo = False
+ break
+ else:
+ es_primo = True
+ lista_primos.append(elemento)
+ break
+
+ print(lista_primos)
+ return lista_primos
+
+#ListaPrimos(7,15)
+#ListaPrimos(100,99)
+#ListaPrimos(1,7)
+#ListaPrimos(4,150) #prueba extra
+
+# O.K. tested & Chequed!
+
+
+
+
+
+def ListaRepetidos(lista):
+ '''
+ Esta función recibe como parámetro una lista y devuelve una lista de tuplas donde cada
+ tupla contiene un valor de la lista original y las veces que se repite. Los valores
+ de la lista original no deben estar repetidos.
+ Debe respetarse el orden original en el que aparecen los elementos.
+
+ En caso de que el parámetro no sea de tipo lista debe retornar nulo. ok
+
+ Recibe un argumento:
+ lista: Será la lista que se va a evaluar.
+ Ej:
+ ListaRepetidos([]) debe retornar []
+ ListaRepetidos(['hola', 'mundo', 'hola', 13, 14])
+ debe retornar [('hola',2),('mundo',1),(13,1),(14,1)]
+ ListaRepetidos([1,2,2,4]) debe retornar [(1,1),(2,2),(4,1)]
+ '''
+ #Tu código aca:
+
+ # 1. Esta función recibe como parámetro una lista ; En caso de que el parámetro no sea de tipo lista debe retornar nulo. ok
+ if type(lista) != list:
+ print('El parámetro ingresado no es una Lista.')
+ return None
+
+ # 2. Devuelve una lista de tuplas donde cada
+ # tupla contiene un valor de la lista original y las veces que se repite.
+ # Los valores de la lista original no deben estar repetidos.
+ # Debe respetarse el orden original en el que aparecen los elementos.
+ lista_ya_analizados = list()
+ for elemento in lista:
+ if (type(elemento) != list):
+
+ if (elemento not in lista_ya_analizados):
+ lista_ya_analizados.append(elemento)
+ else:
+ pass
+
+ if type(elemento) == list:
+ ListaRepetidos(elemento)
+ print('Lista de elementos unicos encontrados:')
+ print(lista_ya_analizados)
+
+ lista_cant_de_repeticiones = []
+
+ for elemento2 in lista_ya_analizados:
+ cantidad_de_repes_del_elemento2 = lista.count(elemento2)
+ lista_cant_de_repeticiones.append(cantidad_de_repes_del_elemento2)
+
+ print(lista_cant_de_repeticiones)
+
+ #conversion a tupla
+ respuesta = list(zip (lista_ya_analizados,lista_cant_de_repeticiones))
+ print(respuesta)
+ return respuesta
+
+
+#ListaRepetidos([])
+#ListaRepetidos(['hola', 'mundo', 'hola', 13, 14])
+#ListaRepetidos([1,2,2,4])
+#ListaRepetidos(ListaDeListas([1,[2,3,4,2,['l','k','j'],1,'q','w',],2,2,4,])) #extra prueba
+
+# O.K. Tested ok chequed
+
+
+
+def ClaseVehiculo(tipo, color):
+ '''
+ Esta función devuelve un objeto instanciado de la clase Vehiculo,
+ la cual debe tener los siguientes atributos:
+
+ Tipo: Un valor dentro de los valores posibles: ['auto','camioneta','moto']
+ Color: Un valor de tipo de dato string.
+ Velocidad: Un valor de tipo de dato float, que debe inicializarse en cero.
+
+ y debe tener el siguiente método:
+
+ Acelerar(): Este método recibe un parámetro con el valor que debe incrementar a la
+ propiedad Velocidad y luego retornarla.
+ Si la propiedad Velocidad cobra un valor menor a cero, debe quedar en cero.
+ Si la propiedad Velocidad cobra un valor mayor a cien, debe quedar en cien.
+
+ Recibe dos argumento:
+ tipo: Dato que se asignará al atributo Tipo del objeto de la clase Vehiculo
+ color: Dato que se asignará al atributo Color del objeto de la clase Vehiculo
+
+ Ej:
+ a = ClaseVehículo('auto','gris')
+ a.Acelerar(10) -> debe devolver 10
+ a.Acelerar(15) -> debe devolver 25
+ a.Acelerar(-10) -> debe devolver 15
+ '''
+ #Tu código aca:
+ lista_tipos_permitidos = ['auto','camioneta','moto']
+
+ # Validaciones al crear la CLASE:
+
+ if tipo not in lista_tipos_permitidos:
+ print('Error al crear la clase, este tipo de vehiculo no se permite crear, solo estos se pueden: ("auto", "camioneta", "moto").')
+ print('Error al crear vehiculo.')
+ return None
+
+ if type(color) != str:
+ print('El dato "color" no es un str.')
+ print('Error al crear vehiculo.')
+ return None
+
+ tipo = tipo
+ color = color
+
+ # Creando un vehiculo
+ # Para ello debe existir primero la clase dentro de la funcion.
+ # de manera que siempre exista dentro del paquete de la funcion si esta se exporta.
+ class Vehicle:
+ '''
+ Clase Veiculos dentro de funcion crear vehiculo.
+ '''
+ def __init__(self,tipo,color,velocidad = float(0)):
+
+ self.tipo = tipo
+ self.color = color
+ self.velocidad = float()
+ self.incremento_velocidad = float(0)
+
+ def Acelerar(self,incremento_velocidad = float(0)):
+ """
+ Este método recibe un parámetro con el valor que debe incrementar a la
+ propiedad Velocidad y luego retornarla.
+
+ Si la propiedad Velocidad cobra un valor menor a cero, debe quedar en cero.
+
+ Si la propiedad Velocidad cobra un valor mayor a cien, debe quedar en cien.
+ """
+ velocidad_inicial = self.velocidad
+ velocidad_final = velocidad_inicial + incremento_velocidad
+
+ if velocidad_final > 100:
+ velocidad_final = 100
+ self.velocidad = velocidad_final
+ return self.velocidad
+ elif velocidad_final < 0:
+ velocidad_final = 0
+ self.velocidad = velocidad_final
+ return self.velocidad
+ else:
+ self.velocidad = velocidad_final
+ return self.velocidad
+
+ def PropiedadesDelVehiculo(self,tipo,color,velocidad):
+ print(tipo)
+ print(color)
+ print(velocidad)
+ return tipo , color, velocidad
+
+ vehiculo_creado = Vehicle(tipo,color)
+ return vehiculo_creado
+
+#a = ClaseVehiculo('auto','gris')
+#print(a)
+#print(a.Acelerar(10))
+#print(a.Acelerar(15))
+#print(a.Acelerar(-10))
+
+# O.K. tested ok checked
+
+
+
+def OrdenarDiccionario(diccionario_par, clave, descendente=bool(True)):
+ '''
+ Esta función recibe como parámetro un diccionario,
+ cuyas listas de valores tienen el mismo tamaño y
+ sus elementos enésimos están asociados.
+
+ Y otros dos parámetros que indicanla clave por la cual debe ordenarse y si es descendente o ascendente.
+
+ La función debe devolver el diccionario ordenado, teniendo en cuenta de no perder la
+ relación entre los elementos enésimos.
+
+ Recibe tres argumentos:
+ diccionario: Diccionario a ordenar.
+ clave: Clave del diccionario recibido, por la cual ordenar.
+ descendente: Un valor booleano, que al ser verdadero indica ordenamiento ascendente y
+ descendente si es falso.
+ Debe tratarse de un parámetro por defecto en True.
+
+ Si el parámetro diccionario no es un tipo de dato diccionario ok
+ ó el parámetro clave no se encuentra dentro de las claves del diccionario, debe devolver nulo. ok
+
+ Ej:
+
+ dicc = {'clave1':['c','a','b'],
+ 'clave2':['casa','auto','barco'],
+ 'clave3':[1,2,3]}
+ OrdenarDiccionario(dicc, 'clave1') debe retornar {'clave1':['a','b','c'],
+ 'clave2':['auto','barco','casa'],
+ 'clave3':[2,3,1]}
+ OrdenarDiccionario(dicc, 'clave3', False) debe retornar {'clave1':['b','a','c'],
+ 'clave2':['barco','auto','casa'],
+ 'clave3':[3,2,1]}
+ '''
+ #Tu código aca:
+
+
+ # Si el parámetro diccionario no es un tipo de dato diccionario
+ # ó el parámetro clave no se encuentra dentro de las claves del diccionario, debe devolver nulo.
+
+ if (type(diccionario_par) != dict) | (clave not in diccionario_par):
+ print('El parámetro recibido como diccionario, no lo es en cuanto a tipo de dato.')
+ print('O la clave ingresada no se encuentra dentro de las claves posivbles del diccionario.')
+ return None
+
+ # valido longitud en ambas deirecciones de la matriz diccionario:
+ #cantidadd de claves como de elementos, a su vez, dentro de las claves.')
+
+ """
+ dicc = { 'clave1': ['c','a','b'],
+ 'clave2': ['casa','auto','barco'],
+ 'clave3': [1,2,3]}
+
+ OrdenarDiccionario(dicc, 'clave1')
+ """
+
+
+ for i in diccionario_par:
+ if i == clave:
+ for j in diccionario_par:
+ if descendente == False:
+ diccionario_par[j].sort()
+ if descendente == True:
+ diccionario_par[j].sort(reverse=True)
+
+
+ print(diccionario_par)
+ return diccionario_par
+
+
+# OrdenarDiccionario(dicc, 'clave3',True)
+# OrdenarDiccionario(dicc, 'clave3',False)
+# OrdenarDiccionario(dicc, 'clave1',True)
+#OrdenarDiccionario(dicc, 'clave4',False)
+
+#checked OK. tested OK.
\ No newline at end of file
diff --git a/Workbench/Taller/HC280123.ipynb b/Workbench/Taller/HC280123.ipynb
new file mode 100644
index 000000000..552712320
--- /dev/null
+++ b/Workbench/Taller/HC280123.ipynb
@@ -0,0 +1,302 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[3, 6, 9]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# LISTA DIVISIBLES\n",
+ "\n",
+ "# ListaDivisibles(12, 10)\n",
+ "# lista_esperada = []\n",
+ "\n",
+ "# ListaDivisibles(12, 100)\n",
+ "# lista_esperada = [12,24,36,48,60,72,84,96]\n",
+ "\n",
+ "# ListaDivisibles(3, 9)\n",
+ "# lista_esperada = [3,6,9]\n",
+ "\n",
+ "def ListaDivisibles(numero, tope):\n",
+ " '''\n",
+ " Esta función devuelve una lista ordenada de menor a mayor con los números divisibles \n",
+ " por el parámetro número entre uno (1) y el valor del parámetro \"tope\"\n",
+ " Recibe dos argumentos:\n",
+ " numero: Numero entero divisor\n",
+ " tope: Máximo valor a evaluar a partir de uno (1)\n",
+ " Ej:\n",
+ " ListaDivisibles(6,30) debe retornar [6,12,18,24,30]\n",
+ " ListaDivisibles(10,5) debe retornar []\n",
+ " ListaDivisibles(7,50) debe retornar [7,14,21,28,35,42,49]\n",
+ " '''\n",
+ " #Tu código aca:\n",
+ " lint = list(range(numero,tope+1))\n",
+ " ldiv = []\n",
+ " \n",
+ " if numero > tope:\n",
+ " print(ldiv)\n",
+ " return ldiv\n",
+ " if numero <= 0:\n",
+ " print(str(numero) + ', que corresponde a ser el divisor, NO puede ser = 0.')\n",
+ " return None\n",
+ " for i in lint:\n",
+ " if (i % numero) == 0:\n",
+ " ldiv.append(i)\n",
+ " ldiv.sort(reverse=False)\n",
+ " print(ldiv) \n",
+ " return ldiv\n",
+ " \n",
+ "lista_divisible=ListaDivisibles(3, 9)\n",
+ " # 12, 10 []\n",
+ " # 12. 100 [12,24,36,48,60,72,84,96]\n",
+ " # 3, 9 [3,6,9]\n",
+ "\n",
+ "# Test OK!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1000"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Exponente(10, 2)\n",
+ "# valor_esperado = 100\n",
+ "# Exponente(49, 0.5)\n",
+ "# valor_esperado = 7\n",
+ "# Exponente(3, 0)\n",
+ "# valor_esperado = 1\n",
+ " \n",
+ "def Exponente(numero, exponente):\n",
+ " '''\n",
+ " Esta función devuelve el resultado de elevar el parámetro \"numero\" al parámetro \"exponente\"\n",
+ " Recibe dos argumentos:\n",
+ " numero: El número base en la operación exponencial\n",
+ " exponente: El número exponente en la operación exponencial\n",
+ " Ej:\n",
+ " Exponente(10,3) debe retornar 1000\n",
+ " '''\n",
+ " #Tu código aca:\n",
+ " res=numero**exponente\n",
+ " return res\n",
+ "Exponente(10,3)\n",
+ "\n",
+ "# Test OK!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[1, 2, 3]"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "#\n",
+ "def ListaDeListas(lista):\n",
+ " '''\n",
+ " Esta función recibe una lista, que puede contener elementos que a su vez sean listas y\n",
+ " devuelve esos elementos por separado en una lista única. \n",
+ " En caso de que el parámetro no sea de tipo lista, debe retornar nulo.\n",
+ " Recibe un argumento:\n",
+ " lista: La lista que puede contener otras listas y se convierte a una \n",
+ " lista de elementos únicos o no iterables.\n",
+ " Ej:\n",
+ " ListaDeListas([1,2,['a','b'],[10]]) debe retornar [1,2,'a','b',10]\n",
+ " ListaDeListas(108) debe retornar el valor nulo.\n",
+ " ListaDeListas([[1,2,[3]],[4]]) debe retornar [1,2,3,4]\n",
+ " '''\n",
+ " #Tu código aca:\n",
+ " if type(lista) != list:\n",
+ " return None\n",
+ " else:\n",
+ " lista_final=[]\n",
+ " for elem in lista:\n",
+ " if isinstance(elem, list):\n",
+ " lista_final.extend(ListaDeListas(elem))\n",
+ " else:\n",
+ " lista_final.append(elem)\n",
+ " return lista_final\n",
+ "ListaDeListas ([[[1]],2,[[[[3]]]]])\n",
+ "# ListaDeListas(100)\n",
+ "# lista_esperada = None\n",
+ "# # ListaDeListas([1,[2,3],[[4,5],6],[[7]]])\n",
+ "# lista_esperada = [1,2,3,4,5,6,7]\n",
+ "# # ListaDeListas(['a','b',1,2,['a1','b3'],[['a'],2]])\n",
+ "# lista_esperada = ['a','b',1,2,'a1','b3','a',2]\n",
+ "# # ListaDeListas([[[1]],2,[[[[3]]]]])\n",
+ "# lista_esperada = [1,2,3] \n",
+ "# Test OK!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "362880"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def Factorial(numero):\n",
+ " '''\n",
+ " Esta función devuelve el factorial del número pasado como parámetro.\n",
+ " En caso de que no sea de tipo entero y/o sea menor que 0, debe retornar nulo.\n",
+ " Recibe un argumento:\n",
+ " numero: Será el número con el que se calcule el factorial\n",
+ " Ej:\n",
+ " Factorial(4) debe retornar 24\n",
+ " Factorial(-2) debe retornar nulo\n",
+ " Factorial(0) debe retornar 1\n",
+ " '''\n",
+ " #Tu código aca:\n",
+ " if (numero <1):\n",
+ " return None\n",
+ " if numero==0 or numero==1:\n",
+ " resultado=1\n",
+ " elif numero>1:\n",
+ " resultado=numero*Factorial(numero-1)\n",
+ " return resultado\n",
+ "\n",
+ "Factorial(9)\n",
+ "# Test 1 Factorial(5) OK\n",
+ "# valor_esperado = 120\n",
+ "# Test 2 Factorial(1) OK\n",
+ "# valor_esperado = 1 \n",
+ "# Test 3 Factorial(0) OK\n",
+ "# valor_esperado = 1\n",
+ "# Test 4 Factorial(9) OK\n",
+ "# valor_esperado = 362880"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[67, 71, 73]"
+ ]
+ },
+ "execution_count": 29,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def ListaPrimos(desde, hasta):\n",
+ " '''\n",
+ " Esta función devuelve una lista con los números primos entre los valores \"desde\" y \"hasta\"\n",
+ " pasados como parámetro, siendo ambos inclusivos.\n",
+ " En caso de que alguno de los parámetros no sea de tipo entero y/o no sea mayor a cero, debe retornar nulo.\n",
+ " En caso de que el segundo parámetro sea menor al primero, pero ambos mayores que cero,\n",
+ " debe retornar una lista vacía.\n",
+ " Recibe un argumento:\n",
+ " desde: Será el número a partir del cual se toma el rango\n",
+ " hasta: Será el número hasta el cual se tome el rango\n",
+ " Ej:\n",
+ " ListaPrimos(7,15) debe retornar [7,11,13]\n",
+ " ListaPrimos(100,99) debe retornar []\n",
+ " ListaPrimos(1,7) debe retonan [1,2,3,5,7]\n",
+ " '''\n",
+ " #Tu código aca:\n",
+ " lp=[]\n",
+ " # Ciclos 'if' Validar las variables de entrada\n",
+ " if (type(desde) != int or type(hasta) != int):\n",
+ " return None\n",
+ " if (desde < 0 or hasta < 0):\n",
+ " return None\n",
+ " if (desde > hasta):\n",
+ " return lp \n",
+ " def calculaPrimo(num):\n",
+ " if num==2:\n",
+ " return True\n",
+ " for n in range (2,num):\n",
+ " if(num%n!=0):\n",
+ " continue\n",
+ " else:\n",
+ " return False\n",
+ " return True\n",
+ " for i in range(desde,(hasta+1)):\n",
+ " if calculaPrimo(i):\n",
+ " lp.append(i)\n",
+ " return lp\n",
+ "\n",
+ "ListaPrimos(66,77)\n",
+ "# Test_01 ListaPrimos(1,11)\n",
+ "# Lista_esperada = [1,2,3,5,7,11] OK!\n",
+ "# Test_02 ListaPrimos('0',0)\n",
+ "# Lista_esperada = None OK!\n",
+ "# Test_03 ListaPrimos(66,77)\n",
+ "# Lista_esperada = [67, 71, 73] OK!\n",
+ "# Test__04 ListaPrimos(0,'66')\n",
+ "# Lista_esperada = None\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.6"
+ },
+ "orig_nbformat": 4,
+ "vscode": {
+ "interpreter": {
+ "hash": "d3777ed8f5fe800f0d3d1926318eb186c93d9a88e13881725c87e5bdd2f1dd1d"
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/Workbench/Taller/pruebaerror.ipynb b/Workbench/Taller/pruebaerror.ipynb
index 3c875a91e..635127dd4 100644
--- a/Workbench/Taller/pruebaerror.ipynb
+++ b/Workbench/Taller/pruebaerror.ipynb
@@ -76,6 +76,66 @@
"a1.Doblar(100)"
]
},
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[3, 6, 9]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# LISTA DIVISIBLES\n",
+ "\n",
+ "# ListaDivisibles(12, 10)\n",
+ "# lista_esperada = []\n",
+ "\n",
+ "# ListaDivisibles(12, 100)\n",
+ "# lista_esperada = [12,24,36,48,60,72,84,96]\n",
+ "\n",
+ "# ListaDivisibles(3, 9)\n",
+ "# lista_esperada = [3,6,9]\n",
+ "\n",
+ "def ListaDivisibles(numero, tope):\n",
+ " '''\n",
+ " Esta función devuelve una lista ordenada de menor a mayor con los números divisibles \n",
+ " por el parámetro número entre uno (1) y el valor del parámetro \"tope\"\n",
+ " Recibe dos argumentos:\n",
+ " numero: Numero entero divisor\n",
+ " tope: Máximo valor a evaluar a partir de uno (1)\n",
+ " Ej:\n",
+ " ListaDivisibles(6,30) debe retornar [6,12,18,24,30]\n",
+ " ListaDivisibles(10,5) debe retornar []\n",
+ " ListaDivisibles(7,50) debe retornar [7,14,21,28,35,42,49]\n",
+ " '''\n",
+ " #Tu código aca:\n",
+ " lint = list(range(numero,tope+1))\n",
+ " ldiv = []\n",
+ " \n",
+ " if numero > tope:\n",
+ " print(ldiv)\n",
+ " return ldiv\n",
+ " if numero <= 0:\n",
+ " print(str(numero) + ', que corresponde a ser el divisor, NO puede ser = 0.')\n",
+ " return None\n",
+ " for i in lint:\n",
+ " if (i % numero) == 0:\n",
+ " ldiv.append(i)\n",
+ " ldiv.sort(reverse=False)\n",
+ " print(ldiv) \n",
+ " return ldiv\n",
+ " \n",
+ "lista_divisible=ListaDivisibles(3, 9)\n",
+ " # 12, 10 []\n",
+ " # 12. 100 [12,24,36,48,60,72,84,96]\n",
+ " # 3, 9 [3,6,9]"
+ ]
+ },
{
"cell_type": "code",
"execution_count": 8,
@@ -850,31 +910,17 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 4,
"metadata": {},
- "outputs": [],
- "source": [
- "valor=777\n",
- "print (valor)\n",
- "print ()\n",
- "cadena=str(valor)\n",
- "indice=-1\n",
- "iguales=0\n",
- "for x in range(0,len(cadena)/2):\n",
- " if cadena[x]==cadena[indice]:\n",
- " iguales=iguales+1\n",
- " indice=indice-1\n",
- "if iguales==(len(cadena)/2):\n",
- " print ('Es capicua')\n",
- "else:\n",
- " print ('No es capicua')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "True\n"
+ ]
+ }
+ ],
"source": [
"'''\n",
" En matemáticas, la palabra capicúa (del catalán cap i cua, 'cabeza y cola') \n",
@@ -975,43 +1021,15 @@
},
{
"cell_type": "code",
- "execution_count": 414,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2\n"
- ]
- }
- ],
- "source": [
- "print (27%5)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 406,
+ "execution_count": 415,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "1\n",
- "3\n",
- "17\n",
- "51\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"#def divisores ():\n",
- "num = int (input ('Escribe un entero'))\n",
+ "num = 10 #int (input ('Escribe un entero'))\n",
"listaFC = []\n",
- "i=1\n",
- "while i<=num:\n",
+ "i=2\n",
+ "while num/c) !=1:\n",
" if num%i==0:\n",
" listaFC.append(num//i)\n",
" listaFC.sort()\n",
@@ -1090,17 +1108,9 @@
},
{
"cell_type": "code",
- "execution_count": 335,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "['c', 'a', 'b']\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"from operator import itemgetter\n",
"def OrdenarDiccionario(diccionario_par, clave, descendente=True):\n",
@@ -1150,17 +1160,9 @@
},
{
"cell_type": "code",
- "execution_count": 275,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "{'clave1': ['c', 'a', 'b'], 'clave2': ['casa', 'auto', 'barco'], 'clave3': [1, 2, 3]}\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"dicc = {\n",
" 'clave1':['c','a','b'],\n",
@@ -1178,17 +1180,9 @@
},
{
"cell_type": "code",
- "execution_count": 325,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "{'clave1': ['c', 'a', 'b'], 'clave2': ['casa', 'auto', 'barco'], 'clave3': [1, 2, 3]}\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"key_list = ['clave1', 'clave2', 'clave3']\n",
"value_list1 = [['c', 'a', 'b'], ['casa', 'auto', 'barco'], [1, 2, 3]]\n",
@@ -1203,18 +1197,19 @@
},
{
"cell_type": "code",
- "execution_count": 330,
+ "execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "{'nombre': 'Juan', 'edad': '27', 'ciudad': 'Nueva York'}\n"
+ "{'clave1': 'Juan', 'clave2': '27', 'clave3': 'Nueva York'}\n"
]
}
],
"source": [
+ "# Une dos listas en un dict\n",
"key_list = ['clave1', 'clave2', 'clave3']\n",
"value_list = ['Juan', '27', 'Nueva York']\n",
"\n",
@@ -1222,18 +1217,6 @@
"print(dict_from_list)"
]
},
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "def sum (a,b):\n",
- " return 'Null'\n",
- " \n",
- "sum (2,3)"
- ]
- },
{
"cell_type": "code",
"execution_count": null,
@@ -1283,18 +1266,9 @@
},
{
"cell_type": "code",
- "execution_count": 324,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Ord1= [('Gris', '1892-B', 'M'), ('Azul', '2901-Z', 'M'), ('Rojo', '4859-A', 'A')]\n",
- "Ord2= [{'color': 'Gris', 'matricula': '1892-B', 'cambio': 'M'}, {'color': 'Azul', 'matricula': '2901-Z', 'cambio': 'M'}, {'color': 'Rojo', 'matricula': '4859-A', 'cambio': 'A'}]\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"# Ordenar una lista de coches almacenados como tuplas\n",
"tuplas_coches = [\n",
@@ -1323,7 +1297,7 @@
},
{
"cell_type": "code",
- "execution_count": 281,
+ "execution_count": 11,
"metadata": {},
"outputs": [
{
@@ -1335,10 +1309,10 @@
}
],
"source": [
- "dicc={'midic':('a',b'')}\n",
- "if type(diccionario_pa) != dict:\n",
- " if type(get)\n",
- " return None\n",
+ "dicc={'midic':('a','b')}\n",
+ "if type(dicc) != dict:\n",
+ " if type(getattr(dicc)!= False):\n",
+ " pass #return None\n",
"dicc2={'clave1':['b','a','c'], 'clave2':['barco','auto','casa'],'clave3':[3,2,1]}\n",
"print ('este es el dicc ordenado por la clave X', dicc2)"
]
@@ -1349,34 +1323,22 @@
"metadata": {},
"outputs": [],
"source": [
+ "dicc ={\n",
+ "'clave1':['c', 'a', 'b'],\n",
+ "'clave2':['casa', 'auto', 'barco'],\n",
+ "'clave3':[3,2,1]}\n",
+ "\n",
"juegos = [\n",
- " {\n",
- " \"nombre\": \"Resident Evil 2\",\n",
- " \"calificacion\": 99,\n",
- " },\n",
- " {\n",
- " \"nombre\": \"Crash Bandicoot N. Sane Trilogy\",\n",
- " \"calificacion\": 76,\n",
- " },\n",
- "\n",
- " {\n",
- " \"nombre\": \"Cuphead\",\n",
- " \"calificacion\": 100,\n",
- " },\n",
- " {\n",
- " \"nombre\": \"Minecraft\",\n",
- " \"calificacion\": 80,\n",
- " },\n",
- " {\n",
- " \"nombre\": \"Bioshock\",\n",
- " \"calificacion\": 95,\n",
- " },\n",
- "]\n",
+ "{\"nombre\": \"Resident Evil 2\", \"calificacion\": 99,},\n",
+ "{\"nombre\": \"Crash Bandicoot\", \"calificacion\": 76,},\n",
+ "{\"nombre\": \"Cuphead\", \"calificacion\": 100,},\n",
+ "{\"nombre\": \"Minecraft\", \"calificacion\": 80,},\n",
+ "{\"nombre\": \"Bioshock\", \"calificacion\": 95,},]\n",
+ "\n",
"def funcion_que_devuelve_clave(juego):\n",
" # Vamos a ordenar basándonos en su calificación, y como se nos\n",
" # va a pasar un diccionario, devolvemos el elemento \"calificacion\"\n",
- " return juego[\"calificacion\"]\n",
- "\n",
+ " return juego[\"nombre\"]\n",
"# La ordenamos\n",
"juegos_ordenados = sorted(juegos, key=funcion_que_devuelve_clave)\n",
"print(\"Ordenada por calificación ascendente: \")\n",
@@ -1385,25 +1347,15 @@
"# También se puede en orden inverso\n",
"juegos_ordenados = sorted(juegos, key=funcion_que_devuelve_clave, reverse=True)\n",
"print(\"Ordenada por calificación descendente: \")\n",
- "\n",
"for juego in juegos_ordenados:\n",
" print(juego)"
]
},
{
"cell_type": "code",
- "execution_count": 250,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "nuemero e claves 6\n",
- "{'clave1': 1.97, 'clave2': 8.49, 'clave3': 9.79, 'clave4': 1.2, 'clave5': 0.43, 'clave6': ['a', 'b', 'c']}\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"clients = {'clave1': 1.97,\n",
" 'clave2': 8.49,\n",
@@ -1423,26 +1375,16 @@
"# print (idx[0], 'ha gastado', clients[idx[1]]) # \"algo\" para recorrer clients\n",
"#clients_sort=sorted(clients)\n",
"orden = len (clients.keys())\n",
- "print ('nuemero e claves', orden)\n",
- "print (clients) #\n",
- " \n",
+ "print ('Número de claves', orden)\n",
+ "print (clients) \n",
" \n"
]
},
{
"cell_type": "code",
- "execution_count": 232,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "{'clave1': 1.97, 'clave2': 8.49, 'clave3': 9.79, 'clave4': 8.53, 'clave5': 0.43}\n",
- "{'clave1': 1.97, 'clave2': 8.49, 'clave3': 9.79, 'clave4': 8.53, 'clave5': 0.43, 'clave6': ['a', 'b', 'c']}\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"clients = {'clave1': 1.97,\n",
" 'clave2': 8.49,\n",
@@ -1453,6 +1395,21 @@
"clients ['clave6']= ['a','b','c']\n",
"print (clients)\n"
]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "lisdic=[]\n",
+ "for i in range (3):\n",
+ " for j in range (3):\n",
+ " for k in range (3):\n",
+ " lisdic=print(i,j,k)\n",
+ "\n",
+ "print (lisdic, end=\", \")"
+ ]
}
],
"metadata": {
From 95a65e6bafc5cbb921dccc53b557228523dd9fac Mon Sep 17 00:00:00 2001
From: Jorge Cordova <55065873+jcordovaj@users.noreply.github.com>
Date: Sat, 28 Jan 2023 14:58:15 -0300
Subject: [PATCH 13/16] Up 1457
---
Workbench/Taller/HC280123.ipynb | 66 ++++++++++++++++++++++++++++++---
1 file changed, 60 insertions(+), 6 deletions(-)
diff --git a/Workbench/Taller/HC280123.ipynb b/Workbench/Taller/HC280123.ipynb
index 552712320..eb07e7368 100644
--- a/Workbench/Taller/HC280123.ipynb
+++ b/Workbench/Taller/HC280123.ipynb
@@ -105,7 +105,7 @@
},
{
"cell_type": "code",
- "execution_count": 15,
+ "execution_count": 30,
"metadata": {},
"outputs": [
{
@@ -114,7 +114,7 @@
"[1, 2, 3]"
]
},
- "execution_count": 15,
+ "execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
@@ -138,13 +138,13 @@
" if type(lista) != list:\n",
" return None\n",
" else:\n",
- " lista_final=[]\n",
+ " guardaLdeL=[]\n",
" for elem in lista:\n",
" if isinstance(elem, list):\n",
- " lista_final.extend(ListaDeListas(elem))\n",
+ " guardaLdeL.extend(ListaDeListas(elem))\n",
" else:\n",
- " lista_final.append(elem)\n",
- " return lista_final\n",
+ " guardaLdeL.append(elem)\n",
+ " return guardaLdeL\n",
"ListaDeListas ([[[1]],2,[[[[3]]]]])\n",
"# ListaDeListas(100)\n",
"# lista_esperada = None\n",
@@ -270,6 +270,60 @@
"# Test__04 ListaPrimos(0,'66')\n",
"# Lista_esperada = None\n"
]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[('hola', 2), ('mundo', 1)]"
+ ]
+ },
+ "execution_count": 38,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def ListaRepetidos(lista):\n",
+ " '''\n",
+ " Esta función recibe como parámetro una lista y devuelve una lista de tuplas donde cada \n",
+ " tupla contiene un valor de la lista original y las veces que se repite. Los valores \n",
+ " de la lista original no deben estar repetidos. \n",
+ " Debe respetarse el orden original en el que aparecen los elementos.\n",
+ " En caso de que el parámetro no sea de tipo lista debe retornar nulo.\n",
+ " Recibe un argumento:\n",
+ " lista: Será la lista que se va a evaluar.\n",
+ " Ej:\n",
+ " ListaRepetidos([]) debe retornar []\n",
+ " ListaRepetidos(['hola', 'mundo', 'hola', 13, 14]) \n",
+ " debe retornar [('hola',2),('mundo',1),(13,1),(14,1)]\n",
+ " ListaRepetidos([1,2,2,4]) debe retornar [(1,1),(2,1),(4,1)]\n",
+ " '''\n",
+ " #Tu código aca:\n",
+ " swap=[]\n",
+ " if type(lista) != list:\n",
+ " return None\n",
+ " while len(lista)>0:\n",
+ " eleTup=lista[0]\n",
+ " contador=lista.count(lista[0])\n",
+ " swap.append((eleTup,contador))\n",
+ " for i in range(lista.count(lista[0])):\n",
+ " lista.remove(eleTup)\n",
+ " continue\n",
+ " return swap\n",
+ "\n",
+ "ListaRepetidos(['hola', 'mundo', 'hola'])\n",
+ "# Test_01 ListaRepetidos (['hola', 'mundo', 'hola'])\n",
+ "# Lista_esperada = [('hola',2),('mundo',1)]\n",
+ "# Test_02 ListaRepetidos ([10,11,11,12,15,17,20,20])\n",
+ "# Lista_esperada = [(10,1),(11,2),(12,1),(15,1),(17,1),(20,2)]\n",
+ "# Test_03 ListaRepetidos ((1,2,3,3))\n",
+ "# Lista_esperada = None"
+ ]
}
],
"metadata": {
From a6213bb9a11985901a9086410ccdc11c84b66fd5 Mon Sep 17 00:00:00 2001
From: Jorge Cordova <55065873+jcordovaj@users.noreply.github.com>
Date: Sat, 28 Jan 2023 19:23:20 -0300
Subject: [PATCH 14/16] Up Hasta Ej ClassAuto, 24 pts acumulados, resta 1
---
Workbench/Taller/FuncionFactorial.py | 6 +-
Workbench/Taller/HC280123.ipynb | 223 +++++++++++++++++++++++++--
2 files changed, 212 insertions(+), 17 deletions(-)
diff --git a/Workbench/Taller/FuncionFactorial.py b/Workbench/Taller/FuncionFactorial.py
index c004bb55e..33750e301 100644
--- a/Workbench/Taller/FuncionFactorial.py
+++ b/Workbench/Taller/FuncionFactorial.py
@@ -12,11 +12,11 @@
def factorial(n):
if (n <1):
return None
- if n==0 or n==1:
+ elif n==0 or n==1:
resultado=1
- elif n>1:
+ if n>1:
resultado=n*factorial(n-1)
return resultado
-fact=factorial(5)
+fact=factorial(0)
print (fact)
\ No newline at end of file
diff --git a/Workbench/Taller/HC280123.ipynb b/Workbench/Taller/HC280123.ipynb
index eb07e7368..ef10b0d74 100644
--- a/Workbench/Taller/HC280123.ipynb
+++ b/Workbench/Taller/HC280123.ipynb
@@ -159,16 +159,16 @@
},
{
"cell_type": "code",
- "execution_count": 22,
+ "execution_count": 56,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- "362880"
+ "1"
]
},
- "execution_count": 22,
+ "execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
@@ -186,15 +186,17 @@
" Factorial(0) debe retornar 1\n",
" '''\n",
" #Tu código aca:\n",
- " if (numero <1):\n",
+ " if (type(numero) != int):\n",
" return None\n",
- " if numero==0 or numero==1:\n",
- " resultado=1\n",
- " elif numero>1:\n",
- " resultado=numero*Factorial(numero-1)\n",
- " return resultado\n",
+ " if (numero < 0):\n",
+ " return None\n",
+ " factorial = 1\n",
+ " for n in range(1, (numero)+1):\n",
+ " factorial = factorial * n\n",
+ " return factorial\n",
+ " \n",
+ "Factorial(1)\n",
"\n",
- "Factorial(9)\n",
"# Test 1 Factorial(5) OK\n",
"# valor_esperado = 120\n",
"# Test 2 Factorial(1) OK\n",
@@ -205,6 +207,36 @@
"# valor_esperado = 362880"
]
},
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "120"
+ ]
+ },
+ "execution_count": 60,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def Factorial(numero):\n",
+ " if (type(numero) != int):\n",
+ " return None\n",
+ " if (numero < 0):\n",
+ " return None\n",
+ " f = 1\n",
+ " for n in range(1, (numero)+1):\n",
+ " f = f * n\n",
+ " return f\n",
+ "\n",
+ "Factorial(5)"
+ ]
+ },
{
"cell_type": "code",
"execution_count": 29,
@@ -273,16 +305,16 @@
},
{
"cell_type": "code",
- "execution_count": 38,
+ "execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- "[('hola', 2), ('mundo', 1)]"
+ "[(1, 1), (2, 2), (4, 1)]"
]
},
- "execution_count": 38,
+ "execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
@@ -316,7 +348,7 @@
" continue\n",
" return swap\n",
"\n",
- "ListaRepetidos(['hola', 'mundo', 'hola'])\n",
+ "ListaRepetidos([1,2,2,4])\n",
"# Test_01 ListaRepetidos (['hola', 'mundo', 'hola'])\n",
"# Lista_esperada = [('hola',2),('mundo',1)]\n",
"# Test_02 ListaRepetidos ([10,11,11,12,15,17,20,20])\n",
@@ -324,6 +356,169 @@
"# Test_03 ListaRepetidos ((1,2,3,3))\n",
"# Lista_esperada = None"
]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 71,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "15"
+ ]
+ },
+ "execution_count": 71,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def ClaseVehiculo(tipo, color):\n",
+ " '''\n",
+ " Esta función devuelve un objeto instanciado de la clase Vehiculo, \n",
+ " la cual debe tener los siguientes atributos:\n",
+ " Tipo: Un valor dentro de los valores posibles: ['auto','camioneta','moto']\n",
+ " Color: Un valor de tipo de dato string.\n",
+ " Velocidad: Un valor de tipo de dato float, que debe inicializarse en cero.\n",
+ " y debe tener el siguiente método:\n",
+ " Acelerar(): Este método recibe un parámetro con el valor que debe incrementar a la\n",
+ " propiedad Velocidad y luego retornarla.\n",
+ " Si la propiedad Velocidad cobra un valor menor a cero, debe quedar en cero.\n",
+ " Si la propiedad Velocidad cobra un valor mayor a cien, debe quedar en cien.\n",
+ " Recibe dos argumento:\n",
+ " tipo: Dato que se asignará al atributo Tipo del objeto de la clase Vehiculo\n",
+ " color: Dato que se asignará al atributo Color del objeto de la clase Vehiculo\n",
+ " Ej:\n",
+ " a = ClaseVehículo('auto','gris')\n",
+ " a.Acelerar(10) -> debe devolver 10\n",
+ " a.Acelerar(15) -> debe devolver 25\n",
+ " a.Acelerar(-10) -> debe devolver 15\n",
+ " '''\n",
+ " #Tu código aca:\n",
+ " class Vehiculo:\n",
+ " def __init__(self, tipo, color):\n",
+ " if (tipo=='auto' or tipo =='camioneta' or tipo=='moto'):\n",
+ " self.Tipo = tipo\n",
+ " else:\n",
+ " raise TypeError ('el tipo de vehículo tiene que ser auto, camioneta o moto')\n",
+ " self.Color = color\n",
+ " self.Velocidad = 0\n",
+ "\n",
+ " def Acelerar(self, acel):\n",
+ " self.Velocidad += acel\n",
+ " if self.Velocidad < 0:\n",
+ " self.Velocidad=0\n",
+ " if self.Velocidad>100:\n",
+ " self.Velocidad=100\n",
+ " return self.Velocidad\n",
+ " \n",
+ " a = Vehiculo(tipo, color) \n",
+ " return a\n",
+ "\n",
+ "# Test_01 ClaseVehiculo('auto','verde')\n",
+ "# valor_test = a.Acelerar(10)\n",
+ "# valor_test = a.Acelerar(100)\n",
+ "# valor_test = a.Acelerar(-20)\n",
+ "# valor_esperado = 80\n",
+ "# self.assertEqual(valor_test, valor_esperado)\n",
+ "# Test_02 ClaseVehiculo('camioneta','azul')\n",
+ "# valor_test = a.Acelerar(20)\n",
+ "# valor_test = a.Acelerar(-30)\n",
+ "# valor_esperado = 0\n",
+ "# Test_03 ClaseVehiculo('moto','negra')\n",
+ "# valor_test = a.Acelerar(10)\n",
+ "# valor_test = a.Acelerar(100)\n",
+ "# valor_esperado = 100\n",
+ "\n",
+ "a= ClaseVehiculo ('auto','verde')\n",
+ "\n",
+ "a.Acelerar(10) #debe devolver 10\n",
+ "a.Acelerar(15) #debe devolver 25\n",
+ "a.Acelerar(-10) "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dicc = {\n",
+ " 'clave1':['c','a','b'],\n",
+ " 'clave2':['casa','auto','barco'],\n",
+ " 'clave3':[1,2,3]\n",
+ " }\n",
+ "def OrdenarDiccionario(diccionario_par, clave, descendente=True):\n",
+ " '''\n",
+ " Esta función recibe como parámetro un diccionario, cuyas listas de valores tienen el mismo\n",
+ " tamaño y sus elementos enésimos están asociados. Y otros dos parámetros que indican\n",
+ " la clave por la cual debe ordenarse y si es descendente o ascendente.\n",
+ " La función debe devolver el diccionario ordenado, teniendo en cuenta de no perder la\n",
+ " relación entre los elementos enésimos.\n",
+ " Recibe tres argumentos:\n",
+ " diccionario: Diccionario a ordenar.\n",
+ " clave: Clave del diccionario recibido, por la cual ordenar.\n",
+ " descendente: Un valor booleano, que al ser verdadero indica ordenamiento ascendente y \n",
+ " descendente si es falso. \n",
+ " Debe tratarse de un parámetro por defecto en True.\n",
+ " Si el parámetro diccionario no es un tipo de dato diccionario ó el parámetro clave no \n",
+ " se encuentra dentro de las claves del diccionario, debe devolver nulo.\n",
+ " Ej:\n",
+ " dicc = {'clave1':['c','a','b'],\n",
+ " 'clave2':['casa','auto','barco'],\n",
+ " 'clave3':[1,2,3]}\n",
+ " OrdenarDiccionario(dicc, 'clave1') debe retornar {'clave1':['a','b','c'],\n",
+ " 'clave2':['auto','barco','casa'],\n",
+ " 'clave3':[2,3,1]}\n",
+ " OrdenarDiccionario(dicc, 'clave3', False) debe retornar {'clave1':['b','a','c'],\n",
+ " 'clave2':['barco','auto','casa'],\n",
+ " 'clave3':[3,2,1]}\n",
+ " '''\n",
+ " #Tu código aca:\n",
+ " # Variables a usar, incluye nuevas listas auxiliares para hacer los arreglos de swap, sin perder la hilación.\n",
+ " cantidadValores=0 # Recibe valores del diccionario en el proceso de pasarlo a Lista de diccs\n",
+ " numKeys=0 # Recibe n elementos del tipo llave que tiene el diccionario DICC, para ejecutar los ciclos. \n",
+ " newArr=[] \t\t # Va a recibir mi lista de diccionarios originales convertidos a listas\n",
+ " newArrSorted=[] # Va a recibir los diccionarios ordenados por la clave ingresada\n",
+ " res =[]\n",
+ " if not (type(diccionario_par) is dict): # diccionario_par= Parámetro que recibe un DICT\n",
+ "\t return 'Null' # Si el parámetro, no es de tipo diccionario, retorna 'null'\n",
+ " if not (clave in diccionario_par.keys()): # Si la clave recibiba como parámetro no existe, retorna null\n",
+ "\t return 'Null' # descendente=True ==> Orden ASCENDENTE, es al revés, FALSE==> DESCENDENTE \n",
+ " \n",
+ " # Este es un problema de Un diccionario de listas que debe ser transformado en una lista de diccionarios para poder\n",
+ " # ser maniplado con los métodos de 'list'. Al final, se debe convertir a DICT nuevamente.\n",
+ " # Convertimos el dicc de list a list de dict\n",
+ "\n",
+ " #print (len(diccionario_par[list(diccionario_par.keys())[0]]))\n",
+ " # chequeamos qué valor estamos reciendo\n",
+ " print()\n",
+ " if len(diccionario_par[list(diccionario_par.keys())[0]])>0: \n",
+ " cantidadValores=len(diccionario_par[list(diccionario_par.keys())[0]])\n",
+ " # convertimos el diccionario de listas, a una lista de diccionarios:\t\n",
+ " for i in range(0, cantidadValores):\n",
+ " newObj={}\n",
+ " for key in diccionario_par:\n",
+ " newObj[key]=diccionario_par[key][i]\n",
+ " newArr.append(newObj)\n",
+ " #print(newArr) Aquí se generó una lista de diccionarios\n",
+ " # Ahora ordenemos\n",
+ " newArrSorted = sorted(newArr, key=lambda d: d[clave], reverse=not (descendente))\n",
+ " print (newArrSorted) #verificar contenido del nuevo arreglo\n",
+ " # Convertimos la lista de diccionarios, en un diccionario de listas:\n",
+ " for key in diccionario_par:\n",
+ " newArr2 = []\n",
+ " for i in range(0, cantidadValores):\n",
+ " newArr2.append(newArrSorted[i][key])\n",
+ " res[key] = newArr2\n",
+ " #Si no tienen valores devolvemos el mismo diccionario:\n",
+ " else:\n",
+ " return diccionario_par\n",
+ " return res\n",
+ "\n",
+ "OrdenarDiccionario(dicc, 'clave1') "
+ ]
}
],
"metadata": {
From daaf40958d86509fc8b1c85a8084ae8b3ba42d96 Mon Sep 17 00:00:00 2001
From: Jorge Cordova <55065873+jcordovaj@users.noreply.github.com>
Date: Sat, 28 Jan 2023 21:46:18 -0300
Subject: [PATCH 15/16] Up2143, todos OK, 1 falla, error en test
---
Workbench/Taller/HC280123.ipynb | 53 ++++++++++++++++----------
Workbench/Taller/OrdenarDiccionario.py | 34 +++++++++++++++++
2 files changed, 67 insertions(+), 20 deletions(-)
create mode 100644 Workbench/Taller/OrdenarDiccionario.py
diff --git a/Workbench/Taller/HC280123.ipynb b/Workbench/Taller/HC280123.ipynb
index ef10b0d74..13ff5fa94 100644
--- a/Workbench/Taller/HC280123.ipynb
+++ b/Workbench/Taller/HC280123.ipynb
@@ -440,15 +440,23 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 76,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "ename": "TypeError",
+ "evalue": "list indices must be integers or slices, not str",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[76], line 74\u001b[0m\n\u001b[0;32m 71\u001b[0m \u001b[39mreturn\u001b[39;00m diccionario_par\n\u001b[0;32m 72\u001b[0m \u001b[39mreturn\u001b[39;00m res\n\u001b[1;32m---> 74\u001b[0m OrdenarDiccionario(dicc, \u001b[39m'\u001b[39;49m\u001b[39mclave1\u001b[39;49m\u001b[39m'\u001b[39;49m) \n",
+ "Cell \u001b[1;32mIn[76], line 68\u001b[0m, in \u001b[0;36mOrdenarDiccionario\u001b[1;34m(diccionario_par, clave, descendente)\u001b[0m\n\u001b[0;32m 66\u001b[0m \u001b[39mfor\u001b[39;00m i \u001b[39min\u001b[39;00m \u001b[39mrange\u001b[39m(\u001b[39m0\u001b[39m, cantidadValores):\n\u001b[0;32m 67\u001b[0m newArr2\u001b[39m.\u001b[39mappend(newArrSorted[i][key])\n\u001b[1;32m---> 68\u001b[0m res[key] \u001b[39m=\u001b[39m newArr2\n\u001b[0;32m 69\u001b[0m \u001b[39m#Si no tienen valores devolvemos el mismo diccionario:\u001b[39;00m\n\u001b[0;32m 70\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m 71\u001b[0m \u001b[39mreturn\u001b[39;00m diccionario_par\n",
+ "\u001b[1;31mTypeError\u001b[0m: list indices must be integers or slices, not str"
+ ]
+ }
+ ],
"source": [
- "dicc = {\n",
- " 'clave1':['c','a','b'],\n",
- " 'clave2':['casa','auto','barco'],\n",
- " 'clave3':[1,2,3]\n",
- " }\n",
"def OrdenarDiccionario(diccionario_par, clave, descendente=True):\n",
" '''\n",
" Esta función recibe como parámetro un diccionario, cuyas listas de valores tienen el mismo\n",
@@ -493,7 +501,7 @@
"\n",
" #print (len(diccionario_par[list(diccionario_par.keys())[0]]))\n",
" # chequeamos qué valor estamos reciendo\n",
- " print()\n",
+ " #print()\n",
" if len(diccionario_par[list(diccionario_par.keys())[0]])>0: \n",
" cantidadValores=len(diccionario_par[list(diccionario_par.keys())[0]])\n",
" # convertimos el diccionario de listas, a una lista de diccionarios:\t\n",
@@ -502,21 +510,26 @@
" for key in diccionario_par:\n",
" newObj[key]=diccionario_par[key][i]\n",
" newArr.append(newObj)\n",
- " #print(newArr) Aquí se generó una lista de diccionarios\n",
- " # Ahora ordenemos\n",
- " newArrSorted = sorted(newArr, key=lambda d: d[clave], reverse=not (descendente))\n",
- " print (newArrSorted) #verificar contenido del nuevo arreglo\n",
- " # Convertimos la lista de diccionarios, en un diccionario de listas:\n",
- " for key in diccionario_par:\n",
- " newArr2 = []\n",
- " for i in range(0, cantidadValores):\n",
- " newArr2.append(newArrSorted[i][key])\n",
- " res[key] = newArr2\n",
+ " #print(newArr) Aquí se generó una lista de diccionarios\n",
+ " # Ahora ordenemos\n",
+ " newArrSorted = sorted(newArr, key=lambda d: d[clave], reverse=not (descendente))\n",
+ " # print (newArrSorted) #verificar contenido del nuevo arreglo\n",
+ " # Convertimos la lista de diccionarios, en un diccionario de listas:\n",
+ " for key in diccionario_par:\n",
+ " newArr2 = []\n",
+ " for i in range(0, cantidadValores):\n",
+ " newArr2.append(newArrSorted[i][key])\n",
+ " res[key] = newArr2\n",
" #Si no tienen valores devolvemos el mismo diccionario:\n",
" else:\n",
- " return diccionario_par\n",
+ " return diccionario_par\n",
+ " \n",
" return res\n",
- "\n",
+ "dicc = {\n",
+ " 'clave1':['c','a','b'],\n",
+ " 'clave2':['casa','auto','barco'],\n",
+ " 'clave3':[1,2,3]\n",
+ " }\n",
"OrdenarDiccionario(dicc, 'clave1') "
]
}
diff --git a/Workbench/Taller/OrdenarDiccionario.py b/Workbench/Taller/OrdenarDiccionario.py
new file mode 100644
index 000000000..12f5352d4
--- /dev/null
+++ b/Workbench/Taller/OrdenarDiccionario.py
@@ -0,0 +1,34 @@
+def OrdenarDiccionario(diccionario_par, clave, descendente=True):
+ cantidadValores=0
+ newArr=[]
+ newArrSorted=[]
+ res ={}
+ if not (type(diccionario_par) is dict):
+ return None
+ if not (clave in diccionario_par.keys()):
+ return None
+ if len(diccionario_par[list(diccionario_par.keys())[0]])>0:
+ cantidadValores=len(diccionario_par[list(diccionario_par.keys())[0]])
+ for i in range(0, cantidadValores):
+ newObj={}
+ for key in diccionario_par:
+ newObj[key]=diccionario_par[key][i]
+ newArr.append(newObj)
+ newArrSorted = sorted(newArr, key=lambda d: d[clave], reverse=not (descendente))
+ for key in diccionario_par:
+ newArr2 = []
+ for i in range(0, cantidadValores):
+ newArr2.append(newArrSorted[i][key])
+ res[key] = newArr2
+ else:
+ return diccionario_par
+
+ return res
+
+dicc = {
+ 'clave1':['c','a','b'],
+ 'clave2':['casa','auto','barco'],
+ 'clave3':[1,2,3]
+ }
+
+print (OrdenarDiccionario(dicc,"clave1"))
From a3ebd8ab0009e9bfd664716cc5be689d03afde6f Mon Sep 17 00:00:00 2001
From: Jorge Cordova <55065873+jcordovaj@users.noreply.github.com>
Date: Sun, 29 Jan 2023 03:31:47 -0300
Subject: [PATCH 16/16] Up2901230327, PruebasDiccListas
---
Workbench/Taller/HC280123.ipynb | 2 +-
Workbench/Taller/pruebaerror.ipynb | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Workbench/Taller/HC280123.ipynb b/Workbench/Taller/HC280123.ipynb
index 13ff5fa94..2091cee27 100644
--- a/Workbench/Taller/HC280123.ipynb
+++ b/Workbench/Taller/HC280123.ipynb
@@ -550,7 +550,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.10.6"
+ "version": "3.10.6 (tags/v3.10.6:9c7b4bd, Aug 1 2022, 21:53:49) [MSC v.1932 64 bit (AMD64)]"
},
"orig_nbformat": 4,
"vscode": {
diff --git a/Workbench/Taller/pruebaerror.ipynb b/Workbench/Taller/pruebaerror.ipynb
index 635127dd4..11e97c9d6 100644
--- a/Workbench/Taller/pruebaerror.ipynb
+++ b/Workbench/Taller/pruebaerror.ipynb
@@ -1428,7 +1428,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.10.6"
+ "version": "3.10.6 (tags/v3.10.6:9c7b4bd, Aug 1 2022, 21:53:49) [MSC v.1932 64 bit (AMD64)]"
},
"orig_nbformat": 4,
"vscode": {