Interpret Ad or Python
Interpret Ad or Python
Monty Python foi um grupo cômico britânico muito bom. Eu (o mais experiente
dos autores) particularmente gostava muito dos seus filmes, pelo menos aqueles
que chegavam ao Brasil como:
28
Capítulo 8
O interpretador Python
8.1 Números
Inicialmente, vamos pensar no interpretador como uma simples calculadora, à
qual fornecemos uma expressão e ela nos fornece o resultado. Por exemplo,
ao digitar a expressão “2 + 2” seguida da tecla Enter, o interpretador Python
responde com o resultado dessa soma.
★ ✥
>>> 2 + 2
4
>>>
✧ ✦
32
CAPÍTULO 8. O INTERPRETADOR PYTHON 33
✬ ✩
>>> 2 * 3 + 5
11
>>> 2 + 3 * 5
17
>>>
✫ ✪
>>> 2 * (3 + 5)
16
>>> (2 + 3) * 5
25
>>> (2 + 3) * (8 - 2)
30
>>> (2 + 3) * ((8 - 2) / (4 - 13))
-3.333333333333333
>>>
✫ ✪
Se escrevermos alguma coisa que não seja válida, ou seja, que o interpreta-
dor não entenda como um comando válido, a resposta apresentada vai ser um
mensagem de erro, tentando indicar o que fizemos de errado.
✬ ✩
>>> 2 * 3 +
File "<stdin>", line 1
2 * 3 +
^
SyntaxError: invalid syntax
>>>
✫ ✪
A primeira linha, por enquanto não nos interessa. As duas seguintes mostram
o ponto do comando onde o erro foi identificado, por meio da “setinha” .̂E
a última linha mostra que o que fizemos de errado foi não seguir as regras
sintáticas para um expressão bem formada. No caso, o interpretador estava
CAPÍTULO 8. O INTERPRETADOR PYTHON 34
esperando achar alguma coisa para usar como operando do operador +, mas
não encontrou. Outros tipos de erros podem ocorrer, não relacionados com a
sintaxe da expressão, mas com sua execução, como por exemplo, ao tentarmos
dividir um número por zero.
✬ ✩
>>> 3 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>>
✫ ✪
a parte inteira da parte decimal, e não uma vírgula, como usamos por padrão na língua
portuguesa.
CAPÍTULO 8. O INTERPRETADOR PYTHON 35
✬ ✩
>>> type(2)
<class ’int’>
>>> type(2.0)
<class ’float’>
>>> type(2 + 2.0)
<class ’float’>
>>> type(4 / 2)
<class ’float’>
>>> type(5 // 2)
<class ’int’>
>>>
✫ ✪
>>> 2e0
2.0
>>> 2e1
20.0
>>> 2e-1
0.2
>>> 2e-4
0.0002
>>>
✫ ✪
>>> type(2 + 2)
<class ’int’>
>>> type(2.0 + 2.0)
<class ’float’>
>>> type(4 / 2)
<class ’float’>
>>>
✫ ✪
>>> 5 // 2
2
>>> -5 // 2
-3
>>>
✫ ✪
(A // B) ∗ B + A % B = A
Ou seja, se pegarmos o quociente da divisão inteira, multiplicarmos pelo
denominador da divisão e somarmos o resto, obtemos o numerador da divisão.
✬ ✩
✫ ✪
>>> -3 + -8
-11
>>> -3 + +8
5
>>> - -3 + 8
11
>>> - -3 + +8
11
>>> ---3 + -8
-11
>>>
✫ ✪
» 10 - 5 = 5
» 10 * 5 = 50
» 10 / 5 = 2.0
» 10 // 5 = 2
» 10 ** 5 = 100000
2. Agora que já sabemos realizar operações básicas no interpretador Python,
vamos observar o resultado de algumas operações. Converta as seguintes
operações para executar no interpretador Python e observe o resultado,
destacando a procedência dos operadores aritméticos:
» 10 – 2 × 3 = 4
» 5 + 2 – 1 × 6 – 4 / 2 = -1.0
» 10 / 2 – 1 × 6 = -1.0
» 10 / (2 – 1) × 6 = 60.0
» 10 % 2 + 5 × 3 – 2 = 13
» 5 – 42 / 1 + 3 = -8
3. Suponha que um aluno obteve as seguintes notas durante um semestre
letivo: 4, 6, 8 e 10. Portanto, a média final do aluno é igual a 7. Baseado
neste exemplo, utilize o interpretador Python para calcular a média para
as seguintes notas:
» 7, 6, 4, 9
» 5, 6, 2, 8
» 10, 10, 9, 10
» 8, 8, 9, 4
4. Realize a conversão de temperatura em graus Fahrenheit para graus Cel-
cius. Utilize o interpretador Python para executar a fórmula C = (5 *
(F-32) / 9) e realizar a conversão das seguintes temperaturas em graus
Fahrenheit para graus Celcius:
» 77.0 o F
» 69.8 o F
» 91.4 o F
» 104.0 o F
5. O perímetro equivale a soma de todos os lados de uma figura geométrica.
Tendo isso em vista, utilizando o interpretador Python, calcule o perímetro
das seguintes figuras geométricas:
» Triângulo escaleno com lados iguais a 15 cm, 12 cm e 20 cm
» Retângulo com base de 20 cm e altura de 12 cm
» Quadrado com lados iguais a 8 cm
6. Calcule o IMC (Índice de Massa Corporal) no interpretador Python. Subs-
titua os valores de altura (em metros) e peso (em quilogramas) na fórmula
do IMC, execute a fórmula no interpretador Python e observe o resultado:
8.3 Variáveis
Todos conhecemos variáveis, desde o tempo do ensino básico. Por exemplo,
nosso professor de matemática muitas vezes perguntou qual o valor da variá-
vel x em dada equação. Quando usamos o termo “variável” em programação,
nos referimos a um conceito diferente desse que estávamos acostumados. Uma
variável é um espaço na memória RAM do computador, que usamos para de-
positarmos um valor. Com a variável, podemos recuperar o valor e usá-lo, por
exemplo, em expressões aritméticas.
No exemplo abaixo estamos criando duas variáveis, de nomes x e j. Na
variável x estamos colocando o valor float 10.0 e na variável j, o valor inteiro
16. Note que a variável em si não tem um tipo pré-determinado, mas o valor
que está na variável, tem. O sinal de igual usado abaixo, é para a linguagem
Python, uma atribuição de valores, ou seja, indica que o valor à direita está
sendo armazenado na variável à esquerda.
★ ✥
>>> x = 10.0
>>> j = 16
>>>
✧ ✦
Uma vez armazenado o valor na variável, esta pode ser utilizada em qualquer
lugar que aquele valor poderia ser usado. Por exemplo, em expressões aritméti-
cas, como as que vimos anteriormente. Abaixo vemos alguns exemplos. Vemos
também que o valor da variável não é imutável. Ele pode ser alterado quantas
vezes quisermos, utilizando outros comandos de atribuição. Além disso, o que
está à direita do sinal de atribuição não precisa ser um número. Pode ser um
valor calculado utilizando números e variáveis. E o tipo de valor armazenado na
variável também pode ser mudado. Por exemplo, a variável x que inicialmente
tinha um valor float, pode passar a armazenar um int.
CAPÍTULO 8. O INTERPRETADOR PYTHON 41
✬ ✩
>>> x = 10.0
>>> j = 16
>>> x
10.0
>>> j
16
>>> x + j
26.0
>>> x * j
160.0
>>> x = j ** 2
>>> x
256
>>> j = 2 * j
>>> j
32
>>>
✫ ✪
>>> j = 16
>>> j = j * j * j
>>> j
4096
>>>
✫ ✪
>>> 2 * j = j
File "<stdin>", line 1
SyntaxError: can’t assign to operator
>>> 2 = j
File "<stdin>", line 1
SyntaxError: can’t assign to literal
>>>
✫ ✪
Outra restrição importante e que deve ser levada em conta, é que o nome da
variável não poderá ser uma palavra reservada. Dentro de qualquer linguagem
de programação, existem palavras que já têm funções pré-determinadas. A
linguagem Python tem 29 palavras reservadas, e a Tabela 8.2 mostra quais são
elas.
Costumamos usar nomes de variáveis que indiquem o que vai ser armazenado
nelas durante a execução do nosso programa. Por exemplo, se você vai armaze-
nar a idade de uma pessoa, uma variável com nome idade seria recomendável.
Outros exemplos seriam peso, altura, saldo_conta.
CAPÍTULO 8. O INTERPRETADOR PYTHON 43
>>> peso = 65
>>> Peso = 80
>>> peso
65
>>> Peso
80
>>> x = 1003.9
>>> X
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name ’X’ is not defined
>>>
✫ ✪
Nesse exemplo, ao tentarmos usar a variável X temos um erro pois ela não
existe. Defininimos apenas x, que é uma outra variável.
8.3.1 Exercícios
1. Utilize o comando type, visto anteriormente, para verificar qual o tipo das
variáveis que definimos nesta seção. Observe que ao mudar o tipo do valor
atribuído à variável, o resultado do comando type também será alterado.
✬ ✩
✫ ✪
CAPÍTULO 8. O INTERPRETADOR PYTHON 44
8.4 Strings
Muitas vezes em nossos programas estamos interessados em processar não ape-
nas números. Um outro tipo de dado que existe na linguagem Python é a cadeia
de caracteres, ou string. Como o nome sugere, um string é simplesmente uma
sequência de caracteres como letras, dígitos, pontuação, ou qualquer outra coisa
que você consiga digitar para o interpretador. Para delimitar o início e final
de um string usamos um par de aspas (caractere ") ou um par de apóstrofo
(caractere ’). Usamos strings para representar, por exemplo, o nome de uma
pessoa, um endereço, um código postal, uma frase, etc.
✬ ✩
✫ ✪
✫ ✪
Embora não seja tão versátil quantos os números, existem algumas operações
interessantes que podemos fazer com as strings. A primeira delas é a concatena-
ção, ou seja, juntar dois strings, uma em seguida da outra, formando um novo
string. Essa operação pode ser realizada com o símbolo de soma.
CAPÍTULO 8. O INTERPRETADOR PYTHON 45
✬ ✩
✫ ✪
✫ ✪
Cada um dos caracteres da string ocupa uma posição. Cada posição é nu-
merada, iniciando-se pela posição zero, que corresponde ao primeiro caractere.
Então, no caso do string “José da Silva”, a letra ’J’ ocupa a posição 0, a letra
’o’ a posição 1, o ’s’, a posição 2, e assim por diante. Podemos acessar cada um
dos caracteres da seguinte maneira:
✬ ✩
✫ ✪
acima, que se tentarmos acessar uma posição da string que não existe, obtemos
uma mensagem indicando o erro. Por outro lado, índices negativos são utilizados
pelo interpretador para acessar as posições da string, do fim para o começo.
Então, a posição -1 corresponde ao último caractere da string, -2 corresponde à
penúltima, e assim por diante.
✬ ✩
✫ ✪
Usando essa mesma notação, podemos pegar parte do string ou, como cos-
tumamos dizer, um substring. Para isso devemos indicar onde começa e onde
termina o substring que queremos. Por exemplo:
✬ ✩
✫ ✪
✫ ✪
✫ ✪
vazia. Esse é um caso especial, em que a string não possui nenhum caractere.
Ele é representado por um abre e fecha aspas, sem nada entre elas. Uma das
propriedades do string vazio é que ele não tem qualquer influência no resultado,
quando utilizado em uma operação de concatenação.
✬ ✩
✫ ✪
8.4.1 Exercícios
1. Utilize o operador de soma para concatenar strings. Exemplo: se a pri-
meira string definida for “Bom dia, ” e a segunda string for “moçada !”,
então o retorno deve ser “Bom dia, moçada !”. Note que o resultado da
concatenação deve ser impresso no interpretador.
2. Python possibilita de uma maneira prática referir-se a subpartes de uma
string. Defina a string s = ’strings em python’ e execute os comandos
abaixo no interpretador Python para praticar e fixar os conceitos anteri-
ormente apresentados.
s t r i n g s e m p y t h o n
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
8.5 Funções
Funções são trechos de programas que servem para realizar alguma tarefa ou,
em particular, calcular algum valor. Por exemplo, funções que conhecemos e que
CAPÍTULO 8. O INTERPRETADOR PYTHON 49
>>> [Link](3.14/4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name ’math’ is not defined
>>> import math
>>> [Link](3.14/4)
0.706825181105366
>>>
✫ ✪
Como a função seno (sin, seguindo o nome em inglês) está no módulo math
precisamos fazer o import do módulo antes de usá-la e, depois, temos que nos
referir a ela com o seu nome completo: [Link].
Podemos também importar apenas um função de um determinado módulo,
através do comando “from [nome do módulo] import [nome da função]”.
✬ ✩
>>> sin(3.14/4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name ’sin’ is not defined
>>> from math import sin
>>> sin(3.14/4)
0.706825181105366
>>>
✫ ✪
✫ ✪
>>> [Link]
3.141592653589793
>>>
✧ ✦
>>> [Link](10)
2.302585092994046
>>> [Link](10,10)
1.0
>>>
✫ ✪
plo, a função sqrt retorna sempre um número do tipo float e recebe como
parâmetro um número não negativo, int ou float, não importa 3 . Se tentar-
mos aplicar a função a um número negativo, o interpretador acusa um erro. O
mesmo acontece se tentarmos passar um número negativo ou que não seja “in-
tegral” (integral aqui quer dizer inteiro ou um float com a parte decimal igual
a zero) para a a função factorial. Essa função retorna sempre um número do
tipo int.
✬ ✩
>>> [Link](-2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error
>>> [Link](3.0)
6
>>> [Link](3.1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: factorial() only accepts integral values
>>>
✫ ✪
3 Na verdade, um int passado como parâmetro é convertido para ponto flutuante (float).
CAPÍTULO 8. O INTERPRETADOR PYTHON 52
Além das funções, o módulo math possui algumas constantes, além da cons-
tante [Link], que já mencionamos. São elas:
Algumas funções da biblioteca padrão são chamadas “built in”. Elas não es-
tão em nenhum módulo específico e por isso não requerem um comando import.
Elas implementam funcionalidades variadas como, por exemplo, a função len,
que retorna o tamanho de um string, ou seja, o número de caracteres do string.
★ ✥
✧ ✦
>>> idade = 36
>>> ’A idade daquele senhor é ’ + idade
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can’t convert ’int’ object to str implicitly
>>> ’A idade daquele senhor é ’ + str(idade)
’A idade daquele senhor é 36’
>>>
✫ ✪
Note no exemplo acima que temos uma variável inteira e que precisa ser
concatenada com um string, para formar a frase que indica a idade de alguém.
Mas, não podemos fazer essa concatenação diretamente. Só podemos concatenar
um string com outro string. Por isso, na segunda expressão, invocamos a função
str, que retorna um string que, então pode ser concatenado. As funções int e
float convertem valores de outros tipos para int e float, respectivamente.
4 Na verdade, até a versão 3.5 esta constante não existe no módulo math. Deve ser incor-
>>> int(3.3333)
3
>>> int(’3.333’)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10:
’3.33333’
>>> int(’33’)
33
>>> float(’3.3333’)
3.3333
>>> float(33)
33.0
>>>
✫ ✪
>>> ’abc’.islower()
True
>>> c = ’abc’
>>> [Link]()
True
>>> [Link]()
False
>>> ’ABC’.isupper()
True
>>>
✫ ✪
>>> a = 308
>>> b = 113
>>> c = -1033
>>>
✫ ✪
>>> delta = b ** 2 - 4 * a * c
>>> delta
1285425
>>>
✫ ✪
Verificamos o valor da variável delta, para termos certeza que não é ne-
gativa. Como obtivemos o valor 1285425, podemos continuar e computar os
valores de x1 e x2 , que chamaremos de x1 e x2, respectivamente.
CAPÍTULO 8. O INTERPRETADOR PYTHON 56
✬ ✩
✫ ✪
8.6.1 Exercícios
1. Repita o algoritmo de Bhaskara no interpretador Python, para outras
equações como:
>>> f = lambda x: x ** 3 - x ** 2 - 13 * x + 8
>>> f(-4.0)
-20.0
>>> f(-3.5)
-1.625
>>>
✫ ✪
CAPÍTULO 8. O INTERPRETADOR PYTHON 57
A primeira linha está dizendo que criamos uma expressão que tem um pa-
râmetro x, como os parâmetros das funções matemáticas que vimos. Essa ex-
pressão é armazenada na variável f que pode, então ser usada exatamente como
usamos as funções. Ao utilizamos, por exemplo, f(-3.5), o interpretar irá
substituir o valor de x na expressão pelo valor −3.5 e computar o resultado de
3, 53 − 3, 52 − 13 × 3, 5 + 8.
Podemos ter expressões lambda com mais do que um parâmetro, e elas
podem ser aplicadas a qualquer tipo de valor, desde que as operações definidas
na expressão sejam válidas para esses valores. No exemplo abaixo, definimos
uma nova função que simplesmente soma dois valores. Se esses valores forem
números, o resultado é a soma deles. Se forem strings, o resultado é a sua
concatenação. Já a função f que definimos anteriormente não pode ser aplicada
a ums string pois nela existem operações que não são aplicáveis a strings.
✬ ✩
✫ ✪
Uma vez definida a função que vamos utilizar, iniciamos o processo de busca
pela raiz. Na primeira iteração, inicializamos as variáveis a e b com o intervalo de
interesse, que é (−4, −3). Em seguida, calculamos o ponto médio c, o tamanho
do intervalo restante e por fim verificamos o sinal de f(c).
✬ ✩
>>> a = -4
>>> b = -3
>>> c = (a+b)/2
>>> (b-a)/2
0.5
>>> f(a) * f(c)
32.5
>>>
✫ ✪
nho intervalo, depois de acharmos o ponto médio. Se ele for menor do que a
tolerância deseja, podemos aceitar c como a resposta que procuramos. Caso
contrário, continuamos o processo. No último comando estamos verificando
como continuar. Se o resultado da multiplicação for zero, isso indica que f(c)
= 0 e portanto c é raiz exata da função. Como esse valor foi positivo, isso indica
que f(a) e f(c) têm o mesmo sinal e portanto devemos continuar a busca no
outro subintervalo, (c, b). Para isso, basta atribuirmos à variável a o valor da
variável c e repetirmos o processo.
✬ ✩
>>> a = c
>>> c = (a+b)/2
>>> (b-a)/2
0.25
>>> f(a) * f(c)
-8.708984375
>>>
✫ ✪
O erro ainda não chegou no valor que desejamos (0.001) e dessa vez, o
próximo intervalo a ser utilizado será (a, c), pois a multiplicação de f(a) e f(c)
foi negativa. Então, para o próximo passo, atribuímos à variável b o valor de c.
✬ ✩
>>> b = c
>>> c = (a+b)/2
>>> (b-a)/2
0.125
>>> f(a) * f(c)
-3.316650390625
>>>
✫ ✪
8.8 Exercícios
1. Use o interpretador Python para computar as outras duas raízes da função
f (x) = x3 − x2 − 13x + 8.
✬ ✩
>>> b = c
>>> c = (a+b)/2
>>> (b-a)/2
0.0625
>>> f(a) * f(c)
-0.409820556640625
>>> b = c
>>> c = (a+b)/2
>>> (b-a)/2
0.03125
>>> f(a) * f(c)
1.0973014831542969
>>> a = c
>>> c = (a+b)/2
>>> (b-a)/2
0.015625
>>> f(a) * f(c)
0.1409673219313845
>>> a = c
>>> c = (a+b)/2
>>> (b-a)/2
0.0078125
>>> f(a) * f(c)
-0.0046784776259301
>>> b = c
>>> c = (a+b)/2
>>> (b-a)/2
0.00390625
>>> f(a) * f(c)
0.019414838510556365
>>> a = c
>>> c = (a+b)/2
>>> (b-a)/2
0.001953125
>>> f(a) * f(c)
0.0032784581515694633
>>> a = c
>>> c = (a+b)/2
>>> (b-a)/2
0.0009765625
>>> c
-3.4462890625
>>>
✫ ✪
Figura 8.4: Passos finais para computar uma das raízes de f (x) = x3 − x2 −
13x + 8