Programação de Computadoresotton/graduacao/programacao/12_Modulos_funcoes.pdf · Se os índices...

68
Programação de Computadores Instituto de Computação UFF Departamento de Ciência da Computação Otton Teixeira da Silveira Filho

Transcript of Programação de Computadoresotton/graduacao/programacao/12_Modulos_funcoes.pdf · Se os índices...

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

Funções do math

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

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

Vamos fazer uma versão com números aleatórios float

Exercício: Diagonal de uma matriz

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

Matriz triangular superior de uma matriz

.

.

.

for i in range(n):

for j in range(i+1, n):

.

.

.

Matriz triangular superior de uma matriz

Exercício

Modifique o programa anterior para que a entrada da matriz seja via teclado.

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

Funções

Vejamos alguns exemplos para entendermos algumas características das funções em 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!

Versão anterior

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

Versão com função

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()

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

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

Funções

Como vemos após a execução, os conteúdos dos identificadores não foram trocados

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

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

Funções

Funções

Façamos uma variação sobre este programa onde modificaremos uma das listas

Funções

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

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

Funções

Vejamos mais um exemplo onde passaremos como parâmetro não a lista mas o conteúdo da mesma

Funções

Funções

Neste caso não há mudança pois os elementos da lista são int, portanto, 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

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

Exercício

Faça uma função que extraia de uma matriz quadrada, lida no programa principal:

a diagonal, a matriz triangular inferior e a matriz triangular superior de A imprimindo estas matrizes no programa principal.