Você está na página 1de 81

Aprenda Python Bsico

Rpido e Fcil de entender

Felipe Galvo
Aprenda Python Bsico -
Rpido e Fcil de entender

Felipe Galvo
Prefcio

Este livro pode ser baixado gratuitamente em:


http://felipegalvao.com.br/livros

Voc no deve alter-lo, vend-lo ou qualquer coisa do tipo. Mas pode imprimir
para deixar na cabeceira, passar para os amigos ou dar de presente.

Quem sou eu?


Meu nome Felipe Galvo. Sou formado em Engenharia de Produo mas sempre
me dei bem com os computadores. Assim, acabei me enfiando no mundo mgico
da programao. Programao uma coisa mgica, pois com um computador, voc
cria um monte de coisas legais do nada.

Depois que aprendi programao, eu criei um e-commerce de camisas, que durou


por alguns anos e foi uma fonte incrvel de aprendizado. Depois continuei meus
estudos. Estudei mais desenvolvimento web, anlise de dados, trabalhei um pouco
como freelancer e criei outros projetos pessoais. Vocs podem ver mais algumas
coisas sobre mim em meu site pessoal: http://felipegalvao.com.br/

Escrevi este livro basicamente porque escrever me ajuda a fixar o contedo.


Python j tem bastante material bom para estudo, mas achei que seria um
exerccio bacana, alm de poder ajudar algum. Talvez minha didtica funcione
melhor com certas pessoas. De qualquer forma, boa sorte com o livro.

2
Sumrio

Prefcio
Quem sou eu?

Introduo
Objetivo
Por que Python?
Verso do Python
Instalao do Python
IDEs e Editores de Texto
Digitar ou copiar o cdigo?
Concluso

Print, Comentrios e Tipos de Dados


Funes
A funo print()
Comentrios
Tipos de Dados
Concluso

Sinais e Operaes
Sinais Matemticos Bsicos
Sinais de Comparao

Concluso

Variveis
Definindo variveis
A funo input()
Concluso

Strings
Definindo Strings
Escapando strings
Strings como elas so
Inserindo variveis em uma string
Concatenao
Strings como listas
Funes teis para Strings
capitalize(), lower() e upper()
center(), ljust() e rjust()
find()

3
isalnum(), isalpha() e isnumeric()
len()
replace()
strip(), rstrip() e lstrip()
Concluso

Listas
Listas
Criando, modificando e acessando itens em uma lista
Removendo Itens de uma lista
Funes teis para trabalhar com listas
len()
max() e min()
copy()
count()
sort()
reverse()
in
split() e join()
Concluso

Tuplas
Introduo
Criando uma tupla e acessando seus itens
Funcionalidades
Concluso

Dicionrios
Criando um dicionrio, acessando e modificando suas informaes
Funes teis para Dicionrios
get()
items(), keys() e values()
update()
Concluso

Sets
Criando e acessando dados em Sets
Algumas funes para trabalhar com sets
difference() e intersection()
copy()
Concluso

Estruturas de Controle
If, else e elif
Loops - For

4
Loops - while
Concluso

Funes
Funes Predefinidas do Python
Definindo uma funo
args e kwargs
Concluso

Mdulos
Criando e importando seu primeiro mdulo
Um pouco mais sobre criao e importao
Mdulos do Python
Concluso

Programao Orientada a Objetos


Definindo uma classe
Alterando e acessando propriedades
Propriedades de Classe e de Objeto
Herana
Concluso

Data e Tempo
Data
Tempo
Data e Tempo
Concluso

Excees
O try
else e finally
Chamando Excees
Concluso

Arquivos
A funo open()
Escrevendo em um arquivo
Adicionando a um arquivo
Abrindo no modo r+
Concluso

Palavras Finais
E agora?

5
Introduo

Objetivo
Este livro falar de programao com Python. A meta que seja um guia simples
de ser lido e seguido, com exemplo e linguagem mais claros possvel, sem
enrolao. Nada de histria do Python, filosofia da linguagem ou qualquer coisa do
tipo.

Este livro assume um conhecimento bsico de utilizao do computador de uma


forma geral e do Terminal (ou Prompt) do seu sistema operacional.

Por que Python?


Python uma linguagem extremamente popular, com muitas funes. Pode ser
usado para desenvolvimento para web, anlise de dados, programao cientfica,
desenvolvimento para desktop e muito mais.

Muito dessa popularidade se deve tambm facilidade em ler um cdigo Python.


Muitas de suas expresses e funes se assemelham bastante com a lngua inglesa,
e isso facilita muito na hora de aprender e entender.

Depois de aprender Python, voc pode partir para outras linguagens e frameworks,
ampliar seu leque de habilidades e estudar aquilo que estiver mais em linha com
seus objetivos.

Verso do Python
Caso ainda no saiba, atualmente, Python tem duas verses mais utilizadas, Python
2 e Python 3. Python 3 a verso mais atual, e o cdigo feito em Python 2 no
100% compatvel com ela. As verses tem diferenas considerveis.

Dito isto, Python 3 o futuro, e no existe qualquer motivo para que voc, que
est comeando, comece a programar com Python 2. Por isso, vamos utilizar
Python 3.

6
Instalao do Python
Existem vrias formas de instalar e utilizar Python. Vamos utilizar a distribuio
Anaconda. Esta uma distribuio do Python que j conta com vrios pacotes
teis, muito utilizados em programao cientfica, anlise de dados etc.

A distribuio tambm conta com uma IDE gratuita, o Spyder, que uma boa opo
para comearmos a programar. IDE significa Integrated Development Environment,
ou Ambiente de Desenvolvimento Integrado. , basicamente, uma ferramenta
utilizada para desenvolvimento de software, com uma srie de funcionalidades
teis, como completar cdigo, destaque de elementos das linguagens, entre
outros.

Anaconda fcil de instalar em qualquer sistema operacional que voc esteja


utilizando. Para baix-lo, acesse o link: h
ttps://www.continuum.io/downloads

Neste link, voc encontrar opes para download para Windows, Linux e OSX.
Para cada sistema operacional, existem as opes com Python 2 e Python 3. Baixe a
opo com Python 3 e siga as instrues que constam na pgina de download.

Para verificar a instalao, abra o Terminal de seus sistema operacional (para


Windows, um Prompt do Anaconda, chamado Anaconda Prompt, instalado), e
digite Python. Se tudo correu bem, voc ver algo parecido com a tela abaixo:

7
Este o prompt do Python. Nele, voc pode digitar comandos com a linguagem e
ver a sada destes comandos. Faa um teste e digite o cdigo abaixo, e depois d
ENTER:

>>> print("Oi, Python")


Oi, Python

Voc ver a sada, aquilo que escreveu dentro do parnteses. Falaremos mais sobre
isso nos prximos captulos, mas voc j pode ver que seu Python est
funcionando.

Para sair do Terminal do Python, digite exit() e tecle ENTER.

IDEs e Editores de Texto


Spyder a IDE que vem junto com a distribuio Anaconda. Ela possui muitas
funes voltadas para anlise de dados, mas tambm pode ser utilizada para
criao de qualquer outro arquivo de cdigo em Python.

Voc tambm pode utilizar qualquer editor de texto ou, se tiver, outra IDE de sua
preferncia.

E com isto, podemos falar sobre a outra forma de executar cdigo Python, que
atravs de arquivos .py. Abra o seu IDE ou editor preferido, crie um novo arquivo e
escreva nele o cdigo que utilizamos no Terminal, logo acima. Apenas para
relembrar:

print("Oi, Python")

Salve este arquivo com o nome oi_python.py em uma pasta de sua preferncia.
Abra o Terminal, v at a pasta onde salvou o arquivo e execute o comando
python oi_python.py. A sada ser a mesma que quando executamos o comando
no Terminal do Python, como mostra a imagem abaixo:

8
E desta forma que feita a programao de projetos e softwares mais
complexos.

Ao longo do livro, tentarei sempre manter o formato de digitar o cdigo em um


arquivo .py para rodar. O nome do arquivo fica a seu critrio, qualquer coisa com a
extenso .py funciona. O que voc tem que inserir em seu arquivo ficar com a
fonte em negrito, e a sada que voc dever ver ao executar o cdigo ficar com a
fonte em itlico, e ser precedido por um sinal >.

Faremos desta forma, primeiro pois fica fcil eu colocar todo o cdigo em um
arquivo .py, separado por captulo, para compartilhar com vocs. E tambm, mais
simples para alguns dos tpicos mais complexos, como blocos de cdigo em
estrutura de controle, definio de funes, entre outras coisinhas que necessitam
de mais linhas e indentao do cdigo para funcionar corretamente. Abaixo, s um
exemplo de um possvel cdigo, para que voc entenda melhor como ficar a
demonstrao do mesmo ao longo dos captulos:

nome = input("Digite aqui o seu nome: ")


print("Ol, %s" % nome)

> Digite aqui o seu nome: Felipe


> Ol, Felipe

9
Digitar ou copiar o cdigo?
Isso normalmente uma preferncia pessoal, e eu no vou ditar nenhuma regra
sobre como voc deve aprender. Voc pode pegar o cdigo que est no livro,
copiar e colar, ou pode digit-lo para depois rodar.

Para muitas pessoas (para mim, inclusive), digitar o cdigo ajuda a gravar. Outras
preferem copiar para passar mais rpido pelo livro e eventualmente voltar em
conceitos que sejam mais importantes ou difceis de gravar para reforar. Faa da
forma que voc achar melhor.

Todo o cdigo do livro encontra-se no seguinte repositrio do Github:


https://github.com/felipegalvao/codigo_livro_aprenda_python_basico

Concluso
Com isto, encerra-se o captulo introdutrio. Aqui, basicamente, introduzimos um
pouco o assunto e preparamos o terreno para a programao em si, que ocorrer a
partir do captulo 2.

10
Print, Comentrios e Tipos de Dados

Vamos agora escrever nossos primeiros programas e aprender um pouco sobre


sinais e operaes no Python.

Funes
Primeiramente, apenas para no prejudicar o entendimento do contedo que vir a
frente, vamos falar um pouquinho, de forma bem superficial, sobre funes. Isto
pois usaremos algumas funes j definidas pelo Python para trabalhar com os
tipos de dados que veremos.

Funes so blocos, pedaos de cdigos predefinidos que podem ser


reaproveitados. Funes podem levar parmetros ou no. Parmetros so
informaes passadas para a funo, que utilizam este parmetro para realizar
algum clculo ou transformao.

Funes podem retornar um valor final para ser utilizado posteriormente ou


apenas exibir informaes.

A forma usual de chamar uma funo atravs de seu nome, com os parmetros
dentro de parnteses. Caso a funo no receba parmetros, deve-se incluir os
parnteses, mas sem nada dentro deles. A funo print, por exemplo, recebe como
parmetro o que ser exibido por ela.

A funo print()
J vimos um pouco da funo print() no captulo passado de Introduo. A funo
print(), basicamente, imprime na tela, ou seja, exibe, aquilo que est dentro dos
parnteses.

Atente que o funcionamento desta funo mudou do Python 2 para o Python 3. No


Python 3, print() , exclusivamente, uma funo. Veremos mais sobre funes em
um captulo posterior, mas isso quer dizer que a nica forma de chamar o print()
como vimos acima, atravs do seu nome seguido de parnteses, com os
parmetros da funo dentro dos parnteses, quando necessrio.

No Python 2, voc tambm poderia chamar o print() como uma declarao, sem
os parnteses. Isso eventualmente causava certa confuso e ambiguidade, e por

11
isso, foi mudado no Python 3, visando aumentar a consistncia da linguagem e
acabar com as dvidas sobre este assunto. Mas fique esperto, pois em muitas
referncias voc poder ver o cdigo da seguinte forma:

print "Oi, Python"

No Python 3, isso no funciona mais, e retornar um erro. Por isso, fique esperto.
Funo print, s com parnteses, conforme o exemplo abaixo:

print("Oi, Python")

Comentrios
Outra coisa importante que voc tambm vai ver muito em cdigos por a so os
comentrios. Comentrios so auto-explicativos. So anotaes no cdigo que no
so rodadas junto com o prprio, e servem para ilustrar, explicar ou incluir
informaes adicionais nele. No Python existem duas formas de comentrios. O
primeiro, o comentrio de uma linha, deve ser antecedido por #, e transforma em
comentrio tudo que est a partir dele, at o final daquela linha. E ele no precisa
estar no comeo da linha, ele pode comear logo aps alguma linha de cdigo. Veja
exemplos:

# Isto um comentrio e no ser executado pelo Python


print("Oi Python")
print("Explicando comentrios") # isto tambm um comentrio e no ser executado

Coloque este cdigo em um novo arquivo e salve com o nome que quiser, e ao
rodar, voc ver que apenas os prints sero exibidos no seu Terminal.

Tipos de Dados
O Python permite trabalhar com diferentes tipos de dados. Um destes tipos o
tipo String. Vamos passar por cada tipo, explicando cada um deles:

Strings - so dados definidos entre aspas duplas () ou simples (),


representando texto, que normalmente exibido por um programa ou
exportado por ele.
Ex: Oi Python
Nmeros Inteiros (Integer) - so nmeros sem casas decimais, nmeros
inteiros. So definidos simplesmente como um nmero inteiro comum.

12
Ex: 5, 31, 150
Nmeros decimais (float) - nmeros com casas decimais, so definidos com o
nmero e as casas decimais aps o ponto.
Ex: 5.67, 99.99
Boolean - utilizado para representar os conceitos de Verdadeiro ou Falso.
Booleans s podem assumir estes dois valores, representados por True e
False (mas sem as aspas)
Ex: True, False

Temos tambm outros tipos de dados, como Listas (lists), Dicionrios (dictionaries)
e Tuplas (tuples), entre outros. Estes so tipos especiais, que veremos em captulos
posteriores, mas servem basicamente para armazenar outros tipos de dados.

Concluso
E assim, encerramos este captulo. Nele, vimos um pouquinho da sintaxe bsica,
como criar comentrios em seu cdigo e tambm os tipos de dados que o Python
permite que voc trabalhe.

13
Sinais e Operaes

Sinais Matemticos Bsicos


Vamos agora falar um pouco de sinais e operaes em Python. Para fazer a
representao das operaes, vamos utilizar nmeros inteiros (integer), mas todas
elas tambm funcionam com nmeros decimais (float). Para as operaes
matemticas bsicas, o Python possui os seguintes sinais:

Sinal Operao Exemplo Definio

>>> 4+5
+ Soma Soma dois nmeros
9

>>> 6-3
- Subtrao Subtrai dois nmeros
3

>>> 7*8
* Multiplicao Multiplica dois nmeros
56

>>> 12/4
/ Diviso Divide dois nmeros
3.0

>>> 63 % 10 Retorna o resto da diviso


% Resto da Diviso
3 inteira entre dois nmeros

>>> 5**3 Eleva o nmero antes do sinal


** Potenciao
125 potncia do nmero aps

Abaixo, veremos os exemplos em cdigo, para que voc possa confirmar o


funcionamento de cada operador:

print(4 + 5)
print(6 - 3)
print(7 * 8)
print(12 / 4)
print(63 % 10)
print(5**3)

> 9
> 3
> 56
> 3.0
> 3

14
> 125

Sinais de Comparao
Existem tambm os sinais de comparao. Estes sinais retornaro True ou False,
indicando se uma determinada comparao Verdadeira ou Falsa. True e False so
valores especiais em Python, um tipo de dado chamado Boolean, onde os nicos
valores possveis so estes dois. Vamos aos sinais de comparao:

Sinal Operao Exemplo Definio

>>> 4 == 5
False
== Igual a Indica se dois valores so iguais
>>> 4 == 4
True

>>> 6 != 3
True Indica se dois valores no so
!= Diferente de
>>> 5 != 5 iguais
False

>>> 9 > 8
True Indica se o nmero anterior ao
> Maior que
>>> 3 > 5 sinal maior que o posterior
False

>>> 10 >= 10
Indica se o nmero anterior ao
True
>= Maior ou igual a sinal maior ou igual ao
>>> 13 >= 15
posterior
False

>>> 63 < 65
True Indica se o nmero anterior ao
< Menor
>>> 150 < 140 sinal menor que o posterior
False

>>> 5 <= 5
Indica se o nmero anterior ao
True
<= Menor ou igual a sinal menor ou igual ao
>>> 12 <= 8
posterior
False

E novamente, abaixo, exemplos em cdigo e a sada de cada uma destas


comparaes:

print(4 == 5)

15
print(4 == 4)

print(6 != 3)
print(6 != 6)

print(9 > 8)
print(3 > 5)

print(10 >= 10)


print(13 >= 15)

print(63 < 65)


print(150 < 140)

print(5 <= 5)
print(12 <= 8)

> False
> True

> True
> False

> True
> False

> True
> False

> True
> False

> True
> False

Concluso
Neste captulo vimos os operadores utilizados pelo Python para as operaes
matemticas bsicas e para a comparao entre dois valores. Nada muito diferente
do que voc est acostumado na matemtica usual do dia a dia, com algumas
excees.

16
Variveis

Neste captulo, falaremos de variveis. As variveis so elementos que nos


permitem guardar valores para reutilizar posteriormente. Imagine que voc fez
algum clculo complexo com dados recuperados de algum outro lugar. Agora
imagine que voc deseja us-lo posteriormente em seu programa. No faz sentido
fazer recuperar todas as informaes e fazer o clculo todo novamente. Para isso,
usamos as variveis.

Definindo variveis
Para definir uma varivel no Python, basta digitar um nome para a prpria, o sinal
de igual e o valor que se deseja que ela armazene.

Uma varivel em Python pode armazenar praticamente qualquer coisa. Nmeros,


strings, listas, dicionrios.

Os nomes de variveis em Python precisam comear com uma letra ou com um


underscore _. Nmeros podem ser usados se no estiverem no comeo.

Variveis em Python tambm no possuem tipos definidos. Desta forma, uma


mesma varivel que armazena inicialmente uma string, pode depois armazenar um
nmero inteiro, ou uma lista. Vamos ento a um exemplo de definio de variveis:

a = 3
b = 7
print(a+b)

a = "Agora uma string"


print(a)

> 10
> Agora uma string

Voc tambm pode designar a uma varivel o valor de outra varivel. Prosseguindo
com o exemplo acima:

b = a
print(b)

> Agora uma string

17
Tambm possvel definir mais de uma varivel de uma vez. Caso o valor seja igual
para todas, utilize o sinal de igual entre os nomes das variveis. Caso seja diferente,
use vrgulas entre os nomes das variveis e entre os valores de cada uma delas.
Veja os exemplos abaixo:

# Definio de mltiplas variveis com valores iguais


x = y = z = 10
print(x)
print(y)
print(z)

# Definio de mltiplas variveis com valores diferentes


x, y, z = 10, 20, 30
print(x)
print(y)
print(z)

> 10
> 10
> 10
> 10
> 20
> 30

Lembre-se que vimos no captulo anterior o sinal de comparao ==. muito


importante no confundir o sinal de comparao == e o sinal de atribuio =.
Para definir uma varivel, use sempre =, e para fazer uma comparao, saber se
dois valores ou variveis so iguais, use sempre ==.

A funo input()
Aqui, aproveitamos para apresentar a funo input(). Esta funo utilizada para
captar informaes enviadas pelo usurio. Ela pode receber um parmetro, que
ser uma mensagem exibida ao usurio antes que ele insira o que deseja.

A entrada inserida pelo usurio pode ser salva e utilizada posteriormente. No


exemplo abaixo, a entrada digitada pelo usurio salva na varivel nome e
depois impressa, juntamente com a mensagem desejada. No exemplo, logo aps
a exibio da mensagem Ol, qual o seu nome?, o programa aguardar o input do
usurio. Aps digitar seu nome, voc deve apertar o Enter, para que o cdigo
prossiga.

nome = input("Ol, qual o seu nome?\n")


print("Ol, %s" % nome)

> Ol, qual o seu nome?


Felipe
> Ol, Felipe

18
Concluso
Neste captulo vimos como utilizar variveis. Variveis so essenciais na
programao, pois voc pode guardar valores inputados pelo usurio ou armazenar
o resultado de algum clculo feito, eliminando a necessidade de refazer este
clculo sempre que quiser utilizar seu resultado.

Basicamente, uma varivel definida escolhendo seu nome, colocando um sinal de


=, e aps destes, o valor que a varivel ir assumir.

19
Strings

J vimos um pouco sobre strings no captulo 2, sobre tipos de dados que o Python
utiliza. Resgatando a definio que usamos, so dados definidos entre aspas duplas
() ou simples (), representando texto, que normalmente exibido por um
programa ou exportado por ele.

Resumindo e simplificando, basicamente, string um texto, podendo conter letras,


nmeros, smbolos.

Definindo Strings
Apenas para deixar o captulo completo, vamos relembrar como definimos uma
string. Uma string definida como tudo que se encontra entre aspas simples () ou
duplas (). Qual voc usa uma questo de gosto e opinio pessoal. Desta forma
vamos aos primeiros exemplos:

string1 = "Oi Python"


string2 = 'Tchau Python'
print(string1)
print(string2)

> Oi Python
> Tchau Python

Desta forma, vimos acima as duas principais formas de definir uma string. Existe
uma terceira forma, que a definio de strings entre trs aspas triplas. Neste
caso, caracteres escapados (veremos o que so em alguns instantes) assumem seu
significado correto, e quebras de linha, seja no terminal ou na linha de cdigo
tambm so interpretadas como tal no output. Veja o exemplo abaixo, onde cada
quebra de linha foi feita dando ENTER aps cada sentena. A string s se encerra
ao fech-la com o mesmo conjunto de aspas simples ou duplas utilizado para
inici-la:

string_grande = '''Ol. Esta uma string grande no Python.


Aqui voc pode usar " ou '
Caracteres so escapados como se espera.
a terceira forma de definir uma string, apesar de no ser to usual....
\t testando o TAB para finalizar'''

> Ol. Esta uma string grande no Python.


> Aqui voc pode usar " ou '
> Caracteres so escapados como se espera.
> a terceira forma de definir uma string, apesar de no ser to usual....

20
> testando o TAB para finalizar

Escapando strings
Ok, t bom. Mas e se eu quiser criar uma string com aspas duplas e simples no meio
dela? Bem, se voc usa aspas duplas em sua string e quiser usar aspas simples nela,
ou vice-versa, no h qualquer problema. Basta coloc-los junto com a string e ela
continuar sendo vlida. Veja:

string3 = "A cantora Sinnead O'Connor"


string4 = 'Alfredo disse "Corram aqui para ver isso!"'
print(string3)
print(string4)

> A cantora Sinnead O'Connor


> Alfredo disse "Corram aqui para ver isso!"

Agora, caso voc queira utilizar as duas em uma string, ou caso sempre defina suas
strings com aspas duplas e queira usar aspas duplas em uma string especfica,
temos que escapar este caracter. Escapar? Sim, escapar. Escapar significa inserir em
uma string caracteres que tenham algum significado especial, como uma nova
linha, um caracter de tabulao (TAB) ou as aspas simples ou duplas.

Para escapar um caracter em Python utilizamos a contrabarra (\) antes do


elemento que desejamos escapar. Vejamos os exemplos:

string5 = "Alfredo disse \"Corram aqui para ver isso!\""


string6 = 'Sinnead O\'Connor disse "Nothing compares 2 u"'
print(string5)
print(string6)

> Alfredo disse "Corram aqui para ver isso!"


> Sinnead O'Connor disse "Nothing compares 2 u"

E se eu quiser usar uma contrabarra na minha string? Fcil, basta escapar ela
tambm. Ao definir uma string, duas contrabarras (\\) viram uma contrabarra na
sada:

string7 = "Estou escapando uma \\"


print(string7)

> Estou escapando uma \

Retirado da documentao e traduzido por mim mesmo, segue abaixo uma


tabelinha com sequncias escapadas e seus significados:

21
Sequncia Escapada Significado

\\ Contrabarra

\ Aspas simples

\ Aspas duplas

\a Caracter de controle ASCII Bell (BEL)

\b Caracter ASCII Backspace (BS)

\f Caracter ASCII Formfeed (FF)

\n Caracter ASCII Linefeed (LF) - este cria uma nova linha no


output

\r Caracter ASCII Carriage Return (CR)

\t Caracter ASCII Tab Horizontal (TAB)

\v Caracter ASCII Tab Vertical (VT)

\ooo Caracter ASCII com valor octal ooo

\xhh Caracter ASCII com valor hex de hh

Strings como elas so


Uma outra forma de representar strings antecedendo sua definio com a letra
r. Isto gera o que chamamos de raw string literals, onde a string exibida
exatamente como ela foi definida, e no substituindo caracteres escapados por
seus significados no output. Vejamos o exemplo abaixo para entender:

string8 = r"Utilizamos \n para inserir uma nova linha na string"


print(string8)

> Utilizamos \n para inserir uma nova linha na string

Desta forma, podemos escrever strings sem se preocupar com caracteres


escapados ou qualquer coisa do tipo.

Inserindo variveis em uma string


Outra situao bastante recorrente: tenho um determinado valor armazenado em
uma varivel e quero exibi-lo juntamente com outros caracteres de texto. Posso

22
fazer isso de diferentes formas. A primeira delas utilizando o sinal de %, que
um caractere de formatao de strings no Python.

Apesar de permitir utilizaes mais complexas para formatao de strings, sua


utilizao mais bsica atravs do %s para incluir outras strings em uma string, e
%d para incluir um nmero inteiro (Integer). Vejamos exemplos dos dois:

nome = "Felipe"
idade = 30
print("Meu nome %s " % nome)
print("Tenho %d anos" % idade)

> Meu nome Felipe


> Tenho 30 anos

Tambm podemos incluir nmeros decimais (float) em strings, usando %f. Vejamos
algumas possibilidades no exemplo abaixo. Primeiro, um exemplo sem qualquer
formatao:

a = 30.46257
print("Formatando decimais: %f" % a)

> Formatando decimais: 30.462570

Se colocamos um ponto e a quantidade de casas decimais, definimos a quantidade


de algarismos a serem impressos aps o ponto:

print("Formatando decimais: %.2f" % a)


print("Formatando decimais: %.3f" % a)

> Formatando decimais: 30.46


> Formatando decimais: 30.463

Voc pode inserir mais de um valor na string, colocando-os em ordem dentro de


parnteses, separados por vrgulas. Esta estrutura se chama Tupla, e em um
captulo posterior, a veremos em detalhes:

nome = 'Felipe'
idade = 30
print("Meu nome %s e tenho %d anos" % (nome, idade))

Meu nome Felipe e tenho 30 anos

Concatenao
Outra forma de inserir valores em strings atravs da concatenao. O sinal de
concatenao no Python o +. Atravs dele, juntamos strings com variveis e
outras strings. Vejamos no exemplo abaixo:
23
nome = 'Felipe'
print("Ol, meu nome " + nome)

> Ol, meu nome Felipe

Esta forma tem um porm. Vejamos agora o que acontece se incluirmos a varivel
idade, um nmero inteiro, nesta string, por concatenao:

nome = 'Felipe'
idade = 30
print("Ol, meu nome " + nome + " e tenho " + idade + " anos.")

> Traceback (most recent call last):


> File "<stdin>", line 1, in <module>
> TypeError: Can't convert 'int' object to str implicitly

A funo print no faz a converso de um nmero inteiro para uma string


automaticamente. Desta forma, para incluir esta varivel, precisamos converter o
nmero inteiro para uma string usando a funo str, e passando dentro do
parnteses o valor a ser convertido. Veja:

print("Ol, meu nome " + nome + " e tenho " + str(idade) + " anos.")

> Ol, meu nome Felipe e tenho 30 anos.

E no caso de nmeros decimais? Bem, se voc no quer format-lo, basta chamar a


funo str da mesma forma que no exemplo anterior:

valor = 503.78987
print("O valor " + str(valor))

> O valor 503.78987

Mas, se quiser format-la antes, teremos que usar outra funo, a funo format.
Seus parmetros so o valor a ser formatado e o formato das casas decimais, tal
qual vimos na formatao de decimais nos exemplos anteriores, onde passamos o
ponto e o nmero de casas decimais aps o mesmo. Vejamos no exemplo:

24
print("O valor " + format(valor, '.2f'))

> O valor 503.79

Note que a funo format j retorna uma string, no havendo aqui a necessidade
de converter o resultado em string usando a funo str.

Strings como listas


Em Python, toda string tratada como uma lista. Ainda falaremos mais de listas em
captulos posteriores, mas resumindo, uma lista uma estrutura semelhante aos
arrays, para quem vem de outras linguagens de programao. So um conjunto de
dados armazenados em uma nica estrutura. E em Python, uma string uma lista,
ou uma sequncia de caracteres.

Uma das situaes que isso desencadeia que podemos acessar qualquer
caractere da string atravs de seu ndice, ou index, que a sua posio na string. A
primeira letra tem ndice 0 (zero), e a ltima igual a quantidade de caracteres da
string menos um. Vejamos:

string9 = "Ol, meu nome Felipe"


print(string9[0])
print(string9[3])
print(string9[21])

> O
> ,
> e

No exemplo acima, a string que usamos tem 22 caracteres. E o que acontece se


usarmos um ndice que no existe? O Python retorna um erro. Vejamos:

print(string9[25])

> Traceback (most recent call last):


> File "<stdin>", line 1, in <module>
> IndexError: string index out of range

No captulo onde falaremos sobre listas veremos mais sobre como trabalhar com
elas de forma mais eficiente.

25
Funes teis para Strings
Aqui, vamos apresentar algumas funes teis para strings, explicando um pouco o
funcionamento de cada uma delas. No vou entrar em detalhes de todas as
funes existentes no Python, pois so muitas e a documentao da linguagem
at melhor que eu para explicar as mesmas. Vou apenas apresentar algumas das
que considero importantes e mais utilizadas e explic-las com bons exemplos.

Chamamos as funes abaixo, como veremos nos exemplos, como mtodos da


prpria string.

capitalize(), lower() e upper()


A funo capitalize() transforma a primeira letra de uma string em maiscula.
lower() e upper() transformam, respectivamente, todas as letras em minsculas
e maisculas. Veja alguns exemplos:

string10 = "ol, meu NOME Felipe"


print(string10.capitalize())
print(string10.upper())

> Ol, meu nome felipe


> OL, MEU NOME FELIPE

center(), ljust() e rjust()


A funo center(), como o nome provavelmente j d a entender, centraliza uma
string para um determinado nmero de caracteres, utilizando um caractere a ser
definido para preencher a string dos dois lados. ljust() e rjust() fazem o mesmo,
mas preenchem caracteres apenas esquerda ou direita. Veja um exemplo com o
center. Os outros dois so anlogos:

string11 = "ol, meu nome Felipe"


print(string11.center(50,"*"))

> **************ol, meu nome Felipe**************

find()
Este mtodo indica se uma determinada substring faz parte de uma string. Caso
faa, ela retorna a posio onde comea esta substring. Caso no, a funo retorna
-1. Veja no exemplo:

string12 = "Ol, meu nome Felipe"


substring1 = "meu"
print(string12.find(substring1))
substring2 = "Jos"

26
print(string12.find(substring2))

> 5
> -1

Voc tambm pode definir os ndices a partir dos quais a busca inicia e termina,
atravs dos parmetros beg (primeiro aps a string a ser encontrada) e end
(segundo aps a string, logo aps o parmetro beg), conforme o exemplo abaixo:

print(string12.find(substring1, 7))
print(string12.find(substring1, 2))

> -1
> 5

isalnum(), isalpha() e isnumeric()


Estas funes indicam se uma determinada string , respectivamente, totalmente
formada por caracteres alfanumricos, alfabticos (s contem letras) e nmeros.
Se as strings tiverem pelo menos um caracter que invalide cada condio, estas
funes retornaro False. Vale notar que espao em branco na string torna uma
string invlida para qualquer uma destas funes. Vamos com muitos exemplos,
para podermos entender bem. Primeiro, uma string s com letras:

string13 = "Felipe"
print(string13.isalnum())
print(string13.isalpha())
print(string13.isnumeric())

> True
> True
> False

Agora, uma string s com nmeros:

string14 = "1234"
print(string14.isalnum())
print(string14.isalpha())
print(string14.isnumeric())

> True
> False
> True

E uma com os letras e nmeros:

string15 = "Felipe1234"
print(string15.isalnum())

27
print(string15.isalpha())
print(string15.isnumeric())

> True
> False
> False

len()
A funo len() retorna a quantidade de caracteres presentes em uma
determinada string. Repare que a funo len(), diferentemente da maioria das
funes que vimos, no chamada atravs de uma string, mas a string passada
como um argumento para ela. Veja:

string16 = "Meu nome Felipe"


print(len(string16))

> 17

replace()
A funo replace(), como o nome j indica, substitui uma parte de uma string por
outra parte, definidas nos dois primeiros argumentos da funo. Veja o exemplo:

string17 = "Ol, meu nome Felipe"


print(string17.replace("Felipe","Jos"))

> Ol, meu nome Jos

strip(), rstrip() e lstrip()


A funo strip() remove espaos no comeo e no fim das strings. J as funes
rstrip() e lstrip() removem, respectivamente, espaos direita e esquerda da
string (r e l de right e left). Vejamos alguns exemplos:

string18 = " Ol, meu nome Felipe "


print(string18)
print(string18.strip())
print(string18.rstrip())
print(string18.lstrip())

> Ol, meu nome Felipe


> Ol, meu nome Felipe
> Ol, meu nome Felipe

28
> Ol, meu nome Felipe

PS: No d para conferir muito bem o resultado da funo rstrip(), mas eu juro
que ela funciona.

Concluso
Existem muitas outras funes teis relacionadas a strings no Python, mas
checamos algumas das mais importantes e mais utilizadas. Vimos tambm como
definir strings, incluir o valor de variveis nelas e formatar nmeros a serem
inseridos. Assim como o tratamento que o Python d s strings, tratando-as como
listas.

29
Listas

O Python possui algumas diferentes estruturas de dados utilizados para armazenar


diferentes tipos de dados. Cada um deles tem suas particularidades. Neste
captulo, veremos um pouco sobre as listas.

Listas
Se voc est vindo de outra linguagem de programao, possvel que j tenha
trabalhado com arrays. As listas do Python so os arrays das outras linguagens.

Se no veio, vou explicar. As listas so estruturas de dados sequenciais do Python


que servem para armazenar outros diferentes tipos de dados. As listas podem
armazenar qualquer tipo de dado, como nmeros inteiros, strings, nmeros
decimais e at outras listas.

Criando, modificando e acessando itens em uma lista


Para criar uma lista, basta definir seus itens entre colchetes [] e separados por
vrgula. Tambm possvel criar uma lista vazia, definindo apenas os colchetes,
sem nenhum item dentro deles. Vejamos alguns exemplos:

alunos = ["Jos", "Joo", "Luiz"]


notas = [8.5, 9.2, 6.7]
print(alunos)
print(notas)
lista_vazia = []
print(lista_vazia)

> ['Jos', 'Joo', 'Luiz']


> [8.5, 9.2, 6.7]
> []

Note que os itens no precisam ser todos do mesmo tipo. Voc pode misturar itens
de diferentes tipos dentro de uma mesma lista.

lista_misturada = [12, 15.56, "Sorveteria", ["Baunilha", "Chocolate"]]


print(lista_misturada)

> [12, 15.56, 'Sorveteria', ['Baunilha', 'Chocolate']]

A lista acima, como voc viu, possui um inteiro, um decimal, uma string e uma outra
lista.

30
Para acessar os itens de uma lista, voc utiliza o ndice de cada uma delas, ou a
posio que o item desejado ocupa na lista. O primeiro item o de ndice 0 (zero).
Vejamos:

print(alunos[0])
print(notas[2])

> Jos
> 6.7

Voc tambm pode usar ndices negativos, e assim a contagem ser feita do final
da lista:

print(alunos[-1])
print(alunos[-3])

> Luiz
> Jos

Da mesma forma, tambm podemos alterar o valor que est nestes ndices.

print(notas)
notas[2] = 7.7
print(notas)

> [8.5, 9.2, 6.7]


> [8.5, 9.2, 7.7]

E quando queremos adicionar novos itens a uma lista? Bem, nesse caso temos trs
funes. A primeira delas a funo append(). A funo append(), chamada
atravs de uma lista, recebe como parmetro o item a ser adicionado ao final da
lista:

print(alunos)
alunos.append('Alfredo')
print(alunos)

> ['Jos', 'Joo', 'Luiz']


> ['Jos', 'Joo', 'Luiz', 'Alfredo']

E se no quisermos que o novo item fique no final? Bem, a usamos a funo


insert(). Nesta funo, indicamos o ndice que o novo item dever ficar. Os outros
itens so ajustados de acordo:

print(alunos)
alunos.insert(1, "Daniela")
print(alunos)

31
> ['Jos', 'Joo', 'Luiz', 'Alfredo']
> ['Jos', 'Daniela', 'Joo', 'Luiz', 'Alfredo']

Repare como Daniela se tornou o item no ndice 1, conforme indicamos na funo


insert().

Por fim, temos a funo extend(). Esta funo adiciona uma lista de itens ao final
de outra lista:

print(alunos)
novos_alunos = ['Carlos', 'Maria', 'Ana']
alunos.extend(novos_alunos)
print(alunos)

> ['Jos', 'Daniela', 'Joo', 'Luiz', 'Alfredo']


> ['Jos', 'Daniela', 'Joo', 'Luiz', 'Alfredo', 'Carlos', 'Maria', 'Ana']

Tambm possvel concatenar duas listas, utilizando apenas o sinal de +:

alunos1 = ['Jos', 'Daniel', 'Joo']


alunos2 = ['Carlos', 'Augusto', 'Denis']
print(alunos1 + alunos2)

> ['Jos', 'Daniel', 'Joo', 'Maria', 'Ana', 'Carolina']

E por fim, tambm possvel usar o sinal de multiplicao para repetir itens de
uma lista:

print(notas*2)

> [8.5, 9.2, 7.7, 8.5, 9.2, 7.7]

Removendo Itens de uma lista


Bem, e para remover? Para remover itens de uma lista, temos as funes
remove() e pop. A funo remove(), apaga o item com base em seu valor:

print(alunos)
alunos.remove('Joo')
print(alunos)

> ['Jos', 'Daniela', 'Joo', 'Luiz', 'Alfredo', 'Carlos', 'Maria', 'Ana']


> ['Jos', 'Daniela', 'Luiz', 'Alfredo', 'Carlos', 'Maria', 'Ana']

A funo pop(), remove um item da lista com base no seu ndice. Caso nenhum
argumento seja passado, ele remove o ltimo item. A funo tambm retorna o
item removido:

32
print(alunos)
aluno_removido = alunos.pop()
print(aluno_removido)
print(alunos)
aluno_removido = alunos.pop(2)
print(aluno_removido)
print(alunos)

> ['Jos', 'Daniela', 'Luiz', 'Alfredo', 'Carlos', 'Maria', 'Ana']


> Ana
> ['Jos', 'Daniela', 'Luiz', 'Alfredo', 'Carlos', 'Maria']
> Luiz
> ['Jos', 'Daniela', 'Alfredo', 'Carlos', 'Maria']

E se temos dois itens com o mesmo valor e usamos a funo remove()? Neste
caso, a funo remove apaga apenas a primeira ocorrncia deste valor:

alunos = ['Jos', 'Denis', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']


print(alunos)
alunos.remove('Denis')
print(alunos)

> ['Jos', 'Denis', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']


> ['Jos', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']

Repare no exemplo acima que a lista possua o nome Denis duas vezes, mas apenas
a primeira ocorrncia, que era o segundo item da lista, foi removido.

As listas tambm tm uma funcionalidade interessante, que a de extrair partes


da lista, o que em ingls chamado de slicing. Para fazer isso, usamos uma
notao semelhante de acessar itens dentro das listas, mas informamos o
intervalo que desejamos acessar. Vejamos o exemplo para que fique mais claro:

print(alunos)
print(alunos[0:2])
print(alunos[2:4])
print(alunos[2:5])

> ['Jos', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']


> ['Jos', 'Daniela']
> ['Carla', 'Carlos']
> ['Carla', 'Carlos', 'Augusto']

Com esta notao, o Python pega os itens no intervalo definido dentro dos
colchetes, iniciando o intervalo no primeiro nmero e terminando no segundo, mas
sem incluir o segundo.

Se omitimos um dos nmeros, ele parte do princpio da lista ou vai at o final dela.

33
print(alunos[:3])
print(alunos[3:])

> ['Jos', 'Daniela', 'Carla']


> ['Carlos', 'Augusto', 'Denis']

Tambm possvel utilizar nmeros negativos. Desta forma, a contagem feita a


partir do final:

print(alunos[1:-1])
print(alunos[2:-2])

['Daniela', 'Carla', 'Carlos', 'Augusto']


['Carla', 'Carlos']

Funes teis para trabalhar com listas


Entre as funes interessantes que podemos utilizar com as listas esto:

len()
A funo len(), assim como ocorre quando utilizada com strings, retorna a
quantidade de itens em uma lista:

print(len(alunos))

> 6

max() e min()
As funes max() e min(), como os nomes j devem indicar, retornam o valor
mximo e o mnimo em uma lista:

print(max(notas))
print(min(notas))

> 9.2
> 7.7

copy()
A funo copy() a forma correta de criar uma cpia de uma lista. Definir uma
nova lista igual a uma lista prvia (utilizando o sinal de =), apesar de parecer
intuitivo, no funciona, pois isto cria apenas uma referncia lista. Vejamos
primeiramente a forma errada:

alunos = ["Jos", "Joo", "Luiz", "Carlos", "Afonso"]


alunos_backup = alunos
print(alunos_backup)

34
alunos.clear()
print(alunos_backup)

> ['Jos', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']


> []

Repare como a lista alunos_backup possua os itens iguais lista aluno, mas ficou
vazia aps usarmos a funo clear() para remover todos os itens da lista alunos.
De nada adiantou fazer o backup desta forma.

Vejamos agora a forma correta de criar uma cpia, usando a funo copy()
(vamos aproveitar e recriar a lista alunos, que ficou vazia aps o ltimo exemplo):

alunos = ['Jos', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']


alunos_backup = alunos.copy()
print(alunos_backup)
alunos.clear()
print(alunos_backup)

> ['Jos', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']


> ['Jos', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']

Agora, mesmo limpando a primeira lista, a lista de backup permanece inalterada.


Vamos apenas recriar a lista alunos novamente agora, para o caso de a usarmos
em exemplos prximos.

alunos = ['Jos', 'Daniela', 'Carla', 'Carlos', 'Augusto', 'Denis']

count()
A funo count() retorna a quantidade de vezes que um determinado item ocorre
em uma lista. Basta passar este item que se deseja contar como parmetro da
funo. Vamos adicionar alguns nomes repetidos na lista alunos com a funo
extend() e checar o funcionamento da funo count():

alunos.extend(['Daniela', 'Felipe', 'Carla', 'Daniela'])


print(alunos.count('Daniela'))

> 3

sort()
A funo sort() ordena uma lista. Mas ela tem uma particularidade, e voc deve
tomar cuidado. Ela no retorna nenhum valor, mas sim ordena a lista
permanentemente. Caso voc precise manter os dados na ordem que estavam e
deseje apenas fazer uma exibio da lista ordenada, deve-se fazer uma cpia da
lista:

35
alunos.sort()
print(alunos)

> ['Augusto', 'Carla', 'Carla', 'Carlos', 'Daniela', 'Daniela', 'Daniela', 'Denis',


'Felipe', 'Jos']

reverse()
A funo reverse() reverte a ordem dos elementos de uma lista. Assim como a
funo sort(), ela executa a operao permanentemente na lista onde chamada,
e por isso, deve-se tomar cuidado ao utiliz-la:

alunos.reverse()
print(alunos)

> ['Jos', 'Denis', 'Daniela', 'Daniela', 'Daniela', 'Carlos', 'Carla', 'Carla',


'Augusto']

in
Por ltimo, possvel verificar se um determinado item consta ou no na lista. Para
isso, usamos o in, da seguinte forma:

print("Jos" in alunos)
print("Felipe" in alunos)

> True
> False

split() e join()
Estas so funes com propsitos opostos, e elas na verdade operam em strings.
Mas elas so funes que se relacionam com listas (ou outros tipos de sequncias),
e preferi aguardar o captulo de listas para falar sobre elas.

A funo split() retorna uma lista a partir de uma string e de um separador


definido, que pode ser qualquer coisa, mas por padro um espao.

J a funo join() retorna uma string a partir de uma sequncia, com os itens da
sequncia divididos por um determinado separador.

alunos_string = "; ".join(alunos)


print(alunos_string)
alunos_lista = alunos_string.split("; ")
print(alunos_lista)
> Jos; Denis; Daniela; Daniela; Daniela; Carlos; Carla; Carla; Augusto
> ['Jos', 'Denis', 'Daniela', 'Daniela', 'Daniela', 'Carlos', 'Carla', 'Carla',
'Augusto']

36
Concluso
E assim conclumos o captulo sobre listas. Vimos que as listas so estruturas para
armazenar dados de diferentes tipos. Vimos tambm como criar, acessar dados e
modificar uma lista. E por fim, vimos algumas funes bastante teis para serem
usados com as listas. No prximo captulo veremos uma estrutura semelhante, a
tupla.

37
Tuplas

Aps vermos as listas no captulo anterior, neste, veremos as tuplas, ou tuples, no


ingls.

Introduo
As tuplas assemelham-se bastante s listas. So estruturas que armazenam dados
de diferentes tipos, em forma de lista.

A grande diferena que ao contrrio de uma lista, uma tupla imutvel. Voc no
pode redefinir elementos de uma tupla, alterar seus valores ou qualquer coisa do
tipo.

Criando uma tupla e acessando seus itens


A forma para se criar uma tupla bastante semelhante de uma lista tambm. S
que ao invs de usarmos colchetes, usamos parnteses. E da mesma forma,
separamos seus elementos com vrgulas:

tupla1 = ("Gato", "Cachorro", "Papagaio", "Tartaruga")


print(tupla1)

> ('Gato', 'Cachorro', 'Papagaio', 'Tartaruga')

Para acessar seus elementos, tambm fazemos da mesma forma que com as listas,
ou seja, atravs de colchetes indicando a posio do elemento desejado:

print(tupla1[2])

> Papagaio

Alm disso, tambm possvel pegar apenas uma parte da tupla, usando a notao
com colchetes e os nmeros de incio e fim desejados divididos por :, assim como
j vimos com as listas. Esta funcionalidade denominada slicing:

print(tupla1[1:3])

> ('Cachorro', 'Papagaio')

38
Tambm permitido criar uma tupla vazia, definindo apenas os parnteses, sem qualquer
elemento dentro:

tupla_vazia = ()
print(tupla_vazia)

> ()

Bem, como dissemos que uma tupla imutvel, vamos provar. Vamos tentar
alterar o valor de um item de uma tupla, assim como fizemos no captulo de listas:

tupla1[1] = "Elefante"

> Traceback (most recent call last):


> File "<stdin>", line 1, in <module>
> TypeError: 'tuple' object does not support item assignment

Repare como o prprio Python reporta o erro. Uma tupla no suporta a designao
do valor de um item.

Igualmente, no possvel remover itens de uma tupla. Duas coisas que voc pode
fazer so criar uma nova tupla sem o item desejado e apagar uma tupla
completamente, atravs da funo del():

del(tupla1)
print(tupla1)

> Traceback (most recent call last):


> File "<stdin>", line 1, in <module>
> NameError: name 'tupla1' is not defined

Funcionalidades
Algumas das funes que vimos no captulo anterior tambm funcionam com as tuplas,
como len(), max() e min(), por exemplo:

tupla2 = (8.3, 9.4, 3.3, 7.5, 7.6)


print(max(tupla2))
print(min(tupla2))
print(len(tupla2))

> 9.4
> 3.3
> 5

Tambm possvel transformar uma tupla em uma lista e vice-versa, atravs das funes
list e tuple:

39
lista1 = list(tupla1)
print(lista1)
lista2 = ["Jos", "Afonso", "Carlos", "Luiz"]
tupla3 = tuple(lista2)
print(tupla3)

> ["Gato", "Cachorro", "Papagaio", "Tartaruga"]


> ('Jos', 'Afonso', 'Carlos', 'Luiz')

Concluso
E assim, conclumos o captulo sobre tuplas, que nada mais so do que listas
imutveis. Vimos que muito do que fazemos com as listas tambm funcionam com
as tuplas e as formas de cri-las e acessar as informaes contidas nelas. No
prximo captulo falaremos sobre dicionrios, estruturas muito interessantes para
armazenar dados de uma forma diferente das listas e tuplas.

40
Dicionrios

Os dicionrios do Python, ou dictionaries (tambm referenciados como dicts), so


mais uma estrutura para armazenar dados. Entretanto, o que difere
significativamente os dicionrios das listas que no dicionrio, o ndice um nome
que voc define, ao invs dos ndices numerados que as listas possuem.

Criando um dicionrio, acessando e modificando suas


informaes
Para criar um dicionrio, usamos as chaves ({}). Os elementos seguem o formato
chave : valor. Vejamos no exemplo para que fique mais claro:

aluno = {"nome": "Jos", "idade": 20, "nota": 9.2}


print(aluno)

> {'nome': 'Jos', 'idade': 20, 'nota': 9.2}

Como j se deve imaginar, possvel criar um dicionrio vazio, definindo apenas as


chaves, sem elementos dentro:

dict_vazio = {}
print(dict_vazio)

> {}

Para acessar os dados de um dicionrio, usamos o mesmo formato das listas.


Porm, como o ndice nomeado, usaremos o nome para resgatar o valor, ao invs
do ndice numrico:

print(aluno["nome"])
print(aluno["idade"])

> Jos
> 20

Se tentarmos acessar uma chave que no existe no dicionrio, o Python retorna um


erro:

print(aluno["Peso"])

> Traceback (most recent call last):


> File "<stdin>", line 1, in <module>

41
> KeyError: 'Peso'

Para modificar um valor, novamente, fazemos como nas listas. Basta indicar a
chave que se deseja alterar e definir o novo valor. A incluso de um novo item no
dicionrio feita da mesma forma, utilizando uma chave que ainda no foi utilizada
no mesmo:

aluno["nota"] = 8.2
aluno["peso"] = 74
print(aluno)

> {'idade': 20, 'nome': 'Jos', 'nota': 8.2, 'peso': 74}

Repare como a chave peso e seu valor foram adicionados, alm da alterao no
valor da chave nota.

Para remover uma determinada chave e seu valor, usamos o del. Para apagar
todas as chaves e valores, usamos o mtodo clear, chamado atravs do
dicionrio:

del aluno["idade"]
print(aluno)
aluno.clear()
print(aluno)

> {'nome': 'Jos', 'nota': 8.2, 'peso': 74}


> {}

Funes teis para Dicionrios


Algumas das funes que utilizamos com as listas tambm funcionam com os
dicionrios. o caso da funo len(), por exemplo, que retorna a quantidade de
pares chave : valor do dicionrio (vamos aproveitar para redefinir o dicionrio
aluno que limpamos no ltimo exemplo:

aluno = {"nome": "Jos", "idade": 20, "nota": 9.2}


print(len(aluno))

> 3

Outra funcionalidade que tambm funciona com dicionrios a verificao da


existncia de uma chave atravs do in:

print("idade" in aluno)
print("peso" in aluno)

> True

42
> False

Mas temos outras funes teis para trabalhar com dicionrios. Vamos ver algumas
delas.

get()
A funo get() muito til para evitar erros de chave inexistente. Ela recebe dois
parmetros, que so a chave a ser buscada e um valor de retorno. Ela retorna o
valor de desta chave se ela existir no dicionrio, e se no existir, retorna aquilo que
definimos como valor de retorno, ou None se nenhum valor de retorno for
definido:

aluno = {"nome": "Jos", "idade": 20, "nota": 9.2}


print(aluno.get("nome"))
print(aluno.get("peso"))
print(aluno.get("peso", "No existe"))

> Jos
> None
> No existe

items(), keys() e values()


A funo items() retorna uma lista de tuplas com os pares chave : valor. J a
funo keys() retorna uma lista apenas com as chaves do dicionrio. E a funo
values() retorna uma lista apenas com os valores dos itens do dicionrio:

print(aluno.items())
print(aluno.keys())
print(aluno.values())

> dict_items([('idade', 20), ('nota', 9.2), ('nome', 'Jos')])


> dict_keys(['idade', 'nota', 'nome'])
> dict_values([20, 9.2, 'Jos'])

update()
A funo update() recebe um dicionrio como parmetro e insere os pares deste
dicionrio parmetro no dicionrio atravs do qual a funo chamada. Caso
existam chaves coincidentes, o primeiro dicionrio atualizado com os valores do
dicionrio passado como parmetro:

aluno_original = {"nome": "Jos", "idade": 20, "nota": 9.2}


aluno_update = {"peso": 75, "nota": 8.7}
aluno_original.update(aluno_update)
print(aluno_original)

> {'nome': 'Jos', 'idade': 20, 'nota': 8.7, 'peso': 75}

43
Como podem ver, a chave peso foi adicionada e o valor da chave nota foi
modificado.

Concluso
Neste captulo aprendemos sobre os dicionrios e sua principal diferena para
listas. Vimos como criar um dicionrio, atualizar e acessar suas informaes e
tambm funes que podem vir a ser muito teis ao trabalhar com eles. No
prximo captulo, veremos rapidamente os sets.

44
Sets

Os sets so a ltima estrutura para armazenar dados que veremos. Elas no so to


comumente utilizadas, mas tm uma funo.

Os sets so listas ou colees no ordenadas de itens nicos.

Criando e acessando dados em Sets


Para criar um set, voc pode utilizar a funo set(), que transforma sequncias
(uma lista, por exemplo) em sets, ou voc pode definir os valores do set separados
entre vrgulas (mas sem formatar em pares chave: valor, ou voc criar um
dicionrio):

lista1 = ["Luiz", "Alfredo", "Felipe", "Alfredo", "Joana", "Carolina", "Carolina"]


set1 = set(list1)
print(set1)
set2 = {"cachorro", "gato", "papagaio", "cachorro", "papagaio", "macaco", "galinha"}
print(set2)

> {'Felipe', 'Alfredo', 'Joana', 'Carolina', 'Luiz'}


> {'cachorro', 'papagaio', 'gato', 'galinha', 'macaco'}

Como vimos anteriormente, strings em Python tambm so tratadas como listas.


Desta forma, tambm podemos usar a funo set() para criar um set a partir de
uma string:

set3 = set("papagaio")
print(set3)

> {'g', 'p', 'i', 'a', 'o'}

Sets so muito usados para remover valores duplicados de listas. A forma


usualmente utilizada para isso a do exemplo abaixo:

lista2 = ["Luiz", "Alfredo", "Felipe", "Alfredo", "Joana", "Carolina", "Carolina"]


lista_sem_duplicatas = list(set(lista2))
print(lista_sem_duplicatas)

> ['Felipe', 'Joana', 'Luiz', 'Alfredo', 'Carolina']

Para remover valores de um set, use a funo remove():

45
print(set2)
set2.remove("cachorro")
print(set2)

> {'gato', 'galinha', 'papagaio', 'macaco', 'cachorro'}


> {'gato', 'galinha', 'papagaio', 'macaco'}

Algumas funes para trabalhar com sets


Dentre as funes que tambm funcionam com sets, esto o len(), que retorna a
quantidade de itens no mesmo, e o uso do in para verificar a existncia de um
item no set:

print(len(set2))
print("gato" in set2)
print("elefante" in set2)

> 4
> True
> False

Alm destas, o Python oferece algumas outras funes interessantes para o


trabalho com sets. Vejamos alguns exemplos.

difference() e intersection()
As funes difference() e intersection() retornam, como o nome j diz, a
diferena e a interseo entre dois sets, ou seja, itens que esto em um set e no
esto no outro ou itens que esto nos dois sets:

set4 = {"Luiz", "Alfredo", "Joana", "Felipe", "Mauro"}


set5 = {"Joana", "Carolina", "Afonso", "Carlos", "Mauro"}
print(set4.difference(set5))
print(set4.intersection(set5))

> {'Luiz', 'Felipe', 'Alfredo'}


> {'Joana', 'Mauro'}

copy()
Da mesma forma que vimos para listas, para criar uma cpia de um set, deve-se
utilizar a funo copy(). Criar um novo set apenas utilizando o sinal de igual faz
apenas uma referncia. Primeiro, vejamos como uma simples definio com o sinal
de igual no resolve:

set_backup = set4
print(set_backup)
set4.clear()
print(set_backup)

> {'Mauro', 'Alfredo', 'Felipe', 'Joana', 'Luiz'}

46
> set()

Agora, a forma que funciona:

set4 = {"Luiz", "Alfredo", "Joana", "Felipe", "Mauro"}


set_backup = set4.copy()
print(set_backup)
set4.clear()
print(set_backup)

> {'Alfredo', 'Mauro', 'Luiz', 'Joana', 'Felipe'}


> {'Alfredo', 'Mauro', 'Luiz', 'Joana', 'Felipe'}

Concluso
E assim, terminamos o captulo sobre sets, e tambm acabamos com as estruturas
utilizadas pelo Python para armazenar dados. Vimos como criar sets e utiliz-los
para remover duplicatas de listas. Tambm vimos como manipul-los e algumas
funes interessantes para se utilizar ao trabalhar com sets. No prximo captulo
falaremos sobre Estruturas de Controle.

47
Estruturas de Controle

Estruturas de Controle so utilizadas para organizar e adicionar complexidade um


programa. Elas servem diferentes finalidades, e vamos ver cada uma delas em
detalhes.

If, else e elif


O if uma estrutura de controle que executa um determinado bloco de cdigo
baseado em uma condio. Se a condio estipulada for verdadeira, o bloco logo
abaixo ser executado. Este bloco de cdigo a ser executado deve estar indentado,
ou seja, com espaos em seu incio, e sempre com a mesma quantidade de espaos
(veja o exemplo abaixo para entender), para que o Python possa identificar onde
ele comea e termina. Aps a exibio da mensagem, se voc digitar Felipe, uma
mensagem ser exibida, pois a condio estipulada na definio do bloco if
verdadeira. Caso digite qualquer outra coisa, nada ser exibido. Abaixo, considere
que rodamos o programa duas vezes. Na primeira, digitamos como nome Felipe,
e na segunda, digitamos Maria:

nome = input("Ol, qual o seu nome?\n")


if nome == "Felipe":
print("Ol, %s" % nome)

> Digite aqui seu nome: Felipe


> Ol, Felipe

> Digite aqui seu nome: Maria

Bem, e se eu quiser imprimir outra mensagem caso a condio no seja verdadeira?


Bem, a usamos o else. O else sempre executado se a condio estipulada no if
no for verdadeira:

nome = input("Ol, qual o seu nome?\n")


if nome == "Felipe":
print("Ol, %s" % nome)
else:
print("Ol, visitante")

> Digite aqui seu nome: Felipe


> Ol, Felipe

> Digite aqui seu nome: Maria


> Ol, visitante

48
Por fim, e se quisermos testar mais de uma condio? A temos o elif. Podemos
usar o elif quantas vezes quisermos, para testar quantas condies forem
necessrias. Se nenhuma delas for verdadeira, o bloco else, localizado ao final,
executado:

if nome == "Felipe":
print("Ol, Felipe")
elif nome == "Joo":
print("Oi, Joo")
elif nome == "Carlos":
print("E a, Carlos?")
else:
print("Ol, visitante")

> Digite aqui seu nome: Felipe


> Ol, Felipe

> Digite aqui seu nome: Maria


> Oi, Maria

> Digite aqui seu nome: Carlos


> E a, Carlos?

> Digite aqui seu nome: Marcia


> Ol, visitante

Loops - For
Os loops so estruturas de controle para repetio. Imagine se eu quisesse
escrever um programa que imprima todos os nmeros de 1 a 10, ou que imprima
separadamente cada item de uma determinada lista. Voc poderia criar uma linha
com um print para cada nmero, ou para cada item. Mas isso seria repetitivo,
tedioso. Tem de haver uma maneira melhor de fazer isso. E tm. Para facilitar, o
Python possui o loop for. Este loop itera sobre os elementos de uma sequncia,
executando o cdigo no bloco indentado logo abaixo. Pode ser uma string, uma
lista. Vamos executar o cdigo do exemplo:

lista = ["Alfredo", "Mario", "Jos", "Carolina", "Joana", "Luiza"]


for nome in lista:
print(nome)

> Alfredo
> Mario
> Jos
> Carolina
> Joana
> Luiza

Voc tambm pode iterar sobre dicionrios, mas existem diferentes formas. Como
sabemos, dicionrios possuem pares chave-valor. Desta forma, possvel iterar
sobre apenas um ou sobre os dois. Vamos ver cada uma das formas abaixo:

49
aluno = {"nome": "Maria", "idade": 20, "nota": 9.2}

print("Exemplo 1a - iterando sobre chaves")


for chave in aluno:
print(chave)

print("\nExemplo 1b - iterando sobre chaves")


for chave in aluno.keys():
print(chave)

print("\nExemplo 2 - iterando sobre valores")


for valor in aluno.values():
print(valor)

print("\nExemplo 3 - iterando sobre ambos")


for chave, valor in aluno.items():
print(chave + " - " + str(valor))

> Exemplo 1a - iterando sobre chaves


> nota
> idade
> nome

> Exemplo 1b - iterando sobre chaves


> nota
> idade
> nome

> Exemplo 2 - iterando sobre valores


> 9.2
> 20
> Maria

> Exemplo 3 - iterando sobre ambos


> nota - 9.2
> idade - 20
> nome - Maria

No caso da impresso dos nmeros, podemos usar a funo range(). Ela cria uma
sequncia de nmeros inteiros, podendo receber um ou dois parmetros.
Recebendo um parmetro, ela cria o intervalo que vai de 0, at o nmero passado
na funo, excluindo o prprio nmero. Caso sejam passados dois parmetros, o
intervalo comea no primeiro e termina no segundo:

print("Range com 1 parmetro")


for i in range(5):
print(i)

print("Range com 2 parmetros")


for i in range(3,10):
print(i)

> Range com 1 parmetro


> 0
> 1
> 2
> 3
> 4
> Range com 2 parmetros
> 3

50
> 4
> 5
> 6
> 7
> 8
> 9

Logo, se a ideia for repetir um certo bloco de cdigo um determinado nmero de


vezes, basta usar o range() com o nmero de repeties desejadas. E como voc
pode perceber atravs dos 2 exemplos, o nome que vem aps o for pode ser
qualquer nome que siga as regras de nomenclatura de variveis. Este nome
simplesmente o nome que se dar a cada item dentro da lista, que ser diferente
em cada iterao.

Dois comando importantes presentes nos loops so o break e o continue. Esses


comandos alteram o fluxo natural de um loop. No caso do break, ele para a
execuo do loop. J no continue, ele no executa mais nada naquele ciclo de
iterao e passa para o prximo. Vamos dar uma olhada em um exemplo para que
fique mais claro:

print("Exemplo break")
for i in range(1,11):
if i % 5 == 0:
break
print(i)

print("Exemplo continue")
for i in range(1,11):
if i % 5 == 0:
continue
print(i)

> Exemplo break


> 1
> 2
> 3
> 4
> Exemplo continue
> 1
> 2
> 3
> 4
> 6
> 7
> 8
> 9

No primeiro exemplo, no caso do break, o loop deveria imprimir todos os


nmeros de 1 a 10. Entretanto, inserimos uma condio tal que, se o valor de i
fosse divisvel por 5, ele executaria o comando break. Dessa forma, quando o
valor de i chegou a 5, o comando break foi executado e nada mais foi impresso.

51
A mesma lgica foi seguida no segundo exemplo. Entretanto, ao invs do break,
o comando continue foi executado, fazendo com que o loop pulasse para a
prxima iterao, e no imprimindo o nmero 5.

Loops - while
O loop while semelhante ao for, no sentido que ele leva a repetio de um bloco
de cdigo. Entretanto, ele executa este cdigo enquanto uma certa condio
definida for verdadeira. Vejamos abaixo um exemplo semelhante ao de cima:

contador = 0
while contador < 5:
print(contador)
contador = contador + 1

> 0
> 1
> 2
> 3
> 4

Este exemplo vai imprimindo a varivel contador, e no final do bloco de cdigo,


aumenta seu valor em 1. Conforme a condio, enquanto o contador for menor
que 5, o bloco de cdigo dentro dele ser executado. Quando o valor chega em 5, a
condio no mais verdadeira e o bloco no mais executado.

Tm de se tomar cuidado com o loop while, pois se voc definir uma condio que
nunca se torne falsa, seu cdigo fica executando sem parar. Se no exemplo acima
ns no inclussemos a ltima linha, que incrementa o contador em 1, o cdigo
rodaria para sempre, imprimindo zero infinitas vezes. Caso voc se veja nesta
situao em algum cdigo, basta apertar Ctrl + C, e o cdigo ser interrompido.

Outra possibilidade definir como condio para execuo do loop while True, e
dentro do loop, definir alguma condio onde se execute o break. Vejamos um
exemplo um pouco mais complexo, misturando o while True com uma estrutura
if / else:

while True:
nome = input("Digite seu nome ou sair para terminar o programa: ")
if nome == "sair":
break
else:
print("Ol, %s" % nome)

> Digite seu nome ou sair para terminar o programa: Felipe


> Ol, Felipe
> Digite seu nome ou sair para terminar o programa: Maria
> Ol, Maria
> Digite seu nome ou sair para terminar o programa: sair

52
Concluso
E assim, passamos por todas as estruturas de controle. Vimos como elas permitem
adicionar mais complexidade ao seu cdigo, executando diferentes blocos de
cdigo baseado em determinadas condies ou repetindo blocos de cdigo,
evitando cdigo repetido. No prximo captulo veremos em detalhes uma parte do
Python que j estamos usando desde os primeiros captulos, que so as funes.

53
Funes

Neste captulo entraremos em detalhes sobre como funcionam as funes no


Python. Como j vimos no incio do livro, funes so blocos de cdigo que podem
ser reutilizados quantas vezes forem necessrias, para que voc no tenha que
ficar escrevendo o mesmo cdigo vrias vezes. Funes podem receber ou no
parmetros, para que sejam utilizadas em seu cdigo.

Funes Predefinidas do Python


O Python j vem com muitas funes predefinidas. Algumas delas, j estamos
usando h algum tempo, como len() e print(), por exemplo. Temos tambm
algumas funes presentes em mdulos, que precisam ser importados para serem
utilizados.

Mdulos nada mais so do que cdigos e funes j definidos para serem


empacotados e reutilizados em outros projetos ou outras partes de um mesmo
projeto. Existem mdulos j definidos pelo prprio Python, voc pode criar os seus
ou utilizar mdulos criados por outras pessoas. Mais detalhes sobre mdulos ficam
para um prximo captulo.

Definindo uma funo


A estrutura bsica para definir uma funo atravs da declarao def, depois o
nome da funo e parnteses. Caso a funo no receba parmetros, os parnteses
ficaro vazios. Se receber, os parmetros devem ser nomeados na definio.
Primeiro, vejamos um exemplo de uma funo sem parmetros. Primeiro definimos
a funo, e em seguida a chamamos:

def print_ola_tres_vezes():
print("Ola Python")
print("Ola Python")
print("Ola Python")

print_ola_tres_vezes()

> Ola Python


> Ola Python
> Ola Python

Funes podem ter valores retornados. Definimos o valor a ser retornado pela
funo atravs do comando return. O que retornado pode ou no estar entre

54
parnteses. Vamos ver um exemplo de uma funo com um parmetro e um valor
retornado:

def numero_ao_cubo(numero):
valor_a_retornar = numero * numero * numero
return(valor_a_retornar)

numero = numero_ao_cubo(4)
print(numero)

> 64

Se voc tentar chamar esta funo acima sem o devido argumento, o Python
retornar um erro, como podemos ver abaixo:

numero = numero_ao_cubo()

> Traceback (most recent call last):


> File "11-funcoes.py", line 15, in <module>
> numero = numero_ao_cubo()
> TypeError: numero_ao_cubo() missing 1 required positional argument: 'numero'

Uma das coisas que voc pode fazer definir um valor padro, que ser o valor
daquele argumento se nenhum valor para ele for includo na chamada da funo.
Para definir um argumento padro, definimos o valor padro na hora de definir a
funo, da seguinte forma:

def print_ola(nome="estranho"):
print("Ol, " + nome)

print_ola("Priscilla")
print_ola()

> Ol, Priscilla


> Ol, estranho

Assim, vemos que, se providenciamos o argumento para a funo, ele imprime o


que passado. Se no, ele imprime o nome padro, definido na chamada da
funo.

Voc tambm pode chamar uma funo e nomear os argumentos que est
passando. Este o nico caso onde voc pode passar os argumentos em uma
ordem diferente da ordem definida na criao da funo:

def print_infos(nome, idade):


print("Ol, meu nome %s e tenho %d anos" % (nome, idade)

print_infos(idade=30, nome="Felipe")

> Ol, meu nome Felipe e tenho 30 anos

55
Caso voc no nomeie os argumentos que est passando, eles tm de estar na
mesma ordem em que foram definidos.

args e kwargs
Existe uma forma no Python de definir as funes para que recebam uma
quantidade varivel de argumentos, alm da forma normal de definio de
argumentos. Esta forma atravs da definio de argumentos com um ou dois
asteriscos antes de seus nomes. Por conveno, costuma-se utilizar os nomes *args
e **kwargs, mas no existe uma restrio do Python para que sejam utilizados
apenas estes nomes. Voc pode usar o nome que quiser.

Ambas as formas permitem que seja passado para a funo um nmero qualquer
de argumentos. A diferena entre eles que com um asterisco, ou, por conveno,
*args, estes argumentos no so nomeados, enquanto que se definirmos a funo
com o formato de dois asteriscos, utilizam-se argumentos nomeados na chamada
da funo. Vejamos um exemplo de cada vez:

def print_tudo_2_vezes(*args):
for parametro in args:
print(parametro + "! " + parametro + "!")

print_tudo_2_vezes("Ol", "Python", "Felipe")

> Ol! Ol!


> Python! Python!
> Felipe! Felipe!

Como vemos, no caso do *args, voc pode acessar os parmetros passados como
uma lista. No caso do **kwargs, os argumentos vem em forma de dicionrio, tendo
as mesmas propriedades que vimos anteriormente. Desta forma, para iterar sobre
os argumentos passados, podemos fazer como no exemplo abaixo:

def print_info(**kwargs):
for parametro, valor in kwargs.items():
print(parametro + " - " + str(valor))

print_info(nome="Felipe", idade=30, nacionalidade="Brasil")

> nacionalidade - Brasil


> nome - Felipe
> idade - 30

Por fim, voc pode misturar estas funcionalidades entre si e com argumentos
nomeados. Vejamos apenas um exemplo para finalizar:

56
def print_info(nome, idade, **kwargs):
print("Nome: " + nome)
print("Idade: " + str(idade))

print("\nInformaes adicionais:")
for parametro, valor in kwargs.items():
print(parametro + " - " + str(valor))

print_info(nome="Felipe", idade=30, nacionalidade="Brasil", telefone="999998888")

> Nome: Felipe


> Idade: 30

> Informaes adicionais:


> telefone - 999998888
> nacionalidade - Brasil

Como vimos, a funo acima usa parmetros nomeados, que seriam os padres,
esperados pela funo, alm da funcionalidade do **kwargs para receber
parmetros adicionais.

Concluso
Neste captulo, vimos em detalhes o que so e como trabalhar com funes. As
diferentes formas de definir uma funo, parmetros a serem recebidos, como
chamar uma funo e tambm como passar um nmero varivel de parmetros. No
prximo captulo, falaremos de mdulos.

57
Mdulos

Mdulos so uma forma de organizar o seu cdigo. Basicamente, voc define suas
funes em um arquivo e pode reutiliz-lo facilmente em outros projetos, podendo
inclusive disponibiliz-lo para a utilizao de outras pessoas.

Voc pode definir seus prprios mdulos, utilizar mdulos que j vem com o
Python ou instalar mdulos de terceiros para utilizar em seus projetos. Vamos
comear pela definio de nossos prprios mdulos.

Criando e importando seu primeiro mdulo


Vamos criar nosso primeiro mdulo. Primeiro, salve o cdigo abaixo em seu editor
de texto com o nome modulo_exemplo.py:

def modulo_print():
print("Oi, eu sou a primeira funo dentro do mdulo")

def modulo_print_com_nome(nome):
print("Ol %s, eu sou a segunda funo dentro do mdulo")

Agora, tente rodar o cdigo abaixo em outro arquivo:

modulo_exemplo.modulo_print()
modulo_print()

> Traceback (most recent call last):


> File "12-modulos.py", line 8, in <module>
> modulo_exemplo.modulo_print()
> NameError: name 'modulo_exemplo' is not defined

Voc recebe um erro. O Python no sabe onde procurar por esta funo. Voc a
definiu em outro arquivo (modulo_exemplo.py) e no indicou neste acima onde
esta funo est. E como indicamos? Fazendo um import. O import permite que
voc adicione em um arquivo cdigo que foi definido em outro arquivo. Vamos
fazer na prtica para que fique claro:

import modulo_exemplo

modulo_exemplo.modulo_print()
modulo_exemplo.modulo_print_com_nome("Felipe")

> Oi, eu sou a primeira funo dentro do mdulo


> Ol Felipe, eu sou a segunda funo dentro do mdulo

58
Agora sim, voc pode usar as funes que definiu em seu mdulo, o arquivo
modulo_exemplo.py. Repare que ao fazer o import no devemos colocar o
formato .py ao final do nome do mdulo. Inclumos a extenso .py apenas na
hora de salvar.

Existem duas outras formas de importar uma funo para utilizar em seu cdigo.
Vamos primeira:

from exemplo_modulo import modulo_print

modulo_print()
modulo_print_com_nome("Felipe")

> Oi, eu sou a primeira funo dentro do mdulo


> Traceback (most recent call last):
> File "12-modulos.py", line 15, in <module>
> modulo_print_com_nome("Felipe")
> NameError: name 'modulo_print_com_nome' is not defined

Nesta forma, voc importa apenas a funo que deseja usar. Neste caso, como
vemos, importamos a funo modulo_print() e a chamamos sem precisar colocar o
nome do mdulo e o ponto antes do nome da funo. Repare tambm que ela
importa somente esta funo. Se tentamos usar a outra funo que est definida
no mdulo, temos um erro. Se quisermos usar a outra funo, temos de import-la
tambm.

A outra forma de importar que vou mostrar no recomendada. Vamos ver o


exemplo e depois explico:

from modulo_exemplo import *

modulo_print()
modulo_print_com_nome("Felipe")

> Oi, eu sou a primeira funo dentro do mdulo


> Ol Felipe, eu sou a segunda funo dentro do mdulo

Esta forma uma variao da forma anterior. Nela, o asterisco indica que tudo que
est no mdulo deve ser importado. Parece prtico, mas esta forma nos expe a
srios riscos. E se importarmos outro mdulo, criado por outra pessoa, com uma
funo que tenha o mesmo nome? Em projetos grandes, que utilizem alguns
mdulos, esta situao tem uma chance boa de acontecer. E isto causa todo tipo de
comportamento inesperado em seu programa. Por isso, esta uma forma no
recomendada de importar funes de outros mdulos para seu programa.

59
Como tudo que feito no terminal, voc pode proceder da mesma forma em
arquivo .py, usando import nome_do_modulo ou from nome_do_modulo import
funcao.

Um pouco mais sobre criao e importao


E se eu quiser criar um mdulo em outra pasta. Isso certamente permite uma maior
organizao do seu cdigo e de seus arquivos. Bem, precisamos entender ento,
como o Python procura pelos mdulos quando voc usa o import. Basicamente, o
Python procura da seguinte forma:

1. Primeiro, procura no diretrio atual; este seria o diretrio que contm o


script onde voc est importando o mdulo ou o diretrio no qual voc
iniciou o terminal do Python;
2. Segundo, o Python procura em cada diretrio definido no PYTHONPATH,
que uma varivel do sistema que possui uma srie de diretrios onde
mdulos podem ser encontrados;
3. Por ltimo, o Python checa o diretrio padro da instalao do Python que
est sendo utilizada. No caso do Linux, por exemplo, costuma ser
/usr/local/lib/python;

Para conferir os diretrios presentes no seu PYTHONPATH, basta entrar no


terminal do Python e seguir os comandos abaixo:

import sys
sys.path

Isto ir imprimir uma lista com todos os diretrios presentes no PYTHONPATH. Um


mdulo definido em um destes diretrios ser importado atravs dos mtodos que
vimos acima.

Mdulos do Python
O Python j vem com uma srie de mdulos predefinidos. Para estes, no preciso
definir nada, apenas importar e usar. Um exemplo o mdulo sys, que usamos no
ltimo exemplo e contm funes e parmetros especficos do sistema.

Uma lista completa de mdulos padres do Python pode ser encontrada no


seguinte links:

https://docs.python.org/3/library/

60
Concluso
Neste captulo, vimos como mdulos podem ser utilizados para a melhor
organizao do cdigo. Eles permitem a diviso de um cdigo em arquivos,
permitindo a fcil reutilizao dos mesmos em outros projetos. Vimos tambm
sobre os mdulos padro do Python, como o sys, que possui diversas propriedades
e funes relacionadas ao sistema em si.

61
Programao Orientada a Objetos

Programao Orientada a Objetos uma forma de programar e organizar seu


cdigo. No farei aqui uma explicao detalhada de todos os conceitos, mas vou
mostrar um pouco de como trabalhar desta forma no Python.

Definindo uma classe


Para definir uma classe no Python utilizamos a declarao class e em seguida o
nome da classe. Usamos a declarao def __init__(self) para definir o construtor
da classe, uma funo que ser chamada sempre que uma instncia desta classe for
criada. E podemos ento definir as funes, ou mtodos desta classe. Vamos
definir uma classe de um usurio, com um construtor e uma funo qualquer:

class Usuario:
def __init__(self, nome, email):
self.nome = nome
self.email = email

def diga_ola(self):
print("Ol, meu nome %s e meu email %s" % (self.nome, self.email))

usuario1 = Usuario(nome="Felipe", email="contato@felipegalvao.com.br")

usuario1.diga_ola()
print(usuario1.nome)

> Ol, meu nome Felipe e meu email contato@felipegalvao.com.br


> Felipe

A declarao do __init__ serve para, entre outras coisas, definir as propriedades


que um elemento desta classe ter. Depois, basta definir os mtodos como
funes normais, com a diferena que o primeiro parmetro, na hora da definio,
o self. Ao chamar um mtodo em uma instncia, no h necessidade de incluir o
self. Tanto para acessar propriedades quanto para chamar mtodos, usamos a
instncia, um ponto e o nome do atributo ou do mtodo.

Alterando e acessando propriedades


Voc tambm pode alterar uma propriedade de uma instncia, atravs da simples
redefinio da mesma. Adicionando ao final do cdigo anterior:

usuario1.nome = "Felipe Galvo"


print(usuario1.nome)

62
> Felipe Galvo

Existem tambm funes especficas para manipulao de objetos de uma


determinada classe. So as funes abaixo:

hasattr(objeto, propriedade) - Checa se um objeto possui uma determinada


propriedade;
getattr(objeto, propriedade) - Retorna o valor de uma propriedade do
objeto;
setattr(objeto, propriedade, valor) - Define o valor de uma propriedade do
objeto. Se esta propriedade no existe, ela criada;
delattr(objeto, propriedade) - Remove uma propriedade do objeto.

Continuando o cdigo anterior:

print(hasattr(usuario1, "nome"))
print(hasattr(usuario1, "idade"))
print(getattr(usuario1, "email"))
setattr(usuario1, "nome", "Felipe G.")
setattr(usuario1, "idade", 30)
print(getattr(usuario1, "nome"))
print(getattr(usuario1, "idade"))
delattr(usuario1, "idade")
print(getattr(usuario1, "idade"))

> True
> False
> contato@felipegalvao.com.br
> Felipe G.
> 30
> Traceback (most recent call last):
> File "exemplo_classes_1.py", line 27, in <module>
> print(getattr(usuario1, "idade"))
> AttributeError: 'Usuario' object has no attribute 'idade'

Nas ltimas linhas, vemos que recebemos um erro, pois deletamos uma
propriedade atravs da funo delattr() e depois tentamos recuperar seu valor
com o getattr().

Agora, vamos comentar esta ltima linha que est nos causando este erro, apenas
para que possamos continuar com a execuo dos cdigos que viro frente.

Propriedades de Classe e de Objeto


Vamos voltar um pouco para podermos falar dos tipos de propriedades. As
propriedades que definimos at agora, dentro do __init__(), so as chamadas
propriedades de objeto. Estas so especficas de um determinado objeto daquela

63
classe, como o nome e o email do usurio. Cada usurio ter um nome e email
diferentes.

Entretanto, podemos definir tambm variveis de classe. Estas variveis so


relacionadas classe como um todo. Por exemplo, se quisssemos um contador de
usurios, definiramos uma varivel como contador e poderamos increment-la a
cada novo usurio criado. Vamos alterar nossa classe Usuario ento, para
implementarmos este contador. Depois, vamos criar um novo usurio e verificar se
nosso contador est funcionando adequadamente. Vou colocar toda a definio da
classe e a criao do novo usurio. Mantenha a criao do usuario1 conforme j
fizemos acima e depois rode o cdigo todo:

class Usuario:
contador = 0

def __init__(self, nome, email):


self.nome = nome
self.email = email
Usuario.contador += 1

def diga_ola(self):
print("Ol, meu nome %s e meu email %s" % (self.nome, self.email))

.
.
.

usuario2 = Usuario(nome="Jurema", email="jurema@jurema.com")


print(Usuario.contador)

> 2

Contador funcionando, vamos para o prximo conceito, o conceito de herana.

Herana
Herana a propriedade da programao orientada a objetos atravs da qual uma
determinada classe pode ser estendida a partir de outra, herdando os mtodos e
propriedades desejadas e adicionando outros, mais especficos. Voc tem que
fazer algumas alteraes especficas no mtodo __init__, para que sua instncia
mantenha os atributos da classe original e tenha seus novos atributos especficos.
Vamos criar uma classe Administrador, que ser estendida a partir da classe
Usuario que j definimos. Para definir que uma classe ser estendida a partir de
outra, inclumos a classe original dentro de parnteses da nova, como se fosse um
parmetro. Depois, fazemos as mudanas no __init__(), chamando o __init__()
da classe original e adicionando as propriedades especficas logo aps:

class Administrador(Usuario):

64
def __init__(self, nome, email, chave_de_administrador):
Usuario.__init__(self, nome, email)
self.chave_de_administrador = chave_de_administrador

def poder_administrativo(self):
print("Eu tenho o poder! Minha chave %s" % self.chave_de_administrador)

usuario_adm = Administrador(nome="Admin", email="admin@admin.com",


chave_de_administrador="123456")
usuario_adm.diga_ola()
usuario_adm.poder_administrativo()

> Ol, meu nome Admin e meu email admin@admin.com


> Eu tenho o poder! Minha chave 123456

Veja que o novo usuario_adm tem acesso tanto aos mtodos definidos na classe
Usuario quanto ao mtodo definido na sua prpria classe, Administrador.

Voc tambm pode sobrescrever um mtodo que esteja presente na funo


original. Basta definir o mtodo na nova classe com o mesmo nome da classe
original. Vejamos uma nova classe e vamos sobrescrever o mtodo diga_ola(),
presente na classe original:

class MembroStaff(Usuario):
def __init__(self, nome, email):
Usuario.__init__(self, nome, email)

def diga_ola(self):
print("Ol, meu nome %s e eu sou membro do Staff. Em que posso ajudar?" %
(self.nome))

membro_staff_1 = MembroStaff(nome="Mariazinha", email="maria@zinha.com.br")


membro_staff_1.diga_ola()

> Ol, meu nome Mariazinha e eu sou membro do Staff. Em que posso ajudar?

Concluso
Assim, fechamos o captulo sobre programao orientada a objetos. Vimos como
definir classes, criar novos objetos de uma classe, alterar as propriedades de um
objeto e acess-los. Vimos tambm como o conceito de herana feito no
Python e as particularidades das classes derivadas. No prximo captulo falaremos
sobre data e tempo no Python.

65
Data e Tempo

Neste captulo veremos como trabalhar com datas e tempo no Python. Creio que
no preciso mencionar o quanto isso importante, visto a quantidade de sistemas
que precisa mexer com data e tempo.

Para trabalhar com datas e tempo no Python, usaremos o mdulo datetime, que
j vem definido no Python. Este mdulo possui uma srie de funes que facilitam
nossa vida ao trabalhar com data e tempo.

Data
Para criar datas atravs do mdulo datetime, vamos importar o mdulo e criar
objetos do tipo date. A ideia bem semelhante ao que vimos no ltimo captulo,
de programao orientada a objetos.

Importaremos a classe date e criaremos um objeto que representar uma data,


fornecendo ano, ms e dia, nesta ordem.

from datetime import date

data1 = date(2016, 12, 9)


print(nova_data)

> 2016-12-09

A classe date tambm possui mtodos teis, como o today(), por exemplo. Este
retorna a data atual local, conforme definida no seu sistema:

print(date.today())

> 2016-12-13

Tambm podemos usar o today() para definir uma data atravs do construtor da
classe date, alm de poder recuperar, separadamente, os valores do ano, ms e
dia do objeto, atravs das propriedades year, month e day:

hoje = date.today()

data2 = date(hoje.year, hoje.month, 1)


print(data2)

> 2016-12-01

66
Tambm podemos calcular a diferena entre duas datas, por exemplo, fazendo
uma simples subtrao entre os dois objetos e recuperando o valor conforme a
medida de tempo que se deseja (dias, por exemplo). Vamos usar a funo abs(),
para garantir que teremos um resultado final positivo:

carnaval_2017 = date(2017, 2, 24)


tempo_para_o_carnaval = abs(carnaval_2017 - hoje)
print(tempo_para_o_carnaval.days)

> 73

Como era de se imaginar, temos algums mtodos bem teis e interessantes


definidos na classe date. Vamos ver alguns deles:

weekday() - Retorna o dia da semana de uma data, sendo o 0 a segunda e o 7


o domingo;
replace() - Retorna uma nova data, substituindo apenas os parmetros que
forem passados para este mtodo e mantendo inalterados aqueles que no
forem passados;
strftime() - Retorna uma string com a data de acordo com o formato que for
passado para este mtodo. Para a informao completa com relao
formatao de data, acesse:
https://docs.python.org/3.6/library/datetime.html#strftime-strptime-behavi
or.

E agora vejamos alguns exemplos destes mtodos com um pouco de cdigo:

print(hoje.weekday())

data2 = data2.replace(day=3)
print(data2)

print(data2.strftime("%d/%m/%Y"))

> 1
> 2016-12-03
> 03/12/2016

Tempo
Para trabalhar apenas com tempo, sem controle do dia, ms e hora, temos a classe
time. Funciona de forma bem semelhante classe date, mas seu construtor
recebe apenas as horas, minutos, segundos e microsegundos. Todos tm um valor
padro de zero (0).

67
from datetime import time

tempo1 = time(12, 25, 31, 1333)


print(tempo1)

> 12:25:31.001333

Para acessar suas propriedades, utilizamos o mesmo formato j visto para os


objetos date, mas as propriedades so hour, minute, second e
microsecond representando as horas, minutos, segundos e microsegundos do
objeto time.

Para formatar a exibio de um objeto time, tambm usamos a funo


strftime(), mas com os smbolos de formatao diferentes. Vejamos um exemplo
simples:

print(tempo1.strftime("%H horas, %M minutos e %S segundos"))

> 12 horas, 25 minutos e 31 segundos

Data e Tempo
Quando voc quer ser mais especfico, representando um objeto que registre data
e tempo, use a classe datetime. Esta classe definida no mesmo mdulo
datetime que vimos anteriormente ao trabalhar apenas com datas ou tempo. E sim,
o mdulo tem o mesmo nome da classe.

Aqui, o construtor da classe aceita mistura o das duas classes que j vimos. Ele
recebe ano, ms e dia, que so obrigatrios, alm de valores para horas, minutos,
segundos e microsegundos. Estes, entretanto, so opcionais. O valor padro para
cada um deles zero (0). O formato para a criao :

datetime(ano, mes, dia, hora, minuto, segundo, microsegundo)

Para retornar o momento atual, temos as funes now() e utcnow(). now()


retorna a data atual do sistema, e utcnow() retorna a data atual UTC (GMT 0).

from datetime import datetime

datatempo1 = datetime(2016, 10, 10, 18, 30, 0, 0)


print(datatempo1)

datatempo2 = datetime.now()
print(datatempo2)

> 2016-10-10 18:30:00


> 2016-12-13 09:55:52.278336

68
Da mesma forma que com objetos date, voc pode acessar dia, ms, segundos,
de um objeto datetime atravs das propriedades day, month, seconds, e
assim por diante.

print(datatempo2.minute)
print(datatempo2.second)
print(datatempo2.day)

55
52
13

A maioria das propriedades e muitas das funes que vimos para objetos date
tambm funciona para objetos datetime, como a funo weekday() e a
possibilidade de subtrair dois objetos, por exemplo. A formatao com strftime()
tambm feita da mesma forma, e novamente, voc pode acessar todas as regras
de formatao de data e tempo no seguinte link:

https://docs.python.org/3.6/library/datetime.html#strftime-strptime-behavior

Concluso
E assim terminamos nosso captulo sobre data e tempo. Vimos como usar o
mdulo datetime para trabalhar com data e tempo, os 3 objetos que so usados
para trabalhar com data, data e tempo ou somente tempo, que so os objetos
date, datetime e time. Vimos como criar cada um deles e acessar suas
propriedades separadamente. Por fim, vimos algumas funes teis que funcionam
com os 3 tipos. No prximo captulo veremos um pouco sobre o tratamento de
erros com as Excees.

69
Excees

Excees so uma forma de captar erros e trat-los da maneira que voc achar
melhor em seu cdigo, ao invs de simplesmente retornar uma mensagem de erro
padro do Python.

O try
O tratamento de excees no Python feito atravs de blocos try / except. A
ideia j dada pelo prprio nome. O Python vai tentar executar o bloco de
cdigo indentado sob a declarao try. Se ocorrer algum erro, voc deve definir
blocos except, de exceo, que sero rodados no caso de diferentes tipos de erro.
Vejamos nosso primeiro exemplo, sem qualquer tratamento de excees. Vamos
fazer com que o Python retorne um erro, inserindo um segundo nmero igual a 0.
Isso resultar numa diviso por 0, o que no gera um erro no Python:

print("Vamos dividir dois nmeros inseridos por voc\n")


num1 = input("Insira o primeiro nmero: ")
num2 = input("Insira o segundo nmero: ")

resultado = int(num1) / int(num2)


print("O resultado " + str(resultado))

> Vamos dividir dois nmeros inseridos por voc

> Insira o primeiro nmero: 12


> Insira o segundo nmero: 0
> Traceback (most recent call last):
> File "exemplos_excecoes.py", line 5, in <module>
> resultado = int(num1) / int(num2)
> ZeroDivisionError: division by zero

Bem, temos esta mensagem de erro do Python, que at bem clara com relao ao
erro que temos. Mas se queremos tratar este erro com mais elegncia, vamos
incrementar nosso cdigo com blocos try / except:

print("Vamos dividir dois nmeros inseridos por voc\n")


num1 = input("Insira o primeiro nmero: ")
num2 = input("Insira o segundo nmero: ")

try:
resultado = int(num1) / int(num2)
print("O resultado " + str(resultado))
except ZeroDivisionError:
print("O segundo nmero no pode ser zero")

> Vamos dividir dois nmeros inseridos por voc

70
> Insira o primeiro nmero: 12
> Insira o segundo nmero: 0
> O segundo nmero no pode ser zero

Repare que agora recebemos a mensagem de erro que definimos, sem aquelas
informaes adicionais do Python. Se colocarmos nmeros corretamente, o
resultado sai certo tambm, pois nenhum erro detectado e o bloco de cdigo
dentro do try executado at o fim:

> Vamos dividir dois nmeros inseridos por voc

> Insira o primeiro nmero: 12


> Insira o segundo nmero: 4
> O resultado 3.0

Podemos ter mais de uma exceo. No nosso exemplo, por exemplo, temos que
pensar tambm que o usurio pode colocar um valor diferente de um nmero.
Qual o erro teremos neste caso?

> Vamos dividir dois nmeros inseridos por voc

> Insira o primeiro nmero: felipe


> Insira o segundo nmero: 12
> Traceback (most recent call last):
> File "exemplos_excecoes.py", line 6, in <module>
> resultado = int(num1) / int(num2)
> ValueError: invalid literal for int() with base 10: 'felipe'

Como podemos ver, um erro do tipo ValueError. Vamos incluir esta exceo em
nosso cdigo tambm. Ela vir logo aps da primeira exceo que j definimos.

try:
resultado = int(num1) / int(num2)
print("O resultado " + str(resultado))
except ZeroDivisionError:
print("O segundo nmero no pode ser zero")
except ValueError:
print("Voc deve inserir dois nmeros")

Agora, vamos fazer o teste desta nova exceo:

> Vamos dividir dois nmeros inseridos por voc

> Insira o primeiro nmero: felipe


> Insira o segundo nmero: 12
> Voc deve inserir dois nmeros

Funcionando perfeitamente. Voc pode utilizar quantas excees quiser, pegando


todos os tipos de erro que podem ser cometidos pelo usurio em cada caso. E se eu

71
quiser pegar todos os erros? Basta usar somente o except, sem qualquer definio
do tipo de erro. Mas algumas literaturas no consideram isto como uma boa
prtica, pois ele no identifica a raiz do problema e tambm no permite passar
uma informao mais completa e precisa para o usurio. Mas de qualquer forma,
ficaria assim:

try:
resultado = int(num1) / int(num2)
print("O resultado " + str(resultado))
except:
print("Uma das entradas invlida. Favor inserir dois nmeros, sendo o segundo
diferente que zero")

> Vamos dividir dois nmeros inseridos por voc


>
> Insira o primeiro nmero: 12
> Insira o segundo nmero: 0
> Uma das entradas invlida. Favor inserir dois nmeros, sendo o segundo diferente que
> zero

> Vamos dividir dois nmeros inseridos por voc


>
> Insira o primeiro nmero: felipe
> Insira o segundo nmero: 1
> Uma das entradas invlida. Favor inserir dois nmeros, sendo o segundo diferente que
> zero

No exemplo acima, rodamos o cdigo duas vezes, uma para cada erro que j vimos.
O tratamento para ambos o mesmo, com a mesma mensagem exibida ao usurio.

Vou manter o cdigo anterior, com o tratamento das excees pelo tipo de erro, e
comentar o cdigo acima para prosseguir.

Para ver todos os tipos de exceo, acesse o link abaixo:


https://docs.python.org/3/library/exceptions.html

else e finally
Temos mais duas estruturas que podemos usar com as excees no Python, que
so o else e o finally. O else um bloco final, que roda aps o cdigo no bloco
try rodar sem qualquer erro. Vejamos:

try:
resultado = int(num1) / int(num2)
print("O resultado " + str(resultado))
except ZeroDivisionError:
print("O segundo nmero no pode ser zero")
except ValueError:
print("Voc deve inserir dois nmeros")
else:
print("Diviso feita!")

72
Utilizando os nmeros adequados, veremos a mensagem final ser impressa,
conforme est definido no bloco else. Caso caia na exceo, o else no
executado:

> Vamos dividir dois nmeros inseridos por voc


>
> Insira o primeiro nmero: 12
> Insira o segundo nmero: 3
> O resultado 4.0
> Diviso feita!

> Vamos dividir dois nmeros inseridos por voc


>
> Insira o primeiro nmero: 12
> Insira o segundo nmero: 0
> O segundo nmero no pode ser zero

Repare que o cdigo neste bloco else s executado quando no incorremos em


qualquer exceo, ou seja, o bloco try executado at o final sem qualquer tipo
de erro.

J o finally define um bloco que sempre ser executado, independente de


ocorrer um erro ou do bloco definido no try ter sido executado sem erros.

try:
resultado = int(num1) / int(num2)
print("O resultado " + str(resultado))
except ZeroDivisionError:
print("O segundo nmero no pode ser zero")
except ValueError:
print("Voc deve inserir dois nmeros")
finally:
print("Programa concludo")

Primeiro, sem entrar em uma exceo:

> Vamos dividir dois nmeros inseridos por voc


>
> Insira o primeiro nmero: 12
> Insira o segundo nmero: 3
> O resultado 4.0
> Programa concludo

E agora, entrando em uma exceo:

> Vamos dividir dois nmeros inseridos por voc


>
> Insira o primeiro nmero: 12
> Insira o segundo nmero: 0
> O segundo nmero no pode ser zero
> Programa concludo

73
No importa, o cdigo dentro do bloco finally sempre ser executado. E podemos
usar os dois juntos, tendo um bloco else e um bloco finally aps a definio das
suas condies.

Chamando Excees
Voc tambm pode chamar excees em seu programa, atravs da declarao
raise. Vamos chamar uma exceo em um bloco try se o nome inserido for
Felipe:

nome = input("Qual o seu nome? ")


try:
if nome == "Felipe":
raise NameError("No gostei do seu nome")
print("Ol, %s" % nome)
except NameError:
print("O programa no gostou do seu nome")

Se inserimos um nome qualquer, o bloco try chega at seu final e o bloco


except no executado. Desta forma, vemos apenas a mensagem Ol, nome:

> Qual o seu nome? Jos


> Ol, Jos

Porm, se inserirmos Felipe como nome, uma exceo ser chamada, conforme
est definida dentro do bloco if pela declarao raise, e o bloco except ser
chamado. No veremos, ento, o print que est definido na ltima linha do bloco
try, e sim a mensagem definida no bloco except NameError:

> Qual o seu nome? Felipe


> O programa no gostou do seu nome

Concluso
Conclumos assim o captulo sobre excees e tratamento de erros. Assim, seu
programa pode passar informaes ao usurio de forma mais elegante, prevendo
os possveis erros cometidos pelo usurio e passando mensagens informativas para
o usurio caso ocorram.

74
Arquivos

Neste captulo, veremos como possvel usar o Python para trabalhar com
arquivos. O Python tem funes para ler, gerar e escrever em arquivos, e veremos
cada uma delas.

A funo open()
Esta a funo mais primria para se trabalhar com arquivos. Ela serve, como o
nome j denuncia, para abrir arquivos. Ela recebe dois parmetros, o nome do
arquivo e o modo de abertura. O modo indica o que voc pode e no pode fazer
com o arquivo. A tabela abaixo lista os principais modos:

Modo Descrio

r Abre o arquivo apenas para leitura

w Abre o arquivo apenas para escrita. Se existe um arquivo com o nome


especificado, este ser apagado e um novo ser criado

a Abre o arquivo para acrescentar a ele. Tudo que for escrito no


arquivo adicionado ao final dele

r+ Abre o arquivo tanto para leitura quanto para escrita

Estes so os mtodos mais utilizados, apesar de termos outros mtodos, cuja lista
completa pode ser encontrada no seguinte link:
https://docs.python.org/3.6/library/functions.html#open

Vamos ento abrir um arquivo de texto. Criei um arquivo txt com alguns nomes de
pessoas aleatrios, se quiser pode baixar aqui, ou, se no quiser, pode criar o seu
mesmo:
https://drive.google.com/file/d/0B46dernCkjj7YjFOSVBSWlhUa2s/view?usp=sharin
g

Vamos ento criar nosso arquivo .py com o cdigo para ler este arquivo:

file = open("nomes.txt", "r")


print(file.read())

> Felipe
> Carolina

75
> Joana
> Jos
> Alfredo
> Afonso
> Jlio
> Ana
> Joelma
> Flash Gordon
> Vanderlei
> Maria Claudia

Passando um nmero inteiro para a funo read(), ns podemos definir a


quantidade de caracteres a serem retornados na leitura. Atentem ao detalhe que o
objeto file guarda a uma determinada posio dentro do arquivo (pense como
um ponteiro do Microsoft Word, que indica onde voc est escrevendo / lendo). Ao
abrir o arquivo, esta posio 0, ou seja, o primeiro caractere do arquivo. Aps usar
a funo read(), o ponteiro se move para o ltimo caractere. Ento, aps a
primeira leitura, vamos abrir o arquivo novamente para fazer a leitura a partir do
comeo:

file = open("nomes.txt", "r")


print(file.read(10))

> Felipe
> Car

A funo readline() l uma nica linha do arquivo. Caso voc siga repetindo a
funo, a mesma vai lendo as linhas seguintes do arquivo:

file = open("nomes.txt", "r")


print(file.readline())
print(file.readline())
print(file.readline())

> Felipe
>
> Carolina
>
> Joana

Bem semelhante, a funo readlines() retorna uma lista, sendo cada item uma linha
do arquivo lido:

file = open("nomes.txt", "r")


print(file.readlines())

> ['Felipe\n', 'Carolina\n', 'Joana\n', 'Jos\n', 'Alfredo\n', 'Afonso\n', 'Jlio\n',


'Ana\n', 'Joelma\n', 'Flash Gordon\n', 'Vanderlei\n', 'Maria Claudia']

Desta forma, voc pode iterar sobre as linhas e process-las da forma que desejar.

76
Escrevendo em um arquivo
Vamos agora escrever em um arquivo, usando para isso o modo w na funo
open(), conforme vimos mais acima. Depois, usamos a funo write() para
escrever no arquivo aberto. Alm disso, tambm importante lembrar de fechar o
arquivo com a funo close(). O Python faz isso para ns ao final de um programa,
mas uma boa prtica fechar o arquivo aps us-lo. Vamos escrever duas linhas de
texto qualquer:

file = open("novo_arquivo.txt", "w")


file.write("Testando, testando!\n")
file.write("Mais uma linha para testar")
file.close()

Agora, verifique na mesma pasta onde est salvo o seu arquivo .py, e, se tudo
correu bem, deve existir um arquivo com o nome novo_arquivo.txt e com o
mesmo contedo que escrevemos dentro das funes write().

Agora, vamos escrever outro texto em um arquivo de mesmo nome, apenas para
confirmar que a abertura do arquivo neste modo sobrescreve o arquivo definido:

file = open("novo_arquivo.txt", "w")


file.write("Novo texto, mesmo arquivo")
file.close()

E certamente, ao abrir o arquivo novo_arquivo.txt, encontraremos apenas o


contedo que definimos na funo write() nesta segunda vez em que abrimos o
arquivo.

Adicionando a um arquivo
Vamos agora adicionar texto a um arquivo j existente. Para isso, vamos abrir o
arquivo no modo a. Podemos usar o arquivo que criamos no ltimo exemplo,
novo_arquivo.txt. A funo neste modo a mesma usada para novos arquivos,
write():

file = open("novo_arquivo.txt", "a")


file.write("\nTexto adicionado ao arquivo com o modo a")
file.close()

Agora, ao abrir novo_arquivo.txt, voc ver que a linha acima foi adicionada no
final do mesmo.

77
Abrindo no modo r+
O modo r+ permite tanto a leitura quanto a escrita em arquivos. A posio inicial
ao abrir o arquivo neste modo 0, de forma que qualquer coisa que seja escrita
sem que se mova a posio substituir o que est no comeo.

Voc pode alterar a posio atravs da funo seek(), fornecendo a posio para
a qual voc deseja alterar:

file = open("novo_arquivo.txt", "r+")


file.write("Testando r+")
file.seek(10)
file.write("Novo teste do r+")
file.close()

Veja agora como o contedo do arquivo est meio misturado. Primeiro, abrimos no
modo r+ e j escrevemos, substituindo o contedo no incio do arquivo. Depois,
usamos a funo seek() para mudar nossa posio para 15. E ento escrevemos
novamente, substituindo mais uma parte do contedo que j existia no arquivo.
Podemos usar o seek() novamente para retornar para a posio 0 e ento ler o
arquivo.

file.seek(0)
print(file.read())
file.close()

> Testando r+ mesNovo teste do r+ adicionado ao arquivo com o modo a

Concluso
E assim terminamos o captulo sobre arquivos. Vimos como criar, ler e manipular
arquivos com o Python, escrevendo e adicionando contedo a eles. Como a funo
open() e o modo de abertura definem o que pode e o que no pode ser feito com o
arquivo, e como navegar em um arquivo aberto com a funo seek().

78
Palavras Finais

E assim, esse livro chega ao fim. Espero ter conseguido passar um pouco de
contedo legal para vocs que chegaram at aqui. Acho que com o que foi
passado, d para se ter uma boa noo da linguagem Python.

Caso queiram entrar em contato, basta ver como em: http://felipegalvao.com.br/

E agora?
Bem, agora voc pode alar vos mais altos. O que te interessa? Voc pode pegar o
que aprendeu de Python e aplicar em estudos posteriores. Algumas sugestes
baseado no que o Python pode fazer:

Desenvolvimento Web
Django - https://www.djangoproject.com/
Flask - http://flask.pocoo.org/
Pyramid - https://trypyramid.com/
Anlise de Dados, Cincia de Dados e Computao Cientfica
Propaganda sem vergonha - No meu blog tem uma srie de posts
sobre como comear com anlise de dados usando Python:
http://felipegalvao.com.br/blog/ciencia-de-dados-com-python-basico
/
pandas (anlise de dados) - h ttp://pandas.pydata.org/
Numpy (computao cientfica) - h ttp://www.numpy.org/
SciPy (programao cientfica) - h ttps://www.scipy.org/
scikit-learn (Machine Learning) - h ttp://scikit-learn.org/stable/
BioPython (programao para biologia) - https://biopython.org/
Programao para Desktop
Camelot - h ttp://www.python-camelot.com/
PySide - http://wiki.qt.io/PySide
tkinter - https://docs.python.org/3/library/tkinter.html
Programao multiplataforma
Kivy - https://kivy.org/#home
Desenvolvimento de Jogos
Pygame - h ttp://pygame.org/hifi.html
Panda3D - h ttp://www.panda3d.org/

79
Pesquise o que mais te interessa, material no falta pela Internet. Python tem boas
bibliotecas para praticamente tudo.

80