Funções

<< Clique para Mostrar o Sumário >>

 

Funções

Uma função em Python pode ser compreendida como um conjunto de instruções organizadas e agrupadas de maneira tal que é possível a sua reutilização em diversos locais, seja através de chamadas diretas a partir de um ambiente com um interpretador interativo, seja de dentro de códigos de aplicações mais complexas ou de maneira recursiva, ou seja, uma função chamando a si mesma recursivamente até concluir seu processamento. A seguir são listados alguns aspectos importantes a serem observados em relação às funções em Python.

As definições de uma função sempre iniciam com a declaração def e tem o formato a seguir.

def function_name([parameters...]):
  # code...

 

Assim, logo após uma declaração def deve vir o nome da função seguido de parênteses e dois pontos. A passagem de parâmetros à função é opcional.

 

NOTA

O nome de uma função é sempre único em um dado escopo, uma vez que é necessário identificar univocamente o conjunto de instruções às quais a função se refere.

 

Todo o conjunto de instruções pertinentes à uma função deve respeitar sua indentação, ou seja, todas as linhas de código a partir da declaração inicial da função (def) devem estar indentadas com o espaçamento escolhido (em geral quatro espaços).

Uma função também pode retornar um ou mais valores ao final do seu processamento. Para tanto, é necessário utilizar a declaração return no interior da própria função seguido dos valores que se deseja retornar.

def function_name():
  # code...
  return -1, 0, 1

 

No caso anterior, uma chamada a esta função retorna sempre três valores, -1 (menos um), 0 (zero) e 1 (um).

 

NOTA

É possível declarar toda uma função em apenas uma linha, ou seja, as instruções seguem logo após os dois pontos da declaração da função, como por exemplo "def quadVal(x): return x**2". Neste exemplo é declarada a função quadVal, que recebe um argumento e retorna o seu valor elevado ao quadrado.

 

O primeiro bloco de texto localizado na linha imediatamente abaixo da declaração de uma função é automaticamente interpretado pelo Python como um texto informativo sobre a função, sendo usualmente utilizado para orientar como a função pode ser utilizada (texto de ajuda da função). Este bloco de texto é usualmente designado por docstring.

def function_name():
  """
  Esta função não faz nada!
  Digitando em um ambiente com interpretador integrado:
  help(function_name)
  obtém-se como resultado este mesmo texto.
  """
  pass

 

No caso do exemplo anterior, as três aspas duplas são utilizadas para identificar um bloco de texto na linguagem Python. O uso deste recurso é comum na documentação de funções, apresentando o seu conteúdo toda vez que o comando help é executado em um ambiente com um interpretador interativo, informando como argumento o nome da função.

A declaração pass no código anterior não tem efeito, porém é por vezes utilizada para indicar pontos que precisam ser implementados posteriormente, uma vez que é simplesmente ignorada.

É importante observar que o código de exemplo anterior apresenta erros de sintaxe caso seja digitado diretamente em um ambiente com um interpretador interativo que não tenha suporte a caracteres Unicode (UTF-8), uma vez que utiliza caracteres especiais.

Para carregar módulos no Python 2.7 sem apresentar erros de sintaxe, os arquivos com os códigos que utilizam caracteres especiais devem ser criados em editores com suporte a Unicode, ou utilizar explicitamente a declaração "# -*- coding: utf-8 -*-" no início do arquivo .py.

Os argumentos de uma função em Python são dicionários, sendo assim é possível realizar chamadas a uma função passando argumentos fora da ordem correspondente à sua declaração, desde que se utilize o formato chave-valor.

def function_name(a, b, c, d = 11, e = 12):
  """
Esta função retorna a avalição da seguinte expressão:
res = a ** 2 + b * c + d + e
os parâmetros "d" e "e" da função possuem um valor padrão,
não sendo necessário informá-los caso se deseje utilizar
os valores 11 e 12 respectivamente.
Exemplo de chamada da função
informando os parâmetros na ordem da sua declaração:
>>> res1 = function_name(5, 6, 7)
Exemplo de chamada da função com os mesmos parâmetros,
porém não na ordem da sua declaração:
>>> res2 = function_name(b = 6, c = 7, a = 5)
Neste caso, os valores das variáveis "res1" e "res2"
devem ser iguais.
  """
  return (a ** 2 + b * c + d + e)

 

Uma função também pode operar com um número de argumentos não definidos na sua declaração. Isto é realizado através dos caracteres * e ** colocados antes da variável que recebe uma lista dos parâmetros e uma lista de parâmetros do tipo chave-valor, respectivamente. Exemplo:

def test(a, *args, **kwargs):
  print(a)
  for arg in args:
    print(arg)
  if kwargs is not None:
    for key, value in kwargs.iteritems():
      print('Key: {}  - Value: {}'.format(key,value))

 

Executando a função test em um ambiente com um interpretador interativo:

>>> test('qwe', 'rty', 'uio', b=2, c=3, d=4)
qwe
rty
uio
Key: c  - Value: 3
Key: b  - Value: 2
Key: d  - Value: 4

 

Em Python também é possível declarar uma função indefinida, ou seja, que não tem nome. Em geral é utilizada quando se precisa realizar um pequeno processamento sobre valores de conjuntos de dados. Para a sua criação, utiliza-se a declaração lambda.

Para demonstrar a utilização da função lambda, vamos apresentar uma outra forma de resolver o problema do exemplo apresentado anteriormente para gerar uma lista com o quadrado dos valores no intervalo entre -100 e 100, com intervalo regular de 10 unidades.

# idem exemplo anterior
In [1]: x = range(-100, 100, 10)
# equivalente à linha: y = [i ** 2 for i in x]
# do exemplo anterior
In [2]: y = map(lambda v: v ** 2, x)
# idem exemplo anterior
In [3]: print((x[0:-1:5], y[0:-1:5]))
([-100, -50, 0, 50], [10000, 2500, 0, 2500])

 

A primeira linha cria uma lista da mesma maneira que no exemplo apresentado anteriormente, e atribui a lista à variável x. A linha seguinte utiliza as funções map e lambda (ambas nativas do Python), a primeira permite que todos os elementos da lista x sejam avaliados pela função lambda, que é passada como primeiro argumento da função map.

A função lambda é bastante simples, logo após a sua declaração deve vir uma lista dos parâmetros seguida por dois pontos, e então as instruções do processamento em si, que neste caso é simplesmente elevar ao quadrado o valor do parâmetro.

 

NOTA

Além das funções map e lambda, outras duas funções do Python são bastante úteis quando se opera com conjuntos de dados e funções, reduce e filter. Ambas são utilizadas de maneira análoga à função map. A primeira aplica uma função sobre um conjunto de dados reduzindo o resultado a um escalar, enquanto a segunda aplica um filtro definido na função que é passada como argumento sobre o conjunto de dados também passado como argumento.

 

Agora que está definido o que é e como funciona uma função em Python, é possível dizer que, na verdade, uma função em Python nada mais é do que mais um tipo de objeto Python, ou seja, este objeto pode inclusive ser atribuído a uma variável. Mais detalhes sobre objetos e as classes que os definem são apresentados no tópico a seguir, por hora é apenas apresentado um exemplo deste comportamento mencionado.

In [1]: def sum2args(a, b): return a + b
In [2]: print(sum2args(3, 5))
8
In [3]: c = sum2args
In [4]: print(type(c))
<type 'function'>
In [5]: print(c(3, 5))
8

 

A primeira linha define a função sum2args, que retorna a soma de dois argumentos passados como parâmetro da função. A segunda linha imprime na saída padrão o resultado da chamada desta função passando os valores 3 e 5.

A terceira linha atribui a função à variável c, imprimindo o tipo da variável c na linha seguinte, onde pode-se observar que é do tipo function. Por fim, a última linha imprime novamente na saída padrão a mesma chamada da função anterior, porém agora utilizando a variável c ao invés do próprio nome utilizado na declaração da função.

Neste caso é possível redefinir a função sum2args alterando seus parâmetros ou processamento sem que seja alterada a função originalmente definida e que foi atribuída à variável c.

Esta página foi útil?