Python - Guia Pratico Do Basico - Rafael F. V. C. Santos
Python - Guia Pratico Do Basico - Rafael F. V. C. Santos
Python
Guia prático do básico ao avançado
Por:
Rafael F. V. C. Santos
2ª Edição.
COPYRIGHT© 2020 BY RAFAEL F V C SANTOS
2ª Edição, 2020.
Sumário
Capítulo 1
História do Python
Porque usar o Python?
Versões do Python
Ambiente de Desenvolvimento
Download e Instalação do Anaconda
As principais bibliotecas Python
Básicas:
Gráficas:
Álgebra simbólica:
Estatística:
Outras
Como instalar pacotes
Jupyter Lab
Funcionalidades do Jupyter Notebook
Abrindo um serviço local no Jupyter
Diferença entre Code e Markdown
Programação com Python
Indentação
Comentários
Dicas de Estudos
Capítulo 2
Variáveis, tipos, estruturas e operações
Como estruturar um programa
Operações matemáticas e lógicas
Funções built-in
Operadores matemáticos, relacionais e lógicos
Variáveis e tipos
Variável Inteira
Float e double
Variável String
Variável Booleana
Declarações Múltiplas
Principais erros de declaração de variáveis
Trabalhando com variáveis
Indexação em Python
Funções Built-in das Strings
Variáveis para armazenamento de dados
Listas
Deletando elemento de uma lista
Aninhamento de Listas
Junção de Listas e avaliações de elementos
Cópia e criação de Listas
List Comprehension
Dicionários
Principais métodos dos dicionários
Tuplas
Vetores e matrizes
Vetores
Matrizes
Operações básicas com Vetores e Matrizes
Capítulo 3
Condicionais, laços de repetição e listas
Condicionais if/else/elif
Condicional if
Condicional else
Condicional Elif
Laços de Repetição for e while
Loop for
Loop while
Capítulo 4
Funções
Variáveis locais e globais - funções
Funções úteis no Python
Funções com parâmetros indeterminados
Tópico especial: Funções Lambda
Capítulo 5
I/O de arquivos
Arquivos CSV
Trabalhando com diretórios
Data e hora
Capítulo 6
Geração de gráficos e diagramas com o Python
Gerando Gráficos com o Matplotlib
Gráfico de Barras
Histogramas
Gráficos de Pizza
Capítulo 7
Funções especiais
Função Map
Função Reduce
Função Filter
Função Zip
Função Enumerate
Capítulo 8
Mensagens de erros, warnings
Erro de Sintaxe (SintaxError)
Erro de Identação (IdentationError)
Erro de nome (NameError)
Erro de Valor (ValueError)
Erro de Index (IndexError)
Erro de chave (KeyError)
Erro de Tipo (TypeError)
Diferença entre erro e exceção
Erros x Exceções
Tratando erros e exceções - Try, Except e Finally
Capítulo 9
Classes e objetos com Python
Principais características da POO
Abstração
Encapsulamento
Herança
Polimorfismo
Classes e Objetos no Python
Em Python tudo é um objeto
Herança em Python
Métodos especiais em Python
Capítulo 10
Conexão com banco de dados
Linguagem SQL
SQLite
Entidades
Registros
Chaves
Relacionamentos
Integridade referencial
Normalização de dados
Python e SQLite
Agradecimentos
Sobre o Autor
● Sublime (https://www.sublimetext.com/)
● Atom (https://atom.io/packages/ide-python)
● PyDev (http://www.pydev.org/ )
Básicas:
NumPy -( http://www.numpy.org/)
SciPy (https://www.scipy.org/ )
Pandas (https://pandas.pydata.org/ )
Gráficas:
MatplotLib (https://matplotlib.org/)
Plotly (https://plot.ly/python/)
Bokeh (https://bokeh.pydata.org/en/latest/)
VPython - para gráficos animados em 3D (http://vpython.org/)
Álgebra simbólica:
SymPy (http://www.sympy.org/pt/index.html)
Estatística:
Statsmodels (https://www.statsmodels.org)
Scikit-Learn (http://scikit-learn.org/stable/)
PyMC - para análise Baysiana de Dados (https://github.com/pymc-
devs)
Pystan (http://pystan.readthedocs.io/en/latest/)
Keras (https://keras.io/)
Outras
NetworkX (https://networkx.github.io/)
Wakari - para desenvolvimentos em computação na nuvem
(https://anaconda.org/wakari)
PyCuda, PyOpenCL - processamento paralelo
(https://documen.tician.de/pycuda/)
Theano - processamento paralelo e otimização
(http://deeplearning.net/software/theano/)
CVXPY - otimização convexa com Python (http://www.cvxpy.org/)
PyTables - manipulação de dados em tabelas
(https://www.pytables.org/)
Numba - permite que o Python execute processos em velocidade de
código em linguagem de máquina nativa (baixo nível)
(https://numba.pydata.org/)
Jupyter - permite utilizar o Python diretamente de seu browser
(http://jupyter.org/)
Tensor Flow - ampla biblioteca para trabalhar com inteligência
artificial (https://www.tensorflow.org/?hl=pt-br)
Como instalar pacotes
Podemos digitar nossos códigos Python nela e pedir para que sejam
executados a partir do botão ‘Run’ ou com o atalho do teclado
(Shift + Enter). Após isso, teremos o seguinte resultado:
Note que mudou da cor verde para azul e apareceu o número [1]
dentro de colchetes. À medida que vamos colocando nossos
códigos e pedindo para rodar com o Run ou Shift+Enter novos
números em sequência irão aparecendo automaticamente.
Abaixo você terá acesso aos princípios da filosofia Python, a partir
do ‘import this’. Faça uma leitura cuidadosa para conhecer mais a
respeito do ‘espírito’ da linguagem.
Foi dito a pouco que o Jupyter Notebook é uma excelente
ferramenta para compartilhar tutoriais. E agora você vai entender o
porquê disso. Vamos abrir um novo notebook e renomeá-lo para
‘Estudo_notebook_1’.
Algo muito útil para documentação de scripts e tutoriais é que o
Jupyter aceita comando em HTML, Latex e Markdown. Isso mesmo,
podemos utilizar linguagem de marcação HTML para auxiliar na
estruturação e documentação dos nossos scripts.
Outros ambientes de desenvolvimentos de códigos permitem fazer
comentários a partir de caracteres reservados como (# e ‘’’ ‘’’), no
entanto, com o jupyter podemos criar células e escrever textos
dentro dessas células.
Os textos escritos podem conter as linguagens de marcação do
HTML e até mesmo CSS[8] (Cascading Style Sheets). Assim,
podemos deixar o visual dos nossos Notebooks bem bonitos e
atrativos para os utilizadores.
Markdown é uma linguagem mais simples de marcação que a
HTML. Ela foi desenvolvida por John Gruber e Aaron Swartz.
Basicamente, a markdown converte textos em uma estrutura HTML
que é facilmente compreendida pelo navegador.
Vamos estudar agora a diferença entre code e markdown. Isso irá
nos ajudar a fazer a nossa documentação dos códigos no Jupyter.
Diferença entre Code e Markdown
Indentação
Aprender Python é algo bastante intuitivo, mas não é por isso que
seja fácil. No decorrer do nosso aprendizado da linguagem,
precisamos vencer algumas barreiras. Temos que nos acostumar
com a sintaxe de estruturação da linguagem, bem como, conhecer e
memorizar alguns comandos básicos. Saber como buscar
informações extras e ajuda (Help) também é essencial.
Assim devemos entender primeiro a estrutura sintática de formação
da linguagem. Precisamos conhecer como representar variáveis e
seus tipos.
Entender o funcionamento da estruturação de operações
matemáticas e lógicas é fundamental.
Frequentemente, precisamos fazer rotinas (algoritmos) de repetição
e toda linguagem de programação têm suas especificações. Para
facilitar nossos estudos, vamos aprender algumas funções
rotineiras. Essas funções nos auxiliarão em diversas atividades
importantes do decorrer do desenvolvimento dos nossos projetos
com Python.
Também, nos nossos estudos é indispensável conhecer a respeito
de banco de dados, pois esses nos ajudam com a segurança e
manipulação adequada dos nossos dados e informações.
Então fique tranquilo(a) que nos capítulos a seguir iremos passar
por cada um desses assuntos citados acima.
Capítulo 2
Variáveis, tipos, estruturas e operações
Float e double
Variáveis do tipo float e double são aquelas que apresentam a
parte decimal além da inteira.
A variável do tipo float aloca um espaço de 4 bytes de memória
enquanto a do tipo double 8 bytes.
Como a tipagem em Python é dinâmica, automaticamente é
identificado que estamos utilizando uma variável float ou double
quando utilizamos o ponto de decimal. Veja exemplo abaixo:
Variável String
Para terminar esse importante tópico sobre listas, vamos criar a lista
mais simples e básica de todas que é a lista vazia. Para isso, basta
abrirmos e fecharmos colchetes da seguinte maneira:
List Comprehension
Lc = [x for x in ‘sequência’]
O exemplo abaixo mostra como podemos pegar uma lista com 100
valores de 0 a 99 e elevar cada elemento ao quadrado. Veja como
fazer isso com apenas uma linha de código:
Vetores
Matrizes
Condicional if
Condicional else
Condicional Elif
Desse modo, com o uso do ‘elif’ nosso código ficou muito mais
enxuto e legível.
Temos um ganho significativo com a estrutura de indentação onde
não precisamos fazer aninhamentos que possam atrapalhar no
entendimento do código.
Laços de Repetição for e while
Estamos fazendo uma nova iteração ‘j’ onde cada valor deste
iterando está contido dentro de cada uma das listas ‘i’.
Vale ressaltar que podemos chamar as variáveis iteradoras dentro
dos loops ‘for’ da maneira que melhor nos agrade. Vejamos o
exemplo abaixo com o mesmo resultado:
Loop while
while condicao-logica:
<bloco de instrucoes>
Nesse tipo de estrutura temos que ter bastante cuidado para não
gerarmos um loop infinito.
Nosso código precisa estar estruturado para terminar a execução do
loop uma vez que determinada condição lógica for atingida.
Contudo, a instrução while será executada de modo repetitivo,
uma única vez ou inúmeras vezes, até que uma condição lógica
esteja verdadeira.
Veja como imprimir valores de 1 a 10 como fizemos com o loop
‘for’:
Vamos estudar agora algo muito útil. Dentro dos nossos comandos
loops ‘for’ ou ‘while’ podemos mudar o seu comportamento a partir
das diretivas: pass, break ou continue.
Caso seja preciso criar uma função na qual não sabemos bem ao
certo a quantidade de parâmetros de entrada, podemos utilizar o
número de argumentos indeterminado com o uso de um *
(asterisco). Veja um exemplo abaixo desse tipo de uso.
Muito interessante essa possibilidade de deixar os argumentos de
entrada em aberto para valores quaisquer né verdade?
lambda x: x*2
Veja como criar rapidamente uma função para inverter a ordem das
letras dentro de qualquer palavra:
Podemos adicionar vários parâmetros de entrada nas nossas
funções lambdas. Vamos criar uma função para multiplicar três
valores entre si.
ano (tm_yar),
mês (tm_mon),
dia (tm_day),
hora (tm_hour),
minutos (tm_min),
segundos (tm_sec),
dia da semana entre 0 a 6 (segunda é 0) (tm_wday),
dia do ano (1 a 366) (tm_yday),
horário de verão indicado pelo número 1 (tm_isdst).
Histogramas
map(Fun, Seq)
O uso de loop for pode tornar o código lento para grades volumes
de dados. Sempre que possível vale a pena evitar o uso do loop for.
Para isso, temos a função map() que aplica uma ação (função) a
todos os elementos de uma lista sem a necessidade de utilizar loop
for. Assim, a função map() retorna uma nova lista com os elementos
alterados pela função escolhida (Fun).
Vamos a um exemplo. Primeiro precisamos criar funções para
serem aplicadas as listas a partir da função Map.
Iremos criar uma função preço de uma corrida de táxi, na qual
temos um valor fixo, que representa o valor cobrado logo quando
entramos no táxi (R$ 2,50), mais um valor variável referente à
quilometragem percorrida, multiplicado por uma taxa constante igual
a R$ 1,50.
A função é a seguinte: P(x) = 2,5 + 1.5*x, onde x representa a
quilometragem percorrida.
Desse modo, a função built-in map aplicou a função
‘precoCorridaTaxi’ iterativamente a cada um dos elementos da lista
‘distancias’, retornando um iterator (<map>). Contudo, como
queremos uma lista como retorno, precisamos utilizar a função ‘list’.
Como já dito antes, esse tipo de ação agiliza tanto o processo de
desenvolvimento dos algoritmos como o processamento
computacional.
Podemos tornar ainda mais eficiente nosso código a partir das
expressões lambda. Veja o exemplo abaixo.
reduce(fun,seq)
filter(Fun, seq)
zip(seq, seq)
enumerate(seq)
Na vida temos sempre que nos preparar para o pior, pois mais cedo
ou mais tarde certamente iremos nos deparar com situações
caóticas. Não devemos tentar fugir dos problemas a todo o
momento evitando enfrentar situações que fazem parte da vida.
Temos sim que saber o que fazer quando um problema acontecer,
mesmo que seja através de avisos e alarmes.
O interpretador Python informa erros de compilação e sintaxe por
meio de mensagens indicando a linha do arquivo onde se encontra
o possível problema.
Nem sempre o que o interpretador nos alerta como errado a real
causa do problema. Por isso devemos ter bastante cuidado com
essas orientações de pontos de erros.
Não precisamos nos desesperar quando uma mensagem de erro
aparecer. É comum quando estamos iniciando em programação
ficarmos congelados ao nos depararmos com uma mensagem de
erro.
Os erros são degraus que precisamos subir para o aprendizado,
portanto, estarão presentes durante toda a nossa jornada, uma vez
que o aprendizado nunca termina.
Muitas vezes o interpretador Python acusa um erro porque houve
uma interrupção no andamento da leitura dos códigos devido algum
problema de sintaxe, por exemplo. Todavia, mesmo quando uma
expressão estiver sintaticamente correta poderemos receber
mensagens de ‘erro’ que nesse caso são chamados de Exceções.
Assim os principais erros que podemos nos deparar com a
linguagem Python são os seguintes: sintaxe, indentação, key
(acesso a chaves), nome, valor, tipo e index. Vamos agora
compreender melhor cada um deles.
Se quiser mais detalhes a respeito favor visitar o seguinte local:
https://docs.python.org/3/tutorial/errors.html
Erro de Sintaxe (SintaxError)
Note que no exemplo acima está faltando uma aspa simples para
que a função print() execute seu trabalho.
Temos um erro de sintaxe, isto é, a linguagem da função print()
dentro da Python foi criada para receber argumentos de strings
dentro de aspas. Como isso não foi atendido, o interpretador
retornou uma mensagem de erro (SyntaxError).
Atenção a outro exemplo onde estamos esquecendo de fechar um
parênteses para a função print().
Agora, vejamos um caso onde estamos esquecendo de colocar dois
pontos na expressão de um loop ‘for’:
Erro de Indentação (IndentationError)
Esse é um dos erros que mais pode causar confusão. Ele é um dos
mais frequentes e abrangentes. Certamente, na sua caminhada de
aprendizado e amadurecimento com a linguagem Python irá se
deparar com muitos desses erros.
Por exemplo, quando estamos fornecendo para uma função mais
parâmetros do que o necessário, teremos como retorno esse tipo de
erro.
Erros x Exceções
Vamos agora tentar abrir um arquivo para leitura que não existe.
Vamos utilizar agora o finally. Quando estamos interessados em
forçar algum tipo de execução de código, independentemente de
haver ou não erros e exceções podemos utilizar o finally.
Abstração
Herança
Polimorfismo
Agora que já temos uma ideia do que são classes e objetos vamos
fazer um estudo curioso e comprovar que tudo em Python é um
objeto. Vamos pedir para a Python retornar os tipos das estruturas
formadas com ( ), { } e [ ], por exemplo.
Entidades
As entidades são as tabelas que podem ser armazenadas dentro de
um banco de dados.
Em um banco de dados SQLite pode existir uma ou dezenas de
centenas de tabelas. Veja o diagrama abaixo que apresente um
exemplo de estrutura de bando de dados relacionais.
Registros
Chaves
Relacionamentos
Normalização de dados
Nossa tabela tem uma chave primária (PK - primary key) que
escolhemos o id (nº de identificação) para representá-la.
A chave primária indica que os valores de id não podem ser
repetidos. Criamos duas colunas: morador e andar. Ambas são do
tipo varchar(100) com 100 posições para alocar caracteres para o
morador e varchar(50) com cinquenta posições para o andar.
Assim criamos a tabela com suas colunas e valores que elas podem
admitir. Precisamos inserir algum dado a nossa tabela. Vejamos
como fazer:
Agora que já gravamos nossos dados vamos averiguar se eles
realmente estão lá. Para isso devemos utilizar o comando SQL
chamado de select.
Como mostrado acima podemos comprovar que os dados foram
realmente gravados. Vejamos outra maneira de retornar os dados.
[1]
https://pt.wikipedia.org/wiki/Framework
[2]
https://www.tiobe.com/tiobe-index//
[3]
https://insights.stackoverflow.com/survey/2019/
[4]
https://github.com/
[5]
https://pypi.org/
[6]
https://pt.wikipedia.org/wiki/C%C3%B3digo_aberto
[7]
https://www.anaconda.com
[8]
https://www.w3schools.com/css/
[9]
https://pt.wikipedia.org/wiki/Case-sensitive
[10]
https://pt.wikipedia.org/wiki/Itera%C3%A7%C3%A3o
[11]
Mais detalhes no Livro: Álgebra Linear com Python - https://goo.gl/kDhYRf
[12]
https://pandas.pydata.org/
[13]
https://www.w3schools.com/sql/