terça-feira, 26 de janeiro de 2021

Recebendo entrada em Python

Os desenvolvedores geralmente precisam interagir com os usuários, seja para obter dados ou fornecer algum tipo de resultado. A maioria dos programas hoje usa uma caixa de diálogo como uma forma de solicitar ao usuário algum tipo de entrada. Já o Python nos fornece duas funções embutidas para ler a entrada do teclado.

input(): esta função primeiro obtém a entrada do usuário e, em seguida, avalia a expressão, o que significa que o Python identifica automaticamente se o usuário inseriu uma string ou um número ou lista. Se a entrada fornecida não estiver correta, o erro de sintaxe ou a exceção é gerado pelo python. Por exemplo -

# Python program showing
# a use of input()

val = input("Enter your value: ")
print(val)

Saída:

 
como a função input funciona em Python:

Código:

# Program to check input
# type in Python

num = input("Enter number :")
print(num)
name1 = input("Enter name : ")
print(name1)

# Printing type of input value
print ("type of number", type(num))
print ("type of name", type(name1))

Resultado :

raw_input(): Esta função funciona em versões anteriores (como Python 2.x). Esta função pega exatamente o que foi digitado no teclado, converte em string e depois retorna para a variável na qual queremos armazenar. Por exemplo -

# Python program showing
# a use of raw_input()

g = raw_input("Enter your name : ")
print g

Resultado :

Aqui, g é uma variável que obterá o valor da string, digitada pelo usuário durante a execução do programa. A digitação de dados para a raw_input()função é encerrada com a tecla Enter. Podemos usar raw_input()para inserir dados numéricos também. Nesse caso, usamos typecasting. Para obter mais detalhes sobre typecasting, consulte isto.
 

Consulte o artigo Obtendo a lista como entrada do usuário para obter mais informações.

Artigo escrito por ABHISHEK TIWARI 13 e traduzido por Acervo Lima de Taking input in Python.

Obtendo entrada do console em Python

O que é console em Python?Console (também chamado de Shell) é basicamente um interpretador de linha de comando que recebe a entrada do usuário, ou seja, um comando por vez e a interpreta. Se estiver livre de erros, ele executa o comando e fornece a saída necessária, caso contrário mostra a mensagem de erro. Um console Python se parece com isso.

Aqui nós escrevemos o comando e para executá-lo basta pressionar a tecla Enter e seu comando será interpretado.
Para programar em Python, você deve conhecer os fundamentos do console usado em Python.

O prompt principal do console python são os três símbolos maiores que

>>>

Você está livre para escrever o próximo comando no shell somente quando, após a execução do primeiro comando, esses prompts aparecerem. O console Python aceita comandos em Python que você escreve após o prompt.

Aceitar entrada do console
usuário insere os valores no console e esse valor é então usado no programa conforme necessário.
Para obter a entrada do usuário, usamos a função interna input().

# input 
input1 = input() 
  
# output 
print(input1) 

Também podemos converter esta entrada para inteiro, float ou string especificando a função input() dentro do tipo.

Artigo escrito por DikshaTewari e traduzido por Acervo Lima de Taking input from console in Python.

Python - Obtenha uma lista como entrada do usuário

Frequentemente encontramos uma situação em que precisamos pegar um número / string como entrada do usuário. Neste artigo, veremos como obter como entrada uma lista do usuário.

Exemplos:

Entrada: n = 4, ele = 1 2 3 4
Saída:   [1, 2, 3, 4]

Entrada: n = 6, ele = 3 4 1 7 9 6
Saída: [3, 4, 1, 7, 9, 6]

Código # 1: exemplo básico

# creating an empty list
lst = []

# number of elemetns as input
n = int(input("Enter number of elements : "))

# iterating till the range
for i in range(0, n):
    ele = int(input())

    lst.append(ele) # adding the element

print(lst)

Resultado:

 
Código # 2: com manipulação de exceção

# try block to handle the exception
try:
    my_list = []

    while True:
        my_list.append(int(input()))

# if the input is not-integer, just print the list
except:
    print(my_list)

Resultado:

 
Código # 3: Usando map()

# number of elements
n = int(input("Enter number of elements : "))

# Below line read inputs from user using map() function
a = list(map(int,input("\nEnter the numbers : ").strip().split()))[:n]

print("\nList is - ", a)

Resultado:

 
Código # 4: Lista de listas como entrada

lst = []
n = int(input("Enter number of elements : "))

for i in range(0, n):
    ele = [input(), int(input())]
    lst.append(ele)

print(lst)

Resultado:

Código # 5: usando compreensão de lista e definição de tipos

# For list of integers
lst1 = []

# For list of strings/chars
lst2 = []

lst1 = [int(item) for item in input("Enter the list items : ").split()]

lst2 = [item for item in input("Enter the list items : ").split()]

print(lst1)
print(lst2)

Resultado:

Artigo escrito por dileep1998 e traduzido por Acervo Lima de Python | Get a list as input from user.

quinta-feira, 10 de dezembro de 2020

Obtenha a hora de um timestamp no pandas

Vamos ver como extrair a hora de um timestamp no Pandas, com a ajuda de vários exemplos.

Exemplo 1: pandas.timestamp.now() leva o fuso horário como entrada e retorna o objeto timestamp atual desse fuso horário

# importa o módulo pandas
import pandas as pd

# timestamp corrente
date = pd.Timestamp.now()
print("Corrente Timestamp: ", date)

# extrai as horas do timestamp 
frame = date.hour
print("Hora: ", frame)

Resultado:

Corrente Timestamp:  2020-12-09 08:49:59.531299
Hora:  8

Exemplo 2: pandas.timestamp() é usado por DateTimeIndex de um fuso horário específico. Pega ano, mês, dia, hora e fuso horário como entrada e retorna DateTimeIndex desse fuso horário.

# importa o módulo pandas
import pandas as pd

# timestamp corrente
date = pd.Timestamp(year=2020, month=7, day=21,
                    hour=6, minute=30, second=44,
                    tz='US/Pacific')
print("Timestamp: ", date)

# extrai a hora do timestamp
print("Hour: ", date.hour)

Resultado:

Timestamp:  2020-07-21 06:30:44-07:00
Hour:  6

Exemplo 3: Pegue a entrada como um intervalo de timestamp usando pandas.dt_range() e pandas.series() para converter em um array de timestamp.

# importa o módulo pandas
import pandas as pd

# cria seis datas entre o periodo de seis horas
dates = pd.Series(pd.date_range('2019-8-5 10:23:05', periods= 6, freq='H'))

# converte num dicionário
frame = pd.DataFrame(dict(givenDate=dates))

# extri horas do timestamp
frame['hourOfTimestamp'] = frame['givenDate'].dt.hour
print(frame)

Resultado:

            givenDate  hourOfTimestamp
0 2019-08-05 10:23:05               10
1 2019-08-05 11:23:05               11
2 2019-08-05 12:23:05               12
3 2019-08-05 13:23:05               13
4 2019-08-05 14:23:05               14
5 2019-08-05 15:23:05               15

Exemplo 4: Use o atributo object.hour para retornar a hora da data e hora nos dados do objeto Series fornecido.

# importa o módulo pandas
import pandas as pd

dates = pd.Series(['2015-01-11 09:20', '2019-4-8 11:31', '2018-12-22 10:10',  
                   '2011-4-2 04:25', '2017-1-6 03:51'])   
  
# atribui um nome as Series
seriesName = ['T1', 'T2', 'T3', 'T4', 'T5']

# atribui um index para cada timestamp 
dates.index = seriesName

dates = pd.to_datetime(dates)

# extrai as horas dp Timestamp
rs = dates.dt.hour
print(rs)

Resultado:

T1     9
T2    11
T3    10
T4     4
T5     3
dtype: int64

Exemplo 5: Ler dados de um timespamp de um arquivo csv e obter horas de cada timestamp.
Você pode baixar o arquivo csv aqui.

# importa o módulo pandas
import pandas as pd

# lê os dados do arquivo datahora.csv
frame = pd.read_csv(r'datahora.csv')
print("Valores de datahora.csv: ")
print(frame.head())

frame['DataHora'] = frame['DataHora'].astype('datetime64[ns]')

# extrai horas de Timestamp   
print("Horas: ")
# Acessa o conteúdo da coluna 'DataHora'
# como um atributo do dataframe
print(frame.DataHora.dt.hour.head())

Resultado:

Valores de datahora.csv:
    DataHora           Cidade
0  2010-08-02 13:06:00        São Paulo
1  2020-07-11 21:50:43   Belo Horizonte
2  2010-09-12 22:58:00          Vitória
3  2019-11-03 03:00:29        Fortaleza
4  2009-01-12 09:54:09           Manaus
Horas:
0    13
1    21
2    22
3     3
4     9
Name: DataHora, dtype: int64

Artigo escrito por tanvi_jain e traduzido por Acervo Lima de Get the Hour from timestamp in Pandas.

terça-feira, 8 de dezembro de 2020

Python - Pandas Dataframe.sort_values() | Parte 1

A função do pandas sort_values() classifica um dataframe em ordem crescente ou decrescente da coluna passada. É diferente da função sorted do Python, uma vez que não pode classificar um dataframe e uma coluna particular não pode ser selecionada.

Vamos discutir sobre Dataframe.sort_values() Classificação de parâmetro único:

Sintaxe:

DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind=’quicksort’, na_position=’last’)

Cada parâmetro tem alguns valores padrão, exceto o parâmetro ‘by’.

Parâmetros:

by: Único/Lista de nomes de coluna pelos quais classificar o dataframe.
axis: 0 ou 'índice' para linhas e 1 ou 'colunas' para coluna.
ascending: valor booleano que classifica o dataframe em ordem crescente se True.
inplace: valor booleano. Faz as alterações no próprio dataframe transmitido, se True.
kind: String que pode ter três entradas (‘quicksort’, ‘mergesort’ ou ‘heapsort’) de algoritmo usado para ordenar o dataframe.
na_position: recebe duas entradas de string ‘last’ ou ‘first’ para definir a posição dos valores nulos. O padrão é ‘last’.

Tipo de devolução:

Retorna um dataframe classificado com as mesmas dimensões do dataframe do chamador da função.

Para obter o link para o arquivo CSV usado no código, clique aqui.

Exemplo #1: classificação por nome
No exemplo a seguir, um dataframe é criado a partir do arquivo csv e o dataframe é classificado em ordem crescente de nomes de jogadores.

Antes de classificar:

# importando o modulo pandas
import pandas as pd

# criando um dataframe a partir
# de um arquivo csv
data = pd.read_csv("nba.csv")
print(data.head(10))

Resultado:

            Name            Team  Number Position   Age Height  Weight            College      Salary
0  Avery Bradley  Boston Celtics     0.0       PG  25.0    6-2   180.0              Texas   7730337.0
1    Jae Crowder  Boston Celtics    99.0       SF  25.0    6-6   235.0          Marquette   6796117.0
2   John Holland  Boston Celtics    30.0       SG  27.0    6-5   205.0  Boston University         NaN
3    R.J. Hunter  Boston Celtics    28.0       SG  22.0    6-5   185.0      Georgia State   1148640.0
4  Jonas Jerebko  Boston Celtics     8.0       PF  29.0   6-10   231.0                NaN   5000000.0
5   Amir Johnson  Boston Celtics    90.0       PF  29.0    6-9   240.0                NaN  12000000.0
6  Jordan Mickey  Boston Celtics    55.0       PF  21.0    6-8   235.0                LSU   1170960.0
7   Kelly Olynyk  Boston Celtics    41.0        C  25.0    7-0   238.0            Gonzaga   2165160.0
8   Terry Rozier  Boston Celtics    12.0       PG  22.0    6-2   190.0         Louisville   1824360.0
9   Marcus Smart  Boston Celtics    36.0       PG  22.0    6-4   220.0     Oklahoma State   3431040.0

Depois de classificar:

import pandas as pd

data = pd.read_csv("nba.csv")

# ordenando o dataframe por nome
# em ordem crecente
data.sort_values("Name", axis = 0, ascending = True,
                    inplace = True, na_position ='last') 

print(data.head(10))
                Name                    Team  Number Position   Age Height  Weight           College      Salary
152     Aaron Brooks           Chicago Bulls     0.0       PG  31.0    6-0   161.0            Oregon   2250000.0
356     Aaron Gordon           Orlando Magic     0.0       PF  20.0    6-9   220.0           Arizona   4171680.0
328   Aaron Harrison       Charlotte Hornets     9.0       SG  21.0    6-6   210.0          Kentucky    525093.0
404    Adreian Payne  Minnesota Timberwolves    33.0       PF  25.0   6-10   237.0    Michigan State   1938840.0
312       Al Horford           Atlanta Hawks    15.0        C  30.0   6-10   245.0           Florida  12000000.0
330     Al Jefferson       Charlotte Hornets    25.0        C  31.0   6-10   289.0               NaN  13500000.0
428  Al-Farouq Aminu  Portland Trail Blazers     8.0       SF  25.0    6-9   215.0       Wake Forest   8042895.0
368    Alan Anderson      Washington Wizards     6.0       SG  33.0    6-6   220.0    Michigan State   4000000.0
135    Alan Williams            Phoenix Suns    15.0        C  23.0    6-8   260.0  UC Santa Barbara     83397.0
444       Alec Burks               Utah Jazz    10.0       SG  24.0    6-6   214.0          Colorado   9463484.0

Conforme mostrado acima, a coluna de índice agora está confusa, pois o dataframe é classificado por Nome.

Exemplo #2: Mudança de posição de valores nulos

Nos dados fornecidos, existem muitos valores nulos em diferentes colunas que são colocados no último por padrão. Neste exemplo, o dataframe é classificado de acordo com a coluna 'Salary' e os valores nulos são mantidos no topo.

import pandas as pd

data = pd.read_csv("nba.csv")

# Ordenando o dataframe pela coluna 'Salary'
data.sort_values("Salary", axis = 0, ascending = True,
                    inplace = True, na_position ='first') 

print(data.head(15))

Conforme mostrado abaixo, os valores NaN estão no topo e depois disso vem o valor classificado de Salário.

Resultado:

                       Name                    Team  Number Position   Age Height  Weight                College   Salary
2              John Holland          Boston Celtics    30.0       SG  27.0    6-5   205.0      Boston University      NaN
46              Elton Brand      Philadelphia 76ers    42.0       PF  37.0    6-9   254.0                   Duke      NaN
171           Dahntay Jones     Cleveland Cavaliers    30.0       SG  35.0    6-6   225.0                   Duke      NaN
264           Jordan Farmar       Memphis Grizzlies     4.0       PG  29.0    6-2   180.0                   UCLA      NaN
269            Ray McCallum       Memphis Grizzlies     5.0       PG  24.0    6-3   190.0                Detroit      NaN
270          Xavier Munford       Memphis Grizzlies    14.0       PG  24.0    6-3   180.0           Rhode Island      NaN
273          Alex Stepheson       Memphis Grizzlies    35.0       PF  28.0   6-10   270.0                    USC      NaN
350           Briante Weber              Miami Heat    12.0       PG  23.0    6-2   165.0  Virginia Commonwealth      NaN
353           Dorell Wright              Miami Heat    11.0       SF  30.0    6-9   205.0                    NaN      NaN
397            Axel Toupane          Denver Nuggets     6.0       SG  23.0    6-7   210.0                    NaN      NaN
409              Greg Smith  Minnesota Timberwolves     4.0       PF  25.0   6-10   250.0           Fresno State      NaN
457                     NaN                     NaN     NaN      NaN   NaN    NaN     NaN                    NaN      NaN
32   Thanasis Antetokounmpo         New York Knicks    43.0       SF  23.0    6-7   205.0                    NaN  30888.0
291         Orlando Johnson    New Orleans Pelicans     0.0       SG  27.0    6-5   220.0       UC Santa Barbara  55722.0
130            Phil Pressey            Phoenix Suns    25.0       PG  25.0   5-11   175.0               Missouri  55722.0

Artigo escrito por Kartikaybhutani e traduzido por Acervo Lima de Python | Pandas Dataframe.sort_values() | Set-1

Licença

Python - Pandas DataFrame.fillna() para substituir valores nulos no dataframe

Python é uma ótima linguagem para fazer análise de dados, principalmente por causa do fantástico ecossistema de pacotes Python centrados em dados. Pandas é um desses pacotes e torna a importação e análise de dados muito mais fácil.

Às vezes, o arquivo csv tem valores nulos, que são exibidos posteriormente como NaN no quadro de dados. Assim como o método pandas dropna() gerencia e remove valores nulos de um quadro de dados, fillna() gerencia e permite que o usuário substitua os valores NaN por algum valor próprio.

Sintaxe:

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

Parâmetros:

value: estático, dicionário, matriz, série ou dataframe a ser preenchido em vez de NaN.
method: method é usado se o usuário não passar nenhum valor. O Pandas tem métodos diferentes como bfill, backfill ou ffill, que preenche o local com o valor do próximo índice ou do anterior, respectivamente.
axis: o axis leva o valor int ou string para linhas/colunas. A entrada pode ser 0 ou 1 para Inteiro e 'index' ou 'columns' para String.
inplace: É um booleano que faz as alterações no próprio quadro de dados se True.
limit: Este é um valor inteiro que especifica o número máximo de preenchimentos consecutivos de valores NaN.
downcast: É necessário um dict que especifica qual tipo fazer o downcast. Como Float64 para int64.
** kwargs: qualquer outro argumento de palavra-chave.

Para obter o link para o arquivo CSV usado no código, clique aqui.

Exemplo #1: Substituindo valores NaN por um valor estático.

Antes de substituir:

# importando modelo pandas
import pandas as pd

# criando um dataframe apartir de um arquivo csv
nba = pd.read_csv("nba.csv")
print(nba)

Resultado:

              Name            Team  Number Position   Age Height  Weight            College     Salary
0    Avery Bradley  Boston Celtics     0.0       PG  25.0    6-2   180.0              Texas  7730337.0
1      Jae Crowder  Boston Celtics    99.0       SF  25.0    6-6   235.0          Marquette  6796117.0
2     John Holland  Boston Celtics    30.0       SG  27.0    6-5   205.0  Boston University        NaN
3      R.J. Hunter  Boston Celtics    28.0       SG  22.0    6-5   185.0      Georgia State  1148640.0
4    Jonas Jerebko  Boston Celtics     8.0       PF  29.0   6-10   231.0                NaN  5000000.0
..             ...             ...     ...      ...   ...    ...     ...                ...        ...
453   Shelvin Mack       Utah Jazz     8.0       PG  26.0    6-3   203.0             Butler  2433333.0
454      Raul Neto       Utah Jazz    25.0       PG  24.0    6-1   179.0                NaN   900000.0
455   Tibor Pleiss       Utah Jazz    21.0        C  26.0    7-3   256.0                NaN  2900000.0
456    Jeff Withey       Utah Jazz    24.0        C  26.0    7-0   231.0             Kansas   947276.0
457            NaN             NaN     NaN      NaN   NaN    NaN     NaN                NaN        NaN

[458 rows x 9 columns]

Depois de substituir: No exemplo a seguir, todos os valores nulos na coluna College foram substituídos pela string “No college”. Em primeiro lugar, o quadro de dados é importado de CSV e, em seguida, a coluna College é selecionada e o método fillna() é usado nela.

import pandas as pd

nba = pd.read_csv("nba.csv")

# substitui os valores nulos da coluna 'College'
# por 'No College'
nba["College"].fillna("No College", inplace=True)
print(nba)

Resultado:

              Name            Team  Number Position   Age Height  Weight            College     Salary
0    Avery Bradley  Boston Celtics     0.0       PG  25.0    6-2   180.0              Texas  7730337.0
1      Jae Crowder  Boston Celtics    99.0       SF  25.0    6-6   235.0          Marquette  6796117.0
2     John Holland  Boston Celtics    30.0       SG  27.0    6-5   205.0  Boston University        NaN
3      R.J. Hunter  Boston Celtics    28.0       SG  22.0    6-5   185.0      Georgia State  1148640.0
4    Jonas Jerebko  Boston Celtics     8.0       PF  29.0   6-10   231.0         No College  5000000.0
..             ...             ...     ...      ...   ...    ...     ...                ...        ...
453   Shelvin Mack       Utah Jazz     8.0       PG  26.0    6-3   203.0             Butler  2433333.0
454      Raul Neto       Utah Jazz    25.0       PG  24.0    6-1   179.0         No College   900000.0
455   Tibor Pleiss       Utah Jazz    21.0        C  26.0    7-3   256.0         No College  2900000.0
456    Jeff Withey       Utah Jazz    24.0        C  26.0    7-0   231.0             Kansas   947276.0
457            NaN             NaN     NaN      NaN   NaN    NaN     NaN         No College        NaN

[458 rows x 9 columns]

Exemplo #2: Usando o parâmetro do método

No exemplo a seguir, o método é definido como ffill e, portanto, o valor anterior na mesma coluna substitui o valor nulo. Nesse caso, Georgia State substituiu o valor nulo na coluna College das linhas 4 e 5. Da mesma forma, os métodos bfill, backfill e pad também podem ser usados.

import pandas as pd

nba = pd.read_csv("nba.csv") 

# substituindo os valores nan na coluna 'College'
# pelo valor da linha anterior
nba["College"].fillna( method ='ffill', inplace = True) 
print(nba.head(10))

Resultado:

            Name            Team  Number Position   Age Height  Weight            College      Salary
0  Avery Bradley  Boston Celtics     0.0       PG  25.0    6-2   180.0              Texas   7730337.0
1    Jae Crowder  Boston Celtics    99.0       SF  25.0    6-6   235.0          Marquette   6796117.0
2   John Holland  Boston Celtics    30.0       SG  27.0    6-5   205.0  Boston University         NaN
3    R.J. Hunter  Boston Celtics    28.0       SG  22.0    6-5   185.0      Georgia State   1148640.0
4  Jonas Jerebko  Boston Celtics     8.0       PF  29.0   6-10   231.0      Georgia State   5000000.0
5   Amir Johnson  Boston Celtics    90.0       PF  29.0    6-9   240.0      Georgia State  12000000.0
6  Jordan Mickey  Boston Celtics    55.0       PF  21.0    6-8   235.0                LSU   1170960.0
7   Kelly Olynyk  Boston Celtics    41.0        C  25.0    7-0   238.0            Gonzaga   2165160.0
8   Terry Rozier  Boston Celtics    12.0       PG  22.0    6-2   190.0         Louisville   1824360.0
9   Marcus Smart  Boston Celtics    36.0       PG  22.0    6-4   220.0     Oklahoma State   3431040.0

Exemplo #3: Usando limit

Neste exemplo, um limite de 1 é definido no método fillna() para verificar se a função para de substituir após uma substituição bem-sucedida do valor NaN ou não.

import pandas as pd

nba = pd.read_csv("nba.csv")

# substituindo os valores nan na coluna 'College'
# pelo valor da linha anterior com limite de
# uma substuição
nba["College"].fillna(method ='ffill', limit=1, inplace=True) 
print(nba.head(10))
            Name            Team  Number Position   Age Height  Weight            College      Salary
0  Avery Bradley  Boston Celtics     0.0       PG  25.0    6-2   180.0              Texas   7730337.0
1    Jae Crowder  Boston Celtics    99.0       SF  25.0    6-6   235.0          Marquette   6796117.0
2   John Holland  Boston Celtics    30.0       SG  27.0    6-5   205.0  Boston University         NaN
3    R.J. Hunter  Boston Celtics    28.0       SG  22.0    6-5   185.0      Georgia State   1148640.0
4  Jonas Jerebko  Boston Celtics     8.0       PF  29.0   6-10   231.0      Georgia State   5000000.0
5   Amir Johnson  Boston Celtics    90.0       PF  29.0    6-9   240.0                NaN  12000000.0
6  Jordan Mickey  Boston Celtics    55.0       PF  21.0    6-8   235.0                LSU   1170960.0
7   Kelly Olynyk  Boston Celtics    41.0        C  25.0    7-0   238.0            Gonzaga   2165160.0
8   Terry Rozier  Boston Celtics    12.0       PG  22.0    6-2   190.0         Louisville   1824360.0
9   Marcus Smart  Boston Celtics    36.0       PG  22.0    6-4   220.0     Oklahoma State   3431040.0

Resultado: Conforme mostrado na saída, a coluna College da 4ª linha foi substituída, mas a 5ª não foi, pois o limite foi definido como 1.

Artigo escrito por Kartikaybhutani e traduzido por Acervo Lima de Python | Pandas DataFrame.fillna() to replace Null values in dataframe

domingo, 6 de dezembro de 2020

Decoradores de função em Python

Background

A seguir estão fatos importantes sobre funções em Python que são úteis para entender as funções do decorador.

  • Em Python, podemos definir uma função dentro de outra função.
  • Em Python, uma função pode ser passada como parâmetro para outra função (uma função também pode retornar outra função).
# Um programa Python para demonstrar que uma função
# pode ser definida dentro de outra função e uma
# função pode ser passada como parâmetro.

# Adiciona uma mensagem de boas-vindas à string
def messageWithWelcome(str):

    # Função aninhada
    def addWelcome():
        return "Bem-vindo a "

    # Retorna a concatenação de addWelcome() e str 
    return addWelcome() + str

# Para obter o nome do site ao qual as boas-vindas são adicionadas
def site(site_name):
    return site_name

print(messageWithWelcome(site("Acervo Lima"))) 

Resultado:

Bem-vindo a Acervo Lima

Decorador de Função

Um decorador é uma função que recebe uma função como seu único parâmetro e retorna uma função. Isso é útil para “embrulhar” a funcionalidade com o mesmo código repetidamente. Por exemplo, o código acima pode ser reescrito da seguinte forma.

Usamos @func_name para especificar um decorador a ser aplicado em outra função.

# Adiciona uma mensagem de boas-vindas à string
# retornado por fun(). Pega fun() como
# parâmetro e retorna welcome().

def decorate_message(fun):

    # Função aninhada
    def addWelcome(site_name):
        return "Bem-vindo ao " + fun(site_name)

    # O decorador retorna uma função
    return addWelcome

@decorate_message
def site(site_name):
    return site_name;

# Esta chamada é equivalente a chamar
# decorate_message() com função
# site("Acervo Lima") como parâmetro
print(site("Acervo Lima"))

Resultado:

Bem-vindo ao Acervo Lima

Decoradores também podem ser úteis para anexar dados (ou adicionar atributos) às funções.

# Um exemplo Python para demonstrar que
# decoradores podem ser úteis para anexar dados

# Uma função de decorador para anexar
# dados para func
def attach_data(func):
    func.data = 3
    return func 

@attach_data
def add (x, y):
    return x + y 

# Esta chamada é equivalente a attach_data()
# com add() como parâmetro
print(add(2, 3))
print(add.data) 

Resultado:

5
3

'add()' retorna a soma de x e y passada como argumentos, mas é envolvida por uma função decoradora, chamar add(2, 3) simplesmente forneceria a soma de dois números, mas quando chamamos add.data, a função 'add' é passado para a função de decorador 'attach_data' como argumento e esta função retorna a função 'add' com um atributo 'data' que é definido como 3 e, portanto, imprime-o.

Artigo escrito por Shwetanshu Rohatgi e traduzido por Acervo Lima de Function Decorators in Python | Set 1 (Introduction)