exemplo_tupla = ('Hugo', [38, 'Fluminense'])
print(id(exemplo_tupla), id(exemplo_tupla[0]), id(exemplo_tupla[1]))

# NÃO POSSO
# exemplo_tupla.append('O+')
# exemplo_tupla[-1] = 'O+'

# MAS POSSO... Porque não é mutação na TUPLA, e sim na LISTA dentro dela
exemplo_tupla[-1].append('O+')

print(id(exemplo_tupla), id(exemplo_tupla[0]), id(exemplo_tupla[1]))

def função_exemplo_1():
    return 2

def função_exemplo_2():
    print(2)

nome = 'Hugo Nobrega'.rjust(30, '_')

nome_completo = 'Hugo de Holanda Cunha Nobrega'

nomes = nome_completo.split()

novo_nome = '_'.join(nomes)
# Equivalente:
# novo_nome = str.join('_',nomes)

# EXEMPLO: fazer um função que recebe o nome completo de alguém
# e retorna a versão "em ordem alfabética" do nome (com os nomes em ordem)
def ordena_nome(nome):
    """
    Recebe o nome completo de alguém
    e retorna a versão 'em ordem alfabética' do nome (com os nomes em ordem)
    """
    componentes = nome.split()        # fim da Etapa 1
    componentes.sort(key = str.lower) # fim da Etapa 2 -- é uma MUTAÇÃO da lista componentes!
    # componentes.sort(key = ordem_dos_nomes) # fim da Etapa 2 -- é uma MUTAÇÃO da lista componentes!
    # componentes.sort(key = len)       # fim da Etapa 2 -- é uma MUTAÇÃO da lista componentes!
    return str.join(' ', componentes) # fim da Etapa 3 e do exercício

tupla_de_nomes = ('Hugo', 'Bernardo', 'de', 'Francisco', 'Holanda', 'Nobrega', 'Cunha', 'Charles', 'Silva')

def ordem_dos_nomes(nome):
    """
    Recebe um nome e retorna sua posição na tupla de nomes,
    ou um número enorme caso não esteja lá
    """
    if nome in tupla_de_nomes:
        return tupla_de_nomes.index(nome)
    return 999999999999999999999

# ASSUNTO EXTRA: notação lambda
fun = lambda argumento: 5*argumento
# é equivalente a
def fun(argumento):
    return 5*argumento


# EXEMPLO: ordernar uma lista de números (reais) por seus quadrados
def ordena_por_quadrado (lista_de_números):
    """
    Retorna uma cópia ordernada da lista de números (reais) dada por seus quadrados.
    """
    cópia = lista_de_números.copy()
    cópia.sort(key = lambda x: x**2)
    # cópia.sort(key = quadrado)
    return cópia
    
def quadrado(x):
    return x**2

# Mais um exemplo:
D = {'Matheus':3, 'Leonardo':4, 'Vitória':10, 'Hugo':1}
# quero uma lista das chaves na ordem dos valores!
lista_de_chaves = list(D.keys())
lista_de_chaves.sort(key = D.get)

outra_lista = ['Leonardo', 'Hugo', 'Vitória', 'Matheus', 'Arthur', 'Naju']
# quero ordenar usando o valor correspondente no dicionário, se existir;
# senão, o elemento deve ir pro começo da lista
outra_lista.sort(key = lambda chave: D.get(chave, float('-inf')))

outra_lista.insert(2, 'Maria Eduarda')

# REMOÇÃO DE LISTA

#  pelo índice: del
del(outra_lista[2])
del(outra_lista[-1])
# também serve para dicionário!
del(D['Hugo'])
# ou usando pop, que também retorna o valor removido
print(outra_lista)
último = outra_lista.pop()

# pelo valor: função remove
lista = ['a','b','c','b','d','a']
lista.remove('b')
# lista == ['a','c','b','d','a']
