15 Python
15 Python
MÓDULO 15
PYTHON
DO ZERO ABSOLUTO
Papa Francisco
@ProfessorJoaoAntonio
https://professorjoaoantonio.com.br
Apresentação do Autor
Olá, querido leitor, estimada leitora,
Meu nome é João Antonio e sou professor de informática desde 1996. Já ensinei a mais de 500 mil alunos no
Brasil e no exterior, como Portugal e Angola.
Neste documento, eu explico a linguagem de Programação Python e conceitos de lógica de programação, ideais
para responder as questões das provas de Concursos onde estes temas são importantes, mas também busco
ensinar, por meio desta apostila, a você a realmente programar de forma prática!!
https://www.facebook.com/ProfessorJoaoAntonio
https://www.youtube.com/ProfessorJoaoAntonio
https://www.instagram.com/ProfessorJoaoAntonio
https://t.me/ProfessorJoaoAntonio
https://t.me/CanalJoaoAntonio (meu canal no Telegram)
Linguagem de Programação: conjunto de códigos, palavras especiais e regras que nos permite criar programas
de computador (aplicativos e sites da internet, por exemplo).
Alto nível: significa que ela é bem próxima da nossa linguagem (da linguagem humana), portanto, é mais agradável
de aprender e entender!
Python é usada para muitas coisas, como programação de sites (ou seja, fazer páginas da web), análise de dados,
computação científica e inteligência artificial. Python é muito fácil de aprender e muito poderosa. Usaremos aqui,
neste material, a versão 3.13 (pode ser que você esteja usando uma versão mais atual: não tem problema!)
Como é que se
"fala" o nome
Python, João?
Que bom que perguntou, meu amigo. O nome da linguagem se fala normalmente "Páiton" ou "Páisson" (esse "ss"
é falado com a língua entre os dentes se você quiser "dar uma de bonzão, diferentão, bonitão que fala inglês com
sotaque perfeito").
Você também pode acionar o Python a partir do Menu Iniciar, no Windows (caso você
use o Windows), como visto aqui ao lado. O ícone do IDLE se encontra dentro do grupo
Python 3.132.
A parte mais importante desta janela é chamada de Prompt (ou "aviso"). É justamente aquele sinal de três "setas"
(>>>) que aparece para esperar os seus comandos.
1
Chamamos de IDE (Ambiente de Desenvolvimento Integrado) o conjunto de programas de computador que nos permitirá escrever nossos códigos em
Python e testá-los. Vamos usar muito este IDLE que vem junto com o Python, mas também aprenderemos a usar outros ao longo deste curso.
2
Você pode estar usando uma versão diferente do Python, portanto, os nomes podem ser diferentes daqueles mostrados neste texto. Eu uso a versão 3.13
para este documento.
[C] O Shell do Python obedece ao seu comando (e às vezes mostra saída na tela);
[D] O Shell do Python mostra o prompt novamente, esperando o seu próximo comando.
O Shell do Python é um ambiente Interativo, porque ele interage com você, ou seja, ele responde a você, usuário,
quando você está "dando as ordens".
Sim, meu amigo! No prompt, você pode escrever diretamente a expressão matemática desejada, sem precisar
usar o print(), e o Shell vai responder normalmente. Veja na imagem abaixo:
Veja algumas das formas de você solicitar que o Shell do Python mostre
dados: sejam eles números, sejam textos ou resultados de cálculos
matemáticos.
[A] Não é necessário usar a função print no Shell para mostrar resultados – você pode escrever diretamente o
que deseja e o Shell vai mostrar.
[B] Se você pede que o Shell mostre textos, eles devem ser escritos entre aspas (simples ou duplas, tanto faz),
ou seja, "assim" ou 'assim';
[C] Se você pede que o Shell mostre números ou resultados de cálculos, eles não podem ser escritos entre
aspas (pois seriam entendidos como textos).
>>>
A sua idade
>>>
>>>
>>>
>>>
O que vai ser mostrado no shell do Python para cada comando a seguir:
>>> 8+10
>>> print("30+20")
Mas o Shell não é a única janela do programa. Existe uma outra janela que usaremos bastante chamada Editor
de Código (ou simplesmente Editor).
Você pode abrir várias janelas do Editor enquanto estiver trabalhando no IDLE. Para abrir uma nova janela do
Editor do Python, você aciona o menu File (ou Arquivo) no menu superior e, dentro dele, aciona New File (Novo
Arquivo, em português).
Para abrir uma nova janela do Editor, acione a opção New File que aparece dentro do menu
File.
O Editor parece uma coisa bem sem-graça: é uma janela toda em branco, apenas com o menu lá em cima e o
cursor piscando, pronto para você digitar com ele.
O Editor não é interativo como o Shell. O Editor não obedece a você na hora. Ele não responde imediatamente
aos seus comandos. Você vai escrever no Editor os seus programas – os seus scripts – e só depois você mandará
o Python obedecer a tudo.
Programa: é uma sequência de comandos que o programador escreve e que o computador obedece exatamente
em ordem – de uma vez só.
No Shell, cada comando é obedecido quando você pressiona ENTER – um por vez – manualmente. Num programa,
você escreve todos eles e depois manda que sejam obedecidos de uma vez só.
A imagem a seguir mostra um exemplo de um código escrito na linguagem Python dentro na janela do Editor.
Perceba que o editor é "esperto" e consegue colorir certas palavras e expressões especiais com cores distintas.
Você vai se acostumar com isso.
Note lá em cima a palavra *Untitled* entre asteriscos. Isso indica que o conteúdo
da janela foi modificado, mas ainda não foi salvo. NUNCA SE ESQUEÇA DE
SALVAR!
As cores foram dadas pelo próprio editor (esperto, não?): ele identifica
texto com a cor verde e print, que é uma palavra interna da linguagem,
na cor roxa – essas cores podem mudar de janela para janela!
O próximo passo é salvar o nosso código (para poder usarmos depois, se quisermos).
Caro amigo, a ação de fazer o computador obedecer ao nosso código é chamada de executar o programa ou
rodar o programa ("rodar" porque os programas antigamente eram gravados em fitas que giravam: você não é
dessa época e isso é só uma curiosidade).
No inglês, o verbo é "run", que quer dizer "correr", portanto, run a program significa "correr o programa" ou
"rodar o programa" ou "executar o programa" ou, finalmente, "fazer o programa funcionar".
Porém, antes de executar o programa para ver o computador obedecendo a ele, temos que salvar o nosso código
(o IDLE do Python não deixa você rodar o programa sem tê-lo salvo e você vai perceber isso da pior maneira: vai
ficar de saco cheio de tantos lembretes!).
Acione, lá em cima, no menu superior, a opção File (Arquivo) e clique em Save (Salvar). É possível usar, também,
o atalho CTRL+S. Confira na imagem.
Comando Save (Salvar), dentro do menu File (Arquivo) que também pode ser
acionado pela combinação de teclas CTRL+S.
Para executar este programa, ou seja, fazê-lo funcionar, basta acionar o comando Run Module (Executar Módulo)
que está dentro do menu superior Run (Executar). Outra forma de executar este comando é pela tecla de atalho
F5.
Comando Run Module, dentro do menu Run. Ele pode ser acionado
também pela tecla F5.
Todo programa é executado (ou seja, funciona) numa janela do Shell. Programas são construídos na janela do
Editor, mas são executados na janela do Shell. Olha só o resultado deste nosso exemplo na figura a seguir:
Por isso apareceram apenas duas linhas: o texto Quem é John Galt? e o
número 42.
Esta é a saída do programa, ou também chamada de resposta do programa (que é aquilo que o programa foi
construído para mostrar ao usuário).
Então é isso! Por hoje é só revisar para você não esquecer que:
[B] Você precisa salvar o código (que também pode ser chamado de script) Python num arquivo com
extensão .py.
[C] Quando você executa o código (manda ele "trabalhar"), ele é executado (e mostra sua saída, se houver
saída) numa janela do Shell do IDLE Python.
Um destes editores é o Sublime Text, que pode ser usado para escrever códigos em diversas linguagens de
programação, inclusive em Python.
Também é possível usar IDEs (Ambientes de Desenvolvimento Integrado) completos, não somente editores de
texto. Um destes ambientes completos que podem ser instalados em paralelo com o Python é o PyCharm.
Não se preocupe em usar qualquer editor ou ambiente – todos funcionarão igualmente, inclusive o ambiente do
próprio Python, por mais simples que ele seja.
O que importa é que você vai aprender a linguagem. O ambiente que você escolherá dependerá unicamente de
você!
print(20+22)
print("80 + 12")
Eu, porém, acho melhor explicar (como sempre faço) da maneira mais clara e mais "para crianças" possível.
Espero que você não se sinta constrangido com isso. Em primeiro lugar, é bom explicar que você não é o usuário!
Você é o programador. Você é O CARA! Você é a entidade cósmica superior que está criando um programa que
será usado por um usuário.
Usuário: é a criatura nefasta que Deus colocou na tua vida para expiar os teus pecados por toda a eternidade! E
o pior: você vai se acostumar a amá-lo e odiá-lo!
Bom, acontece que o seu trabalho é criar um programa – um aplicativo ou um jogo, talvez – que será usado por
um ou mais usuários! E em muitos momentos o seu programa terá que "mostrar" coisas ao usuário, como
mensagens, avisos, nomes, números, resultados de cálculos, entre outras coisas...E é justamente aí que a função
print() trabalha!
É a função print() que usamos para colocar dados, mensagens, avisos, números e tudo mais na tela. Aquilo
que o usuário vai ver quando estiver usando o programa é resultado de uma função print(). Por isso a função
print() é a função que faz a saída de dados: ela faz os dados saírem (na tela) para que o usuário os veja!
Poder, até pode, nerd... quem sou eu pra te impedir, né? Mas o nome certo é função, mesmo! print() é uma função
básica na linguagem Python. Veremos isso mais tarde!
Na verdade, toda função – não somente a print() – se escreve do mesmo jeito: nome(argumentos). Onde nome é
o nome da função em si e argumentos são as informações de que a função precisa para trabalhar.
Ou seja, você coloca, dentro dos parênteses, os parâmetros (ou argumentos) da função, ou seja, as informações
que a função print() vai mostrar, já que o trabalho dela é mostrar na tela.
A função print() é uma das funções Built-In3 do Python. Ou seja, é uma das funções que já vêm junto com o
próprio Python, sem precisar ser trazida ou construída posteriormente. Ela "já vem de fábrica" com a linguagem
Python.
Com a função print(), você pode mostrar muitos tipos diferentes de informações, como textos, números e
resultados de expressões (como cálculos matemáticos).
3
A expressão Built-In pode ser traduzida como "já vem construída dentro de...". Ou seja, uma função Built-In é uma função que já vem fabricada junto com
a própria linguagem Python: é parte integrante dela.
Para mostrar textos na tela para o usuário, é só colocar o texto desejado dentro dos parênteses da função entre
aspas (simples ou duplas) e ele será colocado exatamente daquele jeito na tela (as aspas não aparecerão para o
usuário – elas indicam apenas que aquilo é texto). Esquecer as aspas vai dar problema! Se liga!
Perceba o erro que aconteceu pelo fato de eu ter esquecido de colocar aspas
na expressão "John M. Keynes".
Não esqueça: se é texto, tem que escrever entre aspas (simples ou duplas).
A função print() pode ser usada com números e cálculos (expressões matemáticas) bastando informar, dentro
dos parênteses, o que deseja mostrar, sem aspas.
Podemos aproveitar o momento de apresentações e já mostrar alguns dos principais cálculos que podemos fazer
no Python:
[A] Para somar, use o símbolo de + (mais), como em print(80+30) – isso dá 110.
[C] Para multiplicar, use o símbolo de * (asterisco), como em print(4*3) – isso dá 12.
[D] Para dividir, use o símbolo de / (barra), como em print(18/6) – isso dá 3.0.
[E] Para elevar um número a uma potência, use ** (duplo asterisco), como em print(2**3) – isso significa 23,
ou seja, dá 8.
Nas próximas lições, vamos ser apresentados a uma variedade maior de símbolos que fazem cálculos (esses
símbolos são chamados de operadores matemáticos).
Números e outros valores são chamados de operandos. Sinais que realizam os cálculos, como os que vimos
acima, são chamados de operadores. Então, operador é quem realiza a operação e operando é quem sofre
(recebe) a operação.
E só mais um lembrete importante: não importa se há espaços entre os operadores e operandos num cálculo. Ou
seja, se você escreve 3+4 ou 3 + 4 ou 3 + 4, não faz diferença – todos darão o mesmo resultado.
Muita gente pensa que não dá para fazer "cálculos" com textos... mas dá! No Python, especialmente, podemos
usar dois operadores diretamente com textos: o sinal de + e o sinal de *. Ou seja, podemos "somar" e "multiplicar"
textos. Que tal?
Note, mais uma vez, que, para o Python, não importa se você escreve textos "assim" ou se
escreve-os 'assim'... tanto faz usar aspas duplas ou aspas simples.
Explicando: quando usado com textos, o sinal de + (adição) passa a realizar uma concatenação – ou seja, o sinal
de + concatena textos.
Concatenar: é o mesmo que fundir, ou unir, ou juntar textos. Transforma dois ou mais textos em um só – "tudo
junto e misturado".
Lembre-se que o resultado da concatenação é "tudo junto" mesmo! Note que o comando print("Bom"+'dia'), na
primeira linha, resultou em Bomdia (sem espaço entre as palavras). Se você quer colocar um espaço para a coisa
ficar organizada, coloque-o dentro das aspas: ou depois de "Bom " ou antes de " dia".
Ao usar o operador de multiplicação * (asterisco), entre um número a um texto, você simplesmente dá ordem
para o Python repetir aquele texto.
Então é Natal... Então é Natal... Então é Natal... Então é Natal... Então é Natal... Então é Natal... Então é Natal...
Então é Natal... Então é Natal...
(Ninguém merece... na voz da cantora Simone... não tem como não lembrar)
Aqui vai um Alerta: quando usados em textos, há certas exigências para os operadores + e *:
[a] O operador de * (multiplicação) só pode ser usado entre um texto e um número inteiro, nunca entre dois
textos.
[b] O operador de + (concatenação) só pode ser usado entre dois textos, nunca entre um texto e um número.
(você vai perceber isso quando começar a receber as mensagens de erro caso tente desrespeitar essas regras)
É justamente sobre esses dados que eu quero falar agora: tudo aquilo que estiver dentro dos parênteses de uma
função é chamado de argumento (ou parâmetro) da função. Alguns gostam de dizer entrada (ou input) da função.
Por exemplo:
A frase "Não existe almoço grátis" é o argumento, ou parâmetro, ou entrada, ou input da função print() mostrada
acima. Já vimos que textos, números e expressões (cálculos) podem ser argumentos da função print(). Textos
devem vir entre aspas e os demais tipos não podem vir entre aspas.
Neste código, a função print() foi usada para mostrar 4 diferentes dados na mesma linha para o usuário separados
por um espaço. O resultado deste código será:
Note dois detalhes importantes quando usamos a função print() informando a ela mais de um parâmetro:
[A] A saída da função print() (ou seja, seu resultado) apresentará os argumentos separados por espaços
automaticamente (você não precisará colocar o espaço dentro das aspas para separá-los, como faz na
concatenação com o +).
[B] A saída de cada função print() acontece numa linha só. Portanto, todos os parâmetros informados a uma
única função print() são apresentados numa única linha [diferentemente de quando você usa mais de uma
função print() – em que cada função apresentará sua saída em uma linha diferente].
A seguir, você verá o exemplo de usar quatro funções print() diferentes com um único argumento cada.
print("Número")
print(30)
print(40 + 80)
print("Hoje" * 3)
Número
30
120
HojeHojeHoje
Percebeu? Cada função print() fez sua saída numa linha diferente.
Há algumas formas diferentes de obter um mesmo resultado no Python, especialmente com relação à função
print(). Veja esse caso:
O resultado, na tela é:
Casa Amarela
Casa Amarela
No caso do print("Casa", "Amarela"), você está solicitando exibir dois valores diferentes. São dois dados. Duas
Informações! São duas strings4 diferentes, mantidas separadas, e apenas apresentadas uma do lado da outra,
porque a função print() sempre separa as saídas com espaços.
No caso de print("Casa " + "Amarela"), você está pedindo para juntar (unir) as duas strings em uma só e, depois,
mostrar essa única string resultante. O "espaço" entre as palavras "Casa" e "Amarela" foi colocado dentro de
"Casa ". Neste caso, estamos exibindo apenas um dado!
Claro que o resultado, no final, para o usuário, foi o mesmo: então, não faz diferença usar um dos métodos ou o
outro. Mas, conceitualmente, para dentro do programa, são dois cenários diferentes! Só quero que você entenda
para não se perder mais adiante.
>>> print(7* 3)
>>> print("7" * 3)
>>> print("Casa" * 4)
>>> print("Casa" + 4)
>>> print("Casa", 4)
>>> print(4, 4)
>>> print(8 * 4)
4
A palavra "string" significa "corda" ou "cadeia" (sequência). Quando usamos esta palavra, estamos nos referindo aos textos (que, no Python, são escritos
entre aspas), pois textos são cadeias de caracteres, ou seja, sequências de letras. Portanto, em resumo, string significa texto.
[D] A Indicação de que algo é True (verdadeiro) ou False (falso) é um dado também.
O Python, assim como toda linguagem de programação, aceita apenas certos tipos de dados que precisamos
conhecer:
Integer (Inteiro)
Quando usamos números "não quebrados", ou seja, números inteiros, o Python os entende como tipo integer (ou
int, se você for mais íntimo).
Por padrão, todos os números que você utiliza no Python são do tipo integer (exceto, claro, aqueles números que
possuem casas decimais). Veja um exemplo de manipulação de números do tipo integer:
Ao lado, alguns comandos print() com números do tipo integer. Foram realizadas, inclusive, algumas
operações matemáticas com eles.
[C] Elevar um integer a uma potência integer também gerará um integer como resposta.
Para entender essa letra [D], precisamos conhecer um outro tipo de dado:
Um número do tipo float é um número que está preparado para armazenar valores não-inteiros, ou seja, um
número que tem casa decimal (um número "quebrado"). Python, portanto, diferencia números inteiros (int) de
não-inteiros (float).
5
Um “dado” é qualquer representação de uma informação: um texto, um número, uma imagem, um som. Qualquer coisa que possa ser armazenada em uma
memória de computador é, naturalmente, um dado.
Ao lado, algumas operações com números float. Note que o Python sempre coloca
casas decimais (separadas da parte inteira por um ponto).
Mesmo que você divida dois números integer, o resultado é necessariamente um float,
como aconteceu no primeiro comando mostrado, o print(32/17)
Note, também, que qualquer operação (soma, subtração, multiplicação) que envolva números float sempre
apresentará a saída (o resultado) como número float.
Então, para reconhecer: números float mostram casas decimais separadas da parte inteira por um ponto. Ou
seja, 2.0 é um float. Números integer não mostram o ponto. O 2 é um integer. Fácil, né?
O tipo string é o mais usado. Dados do tipo string são textos. Qualquer dado que você escreva entre aspas duplas
ou aspas simples é, automaticamente, classificado como uma string. Portanto, a palavra string significa texto!
Chegamos no exato ponto deste curso em que dá para explicar melhor o uso dos operadores matemáticos com
vários tipos de dados: presta atenção agora...
[A] Se ele for usado entre dois números int, resultará na soma em formato int.
[B] Se ele for usado entre dois números em que pelo menos um deles é float, o resultado será a soma dos dois
em formato float.
[C] Se ele for usado entre dois dados do tipo string, o resultado é a concatenação em um novo string.
[D] Se tentar usá-lo entre uma string e um número qualquer, dará erro.
Operador * (Asterisco)
[A] Se ele for usado entre dois números int, resultará no produto (multiplicação) dos dois em formato int.
[B] Se ele for usado entre dois números em que pelo menos um deles é float, o resultado será o produto
(multiplicação) dos dois em formato float.
[C] Se tentar usá-lo entre uma string e um número integer, será gerada uma string contendo a repetição da
string original tantas vezes quanto for o valor do número.
[D] Se ele for usado entre uma string e um número float, ocorrerá um erro.
[E] Se ele for usado entre dois dados do tipo string, ocorrerá um erro.
Note que só há repetição do texto se o * for usado entre uma string e um integer.
Esses dois operadores só podem ser usados entre dois números (int ou float, não importa). Não é possível usá-
los com strings (ou seja, dá erro).
[A] Se ele for usado entre dois números integer, o número resultante será integer.
[B] Se ele for usado com pelo menos um float, o número resultante será float.
[A] Qualquer utilização deste operador gerará uma divisão entre dois números e o resultado sempre será um
float.
Nem o operador / (divisão) nem o operador – (subtração) podem ser usados com strings (textos). Se você fizer
isso, o Python mostrará um erro, como foi visto na imagem acima.
18 18 + 9.0
'18+12' "Erro" + 40
18/3 3.5 * 10
"Oba " * 3 45 * 30
print(80+50)
O operador – é usado para subtrair o segundo número de um primeiro número, portanto o trecho
print(90-30)
Se você utilizar o operador * com dois números, você os multiplica. Logo, o código
print(30*4)
Por fim, se você utiliza o operador /, você divide o primeiro número pelo segundo. Portanto,
print(20/5)
vai apresentar, na tela, o número 4.0 (float). (toda operação de divisão dá como resultado um número float).
Se você utilizar o operador ** (asterisco duplo), você elevará o primeiro número à potência do segundo número.
Isso significa que o código
print(3**2)
Todos esses já havíamos visto. Vamos a dois outros operadores relacionados à divisão entre dois números:
O operador // (barra dupla) é usado para obter o quociente de uma divisão inteira.
O operador % (sinal de porcentagem) é usado para obter o resto de uma divisão inteira.
O que são essas duas? Ahhh... você lembra da escola? Quando a gente aprendeu a calcular uma divisão com
resto? Era aquele tipo de cálculo que aqui chamamos de "divisão inteira" – uma divisão que usa apenas números
inteiros.
Sim, naquela época em que não tínhamos aprendido, ainda, a dividir números com casas decimais... a gente só
sabia trabalhar com números inteiros... relembre na próxima página.
Dá uma olhada na imagem a seguir, em que divido 14 por 3, obtendo 4 com resto 2:
14 3
quociente:
4 resultado do cálculo 14 // 3
[C] Se você escreve 14 % 3, você obtém o resultado 2 (o resto da divisão) em formato integer.
A pergunta que fica no ar é: como o Python entende (e resolve) uma expressão como essa? Será que é só ler
as operações da esquerda para a direita e calcular uma a uma em sequência?
O Python tem uma forma "organizada" de ler as expressões matemáticas e de resolvê-las: acompanhe a tabela
abaixo:
Por fim... Python resolverá todas as operações de + e – . Elas têm a mesma prioridade entre si.
30 + 160 // 2 ** 5 / 5 – 12
A primeira coisa que o Python vai resolver é a potência, ou seja, o 2 ** 5. Isso dá 32 (integer), afinal, 25 = 32
30 + 160 // 32 / 5 – 12
Depois, todas as multiplicações, divisões e restos em ordem, da esquerda para a direita. Então, fará logo a
resolução do trecho 160 // 32. O resultado disso é 5 (integer) – divisão inteira.
30 + 5 / 5 – 12
Agora, resolve-se o 5 / 5, que resulta em 1.0. (float) – lembre-se: divisão com barra simples sempre retornará
um número float.
30 + 1.0 – 12
Agora é só soma e subtração. O resultado disto é 19.0. (float), porque o 1.0 era float.
Alterando as Prioridades
Normalmente, o Python fará as operações matemática na ordem das prioridades que eu mostrei acima. Mas você
pode fazer o Python realizar as operações em outra ordem: é só envolver com ( ) (parênteses) a parte da
expressão que você deseja que o Python resolva primeiro. Vamos ver?
40 – 8 * 3
Se colocarmos os parênteses envolvendo a operação 40 – 8, o Python será obrigado a resolvê-la primeiro, antes
mesmo da multiplicação, ou seja:
(40 – 8) * 3
30 + (21 – 13) / 4
32
Você poderá precisar, se seu cálculo for muito complexo, de vários níveis de parênteses. Um dentro do outro,
como veremos no exemplo a seguir:
3 * (10 // (2 + 3) + 8 * (4 – 3) + 2 ** (8 // (3 + 1) + 1))
Claro que pode! Cubra as próximas linhas aqui abaixo com um papel e tente resolver você mesmo... depois,
descubra-as e veja a explicação passo-a-passo.
3 * (10 // (2 + 3) + 8 * (4 – 3) + 2 ** (8 // (3 + 1) + 1))
3 * (10 // 5 + 8 * 1 + 2 ** (8 // 4 + 1))
[B] Agora, os cálculos que têm prioridades dentro de cada parêntese restante:
3 * (10 // 5 + 8 * 1 + 2 ** (8 // 4 + 1))
3 * ( 2 + 8 + 2 ** ( 2 + 1))
[C] Agora, aqueles parênteses internos e aquela soma entre os dois itens iniciais:
3 * (2 + 8 + 2 ** (2 + 1))
3 * ( 10 + 2 ** 3 )
3 * (10 + 2 ** 3)
3 * (10 + 8)
3 * (18)
54
Lembre-se de que é o Python que vai fazer esses cálculos. Não Você! É importante, porém, que você saiba
exatamente como ele faz esses cálculos, porque você saberá escrevê-los de maneira a obter o resultado que
deseja.
Afinal de contas, escrever uma equação de maneira diferente trará resultados diferentes!
[A] 30 + 20 [I] 11 % 3
[C] 80 * 2 [K] 9 + 25 // 3
[D] 30 / 2 [L] 4 ** 3
[F] 23 + 8 * 2 / 4 [N] 40 – (3 * 3) ** 2 // 4
[H] 7 // 2
O que vai ser apresentado na tela quando o programa abaixo for executado?
print("Calculadora " * 3)
print(80 + 40 // 3 % 3)
print((100 - 60) / 20 + 3 ** 2)
Variáveis são utilizadas para que possamos usar os dados guardados nelas várias vezes.
Variáveis são como "caixas" onde podemos guardar dados para usá-los depois (como as caixas dos enfeites de
Natal que todos os fins de ano nós abrimos para pegá-los).
Agora, o dado 30 foi colocado dentro da variável idade. Sempre que "apontarmos" para
a variável idade, o número 30 será devolvido como resposta.
Declarar uma Variável: é dizer ao programa que ela existe – ou seja, é criá-la. No Python, quando você atribui
um valor a uma variável pela primeira vez, ela é automaticamente criada.
Lembre-se: para usar uma variável no seu programa (mencioná-la em cálculos, por exemplo), precisamos criá-
la primeiro.
Mas como se
faz isso no
Python, João?
idade = 30
Esse é o código usado no Python para fazer o que a figura anterior mostra: vai criar um espaço na memória
chamado idade e vai colocar lá dentro o valor 30.
Para que você possa entender melhor, imagine que o sinal de = se chama "recebe". Então, o código
distancia = 300
pode ser lido como "a variável distancia recebe o valor 300".
idade = 30
idade2 = 28
idade_cachorro = 8
_idade = 10
O Python é uma linguagem case-sensitive (significa que faz diferença entre maiúsculas e minúsculas). Portanto,
a variável Idade é diferente da variável idade, que é diferente da variável IDADE.
Cuidado: às vezes, o programador nomeia a variável com letra maiúscula e depois tenta usá-la com letra
minúscula – o Python não vai aceitar isso! Preste atenção a como escreve os nomes das variáveis! Afinal, você
não pode mencionar uma variável que não foi declarada!
Perceba que eu criei a variável a com o valor 30, depois criei a variável b com o valor 40. Por fim, usei a função
print() mencionando a soma entre o a e b. O resultado do código acima será
70
Lembre-se de que não é possível usar (mencionar) uma variável que nunca foi declarada antes. Isso vai gerar
um erro. Veja esse código:
a = 10
print(a + b)
O Python vai, com certeza, reclamar que não consegue entender o que é b. O código acima está mencionando
(chamando) uma variável b que nunca foi declarada antes, ou seja, para este nosso exemplo, o Python sabe que
b não existe!
Lembra que para criar (declarar) uma variável, é necessário apenas atribuir um valor para ela. Ao atribuir o
primeiro valor, a variável é automaticamente criada.
idade = 30
idade = 43
idade = 28
print(idade)
28
Perceba que, primeiramente, havíamos colocado o valor 30 na variável idade. Depois, substituímos ele pelo valor
43 (e o 30 foi esquecido). Por fim, atribuímos o valor 28 à variável, fazendo com que ela esqueça o valor 43.
Atualmente, portanto, a variável idade possui o valor 28.
Sim, meu caro! Quando atribuímos um novo valor a uma variável, esse novo valor substitui completamente o
valor que havia anteriormente.
Mas você pode substituir o valor antigo por um valor que é atualização dele (é o que eu chamo de "levar em
consideração" o valor anterior). Veja um exemplo abaixo:
idade = 30
idade = idade + 1
print(idade)
[B] Depois, somamos o valor contido em idade (que é 30) com o número 1 e a variável idade recebe este novo
valor. Ou seja, idade agora tem 31 (substituiu o 30).
[C] Mandamos exibir o valor atual da variável idade com a função print().
31
Resumidamente, a instrução idade = idade + 1 significa "a variável idade vai receber um novo valor: que é o
valor atual da variável idade somado ao número 1".
Podemos fazer isso com qualquer outra operação aritmética. Vejamos alguns exemplos:
a = 10
b = 20
c = 30
print(a, b, c, d)
Atenção: o comando print(a, b, c, d) vai mostrar na tela, lado a lado, separados por espaços, os valores das
variáveis a, b, c e d. O resultado deste programa será a apresentação, na tela, dos valores:
7 40 7.5 4
Podemos fazer esta operação de adicionar, subtrair, multiplicar, dividir ou calcular resto com o valor que já havia
na variável usando uma outra forma de escrever: +=, -=, *=, /=, //=, %= e **=.
Escrever a expressão num = num + 1 é o mesmo que escrever a expressão num += 1. Do mesmo modo que
escrever a expressão desconto = desconto – 10 é o mesmo que escrever desconto -= 10. Então, o código:
a = 10
b = 20
c = 30
d = 40
a += 5 # É o mesmo que a = a + 5
b *= 3 # É o mesmo que b = b * 3
c /= 10 # É o mesmo que c = c / 10
print(a, b, c, d)
resultará em
15 60 3.0 1600
E só para lembrar, meu amigo leitor, minha amiga leitora, esses sinais (+=, -=, *=, /=, //=, %= e **=) devem ser
escritos necessariamente juntos (não se admitem espaços entre eles, ok?). Esses sinais de atribuição de
variáveis são chamados de “augmented assignment” (ou, traduzindo, são sinais de “atribuição de incremento” ou
sinais de “atribuição de aumento”).
Vamos analisar mais algumas linhas de atribuição de variáveis? Dá uma olhada aqui:
frase = "palavra"
palavra = "hoje"
hoje = frase
var1 = "hoje"
var2 = hoje
A variável var1 recebe a string "hoje". A variável var2 recebe o conteúdo que está na variável hoje. Perceba, na
linha da var2, a ausência de aspas, indicando que aquele hoje é o nome de uma variável e não uma string.
E é claro que vale a pena lembrar que esta última linha só vai funcionar se a variável hoje já tiver sido declarada
antes.
Uma das coisas que você poderá usar várias vezes no Python é que você pode atribuir valor a mais de uma
variável numa única linha. Basta separar as variáveis por vírgulas e os valores também! Ou seja, o código:
nome = "João"
idade = 46
altura = 1.90
print(var1, var2)
Neste exemplo, inicialmente, a variável var1 recebe 20 e a variável var2 recebe 30. Na segunda linha, a variável
var1 recebe a soma entre var2 e var1, ou seja, 30 + 20, ou seja, 50 e a variável var2 recebe a multiplicação
entre var2 e var1, ou seja, 30 * 20, ou seja, 600.
50 600
Vale aqui lembrar que se você coloca 3 variáveis antes do =, você deverá citar 3 valores depois do =. Ou seja, se
você menciona X variáveis, deverá atribuir X valores a elas. Qualquer diferença entre as quantidades de variáveis
e de valores, dará erro.
Só para explicar o último exemplo da imagem acima: não podemos usar os sinais de atribuição de incremento
(os sinais +=, -=, *= e /=) com mais de uma variável por vez.
problema = problema * 2
velho -= 7
eco = "Mises"
times = 3
times = times * 2
more = times + 4
print(eco * more)
base, expoente = 4, 10
expoente = base // 2
print(base ** expoente)
cons *= 2
raio += 2
a, b = 10, 2
print("=" * 30)
print("Calculadora Simples")
print("=" * 30)
==============================
Calculadora Simples
==============================
Comentários Curtos
Vamos agora aprender a "comentar" nosso código. Escrevemos comentários para entendê-lo melhor em caso de
termos de lê-lo posteriormente – sempre é bom criar um "manual de instruções" no código.
Para fazer comentários curtos (uma linha apenas), use o caractere # (hashtag, ou "jogo da velha"). Tudo aquilo
que você escrever após este símbolo é automaticamente entendido como comentário.
a = 20
b = 30
print("Calculadora")
b = a + 30
Como você pôde perceber, comentários podem ser escritos numa linha única (sozinhos) ou em uma linha que
possui comandos (tudo o que aparecer depois do # será entendido como comentário).
Agora, olhe o código novamente e perceba que na penúltima linha há um comentário que diz "Aqui vai dar um
erro!" – você pode imaginar por quê?
Exatamente!!! Muito bem! Não é possível pedir que a variável a receba a soma de b com c, se nós simplesmente
nunca ouvimos falar de c. A variável c simplesmente não existe porque ela nunca foi declarada! (é um erro
comum entre os programadores – até os mais experientes).
Para fazer comentários longos, textos de documentação grandes, você pode escrever todo o comentário desejado
entre " " " (três aspas duplas) ou ' ' ' (três aspas simples). Coloque-os antes e depois do texto a ser digitado e
todo ele será desconsiderado – totalmente ignorado (será considerado comentário).
"""
Este programa foi criado para exemplificar o uso dos comentários de várias linhas. Basta
colocar o trecho que será usado como comentário entre grupos de 3 aspas. Tanto faz se são
aspas duplas ou aspas simples.
"""
a = 90
b = 20
c = 30
print("""Pequeno Poema
Uma grande vantagem de usar as aspas triplas é que se você colocar aspas normais no meio do texto, elas serão
entendidas como parte do texto, sendo apresentadas assim ao usuário. Veja o exemplo:
Notou que as aspas na palavra "aspas" foram mostradas ao usuário? Isso aconteceu porque o Python entendeu
que o delimitador de texto era as aspas simples (apóstrofos) triplas ('''), entendendo as aspas normais como
caracteres que são parte integrante do texto.
Ao usar a função print() com as aspas triplas, você pode mandar imprimir na tela exatamente a mesma
organização de texto que escreve dentro das aspas triplas. Linha por linha.
Quais os resultados dos programas abaixo? Eles dão erro? Eles funcionam?
# Programa para repetir um valor textual várias vezes
numero = 3
print(letra * numero)
print(1num * 2num)
x, y = 10, 20
print(x * y)
Note bem, amigo leitor, o valor False é diferente de "False". False é um conceito, uma ideia, um estado de falsidade.
O valor "False" é um texto, uma string (se está entre aspas, é uma string).
Da mesma forma que True é uma ideia que indica um estado de verdadeiro e "True" é uma string. Podemos
informar que uma variável é diretamente True ou False do mesmo jeito como fazemos em qualquer outro tipo de
valor:
teste = False
aprovado = True
Atenção: ao se referir aos valores booleanos, você deve escrevê-los True e False (com a primeira letra
maiúscula e sem aspas). Escrevê-los de outra forma faz o Python entender como outro tipo de dados, mas não
booleano.
Outra forma de obter os valores False e True é usar proposições (normalmente expressões que usam os
operadores de comparação).
Proposição: é uma expressão que só pode assumir dois valores: ou ela é verdadeira, ou é falsa.
Operadores de Comparação (ou Operadores Relacionais): são sinais que realizam a comparação entre valores
e/ou expressões.
Vamos a um exemplo? A expressão 20 > 30 quer dizer vinte é maior que trinta. Nós sabemos que isso é False.
Do mesmo modo que 20 < 30 significa vinte é menor que trinta. Isso é True.
Então, olha que lindo! Operadores de comparação são justamente esses sinais (> e <, nos exemplos acima). Com
esses operadores, nós comparamos o que está antes do operador com o que está depois.
20 > 30 (vinte é maior que trinta) 20 < 30 (vinte é menor que 30)
20 >= 30 (vinte é maior ou igual a 30) 20 <=30 (vinte é menor ou igual a 30)
Atenção: o sinal de comparação "igual" é necessariamente um == (igual duplo) porque o uso do sinal de = (igual
único) é para atribuir valores a variáveis, como já estamos fazendo há algum tempo.
a, b, c = 20, 10, 30
print(a > b)
print(c <= b)
print(a * 2 > c + b)
True
False
80
False
Portanto, o valor False indica que a proposição não é verdadeira (ou seja, ela é falsa). O valor True indica que a
proposição é verdade. Os valores "True" e "False" são apenas textos (strings).
Podemos usar valores booleanos em uma série de momentos no Python, mas vamos usá-las especialmente em
estruturas de decisão (condicionais) e estruturas de repetição (loop).
Mas podemos fazer comparações entre valores do tipo string também – e o Python é um tanto "esperto" em
relação a elas. Inicialmente, vamos comprar textos usando "igual" e "diferente":
"Casa" == "Escola"
"Casa" != "Escola"
False
True
Isso porque a String "Casa" é diferente da string "Escola" (deu pra notar, né?).
Mas uma coisa que poucos sabem (e parece não ter lógica) é que podemos usar comparadores como "maior que"
e "menor que" também com as strings.
Calma, meu amigo! É pela posição no dicionário das strings, ou seja, pela ordem alfabética. Resumindo, os
comandos:
True
True
False
teste = 43 * (6 + 4)
Já a expressão
vai colocar o valor False na variável teste, porque 430 não é maior que 5000.
[A] teste = 80 + 40
[D] teste = 4 * 10 – 30
[F] teste = 80 == 80
[I] teste = 30 * 12
[K] teste = 20 + 5 != 5 ** 2
[L] teste = 80 % 9 == 2 ** 3
[N] teste = 40 + 30
[O] teste = 2 * 4 ** 2 + 10
Praticamente, todas as funções são escritas do mesmo jeito: nome_da_função(argumentos). Você precisa
conhecer o nome da função para usá-la – e você precisa saber quais argumentos ela aceita para ela funcionar
corretamente.
Pense numa função lavar() que serve para, digamos, lavar objetos. Aí, usar lavar(carro) poderia ser,
hipoteticamente, a forma de mandar lavar o carro e lavar(bicicleta) serviria para mandar lavar a bicicleta. (tá, ok,
isso é só um exemplo "bem besta" para explicar funções).
A função print() já conhecemos – ela é usada para imprimir (na tela) aquilo que estiver colocado como argumento
(dentro dos parênteses).
O Python já traz consigo diversas funções prontas (além da print()) – chamamos elas de "built-in" (algo como
"essas funções já vêm construídas dentro no Python"). Há funções para manipular números, textos e outros tipos
de dados. Vamos conhecer algumas delas agora...
Ou seja, o comando int(7.5) vai resultar em 7. O comando int("8") vai resultar em 8. Note que o primeiro valor era
um número float e o segundo exemplo era uma string.
A função float() converte um número integer ou uma string em um número no formato float.
Exemplos? Agora mesmo! Se você escrever float(8), isso resulta em 8.0. Se você escrever float("10"), isso vai
gerar, como resultado, o número 10.0.
Atenção: nem a função int( ), nem a função float( ) vão funcionar se o valor string não for "escrito só com números".
Por exemplo, vai aparecer erro se você tentar usar int("casa") ou float("escola") (não tem como converter esses
aqui para números, né?)
A função str( ) é usada para converter qualquer valor em uma string (texto). Pode ser usada com números integer
ou float.
Então, usar a função str(18) vai resultar em "18", e usar a função str(10.0) vai resultar em "10.0".
A função bool() é usada para converter qualquer valor (número ou string) para um valor booleano (True ou False).
A norma, porém, é um tanto "curiosa":
[a] Se tentar converter o número 0 ou uma string vazia, o resultado será False.
[b] Em qualquer outro caso, o resultado será True.
Portanto, nos casos a seguir:
bool("casa")
bool(34)
bool(0)
bool("")
True
True
False
False
O resultado de sum([1, 2, 3, 4, 5, 6]) será 21. Nem preciso dizer que o mesmo que escrever 1 + 2 + 3 + 4 + 5 + 6,
né?
Não esqueça: não dá para usar a função sum() diretamente com os números, como em sum(1,2,3,4,5) – isso dá
erro. A função sum() tem que ser escrita com uma lista em seu interior (ou seja, os valores entre colchetes),
como em: sum([1,2,3,4,5]).
A função max() pode ser usada com vários valores [sem colchetes] ou com uma lista, como a função sum(). A
função max() retorna o maior valor encontrado nos argumentos.
Um aviso: a expressão "tal função retornará tal valor" significa que "tal função resultará em tal valor". Ou seja,
o verbo "retornar" é usado como sinônimo de "resultar". Nós vamos aprender que nem toda função retorna um
valor, mas quando esse verbo for usado, é porque a função irá trazer resultados.
A função min() é irmã “mais nova” da max(). Ela retorna o menor valor apresentado nos argumentos. Portanto, a
função min(2, 40, 5, 82, 13) retornará o valor 2.
A função round() serve para arredondar um número para uma determinada quantidade de casas decimais. Para
isso, escreva round(número, núm_casas). Um exemplo?
Claro! Aqui vai: O comando round(12.3945, 1) vai retornar 12.4, que é o número 12.3945 sendo mostrado com
apenas 1 casa decimal. Quando você não informa o número de casas, o Python corta todas (ou seja, converte o
número para um integer).
round(21.3298)
21
Mais uma função? Que tal a função len()? A função len() conta a quantidade de itens de uma lista ou de caracteres
em uma string. Ou seja, a função len("Mises") vai retornar 5, porque "Mises" tem 5 caracteres.
Escrever a função que retorna valor sozinha numa linha do editor de código não adianta: ou você aponta o
resultado da função para uma variável, ou manda imprimir na tela por meio da função print(), como mostramos
aqui:
>>> abs(-9)
>>> abs(2)
A função pow() é usada para elevar um valor a uma potência. Ela deve ser usada assim: pow(base,expoente)
para elevar o número base ao expoente.
>>> pow(9,2)
81
>>> pow(2,9)
512
A função pow() tem o mesmo objetivo do operador **, percebeu? Ou seja, as expressões pow(3,2) e 3**2 retornam
exatamente o mesmo valor (que é 9).
max(2, 5, 6, 1, 4, 3)
str(123)
min(20, 3 + 4, 15, 5 * 2)
bool("Escola")
float(int(3.5) + int(4.5))
pow(3*2, 12//6)
Algumas vezes, porém, precisaremos pedir dados ao usuário (esperar que ele digite algo). Isso é trabalho para
a função input( ). A função input( ) é usada para a entrada dos dados (a print() é para a saída).
Atenção: chamamos de entrada de dados o ato de o usuário inserir dados no computador (quando o programa
pede ao usuário que ele digite algo).
Sempre que você precisar que o usuário informe algo, como o nome dele ou a idade, você deverá usar a função
input().
A função input() é usada sempre deste jeito: variável = input(mensagem). Ou seja, a função input() deve ser usada
numa atribuição de variável, para que o valor que o usuário digitar seja armazenado diretamente na variável
apontada. O argumento mensagem é o texto que aparecerá para o usuário antes de ele digitar o dado pedido.
Vamos a um exemplo:
print("*" * 30)
# Exibir os Dados
*****************************
Depois de inserir cada valor pedido, o usuário deverá pressionar ENTER para confirmar. Portanto, considere que
depois de ter digitado João Antonio, o usuário pressionou ENTER. Considere também que depois de ter digitado
46, o usuário também pressionou ENTER.
Um alerta importante: todas as vezes que você usa a função input( ), o dado que ela captura é, necessariamente,
uma string (mesmo que você digite um número como a idade de alguém).
Isso significa que se você quiser usar um dado capturado pela função input( ) para fazer cálculos, é bom passar
ele numa função de conversão antes. Por exemplo:
>>> print(idade)
>>> print(idade)
[A] Para capturar informações digitadas pelo usuário, use a função input().
[B] A função input() deve ser apontada para uma variável, ou seja, seu resultado deve ser colocado na atribuição
de uma variável.
[C] A função input() sempre retorna um valor textual (string). Isso significa que tudo aquilo que for capturado
pela função input() é considerado texto.
[D] Se quiser usar um dado capturado pela input() em cálculos, é necessário converter para número (inteiro ou
float).
Escreva um programa que peça o nome e a idade do usuário e, em seguida, imprima na tela a
mensagem "<nome> tem <idade> anos de idade" (substitua <nome> e <idade> pelos dados
que o usuário inserir).
print(num1 + num2)
print(num1 * num2)
print("=" * 10)
print("Calculadora")
print("=" * 10)
print(int(num1/num2))
idade = 103
A variável nome está guardando apenas uma string e a variável idade está guardando apenas um número
(porque UMA variável só consegue guardar UM dado).
Sim! Uma variável "comum" só tem espaço para guardar um dado! Só UM!
E é por isso que existem "outros tipos" de estruturas de dados que precisamos aprender! Estruturas que
armazenam mais do que apenas um dado! Uma lista é um desses tipos de objetos! Uma lista é como se fosse
uma "variável que pode ter muitas gavetas".
Uma lista é um dos objetos do tipo "set" (conjunto ou sequência). Há vários tipos de objetos assim, como tuplas e
dicionários. Vamos conhecer eles mais adiante.
Para criar uma lista, você atribui os valores que quiser inserir na lista dentro de um par de colchetes, ou seja,
esses símbolos aqui: [ ]. Os elementos dentro da lista são separados por vírgulas.
>>> print(economistas)
Você pode pensar numa lista como sendo uma "tabela" com uma linha de dados apenas. Olha o exemplo a seguir
para ilustrar a lista do exemplo acima:
economistas
Hayek Mises Sowell Rothbard
Método: é uma função especial que é escrita como um "sobrenome" de um objeto. Um método é normalmente
específico para um tipo de objeto. Usamos métodos escrevendo o nome do objeto, um ponto e o nome do método.
Assim: objeto.método( ).
>>> print(economistas)
Para apagar o último item de uma lista (ou seja, tirar o Marx da nossa lista de economistas, já que ele não
entendia bulhufas de economia), basta usar o método .pop( ). Deste jeito:
>>> economistas.pop()
>>> print(economistas)
Note que, ao usar o método .pop( ), o Python retorna (responde) com o valor que está sendo retirado da lista (Só
no Shell). Depois, ao mandar exibir a lista, dá para ver que o último item foi retirado (graças a Deus).
Você tem que usar a expressão lista[índice] para acessar diretamente um item da lista. Para explicar melhor,
vamos entender que cada posição na lista tem um endereço próprio, que começa com o número 0 (zero). Veja
o exemplo para a lista abaixo:
economistas
0 1 2 3
Hayek Mises Sowell Rothbard
Esta lista tem 4 posições (ou itens). A posição 0 contém a string 'Hayek', a posição 1 contém a string 'Mises' e
assim por diante. Quer mostrar na tela o conteúdo da posição 2 da lista? Olha abaixo:
>>> print(economistas[2])
Sowell
Se você quiser alterar o conteúdo de uma posição, é só apontar para ele como se fosse uma variável e atribuir
um novo valor:
>>> print(economistas)
O método .pop( ) pode ser usado para apagar qualquer item da lista, não somente o último. Para isso, basta você
indicar, dentro dos parênteses, qual o índice do item que você deseja apagar da lista. Veja o exemplo do código:
>>> print(economistas)
'Mises'
>>> print(economistas)
Vamos saber como inserir um item em uma posição qualquer na lista. Para isso, usamos o método .insert(índice,
valor). Esse método insere o valor desejado diretamente na posição indicada e "empurra" os demais para as
posições posteriores.
>>> print(alunos)
Para apagar um item específico da lista, informando o valor em si, e não o índice, você pode usar o
método .remove(item). Note a diferença: no .pop(índice) você informa o índice da posição. No
método .remove(item), você informa o valor em si, não a posição.
Um outro método importante é o .reverse( ). Ele inverte a ordem dos itens na lista.
>>> print(alunos)
>>> print(alunos)
Ainda há outro método a ser ensinado: o método .sort( ). Este método organiza a lista em ordem (alfabética ou
numérica). O jeito mais simples é simplesmente usá-la sem argumentos, como a seguir:
>>> print(alunos)
>>> print(alunos)
Apenas um lembrete: uma lista pode conter dados com tipos diferentes (strings, integers e floats, por exemplo).
Uma lista pode até conter outras listas (veremos depois). Ou seja, cada posição de uma lista pode conter um
dado de tipo diferente, como, por exemplo: lista = [9, “casa”, True, 30+90, 3.4], que é formada por inteiro, string,
booleano e float, por exemplo.
Para finalizar, vamos conhecer o método .count(). Ele serve para contar quantas vezes um determinado valor
aparece numa lista. Veja o exemplo a seguir:
>>> genios.count('Mises')
Perceba que para usar o método .count(), você deve indicar o valor a ser contado dentro da lista genios. No
exemplo acima, pedi para contar quantas vezes 'Mises' aparece na lista genios.
>>> a = [1, 2, 3, 4, 5]
>>> print(a)
[1, 2, 4, 5]
Outra diferença é que o comando del não retorna o valor do item apagado (como faz o método .pop()), ou seja,
esse comando simplesmente apaga o item.
O comando del não pode ser usado apenas para listas, não – ele pode ser usado com variáveis simples, também.
Se você aciona o comando del apontando para a variável em si (não somente uma posição dela), a variável inteira
deixará de existir e o Python não a reconhecerá mais. Isso pode ser constatado na próxima página.
>>> a = "Menger"
>>> print(a)
Note que não foi possível imprimir na tela a variável a porque ela simplesmente não existe mais. É claro que o
comando del também pode ser usado para apagar uma lista inteira, não somente uma posição específica da lista.
Para isso, use del lista, como podemos perceber no código escrito na página seguinte:
>>> print(lista)
Usamos o operador in para fazer esse teste. O nome in é a mesma coisa que "em" em inglês. Portanto, ela serve
para testar se um determinado valor existe em uma determinada lista. Olha como funciona:
Note que ao mandar imprimir 4 in lista1, o resultado foi True: porque existe o valor 4 em lista1. Quando pedimos
para imprimir o resultado de 8 in lista1, o resultado foi False, porque não há 8 em lista1. O resultado de uma
expressão com in sempre é booleano!
lista.pop(3)
lista.reverse()
a = lista[2] + lista[3]
lista.remove(5)
print(a + lista[3])
Aparecerá na tela:
lista.reverse()
lista.append('e')
lista.pop(2)
lista[0] = lista[3]
lista.remove('c')
lista = [ ]
del lista[3]
del lista[1]
lista[1] = lista[3]
lista.remove(25)
lista = [ ]
lista.append(36)
lista.append(49)
lista.append(64)
del lista[4]
lista.reverse()
lista[4] = lista[5]
lista[1] = lista[3]//2
lista.remove(1)
lista.pop(1)
lista = [ ]
alunos.append(nome)
alunos.append(nome)
alunos.append(nome)
alunos.append(nome)
alunos.append(nome)
Explicando o programa acima: o primeiro comando cria uma lista vazia (ou seja, sem itens) com o nome alunos.
Para fazer isso, atribua colchetes vazios ao nome da lista a ser criada.
No comando seguinte (na segunda linha), acontece um input (que pede dados ao usuário) e coloca esse dado
dentro da variável nome.
Na terceira linha, o conteúdo da variável nome é anexado na lista alunos (colocado no fim da lista, com o
método .append( )).
Nas linhas seguintes, repetem-se os atos de [a] pedir dado ao usuário; [b] guardar esse dado na variável nome e,
em seguida, [c] anexar (adicionar) o conteúdo da variável nome no fim da lista alunos.
Ao final deste programa, a lista é impressa na tela. Simples, né? O resultado do programa na tela será o seguinte:
(Escreva o programa aqui embaixo) – teste o código e/ou acompanhe o vídeo de correção.
>>> print(dados[4])
Texto
>>> print(dados[0]*dados[4])
TextoTextoTexto
É normal chamar isso de "listas aninhadas" (nested lists, no inglês). Isso significa "uma lista funcionando como
'ninho' das outras". Veja o exemplo a seguir:
>>> lista_principal.append([9,10,11])
>>> print(lista_principal)
[['a','b','c'],[1,2,3],['xx','yy','zz'],[9,10,11]]
Note que a lista_principal é uma lista composta por 4 listas. Ou seja, cada item da lista_principal é uma lista
diferente. Vamos "pintar" cada item para deixar mais fácil de entender:
[['a','b','c'],[1,2,3],['xx','yy','zz'],[9,10,11]]
Isso pode parecer um tanto "inútil" ou "estranho" agora, amigo leitor, amiga leitora... mas em breve veremos muita
utilidade para este recurso. Uma lista aninhada parece com isso aqui:
lista_principal
a b C
0
0 1 2
1 2 3
1
0 1 2
xx yy zz
2
0 1 2
9 10 11
3
0 1 2
Bom, o item 'yy' está na posição 1 da lista que está na posição 2 da lista lista_principal. A forma para acessar
aquela exata posição é lista_principal[2][1], que significa "a posição 1 da posição 2 da lista_principal".
lista = list()
lista = []
Podemos usar a função list( ) também colocando strings no argumento. Isso fará com que a lista seja criada tendo
cada caractere da string como um item. O exemplo a seguir mostra isso bem:
>>> print(lista)
['M','i','s','e','s']
A lista pode ser criada, também, a partir de um objeto do tipo sequência (iterable, no inglês). Um objeto sequência
é um objeto formado por uma sequência numérica. A forma mais fácil de construir é por meio da função range( ).
Veja o exemplo a seguir (explico logo abaixo):
>>> print(seq)
>>> print(seq2)
Eu sei que você está estranhando que a lista só foi até o número 9. Não se preocupe: vou explicar direitinho na
lição sobre range().
>>> print(lista)
[]
construtor = range(15)
lista = list(construtor)
lista.pop()
a = lista[3]+lista[4]
lista.reverse()
b = lista[4]+lista[5]
lista.append(lista[8])
c = len(lista)+lista[3]
d = a * b + c
a= b= c= d=
Ainda sobre o código acima, descreva quais os resultados dos cálculos abaixo?
print(3 * a + len(lista) * 2)
print(4 * b + 60 % c)
print(max(lista) * len(lista) // 2)
Dica: um objeto "iterável" é um objeto que pode ser criado por meio de um processo repetitivo (iterações) e que pode
ter cada um de seus itens acessados um a um em etapas. Uma sequência numérica construída pela função
range( ) é considerada um iterável pela linguagem Python.
sequencia = range(10)
Neste caso, ele cria uma sequência de números inteiros que começa em 0 (zero) e vai até 9 (nove). O número
que é colocado como argumento é o "limite máximo" da sequência. O limite máximo da sequência NUNCA é
incluído na sequência, por isso que a sequência acima foi apenas até o número 9.
A função range( ) também pode ser usada com mais de um argumento, como aqui:
sequencia = range(3,10)
Do jeito como essa função foi escrita, ela criará uma sequência de 3 até 9. Não esqueça que o número limite
máximo (neste caso, o 10) nunca é incluído na sequência, mas o número inicial sempre é. Nesta sequência, com
início e fim, o primeiro argumento indica o início da sequência e o segundo argumento indica o número final (que
nunca é incluído).
A função range( ) também pode ser escrita com 3 argumentos. O primeiro indica o número de início, o segundo
indica o limite final e o terceiro indica a razão (os passos) entre cada item. Ou seja, o código
sequencia = range(3,10,2)
vai trazer uma sequência que começa em 3, vai até 9 (10 não é incluído) e salta de 2 em 2 a cada item, ou seja, a
sequência será 3, 5, 7, 9.
Para resumir, a função range( ) cria uma sequência de números inteiros e pode ser escrita:
range(início, final, passo): a sequência começa em início e vai, de passo em passo, até final-1.
É possível construir uma sequência decrescente (do maior para o menor). Basta que o início seja maior que o
final e que se escreva o passo negativo, como no exemplo:
>>> print(list(range(20,10,-2)))
>>> print(a)
range(3,20,4)
Note que a variável a é mostrada como uma range, mesmo... não são apresentados os valores em si. Poderemos
ver os valores se pedirmos para ver a variável convertida para uma lista (usando a função list()):
>>> print(list(a))
Não esqueça: para poder "ver" e "mexer" numa sequência que foi criada pela função range(), devemos convertê-
la em uma lista, usando a função list() para isso.
list(range(20,30,3))
[ , , , ]
list(range(9))
[ ]
list(range(25,5,-4))
[ ]
list(range(7,23,2))
[ ]
list(range(37,13,-5))
[ ]
list(range(10,30,5))
[ ]
Apesar de serem essencialmente diferentes, há muita coisa que podemos fazer em comum (e da mesma maneira)
em ambos. O uso de índices é uma delas:
b = ['M', 'i', 's', 'e', 's'] # Aqui, eu criei uma lista chamada b
print(a[0])
print(b[0])
No código acima, estabelecemos que a variável a vai receber a palavra "Mises" e que a variável b vai receber a
lista composta pelas 5 letras da palavra "Mises". Os conteúdos são bem diferentes entre si, mas pedir para
mostrar na tela a[0], que significa apontar para a primeira letra da string "Mises" (portanto, para a letra "M") é o
mesmo que apontar para b[0], que faz referência ao primeiro item da lista b, ou seja, a letra "M" também.
Pra resumir, e nós já sabemos disso, cada letra da string pode ser acessada diretamente pelo seu índice, do
mesmo jeito que numa lista.
Índice Negativo
É possível usar, tanto em listas quanto em strings, uma referência a um índice negativo, como no exemplo
Nome_da_lista_ou_string[-2].
Bom, sabemos que listas e strings começam com índice 0 (zero), que representa o primeiro item da lista ou o
primeiro caractere de uma string. Veja a seguir um exemplo de uma variável chamada estado:
P E R N A M B U C O
0 1 2 3 4 5 6 7 8 9
Note que o item estado[4] aponta para a letra "A". Por sua vez, o item estado[8] aponta para "C".
Se usarmos índices negativos, a contagem começa no -1, a partir do último caractere ou item da lista, contando
para trás, como se pode ver a seguir:
P E R N A M B U C O
-10 -9 -8 -7 -6 -5 -4 -3 -2 -1
Portanto, o item estado[-4] aponta para a letra "B" e o item estado[-8] aponta para "R".
Podemos, porém, fazer uso de slices (a gente fala "isláicis", e quer dizer "fatias") para obter mais de um caractere
ou mais de um item de uma lista. É super fácil de usar! Veja o código a seguir:
b = a[2:5]
print[b]
Note que, em primeiro lugar, criamos uma lista a contendo 8 itens. Na segunda linha, pedimos para criar uma
lista b contendo uma "fatia" da lista a, que vai do item 2 até o item 5 (o sinal de "dois-pontos" é usado como "até").
Ao pedir para printar a lista b, o resultado será:
Bem observado, amigo leitor! Mas aí é que tá... quando apontamos para [2:5], o índice final não é incluído na fatia
– lembram-se da função range( )? Do mesmo jeito que ela... também nas fatias, o último item não é incluído.
Então, se fizermos estado[3:7] no exemplo que usamos na página anterior, estamos apontando para:
P E R N A M B U C O
0 1 2 3 4 5 6 7 8 9
Note que ele inclui a posição 3, mas não inclui a 7, indo até a 6, apenas. Veja isso no Shell:
>>> a = "Pernambuco"
>>> b = a[3:7]
>>> print(b)
namb
Podemos pedir fatias "do 3 até o final" ou "do início até o 4" ou "do penúltimo até o final", usando alguns códigos
especiais antes e depois do dois-pontos, vejamos:
Se quiser começar a slice a partir do início da lista ou string, simplesmente não coloque nada antes do sinal de
dois-pontos. Se quiser que a sua fatia vá até o final da lista ou string, não coloque índices após o sinal de dois-
pontos.
>>> print(b)
>>> print(c)
>>> print(e)
Você pode usar o comando del (que apaga variáveis) para apagar diversas posições de uma lista, basta que aponte
para o slice (fatia) desejado. Veja o exemplo abaixo:
>>> print(lista)
Verifique que o comando del lista[2:5] só apagou os itens nas posições 2, 3 e 4 da lista. Porque, você já sabe, a
fatia 2:5 não inclui o item na posição 5 (nunca inclui o item na posição depois dos dois-pontos).
texto = "Mises"
Dá pra fazer, normalmente, a alteração do item 2 da lista lista. Mas não é possível alterar o caractere 2 da string
texto. Só dá para alterar a string toda, se uma só vez, nunca um caractere específico.
Não esqueça disso: é possível mudar uma posição específica de uma lista, basta acionar lista[posição] = valor.
Mas não dá para alterar uma posição específica de uma string (ou seja, não dá para alterar um caractere
específico de uma String) – por isso as strings são consideradas imutáveis!
fat1 = texto[:5]
fat2 = lista[-3:]
fat3 = texto[-6:-2]
fat4 = lista[1]
lista[0] = 20
texto[0] = "T"
Lembrando que listas são mutáveis (ou seja, podemos mudar um item específico nelas) e strings são imutáveis
(ou seja, não podemos alterar um item específico nelas por meio do acesso ao índice). Chegou a hora de
aprender sobre uma outra estrutura de dados: a tupla (tuple em inglês).
Nas duas linhas mostradas acima, temos duas formas de criar tuplas: com e sem parênteses. O Python aceita as
duas formas de escrita! Não esqueça disso: quando atribuímos mais de um valor a uma única variável, essa
variável se torna uma Tupla!
Excelente pergunta! Uma tupla é usada quando precisamos de uma estrutura "somente-leitura", ou seja, de um
espaço na memória onde só é possível consultar os dados já guardados, e não modificá-los – acredite em mim,
amigo leitor: vão acontecer casos em que é necessário, sim, usar estruturas para "somente leitura".
Uma tupla não pode ter itens apagados, nem adicionados, nem modificados... Se ela nasceu com 5 itens, ela vai
existir sempre com aqueles 5 itens! Nunca serão apagados, nunca serão modificados, não será possível adicionar
novos itens na tupla.
t1 = ()
Também é possível criar uma tupla com um único item dentro dela, mas para isso é necessária atenção especial
de sua parte, amigo leitor! Para criar uma tupla com um único item, você deve escrever o item e uma vírgula
depois dele, caso contrário o Python entenderá que você quer criar uma variável simples, olha só:
Podemos exibir o tamanho (comprimento) da Tupla usando a função len( ), conforme vemos no exemplo a seguir:
>>> print(len(tupla1))
Concatenar Tuplas
É possível unir duas ou mais tuplas em uma única (uma nova tupla). Para isso, basta usar o operador + (sinal de
mais). Veja o exemplo a seguir:
>>> t1 = 1, 2, 3
>>> t2 = 4, 5, 6
>>> t3 = t1 + t2
>>> print(t3)
(1, 2, 3, 4, 5, 6)
Note: não houve alteração em nenhuma tupla (já que não é possível alterá-las). Houve apenas a criação de uma
terceira tupla chamada t3 a partir das duas anteriores (t1 e t2).
Repetir Tuplas
Uma tupla pode ser repetida por meio do operador * (asterisco), exatamente como fazendo com strings. Veja o
exemplo a seguir:
>>> t1 = 1, 2, 3
>>> t2 = t1 * 3
>>> print(t2)
(1, 2, 3, 1, 2, 3, 1, 2, 3)
Note que os itens da tupla t1 foram multiplicados por 3 para criar a tupla t2. Não houve alteração na tupla t1.
Teste de Pertencer
É possível testar se um item pertence, ou não, a uma tupla, usando o operador in ("em" em portugês), exatamente
como usamos em listas. Veja a seguir:
>>> t1 = 1, 2, 3, 4, 5
False
Ao pedir para printar 4 in t1, obtemos o resultado True, porque o 4 existe em t1. Quando pedimos para mostrar
"4" in t1, a resposta é False porque não existe "4" (string) dentro de t1.
t2 = (1, 3, 5, 7, 9)
t3 = t1 + 2 * t2
print(len(t3)*t1[1])
print(t2[1]*2 in t3)
t2 = 4, 3, 2, 1
variavel = t1[t2[1]]*t1[0]
print(variavel)
t2 = 3, 5, 1, 2
t1[3] = t2[2]
t5 = (1, 2, 3, 4, 5)
t6 = (6, 7, 8, 9)
t5 = t5 + t6
print(t5[0] + t5[5])
Listas e Tuplas são objetos com vários conteúdos [chamados de "estruturas de dados"] e, por isso, admitem
receber vários itens. Para identificar esses vários itens, separamos eles por vírgulas.
Tuplas podem ser criadas com os itens separados por vírgulas diretamente ou por eles envolvidos por
parênteses. Listas são criadas com vários itens separados por vírgulas envolvidos por colchetes.
Para criar listas e tuplas vazias, basta criar a variável atribuindo colchetes ou parênteses vazios:
Para criar uma lista com apenas um elemento, atribua à variável o valor entre colchetes (apenas isso). Para criar
uma tupla com um único elemento, deve-se atribuí-lo seguido da vírgula para evitar que o Python entenda errado
(como vimos na lição anterior):
Não esqueça: Listas e Tuplas podem conter diversos tipos de dados diferentes: Strings, Inteiros, Floats,
Booleanos etc., conforme o exemplo a seguir:
O comando del pode ser usado tanto em Tuplas quando em Listas (e também é usado em variáveis comuns do
mesmo jeito). Este comando apaga o objeto em questão retirando-o definitivamente da memória do computador.
Ou seja, o objeto apagado pelo del deixa de existir.
t1 = 1, 2, 3, 4
l1 = [1, 2, 3, 4]
v1 = "texto"
Tanto em tuplas quando em listas, é possível acessar uma posição específica da estrutura por meio do uso do
índice. Usa-se o nome da variável seguido do número da posição entre colchetes.
>>> print(t1[3])
"Menger"
>>> print(l1[0])
"Mises"
Também é possível acessar os itens de uma lista ou tupla por meio de índices negativos, que começam do -1, que
é o último item da lista/tupla.
>>> print(t1[-3])
"Hoppe"
>>> print(l1[-1])
"Bohm-Bawerk"
Também é possível fazer slices (fatias) apontando para alguns itens usando o operador : (dois-pontos) tanto em
listas como em tuplas.
>>> print(t1[1:4])
>>> print(l1[-3:-1])
['Hoppe', 'Menger']
É possível concatenar Tuplas e Listas, basta usar o operador + (sinal de mais). O resultado é uma lista/tupla com
a soma dos elementos das duas ou mais originais:
>>> l1 = [1,2,3,4]
>>> l2 = [4,5,6,7]
>>> print(l2+l1)
>>> t1 = (1,2,3,4)
>>> t2 = 4,5,6,7
>>> print(t2+t1)
Não dá para concatenar uma tupla com uma lista. Só é possível concatenar estruturas de dados de mesmo tipo.
É possível usar o operador in para testar se um determinado item está numa lista ou tupla.
>>> l1 = [1, 2, 3, 4, 5, 6]
>>> t1 = 1, 2, 3, 4, 5, 6
True
True
Há ainda algumas funções que podemos usar tanto em listas quanto em tuplas. Vamos listá-las agora para você,
amigo leitor, amiga leitora:
Função Descrição
max(sequência) e Retornam o maior (max) e o menor (min) valor dentro da sequência (seja ela uma
min(sequência) tupla ou lista)
lista.sort() Ordena os itens (ordem crescente) de uma lista (não funciona com tuplas).
lista.reverse() Inverte a ordem dos itens de uma lista (não funciona com tuplas).
lista.append(valor) Adiciona o valor na última posição de uma lista (não funciona com tuplas).
lista.extend(sequência) Adiciona a sequência [itens] no final de uma lista (não funciona com tuplas).
Os últimos seis comandos/funções/métodos mostrados acima não funcionam com tuplas porque eles alteram a
estrutura de dados, e tuplas não podem ser modificadas (lembra disso, né?).
lista.append(1)
tupla = 1, 2, 3, 4, 5, 6, 7
for i in tupla:
lista.append(i)
tupla = list(tupla)
print(lista == tupla)
tupla = (3)
variavel = 3
lista = [1, 2, 3]
print(lista)
print(tupla)
tupla = [8, 0, 9, 3]
variavel = 2
lista = (1, 2, 3)
lista = list(lista)
tupla = tuple(tupla)
print(tupla + lista)
Dicionários armazenam dados dentro dessas duplas. Os dados armazenados são os valores e a forma de
encontrar esses valores são justamente as chaves. O acesso aos dados não é feito por meio de índices, mas por
meio das chaves.
Note que o Dicionário é envolvido por chaves (o nome desses símbolos: { }) e cada elemento da listagem é
composto de chave : valor (separados pelo sinal de : - dois-pontos) e os elementos são separados, entre si, por
vírgulas, como nas listas e tuplas. Os valores de um dicionário são mutáveis, podem ser alterados livremente,
mas as chaves que apontam para eles têm que ser imutáveis, como uma string, um número ou uma tupla.
Para acessar um determinado elemento num dicionário, é necessário apontar para o nome do dicionário seguido
do nome da chave [entre colchetes] do elemento desejado. Assim:
print(dicio['Nome'])
Perceba que este código aponta para a chave 'Nome' dentro do dicionário dicio. O resultado deste código é bem
simples: ele retorna o valor associado à chave 'Nome', ou seja:
'João'
João 49 [email protected]
Para criar um dicionário vazio, é suficiente atribuir { } (abrir e fechar chaves) ao nome do dicionário que se deseja
criar. Acho que você já tinha deduzido, né? É muito semelhante a listas e tuplas:
dicionario_vazio = {}
dicio['Idade'] = 50
print(dicio)
O resultado disso é:
dicio['Telefone'] = '98213-2325'
print(dicio)
Note que o elemento que possuía a chave 'E-mail' foi excluído do dicionário. Para apagar o dicionário inteiro (não
somente um elemento específico), é só usar del dicio (isso destrói o dicionário inteiro).
Também é possível "esvaziar" um dicionário (apagar todos os seus elementos, mas deixar o dicionário existindo
vazio, sem itens), para isso usamos o método .clear( ).
print(dicio)
{}
Note que há dois elementos com a chave 2 e dois elementos com a chave 3. Isso vai resultar em:
O elemento 2:"Hayek" e o elemento 3:"Menger" foram desconsiderados, sendo mantidos apenas os outros dois
posteriores com as chaves 2 e 3. Ou seja, “os últimos substituirão os primeiros!” (amém?)
Percebeu algo? Sim! O formato dos dados em JSON é exatamente igual ao formato da estrutura que conhecemos
como dicionário no Python. (bom, há algumas diferenças pequenas, mas abordaremos isso mais adiante)
Por ora, é bom saber que, se você vai criar um programa que será usado na Internet, junto com um site, um app,
por exemplo, e você sabe que vai usar JSON para transmitir os dados entre eles, saiba que você vai usar
dicionários em seu programa Python!
dicio = {}
seq = range(10)
for i in seq:
lista.append(i*2)
dicio[i] = i**2
lista.reverse()
lista.pop()
lista.remove(10)
del dicio[3]
# print(lista)
# print(dicio)
print(lista[4] * dicio[2] - 2)
lista = []
É um saco, né?
Tem um jeito bem simples de fazer um (ou mais) comando(s) ser(em) repetido(s) sem precisar escrever todo o
código mais de uma vez. São as chamadas estruturas de repetição – ou laços de repetição. O primeiro laço de
repetição que iremos conhecer é o laço for.
O laço for é usado quando nós sabemos quantas vezes os comandos serão repetidos, pois precisamos informar
isso ao usá-lo. Usamos o laço for da seguinte maneira:
for x in range(1,6):
print(x)
Note que a segunda linha está um pouco afastada da margem esquerda. Esse efeito é chamado de indentação
(recuo). Para a linguagem Python, a indentação é muito importante – Você simplesmente não pode errá-la,
porque o programa simplesmente não funcionará!
A indentação informa que todo o código recuado está dentro da linha de código anterior, ou seja, a linha print(x)
está dentro do laço for num in range(1,6):.
Vamos entender o que significa este código? for num in range(1,6) pode ser lido como para cada <num> dentro
da sequência 1 a 6 [sem o 6]... ou seja, o Python vai:
[A] Criar uma variável temporária chamada num (qualquer nome serve);
[B] Atribuir à variável num o valor do primeiro item da sequência (no caso, o número 1);
[C] Realizar os comandos dentro do laço (no caso, printar na tela o valor de num);
Podemos traduzir o programa acima em "português" (para que fique fácil entender) como:
Para indicar o final de um laço qualquer, é só escrever algum comando sem a indentação dos demais. Não
esqueça, também, de colocar o sinal de : (dois pontos) no final do comando que estabelece o laço for.
Este código vai repetir dois comandos print a cada passo da iteração. O resultado dele é:
O quadrado de 0 é 0
O cubo de 0 é 0
O quadrado de 1 é 1
O cubo de 1 é 1
O quadrado de 2 é 4
O cubo de 2 é 8
O quadrado de 3 é 9
O cubo de 3 é 27
O quadrado de 4 é 16
O cubo de 4 é 64
Construa um programa que imprima na tela todas as letras do alfabeto (cada letra sendo
impressa numa linha diferente).
Mas há alguns casos em que vamos ter que pedir para repetir sem saber quantas vezes temos que fazê-lo. Para
esses casos, o laço for não funciona, temos que usar o laço while (significa "enquanto" em inglês e se fala
mineiramente “uáiôu”).
while condição:
faça isso
faça isso
faça isso
Note que a parte principal do laço while é a sua condição – uma proposição ser verdadeira. Para que o laço
while seja executado (ou seja, que os comandos dentro dele sejam executados), basta que a proposição lá em
cima seja verdadeira.
contador = 1
print(contador)
contador += 1
Neste programa:
[B] Estabelecemos que enquanto contador for menor ou igual a 5, os comandos abaixo serão repetidos.
[C] O programa irá imprimir [na tela] o valor atual da variável contador.
[E] O programa volta a analisar a condição do while lá em cima, se ela continuar verdadeira, o programa
executará os comandos internos ao while novamente.
Atenção: a expressão contador += 1 é uma forma reduzida de escrever contador = contador + 1. (lembra disso,
né?)
Atenção 2: é necessário colocar algum comando, dentro do laço while, para atualizar a variável analisada na
condição. Sem esse comando, o valor da variável contador será sempre 1 (conforme definido antes do laço
começar), o que fará o while ser eterno (repetir eternamente os comandos porque a condição será sempre
verdadeira, o que chamamos de Loop Infinito).
senha = 1
Note que em nenhum momento foi incluído um comando que altera o valor da variável senha. Ela ficará sempre
com valor 1. Como o valor 1 é menor ou igual a 5, então a proposição senha <= 5 será sempre verdadeira. Esse
while não terá fim... ele vai repetir eternamente o comando print, resultando em:
a senha é: 1
a senha é: 1
a senha é: 1
a senha é: 1
a senha é: 1
a senha é: 1
E assim por diante... pra sempre! Se não é o seu desejo que isso aconteça, nunca esqueça de incluir a cláusula
que altera o valor da variável que é usada como condição do laço while.
Exatamente, caro leitor! É tão simples evitar o erro do loop infinito... basta lembrar de colocar uma linha que
incremente variável que o while analisa. O for não precisa disso (ele a incrementa automaticamente), mas o while
não é tão “esperto” assim.
Existe a possibilidade de adicionar uma cláusula chamada else (senão, em inglês) que faz o Python obedecer
quando a condição do laço while não for mais verdadeira. Veja o código a seguir:
while a < 4:
print(a)
a += 1
else:
print("acabou a repetição")
print("fim do programa")
acabou a repetição
fim do programa
No final das contas, a cláusula else nem é tão importante assim porque quando a condição da while for falsa, o
laço deixará de ser executado [repetido] e o próximo comando [imediatamente abaixo e fora do while] já vai ser
executado.
while True:
print("sempre")
Esse código simples vai imprimir a palavra "sempre" infinitas vezes porque a condição do while é True.
Sua variável de controle é declarada na própria linha Sua variável de controle deve ser declarada e ter valor
do laço for (for x in sequência). atribuído antes da linha do laço while.
Sua variável de controle é incrementada Sua variável de controle deve ser incrementada por
automaticamente ao retornar à linha do laço for. uma linha de código dentro do laço, na posição que for
mais conveniente.
O laço for será repetido um certo e definido número de O laço while será repetido um número incerto de
vezes (descrito na própria sequência da linha que vezes, enquanto a condição for verdadeira.
determina o laço em si).
Construa um programa que solicite vários nomes dos usuários e os guarde numa lista até que
o usuário digite "fim". Depois de finalizar a captura dos nomes, o programa irá exibir a lista
contendo todos os nomes inseridos pelo usuário.
Construa um programa que solicite diversos preços ao usuário. O programa deve entender
que o número 0 [zero] indicará o fim da captura dos dados. Ao término da captura de todos
os números, o programa deverá realizar a soma de todos os preços capturados.
if proposição:
faça isso
faça isso
faça isso
Novamente, de forma bem semelhante ao laço while, a condição para que o if aconteça é uma proposição ser
verdadeira. Se ela for verdadeira, todos os comandos dentro do if serão obedecidos uma vez. Se a proposição
não for verdadeira, nenhum comando dentro do if será executado (ou seja, o bloco inteiro será ignorado).
Vejamos:
senha = 20
if senha > 10: # SE a variável senha for maior que 10 [e ela é]...
print("Fim do Programa")
A senha é: 20
Fim do Programa
Note o código abaixo, em que a variável senha não é maior que 10 inicialmente:
senha = 5
print("Fim do Programa")
Fim do Programa
Ou seja, neste exemplo, o código que existe dentro do laço if não foi executado porque a condição (a senha ser
maior que 10) não era verdadeira.
Exatamente, caro leitor! Se a condição inicial for falsa, os comandos dentro do if são ignorados.
Vamos a um exemplo:
senha = 5
else:
print("Fim do Programa")
Fim do Programa
Note que o bloco dentro do if foi ignorado e apenas o bloco dentro do else foi executado.
Um exemplo que sempre usam para ilustrar isso é sobre uma nota escolar. Vamos supor que a regra é essa: [a]
se tirar nota menor que 5, está "reprovado". [b] se não tirar menos que 5, mas tirar menos que 7, vai para a "prova
final". [c] se tirar 7 ou mais, ele estará automaticamente aprovado.
Dica: vale lembrar que a cláusula elif é uma contração de else if ("senão, se", em inglês).
O código a seguir mostra como seria feito um programa para a regra acima:
if nota < 5:
else:
print("Fim do Programa")
Perceba que if, elif e else devem ter exatamente a mesma indentação (ou seja, o mesmo afastamento da margem
do editor).
[A] Pede-se que o usuário digite a nota do aluno [função input( )] e converte-se o que ele digitar em um
número float [função float( )], armazenando isso na variável nota.
[B] Inicia-se o teste if para saber se nota é menor que 5. Caso isso seja verdade, apresenta-se na tela a frase
"O aluno está REPROVADO".
[C] Caso este teste anterior seja falso [ou seja, a nota não é menor que 5], inicia-se outro teste [elif], agora
para saber se a nota é menor que 7. Caso isso seja verdade, apresenta-se na tela a mensagem "O aluno
vai para a PROVA FINAL".
[D] Caso o teste anterior também seja falso [ou seja, se a nota não for menor que 7], resta obedecer à cláusula
else, apresentando na tela a mensagem "O aluno está APROVADO".
Escreva um programa que receba vários nomes e idades de usuários e os adicionem a uma
lista caso eles sejam maiores de idade [18 anos ou mais velho] e os adicionem a outra lista
caso eles sejam menores de idade [menor de 18 anos].
Escreva um programa que receba vários nomes e vários códigos de modalidades esportivas:
"f" para Futebol, "b" para Basquete e "v" para Vôlei. O programa deverá colocar os alunos
em listas separadas de cada modalidade. Ao final do programa, deve ser informado se a
equipe foi completada (5 jogadores para Basquete, 11 para Futebol e 6 para Volei).
Note que a linha acima apresentará um problema, porque as segundas aspas (as " depois de apresentar) serão
entendidas como sendo o fechamento das primeiras... Isso porque a função print() a entenderá assim. Ela não
será apresentada como eu gostaria que fosse:
Se você quer, realmente, mostrar aspas no texto que aparecerá para o usuário, você deve usar um código
interessante no Python... esse aqui:
O símbolo de \" (barra-invertida seguido de aspas) é o indicador de um caractere especial. Ele é a forma de dizer
ao Python que as aspas que seguem a barra-invertida devem ser apresentadas exatamente daquele jeito na saída
– ou seja, as aspas não serão consideradas parte do código do print(), e sim, aspas dentro do texto. Há outros
exemplos de caracteres especiais que usam a barra-invertida.
A combinação \' [barra-invertida com aspas simples] é usada para apresentar uma aspas simples (também
chamada de apóstrofo) no texto.
resulta em:
A combinação \t (barra-invertida com a letra t) serve para colocar uma tabulação horizontal naquela posição
na linha (que é aquele espaço criado pelo uso da tecla TAB).
resulta em:
Joao 9876-5432 42
A combinação \t é usada para a organização visual dos dados na tela do usuário. É possível colocar mais de um
\t seguidamente, para aumentar os espaços entre os dados. Seria usando \t\t\t, por exemplo.
Exatamente, amigo leitor. Para o Python, a \ é um “caractere de escape”. A barra invertida é o símbolo que você
deve usar para que o próximo caractere seja interpretado de forma diferente pela linguagem, como nós acabamos
de ver com o \t, o \” e o \’. Vamos a mais uma combinação?
resulta em:
Continuando...
Um lobo barbudo...
Aí você usará, caro leitor, a combinação \\ (duas barras-invertidas) exatamente no local onde deseja que a barra-
invertida apareça para o usuário.
resulta em
Tudo aquilo que estiver dentro das aspas triplas será respeitado exatamente como estiver lá, incluindo as quebras
de linha que você usou (ENTER) no meio do código. Vamos ver isso?
texto = """
quem não produz nada; quando comprovar que o dinheiro "flui" para quem
negocia não com bens, mas com favores; quando perceber que muitos ficam
ricos pelo suborno e por influência, mais que pelo trabalho, e que as leis
não nos protegem deles, mas, pelo contrário, são eles que estão protegidos
print("*" * 73)
print(texto)
print("*" * 73)
*************************************************************************
quem não produz nada; quando comprovar que o dinheiro "flui" para quem
negocia não com bens, mas com favores; quando perceber que muitos ficam
ricos pelo suborno e por influência, mais que pelo trabalho, e que as leis
não nos protegem deles, mas, pelo contrário, são eles que estão protegidos
*************************************************************************
Perceba que na penúltima linha foi usado um \t. Este código especial foi respeitado e se converteu numa tabulação
(afastamento) na saída para o usuário, antes do nome da Ayn Rand. Perceba também que as aspas (duplas e
simples) nas palavras "flui", 'recompensada' e "sociedade" foram inseridas sem que fosse necessário usar
códigos especiais para sua inserção.
Nas aspas triplas, tais caracteres e as quebras de linha não precisam ser apresentadas com caracteres especiais
\n. Apenas a tabulação horizontal (\t) é que precisa ser oficialmente apresentada. Ahhh, também não custa
lembrar que tanto faz se você usa """ (aspas triplas) ou ''' (apóstrofos triplos), pois o resultado é o mesmo!
print(a)
a = """Só existem duas formas dos homens lidarem uns com os outros:
Aqueles que sabem que não podem vencer por meio da lógica sempre recorrem às armas.\nAyn
Rand"""
print(a)
nome = "João"
idade = 42
Bom, isso foi um jeito simples, e já conhecido, de concatenar, numa única string, algumas variáveis e algumas
strings. O uso do sinal de + (adição) para concatenar já é conhecido, né?
Lembrou que precisamos colocar um espaço antes e/ou depois de cada trecho de texto entre aspas, né? Se não
fizermos isso, as palavras concatenadas ficarão todas juntas.
Perceba que, neste caso (usando o sinal de +), também foi necessário usar a função str( ) na variável idade,
porque ela é do tipo integer, conforme vemos lá em cima no momento em que nós atribuímos a ela o valor 42.
Lembre-se que não dá para concatenar uma string e um valor não-string com o sinal de +.
Sim, amigo leitor! Podemos escrever o mesmo comando print() de outra maneira! Podemos separar cada item a
ser mostrado por uma vírgula. Neste caso, nem precisamos converter os valores inteiros (ou seja, não
precisaremos da função str( )) e nem precisaremos colocar os espaços antes e depois de cada trecho de string:
nome = "João"
idade = 42
Estas são facilidades da função print() – tratar números como strings e colocar automaticamente um espaço
entre os itens. Espertinha, não?
[A] Primeiro: temos que colocar uma letra f antes da string que desejamos formatar. Ou seja, em vez de
escrever "casa", vamos escrever f"casa" (tem que ser encostado na string, mesmo, sem espaços entre f
e as aspas). É assim que o Python entende que a string vai ser formatada (esta é uma maneira recente).
nome = "João"
idade = 44
Preste atenção para colocar os símbolos certos entre as palavras e as variáveis, como os espaços e as
pontuações que são colocados antes das { e depois das }, ok? Em ambos os casos, o resultado será:
Ei, mas se liga! Não precisa ser necessariamente apenas uma variável dentro das chaves! Pode ser uma
expressão qualquer que use variáveis (ou não), como um cálculo.
Repare no trecho {idade * 2}. Ele vai apresentar o resultado da multiplicação do valor da variável idade por 2. O
resultado, portanto, deste código é:
O método .format( ).
Além de usar a f string, podemos usar outro jeito de formatar strings: o método .format( ).
Lembra o que é um método, né? Um método é uma função que é usada como "sobrenome" de um objeto, sempre
escrito depois do objeto para o qual ele aponta.
Desta forma, em vez de usar f"casa", podemos usar "casa".format(). E nós colocaremos as variáveis e expressões
como argumentos (parâmetros) do método, ou seja, dentro dos seus parênteses. Ei! .format() tem que ser escrito
encostado nas aspas que fecham a string, ok? Sem espaços!
nome = "João"
idade = 44
print(mensagem)
Note que os indicadores {} são colocados onde desejamos que os dados sejam inseridos, mas não precisamos
colocar seus nomes dentro das chaves. Os nomes das variáveis foram informados dentro do
método .format(nome, idade).
Como há dois indicadores { } e temos dois argumentos dentro do método .format( ), cada um deles será substituído
por cada argumento do método, em ordem de ocorrência. Ou seja, o primeiro {} será substituído pelo valor da
variável nome e o segundo {} será substituído pelo valor existente na variável idade.
num = 12
nome = "Mises"
print(mensagem)
[A] Definir, dentro das chaves, algum apelido para o dado que será ali colocado;
[B] Dentro dos parênteses, escrever a expressão apelido=variável para associar o apelido usado na string
com alguma variável já existente. É necessário nomear cada apelido que será usado na string. Não
funcionará se você se esquecer de algum.
Perceba que neste caso do método .format( ), também não é necessário converter valores que são originalmente
números (como foi o caso da variável num).
print(mensagem.format(num=index, nome=lista[index]))
print("Lista encerrada")
for xy in nomes:
if xy != "Hayek":
else:
print("{} é um Gênio!")
print("Fim do Programa")
Programa 2 – Cálculos
a, b, c = 10, 20, 30
if c > 3 * b:
a += 10
b *= a
else:
a *= c
b += a
print(a, b)
Receba nomes e notas dos alunos e os insira em duas diferentes listas. Ao digitar "x", o
sistema para de capturar nomes e notas e já mostra a lista dos alunos no seguinte formato:
==============================
Nome Nota
==============================
Fulano 9.0
Beltrano 2.0
Trajano 5.0
Receba vários nomes e notas dos alunos [encerra a recepção dos dados quando digitar "x"].
Se a nota do aluno for menor que 7, que o nome dele e a sua nota sejam armazenados numa
determinada lista – a lista de alunos problemáticos. Se a nota do aluno for igual ou maior que
7, que seu nome e sua nota sejam inseridos em outra lista – a lista de bons alunos. Ao término
do programa, mostrar a seguinte tela:
==============================
Alunos Bons
==============================
Fulano 9.0
Beltrano 8.0
Trajano 7.5
==============================
Alunos Problemáticos
==============================
Mariano 3.0
Lugano 5.0
Podemos criar funções usando o comando def, que é uma contração para "definir". Ou seja, o ato de definir uma
função é o ato de criá-la, de dizer como ela vai funcionar, quais as formas de usá-la.
Pense numa função como uma ferramenta (um martelo ou um alicate, por exemplo). Se você não tem um martelo,
mas pode construí-lo, faça-o! A partir daquele momento, você vai usar sempre aquele martelo! Ele será muito
útil! Ou seja, você o constrói UMA VEZ, mas depois disso poderá usá-lo VÁRIAS VEZES!
def rodape():
print("=" * 30)
print("=" * 30)
Pronto! Criamos uma função que será usada sempre no final de nossos programas, para colocar na tela o
seguinte:
==============================
==============================
Uma vez criada a função, para usá-la, nós a chamamos (o termo que os vários autores de informática usam é
esse: "chamar uma função" – é o mesmo que "mencionar seu nome", ou "usar aquela função").
Basta, realmente, mencionar aquela função no exato local do código onde você quer que ela execute seus
comandos. Olha isso:
print("=" * 30)
print("=" * 30)
num = 80
print(num * 3)
240
==============================
==============================
def funcao_exemplo():
No caso mostrado anteriormente (da função rodape( ) que nós havíamos criado), a função simplesmente não
recebe informação alguma. Ela simplesmente é chamada e realiza os comandos que haviam sido colocados
dentro dela.
Podemos, porém, criar funções que recebam dados (os argumentos) e que, com isso, façam alguma coisa com
esses dados. Vamos ver o exemplo a seguir:
dobro(15)
dobro(20)
dobro(80)
O dobro de 15 é 30
O dobro de 20 é 40
O dobro de 80 é 160
Note que a cada vez que a função dobro( ) foi chamada, nós colocamos um número diferente dentro dos
parênteses (mudamos o argumento). A cada novo argumento passado para a função, ela realizou seu comando
"print" com um dado diferente, imprimindo uma informação diferente.
Definir uma Função ou "Declarar" uma função: significa dizer ao Python que aquela função existe, ou seja, é
definir uma função é construí-la.
Chamar uma Função: é a mesma coisa que usá-la. Chamar uma função é mencionar o seu nome no meio do
programa. É assim que nós usamos as funções.
Passar um Argumento para uma Função: é a mesma coisa que informar um dado para que a função trabalhe
corretamente. Passar um argumento (ou parâmetro) é justamente colocar um dado dentro dos parênteses de
uma função, na hora de chamá-la, para ela trabalhar com ele.
Uma função pode receber mais de um argumento, desde que você a declare assim. Vejamos o exemplo abaixo:
def maior(a,b):
if a > b:
elif b > a:
else:
maior(10,30)
maior(80,30)
maior(30,30)
30 é maior que 10
80 é maior que 30
Existem funções que não se importam com a quantidade de argumentos que passamos para elas. Veja o exemplo
das funções max( ) e min( ).
b = max(2, 30, 4)
Os dois usos da funçao max( ) acima receberam quantidades de parâmetros diferentes: ao usar no primeiro
exemplo, colocamos 8 argumentos; no segundo uso, passamos apenas 3 parâmetros.
A maneira de criar uma função que aceite inúmeros parâmetros (sem que saibamos exatamente quantos) é
colocando um sinal de asterisco no nome do argumento quando declaramos a função.
def muitos(*dados):
O maior número é: 8
O maior número é: 3
Quando usamos * no argumento da função em sua definição, estamos indicando que os argumentos formarão
uma tupla.
Construa uma função que receba dois valores e que apresente na tela a soma deles. Depois,
chame-a com os valores 30 e 50.
Construa uma função que receba três valores e que imprima na tela uma mensagem
informando se há valores repetidos entre eles. Chame a função passando os valores 30, 20 e
30 e depois chame-a com os valores 10, 30 e 80.
Construa uma função que receba três palavras e as imprima na tela em sequência alfabética,
com um espaço entre elas.
print(a + b * c)
calculo(2,3,4)
No programa acima, as variáveis a, b e c foram definidas dentro da função calculo( ). Elas não podem ser usadas
fora dela. A linha teste = a + 10 vai apresentar um erro porque a variável a nunca foi declarada fora da função.
Outra coisa é que as variáveis declaradas fora da função não influenciam as variáveis declaradas dentro da
função, mesmo que tenham o mesmo nome – para o Python, são variáveis diferentes.
b = 4
calculo(a,b,10)
O resultado do programa acima vai ser a impressão de três linhas na tela, contendo os valores:
20
110
50
funcao_qualquer(100, 200)
(note que ela foi chamada informando apenas dois argumentos) – Isso vai dar um erro! O Python irá mostrar uma
mensagem de erro (que é mostrada no inicio da próxima página).
funcao_qualquer(100,200)
A última linha da mensagem diz "missing 1 required argument" (1 argumento necessário está faltando), e
aponta que é o arg3 que está em falta.
Para evitar isso, e, claro, para tornar um dos argumentos desnecessário, podemos criar um "valor padrão" para
o argumento, caso ele não seja informado.
É muito fácil fazer isso: basta colocar argumento=valor na própria definição da função. Veja:
if a > b:
elif b > a:
else:
30 é maior que 10
80 é maior que 10
10 é maior que 6
Perceba que nos casos em que não informamos o segundo argumento, o Python considerou que o argumento b
da sua função tem valor 10. Isso evita o erro e permite que você crie um valor básico, comum, para o argumento.
Você vai perceber a necessidade disso em algum momento enquanto estiver programando!
def soma(num1=30,num2=20):
soma(10,400)
soma(80)
soma()
Note que no primeiro exemplo, foram passados os dois argumentos na função. Ela resultou, portanto, em 410 (a
soma do 10 com o 400). No segundo exemplo, só foi passado o argumento 80, o Python considerou o segundo
argumento com seu valor-padrão (que é 20), portanto, o resultado deu 100.
No terceiro exemplo, nenhum argumento foi passado para a função – ela teve de considerar os dois valores-
padrão: 30 e 20. Por isso o resultado deu 50.
(não use o Python... analise o programa aqui mesmo e – com sua mente – imagine qual é a saída do programa)
num = 30
if num <=100:
else:
calculo(20)
calculo(2,5)
calculo(120,130)
def mostra_dobro(num):
print(num*2)
mostra_dobro(10)
A função mostra_dobro( ) exige um argumento como valor e vai mostrar o valor na tela (graças à função print()
lá dentro). Por causa disso, a função pode ser usada diretamente como na linha mostra_dobro(10). O resultado
do programa acima é:
20
O número 20 foi impresso na tela porque a função print(num*2) está dentro da função mostra_dobro(num) – e
nós chamamos esta função passando para ela o valor 10.
Vamos aprender uma nova forma de utilização das funções? Olha o programa abaixo:
def calcula_dobro(num):
return num * 2
Note que a função calcula_dobro( ) não manda, em seu interior, nenhuma informação ser impressa na tela (não
existe a função print() ali dentro). O comando return indica que a função deve oferecer como resultado (ou seja,
como resposta da função) justamente o num * 2.
Mostrar na tela é uma coisa (você já sabe que se consegue isso com a função print()). Retornar um valor é outra
coisa bem diferente (não aparece nada na tela com o comando return).
Quando uma função retorna um valor, a gente tem que fazer algo com esse valor: que pode ser armazená-lo
numa variável ou mesmo imprimi-lo diretamente por meio de uma função print() no corpo do programa.
return num * 2
print(numero)
No programa acima, a variável numero receberá o resultado da função calcula_dobro( ) aplicada ao valor 10.
Depois, é só mandar imprimir o valor da variável numero.
O resultado é esse:
20
Dentro do código de uma função, o comando que indica qual será o valor-resultado desta função é o return. Nada
colocado após o comando return no corpo da função será entendido. Tudo depois do return será ignorado.
def ignora(numero):
print("pronto")
numero += 20
print("numero")
ignora(5)
print("Programa Terminado")
Programa Terminado
Note que nenhum dos comandos print() dentro do corpo da função ignora( ) foi executado. Isso porque o código
da função só é executado até o comando return.
return a + b
return(a + b)
def dobro_triplo(ancora):
print(num1, num2)
20 30
Note que a função dobro_triplo( ) foi construída para retornar dois valores: ancora*2 e ancora*3 (ancora é o
nome da variável interna que recebe o valor passado como argumento da função). O fato de a função "devolver"
dois valores ao mesmo tempo permite que usemos isso para preencher duas variáveis diferentes ao mesmo
tempo, o que fizemos na atribuição das variáveis num1 e num2.
def dobro_triplo(ancora):
numero = dobro_triplo(10)
print(numero)
A variável numero vai se transformar numa tupla contendo os dois valores o resultado é este:
(20, 30)
Exatamente, amigo leitor! A gente viu isso lá na lição sobre tuplas! Tem um lembrete bem chamativo na primeira
página da lição, logo antes da sua pergunta sobre “para que a tupla serve se ela é imutável?”.
media(10,20)
media(30,10)
print("Fim do Programa")
return(num1)
else:
return(num2)
a = 20
b = 30
grande = maior(a,b)
return a + c * b
hoje = teste(10,20,2)
ontem = teste(20,10)
print(hoje + ontem)
print(teste(30,5,5))
Podemos definir assim: List Comprehensions são expressões lógicas que servem como regras na criação de
listas, determinando quais elementos vão fazer parte da lista e quais não irão.
Não usamos o termo "List Comprehension" de forma traduzida para o português porque fica realmente bem
estranho... seria "Compreensões da Lista" – ou talvez seria bom traduzir como "Lista Compreensível" (que meigo,
não?).
Vamos entender como funciona? Primeiro, vamos imaginar que queremos criar uma lista com todos os quadrados
dos números de 1 a 10. A lista desejada ficará exatamente assim:
Note que 1 é 12, 4 é 22, 9 é 32, 16 é 42 e assim por diante. A lista obedece aos critérios exigidos mencionados
anteriormente, mas foi construída manualmente, ou seja, o programador teve de digitar cada item um a um. Um
trabalho manual e muito chato (imagina se fossem 100 itens...).
Dá para construí-la de forma automática? Sem recorrer a fazer todos os itens manualmente? Sim! Dá uma olhada
na expressão abaixo:
Traduza essa expressão como: crie uma lista com item de valor x2 para cada x dentro da sequência que tem
range(1,11). (lembre-se que a range( ) não inclui o item final, ou seja, o 11).
O Python, portanto, vai iterar x dentro da range(1,11) (isso significa que x vai variar de 1 a 10) e a cada iteração,
vai elevar o valor de x ao quadrado (é o que significa o x**2, lembra?) e inserir esse valor na nova lista.
Esta expressão significa: para cada item num na sequência que vai de 10 a 200, iterando de 13 em 13, crie um
item de valor num + 5. O resultado deste comando é uma lista com os seguintes itens:
[15, 28, 41, 54, 67, 80, 93, 106, 119, 132, 145, 158, 171, 184, 197]
As List Comprehensions podem ganhar uma ajuda incrível da cláusula if. Sim! Podemos ser bem mais seletivos
e escolher alguns itens apenas da listagem a ser criada (ou seja, não aceitar todos eles, ou definir mais uma
exigência para a inclusão dos itens na nova lista).
Que tal se a regra fosse: adicione todos os números de 1 a 30 apenas se eles forem múltiplos de 4.
Ora, é simples: quando o resto da divisão dele por 4 der 0! Ou seja, quando a divisão dele por 4 é exata.
Podemos traduzir como "crie um item x, que esteja dentro da range(1,30) apenas se o resto da divisão desse x
por 4 for igual a 0 [zero]".
O Python irá iterar (varrer a sequência) de 1 a 29 (o 30 não é incluído, lembra?) e testará se cada número daquela
iteração é divisível por 4. Se for, o número x daquela iteração é incluído na lista_nova; se o número x daquela
iteração não for divisível por 4, o número não será incluído na lista_nova.
Não fique achando que a gente só consegue usar expressões lógicas para criar listas com números, não! O
bagulho é sinistro! Dá para fazer muita coisa além disso – inclusive com texto!
E é nosso desejo criar uma segunda lista contendo apenas os nomes dos alunos que começam com a letra "A".
Como fazer? Com uma expressão:
A expressão acima pode ser traduzida como: crie a lista_a contendo nome, analisado da lista alunos, nome por
nome, somente se a posição 0 da string nome na lista alunos seja igual a "A".
Porque, como vimos anteriormente, uma string pode ser acessada como uma lista.
Cada letra de uma string pode ser acessada separadamente, como se fosse uma "posição" na string. A primeira
letra de uma string sempre é a posição 0 [zero] dessa string. (a segunda letra é a posição [1], a terceira letra é a
posição [2], a quarta letra da string é a posição [3] e assim por diante).
Precisamente, amigo leitor! Ao definir a condição nome[0]==”A”, a Ângela não pode ser incluída porque seu nome
não começa com “A”, mas sim com “”, que é um caractere diferente!
Descreva a lista que será criada ao escrever cada uma dessas expressões:
lista = [w*3 for w in range(3,20,3)]
nova_lista.pop()
nova_lista.reverse()
for i in nova_lista:
print(i*2)
print("Fim do Programa")
Um loop infinito acontece quando uma condição inicialmente verdadeira é testada no while e, dentro dele,
nenhuma alteração nesta condição é feita. Ou seja, o while irá sempre repetir as mesmas coisas, o tempo todo...
Um código de exemplo pode ser visto a seguir:
senha = 10
Para evitar que essa linha se repita para sempre, poderíamos adicionar uma linha que diminuísse o valor da
variável senha em 1 a cada loop, o que faria com que ela, em algum momento, a variável senha fique com valor
3, o que tornaria a condição do while falsa, fazendo o loop parar. A solução seria essa:
senha = 10
print("repetido")
Porém, em alguns casos, é necessário que o loop seja, realmente, "infinito" – porque não sabemos quantas vezes
o loop será realizado (depende do usuário do nosso programa). Um caso muito comum é um "menu principal" em
um programa. Um menu que apresente várias opções ao usuário e que deva ser sempre mostrado, várias e várias
vezes, porque o usuário o utilizará diversas vezes seguidas.
Neste caso, deve haver uma forma de dizer ao programa que o usuário não quer mais que aquele menu apareça
para ele e, com isso, o programa termine. Isso é muito fácil: basta que o usuário digite que quer sair! Ou seja,
basta que a condição do while seja alterada por meio de algo que o usuário digite.
Vamos ver esse exemplo? Vamos começar criando uma variável chamada opcao e dar a ela o valor 1, depois
fazer o while fazer loop enquanto a variável opcao for diferente de 0 (zero). O começo do nosso código é esse
aqui:
opcao = 1
while opcao != 0:
Isso constitui um loop infinito, percebeu? A variável opcao é 1 e a condição do while é verdadeira, caso a variável
opcao não seja alterada, os comandos dentro do while vão se repetir infinitamente.
opcao = 1 # O Programa começa aqui, definindo opcao como 1 para o loop executar.
while opcao != 0:
print("=" * 30)
print("Cadastro de Alunos")
print("=" * 30)
print("Sair [0]")
# número da opcao
# Quando o programa terminar, e tentar fazer outro loop desses, se a opcao estiver
com 0, ele para!
Perceba que o programa começou com a atribuição do valor 1 para a variável opcao. Depois, imediatamente, o
laço while começou testando se a variável opcao era diferente de 0 (zero) – e ela é, por isso o laço será realizado.
==============================
Cadastro de Alunos
==============================
Sair [0]
Nesta última linha, o usuário deverá digitar um valor que, segundo o programa, será armazenado na variável
opcao, depois de convertido para inteiro (note lá no código o int(input...)).
Na parte inferior do código, após o menu principal, coloquei apenas dois comentários, mas o lógico a fazer é tratar
o que o usuário digitou e fazer o programa rodar a operação que o usuário quer executar (Incluir, Alterar ou
Excluir alunos, ou, por fim, sair do programa).
while opcao != 0:
print("=" * 30)
print("Cadastro de Alunos")
print("=" * 30)
print("Sair [0]")
if opcao == 1:
elif opcao == 2:
elif opcao == 3:
elif opcao == 0:
else:
Note que dependendo o valor da variável opcao, o programa fará coisas diferentes (o if, seguido de vários elif e
de um else fazem isso)... Neste "catatau" de coisa, eu só queria mostrar especificamente dois comandos: o
comando break e o comando continue.
O comando break, no código acima, está associado à cláusula elif opcao==0, ou seja, se o usuário digitar 0, o
comando que será executado é justamente esse break. E a função dele é bem simples: ele encerra o loop. Ele faz
o Python sair do loop. Quando o Python lê o comando break, ele sai do while e começa executando o primeiro
comando fora do loop.
Em suma, este comando é o que se usa para sair de um loop (seja ele infinito ou não).
Note bem: assim que o Python lê o comando break, ele salta para fora do loop. Ele deixa de executar os comandos
posteriores dentro do loop. Simplesmente ignora eles.
O comando continue tem uma "missão" diferente. Quando o Python lê este comando, ele salta para o início do
loop, ou seja, ele ignora tudo o que vem depois e volta ao início do loop para reiniciar todos os comandos do loop.
No caso de um loop for, ele itera o for, ou seja, ele salta para o início do loop e conta o próximo valor do for.
São dois comandos que ajudam muito no fluxo de um programa, essencialmente no while e no for.
print("=" * 30)
senha = 'x'
if senha == 'a' :
print("primeira passagem")
break
senha = "b"
print("segunda passagem")
senha = 'c'
continue
senha = 'x'
print("terceira passagem")
senha = 'a'
#continue
else:
print("última passagem")
break
print("-" * 30)
print("-" * 30)
print("fim do programa")
print(a + 10)
Notou alguma coisa estranha? O código está mandando printar a variável a somada ao número 10. Mas a variável
a não existe! Não foi declarada antes! A resposta do Python será:
print(a+10)
Veja a última linha deste erro: name 'a' is not defined (a variável a não foi definida antes). Corrija seu código e
tente novamente!
Ô! E como!! Usuários podem ser causa de muitas agonias em nossas vidas, pode ter certeza, meu amigo! Para
este caso, podemos "prever" alguns comportamentos e usar um recurso bem interessante.
Um código simples, né? Ele vai guardar o resultado do primeiro input na variável nome e vai converter para
inteiro o resultado do segundo input, guardando-o na variável idade. Até aí, nenhuma dificuldade, né?
Mas não podemos "subestimar" as capacidades destruidoras do usuário, meu amigo leitor! Imagine que o usuário
invente de digitar "dezoito anos" quando lhe for pedida a idade... (em vez de digitar "18").
Ora, como aquela linha de código vai converter o input para inteiro (graças à função int( ) aplicada ali ao input),
ela não poderá receber "dezoito", mas consegue receber "18". Afinal, todo input é, necessariamente, um string.
ValueError: invalid literal for int() with base 10: 'dezoito anos'
Temos que prever a burr... ops, o erro do usuário. É nossa obrigação, enquanto programadores, prever quais
erros o usuário poderá cometer e já tentar tratar esses erros para que o programa não trave nem dê mensagens
de erro estranhas...
try:
except:
Então, poderíamos imaginar que o usuário vai causar o erro mostrado lá em cima, digitando "dezoito" em vez de
"18", a gente escreveria:
try:
except:
O que estiver debaixo do try: será testado. Se ele não der erro, o código é usado normalmente e nada de mensagem
de erro aparecerá. Se, porém, a execução do código der um problema, será executado o código que estiver abaixo
de except:.
Temos, sim, amigo leitor! Há “opções” além do try e do except. É preciso explicar que os blocos try: e except: são
obrigatórios nesta estrutura (devem ser escritos exatamente desta forma). Mas há outros dois opcionais que
podem ser somados a estes.
É possível usar os blocos else: e finally: após o try: e o except:. Funciona assim:
try:
except:
else:
finally:
try:
except:
else:
finally:
print("Programa finalizado!")
Qualquer um dos blocos acima pode ter mais de um comando dentro de si. Então, se você fizer um try: com mais
de um comando, ele analisará todos eles e só considerará que deve ir pro else: se todos estiverem corretos (ou
seja, se nenhum deles der erro).
Se apenas um deles apresentar um erro, o sistema automaticamente cairá no bloco except: executando tudo o
que estiver lá!
try:
except:
else:
tupla = 1, 2, 3
try:
tupla[0] = lista[1]
print(lista, tupla)
except:
B = 20
X = 12
try:
c = a + b
d = c + a
except:
print(X)
else:
print(a)
print(b)
finally:
print("Fim")
lista = [1, 2, 3]
tupla = 1, 2, 3
try:
lista[0] = tupla[1]
except:
else:
print(lista)
print(tupla)
print("Fim")
Usamos módulos para não precisar escrever sempre códigos muitos grandes e complexos.
O jeito mais simples de importar funções, classes e variáveis descritos em um outro arquivo é usando a função
import arquivo – neste caso, todas as funções, variáveis e demais códigos reutilizáveis poderão ser usados.
Porém, importar deste jeito exige que apontemos para as funções e variáveis com o prefixo arquivo.funcao( ) em
vez de apenas funcao( ). Veja a seguir:
import funcoes
a = 10
print(funcoes.dobro(a))
print(funcoes.triplo(a))
Atenção, a linha import arquivo usa o nome do arquivo sem a extensão .py. Os dois arquivos devem estar salvos
na mesma pasta para que isso funcione.
Você poderá importar um arquivo inteiro dando-lhe um apelido mais "curto" (mais fácil de digitar), com isso
evitaria ter de digitar "arquivo.objeto( )" todas as vezes que precisasse usar uma das funções ou variáveis que
foram importadas.
a = 10
print(m.triplo(a))
Quando você importa o componente em si, usando from arquivo, não é necessário se referir a ele com o prefixo
arquivo. ou m.! Veja no código abaixo:
a = 10
Para importar todas as funções e variáveis de um arquivo, você pode usar a linha from arquivo import * (o
asterisco aqui significa "tudo").
a = 10
return num * 2
def triplo(num):
return num * 3
def quadrado(num):
return num ** 2
def cubo(num):
return num ** 3
valor_padrao = 100
outro_valor = 200
a = 10
print(origem.dobro(a))
print(origem.metade(a))
a = valor_padrao * 10
print(origem.dobro(a))
print(origem.metade(a))
a = outro_valor * 6
print(quadrado(a))
print(cubo(a))
Chegou a hora de conhecermos dois operadores booleanos, que são sinais que realizam operações com valores
booleanos (valores True ou False): o operador and e o operador or.
Assim como os operadores aritméticos devem ser posicionados entre dois valores numéricos (números ou
variáveis que contenham números), os operadores booleanos devem ser posicionados entre dois valores
booleanos (True ou False) ou entre duas proposições (expressões que podem ser True ou False).
situacao_mateus = True
situacao_lucas = b < 30
[A] A variável situacao_mateus foi declarada com o valor True (ela é booleana);
[B] A variável situacao_lucas foi declarada com uma proposição (b < 30): portanto, pode ser True ou False (é
booleana, também);
[C] A variável situacao_pedro foi declarada como o resultado de uma operação or entre o valor booleano
True e a proposição 40 > 20. (ela também é booleada).
if a<30 and b>5: # Testando as duas condições ao mesmo tempo (as 2 True)
print(a+b)
A função print() acima será normalmente executada porque as duas proposições (a<30 e b>5) são verdadeiras
(True), fazendo a operação and também ser True.
30
if a>20 and b>5: # Testando as duas condições ao mesmo tempo (1 delas False)
print(a+b)
A função print() acima não será executada porque das duas proposições (a>20 e b>5) apresentadas no laço if,
uma delas é False (falsa) – a proposição a>20 -, fazendo a operação and também ser False. E se a condição da
estrutura if for falsa, o if não será executado (o else seria).
32.3. O Operador or
Usamos o operador or entre duas proposições (entre duas expressões booleanas) para que o resultado seja True
se, pelo menos, uma das expressões originais for True.
if a<30 or b<5: # Testando as duas condições ao mesmo tempo (uma delas True)
print(a+b)
A função print() acima será normalmente executada porque uma das duas proposições (a<30) é verdadeira (True),
fazendo a operação or também ser True.
if a>20 or b<5: # Testando as duas condições ao mesmo tempo (as duas False)
print(a+b)
A função print() acima não será executada porque as duas proposições (a>20 e b>5) apresentadas no laço if, são
False (falsas), fazendo a operação or também ser False.
Você pode usar and e or em expressões com mais de duas proposições, como no exemplo:
Não esqueça que: and só é True se todas forem True; or só é False se todas forem False.
x=0
if x>2 or quadrados[x]>20:
x+=1
print("Fim do Programa")
Caso modificássemos a linha do if para <20, ao invés de >20, qual seria a saída do programa?
Considerando o código alterado pela questão anterior, qual seria a saída do programa se,
abaixo da primeira linha de código, adiconássemos a linha:
Quadrados[4]=25
lista1=[1,2,3,4]
lista4 = [6, 7, 8]
[A] Uma lista chamada lista1 que contém 4 elementos do tipo integer.
[B] Uma lista chamada lista2, que contém 4 elementos do tipo string.
[C] Uma lista chamada lista3, que contém 4 elementos do tipo string.
[D] Uma lista chamada lista 4 que contém 3 elementos do tipo integer.
Sim, amigo leitor! Uma lista pode apresentar elementos com tipos de dados diferentes. Foi apenas uma decisão
minha, para este exemplo, colocar cada lista com apenas um tipo de dado específico.
lista1=[1,2,3,4]
lista3 = zip(lista1, lista2) # esta linha criou um objeto zip chamado lista3
print(lista3)
Quando você usa a função zip(), você não cria uma lista: você cria um objeto do tipo zip, que é um endereço para
as posições de memória das duas listas originais. Esse tipo de objeto não pode ser exibido naturalmente... o
resultado (saída) do programa acima será:
Sim, caro leitor! É exatamente assim que a gente possibilita o uso do resultado do zip: transformando ele em uma
lista por meio da função list().
Programação em Python – www.professorjoaoantonio.com.br - @ProfessorJoaoAntonio Página 122
O código completo seria esse aqui:
lista1=[1,2,3,4]
print(lista3)
Note que cada item da lista lista3 é uma tupla entre as posições de mesmo índice das listas lista1 e lista2,
portanto, o que a função zip() faz é criar um objeto zip, que pode ser transformada em uma lista de tuplas.
lista1=[1,2,3,4]
lista3 = [9, 8, 7, 6]
print(lista4)
[(1, 'a', 9), (2, 'b', 8), (3, 'c', 7), (4, 'd', 6)]
Note que a lista4 tem quatro itens: cada um deles é uma tupla com 3 itens, porque são 3 as listas originais (lista1,
lista2 e lista3). E todas essas 3 listas têm o mesmo número de itens (4 itens).
Sim, amigo leitor! No caso, a lista final terá a mesma quantidade de elementos da menor das listas originais,
criando tuplas até a posição final desta. Veja o exemplo:
lista1=[1,2,3]
lista2 = [9, 8, 7, 6, 5, 4]
lista_final = list(lista_meio)
print(lista_final)
O resultado do código é:
Não esqueça que cada elemento de uma das listas zipadas combinará exatamente com o elemento que tem a
mesma posição na outra lista. Ou seja, o elemento lista1[0] fará tupla com o elemento lista2[0], o elemento
lista1[1] fará tupla com o lista2[1], e assim por diante!
idades.sort()
nomes.append("Heitor")
nomes.sort()
matriculas = list(matriculas)
print(matriculas[2], matriculas[0])
matriculas.pop()
print(matriculas)
(não use o Python para resolver. Resolva aqui com sua mente!)
Caso você escreva um # antes da linha nomes.sort(), qual será a saída do programa?
(não use o Python para resolver. Resolva aqui com sua mente!)
Ambos são escritos mais ou menos do mesmo jeito (há algumas diferenças, claro). Vamos resumi-los:
Em muitos casos, é necessário fazer um laço for dentro de outro laço for externo, gerando, assim, repetições
(iterações) dentro de cada iteração principal. Programas mais complexos exigem esse tipo de construção.
Em outros casos, há a necessidade de colocar laços while secundários dentro de laços while mais amplos. O Céu
é o limite para o que pode ser feito com laços.
Sim, amigo leitor. Isso tudo será entendido como uma única lista, como se tivesse sido escrito em uma única
linha, porque se você abriu o [ da lista principal (logo após o sinal de =), o Python só ficará satisfeito quando
encontrar o fechamento para este colchete, esteja ele na mesma linha ou em linhas posteriores. O colchete que
fecha só é encontrado lá embaixo, depois de “Yasmin”]].
Imagine que você quer listar, linha a linha, cada participante de cada time (um nome por linha). Você pode escrever
inúmeros print(), um seguido do outro, e os dados serão escritos em linhas seguidas, um dado em cima do outro.
Mas para isso, já que temos vários nomes em uma lista e, cada lista destas dentro de uma lista maior, temos que
propor duas varreduras (uma para a lista principal e outra para as listas que estão dentro).
Para isso, criaremos um for principal para varrer a lista grupos e um for interno, para varrer (iterar) cada
elemento de cada lista que é elemento da lista grupos.
print("terminou o programa")
A explicação é simples:
[A] Quando o loop for principal inicia, ele vai varrer (iterar) cada elemento dentro da lista grupos, esse
elemento será chamado, a cada iteração, de grupo (variável interna desse laço for).
[B] Quando o segundo loop for inicia (a cada iteração do for superior), ele irá varrer os elementos da lista
grupo (que, a cada iteração do for superior, mudará, pois será um elemento diferente da lista grupos).
[C] A cada iteração do loop for interno, ele vai guardar o elemento na variável elemento e, então irá mostrá-
lo na tela (com a linha print(elemento), né?).
[D] Como cada print escreve seu argumento em uma linha separada, o resultado será esse:
Ana
Pedro
Luis
Carla
Eduarda
Raí
Bernardo
Gustavo
Yasmin
terminou o programa
Eu tenho um exemplo bom... uma tabuada (apesar de este exemplo também poder ser feito via for dentro de for).
Garanto, porém, que você encontrará muitos exemplos ao longo de sua vida de programador que vão exigir esse
print("TABUADA")
print(10 * "=")
while fator1 <= 5: # Aqui, o primeiro loop, que itera fator1 até 5
while fator2 <= 5: # Aqui, o segundo loop, que itera fator2 até 5
print(10 * "-")
print("Terminou o programa")
========== 2 x 3 = 6 4 x 2 = 8
TABUADA 2 x 4 = 8 4 x 3 = 12
========== 2 x 5 = 10 4 x 4 = 16
1 x 0 = 0 ---------- 4 x 5 = 20
1 x 1 = 1 3 x 0 = 0 ----------
1 x 2 = 2 3 x 1 = 3 5 x 0 = 0
1 x 3 = 3 3 x 2 = 6 5 x 1 = 5
1 x 4 = 4 3 x 3 = 9 5 x 2 = 10
1 x 5 = 5 3 x 4 = 12 5 x 3 = 15
---------- 3 x 5 = 15 5 x 4 = 20
2 x 0 = 0 ---------- 5 x 5 = 25
2 x 1 = 2 4 x 0 = 0 ----------
2 x 2 = 4 4 x 1 = 4 Terminou o programa
[B] O primeiro while vai repetir seu conteúdo enquanto a variável fator1 for menor ou igual a 5.
[E] O comando interno ao segundo while manda mostrar na tela, em uma linha separada, a expressão que
mostra fator1 e fator2 sendo multiplicados.
[F] A variável fator2 é atualizada em +1. O loop do segundo while retorna ao topo para ser executado mais
uma vez se a variável fator2 ainda for menor ou igual a 5. (retorne ao item [D]).
[G] Caso a variável fator2 chegue ao valor 6, o segundo while não será mais executado e o programa desce
para a próxima linha (próximo item).
[H] A variável fator1 é atualizada em +1. O loop do primeiro while retorna ao topo para ser executado mais
uma vez se a variável fator1 ainda for menor ou igual a 5. (retorne ao item [B]).
[I] Caso a variável fator1 chegue ao valor 6, o primeiro while não será mais executado e o programa desce
para a próxima linha (próximo item).
Estes são apenas dois pequenos exemplos de como os laços de repetição podem ser usados de forma aninhada
(nested), um dentro do outro. Invente a sua! Esta é uma técnica fantástica!
Escreva um programa que receba o nome de 20 alunos (que o usuário deve digitar) e os
organize em 5 grupos de 4 integrantes cada um. Cada grupo deve ser uma lista contendo os
nomes dos alunos. Os 5 grupos devem ser os elementos de uma lista principal.
Reescreva este mesmo programa de modo que os grupos possam ser formados por
quantidades diferentes de alunos e que não haja número definido de grupos.
texto = "Pernambuco"
lista=texto.split('m')
print(texto)
print(lista)
Neste código, eu solicitei que a variável lista guardasse a separação da variável texto exatamente no caractere
separador ‘m’. Isso significa que o texto ‘Pernambuco’ será separado em duas partes, ‘Perna’ e ‘buco’. O caractere
separador (o ‘m’) será destruído para separar as duas partes.
Olha o resultado do código acima, que mostra tanto a variável texto quanto a nova variável lista.
Pernambuco
['Perna', 'buco']
Entendi, João! Quer dizer que o método .split() cria uma lista
contendo os strings separados na string original, né? Isso não
muda a string original, só cria um novo objeto lista, certo?
Exatamente! Perfeito, caro leitor! Vale lembrar uma coisa: não é necessário definir qual é o caractere separador
do .split(). Ele pode ser usado com parênteses vazios: mas isso fará ele definir que o caractere separador é o
espaço entre as palavras.
Ou seja, se você usar .split() sem nada dentro dos parênteses, ele separará a string original palavra por palavra.
lista=texto.split()
print(lista)
Este é um minúsculo detalhe, mas saber dele pode poupar muitas horas de dor de cabeça enquanto você escreve
seu código: quando o caractere separador está no início ou no final da string, após a separação haverá um
caractere vazio no início ou no final da lista.
texto = "amarela"
texto2 = texto.split('a')
print(texto2)
Sim! Podemos usar caracteres de escape (\t, \n, \\ e qualquer outro) como caractere separador no .split().
lista = texto.split("\n")
print(texto)
print(lista)
Note que o .split(“\n”) usa o caractere \n (quebra de linha) como separador. Isso significa que a lista será criada
separando cada linha do texto como elementos da lista resultante. Vamos analisar o resultado de mostrar tanto
o texto quanto a lista separada:
['Subi num pé de manga', 'pra pegar abacaxi', 'como não era tempo de morango', 'roubaram
minha bicicleta.']
As primeiras quatro linhas pertencem ao texto original, em si. A última linha, como você pode ver, é uma lista
contendo 4 elementos: cada um deles é uma das linhas do texto original.
print(texto2)
Perceba uma coisa engraçada: o .join() é um método que deve ser usado no caractere “juntador”, não na lista. A
lista de strings é indicada como parâmetro do .join(), ou seja, dentro dos seus parênteses. Note que esse método
foi usado atrelado ao espaço (' '.join).para indicar que é o espaço que irá servir de “cola” para juntar os elementos
da lista texto. Ou seja, entre os trechos que serão juntados, haverá sempre um espaço em branco.
Claro que você pode usar qualquer caractere (ou conjunto de caracteres) para usar com “cola”. Vamos a outro
exemplo, agora usando uma vírgula.
csv1 = ','.join(alunos)
print(csv1)
Pedro,Ana,Mateus,João,Clara,Davi
É muito útil juntar várias strings em uma só, especialmente separando-as por vírgulas porque este é um jeito
muito comum de trocar informações entre programas: os arquivos CSV (Valores Separados por Vírgulas). Vamos
aprender, mais adiante, como abrir e salvar arquivos (especialmente de texto simples). O formato CSV é muito
útil para isso!
Por fim, podemos usar mais de um caractere (um conjunto deles) como “cola”... aqui, o mesmo programa anterior
com essa pequena alteração:
print(csv1)
Usei como “juntador” o trecho espaço, traço, espaço (' – ') e o resultado foi esse:
result = quote1.split("i")
print(result)
Caso, na segunda linha, o parâmetro “i” fosse trocada por “e”, qual seria a saída do programa?
Exatamente, amigo leitor! Método é uma função que se escreve após o nome de um objeto específico, separado
dele por um ponto. Muito bem!
O método .lower() é usado para transformar todas as letras de uma strings em minúsculas.
O método .title() coloca Cada Primeira Letra De Cada Palavra Da String Em Maiúsculas.
Lembre-se de uma coisa: métodos de string não alteram as strings em si. Esses métodos apenas criam novas
strings a partir do texto das strings originais!
Ou seja, se você tiver uma string chamada texto, o método texto.upper() não altera a variável texto em si, mas
pode usar o conteúdo dela, tornando-o todo maiúsculo, para criar outra variável do tipo string.
minus = texto.lower()
maius = texto.upper()
titul = texto.title()
print(minus)
print(maius)
print(titul)
print(texto)
Note que usamos os métodos .lower(), .upper() e .title() para criar as variáveis minus, maius e titul,
respectivamente, todas a partir da variável texto (que não foi alterada por nenhum dos métodos). O resultado
deste código pode ser visto aqui:
print(texto.find('o'))
A expressão texto.find(‘o’) vai indicar em que posição (índice) da string se encontra a primeira aparição de uma
letra o.O primeiro o está na posição 2 da string, por isso o resultado do programa é:
O método .find() também pode ser usado para encontrar um “conjunto” de caracteres, trazendo como resposta a
posição em que o primeiro caractere do conjunto está. Veja isso:
texto = "Leopoldina"
print(texto.find('di'))
Note que mandei o Python localizar o trecho ‘di’. A letra ‘d’ está na posição 6 da string texto, logo, a saída é:
Excelente pergunta, amigo leitor! Se você usar um .find() para localizar um trecho que não existe dentro da string,
o Python responderá com -1 (1 negativo). Faça o teste.
Lembrete: o método .find() retornará o índice da posição em que se encontra, APENAS, a 1ª ocorrência do trecho
que se pede para localizar. Se houver mais de um trecho igual na string, os demais nem são analisados.
Isso mesmo, meu amigo! Assim como a palavra find significa encontrar. Quem entende de inglês se dá bem no
Python, nós já mencionamos isso, né?
Veja o código a seguir, que pede para substituir as ocorrências de ‘in’ por ‘out’:
texto = "Leopoldina"
print(texto2)
Note uma coisa muito importante: o método .replace() não altera a string original (afinal, não é possível alterar
strings caractere a caractere, porque strings são listas imutáveis), mar serve para criar outra string a partir da
original, por isso tivemos que usar o .replace() para criar a variável texto2 no exemplo anterior.
Leopoldouta
texto = "Araraquara"
print(texto2)
Arerequere
Imagine um texto que é tirado de um banco de dados, um arquivo CSV (veremos isso mais adiante) ou uma
planilha, como o Microsoft Excel ou o Google Planilhas... Às vezes os dados são recebidos pelo Python, mas eles
não são “super limpos” (alguns possuem espaços ou outros caracteres no seu início e/ou no seu final).
O método .strip() remove todos os espaços iniciais e finais de uma string, gerando um resultado que deverá ser
colocado em outra variável.
texto2 = texto.strip()
print(texto2)
Veja que a string texto apresenta inúmeros espaços no início e no final. O resultado do .strip() é:
Tomás de Aquino
O método .strip() também pode ser usado para retirar outros caracteres (não apenas espaços) que estão no início
e/ou no fim da string, desde que você o indique dentro dos parênteses:
texto2 = texto.strip('#')
print(texto2)
Veja que a string texto tem vários # no início e no final. O resultado do .strip('#') é:
Tomás de Aquino
36.5. Exercitando
Escreva um código que substitua os três primeiros caracteres e os três últimos caracteres de
uma string por três espaços em cada... depois limpe a string resultante, retirando esses
espaços.
A gente importa módulos para dentro do nosso código quando precisa se referir aos objetos que estão dentro
desses módulos, sem precisar ter que criá-los do zero. O Python tem milhares de módulos disponíveis que você
pode usar “importando-os” para dentro do seu programa... vamos lembrar algumas maneiras de importá-los?
Neste caso, sempre que formos nos referir a um objeto (função ou variável) que está dentro do módulo que foi
importado, devemos sempre nos referir a ela como modulo.objeto(), como foi feito em random.randint().
Neste caso, apenas damos um apelido “mais curto” para a palavra random, para que a nossa digitação seja mais
rápida (só vamos precisar usar ra como prefixo das funções e variáveis).
Quando a gente importa apenas os objetos (não o módulo todo), os objetos são trazidos para “dentro” do código e
isso faz com que possam ser referenciados diretamente sem precisar de prefixos. Por isso foi possível se referir
à função randint() diretamente, sem precisar fazer random.randint().
- importar um objeto específico e dar-lhe um apelido, usando from modulo import objeto as apelido. Neste caso,
sempre que formos usar o objeto, nos referiremos a ele pelo apelido.
Tem diferença sim, amigo leitor! Às vezes, o módulo é muito grande (tem muitas funções) e, se você não vai usar
todas elas, não vale a pena importar o módulo todo! (seu programa vai ficar mais lento e sem necessidade!).
É preferível, portanto, que você importe somente os objetos (funções e/ou variáveis) que você vai efetivamente
usar em seu código!
A Função randint(a,b)
A função randint(a,b) escolhe um número inteiro (integer) aleatório entre os dois números limites apresentados
como argumentos (a e b), inclusive os próprios limites (perceba que diferente da função range(), a função
randint() foi construída para incluir o valor final na resposta).
print(numero)
Basta atribuir a uma variável a função randint apontada para os números-limite. O resultado deste código acima
pode ser 1, 2, 3, 4, 5 ou 6 (o Python é quem vai escolher “na sorte”).
A função choice(seq)
A função choice(seq) escolhe um elemento aleatório a partir de um objeto sequência (lista, tupla, iterável,
range() etc.). Basta atribuir a uma variável a função choice que esta variável vai guardar um dos itens, escolhido
pelo próprio Python.
from random import choice as esc # A função choice() se chama, agora, esc()
print(ganhador)
No código acima, [A] importei a função choice() apelidando-a de esc(); [B] defini o objeto alunos como uma lista
de strings; [C] defini que a variável ganhador vai guardar UM DOS NOMES, escolhidos pela função esc(), que
pertencem à lista alunos; [D] mandei mostrar o ganhador.
O resultado será um desses: Pedro, Ana, Mateus, João, Clara ou Davi. (o Python escolherá)
A função sample()
A função sample() é usada para gerar uma amostra (um grupo de dados) aleatória a partir de uma população
(um grupo de dados maior, uma sequência, como um range, uma lista, uma tupla ou uma string) sem repetir
elementos nesta amostra.
A forma de escrita da função sample() é sample(população, quantidade), onde quantidade informa quantos
elementos terá a amostra aleatória desejada. Veja este código:
pop = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196]
print(amostra)
A função sample pode ser usada em qualquer tipo de objeto sequência, como range, lista, tupla ou string... o seu
resultado (seu retorno) sempre será uma lista!
Quando a função sample() é usada apontando para uma string, os elementos que ela seleciona são os caracteres
daquela string.
print(amostra)
É difícil dizer qual resultado este programa irá dar... porque a sample() seleciona aleatoriamente... mas aqui,
quando o rodei, deu isso aqui:
Um erro bem simples que pode ocorrer quando usamos a função sample() é solicitar um número maior de itens
na amostra que a quantidade de elementos da população original.
print(amostra)
Crie um programa que receba do usuário vários nomes seguidos e, depois de terminar de
inserir todos, o programa escolha um dos nomes aleatoriamente. Sim, é um programa para
fazer um sorteio entre os diversos nomes inseridos anteriormente.
Modifique, depois, o programa para que ele escolha, dentre todos os alunos inscritos, um
grupo contendo 4 indivíduos para serem os representantes da sala.
a = 0.10
b = 0.35
print(c)
Você pode achar que o resultado vai ser um simples 0.45, porque a soma entre 0.10 e 0.35 é bem simples de fazer
e não teria por que dar outro resultado, mas você se surpreender! O resultado deste programa é, por mais incrível
que pareça, este aqui:
0.44999999999999996
Esses erros se devem à forma como o Python representa, em binário, os números de ponto flutuante. Ou seja, o
problema está na forma como os números float são armazenados na memória pelo Python (esses erros também
são cometidos em outras linguagens de programação).
A função Decimal(string) deve ser usada em uma string que possa ser convertida em um número float exato,
que apresenta o mesmo número de casas decimais existentes na string.
from decimal import Decimal as dec # A função Decimal agora se chama dec()
c = a + b
print(c)
0.45
Não esqueça de uma coisa: o argumento da função Decimal() tem que ser, necessariamente, uma string!
Escreva um programa que receba dois dados do usuário (números float) e realize a soma
entre eles dois, retornando um número com apenas 2 casas decimais, não importando
quantas casas decimais o usuário tenha digitado originalmente.
No dicionário, a chave atua como índice (serve para indicar uma posição dentro do dicionário) e o valor é o dado
guardado naquela posição. No dicionário, cada dupla chave:valor é escrita exatamente assim, separados por um
sinal de : (dois-pontos).
Para delimitar os dados de um dicionário, usamos { } (chaves) e os separamos por vírgulas. Eis um exemplo:
A primeira entrada tem chave no formato string (‘Nome’) e valor também em string (‘João’). A segunda entrada
tem chave em formato string (‘Idade’) e valor em formato integer (50). A terceira tem os mesmos tipos de dados
da segunda. As três últimas entradas do dicionário possuem chaves em formato integer e valores em formato
float.
Os valores, sim, podem assumir qualquer tipo de dados, inclusive listas, tuplas e até mesmo outros dicionários
(sim, dicionários dentro de dicionários). Mas as chaves não! As chaves só podem ser strings, números ou tuplas:
as chaves não podem conter listas ou dicionários.
Se você tentar rodar um código em que cria um dicionário contendo uma chave do tipo lista (que é inválida), como
o código a seguir, em que a lista [1,2,3] é a chave da primeira entrada...
print(dic)
Depois do comando dic[2]= "avó", o dicionário dic passou a ter 4 entradas. Ao printá-lo, fica assim:
print(dic)
Ei, João, eu percebi que as duas novas entradas que você adicionou pelo
uptade() tinham chaves diferentes das já existentes no dicionário. O
que acontecerá se você usar chaves que já existem lá dentro?
A entrada que possui aquela chave irá ser substituída pela entrada nova, ou seja, o valor dela será modificado.
print(dic)
print(alunos_notas)
No código acima, foram criadas duas listas com 4 elementos cada. Note, na terceira linha do código, que estamos
criando um dicionário chamado alunos_notas (é um dicionário porque sua expressão lógica está envolvida por
chaves { }, percebeu?).
Pois bem, ao começar a expressão com chave:valor, estou informando que o conteúdo deste dicionário estará
neste formato. Ao continuar com for chave, valor in, eu determino de onde ele puxará os dados chave e valor
para preencher as entradas do dicionário. Por fim, ao indicar zip(nomes, notas), eu determino que as duas listas
criadas anteriormente serão “fundidas” em um objeto ZIP e este objeto juntará o dado [0] de uma lista com o dado
[0] da outra, o dado [1] com dado [1] e assim por diante...
A leitura desta linha de código é mais ou menos assim: “crie um dicionário chamado alunos_notas que tenha os
elementos chave:valor trazidos do objeto ZIP criado da junção das listas nomes e notas”. O resultado é um
dicionário assim:
print(familia["pai"])
O código acima irá imprimir apenas o valor 59, que é o valor associado à chave “pai” do dicionário familia.
Mas, se solicitarmos uma chave que não existe no dicionário? Se, em alguma parte do nosso código, for solicitada
a um dicionário uma chave que não está lá?
print(familia["tio"])
KeyError: 'tio'
Para evitar que o programa pare por algum erro deste tipo (que pode acontecer especialmente se você deixar
que o usuário escolha qual chave pesquisar), você pode usar o método .get(). Ele pode ser escrito na forma de
dicionário.get(chave_desejada) e tem várias vantagens em relação ao formado dicionário[chave_desejada].
Ao usar o método .get(), em primeiro lugar, não será apresentado nenhum erro caso a chave desejada não exista.
Aliás, é possível até informar qual mensagem o usuário receberá, sem que, com isso, o programa pare.
print(saida1)
print(saida2)
No código acima, a linha que pede o .get(“mãe”) vai colocar o número 60 na variável saida1, porque 60 é o valor
associado à chave “mãe” do dicionário familia. Porém, na linha em que o .get() pede “tio”, o retorno será “Não
encontrado”, porque esta foi a string que colocamos no segundo argumento da .get() – este segundo argumento
é justamente a mensagem que é dada ao usuário caso haja erro em achar a chave desejada (no caso, “tio”).
60
Não encontrado
Use o método .pop(). Ele é utilizado assim: dicionário.pop(chave_desejada). O método .pop() assim como o
método .get(), pode receber um segundo argumento que é justamente a mensagem que o usuário receberá caso
a chave_desejada não seja encontrada no dicionário.
print(saida2)
print(familia)
O método .pop() não só apaga uma chave... ele também retorna o valor associado à chave_desejada, por isso o
programa trará, como resultado:
60
não encontrado
Note que o programa retornou o 60 (valor associado à chave “mãe”) e a apagou. Podemos ver isso no dicionário
impresso na tela: ele não tem mais a chave “mãe”.
Ahá! Excelente pergunta, amigo leitor! Estava esperando que você a fizesse!
O objeto criado pelo método .keys() pode ser usado como iterável em um laço for, o que permite construir um
código como esse:
avô
avó
pai
mãe
irmão
Há um outro jeito de conhecer todas as chaves de um dicionário sem precisar usar laço for.
fam2 = list(fam) # Aqui, criei uma lista fam2 convertendo a partir de fam
O resultado do código é, simplesmente, uma lista contendo apensa as chaves vindas do dicionário fam.
Legal, né?
89
86
59
60
32
Ei, João, tem algum método para listar diretamente chave e valor,
juntos, como uma tupla, uma lista de listas, ou coisa parecida, sem
ter que fazer chave e valor separados? Vai, diz que tem... por favor...
[('avô', 89), ('avó', 86), ('pai', 59), ('mãe', 60), ('irmão', 32)]
Não, caro leitor, não se preocupe! É verdade que sempre há mais coisa para se estudar... nunca se conhece 100%
acerca de qualquer assunto, mas o que vimos até agora dá para começarmos bem a trabalhar com dicionários
no Python! Bons estudos! Boas Codificações!
(até o programa que eu pedi neste exercício é grande... eu sei! Você já consegue trabalhar com códigos mais
pesados... você verá!)
Programas (aplicativos) guardam suas informações em arquivos (é isso que você faz quando salva, por exemplo).
Um programa feito em Python pode permitir que você salve e abra arquivos contendo dados que podem ser
manipulados pelo programa.
Um arquivo, portanto, é uma informação que foi salva em uma memória permanente (disco, pendrive, cartão de
memória) e lá se mantém gravado mesmo quando o computador é desligado.
print(texto)
A gente começa estabelecendo a conexão com o arquivo usando with open(‘mensagem.txt’) as msg:, e todos os
comandos dentro deste bloco estarão vinculados a esta conexão. O objeto msg é o apelido para esta conexão com
o arquivo mensagem.txt.
O único comando que colocamos no bloco foi texto = msg.read(), que lê o conteúdo do objeto msg (por causa do
método .read()) e o coloca dentro da variável texto.
Perceba que os caracteres especiais (letras com acentos, como é e ã) não foram vem interpretados pelo Python
e causaram os “defeitos” em pé (que deveria ser pé) e não (que deveria ser não). Isso é fácil de resolver.
Programação em Python – www.professorjoaoantonio.com.br - @ProfessorJoaoAntonio Página 145
Basta usar o argumento encoding=”utf-8” na função open(), como mostrado no código a seguir. UTF-8 é uma
codificação de caracteres que representa todos os caracteres de várias linguagens do mundo, inclusive o
português, de modo a representar corretamente as nossas letras acentuadas. UTF-8 é a codificação mais aceita
mundialmente na Internet.
texto = msg.read()
print(texto)
Mas, e se você precisar colocar cada linha de um arquivo de texto em uma variável separada? Se for necessário
ler o arquivo não como uma coisa só, mas separando o seu conteúdo linha por linha? O método ideal para fazer
isso é o método .readlines().
O método .readlines() retorna um iterável que pode ser usado em um laço for, conforme o exemplo abaixo:
for linha in msg.readlines(): # O laço for criará uma variável linha na iteração
O resultado deste código é uma lista contendo cada linha do arquivo mensagem.txt como sendo um elemento
separado na lista. Veja:
['Subi num pé de manga\n', 'pra tirar abacaxi,\n', 'Como não era tempo de morango,\n',
'roubaram minha bicicleta\n']
Sim, caro leitor! Muito boa a sua ideia. Ao juntar tudo o que aprendemos, você pode fazer programas muito mais
bonitos e com resultados mais agradáveis! O CÉU é o limite! Não deixe de revisitar todos os conhecimentos que
você ganhou enquanto estuda este material!
Uma coisa muito interessante que o método .readline() faz é que a cada vez que ele é usado, ele lê a próxima
linha do arquivo, ou seja: se você o usa apenas uma vez, ele lê a primeira linha do arquivo; se você o usa uma
segunda vez, agora ele vai ler a segunda linha do arquivo; quando você o utiliza uma 3ª vez, ele vai ler a 3ª linha
do arquivo, e assim por diante.
print(segunda)
print(primeira)
print(terceira)
Não é impressão, caro leitor! Você está certo! Isso ocorreu porque [A] cada linha extraída do arquivo original tem
um caractere \n no final (ele cria uma “nova linha”) e [B] cada linha foi colocada na tela por uma função print()
diferente, e cada função print() é escrita em uma nova linha separada... juntando essas duas “instruções” que
mandam descer uma linha, deu nisso!
Dá para corrigir isso de duas maneiras: ou você usa print(segunda, primeira, terceira), como argumentos de
uma única função print() – desta forma, somente os caracteres \n gerarão novas linhas; ou você limpa os
caracteres \n usando o método .strip() antes de mandar printar separadamente.
O que diferencia os dois é o parâmetro extra que deve ser passado na função open():
- Se o parâmetro ‘w’ for passado, você quer reescrever o arquivo todo, apagando completamente o conteúdo
anterior e substituindo-o pelo conteúdo que você está escrevendo agora.
- Se o parâmetro ‘a’ for passado (‘a’ de ‘append’), você quer adicionar ao conteúdo já existente no arquivo aquele
trecho de string que você manda escrever, fazendo, apenas, o arquivo “crescer” com o seu novo conteúdo.
Senhor meu, Jesus Cristo, Deus e homem verdadeiro, Criador e Redentor meu!
Por serdes vós quem sois, sumamente bom e digno de ser amado sobre todas as coisas;
e porque vos amo e estimo, pesa-me, Senhor, de todo o meu coração por vos ter ofendido.
E espero alcançar o perdão das minhas culpas, pela vossa infinita misericórdia.
Amém.
Observe o código que seria usado para substituir o conteúdo inteiro deste arquivo:
Sempre escrevemos no arquivo o conteúdo desejado com o método .write(), dentro do bloco open() que recebeu
'w' ou 'a'. Neste caso, como o ‘w’ foi usado, é correto afirmar que aquele arquivo contricao.txt terá seu antigo
conteúdo inteiro substituído por, apenas, o que está no argumento do método .write(). O arquivo contrição ficará,
portanto, assim:
Se, porém, você usar o argumento ‘a’ na função open(), o conteúdo que você escrever no arquivo será “anexado”
ao que já havia, ou seja, será apenas adicionado (nenhum conteúdo anterior no arquivo será apagado). Observe
este código:
O parâmetro da função open() agora é 'a'. O conteúdo presente no método .write() será adicionado ao arquivo
contricao.txt, deixando ele assim:
Estranho, né? “ContriçãoMeu” ficou tudo junto... isso é porque, ao adicionar conteúdo, ele fica exatamente depois
do último caractere do texto já existente no arquivo. Imagina um jeito de corrigir isso, amigo leitor?
Sim, se você quiser colocar o texto novo na linha abaixo do conteúdo original. Mas você pode colocar também um
simples ‘ ‘ (espaço) ou um \t (tabulação) para separar o conteúdo antigo do novo na mesma linha de texto.
Tá vendo? Tem muita opção para você corrigir o resultado do seu programa. Bora tentar?
Não, ele não é obrigatório para trabalhar com arquivos. Podemos abrir e fechar arquivos sem precisar do laço
with. Veja um exemplo de código que abre uma conexão com um arquivo, escreve adicionando dados a ele e fecha
a conexão em seguida:
Sempre que abrimos uma conexão com um arquivo (a primeira linha chama essa conexão de objeto, uma variável,
um apelido), usando a função open(), somos obrigados a fechar a conexão quando terminarmos de usá-la: isso é
feito na última linha, com o método .close(). Entre o open() e o close() podemos escrever inúmeros comandos de
manipulação do arquivo!
O with, porém, cria um laço, um bloco de comandos, em um contexto próprio, como se criasse um “mini ambiente”
só para aquele propósito (a manipulação do arquivo que foi aberto pelo open()). Quando o programa sai do laço
with, ele já fecha o arquivo automaticamente, sem precisar do .close(). Usar o with, portanto, é mais seguro, mais
garantido.
Resumindo: não é obrigatório usar o with para manipular arquivos, mas é recomendável!
Escreva um programa que receba Nome, Idade e E-mail de um número incerto de usuários e,
depois, os grave de uma vez num arquivo de texto. Cada registro de usuário deve estar em
uma linha diferente do arquivo com o seguinte formato: Nome; Idade; Email (separados por
ponto-e-vírgula)
(esse é caprichado, ein? Note: a gravação do arquivo deve ser feita somente se o usuário pedir, no final de todo o
processo de preenchimento dos dados... não vá atualizando o arquivo à medida que novos registros são
adicionados, não!)
Num arquivo CSV, a primeira linha descreve o cabeçalho do arquivo, indicando quais são os tipos de dados que
estão armazenados nele. Veja um exemplo de arquivo deste tipo chamado clientes.csv:
Nome,Idade,Email
Joao Gomes,48,[email protected]
Ana Senna,49,[email protected]
Pedro Carvalho,21,[email protected]
Mateus Crêspo,17,[email protected]
Perceba que a primeira linha do arquivo apenas indica quais são os significados dos dados que estão organizados
nele (chamamos esses significados de “campos” ou “colunas”) – portanto, a primeira linha deve conter os “nomes
dos campos”, ou “rótulos dos campos”. Cada linha, a partir da segunda, é o que chamamos de “registro”, um
conjunto único de dados em todos os campos.
Não esqueça: um arquivo do tipo CSV é um arquivo de texto simples! Ele pode ser completamente digitado em
um editor de textos simples, como o Bloco de Notas do Windows. Sua principal característica é a organização
dos dados em seu conteúdo. O arquivo CSV “impõe” uma certa estrutura para os dados contidos nele.
O arquivo CSV mostrado no exemplo acima seria o equivalente a uma tabela assim:
O Python consegue ler um arquivo CSV e interpretá-lo como uma tabela, permitindo diversas operações com
seus dados que não são possíveis em um arquivo de texto comum.
import csv
ou
A primeira que vamos usar é a função DictReader(), assim mesmo, com “D” e “R” maiúsculas.
# Na linha acima, criei a conexão clientes, que aponta para o arquivo clientes.csv
print(lista)
Quando usamos a função DictReader(), o Python lê o arquivo CSV e cria um objeto especial (de um tipo especial
chamado DictReader), que é, na verdade, uma coleção de dicionários. Cada registro (linha) do arquivo CSV virará
um dicionário (a primeira linha não é considerada um registro, mas traz os nomes dos campos) e este “conjunto
de dicionários” pode ser convertido em uma lista, por exemplo, como no caso da penúltima linha do código acima.
Veja que se trata de uma lista que contém 4 elementos (4 dicionários). Cada dicionário é composto por 3 entradas
(chave:valor) e as chaves dessas entradas são, justamente, os rótulos dos campos (‘Nome’, ‘Idade’ e ‘Email’).
Para enxergar melhor esta lista de dicionários, vou apresentar de um jeito “mais bonitinho”:
Viu? É uma única lista contendo 4 dicionários (agora, todos coloridos para identificarmos mais facilmente).
Também podemos usar o laço for para ler linha a linha do objeto DictReader e poder manipulá-las. Por exemplo,
se eu quiser fazer apenas uma listagem contendo os E-mails dos usuários deste CSV, posso fazer assim:
for r in listagem: # Laço for vai iterar cada linha do objeto listagem
Todas as vezes que usamos r[“Email”], estamos pedindo o valor associado à chave “Email” dentro do objeto r. Já
r, por sua vez, é a variável que está iterando no laço for. A variável r contém apenas uma linha do objeto listagem.
['[email protected]','[email protected]','[email protected]','[email protected]']
Ufa, que bom! Pensei que você não iria perguntar! O argumento newline='' serve para evitar que o Python confunda
as quebras de linha (\n) presentes em nossos dados com a quebra de linha que finaliza cada linha do arquivo
CSV. É claro que isso é uma precaução e só terá sentido, mesmo, se um dos nossos dados contiver o caractere
de escape \n. (o que não é o caso no arquivo usado nos exemplos até aqui).
Nome;Endereco;Fone
[C] Existem quebras de linha (\n) dentro dos endereços também (provavelmente erro de importação/criação
do arquivo CSV, mas existem). Ahhh, você vai enfrentar muito disso durante a sua vida de programador.
O erro presente na letra [C] a gente corrige (evita problemas) com o argumento newline='' dentro da função
open(), que eu já mencionei antes. Note que depois do newline=, tem que ter dois apóstrofos seguidos (abrir e
fechar apóstrofo, um logo seguido do outro).
O problema da letra [A] pode ser resolvido facilmente, por meio do argumento delimiter=';' dentro da função
DictReader(). O argumento delimiter te permite indicar qual é o caractere separador do CSV.
for r in listagem:
O resultado deste código irá gerar várias linhas, uma com cada um dos endereços do CSV original. Assim:
Podemos usar, claro, antes de imprimir esses valores, o método .replace() na string de cada endereço para
substituir o \n por uma vírgula, por exemplo (admita, ficou feito desse jeito).
[A] Na primeira linha, importei o módulo csv usando apenas o import, ou seja, sempre que eu for me referir
a funções ou variáveis existes lá, deverei usar “csv.” como prefixo;
[B] Perceba que usuarios é uma lista de dicionários. É esse formato de dados que usamos para escrever em
um arquivo CSV.
[D] Criamos uma lista chamada campos, contendo os rótulos dos campos, indicados a partir das chaves das
entradas dos dicionários existentes lá na lista usuarios.
[E] Usamos a função DictWriter() para criar um objeto chamado escrever_saida. A função DictWriter() pede
dois argumentos: [1] o nome da conexão com o arquivo CSV (no caso “saida_usuarios”) e [2] os rótulos
dos campos, por meio da expressão fieldnames=campos.
[F] O método .writeheader() escreve UMA ÚNICA VEZ, o cabeçalho (header) do arquivo CSV. Já se sabe qual
é o cabeçalho porque a gente o indicou na cláusula fieldnames=campos.
Não esqueça: se nós usamos as classes DictReader() e DictWriter(), estamos convertendo os dados de um CSV
em dicionários e vice-versa! Portanto, o método .writerow(item) requer que o parâmetro item seja um dicionário.
Nome,Login,Admin
Joao,joaog,True
Ana,anac,False
Pedro,Pedroa,False
Mateus,mateush,True
Tem sim, meu caro amigo! Não é obrigatório trabalharmos com dicionários, não!
from csv import reader as rd # Importei reader do módulo csv com o apelido rd
print(usuarios)
Note que eu pedi para ler a conexão users com a função rd() (que é csv.reader()) e já transformei seu resultado
em formato lista (com a função list()), armazenando dentro da variável usuarios. Esse objeto (usuarios), que
sempre foi uma lista (lá em cima foi declarada vazia), passou a ter o conteúdo resultante do csv.reader().
[['Nome', 'Login', 'Admin'], [], ['Joao', 'joaog', 'True'], [], ['Ana', 'anac', 'False'],
[], ['Pedro', 'Pedroa', 'False'], [], ['Mateus', 'mateush', 'True'], []]
Perceba a presença de alguns [ ] (listas vazias) depois de cada linha do arquivo CSV. Essas listas vazias são os
\n (quebras de linha) ao fim de cada linha do arquivo CSV. (convertendo para dicionário, não dá esse problema,
mas convertendo para lista, ele acontece).
Você pode corrigir isso com um código que faz o append() deste item a uma segunda lista somente se este item
for diferente de [ ]. É uma sugestão, apenas:
usuarios = []
usuarios2 = []
usuarios = list(rd(users))
print(usuarios2)
O resultado deste código é uma lista de listas sem os itens [ ] do resultado anterior.
Agora, para escrever em um arquivo CSV, podemos usar a função writerows() em vez da função DictWriter(), se
o objeto original for uma lista de listas.
escritor = wt(arquivo)
escritor.writerows(usuarios)
No código acima, a lista usuarios é uma lista de listas (cada elemento da lista usuarios é uma lista com três
elementos). Abrimos a conexão com o arquivo users.csv com o parâmetro 'w', para poder escrever nele (gravar
dados nele). Usamos a cláusula newline='' para evitar que ele crie linhas em branco adicionais e usamos o
encoding='utf-8' para que ele possa entender caracteres acentuados. Chamamos esta conexão de arquivo.
Criamos um objeto chamado escritor que aplicará o ato de escrever (apelido wt da função writer()) à conexão
arquivo. Depois, usamos o método .writerrows() no objeto escritor, tendo como dados o que está na lista
usuarios.
O método .writerows() escreve todas as linhas de um arquivo CSV de uma só vez, a partir de uma lista de listas
ou de uma lista de tuplas. Cada elemento da lista principal será uma linha do arquivo CSV, cada elemento das
listas/tuplas internas será um dado em uma coluna do CSV.
Nome,Login,Admin
Liborio,libcat,True
Amora,amoradog,False
Rogerio,rogerduck,False
Inacio,luissnake,True
É bem mais fácil trabalhar com listas de listas (ou listas de tuplas) do que com dicionários, não é mesmo? Os
arquivos CSV nos dão esta facilidade: usar listas ao invés de dicionários.
João, eu percebi que posso abrir uma conexão para ler um arquivo CSV e
para escrever (com o ‘w’) em um arquivo CSV. Mas eu posso usar a opção ‘a’
para alterar um arquivo CSV sem ter que reescrevê-lo totalmente?!
Excelente pergunta, amigo leitor! Ela tem exatamente “duas formas de resposta”... Presta atenção...
Vamos imaginar que você queira alterar o nome de um usuário dentro do arquivo CSV. Por exemplo, lá em cima,
no arquivo usado como exemplo, se eu desejar alterar o nome do usuário de ‘Joao’ para ‘João Antonio’... eu consigo
fazer isso diretamente? Não. Não consigo.
Os arquivos CSV são sequenciais: eles devem ser gravados em uma única sequência, byte por byte, letra por
letra... não dá para alterar o arquivo CSV diretamente lá dentro e “só trocar aquele específico dado no meio dele”,
usando a opção ‘a’... (na verdade, a opção ‘a’ ela apenas permite append, ou seja, adicionar dados no final do
arquivo, seja ele de texto normal ou texto CSV).
A solução é bem “chata”: [A] Você tem que abrir o arquivo CSV, trazendo seus dados para dentro do código Python
(como lista de dicionários ou lista de listas/tuplas – você decide); [B] Você faz a alteração no dado desejado dentro
do seu programa; [C] Você escreve a lista dentro do arquivo novamente, usando o open() com a opção 'w' (isso
reescreverá a lista inteira dentro do arquivo, substituindo o conteúdo anterior do CSV pelo atual).
Ou seja, qualquer pequena alteração no conteúdo de um arquivo, no meio dele, exige que abramos o arquivo,
modifiquemos o dado desejado e depois reescrevamos completamente o arquivo.
Porém, é possível alterar apenas uma parte do arquivo sem reescrever ele todo: se esta alteração for uma
inclusão de dados no final do arquivo. Para isso, usamos a opção 'a' dentro da função open().
Não dá para alterar dados no meio do arquivo CSV, só dá para adicionar uma nova linha no final do arquivo.
Você sempre terá que importar o módulo csv ou, pelo menos, alguma função deste módulo!
DictReader() para criar um objeto do tipo DictReader que poderá ser convertido em uma lista de dicionários.
Esta função lê o arquivo CSV e traz seus dados para dentro do programa. O objeto do tipo DictReader tem que ser
convertido em uma lista com a função list().
DictWriter() para criar um objeto do tipo DictWriter, que poderá ler uma lista de dicionários e converter cada
elemento desta lista em uma linha do arquivo CSV. Esta função escreve no arquivo CSV. Em objetos deste tipo,
podemos usar três métodos:
- .writeheader() para escrever o cabeçalho do arquivo CSV (os rótulos dos campos, que ficam na primeira
linha do arquivo) a partir dos nomes das chaves presentes nos dicionários dentro da lista principal. O
parâmetro deste método é um iterável (lista ou tupla).
- .writerow() para escrever cada registro (linha de dados) do arquivo CSV, a partir dos valores que estão
presentes nos dicionários dentro da lista principal. (precisará de um laço for para iterar a lista principal
à procura de cada dicionário, em cada elemento da lista). O parâmetro deste método tem que ser um
dicionário.
- .writerows() para escrever todos os registros (linhas de dados) de uma vez só no arquivo CSV, a partir
dos valores que estão presentes nos dicionários dentro da lista principal (não preciso iterar nada!). O
parâmetro deste método tem que ser uma lista de dicionários.
Todos os três métodos mostrados acima devem ser usados em um objeto do tipo DictWriter, criado pela função
DictWriter(). Ou seja, esses métodos devem ser usados em objeto.writeheader(), por exemplo, somente se o
objeto foi criado pela DictWriter().
reader() para criar um objeto do tipo _csv.reader que poderá ser transformado em uma lista de listas ou em uma
lista de tuplas. Esta função lê o arquivo CSV e traz seus dados para dentro do programa. O objeto do tipo -
csv.reader tem que ser convertido em uma lista com a função list().
writer() para criar um objeto do tipo _csv.writer, que poderá ler uma lista de listas/tupas e converter cada
elemento desta lista em uma linha do arquivo CSV. Esta função escreve no arquivo CSV. Em objetos deste tipo,
podemos usar dois métodos:
- .writerow() para escrever cada registro (linha de dados) do arquivo CSV, a partir dos valores que estão
presentes nos iteráveis internos (listas ou tuplas) dentro da lista principal. (precisará de um laço for para
iterar a lista principal à procura de cada lista/tupla interna, em cada elemento da lista). O parâmetro deste
método tem que ser uma lista ou tupla
- .writerows() para escrever todos os registros (linhas de dados) de uma vez só no arquivo CSV, a partir
dos elementos que estão presentes nas listas/tuplas dentro da lista principal (não preciso iterar nada!). O
parâmetro deste método tem que ser uma lista de lista/tuplas.
Para inserir novos dados (novas linhas) no final de um arquivo CSV, basta usar a função open() contendo a opção
'a' (de “append”, ou “adicionar”) – para este procedimento, não é necessário abrir o arquivo para reescrevê-lo por
completo. Para alterar um dado qualquer no meio do conteúdo de um arquivo CSV, a gente precisa abri-lo (com
o open()), modificar o dado dentro do código (dentro da lista que tá lá dentro); e, depois, escrever a lista modificada
no arquivo, usando a opção 'w' na função open().
Em resumo, ou a gente adiciona novos dados no final do arquivo, ou a gente tem que ler, alterar dentro do código
e reescrever o arquivo todo de uma vez.
Crie um programa que apresente a seguinte tela inicial: Um menu contendo “Cadastrar
Usuário”, “Salvar Usuários”, “Listar Usuários”, “Mostrar Dados do Usuário”, “Apagar Usuário” e
“Fechar”.
Os dados a serem armazenados sobre cada usuário são: Nome, Idade, Telefone e E-mail (pode
guardar todos em string). A opção Salvar Usuários vai escrever a lista deles em um arquivo
CSV. A opção Listar Usuários vai mostrar na tela a listagem de todos eles, de forma
TABULADA (como uma tabela). A opção “Mostrar Usuário” vai apresentar na tela apenas O
USUÁRIO escolhido (pesquisado) por você de forma TABULADA também (organizada como
uma tabela).
A opção Apagar Usuário vai pesquisar um nome de usuário e dizer se ele existe ou não,
depois, vai pedir, caso ele exista, para confirmar o apagamento. Depois de confirmar que quer
apagar, o usuário será retirado do arquivo CSV (você reescreverá o arquivo CSV sem este
usuário).
O programa só para de rodar se o usuário escolher a opção Fechar.
JSON é um formato de arquivo para trocar dados, assim como o CSV, e é muito popular na Internet. Os arquivos
JSON também são textos simples, podendo ser abertos e modificados diretamente em qualquer editor de textos,
como o Bloco de Notas do Windows.
Como nós já vimos muito rapidamente em uma lição anterior, o JSON tem um formato muito similar aos
dicionários do Python, o que torna esta estrutura de dados ideal para trabalhar com esse formato de arquivo.
Aqui embaixo, um pequeno exemplo de um arquivo JSON simples, o arquivo notafiscal.json:
"comprador": "liboriocat",
"quantidade": "6",
Vamos usar este arquivo para dar exemplo de como ler um arquivo JSON, trazendo seus dados para o nosso
código.
Veja só... sem frescura... sem conversões... apenas usei a função load() do módulo json para criar um dicionário
chamado dicionario – depois, é só usar ele diretamente no código. O resultado do código acima será:
dados = {'Aluno': 'João', 'Turma': '9º A', 'Nota1': '10.0', 'Nota2': '8.4'}
with open('output.json', 'w') as json_escrita: # Abri conexão com ‘w’ para escrever
Por fim, usamos a função dump() para escrever o conteúdo do dicionário dados na conexão json_escrita.
Além disso, tenho que adicionar o parâmetro ensure_ascii=False na função dump(), como se vê no exemplo
abaixo:
Isso gerará o arquivo JSON com os verdadeiros caracteres especiais que constam em nosso código.
[ {"id":1,"nome":"João","idade":25,"cidade":"São Paulo"},
{"id":2,"nome":"Maria","idade":30,"cidade":"Rio de Janeiro"},
{"id":3,"nome":"Carlos","idade":22,"cidade":"Belo Horizonte"} ]
Este arquivo se chama multiplo.json e vamos usá-lo daqui pra frente. Percebeu com o que se parece este
conteúdo?
Exatamente, caro leitor! Um arquivo JSON pode ter vários registros, sendo cada um deles um dicionário (as
chaves abrindo e fechando determinam isso) dentro de uma grande lista (os colchetes no início e no final do
arquivo definem isso).
Podemos tratar os arquivos JSON que têm vários registros do mesmo jeito como tratamos os arquivos JSON
simples: usando as funções load() e dump(). Eles conseguem entender os dois tipos de arquivos JSON e já
conseguem construir/ler os objetos internos a partir deles.
print(lista)
[{'id': 1, 'nome': 'João', 'idade': 25, 'cidade': 'São Paulo'}, {'id': 2, 'nome':
'Maria', 'idade': 30, 'cidade': 'Rio de Janeiro'}, {'id': 3, 'nome': 'Carlos', 'idade':
22, 'cidade': 'Belo Horizonte'}]
Em vez de usar print(lista), eu posso pedir para printar apenas um dos itens da lista, como, por exemplo:
print(lista[1]['idade'])
Essa linha vai imprimir (na tela) o valor associado à chave idade que está no elemento 1 da lista principal. Ou
seja, a idade da usuária Maria. O resultado será, portanto,
30
Para escrever em arquivos JSON de vários registros, usamos a mesma função dump(), com a diferença de que
usaremos a partir de uma lista de dicionários, em vez de usá-la a partir de um único dicionário.
import json
json.dump(dados,json_escrito,ensure_ascii=False)
Porém, não podemos usar a opção 'a' com arquivos JSON de múltiplos registros. A razão é simples: sempre que
usamos a função open() com a opção , o conteúdo que estamos colocando será incluído no final do arquivo, depois
do último caractere que já estiver lá.
Ora, o último caractere de um arquivo JSON com múltiplos registros é ] (fechamento de colchetes). Escrever
qualquer coisa depois dele torna o arquivo JSON corrompido, mal escrito, com formato errado.
A única forma que temos, portanto, de adicionar dados no final de um arquivo JSON múltiplo ou modificar qualquer
dado lá existente é: [A] ler o conteúdo do arquivo para dentro de uma lista de dicionários no código; [B] realizar
as alterações desejadas no conteúdo desta lista no nosso código; [C] realizar o .dump() desta lista para dentro do
arquivo, substituindo seu conteúdo.
Agora me bateu uma preocupação... se o arquivo JSON for muito grande? (tipo: se ele tiver
uns 2000 registros)... vai precisar ele ser aberto inteiro, mesmo que eu só queira adicionar
ou modificar um deles? Isso seria um baita desperdício de tempo e memória, não?
Exato, amigo leitor! Se um arquivo JSON for muito grande, leva muito tempo para abri-lo e para escrevê-lo. Isso
é particularmente “indesejável” se a quantidade de alterações / inclusões for pequena... Seria realmente bem
estranho abrir um arquivo com mais de duas mil linhas só para alterar uma pequena letra.
A solução para isso foi pensada pelo mesmo pessoal que criou o formato JSON: é o formato JSONL (JSON Lines,
ou, traduzindo, JSON Linhas). Este formato de armazenamento de dados é mais “versátil” que o formato JSON
original, especialmente para múltiplos registros.
{"id":1,"nome":"Alice","idade":25}
{"id":2,"nome":"Bob","idade":30}
{"id":3,"nome":"Carol","idade":22}
Outra diferença do JSONL para o JSON além dos colchetes é que este último separa os registros por quebras de
linha (\n), enquanto o formato JSON os separa por vírgula. Por isso, o formato JSONL pode ser chamado, também,
de NDJSON, ou Newline Delimited JSON (JSON Delimitado por uma Nova Linha).
A vantagem do JSONL é que dá para adicionar facilmente linhas abaixo do arquivo por meio da opção 'a' da função
open(), já que não há ] no final do arquivo. Isso nos dá a facilidade de não precisar abrir o arquivo inteiro toda vez!
Por causa disso, o formato JSONL é usado em ambientes onde há arquivos muito grandes e que recebem muitos
dados várias vezes.
import json
Note que, neste código, foi escrita a opção "r" na função open() – ela é opcional para indicar que você quer ler
um arquivo (trazer os dados de um arquivo para dentro do seu código). Até este exemplo, eu não havia usado nem
uma única vez, né? Outra coisa: usamos uma laço for para varrer (iterar) todos os itens em f. (f é o nome do
objeto que foi criado pela leitura do arquivo alunos.jsonl) porque o método loads() carrega o conteúdo de apenas
uma linha (um dicionário apenas) – por isso, o objeto objeto é um dicionário.
Não necessariamente, caro leitor! Um arquivo JSONL pode ter a extensão .jsonl, ou .ndjson, pode ter
extensão .txt, pode ter até extensão .log (usada para registrar os dados de histórico de funcionamento de
sistemas, por exemplo). Só peço que você evite usar a extensão .json no nome de um arquivo que tem formato
JSONL... isso pode confundir os programas que vê lê-lo (eles podem pensar que se trata de um arquivo JSON
tradicional).
Lembrete: a função .load() é usada apenas em arquivos JSON tradicionais, porque ela aguarda dados na forma
de uma lista de dicionários. A função .loads() é quem deve ser usada em arquivos JSONL (e também consegue
ser usada em arquivos JSON tradicionais), para ler esses arquivos linha a linha.
Se quisermos escrever um dado a mais (um dicionário a mais) a um arquivo JSONL, podemos fazer uso da
função .dumps(), em vez da .dump(), que é usada para JSON tradicional.
import json
Perceba que usamos o laço for para iterar, elemento por elemento, a lista dados. Cada elemento desta lista é um
dicionário. Ao usar a função .dumps(), o Python converte o objeto obj, que é o iterável dicionário da lista dados,
em uma string JSON que, somada à quebra de linha (\n) será escrita no final do arquivo por meio da função
write().
Os arquivos JSON são formados por UM REGISTRO (cujo formato é semelhante a um dicionário do Python) ou por
VÁRIOS REGISTROS (cada registro é similar a um dicionário do Python e todos eles juntos estão em uma única
lista que envolve o arquivo JSON inteiro).
load() para atribuir a uma variável o conteúdo de um arquivo JSON obtido pela função open(). O objeto (variável)
criado pelo load() pode ser...
... uma lista de dicionários, se o arquivo JSON que foi lido for composto por vários registros.
...um dicionário, o arquivo JSON será preenchido por apenas um único registro.
... uma lista de dicionários, arquivo JSON será preenchido por vários registros.
Uma das opções que quase sempre usamos (é preferível que você use) na função dump() é a opção
ensure_ascii=False, que garante que os caracteres especiais, como símbolos e letras acentuadas sejam
registrados corretamente dentro do arquivo JSON (caso não incluamos a opção, o arquivo JSON vai registrar
dentro dele o código Unicode do caractere estranho).
Anaconda é, apenas, um termo usado para designar cobras muito grandes, normalmente encontradas nos rios da
América do Sul, como na Amazônia.
Deixando a biologia de lado (João Antonio também é Cultura Geral) e voltando para a programação, Anaconda é
o nome dado a uma distribuição do Python que junta, além da própria linguagem Python, centenas de módulos,
arquivos, programas e recursos úteis para tornar a sua programação mais fácil!
O Anaconda é um “Python Turbinado” (e é completamente gratuito, assim como o próprio Python normal).
O aviso do site de que foi enviada para o seu email uma mensagem
contendo o link para você baixar o Anaconda.
Basta clicar no botão Download Now (Baixar Agora) no conteúdo da mensagem de e-mail
que você receber... você será redirecionado para...
O Download iniciará e você só precisa esperar pelo final do processo. (o meu navegador sempre abre uma janela
perguntando onde e com que nome o arquivo será baixado no meu computador, mas nem todo faz isso).
A página Plans and Pricing (Planos e Preços) vai ser aberta, e você
poderá escolher qual o melhor plano mensal para você.
O Anaconda Navigator, que nos ajudará a instalar novos pacotes, módulos e recursos,
se precisarmos.
O Jupyter Notebook, que pode ser usado durante treinamentos mais avançados, para
você fazer anotações e criar códigos ao mesmo tempo (é uma ferramenta muito
interessante para você fazer suas anotações enquanto aprende).
O Spyder, que é o IDE que você usará enquanto usa o Anaconda (pode esquecer o
IDLE do Python que estamos usando desde a primeira lição! Este aqui é muito
melhor!)
Cada ferramenta dentro do grupo Anaconda tem uma função específica e neste material não vamos nos ater com
detalhes a nenhuma delas, exceto ao Spyder (que passarei a ensinar e utilizar aqui) e o Jupyter Notebook, que
ensinarei a utilizar aqui para que você possa usá-lo quando estiver estudando em outros cursos mais avançados
da linguagem Python!
Anaconda Navigator
Este programa é a “central de comando” do Anaconda, permitindo instalar, desinstalar, atualizar e modificar os
componentes que vêm junto com o Anaconda.
Spyder
O Spyder é um IDE profissional para Python. Ele agrega, em uma só janela, o editor de código, o Shell (console
do Python) e outros recursos que aceleram bastante a programação.
O Spyder é simplesmente MUITO MELHOR que o IDLE original do Python, porque nos ajuda na hora de escrever
os nossos códigos com vários recursos, sugestões, correções, análises e muito mais. Você vai aprender a amar
esses IDEs profissionais com o passar do tempo, eu garanto! (e o Spyder está em português!)
Jupyter Notebook
O Jupyter Notebook é um programa (que roda no seu navegador) para escrever documentos de texto (como uma
espécie de Word) que pode te ajudar a escrever as anotações das tuas aulas de Python (sejam as aulas do meu
curso online, sejam as aulas de outros professores, online ou não).
A grande vantagem do Jupyter Notebook é que, dentro dele, dá para escrever código Python e testá-lo quando
você está digitando as suas anotações! Sim! O Jupyter Notebook roda os programas como se fosse o Shell do
Python, ali mesmo, no mesmo ambiente em que você está digitando as suas anotações! É muito prático!
De jeito nenhum, amigo leitor! Você não precisa nem mesmo usar o Anaconda! Instalá-lo no seu computador é
algo completamente opcional! Há outras distribuições do Python e outros IDEs tão bons quando o Spyder!
O Jupyter Notebook quase não tem concorrentes, sinceramente, porque ele foi criado para uma função bem
específica, porém, você também o utiliza apenas se quiser! (eu, mesmo, não costumo usá-lo, nem mesmo quando
estou assistindo a cursos e me atualizando) ... prefiro escrever meus resumos e anotações com a boa e velha
caneta e papel (tá, pode me chamar de velho!).
Uma coisa é Importante: o Anaconda é uma distribuição Python muito completa para quem quer trabalhar com
ciência de dados, análise de dados e aprendizado de máquina. Todas as ferramentas que este programa traz
consigo são feitas para estas finalidades especialmente.
Nas próximas lições, abordaremos outras opções de editores de código e cadernos de anotações que não
precisam do Anaconda e que não vêm junto com ele.
Muito $imples, amigo leitor... $implesmente porque ele não é gratuito! (ele até era, e eu o usei bastante durante
algum tempo, ma$ a JetBrain$ decidiu não mai$ di$ponibilizá-lo gratuitamente, logo, nem todo mundo pode u$á-
lo agora!) – Eu optei por recomendar, apenas, ferramentas gratuitas para permitir o acesso de todos!
Ambiente do PyCharm da
JetBrains. Há, nele, muitos
recursos interessantes para
programadores profi$$ionais
(especialmente aqueles que já
podem pagar por tais
recursos!)
Muito perspicaz você amigo leitor! Eu não vou recomendar, em si, nenhum grupo ou conjunto de
cadernos/ambientes/editores para você... Até agora, usamos apenas e tão-somente o próprio IDLE do Python
justamente para provar que podemos programar em qualquer um deles, mesmo o mais sem recursos de todos.
Sou de uma época de programação raiz, onde não havia auxílio, dicas, sugestões ou correções enquanto eu
digitava: eu simplesmente escrevia na tela branca e mandava rodar o programa... se algum erro acontecesse, eu
tinha que descobrir onde estava e corrigi-lo na mão!
Teste todos os ambientes e escolha o que melhor te atende... Mas tenha em mente uma coisa: o Anaconda é o
ambiente mais recomendado para análise e ciência de dados e o VS Code é o melhor para integração de código
Python com HTML, Javascript e outras linguagens usadas para construir sites.
Dependendo de você e do seu objetivo com o Python, um deles vai ser ideal!