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]:
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))
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))
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
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
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
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
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"))
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)
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"))
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"))
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"))