Criar funções são extremamente importantes quando estamos programando.
Em Python, primeiro utilizaremos:
def, toda vez que você iniciar a criação de uma função nova
2. depois do def será o nome que queremos atribuir a função para na hora que você for chamar a função, chamará pelo nome.
3. Inserir os parâmetros da função. No exemplo abaixo, quero somar um número com o outro, mas se fosse uma soma ou qualquer outra coisa que necessitasse mais parâmetros, eu iria continuar inserindo dentro do parênteses.
4. soma é o nome que estou dando a ação que python irá executar dentro da função (2ª imagem abaixo). Poderia ser qualquer nome, mas para ficar mais fácil de ler o código, coloquei soma e inseri o que Python irá fazer com os parâmetros que criei, por isso adicionei o +.
5. return para que ao executar a função retorne o resultado da soma
Após os passos acima, nossa função estará pronta e podemos chamá-la a qualquer momento.
Função Python simplificada
A forma mais simplificada de escrever uma função, sem armazenar o resultado em uma variável:

O return dentro da função, não é obrigatório mas se eu quiser fazer alguma coisa com o resultado da função, utilizo o return, caso contrário, posso inserir diretamente um print como no exemplo abaixo:
def nome (nomeuser):
print(f"Olá {nomeuser} seja bem vindo(a)! ")
nome('amanda')
Saída: Olá amanda seja bem vindo(a)!
def verifica_par(num):
if num % 2 != 0:
print("O número é ímpar")
else:
print("O número é par")
verifica_par(4)
verifica_par(5)
Saída: O número é par
O número é ímpar
Função Python armazenando resultado em uma variável
Para armazenar o resultado de uma função em uma variável, pode ser útil se você pretende adicionar mais operações ou manipulações antes de retornar o valor final.

Definindo o tipo de dados de parâmetros e resultado da função
Em Python, você pode especificar o tipo de dado esperado como parâmetro e o tipo de dado retornado pela função usando type hints . No entanto, Python não força esses tipos (diferentes de linguagens como Java ou C++), então eles servem apenas como documentação e para ferramentas de análise de código.

Parâmetros opcionais e valores padrão

Tratamento de exceções try-except
O try-except em Python é usado para solucionar problemas (erros) que possam ocorrer durante a execução do código, evitando que o programa seja interrompido. Ao colocar uma operação no bloco try, você está dizendo: "Tente executar este código. Se algo der errado, execute o bloco exceptem vez de interrupção o programa."
try:
# Código que pode gerar uma exceção
except TipoDeExcecao:
# Código a ser executado se a exceção ocorrer
Principais tipos de exceções:
ZeroDivisionError : ocorre quando você tenta dividir por zero.



ValueError : ocorre quando você tenta converter uma variável para um tipo inadequado.

TypeError : ocorre quando você usa um tipo inadequado para uma operação ou função.

IndexError : ocorre quando você tenta acessar um índice inexistente em uma lista

KeyError : ocorre quando você tenta acessar uma chave inexistente em um dicionário.

FileNotFoundError : ocorre quando você tenta abrir um arquivo que não existe.

AttributeError : ocorre quando você tenta acessar um atributo ou método que não existe em um objeto.

Tratando várias exceções

Usando else e finally com try-except
else: executa um bloco de código se nenhuma exceção ocorrer no bloco try.

finally: executa um bloco de código sempre , independentemente de uma exceção ocorrer ou não. É útil para liberar recursos, como fechar arquivos ou conexões.

Função Python com três parâmetros
Veja que no exemplo abaixo, para a minha função funcionar, precisa de três parâmetros. Os parâmetros estão definidos dentro dos parênteses neste caso como num1, num2 e num3.
def multiplicar(num1, num2, num3):
mult = num1 * num2 +num3
return mult
numero1 = 4
numero2 = 6
numero3 = 3
resultado = multiplicar(numero1,numero2, numero3)
print(resultado)


Função com While (condição de parada)

Função com For (repetição para contagem)
