• Unidade 1
  • Capítulo 1 - Introdução ao Curso
  • Atividades
  • 2 - Revisão Python
  • 2.2 - Dicionario e Funções

1. Anotações do tipo de Entrada / Saída de funções no python

Vamos mudar o foco por um segundo e falar de funções. As anotações de tipo são uma nova funcionalidade adicionada no Python 3.5 que permite que você indique os tipos de variáveis esperados. As anotações de tipos em Python são apenas dicas e não fazem com que o código gere erros de execução se você passar um tipo diferente do sugerido.

A vantagem principal é que isso melhora a legibilidade e a manutenção do código. Mostrando para o programador que tipo de variável é esperado e qual é o tipo de retorno da função.

def adicionar(a: int, b: int):
    return f"O resultado da soma é de a + b = {a + b}"

resultado = adicionar(5, 3)
print(resultado)
O resultado da soma é de a + b = 8

2. Chamando funções através de dicionários

Em Python, as funções são objetos de primeira classe, o que significa que podem ser atribuídas a variáveis, armazenadas em coleções como listas ou dicionários, e passadas como argumentos para outras funções. Utilizar dicionários para armazenar funções permite que você selecione e execute uma função com base em uma chave.

Em robotica, isso será util para selecionar a ação que o robo deve executar com base em um estado.

No exemplo abaixo, vamos enviar uma sequencia de comandos para o robo, e ele deve executar cada comando em sequencia. Para isso, vamos criar um dicionário com as funções que o robo pode executar, e vamos chamar a função que está no dicionário.

class Robot:
    def __init__(self):
        self.robot_state = 'stop'
        self.state_machine = {
            'forward': self.forward,
            'left': self.left,
            'right': self.right,
            'stop': self.stop,
        }

    def forward(self):
        print(f'\nEstado atual: {self.robot_state}')
        print('O robô está indo para frente')

    def left(self):
        # Move subtraindo 1 uma coluna
        # Atualiza a posição
        print(f'\nEstado atual: {self.robot_state}')
        print('O robô está indo para esquerda')

    def right(self):
        # Move somando 1 uma coluna
        # Atualiza a posição
        print(f'\nEstado atual: {self.robot_state}')
        print('O robô está indo para direita')

    def stop(self):
        # Não faz nada
        print(f'\nEstado atual: {self.robot_state}')
        print('O robô está parado')

    def control(self):
        self.state_machine[self.robot_state]()

robot = Robot()
sequencia = ['forward', 'forward', 'left', 'right', 'stop']
for robot_state in sequencia:
    robot.robot_state = robot_state
    robot.control()

Estado atual: forward
O robô está indo para frente

Estado atual: forward
O robô está indo para frente

Estado atual: left
O robô está indo para esquerda

Estado atual: right
O robô está indo para direita

Estado atual: stop
O robô está parado

Neste exemplo temos o seguinte dicionário:

        self.state_machine = {
            'forward': self.forward,
            'left': self.left,
            'right': self.right,
            'stop': self.stop,
        }

Em robotica, uma maquina de estados é uma forma de organizar o comportamento do robo. Cada estado é uma função que o robo deve executar. A chave do dicionário é o nome do estado e o valor é a função que deve ser executada.

A variavel self.robot_state é uma string que contem o nome do estado atual do robo. Para executar a função que corresponde ao estado atual, basta fazer:

        self.state_machine[self.robot_state]()

Nesse caso, modificamos o valor da variavel self.robot_state de fora da classe, mas poderiamos ter feito isso dentro da classe.