sábado, 5 de dezembro de 2020

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