{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "O Python é uma linguagem interpretada. Podemos fornecer comandos ao interpretador, que serão executados imediatamente (não existe uma fase de compilação)." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2 + 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tipos de dados" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Existem três tipos numéricos primitivos em Python:\n", "- Inteiros\n", "- Números de ponto flutuante\n", "- Números complexos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Inteiros" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A única novidade dos números inteiros é que eles têm precisão ilimitada (podemos representar um número tão grande quanto o computador e o interpretador consigam)." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "12" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "12" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-12" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "-12" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "9999999999999999999999999999" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "10000000000000000000000000000 - 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ponto flutuante" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Os números de ponto flutuante são sempre de precisão dupla (64 bits)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2.3e-05" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2.3e-5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Complexos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Números complexos podem ser representados pela notação cartesiana, colocando um `j` após o valor da parte imaginária." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(2+3j)" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2 + 3j" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(-6+4j)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(2 + 3j) * 2j" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Operações" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "O Python entende todos os operadores aritméticos tradicionais para todos os tipos numéricos acima. A exponenciação é representada por `**`." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 + 1" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-3" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 - 4" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "12" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "3 * 4" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.6666666666666666" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2 / 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como vemos acima, a divisão de números inteiros resulta em um número de ponto flutuante." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "8" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2 ** 3" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.8000000000000003" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "3.2 - 1.4" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2.2" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "3.2 - 1" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(2.2+4j)" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "3.2 - (1 - 4J)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "4.333333333333333" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "13 / 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A divisão inteira pode ser conseguida pelo operador `//`." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "13 // 3" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "13 % 3" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-5" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "-13 // 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Condicionais" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Blocos de comandos são representados em Python pela quantidade de espaço em branco antes dos comandos.\n", "\n", "O comando condicional é representado por um `if` seguido da condição e de dois pontos, com os comandos a serem executados caso a condição seja verdadeira delimitados pela quantidade de espaço em branco." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ufa, ainda bem!\n", "Fiquei assustado por um tempo.\n" ] } ], "source": [ "if 2 < 3:\n", " print('Ufa, ainda bem!')\n", " print('Fiquei assustado por um tempo.')" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": true }, "outputs": [], "source": [ "if 2 >= 3:\n", " print('O que está acontecendo aqui?')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Colocamos um bloco dentro de outro bloco aumentando a quantidade de espaço em branco." ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Positivo\n" ] } ], "source": [ "x = 3\n", "if x > 0:\n", " print('Positivo')\n", " if x % 2 == 0:\n", " print('Par')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para indicar comando a executar caso a condição seja falsa, usamos o comando `else`." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tudo certo\n" ] } ], "source": [ "if 2 < 3:\n", " print('Tudo certo')\n", "else:\n", " print('Problemas')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Outro comando associado com o if é o `elif` que indica uma outra condição a testar, caso a condição anterior tenha sido falsa." ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Nulo\n" ] } ], "source": [ "x = 0\n", "if x < 0:\n", " print('Negativo')\n", "elif x > 0:\n", " print('Positivo')\n", "else:\n", " print('Nulo')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Repetição" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Uma repetição é indicada pelo comando `while`, que tem sintaxe similar à do `if`." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10\n", "9\n", "8\n", "7\n", "6\n", "5\n", "4\n", "3\n", "2\n", "1\n" ] } ], "source": [ "n = 10\n", "while n > 0:\n", " print(n)\n", " n -= 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## For" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ao contrário de C, onde o `for` é apenas uma outra forma de escrever um `while`, o `for` de Python tem uma semântica diferente. No `for` se especifica uma variável e uma sequência de valores. Cada um dos valores da sequência será atribuído (em ordem e um por vez) à variável, e então o bloco de comandos dentro do `for` será executado.\n", "\n", "Por exemplo:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2 4\n", "3 9\n", "5 25\n", "7 49\n", "11 121\n", "13 169\n" ] } ], "source": [ "for x in [2, 3, 5, 7, 11, 13]:\n", " print(x, x**2)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "b segundo\n", "c terceiro\n", "a primeiro\n" ] } ], "source": [ "trans = {'a': 'primeiro', 'b': 'segundo', 'c': 'terceiro'}\n", "for k in trans:\n", " print(k, trans[k])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note no resultado acima: a ordem em que os elementos são percorrido é determinada pelo gerador da sequência. No caso de listas, serão gerados os elementos na ordem em que eles se encontram na lista, mas em dicionários a ordem depende de como eles são armazenados internamente.\n", "\n", "Bastante útil com o `for` é a sequência `range`, que tem o formato\n", "\n", " range(inicio, final, passo)\n", "\n", "que gera um conjunto de valores igualmente espaçados. Aqui, `inicio` indica o primeiro valor a gerar, `final` indica o valor onde se para de gerar (esse valor não será incluído entre os gerados) e `passo` é a separação de um valor para o próximo. Podemos omitir `passo`, e seu valor será assumido como 1. Podemos adicionalmente omitir `inicio` e seu valor será assumido como 0.\n", "\n", "Veja os exemplos:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n", "4\n", "6\n", "8\n" ] } ], "source": [ "for i in range(2, 10, 2):\n", " print(i)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n", "3\n", "4\n", "5\n", "6\n", "7\n", "8\n", "9\n" ] } ], "source": [ "for i in range(2, 10):\n", " print(i)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "2\n", "3\n", "4\n", "5\n", "6\n", "7\n", "8\n", "9\n" ] } ], "source": [ "for i in range(10):\n", " print(i)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10\n", "8\n", "6\n", "4\n" ] } ], "source": [ "for i in range(10, 2, -2):\n", " print(i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarmente útil é o gerador `enumerate`, que percorre uma dada sequência e gera pares índice/valor para essa sequência (os pares são tuplas com dois elementos).\n", "\n", "Veja o exemplo:" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 : 2\n", "1 : 3\n", "2 : 5\n", "3 : 7\n", "4 : 11\n", "5 : 13\n", "6 : 17\n", "7 : 19\n" ] } ], "source": [ "valores = [2, 3, 5, 7, 11, 13, 17, 19]\n", "for i, x in enumerate(valores):\n", " print(i, ': ', x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Variáveis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Variáveis não precisam ser declaradas. Uma variável em Python passa a existir no momento em que atribuímos um valor a ela.\n", "\n", "Na verdade, a variável recebe uma *referência* a um objeto que tem o valor atribuido. Uma referência é similar a um ponteiro em C. Uma variável pode se referenciar a objetos de qualquer tipo." ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x = 12" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "12\n" ] } ], "source": [ "print(x)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x = 2 + 5j" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Estruturas de dados" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Existem algumas estruturas de dados pré-definidas que são bastante úteis:\n", "- Listas\n", "- Dicionários\n", "- Conjuntos\n", "- Tuplas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Listas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Listas são listas ligadas com diversos elementos armazenados sequencialmente, na qual podemos com facilidade inserir ou retirar elementos.\n", "\n", "A lista na verdade guarda referências para os objetos (da mesma forma que as variáveis).\n", "\n", "Representamos uma lista usando `[` e `]` com os elementos separados por vírgulas." ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": true }, "outputs": [], "source": [ "primeiros_pares = [0, 2, 4, 6, 8, 10]" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[0, 2, 4, 6, 8, 10]" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "primeiros_pares" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Uma lista pode ser indexada para acessar um elemento arbitrário." ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": true }, "outputs": [], "source": [ "primeiros_pares.append(12)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "primeiros_pares[1]" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "primeiros_pares[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "O índice fornecido é verificado: Se ele for inválido, um erro será gerado, interrompendo a execução do programa." ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "ename": "IndexError", "evalue": "list index out of range", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprimeiros_pares\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m7\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mIndexError\u001b[0m: list index out of range" ] } ], "source": [ "primeiros_pares[7]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podemos descobrir o número de elementos na lista com a função `len`." ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "7" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(primeiros_pares)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Índices para as listas podem ser negativos. Neste caso, eles contam de trás para frente a partir do último elemento (o último é o índice -1)." ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "12" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "primeiros_pares[-1]" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "primeiros_pares[-2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Índices negativos também são verificados." ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "ename": "IndexError", "evalue": "list index out of range", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprimeiros_pares\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m8\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mIndexError\u001b[0m: list index out of range" ] } ], "source": [ "primeiros_pares[-8]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Se quisermos encontrar índice de um elemento numa lista que tenha um valor especificado, podemos usar o método `index`, com a sintaxe abaixo (lista seguida de ponto seguida do nome do métodos seguido dos argumentos entre parêntesis)." ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "primeiros_pares.index(8)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Dicionários" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Outra estrutura de dados é o chamado dicionário. Ele é uma estrutura que guarda pares chave/valor, associando um valor para cada chave fornecida. Podemos depois consular o dicionário para encontrar o valor associado a uma chave.\n", "\n", "A sintaxe é com `{` e `}` e pares chave/valor separados por vírgula; cada par chave/valor é representado pela chave, um dois pontos e o valor." ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": true }, "outputs": [], "source": [ "telefones = {\"ana\": 123, \"beto\": 456, \"carlos\": 789, \"bento\": 543}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para encontra o valor associado com uma chave usamos a sintaxe de indexação." ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "456" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "telefones['beto']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podemos também mudar o valor associado a uma chave através dessa sintaxe." ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": true }, "outputs": [], "source": [ "telefones['carlos'] = 333" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As chaves são verificadas: se uma chave for solicitada para a qual nenhum valor foi fornecido, será gerado um erro." ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false }, "outputs": [ { "ename": "KeyError", "evalue": "'pedro'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtelefones\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'pedro'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mKeyError\u001b[0m: 'pedro'" ] } ], "source": [ "telefones['pedro']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Por outro lado, podemos fornecer o valor para uma nova chave." ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": true }, "outputs": [], "source": [ "telefones['pedro'] = 7777" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{'ana': 123, 'bento': 543, 'beto': 456, 'carlos': 333, 'pedro': 7777}" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "telefones" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Os valores são de tipos arbitrários. Por exemplo, o comando seguinte associa uma lista à chave `'ana'`." ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": true }, "outputs": [], "source": [ "telefones['ana'] = [123, 422]" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{'ana': [123, 422], 'bento': 543, 'beto': 456, 'carlos': 333, 'pedro': 7777}" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "telefones" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "422" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "telefones['ana'][1]" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### Conjuntos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Conjuntos são uma simplificação de dicionários que têm apenas chaves (sem valor associado). A vantagem dos conjuntos é que eles têm apenas uma cópia de cada elemento que for colocado neles." ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": true }, "outputs": [], "source": [ "primeiros_primos = {2, 3, 5, 7, 11, 13}" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": true }, "outputs": [], "source": [ "primeiros_inteiros = {0, 1, 2, 3, 4, 5}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podemos fazer algumas operações de conjuntos. Por exemplo, verificar se um elementos pertence a um conjunto:" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "9 in primeiros_primos" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "4 in primeiros_inteiros" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ou fazer a interseção de dois comjuntos." ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{2, 3, 5}" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "primeiros_primos & primeiros_inteiros" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ou a união de conjuntos." ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{0, 1, 2, 3, 4, 5, 7, 11, 13}" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "primeiros_primos | primeiros_inteiros" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ou a diferença de conjuntos." ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{0, 1, 4}" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "primeiros_inteiros - primeiros_primos" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{7, 11, 13}" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "primeiros_primos - primeiros_inteiros" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ou verificar se um conjunto é subconjunto de outro (`<` é usado para representar a relação de subconjunto)." ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "primeiros_primos < primeiros_inteiros" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "{1, 2} < primeiros_inteiros" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Tuplas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Por fim, tuplas são sequências de valores de um tamanho fixo. Exemplos de tuplas são duplas:" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "collapsed": true }, "outputs": [], "source": [ "lados = (5, 7)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ou triplas:" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "collapsed": true }, "outputs": [], "source": [ "triangulo = (3, 4, 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Os elementos das tuplas podem ser acessados por indexação:" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lados[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Mas, contrariamente a listas, não podemos alterar os elementos referenciados pelas tuplas." ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "collapsed": false }, "outputs": [ { "ename": "TypeError", "evalue": "'tuple' object does not support item assignment", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mlados\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" ] } ], "source": [ "lados[0] = 4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Funções" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Novas funções podem ser definidas usando o comando `def`, seguido do nome da função e da lista de argumentos. Os argumentos, como tradicional em Python, não precisam indicar seus tipos.\n", "\n", "A função executa até terminar o bloco ou encontrar um `return`. O `return` especifica o valor a ser retornado pela função." ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def poli_1(x):\n", " return 2*x**2 - 5 * x + 8" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "8.0" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "poli_1(2.5)" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def contagem(n):\n", " while n > 0:\n", " print(n)\n", " n -= 1\n", " print('Acabou')" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n", "4\n", "3\n", "2\n", "1\n", "Acabou\n" ] } ], "source": [ "contagem(5)" ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def H(n):\n", " s = 0.0\n", " for i in range(1, n+1):\n", " s += 1 / i\n", " return s" ] }, { "cell_type": "code", "execution_count": 85, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.8333333333333333" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H(3)" ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "7.485470860550343" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H(1000)" ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "14.392726722864989" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H(1000000)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Cadeias de caracteres" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cadeias de caracteres podem ser criadas delimitadas por `\"` ou `'`. Tanto faz o delimitador usado, desde que o usado para o fechamento seja o mesmo usado para a abertura." ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "collapsed": true }, "outputs": [], "source": [ "nome = 'Mecânica Clássica Computacional'" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "collapsed": true }, "outputs": [], "source": [ "codigo = \"7600033\"" ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "collapsed": true }, "outputs": [], "source": [ "a = 'Carlos \"Kaká\" Pereira'" ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Carlos \"Kaká\" Pereira\n" ] } ], "source": [ "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cadeias podem ser indexadas da mesma forma que listas." ] }, { "cell_type": "code", "execution_count": 92, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'l'" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nome[10]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Outra forma de indexar (também válida em listas) é através de *slilces*. Um slice é representado por\n", "\n", " inicio:final:passo\n", "\n", "e indica um conjunto de índices, com significado similar ao de `range`. Podemos omitir qualquer dos três elementos. Se `passo` é omitido, ele é assumido 1. se `inicio` é omitido, é assumido 0 e se `final` é omitido, é assumido que pegamos tudo até o final." ] }, { "cell_type": "code", "execution_count": 93, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Mecânica'" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nome[0:8]" ] }, { "cell_type": "code", "execution_count": 94, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Mecânica'" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nome[:8]" ] }, { "cell_type": "code", "execution_count": 95, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'ca Computacional'" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nome[15:]" ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Mecânica Clássica Computacional'" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nome" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'M'" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nome[0]" ] }, { "cell_type": "code", "execution_count": 98, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'e'" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nome[1]" ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'l'" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nome[-1]" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'a'" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nome[-2]" ] }, { "cell_type": "code", "execution_count": 101, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'â'" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nome[3]" ] }, { "cell_type": "code", "execution_count": 102, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'n'" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nome[4]" ] }, { "cell_type": "code", "execution_count": 103, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'ânica Clássica Computacio'" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nome[3:-3]" ] }, { "cell_type": "code", "execution_count": 104, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'âiaCásc optco'" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nome[3:-3:2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Um método útil de cadeias de caracteres é o método `strip`, que elimina todos os espaços em branco no começo e no final de uma cadeia. Temos também o `rstrip` que limpa apenas o final e o `lstrip` que limpa apenas o começo." ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "collapsed": true }, "outputs": [], "source": [ "linha = ' Primeiro 10 143.2 '" ] }, { "cell_type": "code", "execution_count": 106, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Primeiro 10 143.2'" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "linha.strip()" ] }, { "cell_type": "code", "execution_count": 107, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "' Primeiro 10 143.2'" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "linha.rstrip()" ] }, { "cell_type": "code", "execution_count": 108, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Primeiro 10 143.2 '" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "linha.lstrip()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Outro método útil é o `split`, que permite quebrar a cadeia em uma lista de subcadeias de acordo com um separador. Se o separador não é especificado, separa-se por espaços em branco." ] }, { "cell_type": "code", "execution_count": 109, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['Primeiro', '10', '143.2']" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "linha.split()" ] }, { "cell_type": "code", "execution_count": 110, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[' Primeiro ', ' 143.2 ']" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "linha.split('10')" ] }, { "cell_type": "code", "execution_count": 111, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['', '', '', '', 'Primeiro', '10', '143.2', '', '', '', '', '', '']" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "linha.split(' ')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A operação oposta ao `split` é feita pelo método `join`." ] }, { "cell_type": "code", "execution_count": 112, "metadata": { "collapsed": true }, "outputs": [], "source": [ "palavras = linha.split()" ] }, { "cell_type": "code", "execution_count": 113, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['Primeiro', '10', '143.2']" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "palavras" ] }, { "cell_type": "code", "execution_count": 114, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Primeiro 10 143.2'" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "' '.join(palavras)" ] }, { "cell_type": "code", "execution_count": 115, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Primeiro, 10, 143.2'" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "', '.join(palavras)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Arquivos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Arquivos podem ser abertos para leitura pela função `open`. Após isso, podemos ler seu conteúdo usando diversos métodos, como o `read` (que lê todo o arquivo como uma cadeia única) ou o `readliones` que lê uma linha por vêz como uma cadeia.\n", "\n", "Quando não precisamos mais do arquivo, devemos fechá-lo com o método `close`." ] }, { "cell_type": "code", "execution_count": 116, "metadata": { "collapsed": true }, "outputs": [], "source": [ "arq = open('teste.txt')" ] }, { "cell_type": "code", "execution_count": 117, "metadata": { "collapsed": true }, "outputs": [], "source": [ "tudo = arq.read()" ] }, { "cell_type": "code", "execution_count": 118, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Primeira linha aqui.\\nEsta é a segunda linha.\\n\\nQuarta linha.'" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tudo" ] }, { "cell_type": "code", "execution_count": 119, "metadata": { "collapsed": true }, "outputs": [], "source": [ "arq.close()" ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "collapsed": true }, "outputs": [], "source": [ "arq = open('teste.txt', 'r')" ] }, { "cell_type": "code", "execution_count": 121, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Esta é a linha: Primeira linha aqui.\n", "\n", "Esta é a linha: Esta é a segunda linha.\n", "\n", "Esta é a linha: \n", "\n", "Esta é a linha: Quarta linha.\n" ] } ], "source": [ "for linha_arq in arq.readlines():\n", " print('Esta é a linha:', linha_arq)" ] }, { "cell_type": "code", "execution_count": 122, "metadata": { "collapsed": true }, "outputs": [], "source": [ "arq.close()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python [conda root]", "language": "python", "name": "conda-root-py" }, "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.5.2" } }, "nbformat": 4, "nbformat_minor": 2 }