In [1]:
# ignore esse código inicial, é apenas para preparar a página
from IPython.display import YouTubeVideo, HTML, Image, display
css_file = './modelo.css'
HTML(open(css_file, "r").read())


Out[1]:

Introdução à Programação em Python

Condicionais

Nossa função para o cálculo de entropia ficou da seguinte maneira:

def entropia(p):
    return -p*log(p,2) - (1.0-p)*log(1.0-p,2)

Porém ao tentar calcular a entropia para os valores 0.0 e 1.0, a função retornava o erro "Math domain error", indicando que tentamos calcular o valor do logarítmo fora do seu domínio.


In [1]:
from math import log

def entropia(p):
    return -p*log(p,2) - (1.0-p)*log(1.0-p,2)

print(entropia(1.0), entropia(0.0))


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-1-64c4888e420b> in <module>()
      4     return -p*log(p,2) - (1.0-p)*log(1.0-p,2)
      5 
----> 6 print(entropia(1.0), entropia(0.0))

<ipython-input-1-64c4888e420b> in entropia(p)
      2 
      3 def entropia(p):
----> 4     return -p*log(p,2) - (1.0-p)*log(1.0-p,2)
      5 
      6 print(entropia(1.0), entropia(0.0))

ValueError: math domain error

Por conveniência, o valor da entropia para esses dois casos é definida como 0.0.

Nossa função poderia ficar então da seguinte forma:

def entropia(p):
    Se p == 0 ou p == 1:
        return 0.0
    Senão:
        return -p*log(p,2) - (1.0-p)*log(1.0-p,2)

O se e senão criam uma estrutura conhecida como condicionais em que certos cálculos são realizados apenas se determinadas condições são satisfeitas.

No Python utilizamos if e else.


In [2]:
def entropia(p):
    if p == 0 or p == 1:
        return 0.0
    else:
        return -p*log(p,2) - (1.0-p)*log(1.0-p,2)

print(entropia(0.0), entropia(1.0), entropia(0.5))


0.0 0.0 1.0

Nos dois primeiros casos, entropia(0.0) e entropia(1.0), a função irá verificar que p contém um dos valores especiais e irá retornar simplesmente zero.

No último caso, a função verificará que não é nenhum caso especial e calculará a fórmula da entropia.

Exercício 01: crie uma função chamada MediaPonderada que receba como parâmetro as notas da P1, da P2 e o peso w da P1 e retorne a média final ponderada pelo peso dado. Note que w deve ser um valor entre 0.0 e 1.0 e a média pode ser calculada por $w.P1 + (1.0-w).P2$.

Caso o valor de w esteja fora do domínio, assuma o valor padrão de 0.5.


In [5]:
# crie a função aqui:





# casos de teste
print(MediaPonderada(10, 9, 0.3))  # resposta = 9.3
print(MediaPonderada(5,7,1.0))  # resposta = 5
print(MediaPonderada(3,7,2.0))  # resposta = 5


9.3
5.0
5.0

Exercício 02: crie uma função chamada Conceito que, dada a média final M, o limiar de aprovação limiar, retorne se o aluno foi aprovado ou reprovado.


In [8]:
# crie a função aqui





corte = 8

media = MediaPonderada(10, 9, 0.3)
print (media, Conceito(media, corte))  # 9.3, A

media = MediaPonderada(5,7,0.3)
print (media, Conceito(media, corte))  # 6.4, F


9.3 A
6.4 F

Exercício 03: agora crie uma função chamada Faltas que recebe como parâmetro o número de faltas faltas e o limiar de faltas limiar e determina se o aluno foi reprovado por falta ou não.

Vamos determinar o conceito "O" como reprovado por faltas e "NO" como não-reprovado por faltas.


In [9]:
# crie a função aqui
def Faltas(faltas, limiar):
    
    
    
    
    
corte = 14

faltas = Faltas(10, corte)
print (faltas)  # NO

faltas = Faltas(20, corte)
print (faltas) # O


NO
O

Exercício 04: faça uma função que receba o conceito obtido pelas notas e o conceito obtido pelas faltas e determine se o aluno foi aprovado (A), reprovado (F) ou reprovado por falta (O).

Utilize as funções anteriores!


In [10]:
# crie a função aqui




media = MediaPonderada(10, 9, 0.3)
conceito = Conceito(media, 8) 
faltas = Faltas(10, 14)
print(ConceitoFinal(conceito, faltas)) # A

conceito = Conceito(0.0, 8)
print(ConceitoFinal(conceito,faltas)) # F

faltas = Faltas(20, 14)
print(ConceitoFinal(conceito,faltas)) # O


A
F
O

Vamos criar agora o jogo do Pedra-Papel-Tesoura.

Nesse jogo temos a seguinte regra:

Dadas as jogadas do jogador 1 (J1) e do jogador 2 (J2)
Se J1 == J2:
    deu empate
Senão se J1 for "pedra" e J2 for "tesoura" OU J1 for "tesoura" e J2 for "papel" OU J1 for "papel" e J2 for "pedra":
    J1 ganhou
Senão:
    J2 ganhou

Reparem que, diferente dos casos anteriores, temos mais do que duas condições para verificar.

As condições subsequentes do if podem ser realizadas no Python utilizando a instrução elif.


In [11]:
def PedraPapelTesoura(J1, J2):
    """
    Determina o vencedor de uma partida de pedra-papel-tesoura.
    Retorna -1 caso o jogador 1 tenha vencido, 0 em caso de empate e +1 caso o jogador 2 vença
    """

    
    
    
print(PedraPapelTesoura("pedra", "tesoura"), PedraPapelTesoura("pedra", "pedra"), PedraPapelTesoura("tesoura", "pedra"))


-1 0 1

O texto escrito logo após a definição da função, envolvidos entre sequência de 3 aspas duplas é chamado de docstring.

Toda função que possui uma docstring permite que você utilize o comando help() para verificar o que ela faz:


In [12]:
help(PedraPapelTesoura)


Help on function PedraPapelTesoura in module __main__:

PedraPapelTesoura(J1, J2)
    Determina o vencedor de uma partida de pedra-papel-tesoura.
    Retorna -1 caso o jogador 1 tenha vencido, 0 em caso de empate e +1 caso o jogador 2 vença

Exercício 05: crie uma função que jogue cara ou coroa. A entrada sera a opção "cara" ou "coroa". A função irá sortear um valor entre 0.0 e 1.0, caso o valor seja menor do 0.5, o resultado será definido como "cara", caso contrário, "coroa".

A saída deverá indicar se o usuário ganhou ou não.

Para sortear um valor, utilize a função random() da biblioteca random.


In [21]:
import random

def CaraCoroa(palpite):
    numero = random.random()

    
    
    
    
    
print(CaraCoroa("cara"))
print(CaraCoroa("cara"))
print(CaraCoroa("cara")) 
print(CaraCoroa("cara"))


ganhou
perdeu
ganhou
perdeu

In [22]:
def CaraCoroa(palpite):
    numero = random.random()
    # usando apenas um if-else

    
    
    
print(CaraCoroa("cara"))
print(CaraCoroa("cara")) 
print(CaraCoroa("cara")) 
print(CaraCoroa("cara"))


ganhou
ganhou
perdeu
perdeu

Exercício 06: Vamos alterar a função PedraPapelTesoura() para receber apenas a jogada do jogador 1, o jogador 2 será determinado aleatoriamente pela função choice() da biblioteca random.

A função choice() recebe uma lista de valores como parâmetro e retorna um elemento da lista sorteado aleatoriamente.


In [28]:
def PedraPapelTesoura(J1):
    """
    Determina o vencedor de uma partida de pedra-papel-tesoura.
    Retorna -1 caso o jogador 1 tenha vencido, 0 em caso de empate e +1 caso o jogador 2 vença
    """
    J2 = random.choice([ "pedra", "papel", "tesoura"])

    
    
    
print(PedraPapelTesoura("pedra"))
print(PedraPapelTesoura("pedra"))
print(PedraPapelTesoura("pedra"))


(0, 'pedra')
(1, 'papel')
(0, 'pedra')