-
Notifications
You must be signed in to change notification settings - Fork 42
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
(Roteiro) Closures #21
Comments
O roteiro agora vai ser dividido em duas partes #28 |
O link está quebrado, favor consertar para que eu possa validar. []s 🍞 |
8. Closures e contexto de variáveisJá passamos funções como argumento, já retornamos funções e até já mudamos o comportamento das mesmas. Mas tem uma coisa que ainda não fizemos: definir uma função no corpo de outra função: def func_0():
def func_1():
pass
pass Jaber diz: Tá Jaber, eu entendo seu ponto de vista, mas vou usar uma definição muito boa do livro do Mertz: "Uma classe são dados com operações anexadas (...) Uma Closure são operações com dados anexados" Viu? Muda totalmente o modo de ver... Vamos nos explicar de maneira simples em breve, mas vamos entender as closures e fingir que classes não existem, só por alguns minutos. Vamos imaginar que temos que guardar um valor dentro de um função. Essa função vai ser uma função que exclusivamente armazena um valor e uma função dentro do seu escopo: def func_externa(val_1):
"""
A função externa recebe um valor que só vai existir dentro do seu contexto
"""
def func_interna(val_2):
"""
A função interna recebe um valor e retorna a soma dos dois valores.
val_1 está no contexto da função interna, mas val 2 não está no
contexto da função externa
"""
return val_1 + val_2
# aqui quando a função externa for chamada ela retorna a função interna e compartilha seus valores
return func_interna Vamos usar esse código antes de qualquer explicação mirabolante: var_func = func_externa(5)
var_func(5) # 10 Como dá pra notar, a função externa é atribuída a uma variável e essa variável executa a função interna. Parece complicado, mas na verdade é bem simples. Vamos recapitular algumas coisas. Como em python as funções podem ser definidas em qualquer contexto e armazenada em qualquer lugar imagine que a soma_um = func_externa(1)
soma_dois = func_externa(2)
soma_tres = func_externa(3)
soma_quarto = func_externa(4)
soma_cinco = func_externa(5)
# vamos somar tudo com 0
soma_um(0) # 1
soma_dois(0) # 2
soma_tres(0) # 3
soma_quarto(0) # 4
soma_cinco(0) # 5 Bom, agora imagino que tenha ficado um pouco mais claro. Fixamos valores na Quando executamos a função def diga_oi(saudacao):
"""
A função diga_oi armazenada a sua saudação
"""
def nome_pessoa(nome):
"""
A função nome_pessoa retorna a saudação somada ao nome da pessoa
"""
return '{} {}'.format(saudacao, nome)
return nome_pessoa
oi_pirata = diga_oi('Ahoy!') # Definição de diga_oi (função externa) fixando Ahoy
oi_pirata('Eduardo') # Ahoy! Eduardo
oi_pirata('Jaber') # Ahoy! Jaber
oi_pirata('Python') # Ahoy! Python Nesse contexto a função fixou uma variável Mas vamos tentar fixar um dicionário de idiomas pra dic = {'pirata': 'Ahoy', 'ingles':'Hello', 'portugues': 'Olá'} Uma vantagem de definir esse dicionário dentro da função é que ele vai ficar isolado das variáveis globais, o que faz ele não gerar efeito colateral, e isso é muito positivo: def diga_oi():
"""
Definição de uma variável (dic) no escopo local da função.
"""
dic = {'pirata': 'Ahoy', 'ingles':'Hello', 'portugues': 'Olá'}
def nome_pessoa(idioma, nome):
"""
Agora a função interna ficou com a responsabilidade dos dois parâmetros
Mas o dicionário ainda permanece imutável dentro do escopo da chamada de nome_pessoa (função interna)
"""
return '{} {}'.format(dic[idioma], nome)
return nome_pessoa
saudacoes = diga_oi()
saudacoes('pirata', 'Eduardo') # 'Ahoy Eduardo'
saudacoes('portugues', 'Jaber') # 'Olá Jaber'
saudacoes('ingles', 'Python') # 'Hello Python' 8.1 Classes vs closuresVocê deve ter percebido que até agora as closures tem dois tipos de comportamentos diferentes, porém a imutabilidade permanece:
Aqui você deve ter sacado o esquema de operações com dados. O dado passado à função externa permanece imutável sempre e inacessível a qualquer contexto externo ao da função, ou seja, o dado foi fixado e não pode ser transformado em nenhum outro valor, a não ser que seja feita outra chamada com outro valor. O que deveria ser dito sobre as classes, e que preferi postergar, é o que toca exatamente nesse ponto. Vamos fazer uma comparação: classe
|
roteiro
The text was updated successfully, but these errors were encountered: