Página 1
Página 1
br
[email protected]
Página 1
Página 2
Curso Python para Todos
Sumário
Introdução............................................................................................................................................... 8
Sobre os instrutores ............................................................................................................................ 8
Evaldo do Rosario Wolkers ............................................................................................................. 8
Louis Fernando Littig Wolkers......................................................................................................... 8
Currículo de Lançamento do Curso..................................................................................................... 9
Por que Python?.................................................................................................................................. 9
Instalação .............................................................................................................................................. 10
Qual versão utilizar? ......................................................................................................................... 10
Instalando o Python no Windows ..................................................................................................... 10
Instalando o Python no Linux............................................................................................................ 12
Executando o primeiro código .............................................................................................................. 13
Usando o interpretador do Python ................................................................................................... 13
Criando o primeiro arquivo e executando pelo terminal ou prompt de comando .......................... 14
Utilizando o IDLE Shell ...................................................................................................................... 16
Escolhendo e utilizando uma IDE ...................................................................................................... 18
Instalando o PyCharm no Windows .............................................................................................. 18
Instalando o PyCharm no Linux .................................................................................................... 25
Usando um interpretador online ...................................................................................................... 28
Conceitos básicos .................................................................................................................................. 28
Blocos de Código ............................................................................................................................... 28
Objetos .............................................................................................................................................. 29
Atributos ....................................................................................................................................... 29
Métodos ........................................................................................................................................ 29
Comentários de código ..................................................................................................................... 30
Operações Matemáticas ................................................................................................................... 30
Variáveis e tipos de dados .................................................................................................................... 31
Nomes de variáveis ........................................................................................................................... 32
Atribuição .......................................................................................................................................... 32
Variáveis numéricas .......................................................................................................................... 33
Função print().................................................................................................................................... 34
Variáveis do tipo lógico e operadores relacionais ............................................................................ 35
Operadores lógicos e expressões lógicas .......................................................................................... 36
Variáveis do tipo string ..................................................................................................................... 39
Tipagem estática e dinâmica............................................................................................................. 40
Entrada de dados e conversão de dados .......................................................................................... 43
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 3
Curso Python para Todos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 7
Curso Python para Todos
Introdução
Esta apostila é disponibilizada aos alunos do Curso Python para Todos como ferramenta para
acompanhamento das aulas, podendo ser impressa e distribuída livremente.
Sobre os instrutores
Lua Python
Ruby
C
Java
Python
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 8
Curso Python para Todos
• Python é uma linguagem de programação que permite trabalhar mais rapidamente e integrar
os seus sistemas de forma mais eficaz.
• Python é poderoso... e rápido;
• corre em todos lugares;
• é amigável e fácil de aprender;
• é Open Source.
• Estas são algumas das razões pelas quais as pessoas que usam Python preferem não usar outra
coisa.
• Linguagem mais popular para ensino introdutório em universidades dos EUA.
• É a quarta linguagem mais popular atrás dos antigos clássicos Java, C, C++.
• Fácil de usar, poderoso, versátil, sendo uma ótima opção para iniciantes e especialistas em
programação.
• A legibilidade do Python faz dele uma grande primeira linguagem de programação.
• Permite que você pense como um programador sem perder tempo com sintaxes misteriosas
como em outras linguagens.
Veja a simplicidade do Python comparado ao Java para imprimir a frase “Olá Mundo!”.
Java Python
public class Main { print(‘Olá Mundo!’)
public static void main(String[] args) {
System.out.println("Olá Mundo!");
}
}
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 9
Curso Python para Todos
Instalação
Python 3
Python 2
Python 3.0 foi lançado em 2008. A versão final 2.x, que foi a versão 2.7 saiu em meados de 2010. A
ramificação 2.x não verá novos lançamentos principais depois disso. 3.x está em desenvolvimento
ativo e já viu mais de cinco anos de lançamentos estáveis, incluindo a versão 3.3 em 2012, 3.4 em
2014, 3.5 em 2015 e 3.6 em 2016. Isso significa que todas as melhorias recentes da biblioteca padrão,
por exemplo, estão disponíveis somente por padrão no Python 3.x.
Basicamente a resposta é: Se você vai iniciar um projeto, use Python 3, porque é o presente e será o
futuro.
O Python 2 foi mantido devido a sistemas antigos que foram desenvolvidos nesta versão. Porém, estes
sistemas devem ser migrados o quanto antes para o Python 3 porque o suporte ao Python 2 terá fim
no ano de 2020.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 10
Curso Python para Todos
Após baixar o arquivo de instalação e executá-lo, será exibida uma janela de confirmação como a
janela a seguir:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 11
Curso Python para Todos
Você pode fechar esta janela. Pronto, o Python está instalado em seu sistema.
Abra o prompt de comando do Windows e digite python, caso tudo tenha ocorrido corretamente,
você verá uma tela como a seguir. Esta é a tela do interpretador interativo do Python.
O Linux Mint, usado no curso, em sua versão 19.1 vem com o Python 2.7.15 e o Python 3.6.7
instalados. Para executar o Python 2, basta digitar “python” (sem as aspas) no terminal, porém, para
executar o Python 3, devemos executar “python3” (sem as aspas).
Vamos instalar o Python 3.7.2 no Linux Mint 19.1.
Primeiro vamos instalar os pré-requisitos:
$ sudo apt-get install build-essential checkinstall
$ sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev \
libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev
O “$” representa o prompt do terminal Linux e a “\” no segundo comando indica que o comando
continua na linha seguinte.
Após instalar os pré-requisitos, vamos fazer download do Python 3.7.2 e realizar sua instalação. Vamos
acessar a pasta /usr/src, baixar o instalador do Python compactado para esta pasta, vamos realizar a
descompactação usando o comando tar, em seguida vamos entrar na pasta criada “Python-3.7.2”,
vamos executar o comando configure e por fim, vamos instalar com “make altinstall”. O “make
altinstall” é usado para impedir a substituição do arquivo binário Python padrão /usr/bin/python.
$ cd /usr/src
$ sudo wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz
$ sudo tar xzf Python-3.7.2.tgz
$ cd Python-3.7.2
$ sudo ./configure --enable-optimizations
$ sudo make altinstall
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 12
Curso Python para Todos
Ao entrar no interpretador você verá o prompt do interpretador Python representado por três sinais
de maior “>>>”. Neste momento podemos começar a informar os comandos Python.
Veja um exemplo:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 13
Curso Python para Todos
Mais à frente você entenderá o que foi feito nesta tela, a princípio, entenda que podemos usar o
interpretador interativo do Python para digitar os nossos comandos e, após pressionar o ENTER,
veremos o resultado automaticamente.
No Linux usamos o terminal e acessamos o modo interativo também digitando “python”, sem as aspas.
Para sair do modo interativo podemos utilizar o comando quit() ou exit(), desta forma, voltamos ao
prompt de comandos no Windows, ou ao terminal no Linux.
O modo interativo é útil para execução de códigos enquanto estamos estudando a linguagem.
Nossos programas serão escritos em forma de arquivos e executados diretamente pelo interpretador.
Clique em “File / Arquivo”, depois em “Save / Salvar”, informe o nome do arquivo como “exemplo.py”,
com as aspas, pois por padrão o bloco de notas salva o arquivo com a extensão txt. Em “Encoding /
Codificação”, selecione “UTF-8”, defina um local de fácil localização para salvar o arquivo, pois
precisaremos acessar o arquivo via prompt de comando ou terminal em seguida.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 14
Curso Python para Todos
Se você não tiver muita familiaridade com o prompt de comando do Windows ou o terminal Linux,
sugiro que faça meu curso “Terminal Linux e Prompt de Comando do Windows”, que é um curso
gratuito disponível em:
https://www.udemy.com/terminal-linux-e-prompt-de-comando-do-windows
No Linux, da mesma forma, você escreve o programa em um editor de texto, salva e executa com o
comando “python nomedoarquivo.py”. Como instalamos o Python 3.7.2, usaremos “python3.7
nomearquivo.py”.
Veja o arquivo sendo criado e salvo.
Características:
• Codificado 100% em Python, usando tkinter GUI Toolkit;
• Multi-plataforma -> Linux, Windows e macOS;
• Janela de Shell Python (interpretador interativo) com cores para o código de entrada, saída e
mensagens de erro;
Editor de texto com múltiplas janelas, cores para código Python, recuo inteligente, dicas de chamada,
auto-complete, e outras funcionalidades como pesquisar em qualquer janela, substituir dentro das
janelas do editor e pesquisar por múltiplos arquivos de debug com breakpoints persistentes, stepping
e visualização de configurações e namespaces, navegadores e outros diálogos.
Você pode abrir o IDLE Shell através da opção “IDLE (Python 3.7 64-bit)“ que fica dentro da pasta
“Python 3.7” no menu iniciar do Windows:
No Linux, como foi instalado o Python 3.7.2, o IDLE pode ser acessado através do seguinte comando:
$ idle3.7
Podemos usar o IDLE da mesma forma que utilizamos o interpretador Python, informando os
comandos e obtendo as respostas ao pressionar ENTER:
Observe que o IDLE possui uma cor para diferenciar o resultado, a entrada de dados, os erros.
Podemos alterar configurações do IDLE através do menu “Options”, opção “Configure IDLE”.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 17
Curso Python para Todos
Assim como o interpretador Python, o IDLE Shell não é muito indicado para desenvolvimento no dia a
dia. Para desenvolver aplicações no dia a dia, você irá preferir utilizar uma IDE, ou seja, um ambiente
de desenvolvimento integrado, o que veremos a seguir.
Figura 21 - PyCharm
No momento da elaboração deste conteúdo, a versão para Windows era a 2018.3.2, disponível em:
https://download-cf.jetbrains.com/python/pycharm-community-2018.3.2.exe
E a versão para Linux, disponível em:
https://download-cf.jetbrains.com/python/pycharm-community-2018.3.2.tar.gz
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 18
Curso Python para Todos
Caso o Windows mostre uma outra tela, confirme, clicando em “Yes / Sim”. Em seguida será exibida a
tela de boas-vindas.
Ao clicar em “Next” na tela de boas-vindas, será exibida uma tela para escolha do local de instalação.
Deixe o local padrão que foi sugerido e clique em “Next” novamente.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 19
Curso Python para Todos
Marque a opção para vincular arquivos com a extensão“py”, assim quando dermos dois cliques em
um arquivo py no gerenciador de arquivos do Windows, o mesmo será aberto com o PyCharm
Por fim, marque a opção para baixar e instalar o Java da Jetbrains para que o PyCharm o utilize.
O PyCharm foi desenvolvido em Java, sendo assim, precisa da máquina virtual Java para funcionar.
Caso já tenha certa experiência e tenha o Java instalado, não é necessário escolher esta opção. Clique
em Next.
Na última tela é solicitada a seleção da pasta para criação dos atalhos. Deixe o padrão e clique em
“Install”.
Ao término da instalação você pode reiniciar o computador, ou informar que irá reiniciar
posteriormente, após esta escolha, clique em “Finish”.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 20
Curso Python para Todos
Você poderá executar o PyCharm através do menu iniciar do Windows, dentro da pasta JetBrains.
Para criar um projeto PyCharm clique em “Create New Project / Criar Novo Projeto”, será exibida a
tela a seguir.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 21
Curso Python para Todos
Nesta tela temos que informar a localização e o nome do projeto que vamos criar. Eu mantive na pasta
padrão e chamei o projeto de “teste” (conforme está na imagem).
Clique na opção “Project Interpreter / Interpretador do Projeto”, marque a opção “Existing interpreter
/ Interpretador existente”, pois vamos selecionar o interpretador do Python 3.7.2 para nosso projeto.
Para selecionar o interpretador, cilque no botão com reticências ao lado da caixa “Interpreter: /
Interpretador:”.
Na janela seguinte, escolha “System Interpreter / Interpretador do Sistema”. À direita será exibida
uma caixa com o interpretador Python 3.7.2 que foi instalado no sistema.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 22
Curso Python para Todos
Falaremos sobre ambientes virtuais no futuro, mas por enquanto, você irá configurar o interpretador
do sistema.
Após criar o projeto você estará na janela principal do PyCharm.
Para criar nosso primeiro arquivo Python no PyCharm, basta clicar com o botão direito na pasta do
projeto “teste”, escolher “New / Novo” e por fim “Python File / Arquivo Python”, conforme imagem a
seguir.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 23
Curso Python para Todos
Ao clicar nesta opção, será solicitado o nome do arquivo. Informe teste conforme imagem a seguir.
Pode informar também teste.py, mas o py não é necessário porque o PyCharm coloca o py quando
criamos um arquivo Python.
Ao clicar em OK, o arquivo será exibido no PyCharm. Você já pode começar a escrever seu programa.
Para executar o programa, pressione Ctrl + Shift + F10, ou clique com o botão direito do mouse na aba
que exibe o nome do arquivo e escolha a opção “Run ‘nome_arquivo’”, que no caso é “Run ‘teste’”.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 24
Curso Python para Todos
O resultado será exibido na parte inferior da janela do PyCharm conforme imagem a seguir.
Após baixar o instalador para Linux, devemos acessar a pasta onde o arquivo foi salvo e descompactar
o arquivo usando o comando a seguir.
$ tar xzf pycharm-community-2018.3.2.tar.gz
Após descompactar será criada a pasta pycharm-community-2018.3.2.
Devemos entrar nesta pasta com o comando “cd pycharm-community-2018.3.2”.
Em seguida devemos entrar na pasta bin com o comando “cd bin”.
Em seguida devemos executar o instalador com o seguinte comando:
$ sh pycharm.sh
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 25
Curso Python para Todos
Será exibida uma tela perguntando se desejamos importar configurações existentes, deixe marcada
a opção para não importar e clique em OK.
Em seguida será exibida uma solicitação de envio de estatísticas de uso. Você pode aceitar enviar estes
dados ou não.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 26
Curso Python para Todos
Na janela seguinte, marque a opção para criar um script para abrir arquivos direto do terminal com o
comando “charm arquivo.py” ou simplesmente “charm” (sem as aspas) para abrir o PyCharm.
Na próxima tela é possível instalar alguns plug-ins, mas isso não é necessário, pode clicar em “Start
using PyCharm / Comece a usar o PyCharm”.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 27
Curso Python para Todos
Caso você não queira instalar um ambiente em seu computador para começar a escrever seus
primeiros códigos, saiba que existem alternativas online.
Basta fazer uma busca no Google por “Interpretador Python online” que serão exibidos vários
resultados.
São alternativas para quem está começando no mundo da programação poder escrever pequenos
códigos e executar no browser.
Conceitos básicos
Blocos de Código
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 28
Curso Python para Todos
Objetos
Atributos
carro.combustivel = gasolina
carro.farol = aceso
Métodos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 29
Curso Python para Todos
carro.andar(frente)
Carro.virar(direita)
Tudo no Python é considerado objeto. No curso teremos uma seção completa somente sobre
Orientação a Objetos.
Comentários de código
Para comentar várias linhas não é necessário colocar um “#” em cada uma das linhas. Para isso
usamos três aspas como delimitador “”” ou ‘’’.
As três aspas são as docstrings que são usadas para documentar o código.
Este curso tem uma seção sobre documentação.
Veja na imagem abaixo que o código é executado sem erros, o Python apenas reproduz o texto do
comentário no resultado.
Operações Matemáticas
Podemos usar o interpretador do Python como se fosse uma calculadora para realizar operações
matemáticas. Por exemplo, se você digitar 10 + 10, como no exemplo abaixo e der um ENTER, ele vai
realizar a soma e exibirá 20.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 30
Curso Python para Todos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 31
Curso Python para Todos
Nomes de variáveis
Ao criar uma variável, é uma boa prática que a mesma tenha um nome que condiz com seu conteúdo,
como por exemplo: salario, valor_aluguel, preco_produto. Assim, outras pessoas entenderão mais
facilmente do que se trata a variável quando forem dar manutenção no código.
Apesar do Python permitir, não é uma boa prática criar variáveis acentuadas, pois, muitas outras
linguagens não permitem, sendo assim, caso você for escrever um programa em outra linguagem, não
terá o costume de acentuar, evitando assim, possíveis erros.
Além de nome e conteúdo uma variável possui outras propriedades, sendo uma delas o tipo que
define a natureza dos dados que ela armazena.
Python possui vários tipos de dados.
Em capítulos futuros vamos detalhar estes tipos de dados que as variáveis podem armazenar.
Atribuição
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 32
Curso Python para Todos
Figura 56 - Atribuição
Figura 57 - Atribuição
Veja no exemplo a seguir onde o texto “Olá, eu sou um texto!!!” está sendo atribuído à variável
denominada “fala” e o valor 55 à variável denominada “número”.
Figura 58 – Atribuição
Variáveis numéricas
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 33
Curso Python para Todos
Função print()
Até agora usamos a função print, mas não detalhamos seu funcionamento.
Usamos a função print para exibir uma informação ao usuário do nosso sistema.
Por exemplo, se quisermos exibir uma frase como esta: "Olá, tenha um bom dia", usamos desta forma:
O texto entre as aspas é chamado de "string", uma string é simplesmente um texto (você verá mais
detalhes quando falarmos de tipos de dados).
Se quisermos imprimir o conteúdo de uma variável, também podemos usar o print, por exemplo, se
você tem uma variável chamada total que possui o valor 25, pode imprimir seu conteúdo assim:
E se você quiser juntar texto com variável, para imprimir por exemplo, "O valor da bicicleta é 500",
onde este “500” não será digitado, mas estará dentro de uma variável. Pode fazer assim:
O Python junta o texto e o conteúdo da variável já acrescentando espaços, por isso depois do "é" não
coloquei espaço.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 34
Curso Python para Todos
Como você pôde ver, podemos imprimir diversos valores, sejam textos, sejam variáveis, passando
estas informações separadas por vírgula para o comando print.
Se você não quer separar usando espaço, você pode modificar o caracter separador acrescentando o
parâmetro “sep”, passando o texto que quer usar como separador. Desta forma:
Neste exemplo eu coloquei um ponto e vírgula e um parênteses “;)” como separador. Sendo assim,
entre “Olá”, 10, 25.8 e “Teste”, haverá um “;)” em vez de um espaço.
Variáveis do tipo lógico são também conhecidas como variáveis booleanas. Elas armazenam apenas
dois valores, que são:
• Verdadeiro = True
• Falso = False
Exemplo de código com seu resultado:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 35
Curso Python para Todos
Veja um exemplo de código onde estão sendo feitas algumas comparações e o resultado:
Operadores lógicos são operadores utilizados para agrupar operações com lógica booleana.
Python suporta três operadores básicos:
• Não (not) → Negação ¬
• E (and) → Conjunção ꓥ
• Ou (or) → Disjunção ꓦ
Cada operador obedece a um conjunto simples de regras, expresso pela tabela verdade deste
operador.
A tabela verdade demonstra o resultado de uma operação com um ou dois valores lógicos ou
operandos.
Quando o operador utiliza apenas um operando, dizemos que é um operador unário. Ao utilizar dois
operandos, é chamado de operador binário.
O operador “not” (não/negação) é um operador unário, já os operadores or “ou” e and “e” são
operadores binários, precisando, assim, de dois operandos.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 36
Curso Python para Todos
O operador not (não) precisa de apenas um operando. A operação de negação também é chamada de
inversão, porque um valor verdadeiro negado se torna falso e vice-versa.
Tabela verdade do operador not (não)
V1 not V1
V F
F V
Figura 70 - Operador E
Figura 71 - Operador E
O operador or (ou) resulta falso apenas quando seus dois operandos forem falsos.
F V V
F F F
Figura 72 - Operador OR
Exemplo:
Salário = 937 e idade = 20
Salário > 1000 and idade > 18
937 > 1000 and 20 > 18
False and True
False
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 38
Curso Python para Todos
Podemos acessar o conteúdo de uma string caractere a caractere. Sabendo o tamanho da string,
podemos acessar seus caracteres usando um número inteiro para representar a posição de um
determinado caractere.
O índice dos caracteres de uma string inicia com zero.
Veja o que acontece quando usamos um índice inexistente. A variável possui o tamanho 17, ou seja,
possui 17 caracteres. Então o índice vai de zero à 16. O índice 17 não existe, por isso a mensagem de
erro:
“Índice da string fora da faixa”.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 39
Curso Python para Todos
Um sistema de tipos é um conjunto de regras que atribuem uma propriedade chamada de tipo para
várias construções que um programa de computador é composto (variáveis, expressões, funções ou
módulos).
Uma linguagem de programação pode ser classificada de acordo com o seu sistema de tipos.
Vamos entender o que é linguagem de tipagem estática e linguagem de tipagem dinâmica.
Em uma linguagem de tipagem estática é feita uma verificação dos tipos usados em dados e
variáveis para garantir que se está usando um tipo de dados que é esperado em todas as situações.
O compilador oferece algumas garantias que alguns problemas não irão ocorrer após o programa
passar por esta verificação. Os erros são verificados antes do sistema ser executado. Mas isso não te
salva de todos os erros que podem acontecer.
O compilador deve conhecer o tipo de uma variável ou método antes da execução do programa. O
tipo de uma variável é explicitamente declarado. Uma variável não pode mudar seu tipo em tempo
de execução.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 40
Curso Python para Todos
Em uma linguagem de tipagem dinâmica, também há uma verificação, mas somente em cima dos
dados, já que uma variável pode conter qualquer tipo de dado.
É dada ao programador a responsabilidade de realizar testes para garantir que todos os tipos estão
corretos nos momentos certos.
O tipo de uma variável ou método é desconhecido até a execução do programa.
Exemplo de linguagens de tipagem dinâmica: Python, Perl, Ruby, PHP, Lisp.
Exemplo de código Python:
Python é uma linguagem fortemente tipada. Isso quer dizer que o interpretador do Python avalia as
expressões e não faz coerções automáticas entre tipos de dados não compatíveis.
O Python não converte automaticamente os tipos de dados, fazendo com que o resultado seja mais
consistente.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 41
Curso Python para Todos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 42
Curso Python para Todos
JavaScript é uma linguagem de tipagem fraca. Isso quer dizer que o JavaScript faz coerção de tipos
ao executar operações de forma automática.
Até esta aula em nossos exemplos, as variáveis receberam valores fornecidos diretamente no código-
fonte. Vou mostrar agora como capturar dados informados pelo usuário. Desta forma, o mesmo
programa poderá ser usado diversas vezes com valores fornecidos a cada execução. Entrada de dados
é o momento em que o programa recebe dados ou valores através de dispositivos de entrada como
teclado ou através de um arquivo em disco.
Para solicitar informações ao usuário usamos a função input.
A função input possui um parâmetro do tipo string que é a mensagem a ser exibida ao usuário e
retorna também uma string que é a resposta fornecida pelo usuário.
resposta = input(“Mensagem a ser exibida”)
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 43
Curso Python para Todos
Ao tentar somar uma variável do tipo inteiro com uma string obtemos o erro TypeError (Erro de tipo).
Figura 90 - TypeError
Figura 91 - TypeError
Para converter o valor informado pelo usuário em um inteiro usamos a função int.
Para converter em um valor com decimais usamos a função float.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 44
Curso Python para Todos
Concatenação
Concatenar é unir strings. Como se estivéssemos “somando” os textos. Para concatenar usamos o
operador de adição “+”.
Você pode usar o operador de multiplicação “*” sobre uma string e informar quantas vezes ela vai se
repetir.
Composição é a forma de juntar vários conteúdos em uma única string. Estes conteúdos podem ser
outras strings ou até de outros tipos de dados.
A interpolação é mais eficiente no uso de memória que a concatenação convencional.
O operador “%”, denominado “marcador de posição”, é usado para definir o local onde será inserido
o conteúdo na string.
Composição ou Interpolação
Onde estes símbolos forem colocados dentro de uma string, serão substituídos pelos valores
informados.
Usando %s para compor strings:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 46
Curso Python para Todos
Figura 99 - Arredondamento
Pode ficar melhor? Sim, no Python 3.6 foi criado o recurso de f-strings ou Literais de strings
formatadas.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 47
Curso Python para Todos
A posição inicial (x) é incluída no resultado, porém, a posição final (y) não é incluída.
Se os índices de limite inicial e final não forem informados, é realizada apenas uma cópia da string.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 48
Curso Python para Todos
É possível utilizar um índice negativo para iniciar no último caractere da string. O último caractere é
o -1.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 49
Curso Python para Todos
email = "[email protected]"
indice = email.index(".com")
print(indice) # impresso 19
indice = email.index("@gmail")
print(indice) # impresso 13
indice = email.index("@")
print(indice) # impresso 13
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 50
Curso Python para Todos
Que tal aprendermos um novo método para “quebrar” uma string à partir de um determinado
caractere.
Veja:
Para isso podemos usar o método split. O método split retorna uma lista de palavras usando um
separador informado por parâmetro. Lista é um assunto de aulas futuras.
Veja: string.split(“separador”)
No nosso caso usaremos assim: “[email protected]”.split(“@”)
Serão retornadas duas strings, uma contendo “joao.silva” e a outra contendo “gmail.com”.
Agora que temos o domínio separado podemos procurar o “.” para indentificá-lo e separar o provedor.
Estruturas condicionais
Estruturas condicionais servem para que o sistema decida se vai ou não executar uma parte do código.
Podem ser usadas sempre que você precisar desviar o fluxo de execução do sistema de acordo com
uma condição.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 51
Curso Python para Todos
SE => IF
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 52
Curso Python para Todos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 53
Curso Python para Todos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 54
Curso Python para Todos
limite_credito = 900
total_compras = 325.56
saldo_disponivel = limite_credito - total_compras
valor_compra = float(input("Informe o valor da compra: "))
if valor_compra <= saldo_disponivel:
saldo_disponivel = saldo_disponivel - valor_compra
print("Sua compra foi autorizada.\n"
f"Valor da compra: R$ {valor_compra:.2f}\n"
f"Seu saldo atualizado é: {saldo_disponivel:.2f}")
else:
print("Sua compra não foi autorizada.\n"
"Saldo insuficiente.\n"
f"Saldo disponível: R$ {saldo_disponivel:.2f}")
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 55
Curso Python para Todos
Exemplo Multa
O for normalmente é utilizado quando você quer repetir um bloco de código um número fixo de vezes.
Sintaxe:
for referência in sequência:
bloco de código
Referência:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 56
Curso Python para Todos
É a variável que vai receber um valor da sequência a cada iteração. A cada iteração ela aponta para
um valor da sequência. A referência normalmente é acessada dentro do bloco de código do for para
que seu valor seja utilizado. A cada iteração no loop a referência é atualizada.
Sequência:
Pode ser uma sequência estática como uma lista ou uma string. Em capítulos futuros, falaremos sobre
listas. Por enquanto entenda que uma lista é uma sequência de elementos dentro de um par de
colchetes separados por vírgula. Veja a seguir uma lista de números: [5, 75, 110, 325, 400]
Pode ser também uma função que gere números, como a função range.
Podemos usar o else para executar algum código após o término do loop.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 57
Curso Python para Todos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 58
Curso Python para Todos
Execução 1:
Informe o primeiro número: 10
Informe o número final: 20
Informe o salto: 1
Cálculo: 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19
Soma: 145
Execução 2:
Informe o primeiro número: 1
Informe o número final: 9999
Informe o salto: 2
Cálculo: 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 21 + 23 + 25 + 27 + 29 + 31 + 33 + 35 + 37 + 39 + 41
+ 43 + 45 + 47 + 49 + 51 Passou de 50
Soma: 676
Sintaxe completa:
for referência in sequência:
bloco de código
continue
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 59
Curso Python para Todos
break
else:
bloco de código
While
O while normalmente é utilizado quando você quer repetir um bloco de código enquanto uma
expressão for verdadeira.
O while usado indevidamente pode fazer com que o sistema entre em um loop infinito.
Sintaxe:
while condição:
bloco de código
O bloco de código é executado enquanto a condição for verdadeira ou o loop for interrompido com
um break.
enquanto condição:
bloco de código
x=1
while x < 10:
print(x)
x=x+1
Execução:
Informe a nota (-1 para finalizar): 10
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 60
Curso Python para Todos
Estruturas de dados
Listas
Listas são coleções de objetos que podem ser de qualquer tipo, inclusive outras listas.
As listas em Python são mutáveis, podendo ser alteradas a qualquer momento.
Listas podem ser fatiadas como strings.
Os valores de uma lista podem ser acessados pelo seu índice.
Uma lista pode conter zero ou mais elementos.
O tamanho de uma lista é igual a sua quantidade de elementos.
2 = ‘Banestes’
Mas também podemos fazer assim, usando o operador de atribuição com adição “+=”:
numeros = [1, 2, 3, 10, 12]
numeros += [8, 7, 15]
print(numeros)
Resultado
[1, 2, 3, 10, 12, 8, 7, 15]
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 62
Curso Python para Todos
Para adicionar um item à lista definindo um índice específico usamos o método insert.
bancos = ['Banco do Brasil', 'CEF', 'Banestes', 'Itaú', 'Santander', 'Bradesco']
bancos.insert(3, "Sicoob")
print(bancos)
# Resultado: ['Banco do Brasil', 'CEF', 'Banestes', 'Sicoob', 'Itaú', 'Santander', 'Bradesco']
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 63
Curso Python para Todos
A função del pode ser usada para remover elementos de uma lista.
linguagens = ["Python", "Cobol", "Clipper", "C", "C++", "Go", "JavaScript"]
print(linguagens)
del linguagens[6] # Removeu JavaScript
print(linguagens)
del linguagens[1:3] # Removeu Cobol e Clipper
print(linguagens)
Resultado:
['Python', 'Cobol', 'Clipper', 'C', 'C++', 'Go', 'JavaScript']
['Python', 'Cobol', 'Clipper', 'C', 'C++', 'Go']
['Python', 'C', 'C++', 'Go']
Limpando uma lista inteira.
lista_livros = ['livro 1', 'livro 2', 'livro 3']
lista_livros.clear()
print(lista_livros)
Resultado:
[]
[]
frutas = lista[3]
print(frutas)
#Resultado: ['Maçã', 'Banana', 'Abacaxi’]
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 64
Curso Python para Todos
Exemplos de execução:
Informe a linguagem: Cobol
COBOL não está na lista.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 65
Curso Python para Todos
while True:
numero = int(input("Digite um número inteiro (informe 0 para sair): "))
if numero == 0:
break
if numero % 2 == 0:
lista_pares.append(numero)
else:
lista_impares.append(numero)
lista_pares.sort()
lista_impares.sort()
Resultado:
1 Carne Bovina
2 Frango
3 Salsicha
4 Peixe
5 Carne Suína
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 66
Curso Python para Todos
Resultado:
1 Carne Bovina
2 Carne Suína
3 Frango
4 Peixe
5 Salsicha
Copiando listas.
lista_numeros = [1, 2, 3, 4, 5]
nova_lista = lista_numeros
lista_numeros += [6]
print(lista_numeros) #Resultado: [1, 2, 3, 4, 5, 6]
print(nova_lista) #Resultado: [1, 2, 3, 4, 5, 6]
nova_lista += [7]
print(lista_numeros) #Resultado: [1, 2, 3, 4, 5, 6, 7]
print(nova_lista) #Resultado: [1, 2, 3, 4, 5, 6, 7]
Clonando listas.
lista_numeros = [1, 2, 3, 4, 5]
lista_clonada = lista_numeros[:]
lista_clonada += [6]
print(lista_numeros) #Resultado: [1, 2, 3, 4, 5]
print(lista_clonada) #Resultado: [1, 2, 3, 4, 5, 6]
lista_numeros += [7]
print(lista_numeros) #Resultado: [1, 2, 3, 4, 5, 7]
print(lista_clonada) #Resultado: [1, 2, 3, 4, 5, 6]
Fatiando listas.
linguagens = ["Python", "Cobol", "Clipper", "C", "C++", "Go", "JavaScript"]
linguagens2 = linguagens[3:5]
print(linguagens)
print(linguagens2)
#Resultado:
['Python', 'Cobol', 'Clipper', 'C', 'C++', 'Go', 'JavaScript']
['C', 'C++']
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 67
Curso Python para Todos
Tuplas
Tuplas são semelhantes às listas, porém, são imutáveis. Não podemos acrescentar, apagar ou fazer
atribuições aos seus itens.
As tuplas são criadas usando-se parênteses em vez de colchetes, porém, os parênteses não são
obrigatórios.
Sintaxe:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 68
Curso Python para Todos
fatia = paises[1:3]
print(fatia) # ('Paraguai', 'Uruguai')
Se tentarmos alterar um item da tupla, é gerado o erro “O objeto não suporta a atribuição de itens”.
Como eu já disse, melhor não usar acentuação. Nem todas linguagens aceitam....
Resultado:
Brasil
Paraguai
Uruguai
México
"Fusca", "Clio"]
tupla_carros = tuple(lista_carros)
print(f"Tupla carros: {tupla_carros}")
Resultado:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 69
Curso Python para Todos
Resultado:
Carro1: Golf
Carro2: Corolla
Carro3: Civic
Resultado:
Carro1: Golf
Carros: ['Corolla', 'Civic', 'Opala', 'Tucson', 'Elantra']
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 70
Curso Python para Todos
Resultado:
Carros: ['Golf', 'Corolla', 'Civic', 'Opala']
Tucson: Tucson
Elantra: Elantra
Set
Set (conjunto) é uma sequência mutável não ordenada e que não possui elementos duplicados.
Os sets suportam operações matemáticas como união, interseção e diferença.
Sintaxe:
variavel = {a, b, ...,z}
set()
Criando o conjunto.
# Criando um conjunto com valores
conjunto_numeros = {10, 20, 30, 40, 50, 60}
Para criar um conjunto vazio não podemos usar:
conjunto = {} # Chaves vazias criam um dicionário (assunto da próxima aula)
# Forma correta de criar um conjunto vazio.
conjunto = set()
Será impresso:
conjunto_numeros: {40, 10, 42, 56, 30}
Será impresso:
conjunto_frutas: {'Abacaxi', 'Maçã', 'Laranja'}
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 71
Curso Python para Todos
União
conjunto_numeros = {10, 30, 40, 10, 42, 42, 56}
conjunto_frutas = {"Abacaxi", "Abacaxi", "Laranja", "Maçã", "Abacaxi"}
conjunto_uniao = conjunto_frutas.union(conjunto_numeros)
print(conjunto_uniao)
Será impresso:
{'Laranja', 10, 'Maçã', 30, 'Abacaxi', 40, 42, 56}
Diferença
conjunto_numeros = {10, 30, 40, 42, 56}
conjunto_todos = {10, 30, 40, 42, 56, "Abacaxi", "Laranja", "Maçã"}
conjunto_diferenca = conjunto_todos.difference(conjunto_numeros)
print("conjunto_diferenca: ", conjunto_diferenca)
Será impresso:
conjunto_diferenca: {'Abacaxi', 'Laranja', 'Maçã'}
Interseção
conjunto1 = {10, 42, 50, "Python", "Programação"}
conjunto2 = {10, "Python", 42, "Java", "Bicicleta", "Carro"}
conjunto_intersecao = conjunto1.intersection(conjunto2)
print(f"conjunto_intersecao: {conjunto_intersecao}")
Será impresso:
conjunto_intersecao: {'Python', 10, 42}
linguagem = {"Cobol"}
if linguagens.issuperset(linguagem):
print("O conjunto de linguagens inclui o conjunto linguagem.")
else:
print("O conjunto de linguagens não inclui o conjunto linguagem.")
Será impresso:
O conjunto de linguagens inclui o conjunto linguagem.
O conjunto de linguagens não inclui o conjunto linguagem.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 72
Curso Python para Todos
linguagem = {"Cobol"}
if linguagem.issubset(linguagens):
print("O conjunto linguagem está no conjunto de linguagens.")
else:
print("O conjunto linguagem não está no conjunto de linguagens.")
Será impresso:
O conjunto linguagem está no conjunto de linguagens.
O conjunto linguagem não está no conjunto de linguagens.
Será impresso:
Os conjuntos não possuem elementos em comum.
Os conjuntos possuem elementos em comum.
Dicionários
Dicionários são estruturas de dados similares às listas, porém, com propriedades de acesso diferentes.
Um dicionário consiste em um conjunto de chaves e valores.
Sintaxe:
dicionario = {‘a’: a, ‘b’: b, ..., ‘z’: z}
dicionario = {chave: valor, chave: valor}
Assim como as listas, os dicionários são mutáveis.
Mas suas chaves devem ser de um tipo imutável.
Para criar listas usamos colchetes “[ ]”, para criar tuplas, usamos parênteses “( )”, para criar dicionários
usamos chaves “{ }”.
Chave Valor
curso Python para todos
aula Dicionários
professor Evaldo
‘aula’: ‘Dicionários’,
‘professor’: ‘Evaldo’ }
# Criando o dicionário
carros = {'marca': 'VW', 'modelo': 'Gol', 'ano_modelo': 2016}
# Acessando seus elementos
print(f'O ano do modelo do carro é: {carros["ano_modelo"]}')
print(f"A marca do carro é: {carros['marca']}")
Resultado:
O ano do modelo do carro é: 2016
A marca do carro é: VW
Resultado:
O ano de fabricação do carro é: 2017
# Apagando um elemento
del carros['modelo']
print(f"Removido modelo: {carros}")
Resultado:
Removido modelo: {'marca': 'VW', 'ano_modelo': 2016, 'ano_fabricacao': 2017}
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 74
Curso Python para Todos
Resultado:
Itens do dicionário carros: dict_items([('marca', 'VW'), ('modelo', 'Gol'), ('ano_modelo', 2016)])
Chaves do dicionário carros: dict_keys(['marca', 'modelo', 'ano_modelo'])
Valores do dicionário carros: dict_values(['VW', 'Gol', 2016])
Um programa exemplo:
produtos = { "Mouse": 98.75,
"Teclado": 125.65,
"Monitor": 134.78,
"Gabinete": 170.00,
"HD Externo": 510.50,
"Headset": 125.45 }
while True:
produto = input("Informe o produto a pesquisar o preço ou fim para sair: ")
if produto == "fim":
break
if produto in produtos:
print(f"Produto {produto} custa {produtos[produto]}.")
else:
print(f"Produto {produto} não encontrado.")
Em Python podemos ter dicionários contendo listas ou até mesmo outros dicionários.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 75
Curso Python para Todos
produtos_comprados = {}
total_geral = 0
while True:
codigo_produto = input("Informe o código ou zero (0) para sair: ")
if codigo_produto == "0":
break
if codigo_produto in estoque:
qtd = int(input("Informe a quantidade: "))
confirma = input("Confirma? 'S' para sim ou 'N' para não: ")
if confirma == 'S':
total_produto = 0
estoque[codigo_produto][1] -= qtd
valor_unitario = estoque[codigo_produto][2]
total_produto = valor_unitario * qtd
total_geral += total_produto
produtos_comprados[codigo_produto] = (codigo_produto,
estoque[codigo_produto][0],
qtd,
f"R$ {valor_unitario:.2f}",
f"R$ {total_produto:.2f}")
else:
print("Você desistiu do produto.")
else:
print("Produto não encontrado no estoque.")
print(f"Estoque: {estoque}")
print(f"Produtos comprados: {produtos_comprados}")
Resultado:
dic1: {'nome': 'Fulano', 'sobrenome': 'de Tal'}
dic2: {'nome': 'Fulano', 'sobrenome': 'de Tal'}
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 76
Curso Python para Todos
dic1.update(dic2)
print(f'dic1: {dic1}')
Resultado:
dic1: {'nome': 'Fulano', 'sobrenome': 'de Tal'}
dic2: {'idade': 40, 'UF': 'ES'}
dic1: {'nome': 'Fulano', 'sobrenome': 'de Tal', 'idade': 40, 'UF': 'ES'}
Para retornar quantos conjuntos chave/valor existem no dicionário usamos a função len().
Usando dict()
O construtor dict() constrói dicionários à partir de sequências de pares de chave-valor.
Exemplo:
>>> dicionario = dict([('curso','Python'), ('aula','Dicionários')])
>>> dicionario
{'curso': 'Python', 'aula': 'Dicionários'}
Outro exemplo:
>>> dicionario = dict(curso='Python', aula='Dicionários')
>>> dicionario
{'curso': 'Python', 'aula': 'Dicionários'}
Introdução a Funções
O bloco de código da função não é executado enquanto a mesma não for chamada.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 77
Curso Python para Todos
# Chamando a função
soma()
Passando parâmetros.
# Definindo a função
def soma(numero1, numero2):
total = numero1 + numero2
print(f"Total: {total}")
# Chamando a função
soma(10, 20)
Resultado:
Total: 30
# Chamando a função
total = soma(10, 20)
print(f"Soma: {total}")
Resultado:
Soma: 30
Resultado:
Soma: 30
def capturar_numeros():
lista_numeros = []
while True:
numero = int(input("Informe um número inteiro ou zero para sair: "))
if numero == 0:
break
lista_numeros.append(numero)
return maior_valor(lista_numeros)
# Chamada da função
print(f"Maior valor: {capturar_numeros()}")
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 78
Curso Python para Todos
Por exemplo:
>>> max(10, 20, 55, 187, 1, 2)
187
>>> lista = [1, 2, 5, 8, 4, 1, 3, 9, 55]
>>> max(lista)
55
A função max() também retorna a string com o maior valor tendo como base a ordem alfabética,
veja:
>>> max("Melancia", "Jaca", "Abacaxi", "Laranja")
'Melancia'
>>> max("a", "b", "c", "k", "m", "y")
'y'
soma(10, 25)
print(total)
35
Traceback (most recent call last):
File "C:/Evaldo/PCloud/Udemy/MeusCursos/001-PythonParaTodos/Secao 8 - Estruturas de
dados/Secao08_Aula04_Dicionarios_Desafios/codigo/temp.py", line 6, in <module>
print(total)
NameError: name 'total' is not defined
def despesas_fixas():
agua = 30.00 # Variável local
luz = 100.00 # Variável local
despesas = agua + luz
saldo = salario_minimo - despesas
print(f"Saldo despesas fixas: {saldo}")
return despesas
def despesas_variaveis():
supermercado = 500.00 # Variável local
lanchonete = 100.00 # Variável local
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 79
Curso Python para Todos
def despesas_mes():
return despesas_fixas() + despesas_variaveis()
Resultado da execução:
Salário mínimo: 937.0
Saldo despesas fixas: 807.0
Saldo despesas variáves: 337.0
Despesas mês: 730.0
def calculo():
valor = 50.00 # Variável local
print(f"Valor dentro da função: {valor}")
Resultado da execução:
Valor fora da função: 100.0
Valor dentro da função: 50.0
Valor fora da função: 100.0
def calculo():
global valor
valor = 50.00 # Variável global
print(f"Valor dentro da função: {valor}")
Resultado da execução:
Valor fora da função: 100.0
Valor dentro da função: 50.0
Valor fora da função: 50.0
O escopo de nomes em Python é mantido por meio de namespaces, que são dicionários que
relacionam os nomes dos objetos (referências) e os objetos em si.
Os nomes ficam definidos em dois dicionários que podem ser consultados utilizando-se as funções
locals() e globals(). Estes dicionários são atualizados em tempo de execução.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 80
Curso Python para Todos
def calculo2(num1):
total = 0
for numero in num1:
total += numero
total += total * TAXA_JUROS
print(f"Variáveis locais calculo2: {locals()}")
print(f"Calculo2: {total}")
calculo1(25, 14)
numeros = [10, 50, 75.5, 96]
calculo2(numeros)
print(f"Variáveis globais: {globals()}")
Resultado da execução:
Variáveis locais calculo1: {'num1': 25, 'num2': 14, 'total': 39.468}
Calculo1: 39.468
Variáveis locais calculo2: {'num1': [10, 50, 75.5, 96], 'total': 234.278, 'numero': 96}
Calculo2: 234.278
Variáveis globais: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__':
<_frozen_importlib_external.SourceFileLoader object at 0x00000265678152E8>, '__spec__': None,
'__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__':
'C:/Evaldo/PCloud/Udemy/MeusCursos/001-PythonParaTodos/Secao 9 - Funcoes Modulos e
Pacotes/Secao09_Aula02_VariaveisGlobais/codigo/variaveis_loc_glo6.py', '__cached__': None,
'TAXA_JUROS': 0.012, 'calculo1': <function calculo1 at 0x0000026565CCC268>, 'calculo2': <function
calculo2 at 0x0000026567A97B70>, 'numeros': [10, 50, 75.5, 96]}
Variáveis globais devem ser utilizadas o mínimo possível, pois dificultam a leitura e violam o
encapsulamento da função (veremos encapsulamento na aula de orientação a objetos).
A dificuldade de leitura se dá pelo fato de que devemos ficar procurando as variáveis e conteúdos fora
da função.
A variável global pode ter seu conteúdo alterado por qualquer função, desta forma fica difícil saber
qual função alterou.
O encapsulamento é comprometido porque a função precisa de uma variável externa. Uma variável
que não é declarada dentro da função e não é recebida por parâmetro.
Um bom uso de variáveis globais é utilizando as mesmas como constantes. Sempre que várias
funções precisem de uma informação que é fixa, podemos criar constantes globais. Normalmente
criamos constantes em maiúsculas.
def calculo2(num1):
total = 0
for numero in num1:
total += numero
total += total * TAXA_JUROS
print(f"Calculo2: {total}")
calculo1(10, 35)
valores = [10.0, 58.74, 65.41, 80.0]
calculo2(valores)
Resultado da execução:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 81
Curso Python para Todos
Calculo1: 45.54
Calculo2: 216.7198
Parâmetros de funções
Parâmetros ou argumentos de funções são essenciais para que possamos chamar funções informando
valores. Desta forma, tornamos as funções flexíveis, recebendo valores diferentes a cada execução.
Funções sem parâmetros não são flexíveis. Veja no exemplo a seguir a função soma, que toda vez
que é chamada retorna como resultado, 35, ou seja, a soma de dois valores fixos no sistema.
def soma():
valor1 = 10
valor2 = 25
return valor1 + valor2
total = soma()
print(f"O total é: {total}")
Total recebe 94, porém, nada é impresso, porque o valor padrão para “imprime” é falso e não foi
informado na chamada. Os parâmetros “valor1” e “valor2” são obrigatórios, já o parâmetro “imprime”
é opcional porque já foi definido como falso.
Parâmetros opcionais não podem estar no início caso seja combinado com parâmetros obrigatórios.
Veja um exemplo, onde o parâmetro opcional está no início. Ao executarmos o programa teremos o
erro a seguir.
def soma(imprime = False, valor1, valor2):
resultado = valor1 + valor2
if imprime:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 82
Curso Python para Todos
print(f"Soma: {resultado}")
return valor1 + valor2
Esta mensagem está informando que argumentos sem valor padrão estão após argumentos que
possuem valor padrão e isso é um erro.
Nomeando parâmetros.
Quando informamos o nome do parâmetro, não importa a ordem em que passamos os mesmos.
def retangulo(largura, altura, caractere="*"):
linha = caractere * largura
for i in range(altura):
print(linha)
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 83
Curso Python para Todos
Desempacotamento de parâmetros
Resultado da execução:
Soma: 138
Módulos e pacotes
Nos capítulos anteriores aprendemos a criar funções em Python. À medida que um programa aumenta
e são adicionadas novas funções, fica impossível mantê-las em um único arquivo. É neste momento
que entra o conceito de módulos. Todo arquivo .py é um módulo. Um programa pode conter diversos
módulos. Um módulo pode usar outros módulos, desta forma aproveitamos códigos existentes.
Como exemplo criaremos um módulo denominado operacoes.py que conterá duas funções (soma e
media) e um módulo denominado programa.py que não possuirá nenhuma função, mas importará o
módulo operações para usar as funções soma e media.
Conteúdo de operacoes.py
def soma(*valores):
total = 0
for numero in valores:
total += numero
return total
def media(*valores):
total = soma(*valores)
return total / len(valores)
Conteúdo de programa.py
import operacoes
print(f"Valor1: {valor1}")
print(f"Valor2: {valor2}")
Conteúdo de programa2.py
Este programa irá solicitar os números ao usuário.
import operacoes
lista_numero = []
while True:
numero = int(input("Informe um número inteiro ou zero para sair: "))
if numero == 0:
break
lista_numero.append(numero)
soma = operacoes.soma(*lista_numero)
media = operacoes.media(*lista_numero)
print(f"Soma: {soma}")
print(f"Média: {media}")
Módulos são compilados quando importados pela primeira vez e armazenados em um arquivo com
extensão .pyc ou .pyo.
O módulo é instanciado apenas uma vez em memória ficando disponível de forma global para o
programa.
Quando um módulo é importado o Python procura sua localização utilizando a lista de pastas
PYTHONPATH (sys.path) que, normalmente, inclui a pasta corrente em primeiro lugar.
Resultado da impressão:
[‘...PycharmProjects\\aula_modulos', ‘...PycharmProjects\\aula_modulos',
‘...Evaldo\\AppData\\Local\\Programs\\Python\\Python36\\python36.zip',
‘...Evaldo\\AppData\\Local\\Programs\\Python\\Python36\\DLLs',
‘...Evaldo\\AppData\\Local\\Programs\\Python\\Python36\\lib',
‘...Evaldo\\AppData\\Local\\Programs\\Python\\Python36',
‘...Evaldo\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages']
Quando o módulo operacoes.py foi importado pelo módulo programa.py o Python criou o arquivo
.pyc na pasta __pycache__.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 85
Curso Python para Todos
Enquanto módulos são organizados em arquivos, pacotes ou packages são organizados em pastas
identificadas com o arquivo __init__.py.
Os pacotes funcionam como coleções para organizar módulos de forma hierárquica.
É possível importar todos os módulos de um pacote, tirando os que começam com “__” (2
underscores) usando a declaração a seguir:
from nome_do_pacote import *
O arquivo __init__.py pode estar vazio, conter código de inicialização do pacote ou definir uma
variável chamada __all__, que é uma lista de módulos que pertencem ao pacote e que serão
importados quando usamos *.
Exemplo:
def retorna_saldo():
return 500.00
def efetuar_saque(valor_saque):
saldo_atual = consultar_saldo.retorna_saldo()
if valor_saque < saldo_atual:
print(f"Pode sacar. Resta: {saldo_atual - valor_saque}")
else:
print(f"Não pode sacar. Saldo da conta: {saldo_atual}")
def realizar_saque(valor):
sacar.efetuar_saque(valor)
realizar_saque(600.00)
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 86
Curso Python para Todos
Funções recursivas
Chamamos de função recursiva uma função que chama a si mesma.
Recursividade pode ser um problema se gerar chamadas infinitas.
O Python tem um limite de execuções recursivas por padrão igual a 1.000, ou seja, uma função
recursiva não vai ficar rodando infinitamente.
def recursiva():
recursiva()
recursiva()
class Exemplo_01(object):
def __init__(self):
self.contador = 0
print("Limite recursividade:", sys.getrecursionlimit())
def funcao_recursiva(self):
self.contador += 1
print("Contador: ", self.contador)
e = Exemplo_01()
e.funcao_recursiva()
sys.getrecursionlimit():
Retorna o limite de recursividade.
sys.setrecursionlimit():
Define o limite de recursividade.
Um exemplo muito utilizado para explicar funções recursivas é desenvolver uma função que calcule o
fatorial de um número inteiro.
O fatorial de um número inteiro m não negativo, é indicado por m! (lê-se “m fatorial”) e é definido
pela relação:
m! = m⋅(m−1)⋅(m−2)⋅(m−3)...3⋅2⋅1, para m ≥ 2.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 87
Curso Python para Todos
def fatorial(x):
if x <= 1:
return 1
else:
return (x * fatorial(x-1))
Exemplo de execução:
Informe um número para encontrar o fatorial: 4
O fatorial de 4 é 24
Podemos utilizar funções para criar uma infinidade de coisas, uma das coisas para a qual podemos
criar funções é para validar a entrada de dados do usuário, reduzindo assim, possíveis erros no
sistema.
Imagine que você tenha que validar uma entrada de dados específica, em vez de ficar sempre
escrevendo o código de validação, você pode criar uma função e chamá-la sempre que necessário.
Vamos ao primeiro exemplo. Vamos supor que você precise solicitar que o usuário informe um
número inteiro dentro de uma faixa. Você pode criar uma função que receberá os três números e fará
esta validação.
{fim}.")
while True:
resposta = input("Informe um número inteiro entre 1 e 10: ")
if validar_faixa(resposta, 1, 10):
break
No segundo exemplo vamos validar um limite máximo de caracteres de um texto informado pelo
usuário.
while True:
texto = input("Informe um texto de no máximo 20 caracteres: ")
if validar_tamanho(texto, 20):
break
No terceiro exemplo vamos validar a entrada do usuário com base em uma lista fornecida
verificando se o texto informado está contido na lista.
while True:
lista = ["CARRO", "NAVIO", "ÔNIBUS", "AVIÃO"]
resposta = input("Informe um meio de transporte: ")
if valida_elementos(resposta, lista):
break
Expressões lambda
Python permite a criação de funções anônimas (funções que não estão vinculadas a um nome) em
tempo de execução usando o construtor “lambda”.
Ao executar uma expressão lambda o Python retorna uma função, ao invés de atribui-la à um nome
como acontece quando usamos def, por isso são anônimas.
Estas funções são úteis quando precisamos de uma função para ser passada como parâmetro para
outra função e que não será mais utilizada após isso, sendo descartada em seguida.
Uma expressão lambda permite criar uma função em uma única linha de código.
Por ser uma expressão, pode aparecer em lugar que um def não pode, como por exemplo, dentro de
uma lista ou nos argumentos de chamada de uma função.
Sintaxe:
lambda arg1, arg2, ...argN : expressão usando os argumentos
Podemos passar vários argumentos separados por vírgula. E o retorno será uma função com o
resultado do código informado.
Uso:
multiplica = lambda x: x * 2
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 89
Curso Python para Todos
valor = multiplica(10)
10 é o valor de “x”, o resultado será 10 * 2, ou seja, 20.
Exemplo 1:
def a(x):
return x**2
print(a(4))
b = lambda x: x**2
print(b(4))
Exemplo 2:
O dobro de quinze é: 30
O dobro de vinte é: 40
10 * 8 = 80
Exemplo 3:
def incrementar(n):
return lambda x: x + n
somar2 = incrementar(2)
somar8 = incrementar(8)
a = 1
b = somar2(a)
print(b)
c = somar8(a)
print(c)
d = somar2(10)
print(d)
Exemplo 4:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 90
Curso Python para Todos
total = soma(numeros)
print(total)
Exemplo 5:
curso = lambda a = "Curso", b = "Python", c = "para Todos!!!": a + " " + b + " " +
c
print(curso())
def nomeCompleto():
completo = lambda nome, sobrenome: nome + " " + sobrenome
return completo
meuNome = nomeCompleto()
print(meuNome("Evaldo", "Wolkers"))
Exemplo 6:
try:
numero = int(input("Informe o número para gerar a tabuada: "))
except:
print("Número inválido!!!")
exit()
for t in tabuada:
print(t(numero))
Exercício:
Usando expressões lambda, crie funções para as quatro operações matemáticas básicas, adição,
subtração, multiplicação e divisão.
Solicite que o usuário escolha uma das quatro operações, validando sua escolha, em seguida solicite
que o usuário informe dois números inteiros que serão utilizados nas operações.
Esses dois números serão passados por parâmetro para que a operação seja realizada sobre os
mesmos.
A função type
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 91
Curso Python para Todos
Vamos criar um programa onde vamos validar os itens de uma lista para tomar uma determinada
decisão conforme o tipo do elemento.
def validar_itens(lista):
soma_inteiros = 0
qtd_inteiros = 0
lista_str = []
lista_list = []
lista_dict = []
for item in lista:
if type(item) == int:
soma_inteiros += item
qtd_inteiros += 1
elif type(item) == str:
lista_str.append(item)
elif type(item) == list:
lista_list.append(item)
elif type(item) == dict:
lista_dict.append(item)
else:
print("Tipo não reconhecido!")
if soma_inteiros > 0:
print(f"Foram encontrados {qtd_inteiros} inteiros. A soma dos números
inteiros é: {soma_inteiros}")
if len(lista_str) > 0:
print(f"Foram encontradas {len(lista_str)} strings. Veja as strings:")
for i in lista_str:
print(i)
if len(lista_list) > 0:
retorno = ""
print(f"Foram encontradas {len(lista_list)} listas. Veja os itens das
listas:")
for lista in lista_list:
for item in lista:
retorno = retorno + str(item) + ", "
print(retorno[0:-2])
if len(lista_dict) > 0:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 92
Curso Python para Todos
validar_itens(lista)
O mapeamento é feito através da função map(), que consiste em aplicar uma função a todos os itens
de uma sequência, seja uma lista, tupla, etc., gerando uma outra sequência contendo os resultados e
com o mesmo tamanho da sequência inicial. A função map() sempre retorna um gerador.
Para exemplificar, vamos criar uma função que retorna um número informado ao quadrado:
def calculaQuadrado(numero):
return f"O quadrado de {numero} é: {numero ** 2}"
Em seguida vamos criar uma lista de números. Depois criaremos uma variável chamada “calculo”
que receberá o resultado da função map(), onde vamos passar a função calculaQuadrado e a lista de
números como parâmetros.
lista_numeros = [1, 2, 3, 4, 5, 6]
calculo = map(calculaQuadrado, lista_numeros)
Por fim, vamos percorrer o objeto iterável “calculo”, que é um map, imprimindo cada item deste
objeto.
for n in calculo:
print(n)
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 93
Curso Python para Todos
for n in soma:
print(n)
Podemos utilizar os métodos startswith e endswith para validar se a string começa ou termina com
uma determinada sequência de caracteres.
Podemos também verificar se uma palavra está contida na String usando o operador in.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 94
Curso Python para Todos
Podemos também verificar se uma palavra não está contida na String usando not in.
Para converter uma String em maiúsculas ou minúsculas podemos utilizar os métodos upper e lower.
Para um exemplo prático, pesquisei no Google por filetype:txt e baixei um arquivo do link:
http://www.konnexion.biz/discos_estoque.txt
Vamos abrir este arquivo e contar as ocorrências de uma determinada palavra.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 95
Curso Python para Todos
contador = 0
palavra = "volvo"
nome_arquivo = "discos_estoque.txt"
with open(nome_arquivo, "r") as arquivo:
for linha in arquivo:
contador = contador + linha.upper().count(palavra.upper())
Para que o programa possa ser reutilizado vamos possibilitar que o usuário informe a palavra a ser
pesquisada e o nome do arquivo.
contador = 0
palavra = input("Informe a palavra a ser pesquisada: ")
nome_arquivo = input("Informe o nome do arquivo: ")
with open(nome_arquivo, "r") as arquivo:
for linha in arquivo:
contador = contador + linha.upper().count(palavra.upper())
Podemos utilizar o método find para obter a posição da primeira ocorrência de uma String. O Python
retorna a posição do primeiro caractere da String. Caso não encontre a ocorrência, o Python retorna
-1.
Podemos utilizar o método rfind para realizar a pesquisa da direita para a esquerda.
Tanto find quanto rfind possuem dois parâmetros para que sejam delimitados o início e o fim para
realização da pesquisa.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 96
Curso Python para Todos
Para localizar o índice de ocorrência de uma string, podemos usar também o index (já apresentado na
seção “Variáveis e tipos de dados”, na aula “Aprendendo mais sobre strings – aula 2”) e rindex, porém,
caso a substring não seja localizada, esses métodos geram uma excessão ValueError.
Posicionamento de Strings
Provavelmente você algum dia terá que apresentar o resultado do seu programa com strings
alinhadas, tornando o resultado mais fácil de ler. Seja em um relatório ou simplesmente na saída do
programa.
O método center centraliza uma string em um número de posições passado como parâmetro,
preenchendo com espaços à direita e à esquerda, até que a string esteja centralizada. Podemos
substituir os espaços por qualquer caracter informando como parâmetro para a função.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 97
Curso Python para Todos
O Python também possui métodos para alinhar o texto à esquerda e à direita. São os métodos ljust e
rjust. O método ljust alinha o texto à esquerda e preenche com espaços à direita, já o método rjust
alinha o texto à direita e preenche com espaços à esquerda.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 98
Curso Python para Todos
Para separar strings à partir de um determinado caractere podemos utilizar o método split. O
resultado é uma lista com os itens que eram delimitados pelo caractere informado na chamada ao
método split.
Para separar strings à partir do caractere de nova linha “\n” podemos usar o método splitlines.
Para substituir trechos de uma string podemos usar o método replace. Este método recebe por
parâmetro a string que será substituída, a nova string, e por fim um número que limitará a quantidade
de substituições.
Se o primeiro parâmetro do replace for vazio, será inserido o caractere informado antes de cada
caractere da string e se o segundo parâmetro for vazio, o trecho será apagado.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 99
Curso Python para Todos
Nesta aula veremos como analisar e verificar uma string para identificar letras e números em seu
conteúdo.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 100
Curso Python para Todos
Para verificar se uma string tem conteúdo e se todos os seus caracteres são letras ou números
podemos utilizar o método isalnum (é alfanumérico).
Este método retorna verdadeiro caso a string não esteja vazia e se todos seus caracteres são letras e
números.
O método isalpha retorna verdadeiro se a string não for vazia e se todos seus caracteres forem letras
(incluindo vogais acentuadas).
O método isdigit retorna verdadeiro se a string não for vazia e se todos seus caracteres forem
numéricos em Unicode. Além dos números de 0 a 9, isdigit reconhece outros caracteres numéricos,
como por exemplo, o 9 tibetano que é Unicode (\u0f29).
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 101
Curso Python para Todos
O método isnumeric retorna verdadeiro se a string não for vazia e se todos seus caracteres forem
numéricos (Unicode também). Este método é mais abrangente que o isdigit e inclui dígitos e
representações numéricas como frações, por exemplo, 1/3 (\u2153).
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 102
Curso Python para Todos
O método isspace verifica se a string contém apenas caracteres em branco, como espaços, marcas
de tabulação (TAB), quebras de linha (LF) ou retorno de carro (CR).
O método isprintable verifica se a string pode ser impressa na tela. Esse método retorna falso se
algum caracter que não pode ser impresso for encontrado na string.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 103
Curso Python para Todos
Orientação a Objetos
Conceitos básicos
Objeto:
Todo mundo sabe o que é um objeto.
Objeto é uma coisa tangível, que podemos tocar, sentir e manipular.
Quando ainda éramos bebês interagíamos com objetos (brinquedos infantis).
Objetos de software não são coisas tangíveis, não tocamos ou sentimos, mas são modelos de algo que
pode realizar certas ações.
No desenvolvimento de software objeto é uma coleção de dados que possui comportamentos
associados.
Um software é uma coleção de objetos que se comunicam entre si, dizendo uns aos outros o que
devem fazer.
Objetos de software, assim como objetos do mundo real possuem características (propriedades,
atributos) e ações (procedimentos, métodos).
Os atributos são estruturas de dados que armazenam informações sobre o objeto.
Os métodos são responsáveis pela manipulação dos atributos, são funções associadas ao objeto que
descrevem como o objeto se comporta.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 104
Curso Python para Todos
Resumindo, objetos são abstrações computacionais que representam entidades com características e
ações.
Objeto: CARRO
Atributos: Métodos:
Cor, Marca, Modelo, Ano, Capacidade do Acelerar, frear, virar à esquerda, virar à direita.
tanque.
Paradigma:
Paradigma é uma forma de abordar um problema.
Paradigma de programação estruturada:
Os programadores abstraem o programa como uma sequência de funções executadas de modo
empilhado.
Paradigma de programação orientada a objetos:
Programadores abstraem o programa como uma coleção de objetos que interagem entre si.
Classe:
É a estrutura básica do paradigma de orientação a objetos, que representa o tipo do objeto, um
modelo a partir do qual os objetos serão criados.
Classes são abstrações utilizadas para representar um conjunto de objetos com características e
comportamentos idênticos.
Uma classe pode ser vista como uma fábrica de objetos.
Classe: VEÍCULOS
Classe: CANINO
A classe CANINO representa qualquer canino. Descreve as características e ações dos caninos em
geral.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 105
Curso Python para Todos
Características/Atributos: Ações/Métodos:
Peso, altura, idade, raça. Comer, correr, latir e atacar.
Uma forma de representar visualmente uma classe é usando o Diagrama de classe UML (Linguagem
de Modelagem Unificada).
Orientação a objetos:
Sabemos o que é um objeto, então, o que é orientação a objetos?
Orientado = direcionado para.
Sendo assim, orientado a objeto é praticamente direcionado para modelos de objetos.
Orientação a objetos é uma técnica para modelar sistemas complexos, descrevendo uma coleção de
objetos interagindo através de seus dados e comportamentos.
Provavelmente você já ouviu falar em Análise Orientada a Objetos, Design Orientado a Objetos e
Programação Orientada a Objetos.
Todos estes são conceitos relacionados à orientação a objetos, são estágios do desenvolvimento de
software.
Chamá-los de “orientados a objetos” especifica o estilo de desenvolvimento que está sendo seguido.
Análise orientada a objetos: É o processo de olhar para um problema, sistema ou tarefa (que alguém
quer transformar em um aplicativo) e identificar os objetos e as interações entre esses objetos.
A produto final do estágio de análise é um conjunto de requisitos.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 106
Curso Python para Todos
Programação orientada a objetos: É o processo de converter o que foi definido pelo design em um
programa que faz o que originalmente foi solicitado.
É uma técnica de programação que organiza nossos programas em classes e objetos em vez de apenas
funções.
Orientação a objetos:
É comum dizer que Python é uma linguagem orientada a objetos.
Porém, ao contrário de Java, Python não impõe a programação orientada a objetos como o principal
paradigma de programação. É perfeitamente viável um projeto em Python não ser orientado a
objetos, ou seja, não utilizar mecanismos que sejam específicos da programação orientada a objetos.
Pode-se utilizar Python para construir sistemas utilizando o paradigma de programação estruturada.
Em Python, tudo é um objeto e pode ser manipulado como tal. Funções, classes, strings e até mesmo
tipos são objetos. Todos têm um tipo, podem ser passados como argumento de função e podem ter
métodos e propriedades. Nesse aspecto, Python é uma linguagem orientada a objetos.
Entender os conceitos essenciais da programação orientada a objetos envolve compreender os
conceitos de objetos, classes e métodos.
Classe
No Python, novos objetos são criados a partir das classes por meio de atribuição. O objeto é uma
instância da classe que possui características próprias. As classes são derivadas da classe base
denominada object.
Veja como criamos um objeto:
Objeto = Classe()
No nosso exemplo seria:
Bulldog = Canino()
É como se o objeto fosse uma variável e o tipo fosse a classe.
Toda instância de classe ou variável tem seu próprio endereço de memória ou sua identidade.
Os objetos, que são instâncias de classes interagem entre si para servir ao propósito de uma aplicação
em desenvolvimento.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 107
Curso Python para Todos
class nome_classe:
var = valor
...
var = valor
def metodo(self, ...arg):
...
def metodo(self, ...arg):
...
Arquivo heroi.py
class Heroi:
"""
Classe de heróis
"""
voa = False
possui_arma = False
lanca_teia = False
frase_comum = ""
def falar(self):
print(self.frase_comum)
def detalhar(self):
if self.voa:
print("O herói voa.")
if self.possui_arma:
print("O herói possui arma.")
if self.lanca_teia:
print("O herói lança teia.")
Arquivo sistema.py
from heroi import Heroi
homem_aranha = Heroi()
homem_aranha.lanca_teia = True
print(homem_aranha.voa)
print(homem_aranha.lanca_teia)
he_man = Heroi()
he_man.possui_arma = True
he_man.lanca_teia = False
he_man.voa = False
he_man.frase_comum = "Eu tenho a força"
he_man.falar()
homem_aranha.detalhar()
he_man.detalhar()
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 108
Curso Python para Todos
Objeto = Classe()
No momento da criação do objeto, é executado o que chamamos de construtor da classe. O construtor
é um método especial, chamado __new__().
Após a chamada ao construtor, o método __init__() é chamado para inicializar a nova instância. O
método __init__() pode ser usado para passar argumentos , assim podemos passar valores para os
atributos do novo objeto.
Os métodos especiais em Python são identificados por nomes no padrão __nome__(). São utilizados
dois underscores no início e no fim do nome.
Arquivo heroi2.py
class Heroi:
"""
Classe de heróis
"""
def __init__(self, voa, possui_arma,
lanca_teia, frase_comum):
print("Executando init...")
self.voa = voa
self.possui_arma = possui_arma
self.lanca_teia = lanca_teia
self.frase_comum = frase_comum
def falar(self):
print(self.frase_comum)
def detalhar(self):
if self.voa:
print("O herói voa.")
if self.possui_arma:
print("O herói possui arma.")
if self.lanca_teia:
print("O herói lança teia.")
Arquivo sistema2.py
from heroi2 import Heroi
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 109
Curso Python para Todos
he_man.falar()
homem_aranha.detalhar()
he_man.detalhar()
class Pessoa():
especies = 'Humano'
print(Pessoa.especies) # Humano
Pessoa.vivo = True # Adicionado dinamicamente
print(Pessoa.vivo) # True
homem = Pessoa()
print(homem.especies) # Humano (herdado)
print(homem.vivo) # True (herdado)
Pessoa.vivo = False
print(homem.vivo) # False (herdado)
homem.nome = 'Evaldo'
homem.sobrenome = 'Wolkers'
print(homem.nome, homem.sobrenome) # Evaldo Wolkers
funcao_interna()
print(f"Imprimindo 'b' de novo em funcao_externa: {b}")
a = 10
funcao_interna()
print(f"Imprimindo 'b' de novo em funcao_externa: {b}")
a = 10
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 111
Curso Python para Todos
Ao definir a variável “a” dentro das funções especificando “global” será referenciada a variável “a” do
escopo global, ao alterar seu valor, será alterado o valor da variável “a” global.
Sombreamento de atributos:
Quando um atributo em um objeto não é encontrado, o Python continua buscando na classe que foi
usada para criar esse objeto (e continua pesquisando até que seja encontrado ou o fim da cadeia de
herança seja alcançado). Isso leva a um comportamento de sombreamento.
class Ponto():
x = 10
y = 7
p = Ponto()
O que é o self?
Dentro de um método de classe, podemos nos referir a uma instância por meio de um argumento
especial, chamado self por convenção. Self é sempre o primeiro atributo de um método de instância.
Primeiro exemplo
class Quadrado():
lados = 8
def area(self): # self é uma referência a uma instância
return self.lados ** 2
quadrado = Quadrado()
print(quadrado.area()) # 64 ('lados' foi encontrado na classe)
print(Quadrado.area(quadrado)) # 64 (equivalente a quadrado.area())
# Aqui foi passada a instância para a chamada do
método
quadrado.lados = 10
print(quadrado.area()) # 100 ('lados' foi encontrado na instância)
Segundo exemplo
class Calculo():
def calcular_total(self, quantidade, desconto):
return (self.preco * quantidade - desconto)
calc = Calculo()
calc.preco = 15
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 112
Curso Python para Todos
print(calc.calcular_total(15, 10))
print(Calculo.calcular_total(calc, 15, 10))
Herança
Herança nos permite criar uma versão modificada de uma classe existente, adicionando novos
atributos e métodos.
Com herança podemos adaptar o comportamento de classes existentes sem termos que modificá-las.
A nova classe herda todos os métodos da classe existente.
A classe existente pode ser chamada de classe mãe, classe base ou superclasse e a nova classe, pode
ser chamada de classe filha, classe derivada, ou subclasse.
Herança facilita o reuso de código pois podemos adaptar o comportamento de classes existentes, sem
ter que modificá-las.
Para localizar os métodos e atributos, o Python procura na classe derivada, retornando pela cadeia de
classes base até encontrá-los, similar ao que acontece nos namespaces local e global.
Arquivo classe_base.py
class Classe_base():
def __init__(self, valor1, valor2):
print("Método construtor da classe base")
self.valor1 = valor1
self.valor2 = valor2
def somar(self):
return self.valor1 + self.valor2
def subtrair(self):
return self.valor1 - self.valor2
Arquivo classe_derivada1.py
from classe_base import Classe_base
class Classe_derivada1(Classe_base):
def __init__(self, v1, v2):
print("Método construtor da classe derivada1.")
super().__init__(v1, v2)
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 113
Curso Python para Todos
Arquivo classe_derivada2.py
from classe_base import Classe_base
class Classe_derivada2(Classe_base):
def multiplicar(self, num1, num2):
return num1 * num2
Arquivo programa.py
from classe_derivada1 import Classe_derivada1
from classe_derivada2 import Classe_derivada2
class Classe_teste():
calculo = Classe_derivada1(10, 25)
resultado = calculo.somar()
print(resultado)
resultado = calculo.subtrair()
print(resultado)
calculo.imprimir("Olá mundo!")
# Em vez de fixar a clase Pai, melhor seria usar super() para definir
# que o método __init__ chamado é o da classe base.
class Filha(Pai):
def __init__(self):
super().__init__(self) # Chamando o construtor da classe pai direto
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 114
Curso Python para Todos
self.quantidade_rodas = quantidade_rodas
def ligar(self):
if self.possui_motor:
print("Ligou")
else:
print("Não tem motor.")
def desligar(self):
if self.possui_motor:
print("Desligou")
else:
print("Não tem motor.")
def andar(self):
print("O veículo está andando.")
def parar(self):
print("O veículo foi parado.")
Arquivo carro.py
from veiculo import Veiculo
class Carro(Veiculo):
"""Classe carro herdando da classe Veiculo"""
def __init__(self, quantidade_rodas):
Veiculo.__init__(self, True, quantidade_rodas)
Arquivo bicicleta.py
from veiculo import Veiculo
class Bicicleta(Veiculo):
def __init__(self, quantidade_rodas):
Veiculo.__init__(self, False, quantidade_rodas)
self.possui_guidao = True
def empinar(self):
print("A bicicleta empinou.")
Arquivo programa.py
from carro import Carro
from bicicleta import Bicicleta
bike = Bicicleta(2)
print(bike.possui_motor)
print(bike.possui_guidao)
print(bike.qtd_rodas)
bike.ligar()
bike.andar()
bike.empinar()
bike.parar()
bike.desligar()
carro = Carro(4)
print(carro.qtd_rodas)
carro.desligar()
carro.ligar()
carro.andar()
carro.parar()
carro.desligar()
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 115
Curso Python para Todos
self.nome = nome
self.idade = idade
Arquivo pessoa_fisica.py
from pessoa import Pessoa
class Pessoa_Fisica(Pessoa):
def __init__(self, cpf, nome, idade):
super().__init__(nome, idade)
self.cpf = cpf
Arquivo pessoa_juridica.py
from pessoa import Pessoa
class Pessoa_Juridica(Pessoa):
def __init__(self, cnpj, nome, idade):
super().__init__(nome, idade)
self.cnpj = cnpj
Arquivo pessoa_programa.py
from pessoa_fisica import Pessoa_Fisica
from pessoa_juridica import Pessoa_Juridica
print(pf.nome)
print(pf.cpf)
print(pf.idade)
print(pj.nome)
print(pj.cnpj)
print(pj.idade)
Herança múltipla
Herança múltipla é quando uma classe deriva de duas ou mais classes existentes.
Cuidado ao usar herança múltipla porque sua utilização pode deixar o código confuso em alguns casos.
Primeiro exemplo
class Terrestre(object):
anda_na_terra = True
def __init__(self, velocidade):
self.velocidade = velocidade
class Carro(Terrestre):
rodas = 4
def __init__(self, velocidade_em_terra, qtd_portas):
self.qtd_portas = qtd_portas
super().__init__(velocidade_em_terra)
class Aquatico(object):
anda_na_agua = True
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 116
Curso Python para Todos
class Barco(Aquatico):
def __init__(self, velocidade_na_agua, helices):
self.helices = helices
super().__init__(velocidade_na_agua)
Segundo exemplo
class Terrestre(object):
anda_na_terra = True
def __init__(self, velocidade):
self.velocidade = velocidade
class Carro(Terrestre):
rodas = 4
def __init__(self, velocidade_em_terra, qtd_portas, **kwargs):
self.qtd_portas = qtd_portas
super().__init__(velocidade_em_terra)
class Aquatico(object):
anda_na_agua = True
def __init__(self, velocidade):
self.velocidade = velocidade
class Barco(Aquatico):
def __init__(self, velocidade_na_agua, qtd_helices):
self. qtd_helices = qtd_helices
super().__init__(velocidade_na_agua)
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 117
Curso Python para Todos
super().__init__(velocidade_em_terra=velocidade_em_terra,
velocidade_na_agua=velocidade_na_agua,
qtd_portas=qtd_portas,
qtd_helices=qtd_helices)
Polimorfismo
Objetos podem ser de muitos tipos ou formas. Por exemplo, botões possuem formas diferentes,
existem botões redondos, quadrados, botões com imagem, mas todos compartilham a mesma lógica,
executam uma ação chamada “clique”. A capacidade de acessarmos o método “clique” independente
do tipo de botão é chamada de polimorfismo.
Devido ao polimorfismo o “+” possui uma função adicional para concatenar texto, além da função de
somar dois números.
Strings, tuplas ou listas podem ser acessadas com um índice inteiro. Isto mostra como Python
demonstra o polimorfismo em tipos embutidos.
Criamos duas classes: Cachorro e Gato, ambos podem fazer um som distinto. Em seguida, criamos
duas instâncias e chamamos sua ação usando o mesmo método denominado “som”.
class Cachorro(object): A classe Cachorro possui um método chamado “som” que
def som(self):
print("au au") imprime o texto “Au au”
A classe Gato possui um método chamado “som” que
class Gato(object): imprime o texto “Miau”
def som(self):
print("Miau") O método emitir_som recebe um objeto chamado
“animal” e executa o método “som” desse objeto.
def emitir_som(animal): Foram instanciados dois objetos, um da classe Cachorro e
animal.som()
outro da classe Gato.
cachorrinho = Cachorro() O método emitir_som foi executado duas vezes, na
gatinho = Gato() primeira passando um objeto do tipo Cachorro e na
emitir_som(cachorrinho)
segunda, um objeto do tipo Gato.
emitir_som(gatinho) O resultado foi:
Au au
Miau
Outro exemplo:
class Porta(object):
def fechar(self):
print("A porta foi fechada!")
def abrir(self):
print("A porta foi aberta!")
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 119
Curso Python para Todos
class Janela(object):
def fechar(self):
print("A janela foi fechada!")
def abrir(self):
print("A janela foi aberta!")
def realizar_abertura(o_que_abrir):
o_que_abrir.abrir()
def realizar_fechamento(o_que_fechar):
o_que_fechar.fechar()
porta = Porta()
janela = Janela()
realizar_abertura(porta)
realizar_abertura(janela)
realizar_fechamento(porta)
realizar_fechamento(janela)
class Animal(object):
def emitir_som(self):
raise NotImplementedError("Não foi implementado o método emitir_som.")
class Cachorro(Animal):
def emitir_som(self):
print("Au au")
class Gato(Animal):
def emitir_som(self):
print("Miau")
class Girafa(Animal):
def comer(self):
print("A girafa está comendo.")
def barulho(animal):
animal.emitir_som()
cachorrinho = Cachorro()
gatinho = Gato()
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 120
Curso Python para Todos
girafinha = Girafa()
barulho(cachorrinho)
barulho(gatinho)
barulho(girafinha)
Quando eu implemento um método na classe base (não será mais uma classe abstrata) e o mesmo
não é implementado na subclasse, será executado o método da classe base. Veja:
class Animal(object):
def emitir_som(self):
print("Um som qualquer")
class Girafa(Animal):
def comer(self):
print("A girafa está comendo.")
def barulho(animal):
animal.emitir_som()
girafinha = Girafa()
barulho(girafinha)
Quando o método é implementado na classe base e também implementado na subclasse, temos algo
similar a sobrescrita de método que ocorre no Java (ou outras linguagens). O método executado é o
da subclasse.
class Animal(object):
def emitir_som(self):
print("Um som qualquer")
class Cachorro(Animal):
def emitir_som(self):
print("Au au")
def barulho(animal):
animal.emitir_som()
cao = Cachorro()
barulho(cao)
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 121
Curso Python para Todos
class Documento(object):
def __init__(self, nome):
self.nome = nome
def abrir(self):
raise NotImplementedError("O método abrir deve ser implementado na
subclasse.")
class Pdf(Documento):
def abrir(self):
return 'Foi aberto um arquivo PDF!'
class Doc(Documento):
def abrir(self):
return 'Foi aberto um arquivo DOC!'
class Xls(Documento):
def abrir(self):
return 'Foi aberto um arquivo DOC!'
documentos = [Pdf('Arquivo.pdf'),
Pdf('Lista.pdf'),
Doc('Documento.doc'),
Xls('Planilha.xls')]
Resultado da execução:
Resultado da execução:
Classes abertas
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 122
Curso Python para Todos
No Python podemos alterar nossas classes e objetos em tempo de execução adicionando novos
métodos e atributos.
Isso é possível porque o Python é uma linguagem dinâmica.
Somente não podemos modificar classes built-ins (ou seja, as classes embutidas do Python).
Podemos adicionar novos atributos e métodos de forma dinâmica quando não quisermos modificar
uma classe existente ou quando não possuirmos o código-fonte da classe, tendo apenas seu bytecode,
por exemplo.
Vamos criar uma classe e gerar o bytecode para simular um caso real.
Temos que importar o módulo py_compile para gerar o bytecode, arquivo pyc.
O comando para gerar o bytecode é:
py_compile.compile(“arquivo.py”)
Vou excluir o pessoa.py, copiar o pessoa.cpython-36.pyc para a pasta do meu projeto e renomear
para pessoa.pyc.
Em seguida vou apagar a pasta __pycache__.
A pasta do projeto ficará assim. O arquivo exemplo1.py será nosso programa que usará a classe Pessoa
de pessoa.pyc.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 123
Curso Python para Todos
Se tentar editar o pessoa.pyc verá que ele é um binário (compilado). Veja o mesmo aberto nos editores
Sublime e PyCharm.
# Criando um método chamado retornar_nome que retorna a propriedade nome (de self)
def pegar_nome(self):
return self.nome
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 124
Curso Python para Todos
# Criando o método pegar_nome na classe Pessoa com base no método pegar_nome que
criei acima
Pessoa.pegar_nome = pegar_nome
# Criando um método denominado imprimir_ola para imprimir "Olá x", onde x é o valor
da propriedade nome
def imprimir_ola(self):
print("Olá", self.nome)
Encapsulamento é uma forma de fazer com que os objetos mantenham suas informações de estado
privadas, tornando seu comportamento oculto para o mundo externo.
Com encapsulamento não é possível alterar o estado interno dos objetos atuando diretamente neles.
Para manipular as informações dos objetos, enviamos “mensagens” aos mesmos, utilizando funções
como get e set.
Nas linguagens Java e C++, por exemplo, é possível definir propriedades como públicas ou privadas.
As propriedades privadas não podem ser acessadas diretamente, necessitando da implementação dos
métodos get e set.
No Python o conceito de encapsulamento (ocultar dados e métodos) não é implícito, pois não existem
palavras reservadas como no Java ou C++ (public, private e protected).
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 125
Curso Python para Todos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 126
Curso Python para Todos
Variáveis de instância privadas, que são acessadas somente do interior do objeto não existem no
Python.
Porém, existe uma convenção seguida pelos programadores Python: Um nome prefixado com um
underscore (por exemplo _carro) deve ser tratado como não público. Seja uma função, método ou
membro de dados.
class Carro(object):
def get_modelo(self):
return self._modelo
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 127
Curso Python para Todos
Apesar de ser possível acessar o “_marca” diretamente, seu nome indica que é um método “não
público”, sendo assim, é melhor não usá-lo diretamente.
Para criar um atributo “privado” no Python, temos que nomear o atributo iniciando com dois
underscores. Exemplo:
Quando definimos com dois
underscores, o atributo não é
Acessível externamente pelo
Seu nome “__despesa”.
O Python substitui seu nome por
_nomedaclasse__variável: _Financeiro__despesa.
Na verdade, os atributos não se tornam realmente privados, porque mesmo assim, ainda é possível
acessá-los externamente, mesmo que com outro nome.
class Carro(object):
marca = "Ford"
__modelo = "Focus"
carro = Carro()
print(dir(carro))
Resultado:
['_Carro__modelo', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__',
'__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__',
'__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'marca']
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 128
Curso Python para Todos
class Carro(object):
marca = "Ford"
__modelo = "Focus"
def get_modelo(self):
return self.__modelo
carro = Carro()
print(carro.marca)
carro.marca = "Fiat"
print(carro.marca)
carro.set_modelo("Uno")
print(carro.get_modelo())
carro._Carro__modelo = "Palio"
print(carro.get_modelo())
print(carro.__modelo)
AttributeError: 'Carro' object has no attribute '__modelo'
print(carro.modelo)
AttributeError: 'Carro' object has no attribute 'modelo'
class Carro(object):
def __init__(self, fabricante):
self.__fabricante = fabricante
def get_fabricante(self):
return self.__fabricante
carro = Carro("Toyota")
# Lista os atributos e métodos da classe
print(dir(carro))
carro.set_fabricante("Fiat")
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 129
Curso Python para Todos
print(carro.get_fabricante())
Resultado:
['_Carro__fabricante', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__',
'__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'get_fabricante',
'set_fabricante']
Toyota
Fiat
Fiat
class Mae(object):
def __init__(self):
self.__atributo_privado = 10
class Filha(Mae):
def pegar_atributo_privado(self):
return self.__atributo_privado # Atributo não existe na classe Filha
filha = Filha()
print(filha.__dict__)
x = filha.pegar_atributo_privado()
print(x)
Resultado da execução:
{'_Mae__atributo_privado': 10}
return self.__atributo_privado
AttributeError: 'Filha' object has no attribute '_Filha__atributo_privado'
class Mae(object):
def __init__(self):
self.__atributo_privado = 10
class Filha(Mae):
def pegar_atributo_privado(self):
# return self.__atributo_privado
return self._Mae__atributo_privado
filha = Filha()
print(filha.__dict__)
x = filha.pegar_atributo_privado()
print(x)
Resultado da execução:
{'_Mae__atributo_privado': 10}
10
“Por que então a sintaxe para atributos privativos não assegura as restrições de visibilidade como
deveria? A resposta mais simples é um dos lemas mais citados do Python: ‘Somos todos adultos aqui
e consentimos em dar liberdade uns aos outros’. Os programadores de Python acreditam que os
benefícios da liberdade são maiores que as desvantagens de ter a cabeça fechada.”
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 130
Curso Python para Todos
if __name__ == ‘__main__’
Um módulo pode descobrir se ele está ou não sendo executado no escopo principal, verificando seu
próprio __name__, que é um método especial do Python que retorna o nome do escopo em que o
código está sendo executado.
A validação “If __name__ == ‘__main__’:” é utilizada quando queremos que parte do código seja
executada apenas se o mesmo for executado à partir do escopo principal, não à partir de outro módulo
que tenha importado a classe.
arq1.py
class Arquivo1(object):
def __init__(self):
print("__name__:", __name__)
a = Arquivo1()
print("Soma em arq1:", a.somar(10 , 25))
Resultado da execução:
__name__: __main__
Soma em arq1: 35
Ao executar o arq1.py, quando o objeto “a” foi criado, foi impresso o código do init e, em seguida foi
feita a soma e impresso o resultado.
arq2.py
from arq1 import Arquivo1
a = Arquivo1()
print("Soma em arq2", a.somar(10, 10))
Resultado da execução:
__name__: arq1
Soma em arq1: 35
__name__: arq1
Soma em arq2 20
Ao executar o arq2.py, ao criar o objeto “a” o código de arq1 é executado, sendo assim, temos na
ordem de execução:
1 – Execução do init do objeto “a” de arq1.
2 – Execução do print da soma de arq1.
3 – Execução do init do objeto “a” de arq2.
4 – Execução do print da soma de arq2.
arq1.py (modificado)
class Arquivo1(object):
def __init__(self):
print("__name__:", __name__)
return x + y
if __name__ == '__main__':
a = Arquivo1()
print("Soma em arq1:", a.somar(10 , 25))
Resultado da execução:
__name__: __main__
Soma em arq1: 35
Ao executar o arq1.py, quando o objeto “a” foi criado, foi impresso o código do init e, em seguida foi
feita a soma e impresso o resultado. Executado igual anteriormente sem a validação do __main__.
O código que está dentro da validação de __name__ não é executado quando importamos a classe
Arquivo1 do módulo arq1.
Propriedades
Python oferece um mecanismo embutido (builtin) para construção de propriedades de uma classe.
Propriedades são como atributos, ou seja, são elementos acessados externamente, mas,
internamente, são manipulados por funções. São calculados em tempo de execução.
As propriedades são criadas pelo decorador property.
Usando propriedades podemos validar a entrada do atributo, criar atributos somente para leitura,
simplificar o uso de classe disfarçando as funções get() e set() dos atributos e podemos mudar de um
atributo convencional para uma propriedade sem a necessidade de alterar as aplicações que utilizam
a classe.
Propriedades são interessantes quando desenvolvemos bibliotecas para serem usadas por outras
pessoas.
def get_velocidade(self):
return f"A média de velocidade foi: {self._velocidade:.2f} metros por
segundo."
a = Arrancada(10, 30)
print(a.get_velocidade())
Veja agora o mesmo exemplo usando propriedade por meio do decorador @property.
class Arrancada(object):
def __init__(self, metros, segundos):
self._metros_percorridos = metros
self._tempo_gasto = segundos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 132
Curso Python para Todos
@property
def velocidade(self):
return f"A média de velocidade foi: {self._velocidade:.2f} metros por
segundo."
a = Arrancada(10, 30)
print(a.velocidade)
def get_velocidade(self):
print("Executou get_velocidade.")
return f"A média de velocidade foi: {self._velocidade:.2f} metros por
segundo."
def del_velocidade(self):
print("Executou del_velocidade.")
del self._velocidade
velocidade = property(get_velocidade,
set_velocidade, del_velocidade,
"Propriedade velocidade do veículo.")
a = Arrancada(10, 30)
print(a.velocidade)
a.velocidade = 40
print(a.velocidade)
del a.velocidade
class Arrancada(object):
def __init__(self, metros, segundos):
self._metros_percorridos = metros
self._tempo_gasto = segundos
self._velocidade = self._metros_percorridos / self._tempo_gasto
@property
def velocidade(self):
print("Retornando o valor de velocidade.")
return f"A média de velocidade foi: {self._velocidade:.2f} metros por
segundo."
@velocidade.setter
def velocidade(self, velocidade):
print("Atribuindo valor à velocidade.")
self._velocidade = velocidade
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 133
Curso Python para Todos
@velocidade.deleter
def velocidade(self):
print("Excluindo velocidade.")
del self._velocidade
a = Arrancada(10, 30)
print(a.velocidade)
a.velocidade = 40
print(a.velocidade)
del a.velocidade
Descritores
Descritor (descriptor) é uma forma mais geral de definir como os atributos são calculados por meio de
um protocolo. Com isso é possível obter um código mais fácil de reaproveitar do que com
propriedades (properties) e os mesmos podem ser compartilhados entre as classes.
Um descritor permite que você personalize o que deve ser feito quando você se refere a um atributo
em um objeto.
Necessitamos de descritores quando queremos, por exemplo, validar a informação antes de designar
a mesma ao atributo. Imagine que queira obrigar a informação de um número inteiro para idade, texto
para nome e avaliar o formato de uma string de e-mail.
O protocolo para criar um descritor é realmente muito simples. Você somente precisa definir um ou
mais dos métodos a seguir: __get__, __set__ e __delete__.
Onde:
Se ele apenas implementar __get __ (), então ele é chamado de um descritor “sem dados” (non-data
descriptor).
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 134
Curso Python para Todos
class MinhaClasse(object):
x = RevelarAcesso(10, 'var "x"')
y = 5
m = MinhaClasse()
Resultado:
x: 10
x: 20
y: 5
y: 8
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 135
Curso Python para Todos
O exemplo anterior mostra claramente que, se uma classe tiver o descritor de dados para o atributo
dado, o método __get __ () do descritor é chamado para retornar o valor sempre que o atributo da
instância é recuperado e __set __ () é chamado sempre que um valor é atribuído a esse atributo.
No caso do método __del__, ele é chamado sempre que um atributo de instância é excluído com a
declaração del instance.atribute ou a chamada delattr(instância, 'atributo').
class MinhaClasse(object):
descritor = MeuDescritor(valor_inicial='10', nome='dinheiro')
normal = 20
classe = MinhaClasse()
print(classe.descritor) # Executa o get para imprimir o valor, então imprime a
linha do "Obtendo"
print(classe.normal) # Não é um descritor
classe.descritor = 200 # Executa o __set__
print(classe.descritor) # Imprime agora 200
Resultado:
Obtendo: dinheiro
10
20
Obtendo: dinheiro
200
Observe o código a seguir. Veja como estou tratando para não permitir veículos com valor negativo.
class Carro(object):
def __init__(self, marca, modelo, valor):
self.marca = marca
self.modelo = modelo
if valor<0:
raise ValueError("O valor do carro não pode ser negativo.")
else:
self.valor = valor
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 136
Curso Python para Todos
def __str__(self):
return f"Marca: {self.marca}, Modelo: {self.modelo}, Valor: R$
{self.valor:.2f}"
Podemos resolver criando um descritor para validar valores negativos que pode ser reaproveitado.
class DescritorValor(object):
def __init__(self):
self.valor = 0
class Carro(object):
valor = DescritorValor()
def __init__(self, marca, modelo, valor):
self.marca = marca
self.modelo = modelo
self.valor = valor
def __str__(self):
return f"Marca: {self.marca}, Modelo: {self.modelo}, " \
f"Valor: R$ {self.valor:.2f}"
Resultado:
self.valor = valor
Neste exemplo ainda temos um problema devido ao valor ser uma propriedade da classe Carro. Se
executarmos assim:
fusquinha = Carro("VW", "Fusca", 8500)
print(fusquinha)
Marca: VW, Modelo: Fusca, Valor: R$ 25000.00 # O valor do Fusca foi alterado quando foi atribuído 2500 ao Gol.
class Carro(object):
valor = DescritorValor()
def __init__(self, marca, modelo, valor):
self.marca = marca
self.modelo = modelo
self.valor = valor
def __str__(self):
return f"Marca: {self.marca}, Modelo: {self.modelo}, " \
f"Valor: R$ {self.valor:.2f}"
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 138
Curso Python para Todos
Sobrecarga de operadores
O Python permite que as classes definidas pelo usuário implementem métodos para os operadores
definidos na linguagem.
Por exemplo, para personalizar o operador de soma “+”, podemos implementar um método
chamado __add__.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 139
Curso Python para Todos
Se você reescrever o método “__add__” por exemplo, em sua classe, ao executar uma operação de
adição utilizando o operador “+” com um objeto desta classe, será executado o conteúdo do método
“__add__” que você implementou. Vamos exemplificar isto de uma forma bem simples com dois
exemplos.
Primeiro exemplo:
class MinhaString(str):
def __sub__(self, other):
print("self:", self)
print("other:", other)
subtracao = self.replace(other, '')
return f"Resultado de '{self}' - '{other}': {subtracao}"
s3 = s1 - s2
print(s3)
Resultado:
other: cruel
Segundo exemplo:
class MinhaString(str):
def __sub__(self, other):
print("self:", self)
print("other:", other)
subtracao = self.replace(other, '')
return f"Resultado de '{self}' - '{other}': {subtracao}"
s3 = s1 + s2
print(s3)
Resultado:
self: Curso Python para
other: Todos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 140
Curso Python para Todos
Metaclasses
Metaclasse é um recurso do Python que é considerado por muitos como uma das coisas mais difíceis
da linguagem, sendo desta forma, evitada por um grande número de desenvolvedores. Na realidade,
não é tão complicado quanto parece, uma vez que você compreenda alguns conceitos básicos.
Metaclasse permite fazer coisas que não são possíveis usando outras abordagens.
Uma metaclasse é uma classe de outra classe, o que significa que a classe é uma instância de sua
metaclasse.
Algumas definições
• Metaclasse é um tipo (classe) que define outros tipos (classes). A coisa mais importante a
saber para entender como uma metaclasse funciona é que as classes que definem instâncias
de objetos também são objetos. Então, se eles são objetos, eles possuem uma classe
associada.
• Uma classe é um objeto, e assim como qualquer outro objeto, é uma instância de algo. Este
algo é uma metaclasse.
• Metaclasse é uma classe que pode ser instanciada por outras classes.
• Uma metaclasse é uma fábrica de classes, sendo utilizada para criar instâncias de classes.
• Como uma classe comum define o comportamento de suas instâncias, uma metaclasse define
o comportamento das classes e suas instâncias.
Em Python, a classe type é uma metaclasse e pode ser usada para criar novas metaclasses, ou seja,
quando criamos uma classe sem definir sua metaclasse, será utilizada a metaclasse type.
Como em Python tudo é um objeto. Se dissermos que a=5, então type(a) devolve <type ‘int’>, que
significa que “a” é do tipo int. No entanto type(int) devolve <type ‘type’>, que sugere a presença de
uma metaclasse, pois int é uma classe do tipo type.
A definição de classe é determinada por sua metaclasse, portanto, quando criamos uma classe com
class A, Python a cria com A = type(name, bases, dict), onde:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 141
Curso Python para Todos
base é a classe-base.
print(type(MinhaClasse))
# type é a metaclasse da classe MinhaClasse
Resultado:
<class 'type'>
<class 'type'>
<class 'type'>
print(isinstance(MinhaClasse, type))
Resultado: True
Diagrama de instâncias
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 142
Curso Python para Todos
instancia = MinhaClasse()
x = instancia.metodo()
print(x)
instancia = MinhaClasse()
x = instancia.metodo()
print(x)
print("type(Pessoa):", type(Pessoa))
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 143
Curso Python para Todos
print("vars(Pessoa):",vars(Pessoa))
print("type(pes):", type(pes))
print(pes.nome)
print(pes.sobrenome)
print(pes.a)
print(pes.b)
# Para criar nossa metaclasse, vamos declarar a classe herdando da classe type
class MinhaMetaClasse(type):
pass
minhaInstancia = MinhaClasse()
print(type(minhaInstancia))
Resultado:
<class '__main__.MinhaClasse'>
Todas as classes criadas usam type como metaclasse. Podemos modificar este comportamento padrão
informando a palavra-chave metaclass como argumento da declaração da classe.
# Para criar nossa metaclasse, vamos declarar a classe herdando da classe type
class MinhaMetaClasse(type):
pass
minhaInstancia = MinhaClasse()
print(type(minhaInstancia))
Agora, quando a classe MinhaClasse é construída, ela usará MinhaMetaClasse para construí-la.
Isso não tem muita utilidade, a menos que a metaclasse estenda a classe type de alguma forma.
O valor fornecido como argumento da metaclasse geralmente é outro objeto de classe, mas pode ser
qualquer outro objeto chamado que aceita os mesmos argumentos que a classe type e espera retornar
outro objeto de classe. Como já vimos, a assinatura de chamada de type é:
type(name, bases, namespace).
return retorno
metodo_criado.__name__ = nome_metodo
return metodo_criado
class MinhaMetaClasse(type):
def __new__(mcs, nome, bases, atributos):
for nome, retorno in (('metodo1', 'Olá'), ('metodo2', 'Como vai você?'),
('metodo3', 30 + 40), ('metodo4', str(70 * 7))):
atributos[nome] = fabrica_de_funcoes(nome, retorno)
class MinhaClasse(metaclass=MinhaMetaClasse):
pass
print("vars(MinhaClasse):",vars(MinhaClasse))
mc = MinhaClasse()
print(mc.metodo1())
print(mc.metodo2())
print(mc.metodo3())
print(mc.metodo4())
As metaclasses podem ser evitadas a favor de soluções mais simples como propriedades, descritores
ou decoradores de classe.
Também é verdade que muitas vezes as metaclasses podem ser substituídas por outras abordagens
mais simples, mas existem situações em que as coisas não podem ser feitas facilmente sem elas. Por
exemplo, é difícil imaginar a implementação de ORM (Object Relational Mapping – Mapeamento
objeto-relacional) do Django construída sem uso extensivo de metaclasses.
class MetaSingleton(type):
_instancias = {}
class Logger(metaclass=MetaSingleton):
pass
logger1 = Logger()
logger2 = Logger()
print(logger1)
print(logger2)
Método __call__
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 145
Curso Python para Todos
O método especial __call__ de Python é chamado quando um objeto precisa ser criado para uma
classe já existente. Nesse código, quando instanciamos a classe Logger com Logger(), o método
__call__ da metaclasse MetaSingleton é chamado, o que significa que a metaclasse agora controla a
instanciação do objeto.
Resultado:
<__main__.Logger object at 0x000001B3A63A0C50>
<__main__.Logger object at 0x000001B3A63A0C50>
class PessoaMeta(type):
# Inicializando a classe com o método __init_
def __init__(cls, name, bases, dict):
print("PessoaMeta: __init__")
# Chamando o método init da classe base (type)
super().__init__(name, bases, dict)
# Criando uma variável de nível de classe que é um
# dicionário que mapeia os parâmetros do construtor para uma
# instância que foi construída com esses parâmetros
cls._instance_map = {}
class Pessoa(metaclass=PessoaMeta):
def __init__(self, first_name, last_name):
print("Pessoa: __init__")
self.first_name = first_name
self.last_name = last_name
print(pessoa1)
print(pessoa2)
print(pessoa3)
print(pessoa1 is pessoa2)
print((pessoa3 is pessoa1) or (pessoa3 is pessoa2))
Classes-base abstratas
Python suporta classes-base abstratas (Abstract Base Classes), que são metaclasses que permitem
forçar a implementação de determinados métodos e atributos das classes e subclasses derivadas.
O módulo abc define a metaclasse ABCMeta e o decorador abstractmethod que identifica o método
que deve ser implementado.
Combinando abstractmethod com property, podemos ter propriedades abstratas.
Um método abstrato é um método que é declarado, mas não contém implementação. As classes
abstratas não podem ser instanciadas e exigem subclasses para fornecer implementações para os
métodos abstratos.
Uma subclasse de uma classe abstrata só pode ser instanciada se todos os métodos abstratos
estiverem sido implementados.
Métodos abstratos podem ser implementados em uma classe abstrata, porém, estes serão
sobrescritos nas classes derivadas.
Como em casos de herança normal, os métodos da classe abstrata podem ser invocados usando o
super().
class Carro(metaclass=ABCMeta):
@abstractmethod
def ligar(self):
# Sem implementação
pass
class fusca(Carro):
def __init__(self):
print("Vou implementar o ligar.")
def ligar(self):
print("Uhu, o fusca ligou!!!")
fusquinha = fusca()
fusquinha.ligar()
Resultado da execução:
Vou implementar o ligar.
Uhu, o fusca ligou!!!
class Carro(metaclass=ABCMeta):
@abstractmethod
def ligar(self):
# Sem implementação
pass
class kombi(Carro):
def __init__(self):
print("Não vou implementar o ligar.")
furgao = kombi()
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 147
Curso Python para Todos
Na hora de instanciar o objeto da classe kombi vai dar erro porque na classe kombi não foi
implementado o método "ligar".
class Carro(metaclass=ABCMeta):
@property
@abstractmethod
def valor(self):
return "Retorno de valor"
@abstractmethod
def ligar(self):
# Sem implementação
pass
class fusca(Carro):
@property
def valor(self):
return "Propriedade concreta."
def ligar(self):
print("Uhu, o fusca ligou!!!")
fusquinha = fusca()
fusquinha.ligar()
print(fusquinha.valor)
Resultado da execução:
Uhu, o fusca ligou!!!
Propriedade concreta.
class Carro(metaclass=ABCMeta):
@property
@abstractmethod
def valor(self):
return "Retorno de valor"
@abstractmethod
def ligar(self):
# Sem implementação
pass
class fusca(Carro):
def ligar(self):
print("Uhu, o fusca ligou!!!")
fusquinha = fusca()
fusquinha.ligar()
print(fusquinha.valor)
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 148
Curso Python para Todos
Resultado da execução:
Traceback (most recent call last):
File “…/exemplo4.py", line 18, in <module>
fusquinha = fusca()
TypeError: Can't instantiate abstract class fusca with abstract methods valor
Na hora de instanciar o objeto da classe fusca vai dar erro porque na classe fusca não foi
implementada a propriedade "valor"
Mensagens de erro
Nesta aula será apresentado ao aluno alguns dos tipos de erros que podem ocorrer em um programa
Python.
Além do tipo de erro, o Python mostra a linha onde o interpretador foi interrompido, dando uma
grande dica do que precisa ser corrigido em seu código.
SyntaxError
Erros de sintaxe, também conhecidos como erros de análise, ocorrem quando o interpretador não
consegue ler o que você escreveu, o que pode ser ocasionado por erros de digitação ou símbolos
esquecidos.
Esse é um erro muito comum para pessoas que estão iniciando os estudos em Python.
numero = 10
texto = "Olá, mundo
print("Número:", numero)
print("Texto:", texto)
numero = 10
texto = "Olá, mundo"
print("Número:", numero)
print["Texto:", texto)
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 149
Curso Python para Todos
print["Texto:", texto)
IdentationError
Erro de indentação, este erro é comum entre programadores de outras linguagens quando iniciam o
aprendizado com Python.
Também ocorre muito quando o programador utiliza tabulação e espaços ao mesmo tempo em seu
código (o que não é aconselhado).
def soma(n1, n2):
return n1 + n2
x = soma(10, 78)
print("O resultado da soma é:", x)
Indentação inesperada.
class Calculo(object):
def __init__(self, valor1, valor2):
self.valor1 = valor1
self.valor2 = valor2
def somar(self):
return self.valor1 + self.valor2
def subtrair(self):
return self.valor1 - self.valor2
print(teste.somar())
print(teste.subtrair())
../identation_error2.py", line 4
self.valor2 = valor2
KeyError
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 150
Curso Python para Todos
Este erro ocorre quando tentamos acessar uma chave inexistente em um dicionário.
dic = {"codigo": 1, "nome": "Evaldo", "celular": "(99)99999-9999"}
print(dic["codigo"])
print(dic["nome"])
print(dic["telefone"])
Evaldo
print(dic["telefone"])
KeyError: 'telefone'
NameError
Este erro ocorre quando o interpretador Python não consegue identificar um nome fornecido. Seja
uma variável, função ou qualquer outra referência que não seja identificada.
x = 10
y = 55
class Teste(object):
def __init__(self, nome, telefone):
self.nome = nome
self.telefone = telefone
if __nome__ == "__main__":
a = Teste("Evaldo", "(99)99999-9999")
print(a.nome, a.telefone)
.../name_error3.py", line 6, in <module>
if __nome__ == "__main__":
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 151
Curso Python para Todos
ValueError
O ValueError ocorre quando existe um problema com o conteúdo do objeto ao qual você tentou
atribuir o valor.
print(int(5.75))
print(int("78"))
print(int("Olá"))
5
78
print(int("Olá"))
inteiro = 5
lista = []
lista.remove(inteiro)
.../value_error2.py", line 3, in <module>
lista.remove(inteiro)
TypeError
Um tipo em Python pode ser considerado como a especificação para uma categoria de dados
relacionados. Embora possamos definir nossos próprios tipos, eles tendem a cair em um conjunto de
categorias pré-definidas.
Estes são os tipos mais comuns que estão incorporados na linguagem Python:
Quando chamamos uma função ou usamos um operador, normalmente o interpretador Python espera
ser informado parâmetros de um tipo específico. Por exemplo, o operador de adição “+” espera
receber dois parâmetros de tipo numérico, ou seja, integer ou float.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 152
Curso Python para Todos
Quando tentamos somar um integer com uma string o interpretador retorna o TypeError.
inteiro = 30
print(type(inteiro))
x = inteiro[1]
.../type_error.py", line 2, in <module>
x = inteiro[1]
Em geral, se você encontrar um TypeError, verifique se os dados em que você está operando são
realmente do tipo que você esperava. Podem fazer utilizando a função type() sobre os dados que estão
gerando dúvida.
IndexError
Um índice em Python representa uma posição em uma sequência. Mais comumente, isso se refere a
uma posição em uma string ou uma lista. A indexação em Python, como na maioria das linguagens de
programação, começa com zero.
lista_cores = ['Branco', 'Azul', 'Verde', 'Amarelo']
print(lista_cores[0])
print(lista_cores[3])
print(lista_cores[4])
Branco
Amarelo
print(lista_cores[4])
letra = frase[34]
print(letra)
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 153
Curso Python para Todos
letra = frase[34]
AttributeError
print(t.idade)
João Silva
(00)00000-0000
inteiro = 10
inteiro.append(20)
.../attribute_error2.py", line 2, in <module>
inteiro.append(20)
Quando ocorre uma falha no programa em tempo de execução, uma exceção é gerada.
Caso a exceção não seja tratada, ela se propaga por meio das chamadas de funções até o módulo
principal, interrompendo a execução do programa.
No código a seguir, foi solicitado um número ao usuário, mas não está sendo feito nenhum tratamento
caso o usuário informe uma string que não seja um número.
Veja que, ao informar a string “Olá”, gerou uma exceção do tipo ValueError.
Execução:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 154
Curso Python para Todos
soma = int(valor) + 10
“.../excecao.py"
soma = int(valor) + 10
Veja também que logo em seguida está uma divisão, e não estamos tratando caso o usuário informe
zero e ocorra um erro de divisão por zero.
Execução:
“.../excecao.py"
Informe um número: 0
try, except
Para tratar exceções utilizamos a instrução try. Caso ocorra alguma exceção em um bloco tratado
com try, podemos tratar esta exceção utilizando a instrução except.
Sintaxe:
try:
bloco_de_código
except tipo_de_erro:
bloco_de_código_executado_em_caso_de_excecao
try:
soma = int(valor) + 10
resultado = soma / int(valor)
print("Soma:", soma)
print("Resultado:", resultado)
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 155
Curso Python para Todos
except:
print("Ocorreu um erro.")
Veja que foi feito um tratamento de exceção geral, sem especificar o tipo de exceção, assim, para
qualquer exceção, o trecho de except vai ser executado.
Execução:
“.../excecao.py"
“.../excecao.py"
Informe um número: 0
try:
soma = int(valor) + 10
resultado = soma / int(valor)
print("Soma:", soma)
print("Resultado:", resultado)
except ZeroDivisionError:
print("Ocorreu um erro de divisão por zero [ZeroDivisionError].")
except ValueError:
print("Ocorreu um erro de valor [ValueError].")
Agora estão sendo tratados dois tipos de exceção, sendo assim, podemos tomar uma decisão
diferente para cada exceção levantada.
Execução:
“.../excecao.py"
“.../excecao.py"
Informe um número: 0
try...else
O tratamento de exceções pode conter um bloco else, que é executado quando não ocorre nenhum
erro.
valor = input("Informe um número: ")
try:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 156
Curso Python para Todos
soma = int(valor) + 10
resultado = soma / int(valor)
print("Soma:", soma)
print("Resultado:", resultado)
except ZeroDivisionError:
print("Ocorreu um erro de divisão por zero [ZeroDivisionError].")
except ValueError:
print("Ocorreu um erro de valor [ValueError].")
else:
print("Não deu erro!!!")
Execução:
Informe um número: 25
try...finally
O tratamento de exceções pode conter um bloco finally, que é executado sempre, ocorrendo erro
ou não. É muito utilizado quando você precisa realizar alguma ação mesmo que dê erro no sistema.
Pode ser utilizada para liberar recursos que foram usados no bloco try, tais como conexões com
bancos de dados e arquivos abertos.
valor = input("Informe um número: ")
try:
soma = int(valor) + 10
resultado = soma / int(valor)
print("Soma:", soma)
print("Resultado:", resultado)
except ZeroDivisionError:
print("Ocorreu um erro de divisão por zero [ZeroDivisionError].")
except ValueError:
print("Ocorreu um erro de valor [ValueError].")
finally:
print("Esta linha será executada ocorrendo erro ou não!!!")
Execução:
Informe um número: 10
Soma: 20
Resultado: 2.0
Quando tratamos a exceção o sistema não é interrompido, ele continua seu fluxo normalmente.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 157
Curso Python para Todos
try:
soma = int(valor) + 10
resultado = soma / int(valor)
print("Soma:", soma)
print("Resultado:", resultado)
except ZeroDivisionError:
print("Ocorreu um erro de divisão por zero [ZeroDivisionError].")
except ValueError:
print("Ocorreu um erro de valor [ValueError].")
finally:
print("Esta linha será executada ocorrendo erro ou não!!!")
x = 10
y = 25
print("X + Y:", x + y)
Execução:
X + Y: 35
A cláusula except pode especificar uma variável após o nome da exceção. A variável é ligada a uma
instância de exceção com os argumentos armazenados em instance.args. A instância de exceção
define __str __() para que os argumentos possam ser impressos diretamente, sem ter que fazer
referência a .args.
valor = input("Informe um número: ")
try:
soma = int(valor) + 10
resultado = soma / int(valor)
print("Soma:", soma)
print("Resultado:", resultado)
except Exception as e:
print("Ocorreu um erro. Veja o erro:", e)
print("Ocorreu um erro. Veja o erro:", e.args)
except Exception, e:
except Exception as e:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 158
Curso Python para Todos
Execução
Informe um número: a
Ocorreu um erro. Veja o erro: invalid literal for int() with base 10: 'a’
Ocorreu um erro. Veja o erro: (“invalid literal for int() with base 10: ‘a’”,)
def converte_inteiro(string):
numeros_permitidos = ("0","1","2","3","4","5","6","7","8","9")
if string not in numeros_permitidos:
raise ValueError("Informe um número de 0 a 9!!!")
return int(string)
Execução:
Informe um número de 0 a 9: a
Traceback (most recent call last):
File “.../usar_modulo_teste.py", line 4, in <module>
print(10 + converte_inteiro(numero))
File “...\codigo\modulo_teste.py", line 3, in converte_inteiro
raise ValueError("Informe um número de 0 a 9!!!")
ValueError: Informe um número de 0 a 9!!!
Hierarquia de exceções
Traceback
O traceback é a informação que o interpretador Python fornece para nos ajudar a identificar o
problema em nosso código. Ele contém algumas informações úteis:
• A sequência de chamadas de funções até o ponto onde ocorreu o problema;
• O número da linha onde o erro foi gerado;
• O tipo de erro que ocorreu, bem como uma pequena mensagem informativa sobre o
ocorrido.
“.../excecao.py"
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 159
Curso Python para Todos
Podemos utilizar o módulo tracebak para capturar a informação da exceção e utilizá-la por exemplo,
para gravar os erros em um arquivo de log.
import traceback
try:
nome_arquivo = input("Informe o nome do arquivo: ").strip()
arquivo = open(nome_arquivo)
except:
trace = traceback.format_exc()
...\python.exe “.../usando_traceback.py"
Informe o nome do arquivo: Arquivo_inexistente.txt
Ocorreu um erro:
Traceback (most recent call last):
File “.../usando_traceback.py", line 5, in <module>
arquivo = open(nome_arquivo)
FileNotFoundError: [Errno 2] No such file or directory: 'Arquivo_inexistente.txt'
try:
soma = int(valor) + 10
resultado = soma / int(valor)
print("Soma:", soma)
print("Resultado:", resultado)
except:
x = 10 /0
print("ERROOOOOO!!!!")
...\python.exe “.../erro_manipula_excecao.py"
Informe um número: Olá
Traceback (most recent call last):
File “.../erro_manipula_excecao.py", line 4, in <module>
soma = int(valor) + 10
ValueError: invalid literal for int() with base 10: 'Olá'
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 160
Curso Python para Todos
class Error(Exception):
"""Classe base para outras exceções"""
pass
class numeroMenorError(Error):
"""Exceção levantada quando o valor informado é menor do que o esperado"""
pass
class numeroMaiorError(Error):
"""Exceção levantada quando o valor informado é maior do que o esperado"""
pass
numero_da_sorte = 20
while True:
try:
numero = int(input("Informe um número: "))
Documentação
Pydoc
Esta documentação pode ser apresentada como páginas de texto no console, servidas em um
navegador da Web ou salvas em arquivos HTML.
Para módulos, classes, funções e métodos, a documentação exibida é derivada do docstring (ou seja,
o atributo __doc__) do objeto e, recursivamente de seus membros documentáveis.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 161
Curso Python para Todos
Se não houver nenhuma docstring, o pydoc tenta obter uma descrição do bloco de linhas de
comentários acima da definição da classe, função ou método no arquivo de origem ou na parte
superior do módulo.
A função help() invoca o sistema de ajuda on-line no interpretador interativo, que usa o pydoc para
gerar sua documentação como texto no console.
A mesma documentação de texto também pode ser visualizada de fora do interpretador Python
executando pydoc como um script no prompt de comando (terminal) do sistema operacional.
Você pode pressionar enter para ir passando o conteúdo ou pressionar “q” par sair.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 162
Curso Python para Todos
A saída do pydoc é similar às páginas de manual mostradas pelo comando man do Unix.
Veja o resultado do comando “man cp” no Linux. O comando “cp” é utilizado para cópia de arquivos.
Você pode iniciar um servidor web com o pydoc para ler a documentação do Python.
No Windows use: “python –m pydoc –p 8000”, onde 8000 é uma porta de sua escolha.
Veja o resultado:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 163
Curso Python para Todos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 164
Curso Python para Todos
No Linux, o pydoc também tem uma interface gráfica, mas que depende da biblioteca Tkinter.
Use o comando abaixo para instalar esta dependência:
$ sudo apt-get install python-tk
Após a instalação, execute o comando abaixo:
$ pydoc -g
Aparece uma interface com um campo de pesquisa “Search for”, onde você pode digitar um texto
para pesquisar. Eu digite “float” nesta caixa e pressionei enter, na segunda imagem, estão sendo
exibidos 3 resultados para “float”, veja que na terceira imagem temos o resultado ao escolher o
primeiro item exibido e clicar em “go to selected”
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 165
Curso Python para Todos
Vamos agora ver como usar docstrings para gerar documentos em HTML para nossos programas.
"""
Este módulo possui uma classe para a realização de diversos cálculos utilizando dois números
Sintaxe:
Calculo(valor1, valor2)
Métodos implementados:
somar, subtrair, dividir.
"""
class Calculo(object):
"""
Classe para realização dos cálculos
"""
def somar(self):
"""
Método que realiza a soma de dois números
:return: Retorna o resultado da soma de dois números
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 166
Curso Python para Todos
"""
return self.numero1 + self.numero2
def subtrair(self):
"""
Método que realiza a subtração de dois números
:return: Retorna o resultado da subtração de dois números
"""
return self.numero1 - self.numero2
def subtrair_do_maior(self):
"""
Método que realiza a subtração de dois números, utilizando sempre maior - menor
:return: Retorna o resultado da subtração de dois números
"""
""" Validando qual número é maior para realizar o subtração -> Não será utilizado"""
if self.numero2 < self.numero1:
resultado = self.numero2 - self.numero1
else:
resultado = self.numero1 - self.numero2
return resultado
def dividir(self):
"""
Método que realiza a divisão de dois números
:return: Retorna a divisão de dois números
"""
return self.numero1 / self.numero2
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 167
Curso Python para Todos
Arquivos e diretórios/pastas
Modo Operações
r Leitura (padrão).
w Escrita. Se não existir, cria, caso exista o arquivo, apaga seu conteúdo.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 168
Curso Python para Todos
b Modo binário.
A função open retorna um objeto do tipo file (arquivo), que utilizamos para ler e escrever os
dados no arquivo.
Para gravar os dados no arquivo utilizamos o método write, para ler utilizamos read e, para
fechar o arquivo, usamos close.
Ao trabalharmos com arquivos, devemos sempre realizar o seguinte siclo: abertura, leitura
e/ou escrita, fechamento.
A abertura realiza a ligação entre o programa e o espaço em disco, gerenciado pelo sistema
operacional. As etapas de leitura e/ou escrita são as operações que desejamos realizar no programa,
e o fechamento informa ao sistema operacional que não vamos mais trabalhar com o arquivo.
O fechamento do arquivo é muito importante, pois cada arquivo aberto consome recursos do
computador. Só o fechamento do arquivo garante a liberação desses recursos e preserva a integridade
dos dados do arquivo. O close() fecha completamente o arquivo, encerrando os recursos em uso,
liberando-os para o sistema operacional. Após fechar o arquivo, qualquer tentativa de uso irá gerar
uma falha.
Fechar o arquivo é importante porque o sistema operacional realiza diversas funções para
otimizar a velocidade de suas operações e uma dessas funções é não gravar os dados diretamente no
disco, mantendo o conteúdo na memória auxiliar. Quando não fechamos o arquivo, corremos o risco
de essa memória auxiliar não ser transferida para o disco e, assim, perdermos o que foi escrito pelo
programa.
A sintaxe é: arquivo.close().
# Fechando o arquivo
arquivo.close()
Eu passarinho!
# Fechando o arquivo
arquivo.close()
# Imprimindo a lista
print(linhas)
['Este é meu primeiro arquivo.\n', 'Vou gravar nele um poema:\n', 'Poeminha do Contra – Mario Quintana\n',
'Todos estes que aí estão\n', 'Atravancando o meu caminho,\n', 'Eles passarão.\n', 'Eu passarinho!\n']
Eu passarinho!
# Fechando o arquivo
arquivo.close()
https://www.wikiwand.com/pt/ASCII
linhas = ["A Centopeia – Marina Colasanti\n", "Quem foi que primeiro\n", "teve a
ideia\n", "de contar um por um\n",
"os pés da centopeia?\n", "Se uma pata você arranca\n", "será que a
bichinha manca?\n",
"E responda antes que eu esqueça\n", "se existe o bicho de cem pés\n",
"será que existe algum de cem cabeças?\n"]
arquivo.writelines(linhas)
arquivo.close()
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 172
Curso Python para Todos
O with é projetado para fornecer uma sintaxe muito limpa e gerenciamento de exceções,
sendo assim, uma boa prática utilizá-lo ao trabalhar com arquivos.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 173
Curso Python para Todos
palavras = []
with open("hino_nacional.txt", "r", encoding="utf-8") as arquivo:
for linha in arquivo:
palavras += linha.split()
print(palavras)
['Ouviram', 'do', 'Ipiranga', 'às', 'margens', 'plácidas', 'De', 'um', 'povo', 'heroico', 'o', 'brado', 'retumbante', 'E', 'o', 'sol', 'da', 'Liberdade,', 'em',
'raios', 'fúlgidos', 'Brilhou', 'no', 'céu', 'da', 'Pátria', 'nesse', 'instante', 'Se', 'o', 'penhor', 'dessa', 'igualdade', 'Conseguimos', 'conquistar', 'com',
'braço', 'forte', 'Em', 'teu', 'seio,', 'ó', 'Liberdade', 'Desafia', 'o', 'nosso', 'peito', 'a', 'própria', 'morte!', 'Ó', 'Pátria', 'amada', 'Idolatrada', 'Salve!',
'Salve!', 'Brasil,', 'um', 'sonho', 'intenso,', 'um', 'raio', 'vívido', 'De', 'amor', 'e', 'de', 'esperança', 'à', 'terra', 'desce', 'Se', 'em', 'teu', 'formoso',
'céu,', 'risonho', 'e', 'límpido', 'A', 'imagem', 'do', 'Cruzeiro', 'resplandece', 'Gigante', 'pela', 'própria', 'natureza', 'És', 'belo,', 'és', 'forte,',
'impávido', 'colosso', 'E', 'o', 'teu', 'futuro', 'espelha', 'essa', 'grandeza', 'Terra', 'adorada', 'Entre', 'outras', 'mil', 'És', 'tu,', 'Brasil', 'Ó', 'Pátria',
'amada!', 'Dos', 'filhos', 'deste', 'solo', 'és', 'mãe', 'gentil', 'Pátria', 'amada', 'Brasil!', 'Deitado', 'eternamente', 'em', 'berço', 'esplêndido', 'Ao',
'som', 'do', 'mar', 'e', 'à', 'luz', 'do', 'céu', 'profundo', 'Fulguras,', 'ó', 'Brasil,', 'florão', 'da', 'América', 'Iluminado', 'ao', 'sol', 'do', 'Novo',
'Mundo!', 'Do', 'que', 'a', 'terra', 'mais', 'garrida', 'Teus', 'risonhos,', 'lindos', 'campos', 'têm', 'mais', 'flores', 'Nossos', 'bosques', 'têm', 'mais',
'vida', 'Nossa', 'vida', 'no', 'teu', 'seio', 'mais', 'amores', 'Ó', 'Pátria', 'amada', 'Idolatrada', 'Salve!', 'Salve!', 'Brasil,', 'de', 'amor', 'eterno', 'seja',
'símbolo', 'O', 'lábaro', 'que', 'ostentas', 'estrelado', 'E', 'diga', 'o', 'verde-louro', 'desta', 'flâmula', 'Paz', 'no', 'futuro', 'e', 'glória', 'no',
'passado', 'Mas,', 'se', 'ergues', 'da', 'justiça', 'a', 'clava', 'forte', 'Verás', 'que', 'um', 'filho', 'teu', 'não', 'foge', 'à', 'luta', 'Nem', 'teme,', 'quem',
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 174
Curso Python para Todos
'te', 'adora,', 'a', 'própria', 'morte', 'Terra', 'adorada', 'Entre', 'outras', 'mil', 'És', 'tu,', 'Brasil', 'Ó', 'Pátria', 'amada!', 'Dos', 'filhos', 'deste', 'solo',
'és', 'mãe', 'gentil', 'Pátria', 'amada', 'Brasil!']
palavras = []
with open("hino_nacional.txt", "r", encoding="utf-8") as arquivo:
for linha in arquivo:
linha = linha.replace(",","").replace("!","")
palavras += linha.upper().split()
print(palavras)
while True:
palavra = input("Informe uma palavra para ver se faz parte do Hino Nacional (ou
sair para finalizar): ")
if palavra.upper() == "SAIR":
print("\nObrigado por usar o sistema, volte sempre.")
break
elif palavra.upper() in palavras:
print("A palavra", palavra, "foi encontrada no Hino Nacional.")
print("Quantidade de ocorrências:", palavras.count(palavra.upper()))
else:
print("A palavra", palavra, "não foi encontrada no Hino Nacional.")
Aprendemos a ler, criar e alterar arquivos, vamos aprender agora como listar arquivos,
verificar o tamanho e a data de criação dos mesmos. Vamos ainda aprender a manipular diretórios.
Para identificar o diretório onde nosso programa está sendo executado usamos o método
getcwd() do módulo os.
import os
print(os.getcwd())
...\python.exe ".../12_caminho_atual.py"
P:\PCloud\Udemy\MeusCursos\001-PythonParaTodos\Secao 22 - Arquivos\01_Introducao\codigo
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 175
Curso Python para Todos
Criando diretórios
import os
os.mkdir("Curso Python")
os.mkdir("Curso Linux")
os.mkdir("Curso Missangas")
os.mkdir("Curso Python/Aula Arquivos")
os.mkdir("Curso Python/Aula Chatbot")
Pastas
criadas
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 176
Curso Python para Todos
A função mkdir() cria apenas um diretório por vez, por exemplo, se tentássemos criar o
diretório “Aula Arquivos” com o comando os.mkdir("Curso Python/Aula Arquivos") sem ter criado o
diretório “Curso Python” antes, seria gerado um erro. Veja a seguir, onde tento criar a pasta
“ponteiros” dentro de uma pasta inexistente.
import os
os.mkdir("Curso C/Ponteiros")
...\python.exe “.../criando_diretorio_erro.py"
Traceback (most recent call last):
File “.../criando_diretorio_erro.py", line 3, in <module>
os.mkdir("Curso C/Ponteiros")
FileNotFoundError: [WinError 3] The system cannot find the path specified: 'Curso C/Ponteiros'
Process finished with exit code 1
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 177
Curso Python para Todos
os.makedirs("Curso C/Ponteiros")
Navegando em diretórios
os.chdir("Curso Linux")
print("Pasta atual:", os.getcwd())
os.chdir("..")
print("Pasta atual:", os.getcwd())
os.chdir("Curso Python")
print("Pasta atual:", os.getcwd())
os.chdir("Aula Arquivos")
print("Pasta atual:", os.getcwd())
os.chdir("../../Curso Missangas")
print("Pasta atual:", os.getcwd())
C:\Users\Evaldo\AppData\Local\Programs\Python\Python36\python.exe "P:/PCloud/Udemy/MeusCursos/001-PythonParaTodos/Secao
22 - Arquivos/01_Introducao/codigo/navegando_diretorios.py"
Pasta atual: P:\PCloud\Udemy\MeusCursos\001-PythonParaTodos\Secao 22 - Arquivos\01_Introducao\codigo\Curso Linux
Pasta atual: P:\PCloud\Udemy\MeusCursos\001-PythonParaTodos\Secao 22 - Arquivos\01_Introducao\codigo
Pasta atual: P:\PCloud\Udemy\MeusCursos\001-PythonParaTodos\Secao 22 - Arquivos\01_Introducao\codigo\Curso Python
Pasta atual: P:\PCloud\Udemy\MeusCursos\001-PythonParaTodos\Secao 22 - Arquivos\01_Introducao\codigo\Curso Python\Aula
Arquivos
Pasta atual: P:\PCloud\Udemy\MeusCursos\001-PythonParaTodos\Secao 22 - Arquivos\01_Introducao\codigo\Curso Missangas
Process finished with exit code 0
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 178
Curso Python para Todos
Para renomear um diretório que não esteja no path atual, você deve informar o caminho.
import os
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 179
Curso Python para Todos
import os
os.rename("nome_antigo.txt", "nome_novo.txt")
A função rename() pode ser usada para mover um arquivo, caso você informe um diretório diferente.
Veja como mover um arquivo.
import os
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 180
Curso Python para Todos
import os
print(os.listdir("C:\Windows\Fonts"))
C:\Users\Evaldo\AppData\Local\Programs\Python\Python36\python.exe "P:/PCloud/Udemy/MeusCursos/001-PythonParaTodos/Secao
22 - Arquivos/01_Introducao/codigo/listando.py"
['8514fix.fon', '8514fixe.fon', '8514fixg.fon', '8514fixr.fon', '8514fixt.fon', '8514oem.fon', '8514oeme.fon', '8514oemg.fon', '8514oemr.fon',
'8514oemt.fon', '8514sys.fon', '8514syse.fon', '8514sysg.fon', '8514sysr.fon', '8514syst.fon', '85775.fon', '85855.fon', '85f1255.fon',
...CONTEÚDO REMOVIDO
'vgaf1255.fon', 'vgaf1256.fon', 'vgaf1257.fon', 'vgaf874.fon', 'vgafix.fon', 'vgafixe.fon', 'vgafixg.fon', 'vgafixr.fon', 'vgafixt.fon', 'vgaoem.fon',
'vgas1255.fon', 'vgas1256.fon', 'vgas1257.fon', 'vgas874.fon', 'vgasys.fon', 'vgasyse.fon', 'vgasysg.fon', 'vgasysr.fon', 'vgasyst.fon',
'VINERITC.TTF', 'VIVALDII.TTF', 'VLADIMIR.TTF', 'webdings.ttf', 'wingding.ttf', 'WINGDNG2.TTF', 'WINGDNG3.TTF', 'yandex.ttf',
'YuGothB.ttc', 'YuGothL.ttc', 'YuGothM.ttc', 'YuGothR.ttc']
Process finished with exit code 0
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 181
Curso Python para Todos
Como o listdir() retorna uma lista, vamos fazer um loop percorrendo cada item do resultado. Usando
a função isdir() ou isfile() que fazem parte do módulo os.path vamos validar cada um destes itens.
import os
.idea é um diretório!
...REMOVIDO CONTEÚDO.
movendo_arquivo.py é um arquivo!
listando.py é um arquivo!
validar.py é um arquivo!
import os
diretorios = []
arquivos = []
for objeto in os.listdir("."):
if os.path.isdir(objeto):
diretorios.append(objeto)
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 182
Curso Python para Todos
elif os.path.isfile(objeto):
arquivos.append(objeto)
print("Diretórios:", diretorios)
print("Arquivos:", arquivos)
Diretórios: ['.idea', 'Curso Python', 'Curso Linux', 'Curso Maquiagem', 'Curso C']
Para verificar a existência de um arquivo ou diretório usamos a função exists() do módulo path.
import os.path
while True:
nome = input("Informe um nome de arquivo ou pasta (informe 'sair' para
finalizar): ")
if nome.upper() == "SAIR":
break
if os.path.exists(nome):
print(nome, "existe!!!")
if os.path.isdir(nome):
print(nome, "é um diretório.")
elif os.path.isfile(nome):
print(nome, "é um arquivo.")
else:
print(nome, "NÃO existe!!!")
hino_nacional.py existe!!!
hino_nacional.py é um arquivo.
Informe um nome de arquivo ou pasta (informe 'sair' para finalizar): Curso Linux
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 183
Curso Python para Todos
import os.path
import time
while True:
nome = input("Informe um nome de arquivo (informe 'sair' para finalizar): ")
if nome.upper() == "SAIR":
break
print("Nome:", nome)
print("Tamanho:", os.path.getsize(nome), "bytes")
print("Data da criação:", time.ctime(os.path.getctime(nome)))
print("Data de modificação:", time.ctime(os.path.getmtime(nome)))
print("Data de acesso:", time.ctime(os.path.getatime(nome)))
Nome: hino_nacional.py
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 184
Curso Python para Todos
Manipulando caminhos
Cada sistema operacional trabalha de uma forma específica quando se trata de caminhos de arquivos
e pastas, no Linux e no Mac OS X o caractere separador de pastas/diretórios é o “/”, já no Windows, é
o “\”.
os.path.abspath()
Retorna o caminho absoluto do path informado por parâmetro. Se o caminho não começar com “/”,
o diretório atual é acrescentado, retornando o caminho completo à partir da raiz. No caso do
Windows, incluindo também a letra do disco (drive) “C:”, “D:”, etc.
os.path.basename()
os.path.dirname()
os.path.splitdrive()
Usado no Windows para separar a letra do drive. Retorna uma tupla, onde a letra do drive é o primeiro
elemento, e o restante do caminho, o segundo elemento. No Linux,
os.path.commonpath()
os.path.commonprefix()
os.path.join()
import os
if not os.path.exists(caminho):
os.mkdir("Curso Python/Aula Arquivos/Caminhos")
if not os.path.exists(caminho2):
os.mkdir("Curso Python/Aula Chatbot/Facebook Messenger")
import os
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 186
Curso Python para Todos
import os
if os.path.exists(nome_diretorio):
print(f"O diretório '{nome_diretorio}' existe!")
else:
print(f"O diretório '{nome_diretorio}' não existe!")
os.rmdir(nome_diretorio)
if os.path.exists(nome_diretorio):
print(f"O diretório '{nome_diretorio}' existe!")
else:
print(f"O diretório '{nome_diretorio}' não existe!")
Para excluir diretórios com conteúdo usamos a função rmtree() do módulo shutil.
import os
import shutil
dir1 = "Diretorio1"
dir2 = "Diretorio2"
dir3 = "Diretorio3"
arq1 = "Arquivo1.txt"
arq2 = "Arquivo2.txt"
if not os.path.exists(dir1):
os.makedirs(dir1 + "/" + dir2 + "/" + dir3)
print(f"{diret}/")
for arq in arquivos:
print(f"{arq}")
try:
os.rmdir(dir1)
except:
print(f"Não pode excluir '{dir1}' porque tem conteúdo.")
shutil.rmtree(dir1)
if not os.path.exists(dir1):
print("Os diretórios foram apagados.")
Diretorio2/
texto.txt
Diretorio3/
texto2.txt
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 188
Curso Python para Todos
Em resumo um banco de dados é uma coleção de dados relacionados. Com dados, queremos dizer
fatos conhecidos que podem ser registrados e possuem um significado. Por exemplo, considere os
nomes, números de telefone e endereços dos seus amigos e parentes. Você pode ter registrado esses
dados em uma agenda ou, talvez, os tenha armazenado em um disco rígido do computador ou até
mesmo em seu smartphone utilizando um sistema para isso.
Bancos de dados relacionais já são consolidados e difundidos há bastante tempo. Usaremos este
modelo na maioria de nossas aulas.
Bancos de dados NoSQL estão cada vez mais conquistando espaço nas organizações.
São bancos “não-relacionais”, baseados em documentos ou na teoria dos grafos, por exemplo.
Um sistema gerenciador de banco de dados (SGBD) é uma coleção de programas que permite aos
usuários criar e manter um ou mais bancos de dados.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 189
Curso Python para Todos
O SGBD é um sistema de software de uso geral que facilita o processo de definição, construção,
manipulação e compartilhamento de bancos de dados entre diversos usuários e aplicações. Definir
um banco de dados envolve especificar os tipos, estruturas e restrições dos dados a serem
armazenados.
Um sistema gerenciador de banco de dados (SGBD) é uma coleção de programas que permite aos
usuários criar e manter um ou mais bancos de dados.
O SGBD é um sistema de software de uso geral que facilita o processo de definição, construção,
manipulação e compartilhamento de bancos de dados entre diversos usuários e aplicações. Definir
um banco de dados envolve especificar os tipos, estruturas e restrições dos dados a serem
armazenados.
A definição ou informação descritiva do banco de dados também é armazenada pelo SGBD na forma
de um catálogo ou dicionário, chamado de metadados. A construção do banco de dados é o processo
de armazenar os dados em algum meio controlado pelo SGBD. A manipulação de um banco de dados
inclui funções como consulta ao banco de dados para recuperar dados específicos, atualização do
banco de dados para refletir mudanças no minimundo e geração de relatórios com base nos dados.
Um SGBD controla e permite acesso aos bancos de dados por vários usuários e sistemas.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 190
Curso Python para Todos
O que é uma tabela? Em um banco de dados relacional, uma tabela é o local onde armazenamos os
nossos dados. Por exemplo, podemos ter uma tabela para armazenar as informações de nossos
clientes, fornecedores e vendas (no caso de um sistema de uma empresa), ou de nossos amigos (no
caso de uma agenda pessoal). Uma tabela é composta por colunas (campos) e linhas (registros). As
colunas são definidas no momento da criação da tabela (podendo ser removidas ou adicionadas novas
colunas), antes de criar uma coluna precisamos saber o que será armazenado nela, ou seja, o tipo de
dados. Já as linhas são os dados, também conhecidos como “registros” que são inseridos na tabela.
Antes de criar uma tabela precisamos saber qual sua finalidade e quais informações vamos armazenar
na mesma.
Precisamos criar uma tabela para guardar os clientes de um pequeno estabelecimento comercial. Já
sabemos o nome da tabela, que será “cliente”. Precisamos armazenar o nome (texto), o número do
telefone (texto) e o e-mail (texto), precisamos também criar um campo que será o identificador único
para o registro no banco de dados. Este campo será chamado id (identificador) e será um campo
numérico sem casas decimais (inteiro). O campo de e-mail poderia ser utilizado como identificador
único, porém, utilizar um campo de texto para identificação do registro não é aconselhado porque
torna a busca da informação mais pesada, tornando o sistema mais lento.
Aqui entra o conceito de “chave primária” que é o nosso campo único (que não se repete em toda
tabela), no nosso exemplo é o campo “id”.
QUAL O NOME DO CAMPO? O QUE VAI ARMAZENAR? QUAL É O TAMANHO MÁXIMO? É A CHAVE PRIMÁRIA?
ID NÚMERO INTEIRO SIM
NOME TEXTO 100
TELEFONE TEXTO 14
E-MAIL TEXTO 100
SQL
SQL (Structured Query Language ou Linguagem Estruturada de Consulta) é uma linguagem utilizada
para “conversar” com um gerenciador de banco de dados. Usamos comandos SQL para inserir, alterar,
consultar e excluir registros em tabelas de bancos de dados. Também usamos comandos SQL para
criar e realizar manutenção em elementos do banco de dados, como tabelas, índices, colunas, etc.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 191
Curso Python para Todos
Vamos baixar a versão Community. Que possui licença baseada na GPL sendo assim, podemos utilizar
em nossos exemplos sem termos que comprar uma licença para isso.
Na página seguinte você pode efetuar login, ou se cadastrar, ou simplesmente clicar em “Não
obrigado, basta iniciar meu download” e aguardar o término do download.
A primeira tela exibida é a tela da licença, marque a opção informando que aceita os termos e clique
em “Next”.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 192
Curso Python para Todos
Na janela seguinte escolha a opção “Custom”, para selecionar os itens a serem instalados e clique em
“Next”.
Temos que selecionar os produtos ou recursos à esquerda e clicar na seta jogando para a direita. Os
itens que selecionei estão na imagem. Ao finalizar clique em “Next”.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 193
Curso Python para Todos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 194
Curso Python para Todos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 195
Curso Python para Todos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 196
Curso Python para Todos
Na tela seguinte temos que selecionar o método de autenticação. Pode deixar o método de
autenticação forte. Clique em “Next”.
Na tela seguinte informe a senha para conexão ao banco de dados e repita a senha. Coloque uma
senha que não esqueça e clique em “Next”.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 197
Curso Python para Todos
Agora temos a configuração do MySQL como serviço onde são selecionados o nome do serviço, se o
serviço vai iniciar com o Windows e qual usuário vai iniciar o serviço. Pode manter o padrão e clicar
em “Next”.
Na próxima tela podemos habilitar o MySQL como um “Document Store”, que é um recurso novo para
trabalhar como um banco NoSQL. Não vamos utilizar por enquanto, então não vamos ativar. Somente
clique em “Next”.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 198
Curso Python para Todos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 199
Curso Python para Todos
Finalizada a instalação podemos escolher se o instalador deve iniciar o MySQL Workbench, que é a
ferramenta que utilizamos para manipular os bancos de dados. Deixe marcado e clique em “Finish”.
Será aberto o programa MySQL Workbench. Veja na segunda imagem a opção para executar no
MySQL Workbench no menu iniciar do Windows.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 200
Curso Python para Todos
Nesta aula vamos realizar a instalação do MySQL na distribuição Linux Mint 18.3 que é baseada no
Ubuntu 16.04 LTS.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 201
Curso Python para Todos
Finalizado o download, execute o arquivo baixado. Ao executar o arquivo será exibida a janela de
instalação. Clique em “Install Package” e informe a senha de root para iniciar a instalação. Na janela
seguinte escolha “ubuntu xenial”, clique em “Forward”. Na próxima tela deixe selecionado “MySQL
Server & Cluster (Currently selected: mysql-8.0)” e clique em “Forward”.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 202
Curso Python para Todos
Na tela seguinte, deixe selecionado “mysql-8.0” e clique em “Forward”. E, ao voltar para a tela de
configuração, clique na lista e selecione “Ok”. Clique em “Forward” e clique em close na tela seguinte.
Feche a janela do instalador.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 203
Curso Python para Todos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 204
Curso Python para Todos
Agora você tem que abrir o terminal e instalar o MySQL com os comandos a seguir:
Na primeira tela você tem que informar a senha para acesso ao MySQL e pressionar a tecla “enter”.
Deverá repetir a senha e pressionar “enter” novamente
A próxima tela é um aviso. Pressione a tecla “tab” para que o foco esteja na opção “ok” e pressione
“Enter”.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 205
Curso Python para Todos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 206
Curso Python para Todos
O MySQL Workbench é uma ferramenta visual unificada para arquitetos de banco de dados,
desenvolvedores e administradores (DBAs). O MySQL Workbench fornece modelagem de dados,
desenvolvimento SQL e ferramentas abrangentes de administração para configuração de servidores,
administração de usuários, backup de banco de dados e muito mais.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 207
Curso Python para Todos
Para acessar o MySQL Workbench no Windows, basta ir no menu iniciar, grupo MySQL e clicar em
“MySQL Workbench 8.0 CE” e no Linux, no menu Programming escolha “MySQL Workbench” ou no
terminal digite “mysql-workbench” sem as aspas.
Você pode conectar-se à instância local do MySQL dando dois cliques na conexão exibida conforme
imagem ao lado. Caso seja solicitada a senha, informe a senha criada na instalação do MySQL.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 208
Curso Python para Todos
Conexões
Criando um schema
Vamos criar o nosso banco de dados, ou “esquema” (schema) como é denominado o banco de dados
no MySQL.
Para isso vá até o painel de navegação, onde está o Schema sys e clique com o botão direito do mouse
na área vazia conforme imagem ao lado e escolha “Create Schema”.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 209
Curso Python para Todos
No campo “Name:” informe um nome para nosso esquema, vamos chamá-lo de “agenda”.
Em seguida, clique em “Apply”. Na janela seguinte confirme clicando em “Apply” novamente e depois
em “Finish”.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 210
Curso Python para Todos
Observe que será exibida o esquema “agenda” no painel de navegação. Pode fechar a janela “agenda
– Schema” neste momento.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 211
Curso Python para Todos
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 212
Curso Python para Todos
Clique com o botão direito do mouse sobre “Tabelas” e escolha a opção “Criar Tabela”.
Será exibida uma guia chamada “new_table - Table” para definirmos a nossa tabela.
Em “Table Name:” informe “contatos” e na área para definição das colunas das tabelas defina os
seguintes campos:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 213
Curso Python para Todos
UQ = Unique (Único).
Após definir os campos clique em “Apply” e na janela exibida, clique em “Apply” novamente e depois
em “Finish”. Pode fechar a aba “contatos – Table”.
Você observou que na janela de confirmação foi exibido o comando SQL para criação da tabela
“contato” no schema “agenda”.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 214
Curso Python para Todos
Como exemplo, crie uma tabela denominada “exemplo” escrevendo o comando SQL da imagem a
Antes de criar um campo de uma tabela você precisa conhecer os dados que serão armazenados para
que escolha o melhor tipo de dados para o mesmo.
Vamos ver agora alguns dos tipos de dados disponibilizados pelo MySQL.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 215
Curso Python para Todos
Os tipos DECIMAL e NUMERIC armazenam dados numéricos exatos. Esses tipos são usados quando é
importante preservar precisão exata, por exemplo com dados monetários.
No MySQL, NUMERIC é implementado como DECIMAL, então o exemplo a seguir sobre decimal,
aplica-se a numeric.
Quando vamos criar uma coluna decimal ou numérica temos que definir a precisão e a escala como a
seguir:
salario DECIMAL(6, 2)
-9999.99 a 9999.99.
Se for informado zero na escala “DECIMAL(6,0)”, o valor decimal não vai conter o ponto decimal ou a
parte fracionária.
numero FLOAT(7,4)
Para estes tipos de dados o MySQL faz arredondamentos. Por exemplo, se informarmos o valor
999.00009 no campo “numero” o valor aproximado será 999.0001.
Sendo assim, não podemos utilizar estes tipos de dados em se tratando de números exatos.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 216
Curso Python para Todos
O tipo DATE é usado para valores com uma parte de data, mas sem parte de hora. O MySQL recupera
e exibe valores DATE no formato ‘AAAA-MM-DD’. O intervalo suportado para este campo é entre
‘1000-01-01’ e ‘9999-12-31’.
O tipo DATETIME é usado para valores que contenham partes de data e hora. O MySQL recupera e
exibe valores DATETIME no formato ‘AAAA-MM-DD HH:MM:SS’. O intervalo suportado é entre ‘1000-
01-01 00:00:00’ e ‘9999-12-31 23:59:59’.
O tipo de dados TIMESTAMP é usado para valores que contenham partes de data e hora. TIMESTAMP
tem um intervalo entre ‘1970-01-01 00:00:01’UTC e ‘2038-01-19 03:14:07’UTC.
(O Tempo Universal Coordenado, abreviadamente UTC (do inglês Universal Time Coordinated),
também conhecido como tempo civil, é o fuso horário de referência a partir do qual se calculam todas
as outras zonas horárias do mundo.)
Um valor de DATETIME ou TIMESTAMP pode incluir uma parte fracionária de segundos à direita em
até microssegundos (6 dígitos) de precisão. Em particular, qualquer parte fracionária em um valor
inserido em uma coluna DATETIME ou TIMESTAMP é armazenada em vez de descartada. Com a parte
fracionária incluída, o formato desses valores é 'AAAA-MM-DD HH:MM:SS[.fração]', o intervalo para
valores de DATETIME é de '1000-01-01 00:00:00.000000' a '9999-12-31 23:59:59.999999 ', e o
intervalo para valores TIMESTAMP é de '1970-01-01 00:00:01.000000’ a '2038-01-19
03:14:07.999999'. A parte fracionária deve sempre ser separada do resto do tempo por um ponto
decimal; nenhum outro delimitador de segundos fracionários é reconhecido.
Os tipos CHAR e VARCHAR são semelhantes, mas diferem na maneira como os dados são armazenados
e recuperados. Ambos são declarados com um comprimento que indica o número máximo de
caracteres que deseja armazenar. Por exemplo CHAR(10) pode conter até 10 caracteres.
O tamanho armazenado para uma coluna CHAR será sempre o número de caracteres informado, pois
esta coluna terá os valores preenchidos com espaços à direita, porém, na busca desse campo, os
espaços são removidos. Ou seja, se você criar um campo CHAR de tamanho 10, mesmo que preencha
o campo com o texto “Ola”, o campo ocupará o espaço de 10 caracteres (10 bytes), preenchendo com
espaços à direita. O comprimento de um campo CHAR pode ser definido entre 0 e 255.
Colunas do tipo VARCHAR são de tamanho variável. O comprimento pode ser especificado como um
valor entre 0 e 65.535. Diferente do CHAR, os valores em campos VARCHAR são armazenados como
um prefixo de 1 ou 2 bytes de comprimento mais os dados. O prefixo de comprimento indica o número
de bytes no valor. Uma coluna usa um byte de comprimento se os valores (conteúdo do campo) não
exigirem mais do que 255 bytes, dois bytes de comprimento se os valores exigirem mais de 255 bytes.
Gerando um erro ao tentar inserir um telefone com um tamanho maior do que o tamanho do campo
(13 caracteres).
Para visualizar os dados em uma tabela usamos o comando “select”. Você pode especificar a lista de
colunas a retornar ou retornar todas usando o “*”.
Exemplos:
insert into agenda.contatos (nome, telefone, celular) values ('Mickey', '(11)1111-1111', '(11)11111-
1111');
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 218
Curso Python para Todos
insert into agenda.contatos (nome, telefone, celular) values ('Pluto', '(11)2222-2222', '(11)22222-
2222');
insert into agenda.contatos (nome, telefone, celular) values ('Cascão', '(11)6666-6666', '(11)66666-
6666');
insert into agenda.contatos (nome, telefone, celular) values ('Mônica', '(11)8888-8888', '(11)88888-
8888');
insert into agenda.contatos (nome, telefone, celular) values ('Magali', '(11)9999-9999', '(11)99999-
9999');
Podemos filtrar o resultados das nossas consultas usando a cláusula “where” do comando “select”.
Exemplo:
Utilizando o “=“ o conteúdo do campo tem que ser idêntico ao valor informado.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 219
Curso Python para Todos
Usando “Where” com “Like” parar retornar os registros contendo parte do valor informado.
O percentual é um caracter “coringa” que serve para substituir caracteres na busca. No exemplo acima
serão retornados todos contatos cujo nome inicie com “M” e não importa os caracteres depois do
“M”.
select * from agenda.contatos where celular is not null and nome like 'M%’
Serão retornados todos os contatos cujo nome inicie com “M” e que tenham celular (não seja nulo).
A “Minie” não será exibida porque não tem celular (Veja slide anterior). O campo celular está com o
valor nulo “null”.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 220
Curso Python para Todos
Usando o “or” para retornar o resultado com base em uma ou outra informação.
select * from agenda.contatos where (celular is not null and nome like ‘M%’) or (nome like
‘%Donald’)
Serão retornados todos os contatos cujo nome inicie com “M” e que tenham celular (não seja nulo)
ou que tenham “Donald” no nome
Para alterar dados em um registro de uma tabela usamos o comando “update” em conjunto com
cláusulas “where” para determinar qual registro queremos atualizar.
Exemplo:
Muito cuidado na hora de fazer uma alteração especificando bem qual registro será alterado
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 221
Curso Python para Todos
Um update sem uma cláusula where irá alterar todos registros da tabela.
Para excluir um registro de uma tabela usamos o comando “delete” em conjunto com cláusulas
“where” para determinar qual registro queremos excluir. CUIDADO ao usar o comando delete, seu
uso indevido pode trazer graves problemas.
Exemplo:
Este comando exclui o registro que possua o telefone informado na cláusula where. No nosso caso,
excluiu o registro 6 que é o registro da “Margarida”. Veja:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 222
Curso Python para Todos
Caso o MySQL Connector/Python não esteja instalado você pode baixar o instalador em:
https://dev.mysql.com/downloads/connector/python/
Nesta página você pode escolher o sistema operacional e escolher o instalador adequado para sua
versão do Python.
Estão disponíveis versões para diversos sistemas operacionais e também diversas versões do Python.
Em distribuições baseadas em Debian como o Linux Mint você pode instalar através do seguinte
comando (como administrador):
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 223
Curso Python para Todos
Ou
Após instalação podemos executar nosso primeiro exemplo. Para acessar o MySQL usando o Python
podemos usar o módulo “mysql”. Veja um exemplo:
Ao executar este código com as informações de conexão corretas, não haverá nenhum resultado
porque simplesmente conectamos ao MySQL e desconectamos em seguida. Execute o código com
algum dado inválido (nome do usuário, senha, host ou nome do esquema) para ver que ocorrerá um
erro.
Todos os dois métodos são válidos e funcionam igualmente, porém, em nossos exemplos, usaremos
connector().
Para lidar com erros de conexão, use a instrução try e capture todos os erros usando a exceção
errors.Error (que é uma subclasse de StandardError) conforme exemplo a seguir.
import mysql.connector
from mysql.connector import errorcode
Relembrando:
Veja um exemplo:
Figura 289 - Erro quando existe uma keyword no dicionário que não existe na chamada da função.
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 225
Curso Python para Todos
# Criando um cursor
# Cursor é uma estrutura de controle que permite percorrer
# registros, além de faciltar a adição e remoção de registros
# do banco de dados
cursor = conexao.cursor()
cursor.execute(inserir_contato, contato)
conexao.commit()
cursor.close()
conexao.close()
Alterando registros
Executando o comando update para alterar um registro da tabela contatos.
import mysql.connector
atualizar_contato = ("update contatos set nome = %s, telefone = %s, celular = %s where id =
1")
contato = ('Pocahontas', '(28)8888-8888', '(28)88888-8888')
cursor.execute(atualizar_contato, contato)
conexao.commit()
cursor.close()
conexao.close()
Apagando registros
Executando o comando delete para apagar um registro da tabela contatos.
import mysql.connector
cursor.execute(remover_contato)
conexao.commit()
cursor.close()
conexao.close()
Consultando registros
Consultando dados da tabela contatos com o comando select.
import mysql.connector
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 227
Curso Python para Todos
cursor.close()
conexao.close()
Introdução
Nesta aula vamos criar um programa exemplo para realizar cadastros, alterações e consultas de
contatos em nossa tabela.
Será um programa bem simples (sem conceitos muito avançados), sem interface gráfica, sem
orientação a objetos, utilizando apenas alguns conceitos simples aprendidos até o momento.
Para desenhar as telas vamos usar print, para perguntar/capturar a opção desejada vamos usar input,
para interagir com o banco de dados vamos utilizar mysql.connector, para inserir um contato na base
de dados vamos utilizar lista, para listar na tela os contatos vamos utilizar um loop for, para exportar
o cadastro vamos usar comandos de criação e escrita em arquivos, para as opções de menu vamos
usar um dicionário com a opção e a função que será executada, para validar a opção selecionada
vamos usar if/elif/else e para limpar a tela vamos validar se o sistema está sendo executado no
Windows para usarmos o comando “cls” ou senão usaremos o comando “clear” (para isso
importaremos “os” e “platform”).
Execução do sistema
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 228
Curso Python para Todos
Implementando o exemplo
def sair():
print("Obrigado por utilizar o sistema!")
os._exit(1)
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 229
Curso Python para Todos
def mensagem_menu_alterar():
limpar_tela()
print("**************************************************")
print("* ALTERANDO UM CONTATO EXISTENTE *")
print("*------------------------------------------------*")
print("* ESCOLHA A OPÇÃO PARA LOCALIZAR O CONTATO *")
print("* 1 - ID *")
print("* 2 - NOME *")
print("* 3 - TELEFONE *")
print("* 4 - CELULAR *")
print("* 0 - MENU PRINCIPAL *")
print("**************************************************")
def mensagem_cadastrar():
limpar_tela()
print("***************************************************")
print("* CADASTRANDO UM NOVO CONTATO *")
print("***************************************************")
Implementando o dicionário com as funções que serão executadas conforme escolha das opções do
menu principal. Por enquanto só temos implementada a funçao sair:
acoes_menu_principal = {
#'1': cadastrar,
#'2': alterar,
#'3': listar,
#'4': exportar,
'0': sair
}
Vamos mudar o menu principal para chamar uma função de acordo com a opção informada
(verificando a opção no dicionário).
def menu_principal():
try:
mensagem_menu_principal()
opcao = input("Informe a opção desejada: ")
acoes_menu_principal[opcao]()
except:
input("Opção inválida.\nPressione uma tecla para voltar ao menu principal.")
menu_principal()
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 230
Curso Python para Todos
menu_principal()
alterar_contato(contato)
except Exception as err:
print("Ocorreu erro na busca por id! ", err)
input("Pressione uma tecla para voltar...")
alterar()
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 232
Curso Python para Todos
def alterar_contato(contato):
nome = input(f"Informe o nome do contato ({contato['nome']}): ") or \
contato['nome']
telefone = input(f"Informe o telefone do contato ({contato['telefone']}): ") or \
contato['telefone']
celular = input(f"Informe o celular do contato ({contato['celular']}): ") or \
contato['celular']
Altere o menu de ações da função alterar e implemente a função de pesquisa por nome.
acoes_menu_alterar = {
'1': pesquisar_id,
'2': pesquisar_nome,
'3': pesquisar_telefone,
'4': pesquisar_celular,
'0': menu_principal
}
def pesquisar_nome():
try:
nome = input("Informe o nome do contato: ")
comando_sql = f"select id, nome, telefone, celular from contatos " \
f"where nome like '%{nome}%'"
conexao = mysql.connector.connect(**dados_conexao)
cursor = conexao.cursor()
cursor.execute(comando_sql)
contato = []
for id, nome, telefone, celular in cursor:
contato = {"id": id, "nome": nome, "telefone": telefone,
"celular": celular}
cursor.close()
conexao.close()
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 233
Curso Python para Todos
if contato:
print(f"Contato localizado: id:{contato['id']},nome:{contato['nome']},"
f"telefone:{contato['telefone']},celular:{contato['celular']}")
pesquisar_id(contato['id'])
except Exception as err:
print("Ocorreu erro na busca por nome! ", err)
input("Pressione uma tecla para voltar...")
alterar()
if contato:
print(f"Contato localizado: id: {contato['id']}, "
f"nome: {contato['nome']}, "
f"telefone: {contato['telefone']}, "
f"celular: {contato['celular']}")
pesquisar_id(contato['id'])
except Exception as err:
print("Ocorreu erro na busca por telefone! ", err)
input("Pressione uma tecla para voltar...")
alterar()
if contato:
print(f"Contato localizado: id: {contato['id']}, "
f"nome: {contato['nome']},"
f"telefone: {contato['telefone']}, "
f"celular: {contato['celular']}")
pesquisar_id(contato['id'])
except Exception as err:
print("Ocorreu erro na busca por celular! ", err)
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 234
Curso Python para Todos
cursor.close()
conexao.close()
input("Pressione uma tecla para voltar ao menu principal...")
except:
print("Ocorreu erro no listar.")
menu_principal()
cursor.execute(comando)
for id, nome, telefone, celular in cursor:
contatos.append({"id": id, "nome": nome,
"telefone": telefone, "celular": celular})
cursor.close()
conexao.close()
arquivo.close()
print("Exportação realizada.")
input("Pressione uma tecla para voltar ao menu principal...")
menu_principal()
except Exception as err:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 235
Curso Python para Todos
Exercício:
Código completo do sistema com algumas alterações para usar um novo método chamado
executar_comando:
import os
import platform
import mysql.connector
def limpar_tela():
if platform.system() == "Windows":
os.system("cls")
else:
os.system("clear")
def sair():
print("Obrigado por utilizar o sistema!")
os._exit(1)
def mensagem_menu_principal():
limpar_tela()
print("**************************************************")
print("* BEM-VINDO AO SISTEMA DE CADASTRO *")
print("*------------------------------------------------*")
print("* ESCOLHA UMA DAS OPÇÕES DISPONÍVEIS *")
print("* 1 - CADASTRAR UM CONTATO *")
print("* 2 - ALTERAR UM CONTATO *")
print("* 3 - LISTAR CONTATOS *")
print("* 4 - EXPORTAR CONTATOS *")
print("* 0 - SAIR DO SISTEMA *")
print("**************************************************")
def mensagem_menu_alterar():
limpar_tela()
print("**************************************************")
print("* ALTERANDO UM CONTATO EXISTENTE *")
print("*------------------------------------------------*")
print("* ESCOLHA A OPÇÃO PARA LOCALIZAR O CONTATO *")
print("* 1 - ID *")
print("* 2 - NOME *")
print("* 3 - TELEFONE *")
print("* 4 - CELULAR *")
print("* 0 - MENU PRINCIPAL *")
print("**************************************************")
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 236
Curso Python para Todos
def mensagem_cadastrar():
limpar_tela()
print("***************************************************")
print("* CADASTRANDO UM NOVO CONTATO *")
print("***************************************************")
def menu_principal():
try:
mensagem_menu_principal()
opcao = input("Informe a opção desejada: ")
acoes_menu_principal[opcao]()
except:
input("Opção inválida.\nPressione uma tecla para voltar"
" ao menu principal.")
menu_principal()
menu_principal()
def cadastrar():
mensagem_cadastrar()
nome = input("Informe o nome do contato (obrigatório): ")
telefone = input("Informe o telefone do contato (obrigatório): ")
celular = input("Informe o celular do contato (obrigatório): ")
menu_principal()
def alterar():
mensagem_menu_alterar()
opcao = input("Informe a opção desejada: ")
executar_acoes_menu("menu_alterar", opcao)
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 237
Curso Python para Todos
def pesquisar_id(id=""):
try:
if not id:
id = input("Informe o id do contato: ")
comando_sql = f"select id, nome, telefone, celular from " \
f"contatos where id = {id}"
contato = executar_comando("localizar", comando_sql, "")
alterar_contato(contato)
except Exception as err:
print("Ocorreu erro na busca por id! ", err)
input("Pressione uma tecla para voltar...")
alterar()
def pesquisar_nome():
try:
nome = input("Informe o nome do contato: ")
comando_sql = f"select id, nome, telefone, celular from " \
f"contatos where nome like '%{nome}%'"
contato = executar_comando("localizar", comando_sql, "")
if contato:
print(f"Contato localizado: id: {contato['id']}, "
f"nome: {contato['nome']},"
f"telefone: {contato['telefone']}, "
f"celular: {contato['celular']}")
pesquisar_id(contato['id'])
except Exception as err:
print("Ocorreu erro na busca por nome! ", err)
input("Pressione uma tecla para voltar...")
alterar()
def pesquisar_telefone():
try:
telefone = input("Informe o telefone do contato: ")
comando_sql = f"select id, nome, telefone, celular from " \
f"contatos where telefone = '{telefone}'"
contato = executar_comando("localizar", comando_sql, "")
if contato:
print(f"Contato localizado: id: {contato['id']}, "
f"nome: {contato['nome']}, "
f"telefone: {contato['telefone']}, "
f"celular: {contato['celular']}")
pesquisar_id(contato['id'])
except Exception as err:
print("Ocorreu erro na busca por telefone! ", err)
input("Pressione uma tecla para voltar...")
alterar()
def pesquisar_celular():
try:
celular = input("Informe o celular do contato: ")
comando_sql = f"select id, nome, telefone, celular from " \
f"contatos where celular = '{celular}'"
contato = executar_comando("localizar", comando_sql, "")
if contato:
print(f"Contato localizado: id: {contato['id']}, "
f"nome: {contato['nome']},"
f"telefone: {contato['telefone']}, "
f"celular: {contato['celular']}")
pesquisar_id(contato['id'])
except Exception as err:
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 238
Curso Python para Todos
def alterar_contato(contato):
nome = input(f"Informe o nome do contato ({contato['nome']}): ") or \
contato['nome']
telefone = input(f"Informe o telefone do contato ({contato['telefone']}): ") \
or contato['telefone']
celular = input(f"Informe o celular do contato ({contato['celular']}): ") \
or contato['celular']
def listar():
contatos = executar_comando("listar", "", "")
print("**************************************************")
for contato in contatos:
print(f"Id: {contato['id']}")
print(f"Nome: {contato['nome']}")
print(f"Telefone: {contato['telefone']}")
print(f"Celular: {contato['celular']}")
print("**************************************************")
input("Pressione uma tecla para voltar ao menu principal...")
menu_principal()
def exportar():
try:
nome_arquivo = input("Informe o nome do arquivo: ")
contatos = executar_comando("listar", "", "")
arquivo = open(nome_arquivo, "w", encoding="utf-8")
arquivo.close()
print("Exportação realizada.")
input("Pressione uma tecla para voltar ao menu principal...")
menu_principal()
except Exception as err:
print("Correu erro na função exportar! ", err)
input("Pressione uma tecla para voltar ao menu principal...")
if acao == "cadastrar":
try:
comando_sql = "insert into contatos (nome, telefone, " \
"celular) values (%s, %s, %s) "
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 239
Curso Python para Todos
cursor.execute(comando_sql, dados)
conexao.commit()
cursor.close()
conexao.close()
print("Contato cadastrado com sucesso!")
except Exception as err:
print("Ocorreu um erro no cadastro! ", err)
cursor.close()
conexao.close()
return registros
else:
print("Comando inválido.")
input("Pressione uma tecla para sair...")
cursor.close()
conexao.close()
acoes_menu_principal = {
'1': cadastrar,
'2': alterar,
'3': listar,
'4': exportar,
'0': sair
}
acoes_menu_alterar = {
'1': pesquisar_id,
'2': pesquisar_nome,
'3': pesquisar_telefone,
'4': pesquisar_celular,
'0': menu_principal
}
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 240
Curso Python para Todos
if __name__ == "__main__":
menu_principal()
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 241
Curso Python para Todos
Hattem, Rick V, Mastering Python, Birmingham, Packt Publishing Ltd, 2016, ISBN 978-1-78528-972-9
Romano, Fabrizio, Learning Python, Packt Publishing Ltd, 2015, ISBN 978-1-78355-171-2
Aggarwal, Shalabh, Flask Framework Cookbook, Birmingham, Packt Publishing Ltd, 2015, ISBN 978-1-
78398-340-7
Slatkin, Brett, Python Eficaz: 59 maneiras de programar melhor em Python, São Paulo, Novatec,
2016, ISBN 978-85-7522-510-3
Giridhar, Chetan, Aprendendo Padrões de Projeto em Python, São Paulo, Novatec, 2016, ISBN 978-
85-7522-523-3
Reitz, Kenneth; Schlusser, Tanya, O Guia do Mochileiro Python: Melhores práticas para
desenvolvimento, São Paulo, Novatec, 2017, ISBN 978-85-7522-541-7
Borges, Luiz E, Python para desenvolvedores, São Paulo, Novatec, 2014, ISBN 978-85-7522-405-2
Grinberg, Miguel, Desenvolvimento web com Flask, São Paulo, Novatec, 2018, ISBN 978-85-7522-
681-0
SITES
https://www.udemy.com/python-3-para-todos - https://www.pythonparatodos.com.br
[email protected]
Página 242