programação i / introdução à programação - capítulo 4...

26
Programação I / Introdução à Programação Capítulo 4, "Functions" João Pedro Pedroso 2019/2020

Upload: others

Post on 15-Nov-2019

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Programação I / Introdução à ProgramaçãoCapítulo 4, "Functions"

João Pedro Pedroso

2019/2020

Page 2: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Recordatórias

I Livro:https://buildmedia.readthedocs.org/media/pdf/howtothink/latest/howtothink.pdf

I Versão interativa:http://interactivepython.org/courselib/static/thinkcspy/index.html

I Codex dos anos anteriores (útil para praticar):https://codex.dcc.fc.up.pt/cc1015/

I Slides de aulas, folhas de exercícioshttp://www.dcc.fc.up.pt/~jpp/Prog1920

Page 3: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Utilização do Pyzo

Page 4: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,
Page 5: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,
Page 6: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Definição de funções/procedimentos

I Nas aulas passadas: vimos como usar os operadores e funçõesmatemáticas pré-definidas

I Nesta aula: vamos rever como definir novas funções(procedimentos)

I Podemos depois usá-los tal qual os pré-definidosI Programar: decompor um problema em funções cada vez mais

simples até chegar às operações elementares

N.B.: neste contexto, puristas de programação funcional muitasvezes preferem o termo procedimento a função, mas function é otermo habitual em Python.

Page 7: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Definição de novas funções

1 def <NAME>( <PARAMETERS> ):2 <STATEMENTS>

I o início e fim do bloco da função são marcados pela indentaçãoI a lista de parâmetros pode ser vazia

Page 8: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Exemplo:I A posição na vertical de um corpo que cai sem atrito, derivada

da segunda lei de Newton, é dada pela seguinte expressão:

y(t) = v0 t − 12g t2,

em que v0 é a velocidade inicial e g é a aceleração dagravidade (considere g = 9.8).

I Escreva uma função y(v0, t) que retorne a posição noinstante t de um corpo com velocidade inicial v0.

1 def y(v0, t):2 ’’’Posição de um corpo em queda.’’’3 g = 9.84 return v0 * t - 1 / 2 * g * t * t

I Como testar?

1 >>> y(1,2)2 -17.6

Page 9: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Exemplo:I A posição na vertical de um corpo que cai sem atrito, derivada

da segunda lei de Newton, é dada pela seguinte expressão:

y(t) = v0 t − 12g t2,

em que v0 é a velocidade inicial e g é a aceleração dagravidade (considere g = 9.8).

I Escreva uma função y(v0, t) que retorne a posição noinstante t de um corpo com velocidade inicial v0.

1 def y(v0, t):2 ’’’Posição de um corpo em queda.’’’3 g = 9.84 return v0 * t - 1 / 2 * g * t * t

I Como testar?

1 >>> y(1,2)2 -17.6

Page 10: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Documentação com docstringsI cadeia de carateres na 1ª linha de uma funçãoI texto descritivo sucintoI também associado a módulos, classes e métodos (mais tarde)I usado pelos interpretadores de Python: comando help,

pop-ups de informação (IDE)

1 def y(v0, t):2 ’’’Posição de um corpo em queda.’’’3 g = 9.84 return v0 * t - 1 / 2 * g * t * t

I Recordatória: Documentação com comentários:I começam por #, vão até ao final da linhaI colocados em qualquer parte de um programaI ignorados pelo interpretador, destinados aos programadoresI ao contrário, as docstrings estão disponíveis na execução:

1 >>> help(y)2 Help on function y in module __main__:3

4 y(v0, t)5 Posição de um corpo em queda.

Page 11: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Chamadas a funções

I Definição de função: diz ao Python como executar uma tarefa,mas não diz para a executar.

I Para a executar: chamar a função:I nome da função, seguido de valores → argumentosI o valor dos argumentos é atribuído aos parâmetros

1 def y(v0, t):2 ’’’Posição de um corpo em queda.’’’3 g = 9.84 return v0 * t - 1 / 2 * g * t * t

I dentro da função, parâmetros são tratados como outrasvariáveis

I o que acontece com esta chamada?

1 >>> y(1,2)2 -17.6

Page 12: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Vantagens da organização em funções

I Permitem esconder complexidadeI Correspondem a abstrações do problema realI Implementar funções permite evitar repetir código

I um só lugar para testar/corrigir erros

Page 13: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Fluxo da execução

I Ordem pela qual as instruções são executadasI Execução:

I começa na primeira linha do códigoI instruções são executadas uma a uma, de cima para baixo

I Definição de funções não altera o fluxo de execuçãoI instruções da função apenas serão executadas quando a função

for chamadaI nesse ponto, a execução passa para a linha da função

1 def y(v0, t):2 ’’’Posição de um corpo em queda.’’’3 g = 9.84 return v0 * t - 1 / 2 * g * t * t5

6 v_init = -17 time_elapsed = 3.58 position = y(v_init, time_elapsed)9 print("Position at time", time_elapsed, "is", position)

10 print("Initial position was", y(v_init, 0.))

Page 14: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Valores de retornoI Não é necessário que uma função retorne valores

I se não retornar → void functionI nesse caso, normalmente causa efeitos laterais:

I imprimir valoresI alterar valor de argumentos → a estudar mais tarde

1 def que_chatice(texto):2 print("vou repetir 100 vezes:")3 for _ in range(100):4 print(texto)5

6 que_chatice("a aula nunca mais acaba!")

I Para retornar vários valores → tuplos

1 def int_dec(v):2 units = int(v)3 decimal = v - units4 return (units, decimal)5

6 x = 4.257 (i,f) = int_dec(x)8 print(x, "is made of", i, "units and a decimal part", f)

Page 15: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Funções boolianas

I Funções cujo valor de retorno é boolianoI Convenientes para esconder testes complicados:

1 def is_divisible(x, y):2 if x % y == 0:3 return True4 else:5 return False

I Implementação equivalente:

1 def is_divisible(x, y):2 return x % y == 0

I Utilização:

1 if is_divisible(x, y):2 ... # Do something ...3 else:4 ... # Do something else ...

Page 16: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Âmbito de variáveis e parâmetros

I Parâmetros e variáveis criadas numa função só estão acessíveisdentro da funçãoI são locais

I Quando a função termina, as suas variáveis e parâmetros sãodestruídos

1 def final_amount(p, r, n, t):2 a = p * (1 + r/n) ** (n*t)3 return a

1 >>> a2 NameError: name ’a’ is not defined

Page 17: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Mais tartarugas: code refactoring

1 import turtle2

3 def make_window(color, title):4 window = turtle.Screen()5 window.bgcolor(color)6 window.title(title)7 return window8

9 def make_turtle(color, size):10 animal = turtle.Turtle()11 animal.color(color)12 animal.pensize(size)13 return animal14

15 wn = make_window("lightgreen", "Tess and Alex dancing")16 tess = make_turtle("hotpink", 5)17 alex = make_turtle("black", 1)18 dave = make_turtle("yellow", 2)

Page 18: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Modificadores e funções puras

I Modificadores:: funções cujos argumentos são alteradosdurante a sua execuçãoI efeitos laterais

I Funções puras: não têm efeitos laterais

Notas sobre o exemplo do livro, que se apresenta a seguir:I usa método append das listasI usa acesso a elementos de listas;

I lista x = [2, 5, 9, 4, 17]I x[0] → primeiro elemento de x → 2I x[1] → segundo elemento de x → 5I . . .

Page 19: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Função pura:

1 def double_stuff(values):2 new_list = []3 for value in values:4 new_elem = 2 * value5 new_list.append(new_elem)6 return new_list

Ao ser utilizada:

1 >>> things = [2, 5, 9]2 >>> more_things = double_stuff(things)3 >>> things4 [2, 5, 9]5 >>> more_things6 [4, 10, 18]

Page 20: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Modificador:

1 def double_stuff(values):2 """ Double the elements of values in-place. """3 n = len(values)4 for index in range(n):5 values[index] = 2 * values[index]

Ao ser utilizada:

1 >>> things = [2, 5, 9]2 >>> more_things = double_stuff(things)3 >>> things4 [4, 10, 18]5 >>> more_things6 None

Page 21: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Desvio: valor None

I Funções que não têm valor de retorno → retornam NoneI quando se escreve return sem nenhum valorI quando a função termina sem a instrução return

1 def f(x):2 # esta função não tem instrução return3 y = x**2

1 >>> y = f(2)2 >>> print(y)3 None

Page 22: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Recomendação:

I Funções puras são preferíveisI Modificadores: são úteis por questões de eficiência

I "only use modifiers when you are prepared to stick your headinto a lion’s mouth"

Page 23: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Guia de estilo para Python

https://www.python.org/dev/peps/pep-0008/

I indentação: 4 espaços (não usar tabs)I linha: limite de 78 carateres (na prática, a maior parte dos

programadores usa 99)I nomes:

I funções e variáveis: lowercase_with_underscoresI classes: CamelCase

I import’s no topo do ficheiroI definições de funções por baixo dos importI usar docstrings para documentar funçõesI duas linhas em branco para separar definições de funçõesI chamadas a funções e outras intruções do programa principal

no fim do ficheiro

Page 24: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Exemplo da última aula

1 import random2 import turtle3 scr = turtle.Screen()4 scr.bgcolor("black")5 t = turtle.Turtle()6 t.pensize(5)7 colors = ["pink", "blue", "yellow", "red", "green", "orange", "white"]8 for _ in range(25):9 x = random.randint(-300,300)

10 y = random.randint(-300,300)11 t.penup()12 t.goto(x,y)13 t.pendown()14 c = random.choice(colors)15 t.color(c)16 side = random.randint(10,100)17 reg_star(t, side, 5)18 scr.mainloop()

Page 25: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Próxima aulaI Tipos de dados do Python: strings

Page 26: Programação I / Introdução à Programação - Capítulo 4 ...jpp/Prog1920/teorica-08_functions.pdf · Maistartarugas: code refactoring 1 importturtle 2 3 defmake_window(color,

Próxima aulaI Funções