{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Python para Desenvolvedores](http://ricardoduarte.github.io/python-para-desenvolvedores/#conteudo)\n", "===================================\n", "2ª edi\u00e7\u00e3o, revisada e ampliada\n", "-----------------------------------\n", "\n", "Exerc\u00edcios VI\n", "=============================\n", "_____________________________\n", "1\\. Implementar um m\u00f3dulo com uma fun\u00e7\u00e3o `tribonacci(n)` que retorne uma lista de `n` n\u00fameros de Tribonacci, aonde `n` \u00e9 o par\u00e2metro da fun\u00e7\u00e3o. Fa\u00e7a testes da fun\u00e7\u00e3o caso o m\u00f3dulo seja executado como principal.\n", "\n", "Solu\u00e7\u00e3o:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def tribonacci(n):\n", " \"\"\"\n", " Retorna uma lista com n elementos de Tribonacci.\n", " \n", " >>> t = [1, 1, 2, 4, 7, 13, 24, 44, 81, 149, \\\n", " 274, 504, 927, 1705, 3136, 5768, 10609, 19513, \\\n", " 35890, 66012, 121415, 223317]\n", " >>> t == tribonacci(22)\n", " True\n", " >>> tribonacci('22')\n", " Traceback (most recent call last):\n", " File \"pyro_server.py\", line 26, in \n", " print Dist().tribonacci('22')\n", " File \"pyro_server.py\", line 14, in tribonacci\n", " raise TypeError\n", " TypeError\n", " \"\"\"\n", " if type(n) is not int:\n", " raise TypeError\n", "\n", " # Os 3 primeiros elementos da sequ\u00eancia\n", " t = [1, 1, 2]\n", "\n", " if n < 4:\n", " return t[:n]\n", "\n", " for i in range(3, n):\n", " \n", " # Soma os 3 elementos finais\n", " t.append(sum(t[-3:]))\n", " \n", " return t\n", "\n", "def _doctest():\n", " \"\"\"\n", " Evoca o doctest.\n", " \"\"\"\n", " \n", " import doctest\n", " doctest.testmod()\n", "\n", "if __name__ == \"__main__\":\n", "\n", " _doctest()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "2\\. Implementar:\n", "\n", "+ um servidor que publique um objeto distribu\u00eddo e este evoque a fun\u00e7\u00e3o tribonacci.\n", "+ um cliente que use o objeto distribu\u00eddo para calcular a sequ\u00eancia de Tribonacci.\n", "\n", "Solu\u00e7\u00e3o:\n", "\n", "Servidor:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import Pyro.core\n", "\n", "# Importa o m\u00f3dulo com a fun\u00e7\u00e3o\n", "import trib\n", "\n", "class Dist(Pyro.core.ObjBase):\n", "\n", " @staticmethod\n", " def tribonacci(n):\n", " return trib.tribonacci(n)\n", "\n", "if __name__ == '__main__':\n", "\n", " # Define a porta TCP/IP usada pelo Pyro\n", " Pyro.config.PYRO_PORT = 8888\n", " \n", " # Define o limite de cliente ao mesmo tempo\n", " Pyro.config.PYRO_MAXCONNECTIONS = 2000\n", " \n", " Pyro.core.initServer()\n", " \n", " # norange=1 faz com que o Pyro sempre use a mesma porta\n", " daemon = Pyro.core.Daemon(norange = 1)\n", "\n", " # Define o limite de tempo\n", " daemon.setTimeout(300)\n", "\n", " uri = daemon.connect(Dist(),'dist')\n", " daemon.requestLoop()" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cliente:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import Pyro.core\n", "\n", "# URL com a porta\n", "url = 'PYROLOC://127.0.0.1:8888/dist'\n", "proxy = Pyro.core.getProxyForURI(url)\n", "\n", "# Teste com at\u00e9 dez elementos\n", "for i in range(10):\n", " print i + 1, '=>', proxy.tribonacci(i + 1)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", "" ], "output_type": "pyout", "prompt_number": 1, "text": [ "" ] } ], "prompt_number": 1 } ], "metadata": {} } ] }