{ "metadata": { "name": "", "signature": "sha256:e0cffc353a04a5e4166cca919917d7efcd881ec361ee781463d43bfde84b7c0d" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Cap\u00edtulo 1: Empezando" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-- *Un curso de Python para las Humanidades, por Folgert Karsdorp y Maarten van Gompel*\n", "\n", "-- *Traducido al castellano por Gimena del R\u00edo y Frank Fischer (cap. 1, diciembre, 2014)*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(\"En sus marcas, listos, ya!\")" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Todos podemos aprender a programar y el mejor modo de aprender es haci\u00e9ndolo. En este tutorial te pedimos escribir mucha cantidad de c\u00f3digo. Hac\u00e9 clic en cualquier bloque de c\u00f3digo, como el de m\u00e1s arriba y presion\u00e1 **CTRL+ENTER a la vez** para ejecutarlo. Empecemos, entonces, a escribir un peque\u00f1o primer programa." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Quiz!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En la caja de c\u00f3digo m\u00e1s abajo, escrib\u00ed un peque\u00f1o programa que calcule cu\u00e1ntos minutos hay en siete semanas. (El signo `x` (por) se representa con `*`.) L\u00edneas que empiezan con el signo numeral (`#`) son notas que no son interpredadas por Python." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# insert your code here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-----------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bien! Has escrito tu primer peque\u00f1o programa sin ninguna ayuda! Entonces, \u00bfpodemos ir m\u00e1s all\u00e1 ahora usando nuestro lenguaje de programaci\u00f3n como una calculadora? Antes de pedirte que programes un poco m\u00e1s, te explicaremos algo sobre `assignment` o `asignaci\u00f3n`.\n", "\n", "Podemos asignarles valores a las variables usando el operador `=`. La variable es solo un nombre que le damos a un valor, podemos imaginarla como un casillero donde ponemos un valor y donde escribimos un nombre. El pr\u00f3ximo ejercicio contiene dos operaciones. Primero, asignamos el valor de 2 al nombre `x`. Despu\u00e9s de hacer eso `x` mantendr\u00e1 el valor de 2. Podemos decir que Python guard\u00f3 el valor de 2 en `x`. Finalmente, escribimos el valor usando, como hicimos m\u00e1s arriba, el comando `print()`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "x = 2\n", "print(x)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora que hemos asignado y guardado el valor de 2 para `x`, podemos usar la variable `x` para hacer cosas como las siguientes:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(x * x)\n", "print(x == x)\n", "print(x > 6)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u00bfQu\u00e9 sucede en estos casos?\n", "\n", "Pero las variables no son solo n\u00fameros. Tambi\u00e9n pueden ser textos (cadenas de caracteres). Por ejemplo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "book = \"The Lord of the Flies\"\n", "print(book)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Un texto o cadena de caracteres en Python debe ir entre comillas (simples o dobles). Sin esas comillas Python supone que est\u00e1 tratando con variables que fueron definidas antes de comenzar a programar. `book` es la variable a la que se le asigna la cadena `\"The Lord of the Flies`\", pero esa cadena no es una variable sino un valor.\n", "\n", "Los nombres de las variables pueden ser elegidos arbitrariamente. Podemos elegir el nombre que gustemos. Es, de todos modos, recomendable que usemos nombres con un cierto sentido, ya que usaremos directamente los nombres de las variables y no los valores que representan." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# not recommended...\n", "banana = \"The Lord of the Flies\"\n", "print(banana)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pod\u00e9s usar el nombre `banana` para dar cuenta del t\u00edtulo `\"The Lord of the Flies`\", pero convengamos en que este no es transparente en su significado.\n", "\n", "Las variables pueden variar y podemos actualizarlas. Podemos contar cu\u00e1ntos libros hay en nuestra biblioteca:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "number_of_books = 100" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As\u00ed, cuando nos hacemos de un nuevo libro, podemos actualizar su n\u00famero:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "number_of_books = number_of_books + 1\n", "print(number_of_books)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Actualizaciones como estas surgen constantemente. Por ello, Python provee atajos y pod\u00e9s escribir lo mismo usando `+=`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "number_of_books += 5\n", "print(number_of_books)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Por el momento, la cuesti\u00f3n m\u00e1s interesante que podemos mencionar sobre las variables es que podemos asignar el valor de una variable a otra variable. Explicaremos mejor esto m\u00e1s tarde, pero es importante que comprendas el mecanismo b\u00e1sico de funcionamiento. Antes del pr\u00f3ximo ejercicio, \u00bfpod\u00e9s predecir que es lo que Python va a escribir?" ] }, { "cell_type": "code", "collapsed": true, "input": [ "book = \"The Lord of the Flies\"\n", "reading = book\n", "print(reading)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Quiz!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora que comprend\u00e9s c\u00f3mo asignar valores a las variables, lleg\u00f3 el momento de volver a programar. Queremos que escribas algo de c\u00f3digo que defina una variable, *name*, y le asignes una cadena que sea tu nombre. Si tu nombre tiene menos de cinco caracteres, us\u00e1 tu apellido. Si tu apellido tiene menos de cinco caracteres, usa ambos." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# insert your code here\n", "print(name)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "--------------" ] }, { "cell_type": "heading", "level": 5, "metadata": {}, "source": [ "Qu\u00e9 aprendimos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para terminar esta secci\u00f3n, he aqu\u00ed un repaso de los conceptos que aprendiste. Revis\u00e1 la lista y asegurate que comprend\u00e9s todos los conceptos.\n", "\n", "- variable\n", "- valor\n", "- asignarles valor a las variables\n", "- diferencia entre variable y valor\n", "- cadena de caracteres\n", "- variables variables" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "------" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Manipulaci\u00f3n de las cadenas de caracteres" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Muchas disciplinas human\u00edsticas trabajan con textos. Por ello, la programaci\u00f3n para las Humanidades se enfoca principalmente al trabajo sobre los textos. En el \u00faltimo ejercicio se te pidi\u00f3 que definieras una variable que diera cuenta de una cadena que represente tu nombre. Tambi\u00e9n vimos algo de aritm\u00e9tica en nuestro primer ejercicio. No solo n\u00fameros, pero tambi\u00e9n cadenas de caracteres pueden ser a\u00f1adidos o, m\u00e1s precisamente, concatenados:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "book = \"The Lord of the Flies\"\n", "print(name + \" likes \" + book + \"?\")" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La cadena consiste en un n\u00famero de caracteres. Podemos individualizar los caracteres con la ayuda de `indexing` (indizar). Por ejemplo, para encontrar solo la primera letra de tu nombre pod\u00e9s tipear:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "first_letter = name[0]\n", "print(first_letter)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ten\u00e9 en cuenta que para identificar la primera letra usamos el n\u00famero `0`. Esto puede parecer extra\u00f1o pero record\u00e1 que las listas/\u00edndices/relaciones en Python empiezan en cero." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Quiz!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora, si sab\u00e9s cu\u00e1ntas letras tiene tu nombre, pod\u00e9s preguntar por la \u00faltima letra de tu nombre:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "last_letter = name[# fill in the last index of your name (tip indexes start at 0)]\n", "print(last_letter)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "No resulta demasiado pr\u00e1ctico tener que contar los caracteres de nuestras cadenas si queremos saber cu\u00e1l es la \u00faltima letra de estas. Python tiene un modo simple de acceder a una cadena desde el final:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "last_letter = name[-1]\n", "print(last_letter)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hay otra alternativa: la funci\u00f3n `len()`, que devuelve la medida de una cadena:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(len(name))" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u00bfEntend\u00e9s lo siguiente?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(name[len(name)-1])" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Quiz!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora, \u00bfpod\u00e9s escribir el c\u00f3digo que defina la variable `but_last_letter` y asign\u00e1rselo a la pen\u00faltima letra de tu nombre?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "but_last_letter = # insert your code here\n", "print(but_last_letter)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Te est\u00e1s conviertiendo en un/a experto/a en indizar cadenas. Ahora, \u00bfqu\u00e9 pasar\u00eda si quisi\u00e9semos averiguar cu\u00e1les son las dos \u00faltimas letras de tu nombre? En Python podemos usar las llamadas porciones de listas/\u00edndices (slice-indexes). Para encontrar las dos primeras letras de tu nombre escrib\u00ed:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "first_two_letters = name[0:2]\n", "print(first_two_letters)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El \u00edndice `0` es opcional, por eso podemos tan solo escribir `name[:2]`. Esto es: 'Tom\u00e1 todos los caracteres del nombre hasta que llegues al \u00edndice 2.' Tambi\u00e9n podemos empezar en el 2 y dejar el \u00edndice final sin especificar:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "without_first_two_letters = name[2:]" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dado que no especificamos el \u00edndice final, Python continuar\u00e1 hasta que encuentre el final de nuestra cadena. Si quisi\u00e9semos encontrar cu\u00e1les son las \u00faltimas dos letras de nuestro nombre, deber\u00edamos escribir:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "last_two_letters = name[-2:]\n", "print(last_two_letters)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Mir\u00e1 esta imagen. \u00bfEntend\u00e9s de qu\u00e9 se trata?\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Quiz!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u00bfPod\u00e9s definir la variable `middle_letters` y asign\u00e1rsela a todas las letras de tu nombre exceptuando las primeras dos y las \u00faltimas dos?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "middle_letters = # insert your code here\n", "print(middle_letters)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si te dan estas dos palabras, \u00bfpod\u00e9s escribir el c\u00f3digo para formar la palabra *humanities* usando solo porciones de cadena y concatenaci\u00f3n? (Es decir, no se permite escribir palabras)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "word1 = \"human\"\n", "word2 = \"opportunities\"\n", "# insert your code here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----------" ] }, { "cell_type": "heading", "level": 5, "metadata": {}, "source": [ "Qu\u00e9 aprendimos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para finalizar esta secci\u00f3n, he aqu\u00ed un repaso de lo que aprendimos. Revis\u00e1 la lista y asegurate de que entend\u00e9s todos los conceptos:\n", "\n", "- concatenaci\u00f3n (por ej., suma de cadenas)\n", "- indizar\n", "- dividir (en porciones)\n", "- `len()`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-------" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Listas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Prest\u00e1 atenci\u00f3n a la frase:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "sentence = \"Python's name is derived from the television series Monty Python's Flying Circus.\"" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Las palabras est\u00e1n hechas de caracteres, y tambi\u00e9n las cadenas de objetos en Python. Como veremos, es siempre preferible representar nuestros datos de la forma m\u00e1s natural posible. En cuanto a la oraci\u00f3n de m\u00e1s arriba, parece m\u00e1s natural describirla en t\u00e9rminos de palabras que de caracteres. Digamos que queremos acceder a la primera palabra de nuestra oraci\u00f3n. A ver qu\u00e9 pasa si escribimos eso:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "first_word = sentence[0]\n", "print(first_word)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Python solo devuelve la primera letra de la oraci\u00f3n. Podemos transformar la oraci\u00f3n en una lista (`list`) de palabras (representada por cadenas) usando la funci\u00f3n `split()` del siguiente modo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "words = sentence.split()\n", "print(words)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Al a\u00f1adir la funci\u00f3n `split` (dividir) en nuestra oraci\u00f3n, Python divide la oraci\u00f3n en espacios y devuelve una lista de palabras. En muchos casos la lista funciona como una cadena. Podemos acceder a todos sus componentes usando \u00edndices y podemos usar porciones de \u00edndices para acceder a partes de la lista. Probemos:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "--------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Quiz!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Escrib\u00ed un peque\u00f1o programa que defina la variable `first_word` (primera palabra) y asignale la primera palabra de nuestra lista de palabras." ] }, { "cell_type": "code", "collapsed": false, "input": [ "first_word = # insert your code here\n", "print(first_word)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---------------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Una lista (`list`) act\u00faa como un contenedor donde podemos almacenar todo tipo de informaci\u00f3n. Podemos acceder a una lista usando \u00edndices y porciones. Podemos tambi\u00e9n a\u00f1adir nuevos elementos a la lista. Para eso usamos el m\u00e9todo `append` (a\u00f1adir). Veamos c\u00f3mo funciona. Si quisi\u00e9semos, por ejemplo, hacer una lista con nuestras lecturas favoritas empezar\u00edamos con una lista vac\u00eda y le a\u00f1adir\u00edamos nuestros libros favoritos:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "#start with an empty list\n", "good_reads = []\n", "good_reads.append(\"The Hunger games\")\n", "good_reads.append(\"A Clockwork Orange\")\n", "print(good_reads)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si, por alguna raz\u00f3n, no nos gustase m\u00e1s un libro, podr\u00edamos cambiar la lista del siguiente modo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "good_reads[0] = \"Pride and Prejudice\"\n", "print(good_reads)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "--------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Quiz!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Trat\u00e1 de cambiar el t\u00edtulo del segundo libro de nuestra colecci\u00f3n." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# insert your code here\n", "print(good_reads)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-----------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cambiamos un elemento en la lista. Not\u00e1 que si hac\u00e9s lo mismo para una cadena obtendr\u00edas un error:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "name = \"Pythen\"\n", "name[4] = \"o\"" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Esto es porque las cadenas (`strings`) y otros tipos son *inmutables*. Es decir, no pueden ser modificados, en oposici\u00f3n a las `lists` (listas) que *son* mutables. Exploremos otras formas en las que podemos manipular listas." ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "remove()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Supongamos que nuestra colecci\u00f3n de libros favoritos creci\u00f3 demasiado y quisi\u00e9semos quitar libros de nuestra lista. Python provee del m\u00e9todo `remove` (remover), que trabaja sobre una lista y quita de ella los elementos que ya no queremos." ] }, { "cell_type": "code", "collapsed": false, "input": [ "good_reads = [\"The Hunger games\", \"A Clockwork Orange\", \n", " \"Pride and Prejudice\", \"Water for Elephants\",\n", " \"The Shadow of the Wind\", \"Bel Canto\"]\n", "\n", "good_reads.remove(\"Water for Elephants\")\n", "\n", "print(good_reads)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si tratamos que quitar un libro que no est\u00e1 en la lista, Python da error." ] }, { "cell_type": "code", "collapsed": false, "input": [ "good_reads.remove(\"White Oleander\")" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "--------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Quiz!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Defin\u00ed la variable `good_reads` como una lista vac\u00eda. Ahora a\u00f1ad\u00ed algunos de tus libros favoritos a ella (al menos tres) y hac\u00e9 que Python escriba los \u00faltimos dos libros de tu lista." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# insert your code here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tal como en las cadenas, podemos unir dos listas. He aqu\u00ed un ejemplo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "#first we specify two lists of strings:\n", "good_reads = [\"The Hunger games\", \"A Clockwork Orange\", \n", " \"Pride and Prejudice\", \"Water for Elephants\",\n", " \"The Shadow of the Wind\", \"Bel Canto\"]\n", "\n", "bad_reads = [\"Fifty Shades of Grey\", \"Twilight\"]\n", "\n", "all_reads = good_reads + bad_reads\n", "print(all_reads)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "sort()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Siempre es conveniente organizar la biblioteca. Podemos ordenar nuestros libros con la siguiente expresi\u00f3n:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "good_reads.sort()\n", "print(good_reads)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "nested lists" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hasta aqu\u00ed nuestras listas solo estuvieron constituidas por cadenas. De todos modos, una lista puede contener diferentes tipos de datos, como n\u00fameros enteros y tambi\u00e9n listas. \u00bfEntend\u00e9s lo que pasa en este ejemplo?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "nested_list = [[1, 2, 3, 4], [5, 6, 7, 8]]\n", "print(nested_list[0])\n", "print(nested_list[0][0])" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podemos usar esto para mejorar nuestra lista de libros favoritos otorgando un n\u00famero (a modo de calificaci\u00f3n o nota num\u00e9rica) a cada uno de ellos. Una entrada en nuestra colecci\u00f3n consistir\u00e1 de una nota entre 1 y 10 y el t\u00edtulo de nuestro libro. El primer elemento es el t\u00edtulo, el segundo es la nota: `[title, score]`. Empezamos con una lista vac\u00eda:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "good_reads = []" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y le agregamos dos libros:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "good_reads.append([\"Pride and Prejudice\", 8])\n", "good_reads.append([\"A Clockwork Orange\", 9])" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Quiz!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Actualiz\u00e1 la lista de libros favoritos (`good_reads`) con algunos de tus libros y otorgales una nota. \u00bfPod\u00e9s escribir la nota que le diste al primer libro de tu lista?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# insert your code here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-----------" ] }, { "cell_type": "heading", "level": 5, "metadata": {}, "source": [ "Qu\u00e9 aprendimos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para finalizar esta secci\u00f3n, he aqu\u00ed una revisi\u00f3n de los nuevos conceptos y funciones que aprendiste:\n", "\n", "- lista\n", "- *mutable* versus *inmutable*\n", "- `.split()` (dividir)\n", "- `.append()` (a\u00f1adir)\n", "- nested lists (listas anidadas)\n", "- `.remove()` (quitar)\n", "- `.sort()` (ordenar)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-------------" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Diccionarios" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nuestra peque\u00f1a lista de libros favoritos ha empezado a crecer y podemos manipularla de muchas formas. Ahora, imaginemos que nuestra lista es extensa y que queremos buscar la nota que le dimos a un libro. \u00bfC\u00f3mo hacemos para encontrarlo? Para ello, Python provee de una estructura de datos denominada diccionario (`dictionary`). Un diccionario es similar a los diccionarios que tenemos en casa. Este consiste de entradas, o claves, que tienen un valor. Definamos una:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "my_dict = {\"book\": \"physical objects consisting of a number of pages bound together\",\n", " \"sword\": \"a cutting or thrusting weapon that has a long metal blade\",\n", " \"pie\": \"dish baked in pastry-lined pan often with a pastry top\"}" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Revis\u00e1 esta nueva sintaxis. Prest\u00e1 atenci\u00f3n a los par\u00e9ntesis curvos y dos puntos. Las claves se encuentran a la izquierda de los dos puntos; los valores al lado derecho. Para encontrar el valor de una clave, indizamos el diccionario usando esa clave:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "description = my_dict[\"sword\"]\n", "print(description)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Decimos que indizamos porque usamos la misma sintaxis con corchetes cuando indizamos listas o cadenas. La diferencia estriba en que no usamos un n\u00famero para indizar un diccionario sino una clave. Al igual que las listas, los diccionarios son mutales, lo que significa que podemos a\u00f1adir o quitar entradas de \u00e9l. Definamos un diccionario vac\u00edo y a\u00f1ad\u00e1mosle algunos libros. Los t\u00edtulos ser\u00e1n nuestras entradas y las calificaciones sus valores. Esta es la sintaxis de una entrada:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "good_reads = {}\n", "good_reads[\"Pride and Prejudice\"] = 8\n", "good_reads[\"A Clockwork Orange\"] = 9" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Esto es, de alg\u00fan modo, similar a lo que vimos antes cuando modificamos nuestra lista de libros. All\u00ed indizamos la lista usando un n\u00famero entero para individualizar un libro en particular. Aqu\u00ed directamente usamos el t\u00edtulo del libro. \u00bfPor qu\u00e9 te parece que esto es \u00fatil?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "--------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Quiz!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Actualiz\u00e1 la estructura de tu lista con tus propios libros. Trat\u00e1 de escribir la calificaci\u00f3n que le diste a uno de los libros." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# insert your code here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "keys(), values()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para recuperar una lista de todos los libros de nuestra colecci\u00f3n podemos pedirle al diccionario que nos devuelva todas las claves en la lista:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "good_reads.keys()" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "De un modo similar tambi\u00e9n podemos pedirle los valores:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "good_reads.values()" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---------" ] }, { "cell_type": "heading", "level": 5, "metadata": {}, "source": [ "Qu\u00e9 aprendimos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para finalizar esta secci\u00f3n, he aqu\u00ed un repaso de los nuevos conceptos y funciones que aprendiste:\n", "\n", "- diccionario\n", "- indizar o individualizar entradas de diccionarios\n", "- a\u00f1adir entradas a un diccionario\n", "- `.keys()` (claves)\n", "- `.values()` (valores)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "--------" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Condicionales" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Sentencias condicionales simples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Gran parte de la actividad de programar se relaciona con la ejecuci\u00f3n de ciertos trozos de c\u00f3digo si una condici\u00f3n particular cumple. Ya hemos visto dos de estas condicionales al principio del cap\u00edtulo. Aqu\u00ed te ofreceremos una sucinta introducci\u00f3n. \u00bfPod\u00e9s descubrir lo qu\u00e9 hacen los siguientes condicionales?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(\"2 < 5 =\", 2 < 5)\n", "print(\"3 > 7 =\", 3 >= 7)\n", "print(\"3 == 4 =\", 3 == 4)\n", "print(\"school == homework =\", \"school\" == \"homework\")\n", "print(\"Python != perl =\", \"Python\" != \"perl\")" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "if, elif y else" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El diccionario es una mejor estructura para nuestra colecci\u00f3n de libros favoritos. De todos modos, hasta a trav\u00e9s de diccionarios podemos olvidarnos de cu\u00e1les son los libros que hemos a\u00f1adido a la colecci\u00f3n. \u00bfQu\u00e9 pasar\u00eda si tratamos de obtener la calificaci\u00f3n de un libro que no est\u00e1 en nuestra colecci\u00f3n?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "good_reads[\"El silenciero\"]" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Obtenemos un error. Un `KeyError`, que b\u00e1sicamente significa que \"la clave por la que me has preguntado no figura en el diccionario\". Vamos a aprender m\u00e1s sobre como manejar errores m\u00e1s tarde, pero por ahora, nos gustar\u00eda advertir a nuestro programa para que no lo haga en primer lugar. Escribamos un peque\u00f1o programa que d\u00e9 como resultado \"X est\u00e1 en la colecci\u00f3n\" si un libro en particular est\u00e1 en la colecci\u00f3n y \"X no est\u00e1 en la colecci\u00f3n\" si no lo est\u00e1." ] }, { "cell_type": "code", "collapsed": false, "input": [ "book = \"A Clockwork Orange\"\n", "if book in good_reads:\n", " print(book + \" is in the collection\")\n", "else:\n", " print(book + \" is NOT in the collection\")" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hasta aqu\u00ed mucha nueva sintaxis. Vayamos paso a paso. Primero tenemos que preguntar si el valor que le hemos asignado a libro (`book`) est\u00e1 en nuestra colecci\u00f3n. El segmento posterior a `if` eval\u00faa si es verdadero o falso (`True` o `False`). Escribamos esto:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"El silenciero\" in good_reads" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como este libro no est\u00e1 en la colecci\u00f3n, Python nos devuelve `False`. Hagamos lo mismo para un libro que sabemos que est\u00e1 en nuestra colecci\u00f3n:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"A Clockwork Orange\" in good_reads" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si la expresi\u00f3n despu\u00e9s de `if` eval\u00faa algo como verdadero (`True`), nuestro programa ir\u00e1 a la pr\u00f3xima l\u00ednea y escribir\u00e1 `book + \" is in the collection\"`. Veamos:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "if \"A Clockwork Orange\" in good_reads:\n", " print(book + \" is in the collection\")" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "if \"El silenciero\" in good_reads:\n", " print(book + \" is in the collection\")" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ten\u00e9 en cuenta que el contenido del \u00faltimo bloque de c\u00f3digo no fue ejecutado. Esto es as\u00ed porque el valor que le asignamos a `book` no est\u00e1 en nuestra colecci\u00f3n y, consecuentemente, el segmento despu\u00e9s de `if` no fue considerado como `True`. En nuestro peque\u00f1o programa de m\u00e1s arriba usamos otro comando al lado de `if`, `else`. No deber\u00eda ser demasiado dif\u00edcil de comprender qu\u00e9 est\u00e1 sucendiendo aqu\u00ed. El segmento despu\u00e9s de `else` ser\u00e1 ejecutado si `if` es evaluado como `False`. Esto es: Si el libro no est\u00e1 en la colecci\u00f3n, escrib\u00ed que no est\u00e1." ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Indentaci\u00f3n!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Antes de continuar, debemos explicarte que la disposici\u00f3n de nuestro c\u00f3digo no es opcional. De un modo diferente que en otros lenguajes, Python no utiliza llaves para marcar el comienzo y el final de las expresiones. La \u00fanica delimitaci\u00f3n son los dos puntos (`:`) y el espaciado del c\u00f3digo. Este debe ser usado consistentemente en la escritura del c\u00f3digo. Por convenci\u00f3n se usan cuatro espacios. Esto quiere decir que cada vez que usas dos puntos (por ejemplo, cuando usamos `if`), la pr\u00f3xima l\u00ednea debe ser sangrada con cuatro espacios m\u00e1s que en la l\u00ednea previa." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A veces tenemos varios condicionales que deben ser evaluados de modo diferente. Para ello, Python nos provee del comando `elif`, que puede usarse de modo similar a `if` y `else`. Not\u00e1 que, de todos modos, \u00a1solo pod\u00e9s usar `elif` despu\u00e9s de `if`! M\u00e1s arriba te preguntamos si un libro estaba en la colecci\u00f3n. Podemos hacer lo mismo para partes de las cadenas de nuestros elementos en la lista. Por ejemplo, podemos evaluar si la letra *a* est\u00e1 en la palabra *banana*:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"a\" in \"banana\"" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As\u00ed, esto ser\u00eda evaluado como `False`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"z\" in \"banana\"" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Usemos esto en una combinaci\u00f3n de `if-elif-else`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "word = \"rocket science\"\n", "if \"a\" in word:\n", " print(word + \" contains the letter a\")\n", "elif \"s\" in word:\n", " print(word + \" contains the letter s\")\n", "else:\n", " print(\"What a weird word!\")" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "--------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Quiz!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pongamos en pr\u00e1ctica nuestros nuevos conocimientos. Escribe un peque\u00f1o programa que defina la variable `weight` (peso). Si peso es `>` 50 libras (22 kilos aprox.) ejecuta \"Hay un recargo de 25$ por equipaje de ese peso\". Si no es mayor, ejecuta: \"Gracias\". Cambia el valor de peso en ambos ejemplos (usa los comandos `<` o `>`)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# insert your code here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-------" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "and, or, not" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hasta ahora nuestros condicionales consistieron de expresiones simples. De todos modos, a menudo necesitamos de condicionales complejos para ejecutar cierto c\u00f3digo. Python provee de un n\u00famero de maneras para hacer eso. La primera es con el comando `and`. Nos permite yuxtaponer dos expresiones que necesitan ser verdaderas para hacer que la totalidad de lo expresado ser\u00e1 verdadero (`True`). Veamos c\u00f3mo funciona:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "word = \"banana\"\n", "if \"a\" in word and \"b\" in word:\n", " print(\"Both a and b are in \" + word)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si una de las expresiones es entendida como falsa, nada se ejecutar\u00e1:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "if \"a\" in word and \"z\" in word:\n", " print(\"Both a and z are in \" + word)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Quiz!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Reemplaz\u00e1 `and` por `or` en esta expresi\u00f3n con `if`. \u00bfQu\u00e9 sucede?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "word = \"banana\"\n", "if \"a\" in word and \"z\" in word:\n", " print(\"Both a and b are in \" + word)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En el bloque de c\u00f3digo de abajo, \u00bfpod\u00e9s a\u00f1adir una expresi\u00f3n con `else` que ejecute que ninguna de las letras fue encontrada?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "if \"a\" in word and \"z\" in word:\n", " print(\"Both a and z are in \" + word)\n", "# insert your code here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finalmente, podemos usar `not` para probar condicionales que no son verdaderos." ] }, { "cell_type": "code", "collapsed": false, "input": [ "if \"z\" not in word:\n", " print(\"z is not in \" + word)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Objetos como cadenas o listas son verdaderos (`True`) porque existen. Cadenas, listas, diccionarios vac\u00edos etc. son, por otra parte, falsos (`False`) porque, de alg\u00fan modo, *no* existen. Podemos usar este principio para, por ejemplo, ejecutar \u00fanicamente un segmento de c\u00f3digo si una determinada lista contiene un valor:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "numbers = [1, 2, 3, 4]\n", "if numbers:\n", " print(\"I found some numbers!\")" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora, si la lista est\u00e1 vac\u00eda, Python no devolver\u00e1 nada:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "numbers = []\n", "if numbers:\n", " print(\"I found some numbers!\")" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "--------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Quiz!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u00bfPod\u00e9s escribir un c\u00f3digo que ejecute \"Esta es una lista vac\u00eda\", si la lista provista no contiene ning\u00fan valor?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "numbers = []\n", "# insert your code here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u00bfPod\u00e9s hacer lo mismo pero usando el comando `len()` (ingl. 'length', esp. 'extensi\u00f3n', 'longitud')?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "numbers = []\n", "# insert your code here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-----------" ] }, { "cell_type": "heading", "level": 5, "metadata": {}, "source": [ "Qu\u00e9 aprendimos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para finalizar esta secci\u00f3n, he aqu\u00ed un repaso de las nuevas funciones, expresiones y conceptos que hemos aprendido. Revisalos y asegurate que comprend\u00e9s su sentido y c\u00f3mo se usan.\n", "\n", "- condicionales\n", "- espaciar\n", "- `if` (si)\n", "- `elif`\n", "- `else`\n", "- `True` (verdadero)\n", "- `False` (falso)\n", "- objetos vac\u00edos son falsos\n", "- `not` (no)\n", "- `in` (en)\n", "- `and` (y)\n", "- `or` (o)\n", "- condicionales m\u00faltiples\n", "- `==`\n", "- `<`\n", "- `>`\n", "- `!=`\n", "- `KeyError`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---------" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Bucles" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La programaci\u00f3n es m\u00e1s \u00fatil si podemos ejecutar una cierta acci\u00f3n en un n\u00famero extenso de elementos. Por ejemplo, si nos dan una determinada lista de palabras, podemos querer saber la longitud de todas las palabras, no solo de una. Ahora *podr\u00edas* hacer esto yendo por vez a trav\u00e9s de todos los \u00edndices de nuestras listas de palabras, tomando tantas l\u00edneas de c\u00f3digo como \u00edndices. De todos modos, esto es algo inc\u00f3modo.\n", "\n", "Python provee de los llamados comandos `for` que nos permiten iterar cualquier objeto que se pueda repetir y ejecutar acciones. El formato b\u00e1sico para un comando `for`:\n", "\n", " for X in iterable:\n", "\n", "El comando se expresa casi del mismo modo que en ingl\u00e9s. Podemos ejecutar todas las letras de la palabra *banana* de este modo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for letter in \"banana\":\n", " print(letter)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El c\u00f3digo en el bucle es ejecutado tantas veces como hay ah\u00ed letras, con un valor diferente para la variable `letter` (letra) en cada iteraci\u00f3n." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Del mismo modo, podemos ejecutar todos los elementos en una lista:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "colors = [\"yellow\", \"red\", \"green\", \"blue\", \"purple\"]\n", "for whatever in colors:\n", " print(\"This is color \" + whatever)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dado que los diccionarios son asimismo objetos iterables, podemos iterarlos tambi\u00e9n en nuestra colecci\u00f3n de libros favoritos. Esto iterar\u00e1 sobre todas las *claves* de nuestro diccionario:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for book in good_reads:\n", " print(book)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podemos asimismo iterar las claves y los valores de un diccionario, como en este ejemplo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "good_reads.items()" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "for x, y in good_reads.items():\n", " print(x + \" has score \" + str(y))" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Usar `items()` (elementos) puede, en cada iteraci\u00f3n, devolver un par de claves y sus valores. En el ejemplo m\u00e1s arriba la variable `book` har\u00e1 un bucle sobre las claves del diccionario, y la variable `score` har\u00e1 un bucle sobre sus respectivos valores.\n", "\n", "Este es el modo m\u00e1s elegante de hacer bucles sobre los diccionarios, pero vamos a ver si comprend\u00e9s tambi\u00e9n estas otras alternativas:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for book in good_reads:\n", " print(book, \"has score\", good_reads[book])" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Quiz!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La funci\u00f3n `len()` devuelve la longitud de un elemento iterable:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "len(\"banana\")" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podemos usar esta funci\u00f3n para ejecutar la extensi\u00f3n de cada palabra en una lista de colores. Escrib\u00ed el c\u00f3digo en el ejemplo de abajo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "colors = [\"yellow\", \"red\", \"green\", \"blue\", \"purple\"]\n", "# insert your code here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora escrib\u00ed un peque\u00f1o programa que itere a trav\u00e9s de la lista `colors` y a\u00f1ada (`append`) todos los colores que contengan la letra *r* en la lista `colors_with_r`. (Tip: us\u00e1 `colors_with_r.append`)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "colors = [\"yellow\", \"red\", \"green\", \"blue\", \"purple\"]\n", "colors_with_r = []\n", "# insert you code here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-----------" ] }, { "cell_type": "heading", "level": 5, "metadata": {}, "source": [ "Qu\u00e9 aprendimos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "He aqu\u00ed un repaso de todos los nuevos conceptos, expresiones y funciones que aprendimos en esta secci\u00f3n. Una vez m\u00e1s, revis\u00e1 la lista y asegurate que lo entend\u00e9s.\n", "\n", "- bucle\n", "- comando `for`\n", "- objetos iterables\n", "- asignaci\u00f3n de una variable en un bucle con `for`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "--------" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Final Quiz!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Es tiempo de hacer un repaso final. El pr\u00f3ximo ejercicio puede ser dif\u00edcil pero estar\u00edamos muy contentos si te sale bien!\n", "\n", "Lo que queremos es que escribas un c\u00f3digo que cuente la cantidad de veces que se repite la palabra *a* en este peque\u00f1o corpus. Necesit\u00e1s hacer esto bas\u00e1ndote en la frecuencia de distribuci\u00f3n de las palabras que est\u00e1n en el diccionario. En este diccionario de `frequency_distribution` (frecuencia de distribuci\u00f3n) las claves son palabras y los valores son las frecuencias. Asignale un valor a la variable `number_of_as` (cantidad de 'a')." ] }, { "cell_type": "code", "collapsed": false, "input": [ "frequency_distribution = {\"Beg\": 1, \"Goddard's\": 1, \"I\": 3, \"them\": 2, \"absent\": 1, \"already\": 1,\n", " \"alteration\": 1, \"amazement\": 2, \"appeared\": 1, \"apprehensively\": 1, \n", " \"associations\": 1, 'clever': 1, 'clock': 1, 'composedly': 1, \n", " 'deeply': 7, 'do': 7, 'encouragement': 1, 'entrapped': 1,\n", " 'expressed': 1, 'flatterers': 1, 'following': 12, 'gone': 9, \n", " 'happening': 4, 'hero': 2, 'housekeeper': 1, 'ingratitude': 1, \n", " 'like': 1, 'marriage': 15, 'not': 25, 'opportunities': 1,\n", " 'outgrown': 1, 'playfully': 2, 'remain': 1, 'required': 2, \n", " 'ripening': 1, 'slippery': 1, 'touch': 1, 'twenty-five': 1,\n", " 'ungracious': 2, 'unwell': 1, 'verses': 1, 'yards': 5}\n", "number_of_as = 0\n", "# insert your code here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Llegaste al fin de este cap\u00edtulo. Ignor\u00e1 el c\u00f3digo de abajo, lo pusimos aqu\u00ed solo para embellecer la p\u00e1gina:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.core.display import HTML\n", "def css_styling():\n", " styles = open(\"styles/custom.css\", \"r\").read()\n", " return HTML(styles)\n", "css_styling()" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

\"Creative
Python Programming for the Humanities by http://fbkarsdorp.github.io/python-course is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. Based on a work at https://github.com/fbkarsdorp/python-course.

" ] } ], "metadata": {} } ] }