<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Introdução à Programação em Python
Condicionais
Nossa função para o cálculo de entropia ficou da seguinte maneira
Step1:  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
Step2:  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
Step3:  Exercício 02
Step4:  Exercício 03
Step5:  Exercício 04
Step7:  Vamos criar agora o jogo do Pedra-Papel-Tesoura.
Nesse jogo temos a seguinte regra
Step8:  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
Step9:  Exercício 05
Step11:  Exercício 06
<ASSISTANT_TASK:>
Python Code:
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))
Explanation: Introdução à Programação em Python
Condicionais
Nossa função para o cálculo de entropia ficou da seguinte maneira:
python
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.
End of explanation
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))
Explanation: 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:
python
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.
End of explanation
# 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
Explanation: 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.
End of explanation
# 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
Explanation: 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.
End of explanation
# 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
Explanation: 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.
End of explanation
# 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
Explanation: 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!
End of explanation
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"))
Explanation: 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.
End of explanation
help(PedraPapelTesoura)
Explanation: 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:
End of explanation
import random
def CaraCoroa(palpite):
    numero = random.random()
    
    
    
    
    
print(CaraCoroa("cara"))
print(CaraCoroa("cara"))
print(CaraCoroa("cara")) 
print(CaraCoroa("cara")) 
def CaraCoroa(palpite):
    numero = random.random()
    # usando apenas um if-else
    
    
    
print(CaraCoroa("cara"))
print(CaraCoroa("cara")) 
print(CaraCoroa("cara")) 
print(CaraCoroa("cara")) 
Explanation: 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.
End of explanation
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"))
Explanation: 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.
End of explanation
<END_TASK>