MC-102 — Aula 13
2a passagem por listas

2a passagem pro funcoes: declarando o tipo de parametros e de saida

é possivel declarar os tipos dos parametros e da saida de uma funcao. O Python não usa essa informação ainda, mas há alguns casos onde isso é útil (editor, futuras versões do python)

def soma(a,b):
    return a+b
    
def soma(a: float, b:float) -> float:

tipos básicos

alguns tipos compostos

há coisas mais complicadas

Slice

É possivel acessar e modificar uma subsequencia de uma lista (slice)

>>> a = "ouviram do ipiranga margens placidas" 
>>> a[4:10]
'ram do'

como o range, vai do indice 4 ate antes do indice 10

Abreviaçoes do slice.

>>> a[:10]
'ouviram do'
>>> a[10:]
' ipiranga margens placidas'

copia de uma lista

atribuições de uma lista à uma variável não copia a lista. É a mesma lista.

a = [10,20,30,40]
b = a
print(b)
a[0]=99
print(b)

a linha b = a não cria uma copia da lista de a para b e assim mudanças em a “sao sentidas” por b

Se voce quer evitar isso, voce quer que b seja uma copia de a. Uma forma de fazer isso é um slice do comeco ao fim

a = [10,20,30,40]
b = a[:]
print(b)
a[0]=99
print(b)

Ha tambem a função copy do pacote copy

atribuiçao a um slice

pode-se atribuir valor a um slice. O Pythom remove o slice original e insere a atribuição naquele ponto.

o slice e o valor atribuido não precisam ter o mesmo tamanho

a = [10,20,30,40, 50, 60]
a[1:4] = [21, 31, 41]
print(a)
a[1:4]=[91]
print(a)
a[1:4] = [1,3,5,7,9,11,13]
print(a)

a atribuicao pode ser maior ou menor que o slice original.

List comprehention

Como obter uma lista baseado nos elementos de outra.

Dado uma lista gerar outra lista que é o quadrado dos numeros impares de lista

saida = []
for x in lista:
    if x % 2 == 1:
        saida.append(x**2)

List comprehention

saida = [x**2 for x in lista if x % 2 == 1]

as 3 versões de list comprehention

[f(x) for x in lista if condicao(x)]

[f(x) for x in lista]

[x for x in lista if condicao(x)]

Conjuntos

parecido com listas, mas sem duplicacao

>>> a = [1,2,3,4,5,4,5,3]  <- lista
>>> print(a)  
>>> a = {1,2,3,4,5,4,5,3}  <-  set
>>> print(a)

nao faz sentido acessar um elemento da lista (pelo indice)

>>> a[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'set' object is not subscriptable

mas há várias operaçoes em set

veja em https://docs.python.org/3/library/sets.html

há operações entre 2 conjuntos e operacoes que convertem outros tipos para conjuntos

Set comprehention

{ f(x) for x in set if condicao(x)}

Um velho conhecido nosso

import matplotlib.pyplot as plt
from collections import Counter
import string

def plot_frequency(entrada):
    entrada = entrada.lower()
    entrada = entrada.translate(str.maketrans('', '', string.punctuation + string.whitespace))
    letter_counts = Counter(entrada)
    sorted_letter_counts = sorted(letter_counts.items(), key=lambda x: x[1], reverse=True)
    
    letters = [item[0] for item in sorted_letter_counts]
    counts = [item[1] for item in sorted_letter_counts]
   
   # Plotando o gráfico de barras
    plt.bar(letters, counts)
    plt.xlabel('Letras')
    plt.ylabel('Frequência')
    plt.title('Frequência de Letras (Ordenado)')
    plt.show()