Python para Desenvolvedores

2ª edição, revisada e ampliada

Exercícios VI


1. Implementar um módulo com uma função tribonacci(n) que retorne uma lista de n números de Tribonacci, aonde n é o parâmetro da função. Faça testes da função caso o módulo seja executado como principal.

Solução:

In [1]:
def tribonacci(n):
    """
    Retorna uma lista com n elementos de Tribonacci.
    
    >>> t = [1, 1, 2, 4, 7, 13, 24, 44, 81, 149, \
    274, 504, 927, 1705, 3136, 5768, 10609, 19513, \
    35890, 66012, 121415, 223317]
    >>> t == tribonacci(22)
    True
    >>> tribonacci('22')
    Traceback (most recent call last):
      File "pyro_server.py", line 26, in <module>
        print Dist().tribonacci('22')
      File "pyro_server.py", line 14, in tribonacci
        raise TypeError
    TypeError
    """
    if type(n) is not int:
        raise TypeError

    # Os 3 primeiros elementos da sequência
    t = [1, 1, 2]

    if n < 4:
        return t[:n]

    for i in range(3, n):
        
        # Soma os 3 elementos finais
        t.append(sum(t[-3:]))
        
    return t

def _doctest():
    """
    Evoca o doctest.
    """
    
    import doctest
    doctest.testmod()

if __name__ == "__main__":

    _doctest()

2. Implementar:

  • um servidor que publique um objeto distribuído e este evoque a função tribonacci.
  • um cliente que use o objeto distribuído para calcular a sequência de Tribonacci.

Solução:

Servidor:

In [ ]:
import Pyro.core

# Importa o módulo com a função
import trib

class Dist(Pyro.core.ObjBase):

    @staticmethod
    def tribonacci(n):
        return trib.tribonacci(n)

if __name__ == '__main__':

    # Define a porta TCP/IP usada pelo Pyro
    Pyro.config.PYRO_PORT = 8888
    
    # Define o limite de cliente ao mesmo tempo
    Pyro.config.PYRO_MAXCONNECTIONS = 2000
    
    Pyro.core.initServer()
    
    # norange=1 faz com que o Pyro sempre use a mesma porta
    daemon = Pyro.core.Daemon(norange = 1)

    # Define o limite de tempo
    daemon.setTimeout(300)

    uri = daemon.connect(Dist(),'dist')
    daemon.requestLoop()

Cliente:

In [ ]:
import Pyro.core

# URL com a porta
url = 'PYROLOC://127.0.0.1:8888/dist'
proxy = Pyro.core.getProxyForURI(url)

# Teste com até dez elementos
for i in range(10):
    print i + 1, '=>', proxy.tribonacci(i + 1)
In [1]:
 
Out[1]: