# Funções

<figure><img src="https://1443919672-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FIb0aHuNFbONG3bs5Njrl%2Fuploads%2F1eyyL3dUg9jJHVpCtyCx%2Fimage.png?alt=media&#x26;token=fb2d68ea-d447-4920-97dd-54baacdd948d" alt=""><figcaption><p>Doe, ajude a continuar criando conteúdo</p></figcaption></figure>

Uma **função** em Python é um bloco de código reutilizável que realiza uma tarefa específica. Ela pode receber dados de entrada, processá-los, e opcionalmente retornar um valor de saída. Funções são essenciais para organizar e modularizar o código, evitando repetições e tornando-o mais legível e fácil de manter.

Neste capítulo, vamos explorar o que são funções, como defini-las, utilizá-las e os diferentes tipos de funções que podem ser criadas em Python.

**Por que usar Funções?**

As funções permitem que você:

* **Reutilize código**: Um bloco de código definido como função pode ser chamado várias vezes, sem a necessidade de reescrevê-lo.
* **Organize seu programa**: Funções ajudam a dividir um problema complexo em partes menores, tornando o código mais organizado e fácil de entender.
* **Facilite a manutenção**: Alterações feitas em uma função afetam todas as suas chamadas, o que facilita a manutenção do código.
* **Evite repetição**: Funções reduzem a redundância ao eliminar a necessidade de repetir código.

**Definindo Funções**

Para definir uma função em Python, usamos a palavra-chave `def`, seguida do nome da função e de parênteses. Se a função recebe parâmetros, eles são listados dentro dos parênteses. O código que define a função é indentado logo abaixo da definição.

Sintaxe básica:

```python
def nome_da_funcao(parametros_opcionais):
    # bloco de código da função
    return valor_opcional
```

**Exemplo Simples de Função**

Vamos começar com um exemplo básico de uma função que não recebe parâmetros e apenas imprime uma mensagem:

```python
def saudacao():
    print("Olá, seja bem-vindo!")
```

Neste caso, a função `saudacao()` não tem parâmetros de entrada e apenas imprime uma mensagem. Para chamar a função e executar seu código, basta utilizar seu nome seguido de parênteses:

```python
saudacao()
```

Saída:

```
Olá, seja bem-vindo!
```

**Funções com Parâmetros**

Funções também podem receber **parâmetros** — valores que você passa para a função no momento de sua chamada, para que ela os utilize internamente.

Exemplo:

```python
def saudacao_personalizada(nome):
    print(f"Olá, {nome}! Seja bem-vindo!")
```

Aqui, o parâmetro `nome` será utilizado para personalizar a saudação. Agora, ao chamar a função, você precisa fornecer o valor para o parâmetro:

```python
saudacao_personalizada("Ana")
```

Saída:

```
Olá, Ana! Seja bem-vindo!
```

**Retornando Valores**

Algumas funções realizam cálculos ou processos e precisam retornar um valor como resultado. Para isso, usamos a instrução `return`.

Exemplo de função que retorna o dobro de um número:

```python
def dobro(numero):
    return numero * 2
```

Ao chamar essa função, podemos capturar o valor retornado e utilizá-lo em outras partes do programa:

```python
resultado = dobro(5)
print(resultado)
```

Saída:

```
10
```

**Parâmetros Opcionais e Valores Padrão**

Em Python, você pode definir valores padrões para os parâmetros de uma função. Isso significa que, se um valor não for fornecido no momento da chamada, o parâmetro assume o valor padrão especificado.

Exemplo:

```python
def saudacao(nome="Visitante"):
    print(f"Olá, {nome}! Seja bem-vindo!")
```

Agora, a função `saudacao()` pode ser chamada sem parâmetros:

```python
saudacao()
```

Saída:

```
Olá, Visitante! Seja bem-vindo!
```

E também pode ser chamada com um nome:

```python
saudacao("João")
```

Saída:

```
Olá, João! Seja bem-vindo!
```

**Funções com Múltiplos Parâmetros**

Funções podem ter vários parâmetros, separados por vírgulas. Cada parâmetro precisa de um valor correspondente quando a função for chamada.

Exemplo:

```python
def soma(a, b):
    return a + b
```

Essa função recebe dois números, `a` e `b`, e retorna sua soma:

```python
resultado = soma(10, 5)
print(resultado)
```

Saída:

```
15
```

**Argumentos Nomeados**

Ao chamar uma função, você pode especificar os argumentos usando seus nomes, o que torna o código mais claro e permite alterar a ordem dos parâmetros.

Exemplo:

```python
def apresentar_pessoa(nome, idade):
    print(f"Nome: {nome}, Idade: {idade}")
```

Você pode chamar a função especificando os nomes dos parâmetros:

```python
apresentar_pessoa(idade=30, nome="Carlos")
```

Saída:

```
Nome: Carlos, Idade: 30
```

**Funções Anônimas (Lambda)**

Python permite a criação de funções anônimas, também conhecidas como **funções lambda**. Elas são usadas para criar pequenas funções sem a necessidade de defini-las com `def`.

Sintaxe de uma função lambda:

```python
lambda parametros: expressao
```

Exemplo:

```python
dobro = lambda x: x * 2
print(dobro(5))
```

Saída:

```
10
```

Embora funções lambda sejam úteis em certas situações, elas são geralmente utilizadas para funções simples e rápidas.

**Escopo de Variáveis**

Em Python, as variáveis definidas dentro de uma função têm **escopo local**, o que significa que elas só podem ser acessadas dentro daquela função. Se você tentar acessar essas variáveis fora da função, ocorrerá um erro.

Exemplo:

```python
def exemplo():
    x = 10  # variável local
    print(x)

exemplo()
print(x)  # Isso gerará um erro, pois x não está definida fora da função
```

Para modificar variáveis globais dentro de uma função, é necessário usar a palavra-chave `global`.

**Funções Recursivas**

Uma função pode chamar a si mesma. Isso é chamado de **recursão**. Funções recursivas são úteis para resolver problemas que podem ser divididos em subproblemas menores, como o cálculo do fatorial de um número.

Exemplo de função recursiva para calcular o fatorial:

```python
def fatorial(n):
    if n == 1:
        return 1
    else:
        return n * fatorial(n - 1)
```

Chamada da função:

```python
print(fatorial(5))
```

Saída:

```
120
```

**Conclusão**

Funções são um dos conceitos mais importantes da programação em Python. Elas permitem que você organize o código, evitando repetições e facilitando a manutenção. Ao usar funções, você pode tornar seu código mais modular, reutilizável e mais fácil de entender. Nos próximos capítulos, veremos como combinar funções com outras estruturas do Python para criar programas ainda mais complexos e eficientes.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://aprendendo-python.vidal.press/funcoes.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
