Você está na página 1de 165

Programação aplicada a

engenharia

Prof:Me Paulo Sérgio Zanin Júnior

1
Instalação
• Windows
• Linux
• macOS
 Anaconda

Juízes Online
• DMOJ (https://dmoj.ca/)
• TIMUS
• USACO

2
Formato de aula – Parte 1
• Livro: ZINGARO, D. Learn to Code by Solving Problems:
A Python Programming Primer. No starch press.
• Resolver problemas e aprender as estruturas em python
• Atividades:
– Problemas do DMOJ (N1);
– Seminário resolvendo um problema prático utilizando
Python (acadêmico ou professional) (N2)
– Prova (N3)

3
Atividade: Problemas DMOJ (N1)

4
Atividade: Seminários (N2)
O trabalho consiste em desenvolver um código em python para resolver um
problema real do seu dia a dia de trabalho ou de sua área de estudo acadêmico.
Ex: cálculo de curto-circuito automatizado (Exemplo do professor),
organização e filtro de dados (Exemplo do professor), registro de informações
automatizado em website (Exemplo do professor), simulador de circuitos RLC
no domínio do tempo ou no domínio da frequência, problema do caixeiro
viajante por método XXXX, etc. O trabalho deverá contar com:
1. Apresentação oral, com explicação do problema, que metodologia foi
utilizada em python para sua solução e demonstração do código para a
turma;
2. Relatório escrito alinhado à apresentação oral, com maior detalhamento.
3. Códigos em python;

5
Introdução geral sobre linguagem
python
• Data de 1991, lançada por Guido van Rossum, na
Holanda
• Sem ;  Opcional (facilidade de leitura)
• Sem delimitadores {}  Linguagem Identada
• Desafio: FIBONACCI

6
Introdução geral sobre linguagem
python

• Linguagem de propósito geral;


• Organizada em scripts;
• Pode ser utilizada em desenvolvimento;
• Permite diferentes estilos de programação;
• Muito utilizada para ciência de dados e automatização
de tarefas

7
Introdução geral sobre linguagem
python

• Multiplataforma
• Portabilidade
• Livre
• Extensibilidade
• OO*
• Tipagem automática e forte
• Legibilidade
• Arquivos
• Uso interativo
8
Introdução geral sobre linguagem
python

• Exemplos práticos:

• Cálculo de curto-circuito futuro automatizado em


média tensão;

• Análise de dados de faturamento;

• Registro de dados web

9
Introdução geral sobre linguagem
python

• Bibliotecas (pip install xxx)

• Numpy

• Pandas

• Ploty

• Selenium
10
Python História

Final dos anos 1970: linguagem de programação chamada ABC


Alto nível, destinado ao ensino
Apenas cinco tipos de dados
Os programas são supostamente um quarto do tamanho do
programa equivalente BASIC ou Pascal
Não é um projeto bem-sucedido
Mais informações do ABC:
► http://homepages.cwi.nl/~steven/abc/
Python História...

1983: Guido van Rossum juntou-se à equipe do ABC


Final dos anos 1980: Guido precisava de uma linguagem para um
projeto diferente; com base no ABC, removeu problemas (por
exemplo, ABC não era extensível)
Python, depois do Monty Python
Guido: Ditador Benevolente pela Vida (DBPV)... mas ele está se
aposentando!
► http://www.artima.com/intv/ (procure por Guido)
O que é um algoritmo?

Quatro características de um algoritmo:


Número finito de instruções ou etapas
Cada instrução é bem definida (não ambígua)
Eventualmente para
Resolve uma classe geral de problemas

Programação é como dizemos ao


computador qual algoritmo ele deve
executar.
Teste de Conceito

Passo 1: anote o número 0


Passo 2: adicionar 3
Passo 3: retornar à etapa 1
Isso é um algoritmo?
A. Sim
B. Não, porque contém um número infinito de passos
C. Não, porque nunca para
► D. Não, porque o passo 3 não está bem definido
Python como Calculadora

A maneira mais fácil de experimentar o Python é inserir


instruções no shell do Python
Python suporta muitos operadores matemáticos comuns
Os operadores incluem + (adição), - (subtração), *
(multiplicação), ** (exponenciação), / (divisão), %
(restante)
► por exemplo, 11+56 dá 67
Python como Calculadora...

Use parênteses para alterar a precedência (por exemplo, 4 +


5*3
em comparação com (4 + 5) * 3
Existem dois operadores de divisão
/: divisão exata
: divisão inteira
► por exemplo, comparar 5 / 2 e 5 // 2
Teste de conceito

Qual a diferença entre 1 e 1.0?


A. Nada. Ambos são 1
B. Nada. Eles podem ser de diferentes tipos, mas os tipos
não importam na programação
C. 1 é um inteiro e 1.0 é uma cadeia de caracteres, por
causa do caracter.
D. 1 é um inteiro e 1.0 é um número de ponto flutuante
E. 1.0 é um inteiro e 1 é um número de ponto flutuante
Verificando e alterando tipos
Python tem uma função útil chamada type que informa o tipo
do argumento.
type (1)
type (1.0)
type ("1")
type ("1.0")

Às vezes, você terá um valor de um tipo e deseja convertê-lo em


outro tipo:
int (value): convert to int
float (value): convert to float
Variáveis
Uma variável é um nome que se refere a um valor
As variáveis nos permitem armazenar valores ("lembrar") para
que possamos usá-los em vários lugares
De certa forma, as variáveis na programação são como
variáveis matemáticas
por exemplo, em matemática, você poderia dizer "deixe x = 5"
Então, qual o valor de x ∗ 3?
Mas, eles também são diferentes
Por exemplo, em matemática, os valores das variáveis não
podem mudar uma vez que recebem um valor
► Na programação, podemos alterar uma variável quantas
vezes quisermos
Declaração de Atribuição

► A instrução de atribuição nos permite dar um valor a uma variável


► Forms: variable = expression
► Dois passos:
► Avalie a expressão no lado direito para obter um resultado
► Faça com que a variável do lado esquerdo se refira a esse resultado
Teste de conceito
Qual o valor de y após a execução deste código?

x = 37
y = x +
2 x =
20

► A. 39
► B. 22
► C. 35
► D. 20
► E. 18
Teste de conceito
Qual o valor de y após a execução deste código?

x = 37
y = x -
2 x =
20

► A. 39
► B. 22
► C. 35
► D. 20
► E. 18
Strings

• Strings são representadas entre ‘’ (logo strings não podem


conter ‘)

• Operações com strings: +, *

• Métodos com
strings: .upper(), .strip(), .strip(‘a’), .count(), .count(‘a’)

23
Strings
Usamos strings ao chamar a print e a input
Uma string é uma sequência de caracteres
Para indicar que algo é uma cadeia de caracteres, colocamos aspas
simples ou duplas em torno dela
►Use + para concatenação de cadeia de caracteres, * para
repetição de cadeia de caracteres
► Estes são exemplos de operadores sobrecarregados,
uma vez que funcionam de forma diferente dependendo do tipo
de operandos
►O que acontece se tentarmos usar + com uma cadeia de
caracteres e um número?
► Erro: + não sabe o que fazer!
► por exemplo, '3' + 4 deve ser a string '34' ou o número
7?

24
Strings

Qual é o valor de s depois de rodar o seguinte código?


s = ’abc’
s = ’d’ * 3 + s
s = s + ’’ * 3
s = s + ’q’

►A. "abcddd q"


►B. "abcddd’’’’’’q"
►C. "abcdddq"
►D. "qdddabc"
►E. "dddabcq"

25
Strings

Em Python, podemos fazer um loop sobre qualquer tipo


de dado que seja uma sequência
Uma cadeia de caracteres é uma sequência de caracteres
►O padrão para looping através de uma cadeia de
caracteres é o seguinte
for char in s:
<do something, using char>

►A variável de loop no exemplo acima é char; ele


"atravessa" cada caractere na string s

26
Strings
Qual é o valor de val depois de executar este código?

val = 0
for i in ’ab’:
for j in ’cd’:
val += 1

► A. 1
► B. 2
► C. 4
► D. 8
► E. 16
Strings
Qual é o valor de val depois de executar este código?

val = 0
for i in ’abc’:
for j in ’cde’:
val += 1

► A. 1
► B. 3
► C. 6
► D. 9
► E. 27
Strings
►Como uma string é uma sequência, podemos usar a
notação de índice Python para extrair seus caracteres
►Assuma s é uma string
►Então, s[i] para i ≥ 0 extrai o caractere i da
esquerda
►Tenha cuidado: o primeiro caractere de uma cadeia
de caracteres tem índice 0, não 1!
►Também podemos usar um índice negativo i para
extrair um caractere que começa da direita
►e.g. se s = "abcde", então
► s[0] é a
► s[1] é b
► s[-1] é e
► s[-3] é c
Strings

►A sintaxe Python nos permite extrair um segmento – slice – de


caracteres de uma cadeia de caracteres
►s[i:j] extrai caracteres começando em s[i] e terminando em, mas não
incluindo s[j]
►Se deixarmos de fora o primeiro índice, o Python usará o índice 0 como
padrão para iniciar o slice
►Da mesma forma, se deixarmos de fora o segundo índice, o Python usa
como padrão o índice len(s) para encerrar o slice
►s[:] portanto, nos dá uma cópia de toda a cadeia de caracteres
►Podemos usar índices negativos na sintaxe do slice também
Strings

Qual é a saída do código a seguir?

game = ’Lost Vikings’


print(game[5:-1])

►A. kings
►B. king
►C. Viking
►D. Vikings
►E. ikings
Strings

Qual é a saída do código a seguir?

game = ’Lost Vikings’


print(game[2:-6])

►A. st V
►B. ost V
►C. iking
►D. st Vi
►E. Viking
Strings

Qual é a saída do código a seguir?

game = ’Lost Vikings’


print(game[-6:11])

►A. st V
►B. ost V
►C. iking
►D. st Vi
►E. Viking
Strings
►Método: uma função específica para um tipo de objeto
►Os métodos são chamados usando a sintaxe object.method

s = "Hi CSC108!"
s.lower()
lower(s) # wrong!

Use dir(str) para obter uma lista de métodos de cadeia de caracteres


Use help(str.x) para obter ajuda sobre o nome do método x
S.find(substring): retorna o índice da primeira ocorrência de substring em S a partir da esquerda,
ou −1 se substring não for encontrada
S.replace(antigo, novo): retorna s mas com todas as ocorrências de antigo substituído por novo
S.count(substring): retorna o número de vezes
substring ocorre em S
S.startswith(substring): retorna True exatamente quando S começa com substring
► S.endswith(substring): retorna True exatamente quando S termina com substring
Strings

Qual é a saída desse código?


s = ’Mississauga’
t = len(s.replace(’ss’, ’a’))
print(t)

► A. 11
► B. ss
► C. 10
► D. Miaaiaaauga’
► E. n.d.a.
Strings
Os objetos de cadeia de caracteres são
imutáveis: significa que "não pode mudar"
Os métodos que "parecem" que estão alterando
a = a =
uma cadeia de caracteres estão, na verdade, ’hi’ ’hi’
criando um novo objeto de cadeia de caracteres b = a b = a

► Abaixo, a cadeia de caracteres referenciada


a b a b
por s não é modificada; uma nova cadeia de
caracteres é criada, mas imediatamente
perdida (já que não é referida por uma "hi" "hi"
variável)
► s = "test" a = a =
► s.upper() ’bye’ a.upper()
► print(s) b a b a

s "TEST" "hi" "bye" "hi" "HI"

"test"
Operações com números
• Inteiros e float – Operações: +,-,*,/,// (divisão inteira), %
(resto), ** (exponenciação)

• Variáveis: declaração e valor: =

• Entrada: input()

• Exibir: print()

• Constantes (ex: pi)

• Converter em inteiros/float: int(), float()


37
Condicional
• Booleano (bool): True / False

• Relacionais: >,<, >=, <=, == (igualdade), != (desigualdade), in


(contém)

• Relacionais podem ser usados em strings (verifica ordem


alfabética), mas cuidado com números armazenados como
strings e strings com letras maiúsculas

38
Condicional
• Condicional SE: if CONDITION:

• Identação

• Condicional SENÃO: elif CONDIÇÃO: ou else:

• Operadores booleanos: or, and, not, in

39
Operadores relacionais

Lembre-se: = é o operador de atribuição Python


É um comando para avaliar o lado direito e fazer
com que a variável à esquerda se refira a esse
resultado
Em matemática (não Python!), = é uma afirmação
de que duas expressões são iguais
== é o operador Python que testa a igualdade
Outros operadores relacionais: > >= < <= != (o
último significa "não igual")
► Eles retornam valores bool (booleano)
40
Operadores relacionais

Qual é a saída do código a seguir?

a=3
b = (a != 3)
print(b)

A. Verdadeiro
B. Falso
C 3º
►D. Erro de sintaxe

41
Operadores relacionais

Qual é a saída do código a seguir?

a=3
b = (a == 3)
print(b)

A. Verdadeiro
B. Falso
C 3º
►D. Erro de sintaxe

42
Operadores relacionais

►Os operadores lógicos tomam um(not) ou dois(and, or) bools e


devolver um bool
►Uma expressão envolvendo not Produz True se o valor original
forFalse, e False se o valor original forTrue
►And Produz True exatamente quando ambos os seus operandos são
True
►or produz True exatamente quando pelo menos um de seus
operandos é True

43
Operadores relacionais

Gostaria de uma expressão que avalie como Verdadeiro


exatamente quando pelo menos uma das duas condições
a seguir for verdadeira: (1) a e b são iguais, (2) quando a
tem valor 5. Qual dessas expressões faz isso?

A. a == b == 5
B. a == b or a == 5
C. a == b and a == 5
D. a == (b == 5)

44
Operadores relacionais

Qual é o valor da expressão na parte inferior


do código? (Lembre-se que não tem a maior
precedência, então e, então ou.)
a = True b = False c = True
not a and b or c

►A. True
►B. False

45
If e If-Else
Para fazer algo se uma condição for verdadeira e nada se a
condição for falsa:
i f <condição>:
<Sequência dos instruções>

Para fazer algo se uma condição for verdadeira e outra coisa se


essa condição for falsa:

i f <condição>:
<Sequência dos instruções2>
Else:
<Sequência dos instruções2>
Teste
Qual é o valor de x após a execução desse código?
x=5
i f x > 2:
x = -3
x=1
else:
x = 3
x = 2

► A. −3
► B. 1
► C. 2
► D. 3
► E. 5
Teste
Qual é o valor de x após a execução desse código?

x=1
i f x > 2:
x = -3
x=1
else:
x = 3
x = 2

► A. −3
► B. 1
► C. 2
► D. 3
► E. 5
Multi-Way Ifs
i f <condição-1>:
<Instruções1> e l i f
<condition-2>:
<Instruções2>
elif . . .
...
els
e:
<
Ins
tru
çõ
es-
n>
P
ens
e
nis
so
Teste
i f temperature > 0 :
p ri n t ("ab o v e f r e e z i n g " )
e l i f temperature == 0 :
print("at freezing")
else:
p r i n t ("b el o w
freezing")

O código abaixo faz exatamente a mesma coisa que o código


acima? (Suponha que a temperatura já se refere a algum valor
numérico.)
i f temperature > 0 : p r i n t ( "ab o v e f r e e z i n g " )
e l i f temperature == 0 :
print("at freezing")
e l i f temperature < 0 : A. Sim
p r i n t ("b el o w B. Não
freezing")
Teste
i f temperature > 0 :
p ri n t ("ab o v e f r e e z i n g " )
e l i f temperature == 0 :
print("at freezing")
else:
p r i n t ("b el o w
freezing")

O código abaixo faz


exatamente a mesma
coisa que o código
acima?

i f temperature > 0 :
p ri n t ("ab o v e
freezing") A. Sim
e l i f temperature == 0 :
B. Não
print("at freezing")
Teste
i f temperature > 0 :
p ri n t ( "ab o v e f r e e z i n g " )
e l i f temperature == 0 :
print("at freezing")
else:
p ri n t ("b el o w
freezing")

O código abaixo faz


exatamente a mesma
coisa que o código
acima?
i f temperature == 0 :

print("at freezing")
e l i f temperature <= 0 : A. Sim
p ri n t ( "b el o w f r e e z i n g " ) B. Não
else:
Teste
x=5
i f x < 15:
i f x > 8:
print(’on
e’)
else:
print(’two’)
else:
print(’thr
ee’)

Qual é a
saída?
A. one
B. two
C. t h r e e
D. Mais de
Ifs aninhados

s = i n p u t ( " E n t e r PH v a l u e : " )
i f len(s) > 0:
ph = f l o a t ( s )
i f ph < 7 . 0 :
print(ph,
"is
acidic.")
e l i f ph > 7 . 0 :
print(ph, "is basic.")
else:
print(ph, "is
neutral.")
else:
print("No pH value was
given!")
Loops
Até agora, sabemos sobre um tipo de loop: for
Ele requer uma sequência (por exemplo, uma
sequência de intervalo ou uma sequência de
caracteres) para iterar
Outro tipo de loop é o loop while: ele testa
repetidamente uma condição, executando todo o
corpo do loop se for True, e terminando o loop se for
False
Útil quando não há sequência
►Comumente usado quando não sabemos quantas
55
Loops
•Quantas vezes esse loop será executado? Nós não
sabemos – então é um while loop!
• while response != ’y’ and response != ’n’:
• response = input(’Type y or n to continue: ’)
O que é impresso pelo código a seguir? (A saída está em uma linha para
economizar espaço.)
x = 6
while x > 4:
print(x)
x = x - 1

►A. 6 5
►B. 6 5 4
►C. 5 4
►D. 5 4 3
56
►E. 6 5 4 3
Loops
Use for quando:
* Você deseja percorrer uma sequência inteira sem parar
* O número de iterações não depende da entrada do
usuário
*O incremento para a variável de loop é o mesmo em
cada iteração
s = ’abc’
for count in range(len(s)):
print(’Index {0} is {1}’.format(count, s[count]))

count = 0
while count < len(s):
print(’Index {0} is {1}’.format(count, s[count]))
count += 1

57
Loops
valid = False
while not valid:
s = input ("Enter a password: ")
valid = len(s) == 5 and s[:2] == ’xy’

Which of the following passwords gets us out of the loop?


►A. xyz
►B. abcxy
►C. xyabc
►D. More than one of the above passwords get us out of the loop
►E. None; the loop never executes and no passwords are obtained

58
Loops
Há várias maneiras de escrever um loop cujo corpo é necessário
para executar pelo menos uma vez
Tornar artificialmente a condição verdadeira antes
que o loop comece (como
inputloop.py)
Copie algum código de loop acima do loop para
tornar a condição verdadeira
Use True como condição e break para sair do loop
break causa o término imediato do loop
►break pode dificultar a leitura do código se usado
incorretamente

59
Loops
Uma senha válida é aquela que tem comprimento 5 e
começa com xy. Essas senhas devem nos tirar do
loop. Qual deles faz isso?
A.
while True:
s = input ("Enter a password: ")
if len(s) == 5 and s[:2] == ’xy’:
break

►B.
s = input ("Enter a password: ")
while len(s) == 5 and s[:2] == ’xy’:
s = input ("Enter a password: ")
►C. A e B certas
►D. NDA
60
Loops
Qual é a saída desse código? (A
saída está em uma linha aqui para
economizar espaço.)
n = 3
while n > 0:
if n ==
5:
n = -99
print(n) n
= n + 1

►A. 3 4
►B. 3 4
5
►C. 3 4
-99
►D. 3 4
5 -99 61
Listas
● Suponha que desejamos guardar notas de alunos.
● Com o que sabemos, como armazenarıamos 3 notas?

nota1 = float(input("Entre com a nota 1: "))


nota2 = float(input("Entre com a nota 2: "))
nota3 = float(input("Entre com a nota 3: "))

62
Listas
● Com o que sabemos, como armazenarıamos 130 notas?

nota1 = float(input("Entre com a nota 1: "))


nota2 = float(input("Entre com a nota 2: "))
nota3 = float(input("Entre com a nota 3: "))
nota4 = float(input("Entre com a nota 4: "))
nota5 = float(input("Entre com a nota 5: "))

nota130 = float(input("Entre com a nota 130: "))

● Criar 130 variáveis distintas não é uma solução elegante.

63
Listas
● Uma lista em Python é uma estrutura que armazena vários dados, que
podem ser de um mesmo tipo ou não.

● Uma lista é criada como a construção: [dado1,dado2,...,dadon]

● Listas são construções de linguagens de programação que servem para


armazenar vários dados de forma simplificada.

lista1 = [10, 20, 30, 40]


= ["programação", "mc102", "python"]
lista2
lista3 = ["oi", 2.0, 5, [10, 20]]

64
Listas
● Coleção de valores referenciados por um identificador único.

identificador = [dado1,dado2,...,dadon]

notas = [8.0, 5.5, 9.3, 7.6, 3.1]

● Caracterısticas:
○ Acesso por meio de um ındice inteiro.
○ Listas podem ser modificadas.
○ Pode-se incluir e remover itens de listas.

65
Listas
● Lista de inteiros:

x = [2, 45, 12, 9, -2]

● Listas podem conter dados de tipos diferentes:


x = [2,"qwerty" ,45.99087, 0, "a"]

● Listas podem conter outras listas:


x = [2, [4,5], [9]]

● Ou podem não conter nada. Neste caso [] indica a lista vazia.

66
Listas
Uma lista é uma sequência, como uma string . No
entanto, em comparação com as strings :
Os elementos da lista podem ser de qualquer tipo;
Os elementos de uma string são apenas caracteres;
As listas são mutáveis; strings são imutáveis
As listas podem ser heterogêneas (elementos dentro
da mesma lista podem ter tipos diferentes)
•As listas podem ser aninhadas em outras listas

67
Listas
Alguns métodos estão disponíveis para listas e
strings:

len: comprimento de uma lista (ou seja, número de


elementos)
min, max: mínimo ou máximo da lista
sum: soma dos elementos da lista
►(Exceto pela soma, eles também funcionam em cadeias
de caracteres.)

68
Listas
•lst = [’abc’, ’def ’, ’ghi’]
•lst[1] = ’wxyz’
•print(len(lst))

Qual é a saída desse código?


A. 3
B. 9
C. 10
D. 4
E. Sem saída; há um erro na segunda
69
linha
Listas
● Pode-se acessar uma determinada posição da lista utilizando-se um
ındice de valor inteiro.
● A sintaxe para acesso de uma determinada posição é:
○ identificador[posição]
● Sendo n o tamanho da lista, os ındices válidos para ela vão de 0 até n
− 1.
○ A primeira posição da lista tem ındice 0.
○ A última posição da lista tem ındice n − 1.

70
Listas
Lista notas : tamanho n = 5, ou seja, os ındices válidos são de 0 até 4 (5 − 1).

notas = [8.0, 5.5, 9.3, 7.6,


3.1]
print(notas[0]) A primeira posição da lista tem
ındice 0
print(notas[1])
A última posição da lista tem
print(notas[2])
8.0 ındice n − 1
5.5
print(notas[3])
9.3
7.6
print(notas[4])
3.1

71
Listas
● Um elemento de uma lista em uma posição especıfica tem o mesmo
comportamento que uma variável simples.

notas = [8.0, 5.5, 9.3, 7.6, 3.1]

print(notas[0]+2)
10.0

notas[3] = 0.5

print(notas)
[8.0, 5.5, 9.3,
0.5, 3.1]

72
Listas

•A sintaxe para fazer um loop através de todos os


elementos em uma lista é a mesma que para fazer um
loop através de uma cadeia de caracteres:

•for element in l s t :
• <do something, using element>

A variável loop no exemplo acima é element


►elemento "percorre" cada elemento na lista lst
73
Listas
● Você deve usar valores inteiros como ındice para acessar uma
posição da lista.
● O valor pode ser inclusive uma variável inteira.

notas = [8.0, 5.5, 9.3, 0.5, 3.1]

for i in range(5) 8.0


print(notas[i]) 5.5
9.3
0.5
3.1

74
Listas
● Quais valores serão armazenados em cada posição da lista após a
execução deste código abaixo?

lista = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

for i in
range(10):
lista[i] = 5*i
print(lista)

[0, 5, 10, 15, 20, 25, 30, 35, 40, 45]

75
Listas
● Lembre-se que o for na verdade faz a variável de controle assumir
todos os valores de uma lista. Assim:

notas = [8.0, 5.5, 9.3, 0.5, 3.1]


for i in range(len(notas)):
print(notas[i])

● E também pode ser implementado como:


notas = [8.0, 5.5, 9.3, 0.5, 3.1]
for i in notas:
print(i)

76
Listas
● Índices negativos se referem à lista da direita para a esquerda:

notas = [8.0, 5.5, 9.3, 0.5,


3.1] 3.1
print(notas[-1]) 0.5
print(notas[-2]) 9.3
print(notas[-3]) 5.5
print(notas[-4]) 8.0
IndexError: list
print(notas[-5])
index out of range
print(notas[-6])
● Ocorre um erro se tentarmos acessar uma posição da lista que não
existe.

77
Listas
● Listas em Python suportam uma operação conhecida
como slicing, que consiste em obter uma sub-lista
contendo os elementos de uma posição inicial até
uma posição final de uma lista.

● O slicing em Python é obtido como


• identificador[ind1:ind2]

• e o resultado é uma sub-lista com os elementos de


ind1 até ind2−1.
78
Listas

● O slicing em Python é obtido como


• identificador[ind1:ind2]

• e o resultado é uma sub-lista com os elementos


de ind1 até ind2−1.
notas = [8.0, 5.5, 9.3, 0.5, 3.1]
print(notas[1:4])

[5.5, 9.3, 0.5]

79
Listas
Use dir(list) para obter uma lista de métodos de lista
Use help(list.x) para obter ajuda sobre o nome do método x
L.append(element): adicionar elemento ao final de L
L.extend(lst): adicione todos os elementos de lst ao final de L
L.insert(index, element): inserir elemento no índice de L, empurrando
elementos posteriores para a frente
L.pop(): remova e devolva o elemento no final de L
L.pop(index): remova e retorne o elemento no índice de L
L.remove(element): remover a primeira ocorrência do elemento de L
►L.sort(): ordenar os elementos de L
►L.del(index): remove da lista o item no índice de L 80
►L.Count(element): conta o número de elementos com o valor de
Listas
Qual é o valor de a depois que esse código é
executado?

•a = [2, 4, 6, 8]
•a.remove(4)
•a.pop(2)

►A. [2, 4]
►B. [6, 8]
►C. [2, 6]
►D. [2, 8]
►E. Nada; o código produz um erro 81
a = [ 1 , 2 , 3 , 4 , 5]
b = a # referencia
compartilhada
a b

Duas variáveis, mas apenas 1 2 3 4 5


uma lista:
b [ 1 ] = 999 # ver a !

a b

1 999 3 4 5
Para evitar o comportamento de compartilhamento, uma
segunda lista deve ser criada. A sintaxe da fatia cria uma nova
lista:a = [ 1 , 2 , 3 , 4 , 5 ]
b = a [ : ] # duas listas agora!
a b

1 2 3 4 5

b [ 1 ] = 999 # a n ã o é m o d i f i c a d o

a b

2 1 3 999 4 5
a = [[1, 2, 3], [4, 5]]
b = a[:]
a

1 2 3 4 5

A imagem indica o estado após a execução do código acima.


Se fizermos então:b.append(8)
qual é a lista referida por a?
►A. [[1, 2, 3], [4, 5]] (inalterado)
►B. [[1, 2, 3], [4, 5], 8]
►C. [[1, 2, 3], [4, 5, 8]]
►D. [[1, 2, 3], [4, 5], [8]]
Concatenação e Repetição

O operador + está sobrecarregado (novamente) para operar em


duas listas
Ele retorna uma nova lista resultante da concatenação da lista da
direita com o final da lista da esquerda
É semelhante ao método extend, mas extend não retorna uma
nova lista!
► O operador * pega uma lista L e um inteiro n e cria uma
nova lista concatenando n cópias de L (como usar + n-1
vezes)
Compare:
l s t 1 = [ 1 , 2 , 3]
lst2 =lst1 + lst1
l s t 2 [ 0 ] = 99 # L S T 1 n ã o m o d i f i c a d o
lst1 lst2

1 2 3

l s t 1 = [ 1 , 2 , 3]
lst2 =[lst1] +[lst1]
l s t 2 [ 0 ] [ 1 ] = 99 # l s t 1 modificado!
lst2

lst1

1 2 3
Usando range
A função range gera sequências de inteiros
Se chamarmos range(n), inteiros de 0 a n - 1 são gerados
Se chamarmos range(m, n), inteiros de m a n - 1 são gerados
Se chamarmos range(m, n, s), inteiros de m a n - 1, em
incrementos de s, são gerados
► Use list(range(...)) para converter o objeto range em uma
lista para exibição
ConcepTest
Qual é a lista produzida por este
código?

list(range(2, 7, 3))

► A. [ 2 , 5 , 8 ]
► B. [ 2 , 5 ]
► C. [ 2 , 5 , 7 ]
► D. [ 2 , 3 , 4 , 5 , 6 , 7 ]
ConcepTest
Qual é a lista produzida por este
código?

list(range(4, 9, 4))

► A. [ 4 , 8 ]
► B. [ 4 , 8 , 12]
► C. [ 4 , 8 , 9 ]
► D. [ 4 , 5 , 6 , 7 , 8 , 9 ]
O que é impresso por este
código? ConcepTest
l s t = [ 3 , 6 , 9]
sum = 0
counter = 0
while counter < l e n ( l s t ) :
sum += counter
counter += 2
p ri n t (su m)

► A. 18
► B. 6
► C. 2
► D. 9
► E. None of the above
O que é impresso por este
código? ConcepTest
l s t = [ 3 , 6 , 9]
sum = 0
counter = 0
while counter < l e n ( l s t ) :
sum += counter
counter += 2
p ri n t (su m)

► A. 18
► B. 6
► C. 2
► D. 9
► E. None of the above
Listas
● Em algumas situações é necessário declarar e já atribuir um conjunto de
valores constantes para uma lista.
● Dentro da lista incluımos uma construção com um laço que gerará
valores iniciais para a lista.
x = [0 for i in range(5)]
print (x)
[0, 0, 0, 0, 0]

x = [2*i for i in range(5)]


print (x)
[0, 2, 4, 6, 8]

92
Funções

Em matemática, poderíamos definir uma função como f (x ) = x 2


Qual o valor de f (3)? f (5)?
► Em Python, podemos alcançar um efeito semelhante
def f ( x ) :
r e t u r n x ** 2

Agora, o que faz


a chamada f (3)?
Definições de função
def f ( x ) :
r e t u r n x ** 2

def é uma
palavra-chave;
ele tem um
significado
especial para
Python e não
pode ser usado
como uma
variável ou nome
de função
A instrução
return encerra a
função e
determina o
valor retornado
ao chamador
Se não houver
retorno, a função
Qual dos itens a seguir contém uma chamada
de função?
(1)
type(4.5)
(2)

def add_one(x):
return x + 1

(3)
area(2, 9)
(4)
print("Hello")
► A. (3) only
► B. (2) and
(3)
► C. (1), (3),
and (4)
ConcepTest
Qual é a saída desse código?

def c a l c u l a t e ( w, x , y ) :
a=x
b = w+ 1
return a + b + 3

print(calculate(3, 2,
0))

► A. 5
► B. 9
► C. 0
► D. 3
ConcepTest
Qual é a saída deste código?

def c a l c u l a t e ( w, x , y ) :
a=x
b = w+ 1
return a + b + w

print(calculate(1, 2,
0))

► A. 3
► B. 4
► C. 5
► D. 6
ConcepTest
Quais são os bugs no código a seguir?

def add_one(x):
return x + 1

x=2
x = x + add_one(x)

A. Sem bugs. O código é bom


B. O corpo da função não é recuado
C. Estamos usando x como parâmetro e variável, mas não
podemos fazer isso
► D. Tanto B quanto C são bugs
Receita de design de função

Vamos usar uma receita para escrever funções.


Passo 1: escreva alguns exemplos da chamada de
função.

>>> g l u e _ s t r i n g s ( ’ J o h n ’ , ’Smith’) ’John


Smith’

Passo 2: escreva o contrato de tipo (o que a função aceita e o


que ela retorna)

( s t r , s t r ) -> s t r
Receita de Design de Função...

Step 3: write the header.


def g l u e _ s t r i n g s ( s 1 , s 2 ) :

Step 4: add a description of the function, referring to each


parameter by name
Return t h e s t r i n g composed o f s 1 , a s p a c e , and s 2 .

Step 5: put it all together and write the function. Let’s do that
now!
Módulos Python
Os módulos são usados para agrupar funções
Usar a importação para disponibilizar as funções de um módulo
Qualquer arquivo que termine em .py pode atuar como um módulo
import executa todo o código em um arquivo .py, mas apenas na
primeira vez (ou seja, se você fizer alterações em um arquivo e tentar
importá-lo novamente, nada acontecerá)
Se importamos module_name, acessamos suas funções através de
module_name.nome_da_função
► Para acessar function_name sem precisar digitar o module_name
prefixo, podemos usar de module_name function_name de
importação
Funções: Motivação

Digamos que você tenha algum código que calcula a nota


do curso de um aluno dadas as notas em laboratórios,
tarefas, etc.
E se você quiser aplicá-lo a três alunos?
Poderíamos copiar e colar o mesmo código três vezes
Quais são as desvantagens de fazer isso?
Comprimento do código (três vezes mais código)
► Bugs: se houver um bug ou erro, vamos replicá-lo em
vários lugares
Funções: Motivação...

Suponha que você esteja escrevendo um livro de receitas


São 12 receitas de bolo, sendo que três delas envolvem recheio de
buttercream
Temos que explicar como fazer o recheio sempre?
Não - podemos "definir" uma vez, e depois "chamá-lo" de outras
receitas (por exemplo, "veja a página 18 para a receita de recheio
de buttercream, depois volte aqui para terminar de fazer o bolo")
► Em programas, usamos funções de forma semelhante para
evitar a repetição
Parâmetros da função

def f(a, b, c):


...

Quando definimos uma função, especificamos que ela leva zero ou


mais parâmetros
por exemplo, a função acima tem três parâmetros
Quando chamamos uma função, fornecemos um valor (um
argumento) para cada parâmetro; Nossos valores são então
atribuídos aos parâmetros da função
► Se não houver parâmetros, chamaremos a função com
parênteses vazios
Parâmetros de função...
def f(a, b, c):
...

x = 5
y = 8
z = 10
f(x, y, z)

A passagem de parâmetros é como uma instrução de atribuição


Aqui, quando f começa a ser executado, a obtém o valor de x, b
obtém o valor de y e c obtém o valor de z
► Alterações em a, b ou c não mudam x, y ou z!
ConcepTest
def
first(a):
a = 8
return a

a = 20
first(a)

print(a)

Qual é a
saída
desse
código?
A. 8
B. 20
C. Erro,
ConcepTest

def
first(a):
a = 8
return a

a = 20
a = first(a)
print(a)

What is the
output of this
code?
► A. 8

► B. 20
Return vs. Print

Dissemos que return encerra a função e retorna um valor para seu


chamador
Se não houver retorno, a função retornará o valor Nenhum
Também introduzimos a função de impressão, que envia seus
argumentos para a tela
A impressão usa um ou mais argumentos e os imprime com um
espaço separando os valores
► imprimir devoluções Nenhum
ConcepTest
def f1():
return
5

def f2():
print(5)

def f3():
return
print(5)

Qual dos
seguintes
atribui 5 a
x?
A. x = f1()
B. x = f2()
C. x = f3()
Escolhendo parâmetros

Como você decide sobre os parâmetros de uma função?


Faça a pergunta "o que a função precisa saber para fazer seu trabalho"
Regra de estilo: Tudo o que ele tem que "saber" deve ser fornecido como
parâmetro
Lembre-se da regra LGB para pesquisa de variáveis; funções podem acessar
Variáveis locais (incluindo parâmetros)
Variáveis globais (geralmente estilo ruim)
► Variáveis incorporadas (por exemplo, abs)
ConcepTest
def
a(num):
num = 4
return 2

def b(val):
num = 8
print(a(1))

b(2)

Qual é a saída
desse código?
A. 1
B. 2
C. 4
D. 8
E. Erro devido
ConcepTest
def
a(num):
num = 4
return 2

def b(val):
val = 8
print
(a(1))

b(2)

Qual é a saída
desse código?
A. 1
B. 2
C. 4
D. 8
Tuplas
Listas de duplas
Sequências, subscritos, fatias
Somente métodos de contagem e índice
Criado com parênteses (não entre colchetes)
Imutável
► Fornece integridade de dados (por exemplo, sem
alterações possíveis por meio de aliasing)
ConcepTest

Qual dos itens a seguir é mais adequado para um dicionário em


vez de uma lista?
A. A ordem em que as pessoas terminam uma corrida
B. Os ingredientes necessários para uma receita
C. Os nomes dos países do mundo e suas capitais
D. 50 inteiros aleatórios
Listas Paralelas
Digamos que estamos observando pássaros e queremos
acompanhar o número de cada tipo que vimos
tipo contagem
peregrine falcon 1
harrier falcon 5
red-tailed hawk 2
osprey 11
► Uma abordagem: listas paralelas
► O elemento kinds[i] corresponde com counts[i]

kinds = [’peregrine falcon’, ’harrier falcon’,


’red-tailed hawk’, ’osprey’]
counts = [1, 5, 2, 11]
ConcepTest
def new_sighting(kinds, counts, sighting):
’’’(list of str, list of int, str) ->
NoneType
Add new sighting to parallel lists kinds and counts.
’’’

if sighting not in
kinds:
kinds.append(sighting)
... missing code
ind = kinds.index(sighting)
counts[ind] = counts[ind] +
1

Qual código deve ir no lugar do


código ausente?
A. counts.append(0)
B. counts.append(1)
Dicionários vs. Listas Paralelas

bird_dict = {
’peregrine falcon’:1, ’harrier falcon’:5,
’red-tailed hawk’:2, ’osprey’:11}

def new_sighting(bird_dict, sighting):


if sighting not in bird_dict:
bird_dict[sighting] = 0
bird_dict[sighting] += 1

Em comparação com listas paralelas:


Apenas um dicionário (não dois)
Nenhuma chamada para índice que possa
pesquisar a lista inteira
Dicionários

 Dicionários são um coleção desordenada de objetos


representados na forma de (chave, valor) onde a chave é
usada para referenciar um determinado valor.
 As chaves de um dicionário só podem ser de um tipo imutável
como inteiros, floats e strings. Tuplas também podem ser
aceitas desde que não contenham direta ou indiretamente
um tipo mutável como listas.
 Dicionários não possuem uma noção de índice e não podem
ser fatiados.
 Dicionários são mutáveis de forma que a qualquer momento
você pode inserir ou remover itens.
Dicionários

 Para se criar um dicionário vazio, utilizamos:

 Para criar um dicionário com alguns valores conhecidos, há duas


maneiras:
 Dic = {chave1:valor1, chave2:valor2,....., chaven:valorn}
 Exemplo:
Dicionários

 Outra forma de gerar o mesmo dicionário acima é com dict(x)


onde x pode ser uma lista de tuplas do tipo (chave, valor) como
mostrado abaixo:
Adicionando aos dicionários

As chaves são imutáveis


Os valores podem ser mutáveis ou imutáveis
Use d[k] = v para adicionar a chave k com o valor v ao
dicionário d
Se k já estiver presente, seu valor será substituído
Para copiar todos os pares chave/valor de outro dicionário, use
o método update
Use dict para copiar (superficialmente) outro dicionário
► Update e dict também funcionam com uma sequência cujos
elementos são todos de comprimento 2
Adicionando aos dicionários
 Para obter o número de elementos em um dicionário, basta
utilizarmos a função len:

 Demonstração do método update: Para mesclar dois


dicionários
Adicionando aos dicionários

 Para inserir um item em um dicionário basta declarar o dicionário


colocando entre colchetes a nova chave e atribuindo uma valor a
ela:
Adicionando aos dicionários

 Para alterar um valor em um dicionário, usamos o nome do


dicionário com a chave entre colchetes e atribuímos o novo valor:
Removendo dos dicionários

 Para remover um item em um dicionário basta usar a função del


aplicada ao nome do dicionário com a chave entre colchetes:
Verificar existência em dicionários

 Para verificar se uma chave existe no dicionário, utilizamos o


operador in:
Verificar existência em dicionários

 Para verificar se um valor existe no dicionário, utilizamos o operador


in:
Obtendo valores de dicionários

Use d[k] para obter o valor associado à chave k do dicionário d


Se k não existir, isso causará um erro
O método get é semelhante, exceto que retorna None em vez de
dar um erro quando a chave não existe
► Se um segundo parâmetro v for fornecido, obtenha
como retorno v em vez de None quando a chave não é
encontrada
ConcepTest

O que é dicionário d criado pelo código a seguir?

d = {3:4}
d[5] = d.get(4, 8)
d[4] = d.get(3, 9)

► A. {3:4, 5:8, 4:9}


► B. {3:4, 5:8, 4:4}
► C. {3:4, 5:4, 4:3}
► D. Erro causado por get
ConcepTest

O que é dicionário d criado pelo código a seguir?

d = {1:5}
d[2] = d.get(1, 6)
d[4] = d.get(3, 7)

► A. {1:5, 2:5, 4:7}


► B. {1:5, 2:6, 4:7}
► C. {1:5, 2:1, 4:2}
► D. Erro causado por get
ConcepTest

Qual das seguintes diferenças é entre listas e dicionários?


A. Os elementos da lista não são mutáveis, mas os valores do dicionário
mutáveis
B. Atribuir a um índice que não existe em uma lista é um erro, mas atribu
valor a uma chave que não existe em um dicionário não é
C. Uma lista pode conter um dicionário como um de seus elementos, ma
dicionário não pode conter uma lista como um de seus valores
D. Há um construtor dict que cria um dicionário a partir de um
objeto adequado, mas não há um construtor de lista que cria listas
de forma semelhante
Chaves, valores e itens

► keys recupera chaves de um dicionário


► values recupera valores de um dicionário
► items recupera pares de um dicionário (chave, valor)
► Todas essas exibições de retorno que funcionam como
listas, mas não são listas (por exemplo, não têm
métodos)
► Para obter explicitamente uma lista, use, por exemplo,
list(d.keys())
Invertendo um dicionário
Lembre-se deste dicionário que mapeia as frequências:

bird_dict = {
’peregrine falcon’:1, ’ h a r r i e r falcon’:5,
’ r e d - t a i l e d hawk’:2, ’osprey’:11}

Às vezes, o dicionário invertido é mais útil; por exemplo, para


imprimir nomes por ordem de frequência.

bird_dict = {
1:’peregrine falcon’, 5:’harrier falcon’,
2 : ’ r e d - t a i l e d hawk’, 11:’osprey’}
Invertendo um dicionário

Se um dicionário mapeia k para v, o dicionário invertido mapeia v para k


Mas, considere o dicionário {1:3, 2:3}
Não podemos invertê-lo como {3:1, 3:2}
A complicação aqui é que várias chaves no dicionário original podem mapear
para o mesmo valor
Solução: mapeie chaves para listas de valores para corrigir possíveis colisões
► Inverter {1:3, 2:3} dará {3: [1,2]}
ConcepTest

{ 1 : 4 , 2 : 5 , 4:5}
Qual a melhor inversão desse dicionário?
A. {4:1, 5:[2,4]}
B. {4:[1], 5:[4,2]}
C. {4:[1], 5:[2,4]}
D. Dois dos itens acima são igualmente bons
E. Todos os itens acima são igualmente bons
ConcepTest

Aqui está um dicionário do mês de aniversário. Qual mês tem mais


cobertura?

{"December" : {24 : ["Dan", " J o e " , " S t e p h " ] } ,


" J u l y " : {17 : ["Angelo"], 16 : [ " C h r i s " ]
1 : ["Canada"]}}

A. Dezembro
B. Julho
► C. Tanto julho quanto dezembro são
igualmente cobertos
ConcepTest

Aqui está um dicionário do mês de aniversário. Qual mês tem mais


cobertura?
{"December" : {24 : ["Dan", " J o e " ] , 23 : [ " S t e p h " ] } ,
" J u l y " : {17 : ["Angelo"], 16 : [ "C h ri s"]} }

A. Dezembro
B. Julho
► C. Tanto julho quanto dezembro são igualmente
cobertos
Sets
• Um set em Python é uma coleção de itens
únicos (distintos).
• Para o set, não há índice, ou seja, a ordem
não é importante (diferente da lista)
• Numa tradução para o campo da
matemática ou para o português, a melhor
tradução de set é conjunto (assim como
para as lists é vetor e/ou listas)
138
Sets
# Exemplo de criação de sets.
numeros = [1, 2, 2, 3, 3, 3]
numeros_distintos = set(numeros)
print("Números: ", numeros)
print("Números distintos: ",
numeros_distintos)
Números: [1, 2, 2, 3, 3, 3]
Números distintos: {1, 2, 3}
139
Sets
# Exemplo de criação de sets.
numeros = [1, 2, 2, 3, 3, 3]
numeros_distintos = set()
for num in numeros:
numeros_distintos.add(num)
print("Números: ", numeros)
print("Números distintos: ", numeros_distintos)
Números: [1, 2, 2, 3, 3, 3]
Números distintos: {1, 2, 3}

140
Sets
• Para inserir um elemento em uma lista, podemos usar a
função insert ou a função append
• Para inserir um elemento em um set podemos usar
somente a função add ou a função update
• Essa diferença decorre do fato de que em uma lista temos
um controle da posição dos elementos: insert nos permite
inserir um elemento em uma posição específica da lista e
append adiciona um elemento ao final da lista.
• Em um set não temos controle sobre a ordem na qual os
elementos são armazenados. A única garantia que temos é
que elementos duplicados não serão inseridos.

141
Sets
• Para remover um elemento de um conjunto em Python,
podemos usar a função remove ou a função discard
(remove so deve ser usada se houver a certeza que o
elemento está no conjunto)

• O exemplo abaixo mostra o uso da função remove.

nums = set([1, 2, 2, 3, 3, 3])


nums.remove(2)
print("Números: ", nums)
Números: {1, 3}
142
Sets
Além disso, Python nos permite remover todos os elementos de um
conjunto de uma vez. Para isso precisamos usar a função clear, como
mostrado no exemplo abaixo.

nums = set([1, 2, 2, 3, 3, 3])


print("Números: ", nums)
nums.clear()
print("Números: ", nums)
Números: {1, 2, 3}
Números: set()

Esta notação é a forma de Python indicar um conjunto vazio.


{} é a forma que Python usa para indicar um dicionário vazio.
Por isso, para evitar confusão, quando imprimimos um conjunto vazio
usa-se set() 143
Sets
Pode-se utilizar, como na matemática, união, intersecção e
diferença.

A = {0, 1, 3, 5, 7, 9}
B = {0, 2, 4, 6, 8}
C = A.union(B) # C = A | B
print(C)
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

144
Sets
Pode-se utilizar, como na matemática, união, intersecção e
diferença.

A = {0, 1, 3, 5, 7, 9}
B = {0, 2, 4, 6, 8}
C = A & B # C = A.intersect(B).
print(C)

145
Sets

146
Sets
set() Cria um novo set
for x in set Acessa cada elemento de um set
if elemento in set Verifica se um elemento está em um set
if elemento not in set Verifica se um elemento não está em um set
len(set) Retorna o tamanho de um set (quantidade de elementos)

Adiciona um elemento em um set


add(elemento) Ao usá-lo, ela insere o elemento no set, sem ser em uma posição específica

update([elemento1, elemento2]) Adiciona vários elementos de uma só vez em um set


Remove um elemento específico de um set
remove(elemento) Ao usá-lo, se o item a ser removido não existir, remove() gerará um erro

Remove um elemento específico de um set


discard(elemento) Ao usá-lo, se o item a ser removido não existir, discard() não gerará um erro

Remove um elemento aleatório de um set


pop() Ao usá-lo, como os sets não são ordenados, não se saberá qual item será removido

clear() Remove todos os elementos de um set


del set Elimina uma coleção inteira
copy() Copia um set para outro
union() Unifica dois sets
intersection() Retorna a intersecção entre dois sets
difference() Retorna a diferença entre dois sets
147
Comparações

148
Comparações

149
Orientação a Objetos
• A Programação Orientada a Objetos (POO) é ​um
paradigma de programação baseado no conceito
de Classes e Objetos.
• Classes podem conter dados e código:
• Dados na forma de campos (também chamamos
de atributos ou propriedades); e
• Código, na forma de procedimentos
(frequentemente conhecido como métodos).

150
Orientação a Objetos
• Uma importante característica dos objetos é que
seus próprios métodos podem acessar e
frequentemente modificar seus campos de dados:
objetos mantém uma referência para si mesmo, o
atributo self no Python.
• Na POO, os programas são projetados a partir de
objetos que interagem uns com os outros.
• Esse paradigma se concentra nos objetos que os
desenvolvedores desejam manipular, ao invés da
lógica necessária para manipulá-los. 151
Orientação a Objetos
• As Classes são tipos de dados definidos pelo
desenvolvedor que atuam como um modelo para
objetos. Pra não esquecer mais: Classes são
fôrmas de bolo e bolos são objetos :wink:
• Objetos são instâncias de uma Classe. Objetos
podem modelar entidades do mundo real (Carro,
Pessoa, Usuário) ou entidades abstratas
(Temperatura, Umidade, Medição, Configuração).

152
Orientação a Objetos
• Métodos são funções definidas dentro de uma
classe que descreve os comportamentos de um
objeto. Em Python, o primeiro parâmetro dos
métodos é sempre uma referência ao próprio
objeto.
• Os Atributos são definidos na Classe e
representam o estado de um objeto. Os objetos
terão dados armazenados nos campos de atributos.

153
Princípios da POO
• Encapsulamento: juntar ou encapsular, dados e
comportamentos relacionados em entidades únicas, que
chamamos de objetos.
• O princípio do Encapsulamento também afirma que
informações importantes devem ser contidas dentro do
objeto de maneira privada e apenas informações
selecionadas devem ser expostas publicamente.

154
Princípios da POO
• Abstração: O mesmo se aplica à Classes e Objetos: nós
podemos esconder atributos e métodos do mundo exterior.
E isso nos traz alguns benefícios!
• Primeiro, a interface para utilização desses objetos é muito
mais simples, basta saber quais “botões” utilizar.
• Também reduz o que chamamos de “Impacto da
mudança”, isto é: ao se alterar as propriedades internas da
classes, nada será alterado no mundo exterior, já que a
interface já foi definida e deve ser respeitada.

155
Princípios da POO
• Herança: possibilita a reutilização de código comum em
uma relação de hierarquia entre Classes.

Vamos utilizar a entidade Carro como exemplo. :car:

Agora imagine uma Caminhonete, um Caminhão e uma Moto.

Todos eles são Automóveis, correto? Todos possuem característica semelhantes, não é mesmo?

Podemos pensar que Automóveis aceleram, freiam, possuem mecanismo de acionamento de faróis,
156 entre
outros.
Princípios da POO
• Polimorfismo: Classes filhas utilizando código comum da
Classe acima, ou Classe pai.

• Ou seja, as Classes vão compartilhar atributos e


comportamentos (herdados da Classe acima).

• Assim, Objetos de Classes diferentes, terão métodos e


atributos compartilhados que podem ter implementações
diferentes, ou seja, um método pode possuir várias formas
e atributos podem adquirir valores diferentes.
157
Princípios da POO
• Polimorfismo: entidade Carro que herda de Automóvel.

• Suponha agora que Automóvel possua a definição do


método acelerar().

• Por conta do conceito de Polimorfismo, objetos da Classe


Moto terão uma implementação do método acelerar() que
será diferente da implementação desse métodos em
instâncias da Classe Carro!

158
Princípios da POO
• Exemplo prático: Classe Fraction

• Nós já vimos que o Python fornece um número de classes


numéricas para nosso uso. Há momentos, no entanto, que
seria mais apropriado poder criar objetos de dados que se
“pareçam” com frações.

Fonte: https://panda.ime.usp.br/panda/static/pythonds_pt/01-Introducao/13-poo.html

159
Princípios da POO
• Exemplo prático: Classe Fraction

• Uma fração como 35 consiste de duas partes. O valor em


cima, conhecido como numerador, pode ser qualquer
inteiro. O valor embaixo, chamado denominador, pode ser
qualquer número inteiro maior que 0 (frações negativas
têm um numerador negativo). Embora seja possível criar
uma aproximação em ponto flutuante para qualquer fração,
neste caso nós gostaríamos de representar uma fração
como um valor exato.
Fonte: https://panda.ime.usp.br/panda/static/pythonds_pt/01-Introducao/13-poo.html

160
Princípios da POO
• Exemplo prático: Classe Fraction

• As operações para o tipo Fraction permitirão que um


objeto de dado Fraction se comporte como qualquer outro
valor numérico. Precisamos ser capazes de adicionar,
subtrair, multiplicar e dividir frações. Nós também
queremos ser capazes de mostrar frações usando a forma
padrão com “barra”, por exemplo, 3/5. Além disso, todos
os métodos de Fraction devem retornar resultados em seus
menores termos de modo que, não importa qual
computação seja realizada, sempre acabamos com a forma
mais comum.
Fonte: https://panda.ime.usp.br/panda/static/pythonds_pt/01-Introducao/13-poo.html 161
Example 1: How Many Vowels?

Write the following function that returns the number of vowels in


string s. Both uppercase and lowercase vowels should be counted.
(The vowels are a, e, i, o, and u.)

def num_vowels(s):
Example 2: Removing Spaces

Write the following function that returns a string that is the same
as s except that spaces are removed.

def remove_spaces(s):
Concep
Test
def
mystery(s):
new_s = ’’
for c in s:
new_s = c +
new_s return
new_s

What is a good
description of this
function?
► A. Return a copy
of s
► B. Return the
reverse of s
165

Você também pode gostar