<jupyter_start><jupyter_text>Funções e programação defensiva  LicenseAll content can be freely used and adapted under the terms of the [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/).![Creative Commons License](https://i.creativecommons.org/l/by/4.0/88x31.png)  ImportsColoque **todos** os `import` na célula abaixo. Não se esqueça do `%matplotlib inline` para que os gráficos apareçam no notebook.<jupyter_code>import numpy as np  # Biblioteca para cálculo numérico do Python
import math
import matplotlib.pyplot as plt
%matplotlib inline<jupyter_output><empty_output><jupyter_text>Funções Tarefa - Criando uma função Crie duas funções:* `celsius_para_kelvin` que recebe a temperatura em Celsius como argumento e retorna a temperatura convertida para Kelvin* `kelvin_para_fahr` que recebe uma temperatura em Kelvin e a converte para FahrenheitLembrando que:* Kelvin = Celsius + 273.15* Fahrenheit = (Kelvin - 273.15)*1.8 + 32<jupyter_code>def celsius_para_kelvin(temp): #define a funcao que vamos usar
    conv = temp + 273.15 #conv e a conversão de celsius para kelvin
    return conv #retorna o resultado para a variavel conv
def kelvin_para_fahr(temp):
    conv = (temp - 273.15)*1.8 + 32 #funcao que converte kelvin para fahr
    return conv #retorna o resultado para a variavel conv<jupyter_output><empty_output><jupyter_text>As células abaixo executam a sua função e comparam com os resultados esperados. Use-as para verificar se a sua função está funcionando (todas as células devem imprimir `True`).<jupyter_code>celsius_para_kelvin(0) == 273.15
celsius_para_kelvin(-273.15) == 0
celsius_para_kelvin(42) == 315.15
kelvin_para_fahr(273.15) == 32
kelvin_para_fahr(373.15) == 212<jupyter_output><empty_output><jupyter_text>Tarefa - Compondo funçõesCrie uma função chamada `celsius_para_fahr` que recebe a temperatura em Celsius e retorna a temperatura em Fahrenheit. Você deve **obrigatoriamente** utilizar as duas funções criadas anteriormente para calcular o resultado.<jupyter_code>def celsius_para_fahr(temp):             
    conv = celsius_para_kelvin(temp)     #usa a função definida para converter celsius para kelvin.
    conv = kelvin_para_fahr(conv)        #a partir do resultado da função anterior, converte kelvin para fharenheit.
    return conv<jupyter_output><empty_output><jupyter_text>As células abaixo executam a sua função e comparam com os resultados esperados. Use-as para verificar se a sua função está funcionando (todas as células devem imprimir `True`).<jupyter_code>celsius_para_fahr(0) == 32
celsius_para_fahr(100) == 212<jupyter_output><empty_output><jupyter_text>Tarefa - Documentando funçõesFaça as funções acima novamente (**com o mesmo nome**), dessa vez criando *docstrings* para essas funções. A docstring da função deve ser no formato:    def minha_funcao(coisa1, coisa2):        """        Calcula/faz tal e tal coisa utilizando a formula de tal        e assumindo que tal.                Exemplos:        minha_funcao(10, 20) => 1345        minha_funcao(34, 42) => 145        """<jupyter_code>def celsius_para_kelvin(temp): 
    
    """
    Faz a conversão de temperatura Celsius para Kelvin.
    
    Exemplos:
    celcius_para_kelvin(0) => 273.15
    Quando a temperatura for 0 graus Celsius, em kelvin será 273.15.

    """
    
    conv = temp + 273.15
    return conv
celsius_para_kelvin(0)
def kelvin_para_fahr(temp):
       
    """
    Faz a conversão de temperatura Kelvin para Fharenheit.
    
    Exemplos:
    kelvin_para_fahr(373.15) => 212
    Quando a temperatura for 373.15 graus Kenvin, em Fharenheit será 212.

    """
    conv = (temp - 273.15)*1.8 + 32
    return conv
def celsius_para_fahr(temp):
     
    """
    Faz a conversão de temperatura Celsius para Fharenheit.
    Para tal, primeiro esta função calcula celsius para kelvin, e com esse resultado calcula kelvin para fharenheit.
    
    Exemplos:
    celcius_para_fahr(100) => 212
    Quando a temperatura for 100 graus Celsius, em Fharenheit será 212.

    """
    conv = celsius_para_kelvin(temp)
    conv = kelvin_para_fahr(conv)
    return conv<jupyter_output><empty_output><jupyter_text>As células abaixo imprimem as docstrings de cada uma das funções.<jupyter_code>help(celsius_para_kelvin)
help(kelvin_para_fahr)
help(celsius_para_fahr)<jupyter_output>Help on function celsius_para_fahr in module __main__:

celsius_para_fahr(temp)
    Faz a conversão de temperatura Celsius para Fharenheit.
    Para tal, primeiro esta função calcula celsius para kelvin, e com esse resultado calcula kelvin para fharenheit.
    
    Exemplos:
    celcius_para_fahr(100) => 212
    Quando a temperatura for 100 graus Celsius, em Fharenheit será 212.<jupyter_text>Programação defensiva  Tarefa - Checando os inputsCrie novamente a função `celsius_para_kelvin` (com a docstring definida acima). Dessa vez, utilize o comando `assert` para verificar se a temperatura permitida é maior ou igual ao 0 absoluto (0 Kelvin ou -273.15 Celsius). O `assert` deve vir antes do cálculo em si.<jupyter_code>def celsius_para_kelvin(temp):
    assert temp >= -273.15, "o valor em kelvin nao pode ser menor que zero"
    conv = temp + 273.15 
    return conv<jupyter_output><empty_output><jupyter_text>As células abaixo testam se as funções estão fazendo a coisa certa (falhando quando menor que zero absoluto e não falhando caso contrário).<jupyter_code>celsius_para_kelvin(-300)  # Deve gerar um AssertionError
celsius_para_kelvin(-273.15)  # Não deve falhar
celsius_para_kelvin(-273.16)  # Deve gerar um AssertionError<jupyter_output><empty_output><jupyter_text>Tarefa - Checando outputsUtilize comandos `assert` para verificar se a função `celsius_para_fahr` está retornando o valor correto para pelo menos **5 temperaturas diferentes**.Como exemplo, vou deixar pronto 1 dos testes (sim, esse conta como 1 dos 5):<jupyter_code>assert celsius_para_fahr(100) == 212
assert celsius_para_fahr(0) == 32
assert celsius_para_fahr(50) == 122
assert celsius_para_fahr(98) == 208.4
assert celsius_para_fahr(85) == 185<jupyter_output><empty_output><jupyter_text>Integrando tudo  Tarefa - Contas com matrizesCrie as funções abaixo:* `msoma`: recebe duas matrizes como entrada e retorna a soma dessas duas matrizes. Lembre-se que só é possível somar duas matrizes com o mesmo número de linhas e colunas.* `mmult`: recebe duas matrizes como entrada e retorna a multiplicação dessas matrizes. Lembre-se que só é possível multiplicar a matriz A por B se o número de colunas de A for igual ao número de linhas de B.* `vmult`: recebe uma matriz e um vetor como entrada e retorna a multiplicação da matriz pelo vetor.Todas as funções devem conter *docstrings* e `assert`s para conferir as entradas.**Dica**: Copie o código das aulas passadas.<jupyter_code>A = [[1, 2, 3], [4, 5, 6]]
B = [[7, 8, 9], [10, 11, 12]]
def msoma(A,B):             #definindo a função soma
    
    
    """
    Essa função soma duas matrizes.

    """

    
    N=len(A)                #definindo o numero de linhas 
    C=len(A[0])             #definindo o numero de colunas
    
    M=len(B)                #definindo o numero de linhas 
    F=len(B[0])             #definindo o numero de colunas
    
    nlin_a = N              #chamando todo N de numero de linhas e todo C de numero de colunas
    nlin_b = M
    ncol_a = C
    ncol_b = F
    
    assert nlin_a == nlin_b  #o numero de linhas da matriz a tem que ser igual ao numero de linhas de b
    assert ncol_a == ncol_b  #o numero de colunas de a tem que ser igual ao numero de colunas de b    
        
    D = []                                          #somando as matrizes A e B
    for i in range (N):
        linha=[]
        for j in range(C):
            linha.append((A[i][j]) + (B[i][j]))
        D.append(linha)
  

msoma(A,B) #para somar as matrizes
#celula vazia<jupyter_output><empty_output><jupyter_text>Utilize as células abaixo para criar comandos `assert` que testem se suas funções produzem o resultado esperado. Utilize a função `np.allclose` do [numpy](http://numpy.org/) para verificar duas matrizes ou vetores possuem valores próximos (praticamente iguais). Exemplo:    A = [[1, 2], [3, 4]]    B = [[1, 2], [3, 4]]    np.allclose(A, B) -> True        C = [[1.1, 2], [3, 4]]    np.allclose(A, C) -> False**Cada função deve ter pelo menos 4 testes**.Teste também se as suas funções falham quando a entrada é inadequada (dica: coloque esses casos cada um em uma célula).Como exemplo, deixo os primeiros testes prontos para vocês.<jupyter_code># Testa se msoma produz o resultado esperado
A = [[1, 2, 3], [4, 5, 6]]
B = [[7, 8, 9], [10, 11, 12]]
C = [[8, 10, 12], [14, 16, 18]]
assert np.allclose(msoma(A, B), C)
# Coloque abaixo os seus asserts

msoma([[1, 2, 3], [4, 5, 6]], [[1, 2], [1, 2]])  # Deve produzir um AssertionError
msoma([[1, 2, 3], [4, 5, 6]], [[1, 2, 3]])  # Deve produzir um AssertionError<jupyter_output>1  2  3  
4  5  6  

1  2  3
{'fraction_non_alphanumeric': 0.08596020567851553, 'fraction_numerical': 0.03454057679409792, 'mean_word_length': 3.820581896551724, 'pattern_counts': {'":': 0, '<': 47, '<?xml version=': 0, '>': 56, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '12', 'dir': 'jupyter-structured-clean-dedup', 'id': '306860', 'license': 'CC-BY-4.0', 'n_tokens_mistral': 3469, 'n_tokens_neox': 3213, 'n_words': 1048, 'path': 'funcoes.ipynb', 'repo_name': 'mat-esp-uerj/funcoes-camila_felipe_luiz', 'size': '8946'}