7765
Comentário:
|
7916
|
Deleções são marcadas assim. | Adições são marcadas assim. |
Linha 40: | Linha 40: |
Em Python, ao contrário de algumas linguagens quando você quer passar uma matriz como argumento, não há restrições quanto a passar uma sequencia (strings, listas, tuplas, unicodes) como argumento. | Em Python, ao contrário de algumas linguagens que não lhe permitem passar uma matriz como argumento, não há restrições quanto a passar uma sequencia (strings, listas, tuplas, unicodes) como argumento. |
Linha 88: | Linha 88: |
Caso existam ´'return''s alinhados, no mesmo bloco, apenas o primeiro funcionará: | Caso existam ''return''s alinhados, no mesmo bloco, apenas o primeiro funcionará: |
Linha 90: | Linha 90: |
#!python | |
Linha 99: | Linha 100: |
<exemplo> | #!python x = 1 def side_effect(): global x print x x += x side_effect() print x #Isso deve imprimir 2 n tela |
Linha 106: | Linha 116: |
Por exemplo, |
Principios da Programação Funcional em Python
#E alguns Linguagismos Pythonicos sobre Funções em geral
Introdução
O conceito de funções em programação vem da matemática. Uma função serve para relacionar um conjunto (chamado de domínio) a outro (Imagem). Em programação, o domínio de uma função seriam os valores que pode-se passar como argumentos, e a Imagem é o conjunto dos possíveis valores de retorno. Para cada elemento no conjunto Domínio, deve haver apenas um elemento correspondente no conjunto imagem. Em programação funcional (e na matemática) esse é o princípio de idempotência, ou seja, para determinado valor de argumento só há uma possibilidade de retorno a cada vez que se passar um determinado valor como argumento.
Esse conceito foi introduzido na programação no final dos anos 50 pela linguagem Lisp, numa epoca em que a linguagem de mais alto nível que existia era o primeiro Fortran. Muitas linguagens desde então sofreram algum tipo de influência de Lisp e seus idiomas, direta ou indiretamente. Inclusive Python, que, por exemplo, tem um tipo função.
Segundo o artigo da Wikipedia [http://en.wikipedia.org/wiki/Python_programming_language#Philosophy Python programming language - seção "Philosophy"], Python é uma linguagem multiparadigma. Então por que não aprender mais um?
Definindo Funções em Python
As funções em Python são definidas atravez da palavra chave def. Sua sintaxe é a seguinte:
Argumentos
Em Python, os argumentos podem ou não ter um valor inicial. Quando se dá um valor inicial na definição, não é obrigatório passar nenhum valor para esse argumento na chamada da função.
Na função foo, a e b são argumentos não obrigatorios
Na função bar, a e b são argumentos obrigatorios
Em Python, ao contrário de algumas linguagens que não lhe permitem passar uma matriz como argumento, não há restrições quanto a passar uma sequencia (strings, listas, tuplas, unicodes) como argumento.
Você também pode definir um argumento precedido de um * (asterisco), para "capturar" o resto dos argumentos numa tupla (Ficando uma função com número de argumentos variavel).
Você pode, ainda, usar ** antes de um argumento na definição da função. #Explicar esse truque! preciso de uma explicação melhor!
<exemplos>
Você pode ainda se aproveitar do polimorfismo da linguagem e permitir que sejam passados "tipos afins", como tipos que podem ser usados numa iteração, e não só um tipo, como lista por exemplo, aumentado a possibilidade de reuso do codigo.
Retornando valores
Você também pode retornar qualquer objeto (até mesmo uma função) de uma função.
Nesse exemplo, a ultima linha deve retornar <type 'type'>, por que list é um tipo
Sua função pode ainda ter varias vezes a palavra return.
Caso existam returns alinhados, no mesmo bloco, apenas o primeiro funcionará:
"Side-Effects"
"Side-Effect", ou algo como 'efeito colateral', é um termo usado para indicar que uma função faz uma operação "destrutiva" , ou seja, ela altera, por exemplo, o valor de um objeto global, ou faz alguma operação de IO.
<exemplo>
Evite Side-Effects em suas funções. Sua função fica mais dificil de se adivinhar o que faz do que se você retornasse um valor que fosse explicitamente atribuido a um nome. Procure usar sempre os argumentos e os returns. Seguindo essa regra suas funções serão inclusive mais uteis em outras ocasiõea (maior reaproveitamento de codigo)
Por exemplo,
Se você realmente pretende fazer uma função que tem Side-Effects, deixe isso bem claro no nome (adicionando um prefixo "set" e o que ele "seta", com "setName", por exemplo) e na docstring da função.
<exemplo>
Recursão
Muitas pessoas acham extremamente complicado aplicar o conceito de recursão, muitos alunos de programação não conseguem desenvolver algoritmos recursivos sem gastar **muito** grafite e papel antes. Muitos programadores acostumados com paradgmas extruturados tamb tem essa dificuldade, A maioria dos programadores evitam implementações recursivas de seus algoritmos, por motivos de performance também, mas muitas vezes nem percebemos que um codigo poderia usar recursão. Certas linguagens funcionais, como Scheme, preveem até mesmo que seus interpretadores tenham algum tipo de otimização de recursão. Pergunte a um estudante dedicado de programação "Quando colocar um trecho de codigo em um bloco separado?" e ele dirá algo como "Quando o codigo se repete". Mas quando o codigo se repete sucessivamente, normalmente usamos for ou while. Quando não houverem grandes problemas para a performance, a recursão pode valer a pena se trousser um melhor estilo.
Chamadas de Função
Na hora de chamar uma função, você pode passar como argumento outra chamada de função, e será passado o valor de retorno dessa. Assim os valores fluirão de uma função para outra, sem necessidade uma variavel de "tranporte".
Entre outras coisas "pensar funcionalmente" pode ser definido assim: projetar algoritmos onde os valores fluem do retorno de uma função para a chamada de outra.
Voce pode usar um asterisco antes de um argumento na chamada da função para passar os argumentos da função atravez de uma lista.
Estilo
Procure usar o caracter \ para quebrar a linha e evitar linhas muito longas e ilegiveis. Exemplo:
Conclusão
Links
Na Wiki:
No resto da Web
[http://diveintopython.org/functional_programming/index.html Dive into Python - Chapter 16. Functional Programming]
[http://en.wikipedia.org/wiki/Python_programming_language#Functional_programming Wikipedia - Python programming language - Functional programming]
Por fazer:
Adicionar Links para trechos afins do DiveIntoPython, Thinking Like a Computer Scientist, etc
Adicionar mais exemplos! (de preferencia tirados do UselessPython !!)
Links para essays do PaulGraham onde ele cita Python
Mais exemplos, mais exemplos!!! De preferencia, alguns uteis ou interessantes
- Uma Conclusão