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)

Sets em Python

Um set é um tipo de dados de coleção não ordenado iterável, mutável e sem elementos duplicados. A classe de sets do Python representa a noção matemática de um conjunto. A principal vantagem de usar um conjunto, ao contrário de uma lista, é que ele possui um método altamente otimizado para verificar se um elemento específico está contido no conjunto. Isso se baseia em uma estrutura de dados conhecida como tabela hash. Como os conjuntos são desordenados, não podemos acessar os itens usando índices como fazemos nas listas.

# Programa python para demonstrar
# o uso de sets

# O mesmo que {"a", "b", "c"} 
myset = set(["a", "b", "c"])
print(myset)

# Adiciona elementos ao conjunto (set)
myset.add("d")
print(myset)

Resultado>

{'c', 'b', 'a'}
{'d', 'c', 'b', 'a'}

Conjuntos Congelados (Frozen sets)

Conjuntos congelados em Python são objetos imutáveis que suportam apenas métodos e operadores que produzem um resultado sem afetar o conjunto ou conjuntos congelados aos quais são aplicados. Embora os elementos de um conjunto possam ser modificados a qualquer momento, os elementos do conjunto congelado permanecem os mesmos após a criação. Se nenhum parâmetro for passado, ele retornará um conjunto congeloda vazio.

# Programa Python para demonstrar diferenças
# entre conjunto normal e congelado 

# o mesmo que {"a", "b","c"}
normal_set = set(["a", "b","c"])

print("Conjunto normal") 
print(normal_set)

# Conjunto congelado
frozen_set = frozenset(["e", "f", "g"])

print("\nConjunto congelado")
print(frozen_set)

# Descomentar abaixo da linha causaria um erro, pois
# estamos tentando adicionar um elemento a um conjunto congelado 
# frozen_set.add("h") 

Resultado:

Conjunto normal
{'b', 'c', 'a'}

Conjunto congelado
frozenset({'e', 'g', 'f'})

Funcionamento interno do set

Isso se baseia em uma estrutura de dados conhecida como tabela hash. Se vários valores estiverem presentes na mesma posição de índice, o valor será anexado a essa posição de índice para formar uma Lista vinculada. Em, Python Sets são implementados usando dicionário com variáveis fictícias, onde a chave é o conjunto de membros com maiores otimizações para a complexidade do tempo.

Definir implementação:

Hash table

Conjuntos com várias operações em um único HashTable:

Métodos dos conjuntos em python

Adicionando elementos

A inserção no conjunto é feita por meio da função set.add(), onde um valor de registro apropriado é criado para armazenar na tabela hash. O mesmo que verificar um item, ou seja, O(1) em média. No entanto, na pior das hipóteses, pode se tornar O(n).

# programa python para demonstrar
# a adição de um novo elemento num conjunto

# Cria um conjunto
people = {"Jay", "Idrish", "Archi"}

print("Pessoas:", end=" ") 
print(people)

# Isso vai adicionar Daxit ao conjunto 
people.add("Daxit") 

# adicionando elementos ao
# conjunto usando um interador
for i in range(1, 6):
    people.add(i)

print("\nConjunto depois de adicionar os elementos:", end=" ") 
print(people) 

Resultado:

Pessoas: {'Archi', 'Idrish', 'Jay'}

Conjunto depois de adicionar os elementos: {1, 2, 3, 4, 5, 'Daxit', 'Idrish', 'Archi', 'Jay'}

União

Dois conjuntos podem ser mesclados usando a função union() ou o operador |. Ambos os valores da Tabela Hash são acessados e percorridos com a operação de mesclagem executada neles para combinar os elementos, ao mesmo tempo em que as duplicatas são removidas. A complexidade de tempo disso é O(len(s1) + len(s2)) onde s1 e s2 são dois conjuntos cuja união precisa ser feita.

# programa python para demonstrar
# a união de dois conjuntos

people = {"Jay", "Idrish", "Archil"}
vampires = {"Karan", "Arjun"}
dracula = {"Deepanshu", "Raju"}

# união usando a função union()
population = people.union(vampires)

print("Usando a função union")
print(population)

# usando o operador |
population = people | dracula

print("\nUnião usando o operador '|'")
print(population)

Interseção

Isso pode ser feito por meio de intersection() ou operador &. Elementos comuns são selecionados. Eles são semelhantes à iteração sobre as listas Hash e combinam os mesmos valores em ambas as tabelas. A complexidade de tempo disso é O(min(len(s1), len(s2)) onde s1 e s2 são dois conjuntos cuja união precisa ser feita.

# programa python para demonstrar
# a interseção de dois conjuntos 

set1 = set()
set2 = set()

for i in range(5):
    set1.add(i) 

for i in range(3,9):
    set2.add(i)

# interseção usando a função
# intersection()
set3 = set1.intersection(set2)

print("interseção usando a função intersection()")
print(set3)

# interseção usando o operador &
set3 = set1 & set2

print("\ninterseção usando o operador &")
print(set3)

Resultado:

interseção usando a função intersection()
{3, 4}

interseção usando o operador &
{3, 4}

Diferença

Para encontrar a diferença entre os conjuntos. Semelhante para encontrar diferença na lista vinculada. Isso é feito por meio da função difference() ou pelo operador -. Complexidade de tempo para encontrar a diferença s1 - s2 é O(len(s1))

# programa para monstrar a diferença
# entre dois conjuntos

set1 = set()
set2 = set()

for i in range(5):
    set1.add(i)

for i in range(3,9):
    set2.add(i)

# diferença entre dois conjuntos
# usando a função difference()
set3 = set1.difference(set2)

print("Diferença entre dois conjuntos usando a função difference()")
print(set3)

# diferença entre dois conjuntos
# usando o operador '-'
set3 = set1 - set2

print("\nDiferença entre dois conjuntos usando o operador '-'")
print(set3)

Resultado:

{0, 1, 2}

Diferença entre dois conjuntos usando o operador '-'
{0, 1, 2}

Limpando um conjunto

O método Clear() esvazia todo o conjunto.

# programa python para demonstrar
# a como limpar um conjunto

set1 = {1,2,3,4,5,6}

print("Conjunto inicial:") 
print(set1)

# Esse método vai limpar o conjunto
set1.clear()

print("\nConjunto depois de chamar a função clear():")
print(set1)

Resultado:

Conjunto inicial:
{1, 2, 3, 4, 5, 6}

Conjunto depois de chamar a função clear():
set()

No entanto, existem duas armadilhas principais nos conjuntos Python:

  1. O conjunto não mantém elementos em nenhuma ordem particular.
  2. Apenas instâncias de tipos imutáveis podem ser adicionadas a um conjunto Python.

Complexidade de tempo dos conjuntos

Operação Caso médio Pior caso Observações
x in s O(1) O(n)
Union s|t O(len(s)+len(t))
Interseção s&t O(min(len(s), len(t)) O(len(s) * len(t)) Troque “min” por “max” se t não é um conjunto
Várias interseções s1&s2&..&sn (n-1)*O(l) where l is max(len(s1),..,len(sn))
Diferença s-t O(len(s))

Operadores do conjuntos

Conjuntos e conjuntos congelados suportam os seguintes operadores:

Operadores Observações
chave em s verificação de contenção
Sem chave em s sem verificação de contenção
s1 == s2 s1 é equivalente a s2
s1 != s2 s1 não é equivalente a s2
s1 <= s2 s1 é um subconjunto de s2
s1 < s2 s1 é um subconjunto adequado de s2
s1 >= s2 s1 é um super conjunto de s2
s1 > s2 s1 é um superconjunto adequado de s2
s1 | s2 a união de s1 e s2
s1 & s2 a interseção de s1 e s2
s1 – s2 o conjunto de elementos em s1 mas não em s2
s1 ˆ s2 o conjunto de elementos precisamente em um de s1 ou s2

Snippet de código para ilustrar todas as operações Set em Python:

# programa para desmonstar o funcionamento
# dos conjuntos em python

# cria dois conjuntos
set1 = set()
set2 = set()

# Adicionando elementos ao conjunto set1
for i in range(1, 6):
    set1.add(i)

# Adicionando elementos ao conjunto set2
for i in range(3, 8):
    set2.add(i)

print("Set1 = ", set1)
print("Set2 = ", set2)
print("\n")

# união dos conjuntos set1 e set2 
set3 = set1 | set2 # set1.union(set2)
print("União de Set1 & Set2: Set3 = ", set3)

# interseção de set1 e set2 
set4 = set1 & set2# set1.intersection(set2) 
print("Interseção de Set1 & Set2: Set4 = ", set4)
print("\n")

# Verificando a relação entre set3 e set4 
if set3 > set4: # set3.issuperset(set4)
    print("Set3 é um super conjunto de Set4")
elif set3 < set4: # set3.issubset(set4) 
    print("Set3 é um subconjunto de Set4")
else: # set3 == set4
    print("Set3 é o mesmo que Set4")

# mostrando a relação entre set4 e set3
if set4 < set3: # set4.issubset(set3)
    print("Set4 é um subconjunto de Set3")
    print("\n")

# diferença entre set3 e set4
set5 = set3 - set4
print("Elementos presentes em Set3 e não presentes em Set4: Set5 = ", set5)
print("\n")

# Verifica se set4 e set5 são conjuntos separados
if set4.isdisjoint(set5):
    print("Set4 e Set5 não tem nada em comun\n")

# Remove todos os elementos do conjunto set5
set5.clear()

print("Depois de chamar a função clear() do objeto Set5: ")
print("Set5 = ", set5) 

Resultado:

Set1 =  {1, 2, 3, 4, 5}
Set2 =  {3, 4, 5, 6, 7}


União de Set1 & Set2: Set3 =  {1, 2, 3, 4, 5, 6, 7}
Interseção de Set1 & Set2: Set4 =  {3, 4, 5}


Set3 é um super conjunto de Set4
Set4 é um subconjunto de Set3


Elementos presentes em Set3 e não presentes em Set4: Set5 =  {1, 2, 6, 7}


Set4 e Set5 não tem nada em comun

Depois de chamar a função clear() do objeto Set5: 
Set5 =  set()

Artigo escrito por nikhilaggarwal3 e traduzido por Acervo Lima de Sets in Python

Permutação e combinação em Python

Python fornece métodos diretos para encontrar permutações e combinações de uma sequência. Esses métodos estão presentes no pacote itertools.

Permutação

Primeiro, importe o pacote itertools para implementar o método permutations() em python. Este método recebe uma lista como entrada e retorna uma lista de objetos de tuplas que contém todas as permutações em uma forma de lista.

# Um programa Python para imprimir todas as
# permutações usando a função da biblioteca itertools
from itertools import permutations

# Obtem todas as permutações de [1, 2, 3]  
perm = permutations([1, 2, 3])

# Imprime as permutações
for i in list(perm):
    print(i) 

Resultado:

(1, 2, 3)
(1, 3, 2)
(2, 1, 3)
(2, 3, 1)
(3, 1, 2)
(3, 2, 1)

Ele gera n! permutações se o comprimento da sequência de entrada for n.

Se quiser obter permutações de comprimento L, implemente-o desta forma.

# Um programa Python para imprimir todos as
# permutações de determinado comprimento
from itertools import permutations

# Obtem todas as permutações de tamanho 2
# e tamanho 2
perm = permutations([1, 2, 3], 2)

# imprime as permutações
for i in list(perm):
    print(i) 

Resultado:

(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
(3, 2)

Ele gera nCr * r! permutações se o comprimento da sequência de entrada for n e o parâmetro de entrada for r.

Combinações

Este método pega uma lista e uma entrada r como entrada e retorna uma lista de objetos de tuplas que contém todas as combinações possíveis de comprimento r em uma forma de lista.

# Um programa Python para imprimir todas as
# combinações de determinado comprimento
from itertools import combinations

# Obtem todas as combinações de [1, 2, 3] 
# e tamanho 2
comb = combinations([1, 2, 3], 2)

# imprime todas as combinações
for i in list(comb):
    print (i)

Resultado:

(1, 2)
(1, 3)
(2, 3)
  1. As combinações são emitidas em ordem de classificação lexicográfica de entrada. Portanto, se a lista de entrada for classificada, as tuplas de combinação serão produzidas em ordem classificada.
    # Um programa Python para imprimir todas as
    # combinações de um determinado comprimento
    from itertools import combinations  
      
    # Obtem todas as combinações de [1, 2, 3]  
    # e tamanho 2  
    comb = combinations([1, 2, 3], 2)
    
    # Imprime as combinações
    for i in list(comb):
        print (i)
    

    Resultado:

    (2, 1)
    (2, 3)
    (1, 3)
    
  2. Os elementos são tratados como únicos com base em sua posição, não em seu valor. Portanto, se os elementos de entrada forem exclusivos, não haverá valores de repetição em cada combinação.

    # Um programa Python para imprimir todas as combinações
    # de determinado comprimento com entrada não classificada. 
    from itertools import combinations  
      
    # Obtem todas as combinações de [2, 1, 3]  
    # e tamanho 2  
    comb = combinations([2, 1, 3], 2)
    
    # imprime as combinações
    for i in list(comb):
        print(i)
    

    Resultado:

    (2, 1)
    (2, 3)
    (1, 3)
    
  3. Se quisermos fazer combinações do mesmo elemento para o mesmo elemento, usamos combinations_with_replacement.

    # Um programa Python para imprimir todas as combinações
    # com uma combinação com o próprio elemento
    # também é incluído 
    from itertools import combinations_with_replacement
    
    # Obtem todas as combinações de [1, 2, 3] e tamanho 2
    comb = combinations_with_replacement([1, 2, 3], 2)
    
    # Imprime as combinações
    for i in list(comb):
        print(i)
    

    Resultado:

    (1, 1)
    (1, 2)
    (1, 3)
    (2, 2)
    (2, 3)
    (3, 3)
    

Artigo escrito por Raju Varshney e traduzido por Acervo Lima de Permutation and Combination in Python

sábado, 5 de dezembro de 2020

Compreensão e segmentação de listas em Python

A compreensão de listas é uma maneira elegante de definir e criar uma lista em python. Podemos criar listas apenas como declarações matemáticas e em apenas uma linha. A sintaxe de compreensão de lista é mais fácil de entender.

A compreensão de uma lista geralmente consiste nestas partes:

  1. Expressão de saída,
  2. Sequência de entrada,
  3. Uma variável que representa um membro da sequência de entrada e
  4. Uma parte opcional do predicado.
Por exemplo:

lst  =  [x ** 2  for x in range (1, 11)   if  x % 2 == 1] 

aqui, x ** 2 é a expressão de saída, 
      range (1, 11)  é a seguencia de entrada, 
      x é variável e  
      if x % 2 == 1 é a parte do predicado.

Exemplo 1:

# Programa Python para demonstrar compreensão de listas em Python

# a lista abaixo contém o quadrado de todos os números ímpares de 1 a 10 
odd_square = [x ** 2 for x in range(1, 11) if x % 2 == 1]
print (odd_square)

# para compreensão, a geração acima é igual a, 
odd_square = []
for x in range(1, 11):
    if x % 2 == 1:
        odd_square.append(x**2)
print (odd_square)

# a lista abaixo contém potência de 2 de 1 a 8
power_of_2 = [2 ** x for x in range(1, 9)]
print (power_of_2)

# a lista abaixo contém primos e não primos no intervalo de 1 a 50
noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)]
primes = [x for x in range(2, 50) if x not in noprimes]
print(primes)

# lista para diminuir os personagens
print ([x.lower() for x in ["A","B","C"]])

# lista que extrai o número
string = "Meu número de telefone é: 11122 !!"

print("\nDigitos extraidos")
numbers = [x for x in string if x.isdigit()]
print(numbers)

# Uma lista de lista para tabuada
a = 5
table = [[a, b, a * b] for b in range(1, 11)]

print("\nTabela de multiplicação")
for i in table:
    print(i) 

Resultado:

[1, 9, 25, 49, 81]
[1, 9, 25, 49, 81]
[2, 4, 8, 16, 32, 64, 128, 256]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
['a', 'b', 'c']

Digitos extraidos
['1', '1', '1', '2', '2']

Tabela de multiplicação
[5, 1, 5]
[5, 2, 10]
[5, 3, 15]
[5, 4, 20]
[5, 5, 25]
[5, 6, 30]
[5, 7, 35]
[5, 8, 40]
[5, 9, 45]
[5, 10, 50]

Depois de obter a lista, podemos obter uma parte dela usando o operador de fatiamento do Python, que tem a seguinte sintaxe:

[inicio: fim: paso]

o que significa que o corte começará do início do índice
e vai até o fim de acordo com o paso.
O valor padrão de início é 0, a parada é o último índice da lista e o paso é 1

Assim, [:fim] dividirá a lista do início ao fim do índice e [inicio:] dividirá a lista do índice inicial até o final. O valor negativo das etapas mostra o percurso da direita para a esquerda em vez de o percurso da esquerda para a direita. É por isso que [::-1] imprime a lista na ordem inversa.

Exemplo 2:

# Vamos primeiro criar uma lista para demonstrar o fatiamento
# lst contém todos os números de 1 a 10
lst =list(range(1, 11))
print(lst)

# a lista abaixo tem números de 2 a 5
lst1_5 = lst[1:5]
print(lst1_5)

# a lista abaixo tem números de 6 a 8
lst5_8 = lst[5:8]
print(lst5_8)

# a lista abaixo tem números de 2 a 10
lst1_ = lst[1:]
print(lst1_) 

# a lista abaixo tem números de 1 a 5
lst_5 = lst[:5]
print(lst_5)

# a lista abaixo tem números de 2 a 8 no paso 2
lst1_8_2 = lst[1:8:2]
print(lst1_8_2)

# a lista abaixo tem números de 10 a 1
lst_rev = lst[::-1]
print(lst_rev)

# a lista abaixo tem números de 10 a 6 na etapa 2
lst_rev_9_5_2 = lst[9:4:-2]
print(lst_rev_9_5_2)

Resultado:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[2, 3, 4, 5]
[6, 7, 8]
[2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5]
[2, 4, 6, 8]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[10, 8, 6]

Podemos usar a função filter para filtrar uma lista com base em alguma condição fornecida como uma expressão lambda como primeiro argumento e lista como segundo argumento, exemplo disso é mostrado abaixo:

Exemplo 3:

import functools 

# filtrando números ímpares 
lst = filter(lambda x : x % 2 == 1, range(1, 20)) 
print(list(lst))

# filtrando quadrados ímpares que são divisíveis por 5
lst = filter(lambda x : x % 5 == 0,
    [x ** 2 for x in range(1, 11) if x % 2 == 1])
print(list(lst))

# filtrando números negativos
lst = filter((lambda x: x < 0), range(-5,5))
print(list(lst))

# implementando a função max()
print(functools.reduce(lambda a,b: a if (a > b) else b, [7, 12, 45, 100, 15])) 

Resultado:

[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
[25]
[-5, -4, -3, -2, -1]
100

Artigo escrito por Utkarsh Trivedi e melhorado por ManasChhabra2, ramalaiguhan e traduzido por Acervo Lima de Python List Comprehension and Slicing

Alterando membros de classe em Python

Já sabemos que Python não tem palavra-chave static. Todas as variáveis que recebem um valor na declaração de classe são variáveis de classe.

Devemos ter cuidado ao alterar o valor da variável de uma classe. Se tentarmos mudar a variável de uma classe usando objeto, uma nova variável da instância (ou não estática) para aquele objeto particular é criada e esta variável obscurece as variáveis da classe. Abaixo está o programa Python para demonstrar o mesmo.

# Programa para testar a funcionalidade

# Classe para estudantes de ciência da computação 
class CSStudent:
    stream = 'cse' # Variável da classe
    def __init__(self, name, roll):
        self.name = name
        self.roll = roll

# Criação de objetos da classe CSStudent
a = CSStudent("Geek", 1)
b = CSStudent("Nerd", 2)

print ("Inicialmente")
print ("a.stream =", a.stream)
print ("b.stream =", b.stream)

# Isso não muda a variável da classe
# Em vez disso, cria uma variável de instância para o objeto
# 'a' que sombreia o membro da classe.
a.stream = "ece"

print ("\nDepois de mudar a.stream")
print ("a.stream =", a.stream)
print ("b.stream =", b.stream)

Resultado:

Initially
Inicialmente
a.stream = cse
b.stream = cse

Depois de mudar a.stream
a.stream = ece
b.stream = cse

Devemos alterar as variáveis da classe usando apenas o nome da classe.

# Programa para mostrar como fazer alterações na
# variável da classe em Python

# Classe para estudante de ciência da computação
class CSStudent:
    stream = 'cse' # Variável da classe  
    def __init__(self, name, roll):
        self.name = name
        self.roll = roll

# Novo objeto para implementação posterior
a = CSStudent("check", 3)
print("a.tream =", a.stream)

# Maneira correta de alterar o valor da variável de classe
CSStudent.stream = "mec"
print("\nA variável da classe mudou para mec")

# Novo objeto para implementação posterior
b = CSStudent("carter", 4)

print("\nValor da variável steam para cada objeto")
print("a.stream =", a.stream)
print("b.stream =", b.stream)

Resultado:

a.tream = cse

A variável da classe mudou para mec

Valor da variável steam para cada objeto
a.stream = mec
b.stream = mec

Artigo escrito por Nikhil Kumar Singh e traduzido por Acervo Lima de Changing Class Members in Python

Operadores lógicos com string em Python

Para strings em python, os operadores booleanos (and, or, not) funcionam. Vamos considerar as duas strings, a saber, str1 e str2 e tentar operadores booleanos nelas:

str1 = ''
str2 = 'Lima'

# repr é usado para imprimir a string junto com as aspas

# Retorna str1 
print(repr(str1 and str2))

# Retorna str1
print(repr(str2 and str1))

# Retorna str2
print(repr(str1 or str2))

# Retorna str2
print(repr(str2 or str1))

str1 = 'Acervo'

# Retorna str2
print(repr(str1 and str2))

# Retorna str1
print(repr(str2 and str1))

# Retorna str1
print(repr(str1 or str2))

# Retorna str2
print(repr(str2 or str1))

str1='coleção'

# Retorna False
print(repr(not str1))

str1 = ''

# Retorna True
print(repr(not str1))

Resultado:

''
''
'Lima'
'Lima'
'Lima'
'Acervo'
'Acervo'
'Lima'
False
True

A saída das operações booleanas entre as strings depende do seguinte:

  1. Python considera strings vazias como tendo valor booleano de ‘false’ e string não vazia como tendo valor booleano de ‘true’.
  2. Para o operador 'and', se o valor esquerdo for verdadeiro, o valor direito será verificado e retornado. Se o valor da esquerda for falso, ele será retornado.
  3. Para o operador 'or', se o valor esquerdo for verdadeiro, ele será retornado; caso contrário, se o valor esquerdo for falso, o valor direito será retornado.

Observe que os operadores bit a bit (|, &) não funcionam para strings.

Artigo escrito por Nikhil Kumar Singh e melhorado por Suchendra Adiga e traduzido por Acervo Lima de Logical Operators on String in Python

Classe String Template em Python

No módulo string, a classe Template nos permite criar sintaxe simplificada para especificação de saída. O formato usa nomes de placeholder formados por $ com identificadores Python válidos (caracteres alfanuméricos e sublinhados). Rodear o placeholder com colchetes permite que ele seja seguido por mais letras alfanuméricas sem espaços intermediários. Escrever $$ cria um único $ com escape.

String Template python

O modelo de string do Python é criado passando a string do modelo para seu construtor. Ele suporta substituições baseadas em $. Esta classe possui 2 métodos principais:

  • substitute(mapping, **kwds): Este método realiza substituições usando um dicionário com um processo semelhante a objetos de mapeamento baseados em chave. argumentos de palavra-chave também podem ser usados para o mesmo propósito. Caso o mapeamento baseado em chave e os argumentos de palavra-chave tenham a mesma chave, ele lança um TypeError. Se as chaves estiverem faltando, ele retornará um KeyError.
  • substitute(mapping, **kwds): o comportamento deste método é semelhante ao do método substitute, mas não lança um KeyError se uma chave estiver faltando, em vez disso, ele retorna um marcador de posição na string de resultado.

O método substitute() gera um KeyError quando um espaço reservado não é fornecido em um dicionário ou em um argumento de palavra-chave. Para aplicativos de estilo mala direta, os dados fornecidos pelo usuário podem estar incompletos e o método safe_substitute() pode ser mais apropriado - ele deixará os marcadores de posição inalterados se houver dados ausentes:

Abaixo estão alguns exemplos simples.

Exemplo 1:

# Um exemplo simples usando Template
from string import Template

# Cria um modelo que tenha espaço reservado para o valor de x
t = Template('x é $x')

# Valor substituto de x no modelo acima
print(t.substitute({'x' : 1}))

Resultado:

x é 1

A seguir está outro exemplo em que importamos nomes e marcas de alunos de uma lista e os imprimimos usando um modelo.

Exemplo 2:

# Um programa Python para demonstrar o
# funcionamento de Template
from string import Template

# Lista Aluno armazena o nome e as notas de três alunos
Aluno = [('Ram',90), ('Ankit',78), ('Bob',92)]

# Estamos criando uma estrutura básica para
# imprimir o nome e as notas dos alunos.
t = Template('Olá $nome, você tem a nota $nota') 

for i in Aluno:
    print (t.substitute(nome = i[0], nota = i[1])) 

Resultado:

Olá Ram, você tem a nota 90
Olá Ankit, você tem a nota 78
Olá Bob, você tem a nota 92

O exemplo abaixo mostra a implementação do método safe_substitute().

Exemplo 3:

from string import Template

template = Template('$nome é o novo $função da $empresa')

string = template.safe_substitute(nome='Raju Kumar', empresa='TCE')
print(string)

Resultado:

Raju Kumar é o novo $função da TCE

Observe que não fornecemos ao marcador de posição $função quaisquer dados, mas isso não gerará um erro, em vez disso, retornará o marcador de posição como uma string, conforme discutido acima.

Imprimindo uma template String

O atributo “template” do objeto Template pode ser usado para retornar a string do template conforme mostrado abaixo:

Exemplo:

t = Template('Eu sou $nome e venho de $cidade')
print('Template String =', t.template)

Resultado:

Template String = Eu sou $nome e venho de $cidade

Sinal de escape $

O $$ pode ser usado para escapar de $ e ser tratado como parte da string.

Exemplo:

template = Template('$$ é o simbolo usado para se referir ao $name')
string = template.substitute(name='Dollar')
print(string)

Resultado:

$ é o simbolo usado para se referir ao Dollar

O ${identificador}

O ${identificador} funciona de forma semelhante ao de $identificador. É útil quando caracteres identificadores válidos seguem o espaço reservado, mas não fazem parte do espaço reservado.

Exemplo:

template = Template('That $noun looks ${noun}y')
string = template.substitute(noun='Fish')
print(string)

Resultado:

That Fish looks Fishy

Outra aplicação para template é separar a lógica do programa dos detalhes de vários formatos de saída. Isso torna possível substituir modelos personalizados por arquivos XML, relatórios de texto simples e relatórios da web em HTML.

Observe que existem outras maneiras de imprimir a saída formatada como %d para inteiro, %f para flutuante.

Referência: https://docs.python.org/3.3/tutorial/stdlib2.html

Artigo escrito por Siddharth Lalwani e traduzido por Acervo Lima de String Template Class in Python

str() vs repr() em Python

str() e repr() são usados para obter uma representação de string do objeto.

Exemplo de str():

s = 'Olá, Acervo Lima'
print(str(s)) 
print(str(2.0/11.0)) 

Saída:

Olá, Acervo Lima
0.181818181818

Exemplo de repr():

s = 'Olá, Acervo Lima'
print(repr(s))
print(repr(2.0/11.0))

Saída:

'Olá, Acervo Lima'
0.18181818181818182

A partir da saída acima, podemos ver se imprimimos string usando a função repr(), em seguida, ela imprime com um par de aspas e, se calcularmos um valor, obtemos um valor mais preciso do que a função str().

A seguir estão as diferenças:

  • str() é usado para criar saída para o usuário final, enquanto repr() é usado principalmente para depuração e desenvolvimento. o objetivo de repr é ser inequívoco e str’s deve ser legível. Por exemplo, se suspeitarmos que um float tem um pequeno erro de arredondamento, repr irá nos mostrar, enquanto str pode não.
  • repr() calcula a representação de string "oficial" de um objeto (uma representação que tem todas as informações sobre o objeto) e str() é usado para calcular a representação de string "informal" de um objeto (uma representação que é útil para imprimir o objeto).
  • A função print e a função interna str() usam __str__ para exibir a representação de string do objeto, enquanto a função interna repr() usa __repr__ para exibir o objeto.

Vamos entender isso por um exemplo:

import datetime
today = datetime.datetime.now()

# Imprime formato legível para objeto de data e hora
print(str(today))

# imprime o formato oficial do objeto data-hora
print(repr(today))

Resultado:

2020-12-05 19:05:20.173734
datetime.datetime(2020, 12, 5, 19, 5, 20, 173734)

str() exibe a data de hoje de uma forma que o usuário pode entender a data e hora.

repr() imprime a representação “oficial” de um objeto de data e hora (significa que usando a representação de string “oficial” podemos reconstruir o objeto).

Como fazê-los funcionar para nossas próprias classes definidas?
Uma classe definida pelo usuário também deve ter um __repr__ se precisarmos de informações detalhadas para depuração. E se acharmos que seria útil ter uma versão string para os usuários, criamos uma função __str__.

# Programa Python para demonstrar a escrita
# de __repr__ e __str__ para classes definidas pelo usuário

# Uma classe definida pelo usuário para representar números complexos
class Complex:

    # construtor
    def __init__(self, real, imag):
        self.real = real
        self.imag = imag

    # Para chamar repr (). Imprime informações do objeto
    def __repr__(self):
        return 'Racional(%s, %s)' % (self.real, self.imag)

    # Para chamar str(). Imprime forma legível
    def __str__(self):
        return '%s + i%s' % (self.real, self.imag)

t = Complex(10, 20)

print(str(t))
print(repr(t))

Resultado:

10 + i20
Racional(10, 20)

Artigo escrito por Arpit Agarwal e melhorado por rajivsarkar67 e traduzido por Acervo Lima de str() vs repr() in Python

Como inserir vários valores do usuário em uma linha em Python?

Por exemplo, em C podemos fazer algo assim:

// lê dois valores em uma linha
scanf("%d %d", &x, &y)

Uma solução é usar input() duas vezes.

x, y = input(), input()

Outra solução é usar split().

x, y = input().split()

Observe que não temos que especificar explicitamente split('') porque split() usa qualquer caractere de espaço em branco como delimitador como padrão.

Uma coisa a se notar no código Python acima é que tanto x quanto y seriam do tipo string. Podemos convertê-los para inteiros usando outra linha.

x, y = [int(x), int(y)]

# Também podemos usar a compreensão de lista
x, y = [int(x) for x in [x, y]]

Abaixo está o código completo de uma linha para ler duas variáveis inteiras da entrada padrão usando divisão e compreensão de lista.

# Lê dois números a partir da entrada e os converte para int usando
# compreensão da lista
x, y = [int(x) for x in input().split()]
# Lê dois números a partir da entrada e os converte para int usando
# a função map
x, y = map(int, input().split())

Artigo escrito por Abhishek Shukla e melhorado por dev_aditya e traduzido por Acervo Lima de How to input multiple values from user in one line in Python?

Tratamento de exceções Python

O erro em Python pode ser de dois tipos, ou seja, erros de sintaxe e exceções. Erros são os problemas em um programa devido aos quais o programa interromperá a execução. Por outro lado, exceções são levantadas quando ocorrem alguns eventos internos que alteram o fluxo normal do programa.

A diferença entre erro de sintaxe e exceções

Erro de sintaxe: como o nome sugere, esse erro é causado por sintaxe incorreta no código. Isso leva ao encerramento do programa.

Exemplo

# inicializar a variável de quantidade
montante = 10000

# verifique se você está qualificado para
# Comprar Dsa no seu próprio ritmo ou não
if (montante > 2999)
    print("Você está qualificado para comprar Dsa no seu próprio ritmo")

Resultado:

  File "/home/thor/Documentos/teste.py", line 6
    if (montante > 2999)
                       ^
SyntaxError: invalid syntax

Exceções: as exceções são levantadas quando o programa está sintaticamente correto, mas o código resultou em um erro. Este erro não interrompe a execução do programa, porém altera o fluxo normal do programa.

Exemplo:

# inicializa a variável
marks = 10000

# tenta fazer uma divisão por zero
a = marks / 0
print(a)

Resultado:

Traceback (most recent call last):
  File "/home/thor/Documentos/teste.py", line 5, in 
    a = marks / 0
ZeroDivisionError: division by zero

No exemplo acima, levantou ZeroDivisionError, pois estamos tentando dividir um número por 0.

Nota: Exception é a classe base para todas as exceções em Python. Você pode verificar a hierarquia de exceções aqui.

try e except no tratamento de exceções

Vamos tentar acessar o elemento da matriz cujo índice está fora do limite e tratar a exceção correspondente.

# Programa python para mostrar como
# lidar com erros em tempo de execução

a = [1, 2, 3]
try:
    print("Segundo elemento = %d" %(a[1]))

    # Lança o erro IndexError porque
    # estamos tentando acessar um
    # elemento fora dos limites
    print("Quarto elemento = %d" %(a[3]))

except IndexError:
    print('O erro IndexError foi lançado')

Resultado:

Segundo elemento = 2
O erro IndexError foi lançado

Uma instrução try pode ter mais de uma cláusula except, para especificar manipuladores para diferentes exceções. Observe que no máximo um manipulador será executado.

# Programa para lidar com vários erros com uma instrução except
try :
    a = 3
    if a < 4 :

        # lança ZeroDivisionError para a = 3
        b = a / (a-3)

    # lança NameError se a >= 4
    print(f"Valor de b = {b}") 

# note que parenteses é necessário
# quando vamos lidar com mais de uma
# exceção
except(ZeroDivisionError, NameError): 
    print("Complicações surgirão, continuaram e foram superadas")

Resultado:

Complicações surgirão, continuaram e foram superadas

Se você alterar o valor de 'a' para maior ou igual a 4, a saída será:

Complicações surgirão, continuaram e foram superadas

A saída acima é assim porque assim que o python tenta acessar o valor de b, ocorre NameError.

Cláusula Else

Em python, você também pode usar a cláusula else no bloco try-except, que deve estar presente após todas as cláusulas except. O código entra no bloco else apenas se a cláusula try não gerar uma exceção.

# Programa para representar a cláusula else com try-except

# Função que retorna a / b 
def AbyB(a , b):
    try:
        c = ((a+b) / (a-b))
    except ZeroDivisionError:
        print("a/b resulta em 0")
    else:
        print(c)

AbyB(2.0, 3.0) 
AbyB(3.0, 3.0) 

A saída para o programa acima é:

-5.0
a/b resulta em 0

Palavra-chave finally em Python

Python fornece a palavra-chave finally, que sempre é executada após blocos try e except. O bloco finally sempre executa após o término normal do bloco try ou depois que o bloco try termina devido a alguma exceção.

Sintaxe:

try:
       # Algum código.... 

except:
       # bloco opcional
       # lidando com a exceção
else:
       # executa se não tiver nenhuma exceção

finally:
      # sempre é executado, com ou sem exceções

Exemplo:

# demonstração de finally

try:
    k = 5//0 # lança o erro de divisão por zero
    print(k)

# lida com o erro de divisão por zero
except ZeroDivisionError:
    print("Não é possivel dividir por zero")

finally:
    # Esse bloco sempre é executado
    # com ou sem exceções
    print('Isso é sempre executado')   

Resultado:

Não é possivel dividir por zero
Isso é sempre executado

Levantando exceções

A instrução raise permite que o programador force a ocorrência de uma exceção específica. O único argumento em aumento indica a exceção a ser levantada. Deve ser uma instância de Exception ou a classe exception (uma classe que deriva de Exception).

# Programa python demonstrando
# o uso de raise

try:
    raise NameError("Um erro!!!") # lança um erro
except NameError:
    print("Uma exceção")
    raise # Para determinar qual exceção ocorreu ou não 

A saída do código acima será simplesmente impressa na linha "Umerro", mas um erro de tempo de execução também ocorrerá na última devido a instrução raise na última linha. Portanto, a saída em sua linha de comando será semelhante a essa:

Uma exceção
Traceback (most recent call last):
  File "/home/thor/Documentos/teste.py", line 5, in 
    raise NameError("Um erro!!!") # lança um erro
NameError: Um erro!!!

Artigo escrito por Nikhil Kumar Singh (nickzuck_007) e melhorado por Akanksha_Rai, nikhilaggarwal3 e traduzido por Acervo Lima de Python Exception Handling

Qual é o valor máximo possível de um inteiro em Python?

Considere o programa Python abaixo.

# Um programa Python para demonstrar que podemos
# armazenar grandes números em Python

x = 10000000000000000000000000000000000000000000;
x = x + 1
print(x)

Resultado :

10000000000000000000000000000000000000000001

Em Python, o valor de um inteiro não é restrito pelo número de bits e pode se expandir até o limite da memória disponível (Fontes: esse e esse). Portanto, nunca precisamos de nenhum arranjo especial para armazenar grandes números (imagine fazer a aritmética acima em C/ C++).

Como uma observação lateral, no Python 3, há apenas um tipo “int” para todos os tipos de inteiros. Em Python 2.7. existem dois tipos separados "int" (que é de 32 bits) e "long int" que é o mesmo que "int" do Python 3.x, ou seja, pode armazenar números arbitrariamente grandes.

# Um programa Python para mostrar que existem dois tipos em
# Python 2.7: int e long int
# E em Python 3, há apenas um tipo: int

x = 10
print(type(x))

x = 10000000000000000000000000000000000000000000
print(type(x))

Saída em Python 2.7:

<type 'int'>
<type 'long'>

Saída em Python 3:

<type 'int'>
<type 'int'>

Podemos tentar programas mais interessantes, como abaixo:

# Imprimindo 100 elevado a 100
print(100**100)

Artigo escrito por Abhay Rathi e traduzido por Acervo Lima de What is the maximum possible value of an integer in Python ?

Função trunc() em Python

Truncar em Python

Existem muitos módulos integrados em python. Fora desses módulos, existe um módulo interessante conhecido como módulo math que possui várias funções como teto, piso, truncar, fatorial, fabs, etc.

Destas funções, existe uma função interessante chamada trunc() que se comporta como uma função de teto para número negativo e função de piso para número positivo.

Em caso de número positivo

# script em python para demonstrar o uso
# de floor(), ceil() truncate() com um número positivo
import math

print(math.floor(3.5)) # arredonda pra baixo
print(math.trunc(3.5)) # funciona como a função floor
print(math.ceil(3.5)) # arredonda pra cima

Resultado:

3
3
4

Em caso de número negativo

# script em python para demonstrar o uso
# de floor(), ceil() truncate() com um número negativos
import math

print(math.floor(-3.5)) # arredonda pra baixo
print(math.trunc(-3.5)) # funciona como a função floor
print(math.ceil(-3.5)) # arredonda pra cima

Resultado:

-4
-3
-3

Isso ocorre porque a função de teto (ceil()) é usada para arredondar para cima, ou seja, em direção ao infinito positivo e a função de fundo é usada para arredondar para baixo, ou seja, em direção ao infinito negativo.

Mas a função trunc() é usada para arredondar para cima ou para baixo em direção a zero.

Artigo escrito por Arpit Agarwal e traduzido por Acervo Lima de trunc() in Python

Fatos interessantes sobre strings em Python

Strings são imutáveis

Depois que uma string é definida, ela não pode ser alterada.

# Programa para mostrar
# que strings não podem ser alteradas

a = 'Acervo Lima'

# mostra o valor de a
print(a) 

# tenta alterar o terceiro elemento da string
a[2] = 'E' # isso vai lançar o erro TypeError
print(a)

Resultado:

Acervo Lima
Traceback (most recent call last):
  File "/home/thor/Documentos/teste.py", line 10, in 
    a[2] = 'E' # isso vai causar um erro
TypeError: 'str' object does not support item assignment

Mas o código abaixo funciona bem.

# programa para mostrar que uma string
# pode ser concatenada com outra string

a = 'Acervo '

# mostra o conteúdo de a
print(a)
a = a + 'Lima'

print(a) # tudo funciona como deveria

Resultado:

Acervo 
Acervo Lima

No segundo programa, o intérprete faz uma cópia da string original e então trabalha nela e a modifica. Portanto, a expressão a = a + 'Lima' não muda a string, mas reatribui a variável a um novo valor (o resultado da concatenação das duas strings).

Entenda o uso da função id().
A função id() é usada para retornar a identidade de um objeto.

# script python para mostrar que
# as duas string tem o mesmo id

string1 = "Hello"
string2 = "Hello"

print(id(string1)) 
print(id(string2)) 

Resultado:

140595101158640
140595101158640

string1 e string2 apontam para o mesmo objeto ou mesmo local. Agora, se alguém tentar modificar qualquer um dos resultados da string, os resultados serão diferentes.

# Modificando a string

string1 = "Hello"

# id da string string1 
print(id(string1)) 

string1 += "World"
print(string1) 

# id da string modificada string1 
print(id(string1))

Resultado:

140495269678192
HelloWorld
140495269678832

String1 é modificado, o que contradiz o fato de que as strings são imutáveis, mas a identidade antes e depois da modificação são diferentes. Isso significa que um novo objeto da string1 é criado após a modificação, o que confirma o fato de que as strings são imutáveis, pois nenhuma mudança foi feita no objeto anterior da string1 em vez disso uma nova é criada.

Três maneiras de criar strings

Strings em Python podem ser criadas usando aspas simples, aspas duplas ou aspas triplas.

As aspas simples e duplas funcionam da mesma forma para a criação da string. Por falar em aspas triplas, elas são usadas quando temos que escrever uma string em várias linhas e imprimir como está, sem usar nenhuma sequência de escape.

# script python parar criar
# strings de três modos diferentes
# e concatenalas 

# string com aspas simples
a = 'Acervo'

# string com aspas duplas
b = " Lima"

# string com aspas triplas
c = ''' Acervo Lima
o maior acervo de de tutoriais '''

d = '''Ele disse, "É armadilha"'''

print(a)
print(b)
print(c)
print(d)

# concatenando strings criadas
# com aspas simples, duplas e triplas
print(a + b + c) 

Resultado:

Acervo
 Lima
 Acervo Lima
o maior acervo de de tutoriais 
Ele disse, "É armadilha"
Acervo Lima Acervo Lima
o maior acervo de de tutoriais

Como imprimir aspas simples ou aspas duplas na tela?

Podemos fazer isso das duas maneiras a seguir:

  • O primeiro é usar o caractere de escape para exibir a citação adicional.
  • A segunda maneira é usando aspas combinadas, ou seja, quando queremos imprimir aspas simples, usando aspas duplas como delimitadores e vice-versa.

Exemplo:

print("Olá, senhor Alberto") 

# usando o caracter de escape
print("Ele disse, \"Bem-vindo ao Acervo Lima\"")

print('Tão feliz em estar aqui')

# Usando aspas diferentes
print ('Ele esta procurando pelo Billy "the Kid"')                

Resultado:

Olá, senhor Alberto
Ele disse, "Bem-vindo ao Acervo Lima"
Tão feliz em estar aqui
Ele esta procurando pelo Billy "the Kid"

Como imprimir o caractere de escape?

Se houver a necessidade de imprimir o caractere de escape (\), então, se o usuário mencioná-lo em um interpretador de string, pensará nele como um caractere de escape e não o imprimirá. Para imprimir o caractere de escape, o usuário deve usar o caractere de escape antes de '\' conforme mostrado no exemplo.

# imprime o caractere de escape
print ("\\ barra invertida")

Resultado:

\ barra invertida

Artigo escrito por Arpit Agarwal, melhorado por tuhinpaul e traduzido por Acervo Lima de Interesting facts about strings in Python | Set 1

Quando usar yield em vez de return em Python?

A declaração de yield suspende a execução da função e envia um valor de volta para o chamador, mas retém o estado suficiente para permitir que a função continue de onde foi interrompida. Quando retomada, a função continua a execução imediatamente após a última execução de yield. Isso permite que seu código produza uma série de valores ao longo do tempo, em vez de computá-los de uma vez e enviá-los de volta como uma lista.

Vejamos com um exemplo:

# Um programa Python simples para demonstrar o funcionamento do yield

# Uma função geradora que produz 1 pela primeira vez,
# na 2 segunda vez e 3 na terceira vez
def simpleGeneratorFun():
    yield 1
    yield 2
    yield 3

for value in simpleGeneratorFun():
    print(value) 

Resultado:

1
2
3

Return envia um valor especificado de volta para seu chamador, enquanto Yield pode produzir uma sequência de valores. Devemos usar o Yield quando queremos iterar em uma sequência, mas não queremos armazenar a sequência inteira na memória.

O Yield é usado em geradores Python. Uma função geradora é definida como uma função normal, mas sempre que precisa gerar um valor, ela o faz com a palavra-chave Yield em vez de return. Se o corpo de um def contiver yield, a função se tornará automaticamente uma função geradora.

# Um programa Python para gerar quadrados de 1
# a 100 usando yield e, portanto, gerando
# Uma função de gerador infinito que imprime o
# próximo número quadrado. Começando com 1
def nextSquare():
    i = 1; 

    # Um loop infinito gerando o quadrado de cada número 
    while True: 
        yield i*i
        i += 1

for num in nextSquare():
    if num > 100:
        break
    print(num)

Resultado:

1
4
9
16
25
36
49
64
81
100

Artigo escrito por Arpit Agarwal, melhorado por julthep e traduzido por Acervo Lima de When to use yield instead of return in Python?

Retornando vários valores em Python

Em Python, podemos retornar vários valores de uma função. A seguir estão maneiras diferentes:

Usando Object: É semelhante a C / C++ e Java, podemos criar uma classe (em C, struct) para conter vários valores e retornar um objeto da classe.

# Um programa Python para retornar vários
# valores de um método usando classe
class Teste:
    def __init__(self):
        self.str = "Acervo Lima"
        self.x = 20

# Essa função retorna um objeto da classe Teste
def fun():
    return Teste() 
 
t = fun()
print(t.str)
print(t.x)

Resultado:

Acervo Lima
20

Usando Tupla: Uma Tupla é uma sequência de itens separados por vírgulas. Ele é criado com ou sem (). As tuplas são imutáveis.

# Um programa Python para retornar vários
# valores de um método usando tupla

# Esta função retorna uma tupla
def fun():
    str = "Acervo Lima"
    x = 20

    return str, x;

str, x = fun()
print(str)
print(x) 

Resultado:

Acervo Lima
20

Usando uma lista: uma lista é como um conjunto de itens criados com colchetes. Eles são diferentes dos arrays, pois podem conter itens de diferentes tipos. As listas são diferentes das tuplas porque são mutáveis.

# Um programa Python para retornar vários
# valores de um método usando lista

# Esta função retorna uma lista
def fun():
    str = "Acervo Lima"
    x = 20

    return [str, x];

list = fun()
print(list)

Resultado:

['Acervo Lima', 20]

Usando um Dicionário: Um Dicionário é semelhante ao hash ou mapa em outras línguas.

# Um programa Python para retornar vários
# valores de um método usando dicionário

# Esta função retorna um dicionário
def fun():
    d = dict();
    d['str'] = "Acervo Lima"
    d['x'] = 20

    return d

d = fun()
print(d)

Resultado:

{'str': 'Acervo Lima', 'x': 20}

Usando a classe de dados (Python 3.7+): No Python 3.7 e superior, a classe de dados pode ser usada para retornar uma classe com métodos exclusivos adicionados automaticamente. O módulo Data Class tem um decorador e funções para adicionar automaticamente métodos especiais gerados, como __init__() e __repr__() nas classes definidas pelo usuário.

from dataclasses import dataclass

@dataclass
class Book_list:
    name: str
    perunit_cost: float
    quantity_available: int = 0

    # Função para calcular o preço total
    def total_cost(self) -> float:
        return self.perunit_cost * self.quantity_available

book = Book_list("Introduction to programming.", 300, 3)
x = book.total_cost()

# mostra o preço total do livro
print(x)

# imprime os detalhes do livro
print(book)

# 900
Book_list(
    name='Python programming.',
    perunit_cost=200,
    quantity_available=3
)

Resultado:

900
Book_list(name='Introduction to programming.', perunit_cost=300, quantity_available=3)

Referência: How do I return multiple values from a function?

Artigo escrito por Shubham Agrawal e traduzido por Acervo Lima de Returning Multiple Values in Python

Python String - split()

O método split() retorna uma lista de strings após quebrar a string dada pelo separador especificado.

Sintaxe: str.split(separador, maxsplit)
Parâmetros:
Separador: este é um delimitador. A string se divide neste separador especificado. Se não for fornecido, qualquer espaço em branco será um separador. maxsplit: é um número, que nos diz para dividir a string no máximo do número de vezes fornecido. Se não for fornecido, não há limite.
Retorna: Retorna uma lista de strings depois de quebrar a string fornecida pelo separador especificado.

CÓDIGO 1:

texto = 'Bem-vindo ao Acervo Lima'

# separa a string nos espaços entre as palavras
print(texto.split())

palavra = 'Bem-vindo, ao, Acervo, Lima'

# separa em ','
print(palavra.split(','))

palavra = 'Bem-vindo: ao: Acervo: Lima'

# separa em ':'
print(palavra.split(':'))

palavra = 'CatBatSatFatOr'

# separa a cada três caracteres
print([palavra[i:i+3] for i in range(0, len(palavra), 3)])

Resultado :

['Bem-vindo', 'ao', 'Acervo', 'Lima']
['Bem-vindo', ' ao', ' Acervo', ' Lima']
['Bem-vindo', ' ao', ' Acervo', ' Lima']
['Cat', 'Bat', 'Sat', 'Fat', 'Or']

CÓDIGO 2

texto = 'Bem-vindo ao Acervo Lima'

# maxsplit: 0
print(texto.split(' ', 0))

# maxsplit: 4
print(texto.split(' ', 4))

# maxsplit: 1
print(texto.split(' ', 1))

Resultado:

['Bem-vindo ao Acervo Lima']
['Bem-vindo', 'ao', 'Acervo', 'Lima']
['Bem-vindo', 'ao Acervo Lima']

Artigo escrito por pawan_asipu e traduzido por Acervo Lima de Python String | split()

Adicionando nova coluna ao DataFrame existente no Pandas

Vamos discutir como adicionar novas colunas ao DataFrame existente no Pandas. Existem várias maneiras de fazermos essa tarefa.

Método #1: Declarando uma nova lista como uma coluna.

# Importa o módulo pandas
import pandas as pd

# Defina um dicionário contendo dados de Alunos
data = {
        'Nome': ['Jai', 'Princi', 'Gaurav', 'Anuj'],
        'Altura': [5.1, 6.2, 5.1, 5.2],
        'Qualificação': ['Msc', 'MA', 'Msc', 'Msc']
        }

# Converta o dicionário em DataFrame
df = pd.DataFrame(data)

# Declare uma lista que deve ser convertida em uma coluna
address = ['Delhi', 'Bangalore', 'Chennai', 'Patna']

# Usando 'Address' como o nome da coluna
# e igualando-o à lista
df['Address'] = address

# observe o resultado
print(df)

Resultado:

     Nome  Altura Qualificação    Address
0     Jai     5.1          Msc      Delhi
1  Princi     6.2           MA  Bangalore
2  Gaurav     5.1          Msc    Chennai
3    Anuj     5.2          Msc      Patna

Observe que o comprimento da sua lista deve corresponder ao comprimento da coluna do índice, caso contrário, ele mostrará um erro.

Método #2: usando DataFrame.insert()

Isso dá a liberdade de adicionar uma coluna em qualquer posição que quisermos e não apenas no final. Ele também fornece opções diferentes para inserir os valores da coluna.

# Importa o módulo pandas
import pandas as pd

# Defina um dicionário contendo dados de Alunos
data = {
        'Nome': ['Jai', 'Princi', 'Gaurav', 'Anuj'],
        'Altura': [5.1, 6.2, 5.1, 5.2],
        'Qualificação': ['Msc', 'MA', 'Msc', 'Msc']
        }

# Converta o dicionário em DataFrame
df = pd.DataFrame(data)

# Usando DataFrame.insert() para adicionar uma coluna
df.insert(2, "Idade", [21, 23, 24, 21], True)

# observe o resultado
print(df)

Resultado:

     Nome  Altura  Idade Qualificação
0     Jai     5.1     21          Msc
1  Princi     6.2     23           MA
2  Gaurav     5.1     24          Msc
3    Anuj     5.2     21          Msc

Método #3: Usando o método Dataframe.assign()

Este método criará um novo dataframe com uma nova coluna adicionada ao antigo dataframe.

# Importa o módulo pandas
import pandas as pd

# Defina um dicionário contendo dados de Alunos
data = {
        'Nome': ['Jai', 'Princi', 'Gaurav', 'Anuj'],
        'Altura': [5.1, 6.2, 5.1, 5.2],
        'Qualificação': ['Msc', 'MA', 'Msc', 'Msc']
        }

# Converta o dicionário em DataFrame
df = pd.DataFrame(data)

# Usando 'endereço' como o nome da coluna e igualando-a à lista
df2 = df.assign(endereço = ['Delhi', 'Bangalore', 'Chennai', 'Patna'])

# observe o resultado
print(df2)

Resultado:

     Nome  Altura Qualificação   endereço
0     Jai     5.1          Msc      Delhi
1  Princi     6.2           MA  Bangalore
2  Gaurav     5.1          Msc    Chennai
3    Anuj     5.2          Msc      Patna

Método #4: usando um dicionário

Podemos usar um dicionário Python para adicionar uma nova coluna no DataFrame do pandas. Use uma coluna existente como os valores-chave e seus respectivos valores serão os valores da nova coluna.

# Importa o módulo pandas
import pandas as pd

# Defina um dicionário contendo dados de Alunos
data = {
        'Nome': ['Jai', 'Princi', 'Gaurav', 'Anuj'],
        'Altura': [5.1, 6.2, 5.1, 5.2],
        'Qualificação': ['Msc', 'MA', 'Msc', 'Msc']
        }

# Converta o dicionário em DataFrame
df = pd.DataFrame(data)

# Defina um dicionário com os valores-chave de
# uma coluna existente e seus respectivos
# pares de valores como os valores para nossa nova coluna.
endereço = {
            'Delhi': 'Jai', 'Bangalore': 'Princi',
            'Patna': 'Gaurav', 'Chennai': 'Anuj'
            }

# Converta o dicionário em DataFrame
df = pd.DataFrame(data)

# Forneça 'Endereço' como o nome da coluna
df['Endereço'] = endereço

# Observe a saída
print(df)

Resultado:

     Nome  Altura Qualificação   Endereço
0     Jai     5.1          Msc      Delhi
1  Princi     6.2           MA  Bangalore
2  Gaurav     5.1          Msc      Patna
3    Anuj     5.2          Msc    Chennai

Artigo escrito por Chaitanya Tyagi e traduzido por Acervo Lima de Adding new column to existing DataFrame in Pandas

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(prompt)
  • raw_input(prompt)

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

# Programa python monstrando
# como usar a função input()

val = input("Entre com um valor: ")
print(val)

Resultado:

Entre com um valor: um valor          
um valor

Como a função input funciona em Python

Código:

num = input("Entre com um número: ")
print(num)
name1 = input("Entre com um nome: ")
print(name1)
  
# Printing type of input value 
print ("tipo de num", type(num)) 
print ("tipo de name", type(name1)) 

Resultado:

Entre com um número: 2
2
Entre com um nome: nome
nome
tipo de num <class 'str'>
tipo de name <class 'str'>

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.

Exemplo:

g = raw_input("Entre com seu nome: ") 
print g

Resultado:

Entre com seu nome: Bob
Bob

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 função raw_input() é encerrada pela tecla enter. Podemos usar raw_input() para inserir dados numéricos também. Nesse caso, usamos typecasting.

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

Calculadora básica usando Python

Crie uma calculadora simples que pode realizar operações aritméticas básicas como adição, subtração, multiplicação ou divisão, dependendo da entrada do usuário.

Funções:

  • O usuário escolhe a operação desejada. As opções 1, 2, 3 e 4 são válidas.
  • Dois números são tomados e uma ramificação if-elif-else é usada para executar uma seção particular.
  • Usando as funções add(), subtract(), multiply() e divide() avalie as respectivas operações.

Exemplo:

Selecione uma operação -
1. Soma
2. Subtração
3. Multiplicação
4. Divisão

Selecione a operação 1, 2, 3, 4 :4
Entre com o primeiro número: 2
Entre com o segundo número: 3
2 / 3 = 0.6666666666666666
# Uma simples calculadora
# Função para somar dois números 
def add(num1, num2):
    return num1 + num2

# Função para subtração 
def subtract(num1, num2):
    return num1 - num2

# Função para multiplica dois números
def multiply(num1, num2):
    return num1 * num2

# Função para divisão
def divide(num1, num2):
    return num1 / num2

print("Selecione uma operação -\n" \
        "1. Soma\n" \
        "2. Subtração\n" \
        "3. Multiplicação\n" \
        "4. Divisão\n")

# Obtendo entradas do usuário
select = int(input("Selecione a operação 1, 2, 3, 4 :")) 

number_1 = int(input("Entre com o primeiro número: "))
number_2 = int(input("Entre com o segundo número: "))

if select == 1:
    print(number_1, "+", number_2, "=", add(number_1, number_2)) 

elif select == 2:
    print(number_1, "-", number_2, "=", subtract(number_1, number_2))

elif select == 3:
    print(number_1, "*", number_2, "=", multiply(number_1, number_2)) 

elif select == 4:
    print(number_1, "/", number_2, "=", divide(number_1, number_2))
else:
    print("Entrada inválida")

Resultado:

Selecione uma operação -
1. Soma
2. Subtração
3. Multiplicação
4. Divisão

Selecione a operação 1, 2, 3, 4 :3
Entre com o primeiro número: 7
Entre com o segundo número: 8
7 * 8 = 56

Artigo escrito por Pushpanjali chauhan e traduzido por Acervo Lima de Basic calculator program using Python

Python if-else

Existem situações na vida real em que precisamos tomar algumas decisões e, com base nessas decisões, decidimos o que devemos fazer a seguir. Situações semelhantes surgem na programação também onde precisamos tomar algumas decisões e com base nessas decisões executaremos o próximo bloco de código.

As declarações de tomada de decisão em linguagens de programação decidem a direção do fluxo de execução do programa. As instruções de tomada de decisão disponíveis em python são:

  • Declaração if
  • Declaração if-else
  • if's aninhados
  • if-elif
  • if em uma linha
  • if-else em uma linha

Declaração if

Declaração if é a declaração de tomada de decisão mais simples. É usado para decidir se uma determinada instrução ou bloco de instruções será executado ou não, ou seja, se uma determinada condição for verdadeira, um bloco de instruções será executado, caso contrário, não.

Sintaxe:

if condição:           
   # bloco de comandos para ser executado
   # se a condição for verdadeira

Aqui, a condição após a avaliação será verdadeira ou falsa. se a instrução aceita valores booleanos - se o valor for verdadeiro, ele executará o bloco de instruções abaixo dele, caso contrário, não. Podemos usar condição com parenteses também.

Como sabemos, python usa indentação para identificar um bloco. Portanto, o bloco sob uma instrução if será identificado conforme mostrado no exemplo abaixo:

if condição:
   declaração1
declaração2

# Aqui, se a condição for verdadeira,
# o bloco if irá considerar apenas a
# declaração1 como estando dentro de seu bloco.
# Declaração if 

i = 10
if (i > 15):
    print("10 é menor que 15")
print ("Não estou dentro do bloco if")

Resultado:

Não estou dentro do bloco if

Como a condição presente na declaração if é falsa. Portanto, o bloco abaixo da instrução if não é executado.

if- else

A declaração if por si só nos diz que se uma condição for verdadeira, ela executará um bloco de declarações e se a condição for falsa, não. Mas e se quisermos fazer outra coisa se a condição for falsa. Aí vem a declaração else. Podemos usar a instrução else com a instrução if para executar um bloco de código quando a condição for falsa.

Sintaxe:

if (condição):
    # Executa se a condição for verdadeira
else:
    # Executa se a condição for falsa
# Declaração if-else
#!/usr/bin/python

i = 20;
if (i < 15):
    print("i é menor que 15")
    print("Estou no bloco if")
else:
    print ("i é maior que 15")
    print ("Estou no bloco else")
print("Não estou no bloco if e nem no else")

Resultado:

i é maior que 15
Estou no bloco else
Não estou no bloco if e nem no else

O bloco de código após a instrução else é executado como a condição presente na instrução if é falsa após a chamada da instrução que não está em bloco (sem espaços).

if's aninhados

Um if aninhado é uma instrução if que é o destino de outra instrução if. As instruções if aninhadas significam uma instrução if dentro de outra instrução if. Sim, Python nos permite aninhar instruções if dentro de instruções if. Ou seja, podemos colocar uma instrução if dentro de outra instrução if.

Sintaxe:

if (condição1):
   # Executa quando a condição é verdadeira
   if (condição2): 
      # Executa quando a condiçã2 é verdadeira
   # o segundo bloco if termina aqui
# o primeira bloco if termina aqui
# Demonstração de if's aninhados
#!/usr/bin/python
i = 10
if (i == 10):
    #  Primeira declaração 
    if (i < 15): 
        print("i é menor que 15") 
    # Declaração if aninhada
    # Vai ser executada apenas se a primeira
    # declaração if for verdadeira
    if (i < 12):
        print("i é menor que 12 também")
    else:
        print("i é maior que quinze 15")

Resultado:

i é menor que 15
i é menor que 12 também

if-elif-else

Aqui, um usuário pode decidir entre várias opções. As instruções if são executadas de cima para baixo. Assim que uma das condições que controlam o if for verdadeira, a instrução associada àquele if é executada e o resto da escada é ignorado. Se nenhuma das condições for verdadeira, a instrução else final será executada.

Sintaxe:

if (condição):
    # declaração
elif (condição):
    # declaração
.
.
else:
    # declaração

Exemplo:

# Demonstração do uso de if-elif-else
#!/usr/bin/python

i = 20
if (i == 10):
    print ("i é 10")
elif (i == 15):
    print ("i é 15")
elif (i == 20):
    print ("i é 20")
else:
    print ("i é não esta presente")

Resultado:

i é 20

if em uma linha

Sempre que houver apenas uma única instrução a ser executada dentro do bloco if, uma abreviatura if pode ser usada. A instrução pode ser colocada na mesma linha da instrução if.

Sintaxe:

if condição: declaração

Exemplo:

# demonstrando o uso do if numa linha
i = 10
if i < 15: print("i é menor que 15") 

Resultado:

i é menor que 15

if-else em uma linha

Isso pode ser usado para escrever as instruções if-else em uma única linha, onde há apenas uma instrução a ser executada no bloco if e uma no else.

Sintaxe:

declaração_quando_True if condição else declaração_quando_False

Exemplo:

# if-else em uma linha
i = 10
print(True) if i < 15 else print(False) 

Resultado:

True

Artigo escrito por DevanshuAgarwal e traduzido por Acervo Lima de Python if else