+=
,-=
,*=
,/=
,%=
.float()
, que converte de str
para float
./
e //
e como %
se comporta com float
.if-elif-else
.bool
;True
e False
;and
, or
e not
;Antes de sua aula síncrona desta semana, estude os conteúdos abaixo e os materiais recomendados e tente resolver os exercícios. Os assuntos e exercícios serão discutidos pelo(a) professor(a) na aula.
Operador | Exemplo | É equivalente a: |
---|---|---|
*= |
x *= 5 |
x = x * 5 |
/= |
x /= 5 |
x = x / 5 |
%= |
x %= 5 |
x = x % 5 |
+= |
x += 5 |
x = x + 5 |
-= |
x -= 5 |
x = x - 5 |
Dados dois inteiros x
e y
, indicar se eles
são iguais ou qual é o maior entre eles.
Na solução abaixo, isolamos o caso em que x
é estritamente
menor do que y
no primeiro if
. Na sequência
(no corpo do else
), temos dois casos remanescentes, isto é,
ou x
é o maior dos valores ou eles são iguais. Para
distinguir entre esses dois casos podemos usar um segundo comando
condicional dentro do primeiro else
.
if x < y : print("x é menor do que y.") else: if x > y : print("x é maior do que y.") else: print("x e y são iguais.")
O mesmo efeito pode ser obtido considerando a construção if-elif-else
.
if x < y : print("x é menor do que y.") elif x > y : print("x é maior do que y.") else: print("x e y são iguais.")
Python possui 3 operadores chamados lógicos, que fazem operações
com valores booleanos (True
e False
):
Os operadores lógicos and
e or
são
operadores binários (necessitam de dois operandos, ou seja, dois valores
para operar). Eles são usados para combinar condições simples (ex: saída
de operadores relacionais) ou o resultado de outros operadores lógicos, de
modo a criar operações lógicas mais complexas. O operador not
('não/negação' em português) é um operador unário. Seu resultado é sempre
o inverso (a negação) do operando.
Sejam exp1
e exp2
expressões resultando em
valores booleanos (True
ou False
), temos então:
As tabelas abaixo mostram os resultados dos três operadores lógicos
Python para todas possíveis combinações de seus valores de entrada.
A |
B |
A and B |
A or B |
---|---|---|---|
False |
False |
False |
False |
False |
True |
False |
True |
True |
False |
False |
True |
True |
True |
True |
True |
A |
not A |
---|---|
False |
True |
True |
False |
Solução 1: Sem o uso de operadores lógicos
if a > b: if a > c: print("a é o maior") else: print("c é o maior") else: if b > c: print("b é o maior") else: print("c é o maior")
Solução 2: Solução mais compacta com o uso de operadores lógicos
if a > b and a > c : print("a é o maior") elif b > c : print("b é o maior") else: print("c é o maior")
Propriedades Comutativas | A and B = B and A |
A or B = B or A |
---|---|---|
Propriedades Distributivas | A and (B or C) = (A and B) or (A and C) |
A or (B and C) = (A or B) and (A or C) |
Propriedades Associativas | (A or B) or C = A or (B or C) |
(A and B) and C = A and (B and C) |
Propriedades Idempotentes | A and A = A |
A or A = A |
Dupla Negação | not not A = A |
|
Elementos Absorventes | A or True = True |
A and False = False |
Elementos Neutros | A or False = A |
A and True = A |
Leis de De Morgan | not (A or B) = (not A) and (not B) |
not (A and B) = (not A) or (not B) |
Abaixo é apresentado um exemplo de manipulação de uma expressão, usando
as propriedades acima listadas, de modo a trocar um operador or
por um operador and
.
(x < 3) or (y == 0)
Podemos aplicar a dupla negação sem alterar seu resultado:
not not ((x < 3) or (y == 0))
Podemos agora trocar o operador or
pelo operador and
,
aplicando a "Leis de De Morgan":
not (not (x < 3) and not (y == 0))
Finalmente, podemos então simplificar a expressão, trocando os operadores relacionais negados por operadores relacionais complementares:
not (x >= 3 and y != 0)
and
se escreve como &&
e o operador lógico or
como ||
.
Em linguagem C, os valores booleanos False
e True
são definidos como os valores numéricos 0 e 1, respectivamente. Isso
significa que o mesmo efeito do operador lógico and
pode
ser obtido em C através de um simples produto, isto é, A
&& B
pode ser obtido como A * B
. Porém,
observe que a multiplicação possui maior nível de precedência, o que
pode gerar alterações na ordem de execução no caso de expressões mais
complexas, consequentemente levando a um resultado diferente do
esperado. Já no caso do operador lógico or
temos que A
|| B
pode ter o seu efeito reproduzido pela expressão A+B-A*B
.
No Python 3, o tipo bool
de dados booleanos é uma
subclasse dos inteiros. Logo, no Python 3, os valores booleanos False
e True
se comportam como os valores 0 e 1,
respectivamente, em quase todos os contextos, a exceção é que, quando
convertidos em uma string, as strings "False" ou "True" são retornadas,
respectivamente. Experimente digitar no prompt (>>>) do Python
shell os comandos abaixo:
>>> 1 == True
True
>>> 0 == True
False
>>> 0 == False
True
>>> 1 == False
False
>>> str(1)
'1'
>>> str(True)
'True'
>>> str(0)
'0'
>>> str(False)
'False'
Solução 1: Sem o uso de operadores lógicos
# Primeira data. d1 = int(input("Dia: ")) m1 = int(input("Mês: ")) a1 = int(input("Ano: ")) # Segunda data. d2 = int(input("Dia: ")) m2 = int(input("Mês: ")) a2 = int(input("Ano: ")) if a1 > a2: print("Data1 é maior!") elif a1 == a2: if m1 > m2: print("Data1 é maior!") elif m1 == m2: if d1 > d2: print("Data1 é maior!") elif d1 == d2: print("Datas são iguais!") else: print("Data2 é maior!") else: print("Data2 é maior!") else: print("Data2 é maior!")
Solução 2: Solução mais compacta com o uso de operadores lógicos
# Primeira data. d1 = int(input("Dia: ")) m1 = int(input("Mês: ")) a1 = int(input("Ano: ")) # Segunda data. d2 = int(input("Dia: ")) m2 = int(input("Mês: ")) a2 = int(input("Ano: ")) if a1>a2 or (a1==a2 and m1>m2) or (a1==a2 and m1==m2 and d1>d2): print("Data1 é maior!") elif a1==a2 and m1==m2 and d1==d2: print("Datas são iguais!") else: print("Data2 é maior!")
Solução 3:
Segundo a propriedade distributiva
da álgebra booleana temos:
expr1 and (expr2 or expr3) = (expr1 and expr2) or (expr1 and expr3)Logo, uma outra solução pode ser obtida colocando a condição a1==a2 em evidência:
# Primeira data. d1 = int(input("Dia: ")) m1 = int(input("Mês: ")) a1 = int(input("Ano: ")) # Segunda data. d2 = int(input("Dia: ")) m2 = int(input("Mês: ")) a2 = int(input("Ano: ")) if a1>a2 or (a1==a2 and (m1>m2 or (m1==m2 and d1>d2))): print("Data1 é maior!") elif a1==a2 and m1==m2 and d1==d2: print("Datas são iguais!") else: print("Data2 é maior!")
Solução 1:
Uma solução usando operadores lógicos:
n = int(input("Digite n: ")) rec = 0 i = 1 while i <= n: nota = float(input("Digite uma nota: ")) if 3.0 <= nota and nota < 5.0: rec = rec + 1 i = i + 1 print(rec,"alunos ficaram de recuperação")Do ponto de vista gráfico, usando a notação de conjuntos de intervalos na reta dos reais, temos:
Observe que graficamente o operador lógico "and
"
possui o efeito de intersecção dos conjuntos.
Solução 2:
Uma segunda solução sem usar operadores lógicos:
n = int(input("Digite n: ")) rec = 0 i = 1 while i <= n: nota = float(input("Digite uma nota: ")) if nota >= 3.0: if nota < 5.0: rec = rec + 1 i = i + 1 print(rec,"alunos ficaram de recuperação")
Solução 3:
O Python ainda permite uma terceira solução, na qual o intervalo numérico é especificado de modo mais similar a nossa linguagem, usando operadores de comparação de forma encadeada:
n = int(input("Digite n: ")) rec = 0 i = 1 while i <= n: nota = float(input("Digite uma nota: ")) if 3.0 <= nota < 5.0: rec = rec + 1 i = i + 1 print(rec,"alunos ficaram de recuperação")No entanto, essa versão não é recomendada por não possuir um padrão equivalente em outras linguagens, o que pode gerar erros ao transcrever a solução para outras linguagens. Um exemplo desse erro no caso da linguagem C é explicado no quadro de curiosidades abaixo.
30 <= nota < 50
para testar se a nota está no intervalo de recuperação não produz o efeito desejado. No entanto, ela não gera um erro de sintaxe e sim um erro de lógica, sendo, portanto, mais difícil de localizar e corrigir.#include <stdio.h> int main(){ float nota; int rec; nota = 8.0; rec = 3.0 <= nota < 5.0; if(rec) printf("Ficou de recuperação!\n"); return 0; }Vamos analisar o comando
rec = 3.0 <= nota < 5.0;
da sétima linha do código acima. Com exceção do ponto e vírgula presente no final do comando,
que faz parte da sintaxe da linguagem C, o resto da linha é praticamente idêntico a um código em Python.
Em linguagem C, os operadores relacionais são operadores binários, que operam sobre dois operandos e que produzem como saída 0 ou 1, representando False
ou True
, respectivamente.
Como na sétima linha do código temos
dois operadores relacionais (<=
e <
) que possuem o mesmo nível de precedência, eles são executados
da esquerda para a direita.
Portanto, primeiramente executamos o operador "Menor ou igual a" (<=
), comparando 3.0 com o valor 8.0 em nota
, o que produzirá 1 (verdadeiro). Esse valor resultante 1
será então comparado pelo operador <
com o 5.0,
produzindo 1 (verdadeiro) como saída. Ou seja, o aluno com nota 8.0
será considerado indevidamente como estando de recuperação, segundo o código acima. Portanto, para testar intervalos em C,
precisamos necessariamente do uso do operador lógico "and" (que em C é escrito como &&).
Para o exemplo acima, a construção correta em C seria:
rec = 3.0 <= nota && nota < 5.0;
0 2 3 4 6 8
# dados de entrada print("Cálculo dos n primeiros múltiplos de i ou de j") n = int(input("Digite n: ")) i = int(input("Digite i: ")) j = int(input("Digite j: ")) cont = 0 #conta quantos múltiplos foram impressos. cm = 0 #candidato a múltiplo. while cont < n: if cm%i == 0 or cm%j == 0: print(cm) cont += 1 cm += 1Segunda solução: Mais elaborada. Faz menos iterações que a anterior. A cada iteração imprime um múltiplo de i ou j.
# dados de entrada print("Cálculo dos n primeiros múltiplos de i ou de j") n = int(input("Digite n: ")) i = int(input("Digite i: ")) j = int(input("Digite j: ")) multi = 0 # múltiplos de i multj = 0 # múltiplos de j cont = 0 # conta quantos múltiplo foram impressos while cont < n: if multi < multj: print(multi) multi += i elif multj < multi: print(multj) multj += j else: # multi == multj print(multj) multi += i multj += j cont += 1