Como usar operadores Python
Operadores Python ajudam você a trabalhar com valores e operandos. Eles também auxiliam a alterá-los e ligá-los uns aos outros. Operadores podem ser lógicos ou aritméticos.
O que são operadores Python e como eles funcionam?
Um operador é um caractere de uma operação. Operadores costumam ser usados para ligar diversos operandos, com a finalidade de formar um novo valor. A aplicação de um operador a um único operando faz com que este seja modificado.
O exemplo mais simples de operadores Python deve ser, provavelmente, o processo de somar dois números por meio da utilização de um operador de adição, representado pelo símbolo de mais, posicionado entre dois números. O Python avalia a expressão e retorna o valor correspondente:
1 + 1
pythonO Python é especial, porque palavras curtas em inglês, como and (e), or (ou), is (é), not (não) e in (em), são usadas como operadores, além dos caracteres já conhecidos. A combinação de operadores e operandos resulta em uma expressão, como:
1 + 1 == 2
pythonQuais são os operadores Python?
A linguagem Python compreende diversas classes de operadores. Eles operam com diferentes tipos de operandos e retornam um determinado tipo de resultado. A tabela abaixo dá um panorama dos diferentes tipos de operadores Python:
Classes de operadores Python | Função | Operandos | Resultado | Panorama |
---|---|---|---|---|
Operadores aritméticos | Combinar dois números para formar um novo número | Números | Números | +, -, , /, //, %, *, @ |
Operadores de comparação | Comparar duas expressões | Expressões | Booleano | <, >, ==, !=, <=, >= |
Operadores lógicos | Combinar expressões em um contexto booleano | Expressões | Última expressão avaliada / Booleano | and, or, not |
Operadores bitwise | Manipular inteiros como sequências binárias | Números | Número | <<, >>, &, |, ^, ~ |
Operadores de atribuição | Atribuir valor a um nome | Lvalue, Rvalue |
|
=, :=, +=, -=, *= etc. |
Operadores de identidade | Determinar se dois nomes se referem ao mesmo objeto | Objetos | Booleano | is, is not |
Operador condicional | Retornar um de dois valores, a depender da condição | Expressão, condição, alternativa | Expressão / Alternativa | … if… else … |
Operadores de conjunto | Ligar dois conjuntos / comparar conjuntos | Quantidades | Quantidade / Booleano | &, |, ^, -, <, >, <=, >= |
Operadores de associação | Testar se um iterável contém um objeto específico | Objeto, Iterável | Booleano | in, not in |
Operador de concatenação | Encadear sequências | Strings / Listas / Tuplas | String / Lista / Tupla | + |
Operadores de indexação e fatiamento | Retornar um ou mais elementos de um iterável | Iterável, Índice / Fatia | String / Lista / Tupla | [], [::] |
Operadores são classificados de acordo com sua aridade, juntamente com o tipo de operandos e o valor retornado. O termo diz respeito à quantidade de operandos que um operador combina. Na maioria dos casos, operadores binários, com dois operandos, são usados. Também há operadores unários, com apenas um operando, bem como operadores ternários, que conectam três operandos:
Aridade do operador | Número de operandos | Exemplo |
---|---|---|
Unário | Um operando | not single_value |
Binário | Dois operandos | left_operand + right_operand |
Ternário | Três operandos | some_value if condition else other_value |
O que é precedência de operadores?
Entender o que é precedência de operadores é fundamental quando se aprende sobre operadores Python. O conceito vem da aritmética: PEMDAS, que indica a sequência correta de etapas a serem executadas em um cálculo. Recordemos: a expressão 3 8 + 2 deve ser interpretada como (3 8) + 2, e não como 3 (8 + 2). Assim como ocorre com os sinais de adição e de multiplicação, existem regras de precedência que regem todos os operadores Python. Observe, abaixo, um exemplo de expressão com os operadores lógicos and*,* or *e not:
if is_user and is_user_logged_in or is_admin and not login_blocked:
...
pythonSem conhecer as regras de precedência dos operadores Python, é impossível entender como os termos individuais devem se relacionar. A situação fica mais complicada quando múltiplos operadores são usados em uma só expressão. Em geral, o melhor a se fazer é não depender de uma compreensão perfeita das regras implícitas. Ao invés disso, explicite, com o uso de parênteses, como os termos de uma expressão devem se relacionar:
if (is_user and is_user_logged_in) or (is_admin and not login_blocked):
...
pythonOs mesmos termos, agrupados de um jeito diferente, resultam em uma declaração também diferente:
if (is_user and is_user_logged_in or is_admin) and not login_blocked:
...
pythonO que é sobrecarga de operadores, métodos Dunder e função operator em Python?
Alguns operadores Python são usados para mais de uma operação. Um bom exemplo é o sinal de soma (mais): ele funciona tanto como operador de adição para números, quanto como operador de concatenação para sequências de strings e listas. Podemos somar dois números com o operador de adição:
8 + 3 == 11
pythonTambém podemos concatenar duas strings usando o mesmo operador:
"Walter" + "White" == "WalterWhite"
pythonAinda é possível concatenar listas com esse operador:
['Jack', 'Jim'] + ['John'] == ['Jack', 'Jim', 'John']
pythonA multifuncionalidade do sinal de soma como operador reflete um conceito comum na ciência da computação: sobrecarga de operadores. Você já deve ter ouvido falar nesta expressão, que se refere a um único operador que desempenha operações diferentes, dependendo do tipo de dado do operando.
Em Python, sobrecarga de operadores se dá desta forma: um operador e seus operandos são interpretados como referências à função correspondente. O método Dunder do primeiro operando é habilitado e recebe os outros operandos como argumentos. “Dunder” abrevia o termo double underscore (sublinhado duplo, em português). Assim sendo, o operador de soma corresponde ao método Dunder __add__(). Objetos que implementam um método __add__() podem ser conectados usando o operador de soma. O que exatamente constitui a ligação depende do objeto em questão.
Além dos métodos Dunder, o módulo operator contém funções que incluem funcionalidades de operadores Python. Por exemplo, operator.add(a, b) habilita o método Dunder a.__add__(b), que é equivalente à expressão a + b. Na medida do possível, listaremos a função operator de cada operação apresentada por este artigo. O nome da função operator corresponde ao nome do respectivo método Dunder. Você pode usar a tabela abaixo como referência para implementar sua própria funcionalidade:
Operador Python | Função operator | Método Dunder |
---|---|---|
a + b | operator.add(a, b) | a.add(b) |
Operadores usam a notação infixa, que insere o operador entre os operandos. Já funções usam a notação prefixa. Ambas as notações são equivalentes:
Notação | Uso | Exemplo |
---|---|---|
Infixa | Operadores | a + b |
Prefixa | Funções | + a b / add(a, b) |
Acompanhe o exemplo abaixo. Nele, definimos dois números e os adicionamos ao operador, à função operator e ao método Dunder correspondente:
import operator
a = 42
b = 69
assert a + b == operator.add(a, b) == a.__add__(b)
pythonExpressões mais complexas também podem ser escritas com funções operator. A combinação dos operadores Python de soma e de igualdade em uma notação prefixa funciona da seguinte maneira:
import operator
assert 'Py' + 'thon' == 'Python'
assert operator.eq(operator.add('Py', 'thon'), 'Python')
pythonPanorama de operadores Python
Conheça, agora, os 11 tipos diferentes de operadores Python.
Operadores aritméticos
Operadores Python aritméticos atuam com números, para criar um novo número. Todos constituem operadores binários, com exceção dos símbolos de “mais” e de “menos”, que são unários, como mostra a tabela:
Operador Python | Função | Função operator | Exemplo |
---|---|---|---|
+ | Adição / “mais” unário | add(a, b) / pos(a) | 5 + 3 == 8 / +8 == 4 + 4 |
- | Subtração / “menos” unário | sub(a, b) / neg(a) | 7 - 2 == 5 / -4 == 2 - 6 |
* | Multiplicação | mul(a, b) | 2* 3 == 6 |
/ | Divisão (real) | truediv(a, b) | 8 / 2 == 4.0, 7 / 2 == 3.5 |
// | Divisão inteira (com arredondamento para o próximo inteiro mais baixo) | floordiv(a, b) | 8 // 2 == 4, 7 // 2 == 3 |
% | Módulo: resto de uma divisão de número inteiro | mod(a, b) | 8 % 2 == 0, 7 % 2 == 1 |
** | Exponenciação | pow(a, b) | 2** 3 == 8, 10 ** -1 == 0.1 |
@ | Multiplicação de matriz | matmul(a, b) | - |
O operador módulo é usado por padrão para determinar se um número é par, já que um número par dividido por dois tem resto zero. Observe uma função Python com o operador módulo:
def is_even(number):
return number % 2 == 0
assert is_even(8) and not is_even(7)
pythonMultiplicações de matriz requerem o uso de um pacote, como NumPy.
Operadores de comparação
Operadores Python de comparação indicam como dois elementos podem ser ordenados entre eles. O valor resultante é booleano e costuma ser usado para organizar algoritmos:
Operador Python | Função | Função operator | Exemplo |
---|---|---|---|
< | Menor que | lt(a, b) | 3 < 1, ‘a’ < ‘z’ |
> | Maior que | gt(a, b) | 4 > 2, ‘z’ > ‘a’ |
== | Igual a | eq(a, b) | ‘a’ == ‘a’ |
!= | Diferente de | ne(a, b) | 1 ! = 2, ‘Jim’ != ‘Jack’ |
<= | Menor ou igual a | le(a, b) | 9 <= 10, 10 <= 10 |
>= | Maior ou igual a | ge(a, b) | 11 >= 10, 10 >= 10 |
Operadores lógicos
Os operadores Python lógicos and e or ligam múltiplos operandos, seguindo a lógica booleana. Como resultado, os dois operadores retornam o último objeto avaliado. O operador lógico not interpreta um objeto em um contexto booleano e nega seu valor verdadeiro:
Operador Python | Função | Função operator | Exemplo |
---|---|---|---|
and | “AND” lógico | sem correspondência direta | True and False == False, ‘name’ and … == … |
or | “OR” lógico | sem correspondência direta | False or True == True, a = ‘’ or ‘Default’; assert a == ‘Default’. |
not | Negação | not_(a) | not True == False |
Visualizar o efeito das operações lógicas em uma tabela pode ajudar na compreensão. Analise, abaixo, a lógica AND:
and | True | False |
---|---|---|
True | True | False |
False | False | False |
e a lógica OR:
or | True | False |
---|---|---|
True | True | True |
False | True | False |
Operandos de operadores Python booleanos não se limitam a variáveis booleanas. Isso quer dizer que qualquer objeto de Python pode ser interpretado em um contexto booleano. Os objetos a seguir são avaliados como falsos no contexto booleano e, portanto, chamados de falsy:
Objeto | Explicação |
---|---|
False, None | Constantes falsas (False), de acordo com a definição |
0, 0.0, Decimal(0), Fraction(0, 1), etc. | Número que representa zero |
‘’, (), [], {}, set(), range(0), etc. | Sequência ou coleção vazia |
Operadores bitwise
Operadores Python bitwise operam com inteiros, que são interpretados como sequências de bits. Todos são operadores binários, com exceção do operador bitwise NOT:
Operador Python | Função | Função operator | Exemplo |
---|---|---|---|
<< | Deslocar sequência de bits para a esquerda | lshift(a, b) | 5 << 3 == 5 2 * 3 |
>> | Deslocar sequência de bits para a direita | rshift(a, b) | 1 >> 1 == 0, 8 >> 1 == 4 |
& | Combinar duas sequências de bits com AND | and_(a, b) | `` |
| | Concatenar duas sequências de bits com OR | or_(a, b) | `` |
^ | Ligar duas sequências de bits com XOR | xor(a, b) | `` |
~ | Inverter a sequência de bits com NOT | invert(a) | `` |
Operadores bitwise são adequados para operações matemáticas otimizadas. O deslocamento para a esquerda corresponde a uma multiplicação por uma potência de dois:
Expressão | 23 = 8 | 22 = 4 | 21 = 2 | 20 = 1 | Decimal |
---|---|---|---|---|---|
b = 6 | 0 | 1 | 1 | 0 | 6 |
b << 1 | 1 | 1 | 0 | 0 | 12 |
b >> 1 | 0 | 0 | 1 | 1 | 3 |
Criamos uma tabela de bits individuais para ilustrarmos as operações bitwise AND, OR e NOT. Elas são aplicadas a um número em representação binária, usando uma máscara de bits:
Expressão | 23 = 8 | 22 = 4 | 21 = 2 | 20 = 1 | Decimal |
---|---|---|---|---|---|
bits = 6 | 0 | 1 | 1 | 0 | 6 |
mask = 5 | 0 | 1 | 0 | 1 | 5 |
bits & mask | 0 | 1 | 0 | 0 | 4 |
bits | mask | 0 | 1 | 1 | 1 | 7 |
bits ^ mask | 0 | 0 | 1 | 1 | 3 |
O operador bitwise NOT inverte a sequência de bits. Ele transforma todo 1 em 0 e vice-versa. Além disso, o sinal do número também é invertido:
Expressão | 23 = 8 | 22 = 4 | 21 = 2 | 20 = 1 | Decimal |
---|---|---|---|---|---|
b = 6 | 0 | 1 | 1 | 0 | 6 |
~ b | 1 | 0 | 0 | 1 | -7 |
Operadores de atribuição
Em grande parte das linguagens de programação, atribuições são declarações básicas. Operadores Python de atribuição atribuem um valor ao nome de uma variável. Existe, ainda, o novo operador walrus, que permite criar uma atribuição dentro de uma expressão. Também há diversas declarações de atribuição estendidas, que combinam uma atribuição com outra operação:
Operador Python | Função | Função operator | Exemplo |
---|---|---|---|
= | Declaração de atribuição | sem correspondência direta | name = ‘Walter’ |
:= | Expressão de atribuição (operador walrus) | sem correspondência direta | [ half for x in range(10) if (half := x / 2) < 5 ] |
+= | Atribuição de adição avançada | iadd(a, b) | x = 1; x += 4; assert x == 5 |
A linguagem Python reconhece operadores de atribuição estendidos para operações bitwise e aritméticas. Não os listaremos individualmente aqui. Exibiremos apenas o padrão geral, usando a atribuição estendida de concatenação como exemplo. Primeiramente, mostramos um código que anexa uma nova parte a uma string existente:
name = 'Walter'
name = name + 'White'
assert name == 'WalterWhite'
pythonUm exemplo equivalente usando o operador estendido de concatenação += produz o mesmo resultado, mas seu código é mais conciso e expressivo:
name = 'Walter'
name += 'White'
assert name == 'WalterWhite'
pythonOperadores de identidade
O operador Python is testa se duas variáveis se referem ao mesmo objeto armazenado. A identidade do objeto contrasta com a igualdade do objeto, que é testada pelo operador de comparação ==. Em Python, is corresponde ao operador de igualdade estrita ===, do JavaScript. Phyton também tem um teste de identidade negada, usando o operador is not:
Operador Python | Função | Função operator | Exemplo |
---|---|---|---|
is | Teste de identidade | is_(a, b) | a = 42; b = a; assert a is b |
is not | Teste de identidade negado | is_not(a, b) | assert [42] is not [42] |
Acompanhe nossos exemplos abaixo. Criamos uma referência para um objeto armazenado. Depois, criamos outra referência com um alias. O operador retorna como verdadeiro quando as duas variáveis apontam para o mesmo objeto armazenado:
# assign value to name
a = [42]
# reference existing object
b = a
# if this holds
assert a is b
# so will this
assert a == b
pythonNo exemplo a seguir, criamos duas referências na memória para objetos independentes. Embora os objetos sejam os mesmos, suas identidades são distintas. Por isso, o operador retorna como falso:
# assign the same value to different names
a = [42]
b = [42]
# `a`, `b` are two different objects
assert a is not b
# that contain the same value
assert a == b
pythonOperador condicional
O operador Python condicional pode ser usado no lugar dos termos if-else. Ele é bastante utilizado para diferenciar dois valores possíveis em atribuições e é conhecido como um operador ternário, já que combina uma condição e duas expressões.
Operador Python | Função | Função operator | Exemplo |
---|---|---|---|
… if … else … | Expressão condicional | sem correspondência direta | name = ‘Jim’ if age == 42 else ‘Jack’ |
Primeiramente, observe um exemplo usando a declaração if-else no Python. O código a seguir define Celsius ou Fahrenheit como unidade de medida de temperatura, a depender do sistema escolhido:
if system == 'metric':
unit = 'C'
else:
unit = 'F
pythonO código pode ser simplificado a uma única atribuição, por meio de um operador condicional:
unit = 'C' if system == 'metric' else 'F'.
pythonOperadores de conjunto
Além de strings, tuplas, listas e dicionários, o Python oferece suporte padrão a conjuntos como um tipo composto de dados. A sobrecarga de operadores é definida para as operações usuais com conjuntos:
Operador Python | Função | Função operator | Exemplo |
---|---|---|---|
& | União de dois conjuntos | and_(a, b) | {‘a’, ‘b’} & {‘a’, ‘c’} == {‘a’} |
| | Interseção de dois conjuntos | or_(a, b) | {‘a’, ‘b’} | {‘a’, ‘c’} == {‘a’, ‘c’, ‘b’} |
^ | Diferença de forma simétrica de dois conjuntos | xor(a, b) | {‘a’, ‘b’} ^ {‘a’, ‘c’} == {‘c’, ‘b’} |
- | Diferença de dois conjuntos | sub(a, b) | {‘a’, ‘b’} - {‘a’} == {‘b’} |
> | Testa se a quantidade é um superconjunto verdadeiro | gt(a, b) | assert {‘a’, ‘b’} > {‘a’} |
>= | Testa se o conjunto é um superconjunto | ge(a, b) | assert {‘a’} >= {‘a’} |
< | Testa se a quantidade é um subconjunto verdadeiro | lt(a, b) | assert {‘a’} < {‘a’, ‘b’} |
<= | Testa se a quantidade é um subconjunto | le(a, b) | assert {‘a’} <= {‘a’} |
Operadores de associação
Os operadores Python de associação in e not in indicam se um objeto está incluído em uma coleção.
Operador Python | Função | Função operator | Exemplo |
---|---|---|---|
in | Testa se um objeto está incluído em um iterável | contains(a, b) | ‘y’ in ‘Python’ |
not in | Negação do operador in | not contains(a, b) | ‘x’ not in ‘Python’ |
Operadores de associação trabalham com iteráveis e realizam uma verificação de igualdade para determinar se o objeto em foco está presente na coleção:
'Py' in 'Python'
'Px' not in 'Python'
'Jack' in ['Jim', 'Jack']
pythonA utilização do operador in facilita a escrita de códigos da seguinte forma:
def my_in(target, collection):
for element in collection:
if element == target:
return true
return False
# test
word = 'Python'
letter = 'y'
assert (my_in(letter, word)) == (letter in word)
pythonOperador de concatenação
Operadores Python de concatenação são usados para concatenar sequências do mesmo tipo. O símbolo do operador é o sinal de mais.
Operador Python | Função | Função operator | Exemplo |
---|---|---|---|
+ | Liga duas sequências | add(a, b) | [‘Jim’] + [‘Jack’, ‘John’] |
Observe os exemplos a seguir. No primeiro, concatenamos duas strings, duas listas e duas tuplas:
assert "Walter" + "White" == 'WalterWhite'
assert ['a', 'b'] + ['c'] == ['a', 'b', 'c']
assert ('q', 'r') + ('s', 't') == ('q', 'r', 's', 't')
pythonPython é usado como linguagem de programação web. Assim sendo, operadores de concatenação podem ser usados, por exemplo, para criar tags HTML:
site_title = 'Bem-vindo'
print('<h1>' + site_title + '</h1>')
pythonOperadores de concatenação são diferentes em Python e PHP. O PHP usa o ponto final (“.”) como símbolo. Segue, abaixo, exemplo em PHP:
$siteTitle = 'Bem-vindo';
echo '<h1>' . $siteTitle . '</h1>';
phpOperadores de indexação e fatiamento
O operador Python de indexação é usado para extrair um elemento específico de uma coleção, ao passo que o operador de fatiamento é usado para extrair uma subsequência.
Operador Python | Função | Função operator | Exemplo |
---|---|---|---|
iterable[index] | Retorna o elemento de um iterável localizado sob o index | getitem(iterable, index) | ‘Python’[1] == ‘y’ |
sequence[start:stop:step] | Retorna uma fatia (slice) de uma sequência | getitem(iterable, slice(start, stop, step)) | ‘Python’[0:1] == ‘Py’, ‘Python’[0:-1:2] == ‘Pto’ |
Operadores Python de indexação e fatiamento recorrem ao método Dunder __getitem__(), por meio de um index numérico ou de uma fatia (slice) do objeto:
names = ['Jim', 'Jack', 'John']
names[0] == names.\_\_getitem\_\_(0)
names[0:2] == names.\_\_getitem\_\_(slice(0, 2))
pythonO operador de fatiamento é prático, pois permite extrair uma subsequência sem que seja necessário o uso de um Python loop for ou de um Python loop while. Isso permite que programadores escrevam um código mais conciso. Observe:
word = 'Python'
start, stop, step = 0, 5, 2
index, substring = start, ''
while index in range(start, stop, step):
substring += word[index]
index += step
# test
assert substring == word[start:stop:step]
python