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": [ + "\"Open" + ] + }, + { + "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": [ - "\"Open" - ] - }, - { - "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": {