Closures


Meu Deus, que nome feio ! haehahe
Um dia destes me deparei com mais um intrigante ponto sobre programação funcional em Python: CLOSURES !

Primeiro, uma ótima e suscinta explicação retirada do blog Alice and Bob in Cryptoland:
“Basicamente, é quando você pode definir uma função em tempo de execução e esta função faz referência a variáveis de um escopo externo a ela.”

Mas o bixo é mais fácil do que parece a teoria, assim:

Como no python as funções são tratadas como obj também, então podemos enviar uma função como parâmetro, atribuir uma função a uma variável ou mesmo retornar uma funcao como resposda de outra função.

ex:

def imprime(t):
    print t
a = imprime
a('oi')

A saida deste codigo é: oi

Outro exemplo:

def printa():
    print 'Olá sergio'
def roda_n_vezes(funcao, vezes):
    for i in range(vezes):
        funcao()
roda_n_vezes(printa, 5)

A saida deste codigo é:
Olá sergio
Olá sergio
Olá sergio
Olá sergio
Olá sergio

Ok ! E como montamos um closure , conforme a explicação dele :

'''Definimos nossa funcao closure'''
def closure(num):
    '''num é fechada na definição de "closure"
    def metodo():
        return num * 3
    return metodo</code>
ex1 = closure(3)
ex2 = closure(4)
print ex1()
print ex2()

A saida deste codigo é:
9
12

Porque ? Quando atribuimos o retorno de “closure” para nossa variavel, atribuimos a definicao de uma funcao, que é o retorno da mesma, então nossa variavel ex1 virou uma funcao agora, podendo ser chamada a qualquer momento. Mas nem sempre o que parece é, ou seja, conforme o blog acima citado, temos um “godô”, um engano ai: o python não fixa o valor das variáveis como parace, ele utiliza-se da referencia da variável, mesmo ela sendo o parametro da funcao, entao se este valor for trocado, o retorno da nossa nova funcao “ex1” será alterado igualmente, vejamos:

multiplicador = 3
def closure(num):
    def metodo():
        return num * multiplicador
    return metodo
ex3 = closure(3)
ex4 = closure(4)
print ex3() #Imprime 9
print ex4() #Imprime 12
multiplicador = 5
print ex3() #Imprime 15
print ex4() #Imprime 20

Entenderam ?
Bom, resumindo tudo, eu aprendi com isto que podemos trabalhar das mais diversar formar com funcoes em python, nos trazendo muitas facilidades, como por exemplo, o Marcelo Barros falou que usou os closures para callback de menus, uma bela utilização !
Bom comentem o que acharem ruim ou bom ou ruim ou se não entenderam nada.. hahehahe
[]´s a todos..

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s