{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# A Linguagem Python" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Esta seção apresenta uma **introdução sucinta** à linguagem Python. Pesquisadores com experiência prévia em programação procedural como Fortran, C ou MATLAB não deverão ter maiores dificuldades com o conteúdo a seguir, uma vez que ele define em Python conceitos familiares como atribuição de variáveis, controle de fluxo e iterações. Pesquisadores que não possuem conhecimentos prévios sobre programação de computadores podem buscar orientação no projeto [Software Carpentry](http://software-carpentry.org), destinado a ensinar diversas técnicas de computação a pesquisadores com formações acadêmicas variadas." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Tipos numéricos" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Há quatro tipos numéricos em Python: inteiros simples (*plain integers* - ou apenas inteiro), inteiros longo (*long integers*), números em ponto flutuante (*floating points*) e complexos." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Inteiros" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "A diferença entre o inteiro e o inteiro longo é que o último possui *precisão infinita*, permitindo a representação de qualquer número em $\\mathbb{Z}$ (na prática, há limites impostos pela memória do computador). Na maior parte do tempo, o programador utiliza inteiros simples, capazes de representar números inteiros no intervalo $[-n - 1, n]$. O valor de $n$ varia de acordo com o sistema (32 ou 64 bits), podendo ser consultado na variável `sys.maxint`:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "slideshow": { "slide_type": "notes" } }, "outputs": [ { "data": { "text/plain": [ "9223372036854775807" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import sys \n", "\n", "sys.maxint" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Inteiros são representados e manipulados trivialvente:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 + 1" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Como usual na maioria das linguagens procedurais, uma **atribuição de variável** é realizada utilizando-se o operador `=`. Podemos conferir o **tipo** da variável utilizando a função `type`:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "int" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = 4\n", "type(a)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "O resto da divisão inteira pode ser obtido utilizando o operador `%`:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "11 % 4" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Inteiros longos (precisão infinita) são representados acionando-se a letra `l` (minúscula ou maiúscual), ao final do inteiro:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "32L" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = 32L\n", "a" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "295147905179352825824L" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b = a * sys.maxint\n", "b" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "2722258935367507707116701049095440039968L" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = b * sys.maxint\n", "c" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "long" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(c)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Reais" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Diferenciam-se os números reais dos inteiros com o uso do caractere \"`.`\", opcionalmente anexando-se casas decimais se houver:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "int" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = 2\n", "type(a)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "float" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = 2.\n", "type(a)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "float" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = 2.1\n", "type(a)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Informações sobre a representação dos números em ponto flutuante no sistema, como valores máximos e mínimos, podem sem obtidos com a variável `sys.float_info`: " ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sys.float_info" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Complexos" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Números complexos tem sua parte imaginária definida pelo caractere \"`j`\". Os atributos `real` e `imag` permitem acesso direto às partes real e imaginária do número." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "(1.2+0.7j)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = 1.2 + 0.7j\n", "a" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "complex" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(a)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "1.2" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.real" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "0.7" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.imag" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Operações matemáticas" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Além das operações aritméticas de adição, subtração, multiplicação e divisão, Python fornece uma maneira simples de definir **potenciação**, utilizando a notação \"`**`\":" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "8" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2**3" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Quanto à divisão, vale lembra a diferença entre dividir números inteiros e reais:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "3/2" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "1.5" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "3./2" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## *Containers*" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Todas as variáveis em Python, até mesmo as variáveis numéricas básicas, são objetos. Uma categoria especial de objetos em Python são os *containers*, capazes de armazenar outros objetos, como listas, tuplas e dicionários." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "### Sequências\n", "\n", "#### Listas" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Listas são a sequência mais comum e mais utilizada em Python. Listas podem ser criadas diretamente utilizando-se colchetes \"`[]`\", como no exemplo abaixo contendo oito objetos *string*:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "list" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L = ['vermelho', 'azul', 'verde', 'amarelo', 'ciano', 'magenta', 'branco', 'preto']\n", "type(L)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "['vermelho', 'azul', 'verde', 'amarelo', 'ciano', 'magenta', 'branco', 'preto']" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Elementos da lista podem ser acessados por seu **índice**, lembrando que, de modo similar a Fortran e C mas diferentemente de MATLAB, o primeiro elemento é indexado por 0:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "'vermelho'" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L[0]" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "'verde'" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L[2]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Um recurso útil na indexação em Python é que índices negativos podem ser utilizados para acessar a lista em **ordem reversa**. Por exemplo, -1 pode ser utilizado para acessar o último elemento da lista:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "'preto'" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L[-1]" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "'branco'" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L[-2]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Outro recurso útil é chamado de *slicing*. Utilizando a notação `início:fim:passo`, podemos obter listas que são subsequências da lista inicial:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "['verde', 'amarelo', 'ciano', 'magenta']" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L[2:6]" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "['verde', 'amarelo', 'ciano', 'magenta', 'branco', 'preto']" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L[2:]" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "['azul', 'amarelo', 'magenta']" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L[1:6:2]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Listas podem conter tipos diferentes de objetos:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "[3, -200.7, (3+5j), 'hello']" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L = [3, -200.7, 3+5j, 'hello']\n", "L" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "O método `pop` pode ser utilizado para obter e simultaneamente retirar um objeto da lista. Seu comportamente padrão (sem argumentos) é remover o último elemento da lista:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "'hello'" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = L.pop()\n", "x" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "[3, -200.7, (3+5j)]" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "A posição do elemento-alvo pode ser informada:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = L.pop(0)\n", "x" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "[-200.7, (3+5j)]" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Os métodos `append` e `extend` podem ser utilizados para adicionar elementos à lista. O primero adiciona um único objeto como elemento da lista. Já `extend` adiciona a lista cada um dos elementos de uma segunda lista passada como argumento:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "[-200.7, (3+5j)]" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "[-200.7, (3+5j), 42]" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L.append(42)\n", "L" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "[-200.7, (3+5j), 42, 3, 5, 'ueba!']" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L.extend([3, 5, 'ueba!'])\n", "L" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Se uma lista for utilizada como argumento da função `append`, ela será inserida como um único elemento:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[-200.7, (3+5j), 42, 3, 5, 'ueba!', [1, 2, 3]]" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L.append([1,2,3])\n", "L" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "#### Tuplas\n", "\n", "Tuplas são **listas imutáveis**. Elementos podem ser lidos a partir das tuplas e até mesmo *slicing* pode ser utilizado para gerar novas tuplas. Porém, não é possível alterar uma tupla de forma alguma após sua criação." ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "ponto = (23, 542)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "(23, 542)" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ponto" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "23" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ponto[0]" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "23\n", "542\n" ] } ], "source": [ "x, y = ponto\n", "print x\n", "print y" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Dicionários\n", "\n", "Dicionários são tabelas para armazenamento eficiente de pares *chave*, *valor*. Eles são implementados através de eficientes **tabelas de espalhamento** (*hash tables*)." ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "tel = {'emmanuelle': 5752, 'sebastian': 5578}" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "{'emmanuelle': 5752, 'sebastian': 5578}" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tel" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "['sebastian', 'emmanuelle']" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tel.keys()" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "[5578, 5752]" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tel.values()" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "5578" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tel['sebastian']" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Um nova entrada pode ser adicionada ao dicionário simplesmente atribuindo-se um valor a uma nova chave:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "{'emmanuelle': 5752, 'sebastian': 5578, 'thiago': 5823}" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tel['thiago'] = 5823\n", "tel" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Iteração em dicionários" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fale com sebastian no ramal 5578\n", "Fale com thiago no ramal 5823\n", "Fale com emmanuelle no ramal 5752\n" ] } ], "source": [ "for k in tel.keys():\n", " print 'Fale com %s no ramal %d' % (k, tel[k])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Controle de fluxo\n", "\n", "### `if/elif/else`" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "OK, o Universo está bem\n" ] } ], "source": [ "if 2+2 == 4:\n", " print 'OK, o Universo está bem'" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "É demais!\n" ] } ], "source": [ "a = 10\n", "\n", "if a == 1:\n", " print 'É pouco'\n", "elif a == 2:\n", " print 'É bom'\n", "else:\n", " print 'É demais!'" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### for/range" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "2\n", "3\n", "4\n" ] } ], "source": [ "for i in range(5):\n", " print i" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python é legal\n", "Python é poderoso\n", "Python é legível\n" ] } ], "source": [ "for word in ('legal', 'poderoso', 'legível'):\n", " print 'Python é %s' % word" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0º: Python é legal\n", "1º: Python é poderoso\n", "2º: Python é legível\n" ] } ], "source": [ "for i, word in enumerate(('legal', 'poderoso', 'legível')):\n", " print '%dº: Python é %s' % (i, word)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### while/break/continue" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "(-134+352j)" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = 1 + 1j\n", "\n", "while abs(z) < 100:\n", " if z.imag == 0:\n", " break\n", " z = z**2 + 1\n", "z" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Compreensão de listas\n", "\n", "Compreensão de listas é um dos recursos mais interessantes da linguagem Python. Esse recurso possibilita a criação dinâmica de novas listas a partir de objetos iteráveis, sendo mais eficiente que o uso de um laço `for` e produzindo código mais legível. Considere o exemplo abaixo:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sqr = [i**2 for i in range(10)]\n", "sqr" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "A semântica do código acima é simples: `sqr` é uma lista contendo $i^2$ para cada $i$ na sequência `range(10)`, que no caso é o intervalo $[0,9]$. Considere outro exemplo:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "[5, 7, 12]" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "doc = ['Hello', 'Embrapa', 'Informática']\n", "wlen = [len(word) for word in doc]\n", "wlen" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Aqui, `wlen` é a lista contendo o comprimento de cada palavra na sequência `doc`. Usada corretamente, a compreensão de listas pode produzir códigos elegantes de fácil compreensão por parte de outros pesquisadores. Note como o primeiro exemplo corresponde diretamente a expressão matemática:\n", "\n", "$i^2 \\,,\\forall i \\in [0,9]$." ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" } }, "nbformat": 4, "nbformat_minor": 0 }