<gh_stars>0
"""
Funções de Maior Grandeza - Higher Order Function - HOF

O que isso significa?

- Quando uma linguagem de programação suporta HOF, isso indica que podemos ter funções
que retornam outras funções como resultado ou mesmo que podemos passar funções
como argumentos para outras funções, e até mesmo criar variáveis do tipo de funções
nos nossos programas.

OBS: Na seção de funções, nós utilizamos isso

Em Python, as funções são Cidadões de Primeira Classe - First Class Citizen
"""

# Exemplo: Definindo as funções
def somar(a, b):
    return a + b


def diminuir(a, b):
    return a - b


def multiplicar(a, b):
    return a * b


def dividir(a, b):
    return a / b


def calcular(n1, n2, funcao):
    return funcao(n1, n2)


# Testando as funções
print(calcular(4, 3, somar))
print(calcular(4, 3, diminuir))
print(calcular(4, 3, multiplicar))
print(calcular(4, 3, dividir))
print()


# Nested Functions - Funções Aninhadas

# Em Python também podemos ter funções dentro de funções, que são conhecidas por Nested Functions
# ou também Inner Functions (Funções Internas)

# Exemplo
from random import choice


def cumprimento(pessoa):
    def humor():
        return choice(('E ai, ', 'Suma daqui, ', 'Te amo-te, '))
    return humor() + pessoa


print(cumprimento('Edri'))
print()

# Retornando funções de outras funções
def faz_me_rir():
    def rir():
        return choice(('hahaha', 'kkkkk', 'jajaja'))
    return rir


# Testando
rindo = faz_me_rir()
print(rindo())
print()

# Inner Functions (Funções Internas / Nested Functions) podem acessar o escopo de funções mais externas.
def faz_me_rir_novamente(pessoa):
    def dando_risada():
        risada = choice(('hahaha', 'hehehe', 'huahuahua'))
        return f'{risada}, {pessoa}'
    return dando_risada


# Testando
rindo = faz_me_rir_novamente('Edri')
print(rindo())
print(rindo())

"""
Funções de Maior Grandeza - Higher Order Function - HOF

O que isso significa?

- Quando uma linguagem de programação suporta HOF, isso indica que podemos ter funções
que retornam outras funções como resultado ou mesmo que podemos passar funções
como argumentos para outras funções, e até mesmo criar variáveis do tipo de funções
nos nossos programas.

OBS: Na seção de funções, nós utilizamos isso

Em Python, as funções são Cidadões de Primeira Classe - First Class Citizen
"""

# Exemplo: Definindo as funções
def somar(a, b):
    return a + b


def diminuir(a, b):
    return a - b


def multiplicar(a, b):
    return a * b


def dividir(a, b):
    return a / b


def calcular(n1, n2, funcao):
    return funcao(n1, n2)


# Testando as funções
print(calcular(4, 3, somar))
print(calcular(4, 3, diminuir))
print(calcular(4, 3, multiplicar))
print(calcular(4, 3, dividir))
print()


# Nested Functions - Funções Aninhadas

# Em Python também podemos ter funções dentro de funções, que são conhecidas por Nested Functions
# ou também Inner Functions (Funções Internas)

# Exemplo
from random import choice


def cumprimento(pessoa):
    def humor():
        return choice(('E ai, ', 'Suma daqui, ', 'Te amo-te, '))
    return humor() + pessoa


print(cumprimento('Edri'))
print()

# Retornando funções de outras funções
def faz_me_rir():
    def rir():
        return choice(('hahaha', 'kkkkk', 'jajaja'))
    return rir


# Testando
rindo = faz_me_rir()
print(rindo())
print()

# Inner Functions (Funções Internas / Nested Functions) podem acessar o escopo de funções mais externas.
def faz_me_rir_novamente(pessoa):
    def dando_risada():
        risada = choice(('hahaha', 'hehehe', 'huahuahua'))
        return f'{risada}, {pessoa}'
    return dando_risada


# Testando
rindo = faz_me_rir_novamente('Edri')
print(rindo())
print(rindo())
Funções de Maior Grandeza - Higher Order Function - HOF  O que isso significa?  - Quando uma linguagem de programação suporta HOF, isso indica que podemos ter funções que retornam outras funções como resultado ou mesmo que podemos passar funções como argumentos para outras funções, e até mesmo criar variáveis do tipo de funções nos nossos programas.  OBS: Na seção de funções, nós utilizamos isso  Em Python, as funções são Cidadões de Primeira Classe - First Class Citizen # Exemplo: Definindo as funções # Testando as funções # Nested Functions - Funções Aninhadas # Em Python também podemos ter funções dentro de funções, que são conhecidas por Nested Functions # ou também Inner Functions (Funções Internas) # Exemplo # Retornando funções de outras funções # Testando # Inner Functions (Funções Internas / Nested Functions) podem acessar o escopo de funções mais externas. # Testando