Functions
M ´etodos Computacionais em F´ısica I
Jos ´e Helder Lopes
Instituto de F´ısica
Universidade Federal do Rio de Janeiro
Aula Remota Semestre Especial 2020-2
baseado nas aulas remotas da Profa. Sandra Amato para o
Functions
Estrutura de um Programa
Estrutura dos programas feitos at ´e agora
Entrada de
Dados
Soluc¸ ˜ao do
Problema
Impress ˜ao
do Resultado
Algoritmo de
Leitura
Algoritmo p/
o Problema
Algoritmos p/
o Problema
Algoritmo de
Sa´ıda
Quando os programas se tornam mais complexos ´e necess ´ario dividir
o algoritmo em partes, que ser ˜ao tratadas separadamente.
Functions
Estrutura de um Programa
Estrutura dos programas feitos at ´e agora
Entrada de
Dados
Soluc¸ ˜ao do
Problema
Impress ˜ao
do Resultado
Algoritmo de
Leitura
Algoritmo p/
o Problema
Algoritmos p/
o Problema
Algoritmo de
Sa´ıda
Quando os programas se tornam mais complexos ´e necess ´ario dividir
o algoritmo em partes, que ser ˜ao tratadas separadamente.
Functions
Modularizac¸ ˜ao do Programa
Como modularizar?
1- Dividir um problema complexo em
v ´arios problemas simples
,
dividindo o programa em partes que realizem
tarefas espec´ıficas
e
razoavelmente independentes.
2- Identificar e usar soluc¸ ˜oes j ´a existentes.
3- Identificar tarefas espec´ıficas que ser ˜ao usadas
frequentemente
ao
longo do programa e desenvolver uma soluc¸ ˜ao gen ´erica para
execut ´a-la.
4- lembrando que o c ´odigo deve ser:
m
leg´ıvel – coment ´arios, nomes de vari ´aveis bem escolhidos
m
sucinto – Simples, sem c ´alculos desnecess ´arios
m
eficiente
Functions
Modularizac¸ ˜ao do Programa
Como modularizar?
1- Dividir um problema complexo em
v ´arios problemas simples
,
dividindo o programa em partes que realizem
tarefas espec´ıficas
e
razoavelmente independentes.
2- Identificar e usar soluc¸ ˜oes j ´a existentes.
3- Identificar tarefas espec´ıficas que ser ˜ao usadas
frequentemente
ao
longo do programa e desenvolver uma soluc¸ ˜ao gen ´erica para
execut ´a-la.
4- lembrando que o c ´odigo deve ser:
m
leg´ıvel – coment ´arios, nomes de vari ´aveis bem escolhidos
m
sucinto – Simples, sem c ´alculos desnecess ´arios
m
eficiente
Modularizac¸ ˜ao do Programa
Como modularizar?
1- Dividir um problema complexo em
v ´arios problemas simples
,
dividindo o programa em partes que realizem
tarefas espec´ıficas
e
razoavelmente independentes.
2- Identificar e usar soluc¸ ˜oes j ´a existentes.
3- Identificar tarefas espec´ıficas que ser ˜ao usadas
frequentemente
ao
longo do programa e desenvolver uma soluc¸ ˜ao gen ´erica para
execut ´a-la.
4- lembrando que o c ´odigo deve ser, em ordem de relev ˆancia:
m
correto!
m
leg´ıvel
m
sucinto
Functions
Vantagens desse procedimento
m
simplifica a elaborac¸ ˜ao e manutenc¸ ˜ao do c ´odigo (erros)
m
permite escrever func¸ ˜oes gen ´ericas (uso diversificado)
m
facilita o trabalho em equipe, com diferentes grupos trabalhando
em cada m ´odulo independentemente.
m
Os erros s ˜ao mais facilmente detetados
Vantagens desse procedimento
m
simplifica a elaborac¸ ˜ao e manutenc¸ ˜ao do c ´odigo (erros)
m
permite escrever func¸ ˜oes gen ´ericas (uso diversificado)
m
facilita o trabalho em equipe, com diferentes grupos trabalhando
em cada m ´odulo independentemente.
m
Os erros s ˜ao mais facilmente detetados
Functions
Functions
Ü functionem Python ´e um bloco de comandos (statements) que podem ser executados em qualquer parte do programa.
Ü Pode-se enviar vari ´aveis para a func¸ ˜ao, e a func¸ ˜ao pode tamb ´em retornar algum objeto para o programa
Ü J ´a utilizamos v ´arias func¸ ˜oes: cos(a), sqrt(x), print ("O valor de x ´e ", x), etc.
Ü Suponha que queiramos calcular o fatorial de um certo n ´umero n A f ´ormula ´e dada por
n! = n Y
k =1 k
Ü Se quisermos calcular 5!, poder´ıamos fazer no programa: n = 5
f = 1
for k in range(1, n+1):
f = f * k # ou f *= k print ("O fatorial de %d ´e %d" %(n,f))
Ü Ao final do loop o valor de f ´e 5! = 120
Ü Se no nosso programa vamos calcular o fatorial diversas vezes, ter´ıamos que repetir esse bloco de comandos, o que al ´em de ser trabalhoso, polui visualmente e aumenta a chance de erros
Ü Vamos definir uma func¸ ˜ao que pode ser chamada pelo programa. A sintaxe ´e:
Functions def fatorial(n): f = 1 for k in range(1, n+1): f *= k return f n = 5 fat = fatorial(n) print ("%d! ´e %d" %(n,fat)) fat = fatorial(n+2) print ("%d! ´e %d" %(n+2,fat))
Ü A definic¸ ˜ao dafunc¸ ˜aocomec¸a com def nome da func¸˜ao(arg1, arg2, ...): e termina na linha anterior ao primeiro comando que est ´a na primeira coluna (nesse caso return f)
Ü A func¸ ˜ao s ´o ´e executada quando for chamada
Ü Ela s ´o pode se chamada ap ´os ser definida.
Ü Ao chegar na chamada da func¸ ˜ao (fat = fatorial(n)), a execuc¸ ˜ao do programa pula para as linhas de comando
def fatorial(n):
enviando para a func¸ ˜ao o valor de n
Ü ao encontrar o comando return f, a execuc¸ ˜ao do programa volta para o ponto de onde parou e atribui o valor de f `a vari ´avel fat
Entender o fluxo do programa ´efundamental. Se estiver com dificuldade, coloque seu programa no sitevisualizador de fluxo
Functions
Ü Qualquer vari ´avel criada dentro da func¸ ˜ao (local) s ´o ´e conhecida pela func¸ ˜ao. Neste exemplo, o programa n ˜ao tem acesso `as vari ´aveis f e k.
Ü Mas o contr ´ario n ˜ao ocorre. Uma vari ´avel criada fora e antes da chamada da func¸ ˜ao, ´e uma vari ´avel global e pode ser acessada pela func¸ ˜ao.
Mas n ˜ao ´e uma boa pr ´atica usar vari ´aveis globais
Ü Se temos vari ´aveis com mesmo nome dentro e fora da func¸ ˜ao, a vari ´avel local ´e usada.
Ü Na chamada da func¸ ˜ao, a vari ´avel n ˜ao precisa ter o mesmo nome usado dentro da func¸ ˜ao:
def fatorial(n): f = 1 for k in range(1, n+1): f *= k return f m = 5 fat = fatorial(m) fat = fatorial(7)
Exerc´ıcio
O que ser ´a impresso no seguinte programa: def add(A,B): C = A + B return C a = 3 b = 2 print (add(a, b)) print (add(2*a, b+1)*3)
Functions
Func¸ ˜
oes com mais de um argumento
Dadas as coordenadas cil´ındricas (r , θ, z) de um ponto, queremos calcular sua dist ˆancia `a origem
from math import * def dist(r,theta,z): x = r * cos(theta) y = r * sin(theta) d = sqrt(x**2+y**2+z**2) return d D = dist(2, 0.1, -1.5) print (D) D = dist(r=2, theta=0.1, z=-1.5) print (D) D = dist(z=-1.5, theta=0.1, r=2) print (D) D = dist(2, theta=0.1, z=-1.5) print (D)
#D = dist(r=2, theta=0.1, -1.5) #N˜ao pode #print (D)
Ü Podemos usar quantos argumentos quisermos, de v ´arios tipos
Ü Na chamada, podemos
m Passar apenas os valores, nesse caso, a ordem deve ser respeitada
m melhor: passar com os nomes das vari ´aveis, assim fica mais claro e podemos passar em qualquer ordem
m se um deles n ˜ao tiver o nome, este(s) deve(m) estar no in´ıcio e na ordem correta
Func¸ ˜
oes que retornam v ´arios valores
Al ´em de retornar diversos tipos (int, float, complex, lists, array,...), as func¸ ˜oes podem retornar tamb ´em mais de um valor
Ex: func¸ ˜ao que transforma coordenadas polares em cartesianas
from math import cos, sin, pi def cartesian(r,theta): x = r * cos(theta) y = r * sin (theta) posicao = [x,y] return posicao c = cartesian(r=2,theta=pi/4) print (c) # c ´e uma list
Poder´ıamos fazer diretamente return [x,y]
Ou
return array([x,y]) Nesse caso c ´e do tipo array
Ou podemos retornar vari ´aveis separadas: from math import *
def cartesian(r,theta): x = r * cos(theta) y = r * sin (theta) return x,y x1, y1 = cartesian(r=2,theta=pi/4) print (x1, y1)
Functions
Func¸ ˜
oes que n ˜ao retornam nada
m Podemos ter func¸ ˜oes que n ˜ao retornam nada.
m Neste caso, n ˜ao precisam ter o comando return
m e na sua chamada, a func¸ ˜ao n ˜ao ´e atribu´ıda a nenhuma vari ´avel def saudacao(codigo): if codigo == 10 : print("Bom dia! ") if codigo == 20 : print("Boa noite! ") saudacao(10)
Func¸ ˜
oes com par ˆametros default
m Os argumentos de func¸ ˜oes podem ter valores pr ´e-definidos (default).
m Neste caso, se eles n ˜ao forem passados como argumento, o valor default ser ´a usado.
>>> def minhafuncao(a, b, keya = True, keyb = 0): ... print (a, b, keya, keyb)
... >>> minhafuncao("Oi", [1,2]) Oi [1, 2] True 0 >>> minhafuncao("Oi", [1,2], False) Oi [1, 2] False 0 >>> minhafuncao("Oi", [1,2], keyb = 20) Oi [1, 2] True 20
>>> minhafuncao("Oi", keyb = 20, b = 10, keya = 30 ) Oi 10 30 20
Functions
Exemplo de Func¸ ˜
oes com par ˆametros default
Considere a func¸ ˜ao f (t; A, a, w ) = A e−at sin(ωt)
Vamos implement ´a-la com A, a, w com par ˆametros default >>> from math import pi, exp, sin
>>> def f(t, A=1, a=1, omega=2*pi): ... return A*exp(-a*t)*sin(omega*t) ...
>>> v1 = f(0.2)
>>> v1 = f(1, A=5, omega=pi, a=pi**2) >>> v1 = f(A=5, a=2, t= 0.01, omega=0.1) >>> v1 = f(0.2, 0.5, 1, 1)
Func¸ ˜
oes podem chamar outras func¸ ˜
oes
Ex: Func¸ ˜ao que calcula a ´area da coroa circular formada pelos c´ırculos de raio r1e r2, com r1<r2
from math import pi def areac(r1):
#Calcula area do circulo return pi*r1**2
def coroa(r1,r2):
"""Calcula area da coroa formada pelos circulos de raio r1 e r2 com r1 < r2
""" if r1>r2:
print "r1 deve ser menor que r2" return 0
else:
return areac(r2)-areac(r1)
Functions
String de documentac¸ ˜ao
func¸ ˜ao definida em outro arquivo
Ü
E muito ´util saber quantos e quais os par ˆametros de uma func¸ ˜ao
´
(assinatura), sem ter que olhar o seu c ´odigo
Ü
Para documentar, logo abaixo do comando def colocamos
coment ´ario entre tr ˆes aspas, podendo usar v ´arias linhas
Ü
Para imprimir essa documentac¸ ˜ao fazemos
print(nomeDaFunc
¸ao. doc )
Ü
Experimente com a func¸ ˜ao cos(x) da biblioteca math:
>>> from math import *
>>> print(cos.__doc__)
Return the cosine of x (measured in radians).
Ü
E comum tamb ´em termos func¸ ˜oes definidas em algum outro
´
arquivo. Se, p.ex., a func¸ ˜ao line estiver definida dentro do
arquivo funcoes.py, para us ´a-la fazemos:
def line(x0, y0, x1, y1): """
Calcula os coeficientes a e b da reta y = a*x + b que passa
por dois pontos (x0,y0) and (x1,y1).
return: coeficientes a, b (floats) da reta (y=a*x+b). Exemplo: >>> a, b = line(1, -1, 4, 3) >>> a 1.3333333333333333 >>> b -2.333333333333333 """ a = (y1 - y0)/float(x1 - x0) b = y0 - a*x0 return a, b
>>> from funcoes import line >>> print (line.__doc__)
Functions
Vari ´aveis - mais detalhes
Ü Pode-se fazer mais de uma atribuic¸ ˜ao em uma s ´o linha: >>> a, b, c = 2, 4, 3
Ü tipos das vari ´aveis s ˜ao autom ´aticos, mas podemos forc¸ar um tipo: >>> c = 20 >>> type(c) <class ’int’> >>> c=float(20) >>> type(c) <class ’float’>
Ü Podemos criar uma vari ´avel com o mesmo tipo de outra, com valor nulo (ou vazio no caso de string)
>>> d = type(c)() >>> d
0.0
>>> type(d) <class ’float’>
Exerc´ıcios
Ü
Os pr ´oximos exerc´ıcios solicitam que seja criada uma
determinada func¸ ˜ao em Python.
Ü
Antes de comec¸ar a implementar fac¸a o algoritmo.
Ü
As func¸ ˜oes devem estar no arquivo chamado
<nomeDaFunc
¸ao>.py
(onde <nomeDaFunc
¸ao>.py
´e
espec´ıfico de cada exerc´ıcio) que ir ´a conter tamb ´em o programa
principal com a chamada para a func¸ ˜ao, de forma a test ´a-la.
Ü
A func¸ ˜ao deve ter a documentac¸ ˜ao explicando o que s ˜ao os
argumentos e o que ela retorna.
Functions
Exerc´ıcios
Escreva uma func¸ ˜ao chamada
1
volCilindro(h,r) que, dados a altura (h) e o raio (r ) do cilindro,
retorne o seu Volume = πr
2h
2
mediaPonderada(n1,n2,peso1=1,peso2=1) que, dados dois
n ´umeros n1 e n2, calcule a m ´edia ponderada com os respectivos
pesos.
3
escalar(x,y) que dados dois arrays retorne o produto escalar
entre eles. Compare com o resultado da func¸ ˜ao dot(x,y) da
numpy.
4
angulo (x,y) que dados dois vetores de 3 dimens ˜oes, retorne o
ˆangulo entre eles
5
primo(x) que dado um n ´umero x inteiro, positivo,
retorne True se x for primo ou False, caso contr ´ario
Exerc´ıcios
6 L(x, n) que retorne o valor da somaPn
i=11i
x 1+x
i
. Esta ´e uma aproximac¸ ˜ao da func¸ ˜ao ln(1+x) para x > 1. No programa principal, compare o resultado da sua func¸ ˜ao, com o da func¸ ˜ao log da biblioteca mathpara x = 5
7 roots(a,b,c) que retorne as duas ra´ızes da equac¸ ˜ao a x2+b x + c = 0.
Se ∆ > 0, o resultado deve ser do tipo float. Se ∆ < 0 o resultado deve ser do tipo complex. Sugest ˜ao: A func¸ ˜ao sqrt da biblioteca
numpy.lib.scimathcalcula ra´ızes complexas.
8 A func¸ ˜ao sum do python recebe uma lista e retorna a soma de seus
elementos. Implemente a sua vers ˜ao dessa func¸ ˜ao:mysum([x]). O
teste deve fornecer:
print(mysum([1, 2, 3])) 6
print(mysum(["Hello, ", "World!"])) Hello, World! print(mysum([[1,2],[4,3]])) [1, 2, 4, 3]