programação de computadoresotton/graduacao/programacao/12_modulos_funcoes.pdf · se os índices...
TRANSCRIPT
Programação de Computadores
Instituto de Computação UFFDepartamento de Ciência da Computação
Otton Teixeira da Silveira Filho
Conteúdo
● Módulos:
math
random
● Funções definidas pelo usuário
● Mais sobre notações abreviadas em Python
● Funções com parâmetros mutáveis e imutáveis
Módulos
Como já vimos, Python contém funções pré-definidas que correspondem em certo sentido a algumas funções matemáticas
Vejamos algumas funções que não são intrínsecas à linguagem mais carregadas usando os módulos
Módulos
Invocamos um módulo usando a palavra reservada import
● A importação do módulo pode ser de todo o módulo ou uma importação parcial, ou seja, de determinada função ou método no qual estamos interessados
● Podemos dar um “sinônimo“ para facilitar a digitação
Módulos
import nome_do_módulo – Importa todo o módulo citado
import nome_do_módulo as sinônimo – Importa todo o módulo citado dando uma sinonimia ao mesmo
Módulos
Já citamos os módulos math, numpy e scipy.
Aqui começaremos pelo math que contém uma série de funções matemáticas
Módulos
import math as m
.
.
.
Significa que estamos importando o módulo math dando como sinonimia m
Módulo math (parcial)
Vejamos algumas da funções do math
Nome Definição Argumento Tipo devolvido
sin(x) Seno Float em radianos float
asin(x) Arcosseno float float
cos(x) cosseno float em radianos float
acos(x) arcocosseno float float
tan(x) tangente float em radianos float
atan(x) arcotangente float float
exp(x) exponencial float float
log(x) logaritmo nepleriano float float
log10(X) logaritmo base 10 float float
fabs(x) valor absoluto float float
sqrt(x) raiz quadrada float float
Módulos
A sinominia faz o escrita ser mais concisa
Aqui usamos novamente a contrabarra, ou seja, o caracter \, para dar continuação de uma linha
Exercício: Diagonal de uma matriz
Dada uma matriz A nxn, crie uma matriz D que contém apenas a diagonal de A
Exercício: Diagonal de uma matriz
Observe que este programa é muito simples:
Se os índices da matriz A forem iguais, faça o conteúdo da matriz com estes índices seja atribuído à matriz D
Exercício: Diagonal de uma matriz
Para o preenchimento da matriz faremos uso de um módulo chamado random que contém métodos que geral números pseudoaleatórios
Exercício: Diagonal de uma matriz
Números aleatórios seriam, de uma forma simplificada, números numa sequência que não teriam nenhuma relação entre si.
Geradores de números aleatórios elaborados com um algoritmo não existem mas existem vários algoritmos que geram números que estatisticamente considerados bons o suficiente chamados de pseudoaleatórios
Exercício: Diagonal de uma matriz
O método randint(a, b) gera números aleatórios do tipo int no intervalo [a, b]
Exercício: Diagonal de uma matriz
O método random() gera números aleatórios do tipo float no intervalo [0, 1)
Diagonal de uma matriz
Observe que escrevemos esta versão de forma mais concisa. Lembre-se que o mais importante é a legibilidade do código e nem sempre versões como esta são aconselháveis
Matriz triangular superior de uma matriz
Dada uma matriz A nxn, imprima a matriz triangular estritamente superior de A.
Decomposição aditiva de uma matriz
Exemplifiquemos com uma matriz 4x4
D é a diagonal de A, L é a matriz triangular estritamente inferior de A e U a matriz triangular estritamente superior de A
(3 −4 8 51 4 6 9
−4 1 −4 37 2 8 1
)⇒D=(3 0 0 00 4 0 00 0 −4 00 0 0 1
) ; L=(0 0 0 01 0 0 0
−4 1 0 07 2 8 0
) ;U=(0 −4 8 50 0 6 90 0 0 30 0 0 0
)
Matriz triangular superior de uma matriz
Observe que a primeira linha (índice da linha igual a 0) da matriz estritamente superior de A o índice da coluna irá de 1 até n, na segunda linha (índice de linha igual a 1) o índice da coluna irá de 2 até n, até que na n-ésima menos um linha terá somente a componente n.
● A última linha só tem componentes nulos
● Isto sugere o fragmento de código que se segue para termos o solicitado pelo problema
Funções
E quando não houver uma função de seu interesse na biblioteca de funções?
Phyton, assim como todas a linguagens, permite que você crie suas próprias funções.
Isto se justifica por:
● Funções de uso específico
● Tornar o código mais fácil de ler
● Evitar repetições desnecessárias no código
Funções
Uma função em Python tem a seguinte estrutura
def nome_da_função(par1, par2, …, parn): “““Cadeia de caracteres para documentação””” Comandos return
● nome_da_função é um identificador válido
● par1, …, parn são os parâmetros da função
● return é o que a função retorna intencionalmente. É opcional
● se uma função não tem return ela retorna None
Funções
● Podem haver vários return
● Quando chegar ao return ou ao fim da função, o processamento retornará à função que a evocou
None, lembre-se, é uma palavra reservada
O valor retornado pela função é qualquer tipo válido em Python
Funções
Lembre como estão sendo
escritos os programas aqui:
main() também é uma função,
a função principal
Funções
Podemos declarar quantas funções forem necessárias
Trabalharemos com o uso de funções usando o paradigma imperativo do Python
Cálculo de e, base dos logaritmos neplerianos
Calcule o valor da função exponencial no ponto x=1 usando a série de Taylor truncada em n termos que é dada por
e x
=1+x1!
+x2
2!+
x3
3 !+⋯+
xn
n!
Cálculo de e, base dos logaritmos neplerianos
Calcule o valor da função exponencial no ponto x=1 usando a série de Taylor truncada em n termos que é dada por
Lembre-se que já trabalhamos este problema anteriormente
e x=1+
x1!
+x2
2!+
x3
3 !+⋯+
xn
n!
Cálculo de e, base dos logaritmos neplerianos
Embora este programa funcione bem, observemos que a legibilidade dele é prejudicada por calcularmos a soma que resulta no valor da série e o fatorial de n simultaneamente
Versão com função
Vamos criar um programa onde o fatorial seja calculado usando uma função que calcula o fatorial de forma autônoma
E vamos continuar nossa visita a nosso passado recente
Fatorial: fluxograma e pseudocódigo
programa fatorial
inteiro fat, i, n
leia n
fat ←1
para i ← 2 até n
fat ←fat * i
fim parafim para
imprima fatimprima fat
fimfim
i ← 2até n
fat ← fat * i
início
fat←1
fat
fim
n
Cálculo de e, base dos logaritmos neplerianos
Os programas com e sem função são funcionalmente idênticos, ou seja, geram o mesmo resultado mas observe que a versão com função é mais legível
Cálculo de exponencial()
Vamos agora criar uma função que nos dá o valor da função exponencial pelo uso de uma função que passe como parâmetros o valor de x no qual a exponencial será calculada e o número de termos da série, n
Cálculo de exponencial()
No programa anterior fizemos uso da função pow(x, n) que calcula a enésima potência de um argumento x e que faz parte do módulo math
Funções
Vamos a um exemplo de função de filtragem de valores que imprime um aviso, não tem return e nem solicita parâmetros
Funções
Vamos partir para alguns exemplos simples de funções para que entendamos algumas particularidades tanto sobre funções quanto sobre tipos em Python
Funções
Elaboraremos alguns programas em torno da ideia de trocar os valores de duas “variáveis” dadas
Funções
Como vemos após a execução, os conteúdos dos identificadores não foram trocados
Lembre-se que o tipo que estamos aqui usando são cadeias de caracteres que são imutáveis
Funções
Como vemos após a execução, os conteúdos dos identificadores não foram trocados
Lembre-se que o tipo que estamos aqui usando são cadeias de caracteres que são imutáveis
Mudemos algo no programa
Funções
Aqui fazemos com que a função troque() devolva dois valores que são atribuídos usando uma das formas sintéticas de atribuição que o Python permite
Aqui conseguimos nosso objetivo porque criamos tipos (melhor seria dizer objetos) também imutáveis
Funções
Agora trabalharemos com um tipo mutável: a lista.
O programa que se segue usaremos uma função para somar os conteúdos de duas listas de int de mesmo comprimento
Abreviações em Python
No exemplo anterior apresentamos uma forma abreviada de fazer determinadas atribuições comuns quando se programa. Abaixo temos mais algumas formas abreviadas de atribuição
● a += b é equivalente a a = a + b
● a -= b é equivalente a a = a – b
● a *= b é equivalente a a = a * b
● a /= b é equivalente a a = a / b
● a //= b é equivalente a a = a // b
Funções
Vamos agora trabalhar com os aspectos de mutabilidade das listas.
Diferente dos tipos int, float, bool e cadeia de caracteres, lista são mutáveis
Funções
Neste caso temos algo curioso. A função iguala() não tem return portanto, retorna None. No entanto, o valor da primeira lista dada como parâmetro é alterado.
Isto ocorre porque a lista é um tipo mutável, o que não ocorre com a função troque(), cujos os parâmetros são cadeias de caracteres sendo estas últimas imutáveis
Falando sobre “variáveis“ em Python
Apresentaremos uma especificidade de Python com respeito à “variáveis” (agora ficará mais fácil de entender que é melhor falar de objeto).
Observe o próximo programa
Falando sobre “variáveis“ em Python
Ao executarmos este programa vemos que tanto o conteúdo de n quanto de m foram alterados
A questão é que para Python estamos falando do mesmo dado, ou seja, tanto n quanto m são identificadores da mesma informação, ou seja, os diferentes identificadores apontam para o mesmo objeto.
Tenha cuidado quando você usar linguagens não orientadas a objetos onde identificadores diferentes apontam para informações diferentes