Ebook - Introdução A Python (Editora Ifrn)
Ebook - Introdução A Python (Editora Ifrn)
Ebook - Introdução A Python (Editora Ifrn)
INTRODUÇÃO A
PYTHON
COM APLICAÇÕES
DE SISTEMAS
OPERACIONAIS
Natal, 2020
Presidente da República
Jair Messias Bolsonaro
Ministro da Educação
Milton Ribeiro
Secretário de Educação Profissional e Tecnológica
Tomás Dias Sant’ana
Reitor
José Arnóbio de Araújo Filho
Pró-Reitor de Pesquisa e Inovação
INSTITUTO FEDERAL Avelino Aldo de Lima Neto
Rio Grande do Norte
Coordenadora da Editora IFRN
Gabriela Dalila Bezerra Raulino
Conselho Editorial
Conselho Editorial
Contato
Endereço: Rua Dr. Nilo Bezerra Ramalho, 1692, Tirol.
CEP: 59015-300, Natal-RN.
Fone: (84) 4005-0763 l E-mail: editora@ifrn.edu.br
Os textos assinados, no que diz respeito tanto à linguagem quanto ao conteú-
do, não refletem necessariamente a opinião do Instituto Federal de Educação,
Ciência e Tecnologia do Rio Grande do Norte.
As opiniões são de responsabilidade exclusiva dos respectivos autores.
É permitida a reprodução total ou parcial desde que citada a fonte.
ISBN: 978-65-86293-38-8
CDU 004.43
Esta obra foi submetida e selecionada por meio de edital específico para publicação pela
Editora IFRN, tendo sido analisada por pares no processo de editoração científica.
Dedico este livro aos meus pais, à minha esposa
e aos meus filhos.
F. A. P. Paiva
CAPÍTULO II
EXECUÇÃO SEQUENCIAL ......................................................................30
VARIÁVEIS E CONSTANTES.......................................................................30
TIPOS DE DADOS ....................................................................................36
OPERADORES ARITMÉTICOS....................................................................39
OPERADORES DE ATRIBUIÇÃO................................................................40
ENTRADA DE DADOS E CONVERSÃO DE TIPOS......................................41
FORMATAÇÃO DE STRINGS......................................................................44
EXERCÍCIOS RESOLVIDOS.........................................................................48
EXERCÍCIOS PROPOSTOS..........................................................................50
CAPÍTULO III
ESTRUTURAS CONDICIONAIS................................................................54
ONDE ENCONTRAMOS ESTRUTURAS CONDICIONAIS?.......................54
OPERADORES..........................................................................................59
OPERADORES DE COMPARAÇÃO OU RELACIONAIS..............................60
OPERADORES LÓGICOS............................................................................60
TABELA VERDADE......................................................................................62
ESTRUTURA IF...ELSE..................................................................................65
ESTRUTURA ELIF........................................................................................68
EXERCÍCIOS RESOLVIDOS.........................................................................69
EXERCÍCIOS PROPOSTOS.........................................................................79
CAPÍTULO IV
ESTRUTURAS DE REPETIÇÃO.................................................................84
ESTRUTURA WHILE....................................................................................86
FUNÇÃO RANGE.........................................................................................91
ESTRUTURA FOR........................................................................................93
COMANDO BREAK......................................................................................95
EXERCÍCIOS RESOLVIDOS.........................................................................97
EXERCÍCIOS PROPOSTOS.......................................................................101
CAPÍTULO V
LISTAS....................................................................................................... 105
DECLARANDO UMA LISTA ......................................................................106
INCLUINDO ELEMENTOS........................................................................109
EMBARALHANDO E SORTEANDO ELEMENTOS.....................................111
ORDENANDO ELEMENTOS.....................................................................112
REMOVENDO ELEMENTOS.....................................................................113
CLONANDO E COMPARANDO LISTAS....................................................116
INCLUINDO ELEMENTOS DE UMA LISTA EM OUTRA...........................117
OCORRÊNCIAS DE ELEMENTOS E COMPRIMENTO DA LISTA..............118
MENOR, MAIOR E SOMA DE ELEMENTOS.........................................119
RETORNANDO O ÍNDICE DE UM ELEMENTO....................................120
RETORNANDO ÍNDICE E ELEMENTO....................................................123
LISTAS ANINHADAS.................................................................................124
UMA MANEIRA DIFERENTE DE GERAR E MANIPULAR LISTAS...........128
EXERCÍCIOS RESOLVIDOS.......................................................................130
EXERCÍCIOS PROPOSTOS........................................................................137
CAPÍTULO VI
DICIONÁRIOS.....................................................................................141
ACESSANDO ELEMENTOS ....................................................................142
INSERINDO E ATUALIZANDO ELEMENTOS...............................................144
CONTANDO ELEMENTOS..........................................................................145
VERIFICANDO A EXISTÊNCIA DE UMA CHAVE...........................................145
OBTENDO VALORES E CHAVES.................................................................146
ORDENANDO ELEMENTOS.......................................................................148
CLONANDO UM DICIONÁRIO...................................................................149
REMOVENDO ELEMENTOS........................................................................150
ESVAZIANDO UM DICIONÁRIO..................................................................150
EXERCÍCIOS RESOLVIDOS..........................................................................151
EXERCÍCIOS PROPOSTOS........................................................................157
CAPÍTULO VII
FUNÇÕES.................................................................................................160
DECLARANDO FUNÇÕES.........................................................................161
EXERCÍCIOS RESOLVIDOS.......................................................................165
EXERCÍCIOS PROPOSTOS........................................................................171
CAPÍTULO VIII
INTRODUÇÃO À ORIENTAÇÃO A OBJETOS......................................175
CLASSES E OBJETOS...............................................................................177
IMPLEMENTAÇÃO EM PYTHON............................................................179
EXERCÍCIOS RESOLVIDOS.......................................................................185
EXERCÍCIOS PROPOSTOS........................................................................193
CAPÍTULO IX
APLICAÇÕES DE SISTEMAS OPERACIONAIS.......................................196
CONCORRÊNCIA...........................................................................196
ESCALONAMENTO...............................................................................224
REFERÊNCIAS.................................................................................235
CAPÍTULO I INTRODUÇÃO A PYTHON
INTRODUÇÃO
13
não dê ouvidos para quem não tentou o suficiente e ficou
pelo caminho. Nosso lema é “Programar é fácil, mas exige
dedicação”.
Para o ensino da programação, escolhemos a lingua-
gem Python porque é simples, fácil de aprender e rápida
para codificar. Outro motivo importante foi o crescimento
anual da linguagem. Todos os anos, Python vem ganhan-
do novos programadores e recebendo a atenção que me-
rece. Citamos por exemplo, o emprego de Python na área
de ciência dos dados, onde não existe solução melhor. Para
consolidar nossas afirmações, veja o resultado da pesquisa
realizada com usuários do website Stack Overflow1 em 2019,
na Figura 1.
1 https://stackoverflow.com/
14
INTRODUÇÃO A PYTHON
15
ORIGEM DA LINGUAGEM PYTHON
16
INTRODUÇÃO A PYTHON
Figura 3 – Monty Python, série britânica de humor que deu nome à linguagem.
Fonte: https://teoriageek.com.br/resenha-filme-monty-python-e-o-calice-sagrado/.
17
vários scripts do SO já são executados em Python. Para verificar
se já está instalado no Linux ou Windows, abra a console de
comandos do sistema operacional e digite o comando python
--version. Veja a Figura 5, que apresenta o resultado do co-
mando.
apt-get Gerenciador de
sudo apt-get install python- módulos do Python.
pip Serve para instalar
extensões do Python.
sudo yum install python38 Python
Yum Gerenciador de
yum -y install python-pip
módulos do Python.
18
INTRODUÇÃO A PYTHON
19
Figura 7 – Local para baixar o instalador Python para Windows.
20
INTRODUÇÃO A PYTHON
21
Figura 10 – Janela que informa o sucesso da instalação no Windows.
22
INTRODUÇÃO A PYTHON
23
Figura 13 – Tela inicial do Pycharm.
24
INTRODUÇÃO A PYTHON
25
Figura 15 – Local onde se criam arquivos Python na ferramenta IDLE.
26
INTRODUÇÃO A PYTHON
• Programação funcional; e
• Uma imensidão de módulos de extensão, os quais
permitem expandir o poder da linguagem Python.
27
Python nos seus cursos iniciais. Nos Institutos Federais, a utili-
zação de Python tem sido massiva, tanto nos cursos iniciais de
programação como em disciplinas voltadas para a web e para
ciência de dados.
Aos que gostam de videoaulas, existem diversas inicia-
tivas para o ensino de Python. Dentre as que se destacam, há o
curso Python para Zumbis2 do professor Fernando Masanori3,
o curso Python Birds4 do professor Renzo Nuccitelli5, e o Python
Básico – Curso em Vídeo6 do professor Gustavo Guanabara7.
Além das importantes iniciativas dos professores Ma-
sanori, Nuccitelli e Guanabara, no portal Youtube, um dos au-
tores deste livro administra um canal chamado Procópio na
Rede8. Lá você encontrará diversos vídeos sobre os assuntos
abordados nos capítulos 2 a 8 e, no fim de cada um deles, é
disponibilizado um hiperlink para complementar o conteúdo
apresentado.
2 https://www.pycursos.com/python-para-zumbis
3 https://twitter.com/fmasanori
4 https://www.python.pro.br/curso-de-python-gratis
5 https://twitter.com/renzoprobr
6 https://www.cursoemvideo.com/course/curso-python-3
7 https://twitter.com/guanabara
8 https://www.youtube.com/ProcopioNaRede
28
INTRODUÇÃO A PYTHON
29
CAPÍTULO II
EXECUÇÃO SEQUENCIAL
VARIÁVEIS E CONSTANTES
30
INTRODUÇÃO A PYTHON
31
1 aluno = "Ada Lovelace"
2 periodo_corrente = 10
3 ira = 9.99 #valor que define o IRA
4 laurea = True
32
INTRODUÇÃO A PYTHON
aluno, do seu período corrente, do seu IRA e de que ele não foi
o aluno laureado de sua turma? Certamente não. Você perce-
be a importância da definição de nomes significativos para as
variáveis?
Em Python, convencionou-se que o nome de uma
variável deve começar com letras minúsculas como aluno,
periodo_corrente, ira e laurea. Caso o nome de uma variável
possua mais de uma palavra, deve-se separá-las com um underscore (_)
como periodo_corrente ou indice_rendimento_academico.
Essa última padronização é chamada de snake case. Há nomes
de variáveis que não são permitidos em Python. Variáveis cujos
nomes começam com números (por exemplo, 2aluno) não são
permitidas, embora aluno2 seja um nome válido. Além disso,
deve-se observar também que as palavras reservadas da ligua-
gem Python não podem ser usadas como nomes de variáveis.
Portanto, não é permitido declarar variáveis com os seguintes
nomes:
33
liberado? Claro que não, não é verdade? Isso ocorre porque o
processo de autenticação de usuários é do tipo case sensitive,
isto é, há distinção de letras minúsculas para letras maiúsculas.
Assim, em um programa, a variável var1 ocupa uma posição
de memória diferente da ocupada pela variável Var1. Portanto,
var1 e Var1 são variáveis distintas.
Outro conceito importante que devemos ter em
mente é o de constantes. Ao contrário de variáveis, cujos va-
lores variam durante a execução de um programa, quando
um valor é atribuído a um constante, este não poderá ser
modificado até que o programa seja encerrado. Por exemplo,
o valor aproximado de é π 3.14159 e, portanto, ele nunca
deverá ser modificado.
Python possui uma biblioteca chamada math, na
qual são definidas algumas constantes matemáticas como
pi, tau e o número de Euler. Para usar uma constante ma-
temática, definida dentro da biblioteca math, basta escrever
from math import <nome_da_constante>,
como no exemplo a seguir.
34
INTRODUÇÃO A PYTHON
35
obtem_rodape(), como mostrado na linha 4 do Programa 3, ou
utilizar a variável rodape, que possui o comportamento de uma
constante.
TIPOS DE DADOS
36
INTRODUÇÃO A PYTHON
37
1 exemplo = "Ada Lovelace"
6 exemplo = 10
8 exemplo = 9.99
10 exemplo = True
38
INTRODUÇÃO A PYTHON
OPERADORES ARITMÉTICOS
+ Adição print(4 + 2)
#resulta em 6
- Subtração print(4 - 2)
#resulta em 2
* Multiplicação print(4 * 2)
#resulta em 8
/ Divisão print(4 / 3)
#resulta em 1.3333
// Quociente inteiro da print(4 // 3)
divisão
#resulta em 1
39
OPERADOR DESCRIÇÃO EXEMPLO DE APLICAÇÃO
OPERADORES DE ATRIBUIÇÃO
40
INTRODUÇÃO A PYTHON
= Atribuição simples x = 2
#x recebe 2
+= Atribuição de adição x += 2
#equivale a x = x + 2
-= Atribuição de subtração x -= 2
#equivale a x = x – 2
*= Atribuição de x *= 2
multiplicação
#equivale a x = x * 2
/= Atribuição de divisão x/= 2
#equivale a x = x / 2
%= Atribuição de resto inteiro x%= 2
da divisão
#equivale a x = x % 2
**= Atribuição de potência x**= 2
#equivale a x = x ** 2
//= Atribuição de quociente x//= 2
inteiro da divisão
#equivale a x = x // 2
Quadro 2 – Lista de operadores de atribuição.
41
É importante destacar que a função input() sempre
retornará o valor recebido no formato de uma string, mesmo
que ele seja de um tipo de dado diferente como, por exemplo,
um número real. Vamos testar?
42
INTRODUÇÃO A PYTHON
43
que não é possível realizar a multiplicação e o motivo disso é o
fato de o multiplicador e o multiplicando serem strings. En-
tão, para que o programa calcule corretamente a área do retân-
gulo, os valores atribuídos às variáveis base e altura devem
ser convertidos para um tipo numérico. Como exercício, o
Programa 9 foi modificado para converter os valores da
base e da altura em um número real usando a função
float(). Para isso, a linha 1 deve ser reescrita para
base = float(input("Digite a base: ")) e a linha 2
para altura = float(input("Digite a altura: ")).
Depois da modificação, execute o novo código e verifique que
o programa calculou a área da figura corretamente.
FORMATAÇÃO DE STRINGS
12 https://www.python.org/dev/peps/pep-0498/
44
INTRODUÇÃO A PYTHON
45
em tempo de execução. Considerando que este programa está
sendo executado em 07 de novembro de 2020, o resultado da
expressão é 90. Portanto, ao fim da execução do Programa 10,
será exibido o seguinte:
46
INTRODUÇÃO A PYTHON
47
Nos três exemplos anteriores, :06d diz “Exiba um nú-
mero inteiro com 6 dígitos. Se ele possuir menos de 6 dígitos,
preencha com zeros à esquerda até deixá-lo com 6 dígitos.”.
Também é possível formatar as strings incluindo va-
lores que representam números com ponto flutuante. Veja o
exemplo abaixo:
print(f"Valor de pi é {3.14159265352384626433}.")
print(F"Valor de pi é {3.14159265352384626433:.20f}.")
EXERCÍCIOS RESOLVIDOS
48
INTRODUÇÃO A PYTHON
Vamos ao código:
49
Vamos ao código:
Vamos ao código:
EXERCÍCIOS PROPOSTOS
50
INTRODUÇÃO A PYTHON
51
6. Considere uma equação do segundo grau, representada
pela expressão
52
INTRODUÇÃO A PYTHON
copo1 = “laranja”
copo2 = “acerola”
53
CAPÍTULO III
ESTRUTURAS
CONDICIONAIS
54
INTRODUÇÃO A PYTHON
55
realizado com a variável media. No entanto, não conseguimos
avançar com respeito ao resultado da aprovação. Como fare-
mos para apresentar o resultado "Aprovado" ou "Reprovado"?
É aí que entram as estruturas condicionais, ou seja, a partir do
resultado de um teste condicional, executaremos comandos e/
ou deixaremos de executar outros. Certamente, agora é aque-
le momento que você pensa: “Hamm?”. Calma! Agora, vamos
contar com o auxílio das palavras chaves if e else. Com elas,
conseguiremos decidir se apresentaremos o resultado "Apro-
vado" ou "Reprovado", como se vê no Programa 15.
56
INTRODUÇÃO A PYTHON
57
No Programa 16, por meio dos comandos if e else,
observe que foi possível converter a árvore de decisão em um
programa que, por sinal, parece muito com a Figura 17. Inicial-
mente, realizamos a leitura do estado de nomeNegativado
do cliente. Logo em seguida, verificamos se o estado é nega-
tivado ou não.
Provavelmente, você já notou que um comando if
quer saber se algo é verdadeiro ou falso. A utilização de opera-
dores lógicos e de comparação (discutidos logo mais) sempre
geram como resultado um valor lógico, isto é, True ou False.
Isso permite decidir que comandos serão executados e quais
deixaram de ser. Portanto, no pseudocódigo do Programa 17,
temos a seguinte análise.
58
INTRODUÇÃO A PYTHON
OPERADORES
59
OPERADORES DE COMPARAÇÃO OU RELACIONAIS
OPERADORES LÓGICOS
60
INTRODUÇÃO A PYTHON
61
No Programa 19, perceba que temos quatro estrutu-
ras condicionais. A primeira quer saber se temos pelos menos
dois números iguais e, caso verdade, o programa será encerra-
do utilizando a função exit(). As demais estruturas condicio-
nais querem saber se um dos números é maior que os demais.
Foi implementado um teste para o numero1, um teste para o
numero2 e um teste para o numero3. Veja a diferença entre
os operadores lógicos, na primeira estrutura condicional, onde
utilizamos o operador or, se apenas um teste for verdadeiro, o
resultado será verdadeiro. Nas demais estruturas condicionais
que utilizam o operador and, é necessário que os dois testes
sejam verdadeiros para que o resultado seja verdade.
TABELA VERDADE
62
INTRODUÇÃO A PYTHON
OPERAÇÃO
CONECTIVO SÍMBOLO VALOR LÓGICO
LÓGICA
NÃO
T1 ~T1
F V
V F
T1 T2 T1^T2
F F F
F V F
V F F
V V V
63
OU
T1 T2 T1vT2
F F F
F V V
V F V
V V V
NOT
T1 not T1
False True
True False
AND
T1 T2 T1 and T2
False False False
False True False
True False False
True True True
64
INTRODUÇÃO A PYTHON
OR
T1 T2 T1 or T2
False False False
False True True
True False True
True True True
ESTRUTURA IF...ELSE
65
em diante, quando você observar código indentado em Python,
tenha certeza de que é um bloco de instruções. Inclusive, cada
instrução if terá o seu bloco indentado.
Uma informação importante: em Python, assim como
em outras linguagens de programação, uma expressão pode
ser considerada verdadeira se ela possui valor diferente de zero.
Caso contrário, é considerada falsa. Veja o exemplo abaixo:
1 valor = 10
2 if valor:
3 print("valor é diferente de zero => verdade.")
4 valor = 0
5 if not valor:
6 print("Valor é falso, mas not inverteu o resultado.")
66
INTRODUÇÃO A PYTHON
67
Pronto, calcule e imprima o valor a ser pago pelo clien-
te, sabendo que o preço da camisa é R$ 12,50. Veja a solução
no Programa 24.
ESTRUTURA ELIF
68
INTRODUÇÃO A PYTHON
EXERCÍCIOS RESOLVIDOS
69
Você foi contratado(a) pela empresa para atender a essa solici-
tação. Construa um programa que apresente o seguinte menu:
************************************************
CÁLCULO DE GRANDEZAS ELÉTRICAS
************************************************
1. Tensão (em Volt)
2. Resistência (em Ohm)
3. Corrente (em Ampére)
************************************************
Qual grandeza deseja calcular?
70
INTRODUÇÃO A PYTHON
71
é atribuída a variável r, a leitura do valor de corrente que é atri-
buído a variável i e, por fim, o cálculo da variável v (v = r * i).
Logo em seguida, ocorre a impressão da string formatada com
o resultado da variável calculada.
Vamos ao código:
72
INTRODUÇÃO A PYTHON
das cartesianas, definido por três pontos: P1 (x1, y1), P2 (x2, y2) e P3 (x3,
y3). Cada lado do triângulo é obtido por meio do cálculo da distância
entre os pontos, conforme equação abaixo
73
converter a saída da função input para um valor real, porque
será necessário trabalhar com números reais (engloba não só
os inteiros e os fracionários, positivos e negativos, mas tam-
bém todos os números irracionais).
soma absoluta dos outros dois. Caso isso ocorra, a variável cond3
recebe valor False, indicando que não será possível a formação de
triângulo.
Vamos ao código:
75
1 from math import sqrt
2 #Coordenadas x e y do Ponto 1
3 x1 = float(input("Digite a coordenada x do Ponto 1: "))
4 y1 = float(input("Digite a coordenada y do Ponto 1: "))
5 #Coordenadas x e y do Ponto 2
6 x2 = float(input("\nDigite a coordenada x do Ponto 2: "))
7 y2 = float(input("Digite a coordenada y do Ponto 2: "))
8 #Coordenadas x e y do Ponto 3
9 x3 = float(input("\nDigite a coordenada x do Ponto 3: "))
10 y3 = float(input("Digite a coordenada y do Ponto 3: "))
11 #Calcula os lados do triângulo
12 L1 = sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2) #Distância entre P1 e P2
13 L2 = sqrt((x3 - x1) ** 2 + (y3 - y1) ** 2) #Distância entre P1 e P3
14 L3 = sqrt((x3 - x2) ** 2 + (y3 - y2) ** 2) #Distância entre P2 e P3
15 #Considera que as três condições de existência são verdadeiras
16 cond1 = True
17 cond2 = True
18 cond3 = True
19 #Verifica se algum lado é igual a zero
20 if L1 == 0 or L2 == 0 or L3 == 0:
21 cond1 = False
22 #Verifica se algum lado é maior que a soma dos outros dois
23 if L1 > (L2 + L3) or L2 > (L1 + L3) or L3 > (L1 + L2):
24 cond2 = False
25 #Algum lado não é maior que o módulo da diferença entre os outros?
26 if L1 <= abs(L2 - L3) or L2 <= abs(L1 - L3) or L3 <= abs(L1 - L2):
27 cond3 = False
28 triangulo = True #Inicialmente, considera a existência do triângulo
29 #Alguma condição de inexistência foi identificada?
30 if cond1 == False or cond2 == False or cond3 == False:
31 triangulo = False #Triângulo inexistente
32 print("\nNenhum triângulo formado.\nMotivo(s):")
33 if cond1 == False:
34 print("Pelo menos um dos lados é igual a 0.")
35 if cond2 == False:
36 print("Pelo menos um lado é maior que a soma dos outros 2.")
37 if cond3 == False:
38 print("Um dos lados é menor ou igual ao módulo da diferença.")
39 #Triângulo existe
40 elif L1 == L2 == L3:
41 print("\nTriângulo equilátero.")
42 elif L1 != L2 and L1 != L3 and L2 != L3:
76
INTRODUÇÃO A PYTHON
43 print("\nTriângulo escaleno.")
44 else:
45 print("\nTriângulo isósceles.")
46 #Todas as condições de existência do triângulo foram satisfeitas
47 if triangulo:
48 print(f"Medida do lado 1: {L1:.2f}")
49 print(f"Medida do lado 2: {L2:.2f}")
50 print(f"Medida do lado 3: {L3:.2f}")
77
Os testes citados se repetem para a variável alt2 e alt3, ou
seja, primeiro identificamos o maior número e na sequên-
cia, encontramos o valor do meio e o menor valor. Fazendo
assim, conseguimos reconhecer a ordem decrescente dos
números.
Vamos ao código:
1 alt1 = float(input("Digite a estatura da 1ª pessoa (em metros): "))
2 alt2 = float(input("Digite a estatura da 2ª pessoa (em metros): "))
3 alt3 = float(input("Digite a estatura da 3ª pessoa (em metros): "))
4 mais_alto = alt1
5 est_mediana = alt1
6 mais_baixo = alt1
7 if alt1 > alt2 and alt1 > alt3:
8 mais_alto = alt1
9 if alt2 > alt3:
10 est_mediana = alt2
11 mais_baixo = alt3
12 else:
13 est_mediana = alt3
14 mais_baixo = alt2
15 elif alt2 > alt1 and alt2 > alt3:
16 mais_alto = alt2
17 if alt1 > alt3:
18 est_mediana = alt1
19 mais_baixo = alt3
20 else:
21 est_mediana = alt3
22 mais_baixo = alt1
23 else:
24 mais_alto = alt3
25 if alt1 > alt2:
26 est_mediana = alt1
78
INTRODUÇÃO A PYTHON
27 mais_baixo = alt2
28 else:
29 est_mediana = alt2
30 mais_baixo = alt1
31 print(f"\n{mais_alto}m, {est_mediana}m e {mais_baixo}m")
EXERCÍCIOS PROPOSTOS
79
2. Operador OR
3. Operador NOT
**************************
Escolha uma opção:
login 1 login 2
usuário: procopio usuário: paiva
senha: 12345 senha: 54321
80
INTRODUÇÃO A PYTHON
81
9. Na última Black Friday, o gerente de uma loja de perfumes co-
locou todo o seu estoque em promoção, de acordo com a tabela
a seguir:
IMC Situação
Abaixo de 18,5 Abaixo do peso
Acima de 18,5 e menor que 25 Peso normal
A partir de 25 e menor que 30 Sobrepeso
Acima de 30 e menor que 35 Obesidade grau 1
Acima de 35 e menor que 40 Obesidade grau 2
Acima de 40 Obesidade grau 3
82
INTRODUÇÃO A PYTHON
https://www.youtube.com/playlist?list=PLqsF5rntN2nb80Hy9SvvoaGEWPRi_CS9I
83
CAPÍTULO IV
ESTRUTURAS
DE REPETIÇÃO
84
INTRODUÇÃO A PYTHON
1 cont = 1
2 while cont <= 4000:
3 print("Olá!")
4 cont += 1 #o mesmo que cont = cont + 1
5 print("FIM")
85
ESTRUTURA WHILE
86
INTRODUÇÃO A PYTHON
87
Vamos continuar tomando como exemplo o Programa
30. Na linha 2, a instrução cont <= 4000 monitora o valor da
variável cont a fim de identificar se ainda é necessária a execu-
ção das instruções que estão dentro do laço. Agora, imagine que a
instrução cont += 1, da linha 4, foi removida. Como já sabemos,
essa instrução é responsável por fazer com que a variável contado-
ra tenha seu valor acrescido em uma unidade cada vez que o laço
for executado. Dessa forma, considerando que cont é inicializada
com o valor 1, depois de 4000 vezes, seu valor será 4001, ou seja, a
condição que sinaliza para o programa finalizar o laço.
Portanto se a linha 4 for removida do Programa 30, cont
não terá o seu valor alterado, permanecendo sempre igual a 1.
Percebe? Ela sempre será menor que 4000 e, assim, “até o fim dos
tempos”, o laço será executado. Como diz o ditado, se você é “como
São Tomé, que precisa ver para crer”, faça o teste: modifique o Pro-
grama 30 removendo a linha 4. Em seguida, execute o programa e
veja o que ocorrerá.
Em algumas situações é necessária a construção de tre-
cho cujo comportamento seja semelhante a de um loop infinito.
Uma maneira de escrevê-lo é utilizando a palavra reservada True,
conforme Programa 32. Mais adiante, veremos outros exemplos
usando essa estrutura.
1 while True:
2 print("Execução de um loop infinito")
88
INTRODUÇÃO A PYTHON
1 #Primeira alternativa
2 print(1+2+3+4+5+6+7+8+9+10)
3 #Segunda alternativa
4 soma = 1+2+3+4+5+6+7+8+9+10
5 print(soma)
1 soma = 0
2 termo = 1
3 while termo <= 10:
4 soma += termo
5 termo += 1 #geração do termo da PA, de razão 1
6 print(soma)
Programa 34 – Somatório dos 10 primeiros números inteiros
positivos usando while.
89
Na linha 1, é declarada a variável soma, cujo valor inicial atri-
buído é 0. Como vimos no Capítulo 2, é recomendável que as
variáveis sejam declaradas com nomes significativos, isto é,
que os nomes remetam a qual dado está sendo armazena-
do na variável. A cada iteração, soma é utilizada para acumu-
lar o somatório dos termos da PA. Por causa disso, variáveis
com o comportamento semelhante ao de soma, ou seja, que
acumulam valores a cada iteração de um laço, muitas vezes,
são chamadas de variáveis acumuladoras. Você deve estar se
perguntando: “Por que zero foi atribuído à variável soma?” A
resposta é muito simples: porque 0 é o valor que não altera a
operação de adição e, por isso, inicializamos a variável soma
com esse valor.
• Na linha 2, a variável termo é declarada e iniciali-
zada com o valor 1. No programa, ela correspon-
de aos termos que serão gerados para a PA.
• Na linha 3, é definida a condição de execução do
laço. Em uma descrição textual, poderíamos dizer
que “enquanto a variável termo, utilizada para
controlar a quantidade de termos gerados, for
menor ou igual a 10, isto é, ainda não percorreu
os 10 termos da PA, o bloco de instruções dentro
do laço deverá se repetir.”
• Na linha 4, soma armazenará o resultado da adi-
ção entre o valor que ela já possui e o valor que
está armazenado em termo. Achou difícil de en-
tender? Calma! Na Tabela 2, simularemos o com-
portamento do que ocorrerá com a variável soma
quando o laço estiver sendo executado.
• Na linha 5, a variável termo é incrementada em
90
INTRODUÇÃO A PYTHON
FUNÇÃO RANGE
91
1. range(<quantidade_de_números_a_serem_gerados>)
2. range(<início_da_faixa>, <fim_da_faixa>[,<incremento>])
92
INTRODUÇÃO A PYTHON
list(range(16, 10, -1))#Incremento = -1: [16, 15, 14, 13, 12, 11]
ESTRUTURA FOR
93
Agora, vamos recodificar o Programa 30 e o Progra-
ma 34 de uma maneira diferente, modificando os programas
para que utilizem a estrutura de repetição for ao invés da es-
trutura while.
ITERAÇÃO ENTÃO
1 cont = 0
2 cont = 1
3 cont = 2
. .
. .
. .
4000 cont = 3999
94
INTRODUÇÃO A PYTHON
1 soma = 0
2 for termo in range(1, 11):
3 soma += termo
4 print(soma)
Programa 37 – Somatório dos 10 primeiros números inteiros
positivos usando for.
COMANDO BREAK
95
como exemplo o Programa 38, cujo objetivo é solicitar inúme-
ras vezes que o usuário informe dois números. O programa
calculará a operação de divisão, na qual o primeiro número
informado corresponde ao dividendo e o segundo ao divisor.
Observe que, na linha 2, o laço tem uma estrutura de repetição
infinita e, assim, a forma de sair dele é forçando a sua interrup-
ção. Para isso, usamos o comando break, na linha 7.
2 while True:
3 n1 = int(input("Informe o primeiro número: "))
4 n2 = int(input("Informe o segundo número: "))
5 if n2 == 0:
6 print("Divisor não pode ser 0.\nPrograma será encerrado...")
7 break
8 print(f"{n1} / {n2} = {(n1/n2):.2f}")
9 print("*** Fim da operação de divisão ***")
96
INTRODUÇÃO A PYTHON
EXERCÍCIOS RESOLVIDOS
Vamos ao código:
97
5 foram executadas dentro do laço. Na linha 5, a variável soma
acumula os valores informados pelo usuário.
Vamos ao código:
1 pares = 0
2 for cont in range(5):
3 num = int(input("Digite um número: "))
4 if num % 2 == 0:
5 pares += 1
6 print(f"Quantidade de números pares digitados: {pares}")
98
INTRODUÇÃO A PYTHON
Vamos ao código:
99
1 mulheres = 0
2 homens_acima18 = 0
3 while True:
4 idade = int(input("Idade: "))
5 if idade < 0:
6 break
7 sexo = input("Sexo: ")
8 if sexo == "F" or sexo == "f":
9 mulheres += 1
10 elif sexo == "M" or sexo == "m":
11 if idade > 18:
12 homens_acima18 += 1
13 print(f"Total de mulheres: {mulheres}")
14 print(F"Total de homens acima de 18 anos: {homens_acima18}")
100
INTRODUÇÃO A PYTHON
EXERCÍCIOS PROPOSTOS
101
formou cinco medicamentos distintos). O programa deve in-
formar o nome e o preço do medicamento mais barato, bem
como a média aritmética dos preços informados.
102
INTRODUÇÃO A PYTHON
CÓDIGO CARGO
1 Enfermeiro
2 Nutricionista
3 Médico
103
10. Uma turma da disciplina de Banco de Dados possui 5 alu-
nos. Construa um programa que leia duas notas e calcule a mé
dia aritmética de cada aluno. Ao fim, de acordo com a tabela
abaixo, indique o percentual de alunos em Prova Final.
FAIXA RESULTADO
104
CAPÍTULO V INTRODUÇÃO A PYTHON
LISTAS
105
tos são organizados de forma linear. Cada elemento de uma
lista pode ser acessado a partir do índice que representa a sua
posição na coleção. É importante observar que o primeiro ele-
mento de uma lista é armazenado no índice 0, o segundo no
índice 1, e assim sucessivamente. Obviamente, o último ele-
mento é posicionado no índice que corresponde à quantidade
de elementos da lista menos um.
Os elementos de uma lista podem ser de diversos ti-
pos, como os primitivos (int, float, string e lógico) ou os
mais complexos como listas, dicionários, tuplas e objetos. As
listas são formadas por uma sequência de elementos separa-
dos por vírgulas e envolvidos por um par de colchetes.
Em outras linguagens de programação, a estrutura de
dados que se assemelha às listas é conhecida como vetor, array
ou variável homogênea. Em C ou Java, por exemplo, um array
só pode armazenar valores do mesmo tipo. No entanto, uma
característica importante das listas em Python é que elas po-
dem armazenar elementos de tipos distintos.
<lista> = []
<lista> = [<elemento1>, <elemento2>, ..., <elementoN>]
106
INTRODUÇÃO A PYTHON
1 # Lista vazia
2 idades = []
3
4 # Lista com elementos pré-definidos
5 idades = [27, 19, 33, 47]
16 https://www.instagram.com/
107
que os dados da atriz serão exibidos na forma de uma lista
em Python. No entanto, uma alternativa para formatar essa
impressão seria, em cada linha, escrever os elementos da lista,
algo como
lista[<índice>]
108
INTRODUÇÃO A PYTHON
Índice: 0 1 2 3
INCLUINDO ELEMENTOS
<lista>.append(<elemento>)
109
onde <lista> é o nome da variável do tipo lista e <elemen-
to> é o elemento que deve ser incluído no fim da lista. Veja o
exemplo no Programa 44.
1 atrizes = ["Paolla de Oliveira"]
2 atrizes.append("Camila Queiroz")
3 while True:
4 nome = input("Digite o nome de uma atriz: ")
5 atrizes.append(nome)
6 resp = input("Deseja continuar [S|N]? ")
7 if resp.upper() == "N":
8 break
9 print(atrizes)
110
INTRODUÇÃO A PYTHON
111
exibidas, respectivamente, as sintaxes dos dois métodos.
random.shuffle(<lista>)
<lista>.choice()
ORDENANDO ELEMENTOS
112
INTRODUÇÃO A PYTHON
REMOVENDO ELEMENTOS
<lista>.remove(<elemento>)
<lista>.pop(<índice>)
del <lista>[<índice>]
113
Para remover um elemento utilizando o método
remove(), basta informar qual elemento se deseja excluir.
Se, na lista, existir mais de um elemento com o valor
informado, será removido apenas a primeira ocorrência
encontrada.
O método pop() tem um funcionamento seme-
lhante ao do remove(). Contudo, o seu argumento de en-
trada é o índice a ser removido e não o próprio elemento.
Todavia, se o índice não for informado, o método removerá
o último elemento da lista.
Por fim, para executar a função del informam-se o
nome da lista e em qual índice o elemento se encontra. Se
não for informado o índice da lista que se deseja remover
o elemento, a função del destruirá a variável do tipo lista.
Acompanhe a execução do Programa 48 e observe
o comportamento dos métodos remove() e pop() e da
função del.
114
INTRODUÇÃO A PYTHON
6 atrizes.remove("Adriana")
7 print(atrizes)
10 atrizes.pop(1)
11 print(atrizes)
12
14 atrizes.pop()
15 print(atrizes)
16
18 del atrizes[1]
19 print(atrizes)
20
<lista>.clear()
115
CLONANDO E COMPARANDO LISTAS
list(<lista>)
116
INTRODUÇÃO A PYTHON
lista1 = [1, 2, 3, 4]
lista2 = [1, 2, 3, 4]
lista3 = [1, 2, 4, 3]
5 backup = list(atrizes)
8 if backup == atrizes:
9 atrizes.clear()
11 else:
listaA.extend(listaB)
117
Agora, observe a situação em que temos a lista atrizes_
internacionais e desejamos incluir os seus elementos na lista
atrizes.
OCORRÊNCIAS DE ELEMENTOS E
COMPRIMENTO DA LISTA
<lista>.count(<elemento>)
118
INTRODUÇÃO A PYTHON
len(<lista>)
119
e sum(). As sintaxes são semelhantes à da função len(), cujo
argumento é o nome da lista, isto é:
min(<lista>)
max(<lista>)
sum(<lista>)
<lista>.index(<elemento>)
120
INTRODUÇÃO A PYTHON
121
1 atrizes = ["Adriana Prado", "Bárbara Borges", "Camila Queiroz",
2 "Danielle Winits", "Fernanda Paes Leme",
3 "Helena Ranaldi", "Paolla de Oliveira",
4 "Raquel Nunes", "Viola Davis"]
5
6 procurar_por = "Marina Ruy Barbosa"
7 if procurar_por in atrizes:
8 indice = atrizes.index(procurar_por)
9 print(f"{procurar_por} está no índice {indice}.")
10 else:
11 print(f"{procurar_por} não está na lista.")
índice: 0 1 2 3 4
122
INTRODUÇÃO A PYTHON
123
1 atrizes = ["Adriana", "Bárbara", "Camila", "Danielle", "Fernanda"]
2
3 for indice, nome in enumerate(atrizes):
4 print(f"{nome} está armazenado no índice {indice}")
LISTAS ANINHADAS
124
INTRODUÇÃO A PYTHON
A=[
[2, 1, -5],
[3, 7, 0],
[6, 4, 8]
]
lista [<indice_externo>][<indice_interno>]
125
1 A = [[2, 1, -5], [3, 7, 0], [6, 4, 8]]
2
3 tr_A = A[0][0] + A[1][1] + A[2][2]
4 print(f"tr(A) = {tr_A}")
5
6 # Soma dos elementos
7 soma_A = A[0][0] + A[0][1] + A[0][2]
8 soma_A += A[1][0] + A[1][1] + A[1][2]
9 soma_A += A[2][0] + A[2][1] + A[2][2]
10 print(f"soma(A) = {soma_A}")
126
INTRODUÇÃO A PYTHON
127
mática da diagonal principal de uma matriz quadrada é dada
pela coleção de elementos quando i = j. Quando a condição
definida na linha 12 é verdadeira, a variável tr_A será acumu-
lada com o respectivo valor do elemento da matriz. Por fim,
na linha 15, cada valor do elemento que é obtido da matriz é
acumulado na variável soma_A.
128
INTRODUÇÃO A PYTHON
129
“HACKATHON”, ou seja, a lista[A, A, O]. Por fim, a linha 9 uti-
liza os elementos da lista4 para gerar o cubo de cada elemento,
gerando a lista [1,8,27].
EXERCÍCIOS RESOLVIDOS
130
INTRODUÇÃO A PYTHON
2 import random
8 for j in range(linhas)]
10 for j in range(linhas)]
11
15 #linhas = len(A)
16 #colunas = len(A[0])
17
18 abaixoDP = 0
19 acimaDP = 0
20 for i in range(linhas):
21 for j in range(colunas):
23 abaixoDP += A[i][j]
131
24 if i < j: #Elemento acima da DP da matriz B
25 acimaDP += B[i][j]
26
27 print("Matriz A:")
28 # Imprime A
29 for i in range(linhas):
30 for j in range(colunas):
31 print(A[i][j], end=' ')
32 print()
33
34 print("\nMatriz B:")
35 # Imprime B
36 for i in range(linhas):
37 for j in range(colunas):
38 print(B[i][j], end=' ')
39 print()
40
41 print(f"Soma = {abaixoDP + acimaDP}")
132
INTRODUÇÃO A PYTHON
133
1 lin = int(input("Número de linhas: "))
2 col = int(input("Número de colunas: "))
3
4 # Se matriz não é quadrada não pode ser triangular
5 if lin != col:
6 print("Matriz não é triangular.")
7 else:
8 M = []
9 triangular = True
10 for i in range(lin):
11 ELEM = []
12 for j in range(col):
13 ELEM.append(int(input(f"M[{i+1}][{ j+1}] = "))))
14 M.append(ELEM)
15
16 print(“Matriz M:”)
17 for i in range(lin):
18 for j in range(col):
19 print(M[i][j], end=’ ‘)
20 print()
21
22 for i in range(lin):
23 for j in range(col):
24 # Elemento acima da DP?
25 if i < j:
26 # Se algum elemento acima da DP é diferente de 0
27 # M não pode ser tringular inferior
28 if M[i][j] != 0:
29 triangular = False
30 break # Encerra a busca
31
32 if triangular == True:
33 print(“M é uma matriz triangular inferior.”)
134
INTRODUÇÃO A PYTHON
34 else:
35 print("M não é uma matriz triangular inferior.")
M[1][1] =
M[1][2] =
M[1][3] =
135
Sabemos que enquanto houver linhas a serem percorridas, o
programa retornará para a linha 10 do código e, em seguida,
executará novamente a linha 11. Você conseguiu identificar o
motivo da nossa “jogada” (ELEM = [])? Fizemos isso porque a
variável está armazenando os valores informados pelo usuário
na iteração anterior. Se ELEM não fosse esvaziada, os elemen-
tos informados na iteração anterior seriam incluídos na linha
atual da matriz.
136
INTRODUÇÃO A PYTHON
EXERCÍCIOS PROPOSTOS
137
ser informados 3 parâmetros de entrada: a) primeiro termo da
PA, b) quantidade de termos da PA e c) razão dessa PA. Cons-
trua um programa para carregar e imprimir uma lista contendo
os termos da PA, bem como a soma dos elementos da PA.
Dica: Crie duas listas: uma para cadastrar os nomes dos nadado-
res e outra para guardar os seus respectivos tempos.
138
INTRODUÇÃO A PYTHON
139
Exemplos de uma matriz diagonal:
https://www.youtube.com/playlist?list=PLqsF5rntN2nbVBXuuRRCihFGmst03ismX
140
CAPÍTULO VI INTRODUÇÃO A PYTHON
DICIONÁRIOS
141
CHAVE VALOR
Carlos Eng. de
5566 3333-3333 M
Silva Telecomunicações
Heitor
7788 4444-4444 M Ciências da Computação
Brandão
Henrique
9910 5555-5555 M Eng. da Computação
Paiva
Letícia
1112 6666-6666 F Eng. Mecânica
Campos
Leila
1314 6666-6666 F Eng. Elétrica
Campos
ACESSANDO ELEMENTOS
142
INTRODUÇÃO A PYTHON
1 <dicionario> = {}
2 <dicionario>[<chave1>] = <valor1>
3 <dicionario>[<chave2>] = <valor2>
4 ...
5 <dicionario>[<chaveN>] = <valorN>
143
Uma outra maneira de acessar os elementos de um di-
cionário é usando o método get(), cuja sintaxe é a seguinte:
<dicionario>.get(<chave>)
<dicionario>.update({<chave>: <valor>})
Veja o exemplo no Programa 69.
1 contato = {"@camilaqueiroz": "Camila Queiroz",
2 "@paollaoliveirareal": "Paolla de Oliveira"}
3 contato.update({“@paollaoliveirareal”: “Paolla”})
4 contato.update({"@sheronmenezzes": "Sheron Menezes"})
5 contato.update({"@bruna_iconica": "Bruna Marquezine"})
6 print(contato)
144
INTRODUÇÃO A PYTHON
CONTANDO ELEMENTOS
len(<dicionario>)
145
1 <chave> in <dicionario>:
2 comandos
<dicionario>.keys()
146
INTRODUÇÃO A PYTHON
<dicionario>.values()
<dicionario>.items()
147
ORDENANDO ELEMENTOS
No entanto, se precisássemos que o ordenamento do
dicionário fosse baseado nos seus valores e não em suas cha-
ves, a função sorted(), em sua sintaxe básica, não atende-
ria a nossa necessidade. Para tal, precisaríamos utilizar uma
outra função chamada itemgetter().
Possivelmente, utilizando o dicionário que definimos
no Programa 76, você não perceberá o funcionamento de
itemgetter(). Portanto, faremos uma modificação no dicio-
nário de forma que, em vez dos valores armazenarem nomes
de atrizes, serão armazenadas as estaturas das atrizes em me-
148
INTRODUÇÃO A PYTHON
CLONANDO UM DICIONÁRIO
dict(<dicionario>)
149
Veja um exemplo no Programa 78.
REMOVENDO ELEMENTOS
<dicionario>.pop(<chave>)
ESVAZIANDO UM DICIONÁRIO
150
INTRODUÇÃO A PYTHON
<dicionario>.clear()
EXERCÍCIOS RESOLVIDOS
CHAVE VALOR
Código Nome Preço Unitário Qtde Comprada
1 Monitor LED 24” 599,99 1
2 Teclado wireless 49,26 1
3 Mouse wireless 19,90 1
4 Cartucho colorido 54,00 2
151
A partir do dicionário, o programa deve imprimir os itens da com-
pra e calcular o subtotal de cada um deles, ou seja, quantidade *
preço unitário. Por fim, o programa deve apresentar o valor total
da compra.
Vamos ao código:
1 produtos = {1: ['Monitor LED 24"', 599.99, 1],
2 2: ['Teclado wireless', 49.26, 1],
3 3: ['Mouse wireless', 19.9, 1],
4 4: ['Cartucho colorido', 54, 2]}
5 total = 0
6 for cod, prod in produtos.items():
7 subtotal = produtos[cod][1] * produtos[cod][2]
8 print(f"{ prod[0]}: R$ {subtotal:.2f}")
9 total += subtotal
10 print(20 * "-")
11 print(F"Total: R$ {total:.2f}")
Programa 81 – Exercício resolvido 6.1.
152
INTRODUÇÃO A PYTHON
153
ma ficará solicitando que o usuário informe os dados até o mo-
mento que informar que não deseja mais continuar.
Vamos ao código:
1 produtos = {}
2 while True:
3 cod = int(input("Código: "))
4 nome = input("Nome: ")
5 preco = float(input("R$: "))
6 qtde = int(input("Qtde: "))
7 prod = []
8 prod.append(nome)
9 prod.append(preco)
10 prod.append(qtde)
11 produtos.update({cod: prod})
12 resp = input("Deseja continuar [S|N]? ")
13 if resp == "N" or resp == "n":
14 break
15 total = 0
16 for cod, prod in produtos.items():
17 subtotal = produtos[cod][1] * produtos[cod][2]
18 print(f"{prod[0]}: R$ {subtotal:.2f}")
19 total += subtotal
20 print(20 * "-")
21 print(f"Total: R$ {total:.2f}")
154
INTRODUÇÃO A PYTHON
Vamos ao código:
155
1 funcionarios = {}
2 while True:
3 mat = int(input("Matrícula: "))
4 nome = input("Nome: ")
5 sal = float(input("Salário: R$ "))
6 func = []
7 func.append(nome)
8 func.append(sal)
9 funcionarios.update({mat: func})
10 resp = input("Deseja continuar [S|N]? ")
11 if resp == "N" or resp == "n":
12 break
13 for matricula, dados in funcionarios.items():
14 if dados[1] < 1500:
15 dados[1] = 1800
16 funcionarios.update({matricula: dados})
17 for matricula, dados in funcionarios.items():
18 print(f"Matrícula: {matricula}")
19 print(f"Nome: {dados[0]}")
20 print(f"Salário: {dados[1]:.2f}\n")
156
INTRODUÇÃO A PYTHON
EXERCÍCIOS PROPOSTOS
157
6. Crie um programa para uma nova plataforma de vídeo sob
demanda o qual deve armazenar o título da série e o nome
dos 2 principais atores. Ao final, o programa deve exibir uma
listagem contendo, de forma ordenada, o nome da série e os
nomes dos atores.
158
INTRODUÇÃO A PYTHON
159
CAPÍTULO VII
FUNÇÕES
160
INTRODUÇÃO A PYTHON
DECLARANDO FUNÇÕES
161
Figura 21 – Declaração de uma função em Python.
1 def exibirMensagem():
2 print("Python é fácil")
3 exibirMensagem()
4 exibirMensagem()
5 exibirMensagem()
No Programa 84, foi declarada uma função chamada
exibirMensagem, cujo corpo, ou seja, bloco de comandos,
tem apenas um comando de impressão com a frase "Python
é fácil". Perceba que uma vez declarada a função, podemos
162
INTRODUÇÃO A PYTHON
1 exibirMensagemBoasVindas()
2
3 def exibirMensagemBoasVindas():
4 print("Seja bem vindo")
163
Observe que entre os parênteses, utilizamos nomes
para os parâmetros da função. Nesse caso, são parâmetros
nomeados e obrigatórios, ou seja, não se pode tentar chamar
a função sem a presença deles. Veja o que acontece se você
tentar fazer esse destempero.
Figura 22 – Erro de chamada de função com parâmetros obrigatórios.
Você ainda pode declarar funções com parâmetros con-
tendo valores padrão. Isso significa dizer que agora você pode
até ignorar a passagem de parâmetros. Veja no Programa 88.
164
INTRODUÇÃO A PYTHON
EXERCÍCIOS RESOLVIDOS
1 def somarElementosLista(inteiros):
2 soma = 0
3 for valor in inteiros:
4 soma = soma + valor
5 return soma
6 print(somarElementosLista([3,4,6,9,10,23,13])) #Resultado 68
165
gatória para todo aspirante a programador. Inclusive, já trata-
mos sobre esse assunto no Capítulo 5, mas como encapsular
esse tipo de código em uma função? Esse é nosso trabalho.
166
INTRODUÇÃO A PYTHON
1 def fatorial(n):
2 if n == 0 or n == 1:
3 return 1
4 else:
5 return n * fatorial(n - 1)
6 for valor in [0,1,2,3,4,5,6]:
7 print(fatorial(valor))
Programa 90 – Exercício resolvido 7.2.
167
como se calcula um número fatorial:
168
INTRODUÇÃO A PYTHON
169
onde n é o número de elementos e m é a média dos valores.
1 def calcularMedia(lista):
2 soma = 0
3 for valor in lista:
4 soma += valor
5 return float(soma/len(lista))
6
7 def calcularDesvioPadrao(lista):
8 n = len(lista)
9 m = calcularMedia(lista)
10 soma = 0
11 import math
12 for valor in lista:
13 soma = soma + math.pow(valor - m, 2)
14 return math.sqrt((1/(n-1))*soma)
15
16 lista = [3,6,2,9,10,45,36,78,42,100]
17 print(calcularDesvioPadrao(lista))
170
INTRODUÇÃO A PYTHON
EXERCÍCIOS PROPOSTOS
171
1. Círculo
2. Triângulo
3. Retângulo
172
INTRODUÇÃO A PYTHON
173
8. Use o dicionário obtido por obtem_dados_funcionarios() e
construa uma função que retorne um dicionário com os dados
dos funcionários cujo tempo de serviço seja maior que 5 anos.
174
CAPÍTULO VIII INTRODUÇÃO A PYTHON
INTRODUÇÃO À
ORIENTAÇÃO A OBJETOS
175
marca das válvulas. Resumindo, o cliente deu mais importância
a algumas características do que a outras no contexto da com-
pra do carro, ou seja, ele focou no que achou necessário para
tomar sua decisão. Em uma oficina mecânica, o contexto seria
diferente e as características importantes, consequentemente,
seriam outras. Considerando o paradigma da orientação a ob-
jetos, o cliente usou o conceito de abstração, pois ele ressaltou
algumas características em detrimento de outras. Dizemos que
as características não inclusas foram abstraídas.
A seguir, veremos alguns conceitos da programação
orientada a objetos, bem como sua implementação na lingua-
gem Python. Aliás, vale ressaltar que Python é uma linguagem
totalmente orientada a objetos. Embora você possa utilizar o
paradigma da programação estruturada, tudo em Python é
objeto, conforme podemos observar na Figura 23. Lembre-se
que o comando type() retorna o tipo de uma variável ou de
um valor. Note que as saídas para os valores testados sempre
retornam class e logo após o tipo da classe.
176
INTRODUÇÃO A PYTHON
CLASSES E OBJETOS
177
Falando em atributos e comportamentos, entenda os
atributos como sendo a identidade do objeto e os comporta-
mentos como sendo os métodos, algo que ele executa. Na Figu-
ra 24, os atributos definem os diferentes clientes e as diferentes
contas, enquanto os métodos da classe Conta mudam o com-
portamento de um objeto à medida em que são executados.
Na Figura 25, é mostrada a instanciação de objetos a partir da
classe Cliente. Note que os valores dos atributos diferenciam
cada objeto uns dos outros. Sobre o funcionamento dos méto-
dos, falaremos deles com exemplos práticos na próxima seção.
178
INTRODUÇÃO A PYTHON
IMPLEMENTAÇÃO EM PYTHON
18 disponível em https://www.python.org/dev/peps/pep-0008/
179
indica que as classes não fazem nada no momento.
1 class Conta:
2 pass
3
4 class ContaBancaria:
5 pass
180
INTRODUÇÃO A PYTHON
181
descreveremos a seguir. Na linha 1, tem-se o comando para
criação da classe, enquanto nas linhas 2 – 5 tem-se o método
construtor como os atributos de uma conta, conforme já expli-
cado para a classe Cliente. Nas linhas 6 – 9, tem-se o método
exibirSaldo(self), que imprime o número, o nome do clien-
te e o saldo da conta do objeto. Note que o nome do cliente
é oriundo do atributo nome de um objeto da classe Cliente
(veja o Programa 93), exibido na linha 8. Nas linhas 10 – 12,
tem-se o método sacar(self, valor), que altera o atributo
saldo subtraindo o valor enviado como parâmetro, caso não fique
inferior a zero. Finalmente, nas linhas 13 – 14, tem-se o método
depositar(self, valor), que adiciona ao atributo saldo o va-
lor passado como argumento.
1 class Conta:
2 def __init__(self, numero, saldo, cliente):
3 self.numero = numero
4 self.saldo = saldo
5 self.cliente = cliente
6 def exibirSaldo(self):
7 print(f'Conta: {self.numero} || ', end='')
8 print(f'Cliente: {self.cliente.nome}')
9 print(f'Saldo: R$ {self.saldo:.2f} \n'.)
10 def sacar(self, valor):
11 if self.saldo >= valor:
12 self.saldo -= valor
13 def depositar(self, valor):
14 self.saldo += valor
182
INTRODUÇÃO A PYTHON
20 https://www.jetbrains.com/pycharm/
183
podem ser escritos no editor IDLE sem problemas.
184
INTRODUÇÃO A PYTHON
EXERCÍCIOS RESOLVIDOS
185
1 class Disciplina:
2 def __init__(self, nome, notas):
3 self.nome = nome
4 self.notas = notas
5 def calcularMedia(self):
6 return (self.notas[0] + self.notas[1]) / 2
7 def exibirSituacao(self):
8 media = self.calcularMedia()
9 if media >= 6.0:
10 return 'Aprovado'
11 elif media >= 3.0:
12 return 'Em Recuperação'
13 else:
14 return 'Reprovado'
186
INTRODUÇÃO A PYTHON
187
mostra o resultado da execução de teste_escola.py, testando
com as três situações possíveis (Aprovado, Em Recuperação e
Reprovado).
188
INTRODUÇÃO A PYTHON
1 class Conta:
2 def __init__(self, numero, saldo, clientes):
3 self.numero = numero
4 self.saldo = saldo
5 self.clientes = clientes
6 def exibirSaldo(self):
7 print(f'Conta: {self.numero} ')
8 print('Cliente(s): ', end='')
9 if type(self.clientes) is list:
10 for cliente in self.clientes:
11 print(f'{cliente.nome} | ', end='')
12 else:
13 print(self.clientes.nome, end=' | ')
14 print(f'Saldo: R$ {self.saldo:.2f} \n')
15 def sacar(self, valor):
16 if self.saldo >= valor:
17 self.saldo -= valor
18 def depositar(self, valor):
19 self.saldo += valor
189
teste da classe Conta modificada e o resultado da sua execução.
190
INTRODUÇÃO A PYTHON
1 class Conta:
2 def __init__(self, numero, saldo, clientes):
3 self.numero = numero
4 self.saldo = saldo
5 self.clientes = clientes
6 self.operacoes = []
7 def exibirSaldo(self):
8 print(f'Conta: {self.numero} ')
9 print('Cliente(s): ', end='')
10 if type(self.clientes) is list:
11 for cliente in self.clientes:
12 print(f'{cliente.nome} | ', end=''))
13 else:
14 print(self.clientes.nome, end=' | ')
15 print(f'Saldo: R$ {self.saldo:.2f} \n')
16 def sacar(self, valor):
17 if self.saldo >= valor:
18 self.saldo -= valor
19 self.operacoes.append(['Saque', valor])
19 self.operacoes.append([‘Saque’, valor])
20 def depositar(self, valor):
191
21 self.saldo += valor
22 self.operacoes.append(['Depósito', valor])
23 def exibirExtrato(self):
24 print(f"\nExtrato da Conta {self.numero}")
25 print("-------------------------")
26 for op in self.operacoes:
27 print(f"{op[0]} - R$ {op[1]:.2f}")
28 print("-------------------------")
29 print(f"## Saldo: R$ {self.saldo:.2f}")
192
INTRODUÇÃO A PYTHON
EXERCÍCIOS PROPOSTOS
193
5. Implemente uma calculadora que receba dois operadores
utilizando os conceitos de orientação a objetos aprendidos. Os
atributos op1 e op2 (operadores) são iniciados no construtor e os
métodos somar(), subtrair(), multiplicar(), dividir()
e calcularPotencia() realizam as respectivas ações nesses
atributos. Crie o programa de teste para a classe Calculadora.
194
INTRODUÇÃO A PYTHON
.
Crie o programa de teste, crie alguns pontos e calcule a distân-
cia entre eles.
195
CAPÍTULO IX
APLICAÇÕES DE SISTEMAS
OPERACIONAIS
CONCORRÊNCIA
196
INTRODUÇÃO A PYTHON
21 https://www.youtube.com/watch?v=Bj1ASK5NKoI
197
1 import threading
2
3 def trabalhador(num):
4 while(1):
5 print(f'Eu sou o trabalhador: {num} \n')
6 # return
7
8 for i in range(5):
9 t = threading.Thread(target=trabalhador, args=(i,))
10 t.start()
198
INTRODUÇÃO A PYTHON
1 import threading
2
3 def trabalhador(num):
4 while True:
5 ativas = threading.active_count()-1
6 print(f'Trabalhador {num} de {ativas} threads
ativas.')
7 #return
8
9 for i in range(5):
10 t = threading.Thread(target=trabalhador, args=(i,))
11 t.start()
199
1 import threading
2 from math import sin
3
4 def expo(x):
5 global resp_expo
6 resp_expo = x ** 2
7
8 def mult(x):
9 global resp_mult
10 resp_mult = 3 * x
11
12 def seno(x):
13 global resp_seno
14 resp_seno = sin(x)
15
16 if __name__ == '__main__':
17 x = 5
18
19 thread1 = threading.Thread(target=expo, args=(x,))
20 thread2 = threading.Thread(target=mult, args=(x,))
21 thread3 = threading.Thread(target=seno, args=(x,))
22 thread1.start()
23 thread2.start()
24 thread3.start()
25
26 fx = resp_expo + resp_mult + resp_seno
27 print('Equação f(x) = x^2 + 3*x + sen(x)')
28 print(f'Resultado para x = {x}: {fx}')
200
INTRODUÇÃO A PYTHON
201
1 import threading
2 from math import sin
3 import time
4
5 def expo(x):
6 global resp_expo
7 time.sleep(10)
8 resp_expo = x * x
9
10 def mult(x):
11 global resp_mult
12 time.sleep(15)
13 resp_mult = 3 * x
14
15 def seno(x):
16 global resp_seno
17 time.sleep(20)
18 resp_seno = sin(x)
19
20 if __name__ == '__main__':
21 x = 5
22
23 thread1 = threading.Thread(target=expo, args=(x,))
24 thread2 = threading.Thread(target=mult, args=(x,))
25 thread3 = threading.Thread(target=seno, args=(x,))
26 thread1.start()
27 #thread1.join()
28 thread2.start()
29 #thread2.join()
30 thread3.start()
31 #thread3.join()
32
33 fx = resp_expo + resp_mult + resp_seno
34 print('Equação f(x) = x^2 + 3*x + sen(x)')
35 print(f'Resultado para x = {x}: {fx}')
202
INTRODUÇÃO A PYTHON
203
produzir. Da mesma maneira, o consumidor não
deve perder a viagem e tentar consumir alguma
coisa se o armazém estiver vazio.
4. Sempre que o produtor encher o armazém ele
deve ir dormir. De forma semelhante, sempre que
o consumidor consumir tudo ele deve ir dormir.
Podemos colocar uma comunicação entre eles de
maneira que, sempre que um for dormir, acorda o
outro para trabalhar.
5. Sempre que houver a possibilidade de ambos tra-
balharem, devemos aproveitar, ou seja, se o arma-
zém estiver no meio, (nem cheio nem vazio), tanto
o produtor pode colocar coisas como o consumi-
dor pode pegar coisas.
204
INTRODUÇÃO A PYTHON
10 def run(self):
11 global armazem
12 while True:
13 trava.acquire()
14 armazem.append(random.randrange(0, 9))
15 print(f"Produzido {armazem[-1]}")
16 print(f"Lista do produtor {armazem}\n")
17 trava.release()
18 time.sleep(random.random())
19
20
21 class ConsumidorThread(Thread):
22 def run(self):
23 global armazem
24 while True:
25 trava.acquire()
26 if not armazem:
27 print("Armazém vazio (Consumidor tentará consumir)")
28 num = armazem.pop(0)
29 print(f"Consumiu {num}")
30 print(f"Lista do consumidor {armazem}\n")
31 trava.release()
32 time.sleep(random.random())
33
34
35 if __name__ == '__main__':
36 ProdutorThread().start()
37 ConsumidorThread().start()
205
Na linha 5, criamos o local onde armazenaremos o que
for produzido. Na linha 6, criamos uma variável que bloqueia
o local que tenha condição de corrida, ou seja, onde haja o ris-
co de corrupção de dados se duas threads tentarem acessar
ao mesmo tempo. Nas linhas 9 - 18, temos o nosso produtor.
Ele é responsável por, antes de colocar algo no armazém, blo-
queá-lo (linha 13) e, depois que produzir, liberá-lo (linha 17).
Na linha 14, ele produz número aleatórios de 0 - 9 e os guarda
no armazém. Na linha 18, há uma simples parada aleatória de
tempo. Nas linhas 15 e 16, imprime na tela o que produziu e
todo o conteúdo do armazém, respectivamente. Nas linhas 21
a 32, temos nosso consumidor. Sempre que vai consumir ele
também trava o armazém (linha 25) e destrava após o consumo
(linha 31). Na linha 28, ele remove um elemento do armazém
e nas linhas 29 e 30 imprime o que consumiu e como ficou o
armazém, respectivamente. O detalhe na linha 26 é que se o
armazém estiver vazio, ele avisará isso, mas provocará um erro
na linha 28, informando que está tentando executar o método
pop() pop, que serve para remover um elemento, mas o ar-
mazém está vazio. Na linha 32, ele descansará um tempo. Nas
linhas 36 e 37, ocorrem as chamadas de execução da threads.
Vamos então fazer o seguinte: se o consumidor vê que
o armazém está vazio, ele vai dormir e o produtor, sempre que
produzir algo, acorda o consumidor. Para isso, vamos utilizar
um objeto chamado condition.
Vamos ao código:
206
INTRODUÇÃO A PYTHON
207
Na linha 6, a trava mudou de lock para condi-
tion. Na linha 17, sempre que o produtor produz, avisa ao
consumidor. Na linha 27, onde o consumidor verifica se o
armazém está vazio, além de imprimir na tela que não tem
nada e vai dormir, ele de fato dorme, pois na linha 29 esta-
mos usando a função wait. Agora, quando o consumidor re-
ceber a notificação do produtor ele acordará e imprimirá que
o produtor já adicionou alguma coisa e o está avisando na
linha 30. Vale lembrar que o notify do consumidor não libera
a trava, apenas acorda o consumidor, mas ele só terá aces-
so ao armazém depois da linha 18 ser executada, ou seja, o
release da trava.
Até agora, nosso produtor pode produzir indefinida-
mente, mas como não existe armazém infinito, vamos limitar
nosso armazém e colocar essa restrição ao nosso produtor.
Ou seja, se o armazém estiver cheio, ele é quem pode ir dor-
mir e aguardar que o consumidor o acorde. O Programa 107
ilustra esta situação.
208
INTRODUÇÃO A PYTHON
16 if len(armazem) == TAM_ARM:
17 print("Armazém cheio, Produtor vai dormir")
18 trava.wait()
19 print("Existe espaço no armazém, "
"Consumidor avisou o produtor")
20 armazem.append(random.randrange(0, 9))
21 print(f"Produzido {armazem[-1]}")
22 print(f"Lista do produtor {armazem}\n")
23 trava.notify()
24 trava.release()
25 time.sleep(random.random())
26
27
28 class ConsumidorThread(Thread):
29 def run(self):
30 global armazem
31 while True:
32 trava.acquire()
33 if not armazem:
34 print("Nada no Armazém, o Consumidor irá dormir")
35 trava.wait()
36 print("Produtor adicionou algo ao armazém e avisou")
37 num = armazem.pop(0)
38 print(f"Consumiu {num}")
39 print(f"Lista do consumidor {armazem}\n")
40 trava.notify()
41 trava.release()
42 time.sleep(random.random())
43
44
45 if __name__ == '__main__':
46 ProdutorThread().start()
47 ConsumidorThread().start()
209
Na linha 7, temos o tamanho do nosso armazém e o
consumidor testa se ele já está cheio na linha 16. Se estiver, ele
avisa em tela na linha 17 e vai dormir (linha 18). No consumidor,
tivemos que colocar o aviso para o produtor na linha 40, e se o
produtor acordar, ele imprimirá que existe espaço e que foi avi-
sado pelo consumidor (linha 19). Aqui acontece da mesma forma
que no código anterior, no qual o produtor só poderá acessar o
armazém depois que o consumidor liberar a trava (linha 41).
Nosso produtor está funcionando muito bem, mas e se
desejarmos ter mais de um produtor. Será que esse código vai
funcionar? Vamos testar! O Programa 108 ilustra essa situação.
210
INTRODUÇÃO A PYTHON
25 time.sleep(random.random())
26
27
28 class ConsumidorThread(Thread):
29 def run(self):
30 global armazem
31 while True:
32 trava.acquire()
33 if not armazem:
35 trava.wait()
37 num = armazem.pop(0)
38 print(f"Consumiu {num}")
40 trava.notify()
41 trava.release()
211
dicional para cada um e garantir ainda que a chave do armazém
seja bloqueada. Outra coisa que faremos é, em vez de somente
verificar se o armazém está vazio (está com estoque igual a zero)
ou se está cheio (se o estoque é igual a capacidade), iremos desta
vez verificar se ele for maior que zero significa ou não, ou seja,
qualquer consumidor pode ser executado ou se ele é menor que
a capacidade do armazém ou não, isto é, qualquer produtor pode
ser executado. O Programa 109 ilustra essa situação.
212
INTRODUÇÃO A PYTHON
26 else:
27 print("Armazém cheio, Produtor vai dormir")
28 if trava.locked():
29 trava.release()
30 dorme_consumidor.notify()
31 dorme_consumidor.release()
32 dorme_produtor.wait()
33
34 if trava.locked():
35 trava.release()
36 time.sleep(random.random())
37
38
39 class ConsumidorThread(Thread):
40 def run(self):
41 global armazem
42 while True:
43 trava.acquire()
44 dorme_produtor.acquire()
45 dorme_consumidor.acquire()
46 if len(armazem) > 0:
47 num = armazem.pop(0)
48 print(f"Consumiu {num}")
49 print(f"Lista do consumidor {armazem}\n")
50
51 dorme_consumidor.release()
52 dorme_produtor.release()
53 else:
54 print("Armazém vazio: Consumidor irá dormir")
55
56 if trava.locked():
57 trava.release()
58
59 dorme_produtor.notify()
60 dorme_produtor.release()
61 dorme_consumidor.wait()
213
62
63 if trava.locked():
64 trava.release()
65 time.sleep(random.random())
66
67
68 if __name__ == '__main__':
69 Produtor1 = ProdutorThread()
70 Produtor2 = ProdutorThread()
71 Produtor1.start()
72 Produtor2.start()
73
74 Consumidor1 = ConsumidorThread()
75 Consumidor2 = ConsumidorThread()
76 Consumidor1.start()
77 Consumidor2.start()
214
INTRODUÇÃO A PYTHON
215
13 def __init__(self, threadID):
14 Thread.__init__(self)
15 self.threadID = threadID
16
17 def run(self):
18 global armazem
19 while True:
20 trava.acquire()
21 dorme_produtor.acquire()
22 dorme_consumidor.acquire()
23 if len(armazem) < TAM_ARM:
24 armazem.append(random.randrange(0, 9))
25 print(f"Produtor {self.threadID} produziu {armazem[-1]}")
26 print(f"Lista do produtor {armazem}\n")
27
28 dorme_consumidor.release()
29 dorme_produtor.release()
30 else:
31 print(f"Armazém cheio, Produtor {self.threadID} vai dormir")
32 if trava.locked():
33 trava.release()
34 dorme_consumidor.notify()
35 dorme_consumidor.release()
36 dorme_produtor.wait()
37
38 if trava.locked():
39 trava.release()
40 time.sleep(random.random())
41
42
43 class ConsumidorThread(Thread):
44 def __init__(self, threadID):
45 Thread.__init__(self)
46 self.threadID = threadID
47
216
INTRODUÇÃO A PYTHON
48 def run(self):
49 global armazem
50 while True:
51 trava.acquire()
52 dorme_produtor.acquire()
53 dorme_consumidor.acquire()
54 if len(armazem) > 0:
55 num = armazem.pop(0)
56 print(f"Consumidor {self.threadID} consumiu {num}")
57 print(f"Lista do consumidor {armazem}\n")
58
59 dorme_consumidor.release()
60 dorme_produtor.release()
61 else:
62 print(f"Armazém vazio. Consumidor {self.threadID} irá dormir")
63
64 if trava.locked():
65 trava.release()
66
67 dorme_produtor.notify()
68 dorme_produtor.release()
69 dorme_consumidor.wait()
70
71 if trava.locked():
72 trava.release()
73 time.sleep(random.random())
74
75
76 if __name__ == '__main__':
77 numprod = 2 # quantidade de produtores
78 numcons = 2 # quantidade de consumidores
79
80 for i in range(numprod):
81 t = ProdutorThread(i)
82 t.start()
83
84 for i in range(numcons):
85 t = ConsumidorThread(i)
86 t.start()
numa variável.
217
Nas linhas 13 e 44, os métodos construtores associam o
identificador de cada thread. Nas linhas 25, 31, 56 e 62, modifica-
mos a impressão para mostrar a identificação das threads. Nas li-
nhas 80 - 82 e 84 - 86, criamos as threads com um laço enviando
com repetição baseada no número de threads definidas nas linhas
77 e 78 e enviando o índice como identificador da thread nas linhas
81 e 85.
Ainda gostaríamos de compartilhar com vocês um outro
código. Bem, sempre propomos essas atividades em sala de aula
e geralmente utilizamos a linguagem de programação C para mos-
trar a sua complexidade e, em seguida, utilizamos Python. Afinal, o
que vem fácil também vai fácil. Talvez não tenha combinado bem o
ditado popular, mas o fato é que um dos nossos alunos implemen-
tou, usando somente variáveis globais, um produtor e consumidor
bem simples e funcional e deixamos para vocês fazerem modifica-
ções que desejarem, como por exemplo executar com vários pro-
dutores e consumidores. O código é mostrado no Programa 111.
1 import threading
2 import time
3 from random import randrange
4
5
6 class ProdutorConsumidor():
7
8 def produtor(self):
9 global gravando
10 global dados
11 dados = []
12
13 while True:
14 try:
15 if len(dados) < 10:
16 gravando = True
17 dados.append(randrange(0, 9))
18 print(f"\nProduziu {dados[-1]}")
19 print(f"\nLista do produtor {dados}\n")
20 gravando = False
21 # time.sleep(0.6)
218
INTRODUÇÃO A PYTHON
22 except KeyboardInterrupt:
23 print("Produtor parou")
24 break
25
26 def consumidor(self):
27 while True:
28 try:
29 # time.sleep(1)
30 if gravando == False and len(dados) > 0:
31 print(f"\nConsumiu {dados[0]}")
32 del (dados[0])
33 print(f"\nLista do consumidor {dados}\n")
34 except KeyboardInterrupt:
35 print("Consumidor parou")
36 break
37
38
39 if __name__ == '__main__':
40 produtorConsumidor = ProdutorConsumidor()
41
42 p1 = threading.Thread(target=produtorConsumidor.produtor)
43 c1 = threading.Thread(target=produtorConsumidor.consumidor)
44
45 p1.start()
46 c1.start()
219
talheres, mas inviabilizaria os próximos filósofos na sequência, o
imediatamente seguinte pois ficaria sem o seu talher da esquerda
e o outro que já está sem o seu talher da direita pois o primeiro filó-
sofo já tinha pego. Assim quando esses dois filósofos encerrarem o
jantar vão voltar a pensar e permitirão que outros possam comer.
Eles se revezam neste processo de maneira que ninguém deve co-
mer indefinidamente e deixe os outros morrerem de fome.
Um problema grave que pode acontecer é o seguinte: se
cada filósofo pega o seu talher à direita, por exemplo, o que vai
acontecer é que todos vão ficar esperando o talher da esquerda e
esse nunca será liberado. Em sistemas operacionais, essa condição
é chamada de deadlock. Existem várias soluções para o problema e
Machado e Maia (2007) citam 3 possíveis soluções: a) permitir que
apenas 4 filósofos sentem à mesa simultaneamente, b) permitir
que um filósofo pegue o talher somente se o outro estiver dispo-
nível, e c) permitir que um filósofo par pegue o talher da esquerda
primeiro e o filósofo impar pegue o talher da direita primeiro.
220
INTRODUÇÃO A PYTHON
221
33 print(f'> {self.nome}: O garfo da DIREITA está com '
34 f'{direita}, soltei o da ESQUERDA')
35 garfos[self.garfoEsq] = 0
36 else:
37 print(f'> {self.nome}: Tentei pegar o garfo da '
38 f'ESQUERDA, mas está com {esquerda}')
39 return
40
41 self.jantando()
42 garfos[self.garfoDir] = 0
43 garfos[self.garfoEsq] = 0
44
45 def jantando(self):
46 print(f'> {self.nome}: peguei o garfo da DIREITA, e '
47 f'COMECEI a comer')
48 sleep(uniform(5, 10))
49 print(f'> {self.nome} Terminei de comer, e soltei os garfos')
50
51
52 if __name__ == '__main__':
53 garfos = [0] * 5
54 nomes = ['Aristoteles', 'Kant', 'Platao', 'Socrates', 'Russel']
55 filosofos = []
56
57 for i, nome in enumerate(nomes):
58 fil = Filosofo(nome, i - 1, i)
59 filosofos.append(fil)
60
61 for f in filosofos:
62 f.start()
222
INTRODUÇÃO A PYTHON
223
nição dos nomes para os filósofos e a linha 55 a criação do vetor
para guardar as threads dos filósofos. Nas linhas 57 a 59, criamos
uma lista de threads e nas linhas 61 e 62 as inicializações. Se seu
interpretador permitir fazer debug e rodar linha a linha, pode-se
executar a linha 62 aos poucos e colocar os filósofos à mesa vaga-
rosamente e ver a disputa dos talheres. Repare que nas linhas 15,
22, 27 e 48 temos um tempo apenas para melhorar a visualização
da saída, mas esses poderiam ser removidos em uma solução en-
volvendo um problema real (na verdade, deveriam ser removidos
por questão de desempenho).
Assim como o problema dos filósofos, outros se segui-
ram, os quais não serão abordados aqui, mas que são interessan-
tes para serem praticados, quais sejam: o problema do barbei-
ro, que pode ser visto no capítulo 7 do livro de Machado e Maia
(2007), o problema dos leitores e escritores, que pode ser visto no
Capítulo 2 de Tanenbaum (2010), entre outros.
ESCALONAMENTO
224
INTRODUÇÃO A PYTHON
225
c. o tempo de duração de P1 = 24, P2 = 3 e P3 = 4
d. tempo de retorno (a) - (b) então P1 = 24 - 0 = 24, P2 =
27 - 0 = 27, P3 = 31 - 0 = 31
e. tempo espera (d) - (c) então P1 = 24 - 24 = 0, P2 = 27 - 3
= 24, P3 = 31 - 4 = 27
f. tempo médio de espera P1(e) + P2(e) + P3(e) / 3 = (0 +
24 + 27)/3 = 17
g. tempo médio de retorno P1(d) + P2(d) + P3(d) / 3 = (24
+ 27 + 31) / 3 = 27,33
226
INTRODUÇÃO A PYTHON
22
23 print("Processos \t\t Tempo Duração \t\t"
24 " Tempo Espera \t\t Tempo Retorno")
25
26 for i in range(n):
27 total_te = total_te + te[i]
28 total_tr = total_tr + tr[i]
29 print(f"{i + 1} \t\t\t\t\t"
30 f"{td[i]} \t\t\t\t\t "
31 f"{te[i]} \t\t\t\t\t {tr[i]}")
32
33 print(f"Tempo médio espera = {total_te / n}")
39 print(f"Tempo médio retorno = {total_tr / n}")
35
36
37 if __name__ == "__main__":
38 processos = [1, 2, 3]
39 n = len(processos)
40 duracao = [24, 3, 4]
41 calculandoTempoMedio(processos, n, duracao)
227
das funções de calcular o tempo de espera e o tempo de retorno,
respectivamente. Nas linhas 23 e 24, imprimimos o cabeçalho das
colunas com os processos e seus tempos. Na linha 27, calculamos
iterativamente o tempo total de espera como a soma de cada
tempo de espera dos processos, e na linha 28 fazemos o mesmo
para o tempo total de retorno. Nas linhas 29 a 31, imprimimos
os valores de cada processo e nas linhas 33 e 34, calculamos e
imprimimos os tempos médio de espera e de retorno, respectiva-
mente. Na linha 38, definimos a quantidade de processos e uma
numeração para eles. Na linha 40, definimos os tempos de dura-
ção de cada processo. Por fim, na linha 41, chamamos a função
que calcula os tempos médio e fará todo o trabalho.
Vamos considerar processos chegando em tempos dife-
rentes, conforme a Figura 33, e fazer novamente os cálculos. O
Programa 114 ilustra essa situação.
228
INTRODUÇÃO A PYTHON
8 - 1 = 7, P3 = 16 - 2 = 14, P4 = 22 - 3 = 19
e. tempo de espera (d) - (c) então P1 = 5 - 5 = 0, P2 = 7 - 3
= 4, P3 = 14 - 8 = 6, P4 = 19 - 6 = 13
f. tempo médio de espera P1(e) + P2(e) + P3(e) + P4(e) /
4 = (0 + 4 + 6 + 13) / 4 = 5,75
g. tempo médio de retorno P1(d) + P2(d) + P3(d) + P4(d)
/ 4 = (5 + 7 + 14 + 19) / 4 = 11,25
229
23 print("Processos \t\t Tempo Duração \t\t"
24 " Tempo Espera \t\t Tempo Retorno")
25
26 for i in range(n):
27 total_te = total_te + te[i]
28 total_tr = total_tr + tr[i]
29 print(f"{i + 1} \t\t\t\t\t"
30 f"{td[i]} \t\t\t\t\t"
31 f"{te[i]} \t\t\t\t\t {tr[i]}")
32
33 print(f"Tempo médio espera = {total_te / n}")
34 print(f"Tempo médio retorno = {total_tr / n}")
35
36
37 if __name__ == "__main__":
38 processos = [1, 2, 3, 4]
39 chegada = [0, 1, 2, 3]
40 n = len(processos)
41 duracao = [5, 3, 8, 6]
42 calculandoTempoMedio(processos, n, duracao, chegada)
230
INTRODUÇÃO A PYTHON
231
e. tempo de espera (d) - (c) então P1 = 31 - 24 = 7, P2 =
3 - 3 = 0, P3 = 7 - 4 = 3
f. tempo médio de espera P1(e) + P2(e) + P3(e) / 4 = (7
+ 0 + 3 ) / 3 = 3,33
g. tempo médio de retorno P1(d) + P2(d) + P3(d) / 3 =
(31 + 3 + 7) / 3 = 13,66
232
INTRODUÇÃO A PYTHON
233
Figura 35 – Algoritmo SJF com preempção.
234
INTRODUÇÃO A PYTHON
REFERÊNCIAS
235
vel em: https://www.geeksforgeeks.org/program-for-fcfs-cpu-s-
cheduling-set-1/. Acesso em: 17 jul. 2019.
236
Todos os direitos são reservados à Editora IFRN, não podendo
ser comercializado em período de contrato de cessão de direi-
tos autorais.
Em caso de reimpressão com recursos próprios do autor, está
liberada a sua comercialização
A Editora do Instituto Federal de Educação,
Ciência e Tecnologia do Rio Grande do
Norte (IFRN) já publicou livros em todas as
áreas do conhecimento, ultrapassando a
marca de 150 títulos. Atualmente, a edição
de suas obras está direcionada a cinco linhas
editoriais, quais sejam: acadêmica, técnico-
científica, de apoio didático-pedagógico,
artístico-literária ou cultural potiguar.