Notebook Py
Notebook Py
Algumas Libs
Desenvolvimento Web
Django
Flask
Pyramid
PyQL - GraphQL
Desenvolvimento Desktop
Tkinter
Kivy
Data Sience
Scipy
Pandas
Ipython
Python basíco
Tipos de Variaveis
str →String, Uma cadeia de caracteres(“Texto”)
int → Numero inteiro(20,35)
float → Numero com ponto Flutuante{numero com casa decimal} (1.5, 8.9) » Se usa
ponto final no lugar da virgula por conta do padrão americano.
strings dinâmicas
Podemos deixar uma string dinâmicas inserindo diferentes tipos de variáveis.
d - inteiros
s - strings
f - float
para usar a string dinâmica com float seguimos a ordem %.(numero de casa
depois da virgula)f
Operadores aritméticos
Operação Resultado
X+Y Soma de X e Y
X-Y Subtração de X e Y
X*Y Multiplicação de X e Y
X // Y Divisão de X e Y (Int)
X ** Y x elevado a Y
-X X negado
+X X intalterado
Operadores de comparação
Operação Significado
= Atribuição
== Igual a
!= Não é igual a
operadores lógicos
And → Verifica se as declarações em análise são verdadeiras
Or → verifica se ao menos uma das declarações são verdadeiras
Not → Leva ao oposto da declaração dada
Operação Resultado
Valor Boleano
True → Verdadeiro*
False → Falso*
none → Nulo*
*Precisa ter a primeira letra maiúscula para ser reconhecido
0 → zero
Funções built in
Função o que faz
Print() Imprime o que está entre parênteses no terminal.
divmod(X, Y) o par ( X // Y, X % Y)
Funções de Lista
Funções de listas
→
→
.insert(n) → insere um numero na posição n
.remove(n) → remove um elemento especifico
.sort() → ordena a lista
.sort(Reverse = True) → Orderna a lista de forma contraria
.index() → Retorna a posição de um elemento da lista
Funções deTuplas
.split() → Separa os valores
ex:
if condição1:
resultado se condição1 verdadeiro
elif condição:
resultado se condição2 for verdadeira
else:
resultado se as duas condições forem falsas
se Se verdadeiro
falso condi
ção
codi
codig go
condi se
o se
ção True
True
elif
codig
o se
False
Laço for
Usado para percorrer sequências previamente conhecidas.
ex:
lista = [1,2,3]
for item in lista
print item
resultado » 1,2,3
Laço while
Usado para percorrer sequências a partir de uma condição
ex:
count = 0
while count <=5
print (count)
count +=1
if count >3: break
Listas
Lista são um tipo de sequência de dados
uma lista sempre é representada por [ ]
ex:
[0,1,2,3,4]
para se acessar um elemento da lista se usa: nome_da_lista[Indice do elemento]
Para buscarmos um numero de trás para frente colocamos o negativo antes do numero,
deste modo se usa a partir do -1
subistituição:
Nome_da_lista[elemento] = novo argumento
deletando
Del nome_da_lista[elemento]
para usar as funções das Lista usamos o append mode, uma sintaxe para chamar os metódos nativos
do python
operador ponto . →Chama um certo metodo
ex:
objeto.metodo()
slicing → Fatiamento
nome_da_lista[1:2]
1→O primeiro valor da lista
2→uma posição acima da última que precisamos
tupla
uma Tupla sempre é representada por ()
ex:
(0,1,2,3,4)
Tuplas são imutáveis, os valores dentro delas não podem ser alterados ou excluídos
dicionários
um dicionário sempre é representado {}
ex: {a1:b, a2:c} → Par chave-valor
adicionar novo valor
dict[nova chave] = novo valor
substituindo valor
dict[chave existente] = novo valor
podemos usar Listas dentro de dicionarios, podemos também gerar dicionarios e adicionar
valores em seguida
dict.get()→ Retorna o valor selecionado, caso ele não existir ele irá responder none
Funções
Para definir uma função é usada a palavra reservada Def
def nome_da_funcao(paramentro):
código da função
quando vamos chamar a função colocamos um argumento
nome_da_funcao(argumento)
função recursiva é quando uma função chama a si mesmo várias vezes. ela tem algumas
situações de uso mas quase nunca é usada (tem que tomar cuidado para não criar um loop
infinito)
Nesse caso os parâmetros não independem do outro, mas o parâmetro opcional deve estar
sempre depois dos obrigatórios:
def soma_numeros(a,b,c=10):
print(a+b+c)
Se você passar o parâmetro c ele irá substituir o valor, caso não passe será aquele
parâmetro obrigatório.
sequências de parâmetros
podemos criar uma série de parâmetros na hora de criar uma função, se forem do mesmo
tipo podem ajudar a criar uma função que processa diversos parâmetros.
def funcao(*argumentos):
for x in argumentos:
print(x)
função Lambda
A função lambda surge da programação funcional, podemos criar uma função que executa
uma simples expressão e atribui o valor a uma variável.
x = lambda a:a+10
print(x(10))
Os objetos interagem entre si, cada objeto tem características conhecidas como
propriedades e ações conhecidas como métodos.
Classes
As classes são moldes de objetos. iremos criar uma classe que pode orioginar diversos
objetos. Cada classe é originada pela palavra Class. podemos adicionar propriedades e
métodos a uma classes que serão utilizadas por seus objetos.
Sempre a primeira letra do nome da Classe e Maiúscula.
objetos
métodos
Herança
Substituição de método
métodos mágicos
Há muitos métodos mágicos, um destes métodos é o __str__. Ele serve para imprimir uma
representação de String do que desejamos, podemos inserir este método dentro de uma
classe
Propriedades constantes
Podemos também definir propriedades que não variam de objeto em objeto, ou seja, elas
iniciam com um valor fixo.
para isso basta declarar fora de self com algum valor
encapsulamento
Encapsular é um outro recurso da POO, o objetivo é criar atributos privados, que não
podem ser alterados. para fazer isso devemos usamos _ ou __ na frente dos métodos ou
variáveis.
Deletando objetos
A instrução del é útil em python. Podemos Deletar objetos por meio de del obj.
após interpretada a linha no código, não podemos mais acessar nem propriedades e nem
métodos de objetos removidos.
Objetos Lógicos
Se refere a interação de um ou mais objetos
Função() objeto.método()
Manipulação de String
Verificação de String
podemos verificar as palavras do início e do fim de uma string.
o ḿetodo startswith verifica se uma string começa com uma determinada palavra, já o
método endswith verifica se a string termina com a palavra.
Conversão de String
Podemos converter uma string para Maiúscula ou minúscula.
a função lower converte todas as letras para minúsculas e a função Upper converte todas
as letras para maiúsculuas
Pesquisando palavras
Podemos pesquisar palavras em uma string, o operador in que torna a tarefa mais fácil, há
também o operador not in que é o inverso do in.
“teste” in frase
Número de ocorrências
Podemos contar o número de ocorrências de uma determinada string em outra, usamos a
função count, ela retorna o número de palavras encontradas.
Busca em string
Uma forma de achar palavras em string é a função find, a resposta será o índice da primeira
letra da ocorrência. Caso a palavra não seja encontra iremos receber -1
substituição
A função replace nos permite substituir algo em uma string, se a palavra se repetir ela será
substituída em todas as repetições, porém pode ser evitado se colocarmos um parâmetro
que limita as substituições.
Arrays
para puxar um valor dentro do array deve-se colocar o valor da linha e da coluna
Bibliotecas padrões
Algoritmos
Algoritmos são sequências de instruções que têm como objetivo a resolução de algum
problema. Estas instruções geralmente recebem uma massa de dados, executam algum
tipo de processamento sob essa massa e devolvem o resultado deste processamento. É
importante salientar que os algoritmos possuem um início, um meio e um fim: todo
algoritmo, em algum momento do tempo, precisa ser concluído.
Arrays
Os arrays constituem uma das estruturas de conjuntos mais básicas. Trata-se na verdade
de um espaço de memória geralmente contínuo e segmentado, onde cada posição de
memória originada da segmentação pode ser utilizada para armazenar um elemento.
Existem alguns pontos que você sempre tem que ter em mente quando estivermos falando
de arrays:
Busca Linear
Busca Binária
Esse algoritmo divide o array em duas partes e verifica se o número é maior ou menor do
que o procurado
Existem diferentes algoritmos para ordenação e para pesquisa, cada qual com seu
funcionamento interno e com sua “filosofia”. Mas é fato que um determinado algoritmo pode
ser mais eficiente em detrimento dos demais... Como podemos realizar esta análise é
determinar o melhor algoritmo para cada situação?
É importante ressaltar que nós temos dois tipos de análise que podem ser realizadas no
que diz respeito à eficiência de um algoritmo:
● Análise temporal: diz respeito ao tempo que um algoritmo leva para ser completado;
● Análise espacial: diz respeito, principalmente, à quantidade de memória que um
algoritmo consome para ser completado.
É importante citar que estas análises não são, por muitas vezes, quantitativas, e sim
qualitativas. Geralmente, o algoritmo que é executado mais rápido é o mais eficiente. Mas
existem algoritmos que são muito rápidos e consomem muita memória. Em uma máquina
com disponibilidade de memória, isso não é um problema, mas em máquinas onde isso é
um fator limitante, pode ser que um algoritmo não seja considerado o mais eficiente. Esta
análise não deve levar em consideração somente os números: ela deve levar em
consideração também os fatores externos.
Existe um outro grande desafio quando falamos de análise algorítmica: como prever como
um algoritmo vai se comportar, temporal e espacialmente falando, com a variação da massa
de dados de entrada, por exemplo? Como vou saber a variação temporal e espacial para
um algoritmo que tenha 1000 entradas ou 1000000000 de entradas?
Análise Assintótica
A análise irá definir três casos:
O melhor caso, o pior caso e por último o caso médio.
Big-O
Sempre determina um modelo pelo seu pior caso.
Estruturas de Dados
Arrays
Os arrays constituem uma das estruturas de dados mais básicas. Trata-se na verdade de
um espaço de memória geralmente contínuo e segmentado, onde cada posição de memória
originada da segmentação pode ser utilizada para armazenar um elemento.
Existem alguns pontos que você sempre tem que ter em mente quando estivermos falando
de arrays:
Para que estas situações fiquem mais aparentes em nosso estudo, vamos começar a criar a
nossa implementação de um vetor baseado em um array.
‘b’ int 1
‘u’ String 2
‘i’ int 2
‘l’ int 4
‘f’ float 4
‘d’ float 8
info() → puxa as informações das ações, Consegue visualizar a classe, o período, colunas e os valores
em cada coluna juntamente com o tipo de dados
head() → puxa as informações iniciais do dataframe
tail() → puxa as informações finais do dataframe
{no head e no tail podem ser passado a quantidade de linhas que deseja como parâmetro}
quandl
variavel = quandl.get(argumento)
Puxa os valores do argumento fornecido.
pyhton tem um índice padrão, ou seja ele atribuiu um valor em cada linha dos seus dados
que começa a partir do zero.
Sobre WEB
Métodos
GET → Ler
POST → Inserir / Postar
PUT → Alterar / Atualizar
DELETE → Remover
Exemplo de URI
reservahotel.com/hotellookup.do?cities=rio-de-janeiro
(URI Baseado em ação)
hotellookup →pesquisar hotéis
do → executar
? → query ou consulta
cities → Parâmetro chamado cidades
CRUD HTTP
Autenticação de usuários
Soluções melhores
Digest acess authentication
asymetric cryptography
oauth
Json web token
Para aplicação de REST api com Flask usaremos o Json web token
Para inicializar uma aplicação Flask é necessário criar uma instância da aplicação, ela
será tratada usando o protocolo WSGI (Web Server Gateway interfarce).
From flask import Flask
app = Flask(__name__)
Delimitadores no Jinja
O Jinja2 possui três tipos de delimitadores mais utilizados. Cada delimitador é responsável
por concatenar um tipo de instrução aos templates criados em HTML. Basicamente, os
delimitadores são os seguintes:
Na interação de for existe uma variável chamada loop que podemos usar para fazer varias
coisas com o for
Templates
O Flask trabalha com a extensão jinja2 para renderizar as páginas HTML.
Utilizando a função render_template() o primeiro argumento é o arquivo de template. já
todos os demais argumentos são pares chave-valor.
O Jinja2 reconhece vários tipos de variaveis. para se usar uma variavel é necessario utilizar
duas chaves {{ variavel }}
Exemplos de varíaveis:
<p>A value from a dictionary: {{ mydict[‘key’] }}. </p>
<p>A value from a list: {{ mylist[3] }}. </p>
<p>A value from a list, with a variable index: {{ mylist[myintvar] }}. </p>
<p>A value from a object’s method: {{ myobj.somemethod() }}. </p>
Filtro Descrição
Dentro do HTML podemos usar Macros que são como as funções dentro de python
para que estes sejam mais utilizados deixamos eles em arquivos independentes que serão
importados depois.
Herança de templates
Uma maneira de não ficarmos repetindo códigos é a herança de templates, com ela
podemos repetir bases de códigos que iriam se repetir em toda a aplicação.
Para isso criamos uma base de html e definimos blocos de códigos que podem ser
substituídos.
Uma alternativa é usar o Flask-bootstrap que contém boa parte do código de CSS e JS do
próprio bootstrap.
Links
a extensão Flask WTF facilita a criação de formulários, para isso precisamos criar uma
classe com campos necessários.
class NameForm(FlaskForm)
name = StringField('Whats is your name?', validators=[DataRequired()])
submit = SubmitField('Submit')
Validador Descrição
EqualTo Compara valores de Dois campos (útil para confirmação de senha ou email)
AnyOf Válida se a entrada é uma das opções de uma lista de valores possíveis
NoneOF Válida se a entrada não é nenhuma das opções de uma lista de valores
possíveis
<form method=’POST”>
{{ form.hidden_tag() }}
{{ form.name.label }} {{ form.name(id=’my-text-field’) }}
{{ form.submit() }}
</form>
Banco de dados
SQL -> Structured Query Languages - Utilizam consultas de querys - banco de dados
relacionais
NoSQL -> utilizam dados em forma de chave - valor e orientados a documentos.
Um-para-muitos -> significa que uma informação na tabela x pode aparecer varias vezes na
tabela y
Um-para-um -> significa que a informação na tabela x aparece somente uma vez na tabela
y
Configurando um banco de dados com SQL Alchemy
MySQL mysql://username:password@hotsname/database
Postgres postgresql://username:password@hostname/database
SQLite sqlite:///absolute/path/to/database
configurando o SQLlite
import os
from flask_sqlalchemy import SQLAlchemy
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'+ os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
bd = SQLAlchemy(app)
Text str String de tamanho variável, otimizada para tamanho grande ou sem
limite
Unicode unicode string unicode de tamanho variável
UnicodeText unicode String unicode de tamanho variável, otimizada para tamanho grande
ou sem limite
Configurações do db.Column
primary_key Se for definido como True a coluna será a chave primária da Tabela
index Se for definido como True, um índice será criado para essa coluna, para que
as consultas sejam mais eficientes
nullalbe Se for definido como True, haverá valores vazios nessa coluna. Se for
definido como False a Coluna não aceitará valores vazios
Para se conectar uma tabela a outra deve ser utilizar a função db.relationship, segue o
exemplo das classes atualizadas com os modelos já relacionados.
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
users = db.relationship('users', backref='role')
def __repr__(self):
return '<role %r>' % self.name
class User(db.Model):
__tablename = 'users'
id = db.Column(db.integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
role_id = db.Column(db.integer, db.ForeignKey('roles.id'))
def __repr__(self):
return '<user %r>' % self.username]
lazy Especifica como os itens relacionados devem ser carregados. Os valores Possíveis
são: select(os itens são carregados por demanda na primeira vez que são
acessados), immediate(os itens são carregados quando o objeto-fonte é carregado),
joined (os itens são carregados imediatamente, mas como uma junção), subquery
(os itens são carregados imediatamente, mas como uma subquery), noload (os itens
jamais são carregados), dynamic (em vez de carregar os itens, a query que pode
carregá los e dada)
userlist Se for definido como False, usa um escalar no lugar de uma lista
para adicionar linhas no db primeiro importamos as classes que haviamos criado e então
inserimos elas como variaveis.
para alterar uma linha de alguma tabela utilizamos o método add() em uma nova variavel.
para deletar uma linha usamos o método db.session.delete()
Opção Descrição
filter() devolve uma nova consulta que adiciona um filtro extra a consulta original
filter_by() devolve uma nova consulta que adiciona um filtro extra de igualdade a consulta
original
limit() devolve uma nova consulta que limita o número de resultado da consulta
original
offset() devolve uma nova consulta que aplica um offset na lista de resultado da
consulta original
Order_by() devolve uma nova consulta que ordena o resultado da consultas com os
critérios passados
group_by() devolve uma nova consulta que agrupa o resultado da consulta original de
acordo com os critérios passados
opção descrição
Flask Migrations
flask db init
commitando a alteração - flask db migrate -m “commit”
atualizando - flask db upgrade
Com a nova configuração das pastas é necessário criar uma função factory que agiliza na
hora que precisarmos ajustar alguma configuração
depois devemos definir uma blueprint para as rotas já que com a factory as rotas precisam
ser acessadas externamente
Autenticação de usuário
Para a extensão funcionar deve ser adicionado classe de db do User utilizando os seguintes
itens
Método Descrição
is_authenticated Deve ser True se o usuário tiver credenciais de logins válidas ou false
caso contrário
is_active Deve ser True se o usuário tiver permissão para fazer login, ou False
caso contrário. Um false pode ser usado para contas inativas
is_anonymous Deve ser sempre False para usuários comuns e True para um objeto
de usuário especial que representa um usuário anônimo
Permissões de usuários
Para criar permissões para usuários é interessante usar potências de dois pois elas se
combinam e criam valores únicos. é uma maneira eficiente de se conseguir gerenciar as
permissões
Envio de Email
A arquitetura REST para web services se baseia em seis características, são elas
Cliente-servidor
Deve haver uma separação clara entre clientes e servidores.
Sem estado(stateless)
Uma Requisição de cliente deve conter todas as informações necessárias para tratá la. o
Servidor não deve armazenar nenhum estado acerca do cliente, que seja persistente de
uma requisição para a próxima.
Cache
As respostas do servidor podem ser identificadas como passíveis ou não de cache, de
modo que os clientes (ou intermediários entre os clientes e o servidor) possam usar um
cache com vistas aá otimização.
Interface uniforme
O protocolo com o qual os clientes acessam os recursos do servidor devem ser
consistentes, bem definido e padronizado. Esse é o aspecto mais complexo do RESt,
incluindo o uso de identificadores únicos e representações dos recursos, mensagens
autodescritivas entre o cliente e o servidor, além de hipermídia.
Sistemas em camadas
Servidores proxy, cache ou gateways podem ser inseridos entre os clientes e os servidores
conforme forem necessários às fim de melhorar o desempenho a confiabilidade e a
escalabilidade
métodos de Requisição
GET URL de conjunto Obtém o conjunto de recursos(ou uma página deles, se o 200
de recursos servidor implementar paginação)
POST URL de Conjunto Cria um recurso e o adiciona ao conjunto, O Servidor escolhe o 201
de recurso URL do novo Recurso e o devolve em um cabeçalho Location
na resposta
PUT URL do recurso Modifica um recurso existente como alternativa, esse método 200 ou
individual também pode ser usado para criar um recurso, se o cliente 204
puder escolher a URL do recurso.
O protocolo HTTP ainda conta com os métodos Head e Options que são
automaticamente implementados pelo flask.
Os recursos são enviados de um lado para o outro entre o cliente e o servidor, como o
REST não especifica o formato o cabeçalho content-type nas requisições e nas resposta
é usado para sinalizar o formato (geralmente JSON (JavaScript Object Notation)
Códigos de requisição
201 Created (criado) A requisição foi concluída com sucesso e como resultado
um novo recurso foi criado
202 Accepted (Aceito) A requisição foi aceita para ser processada, mas continua
em andamento e executará assincronamente
204 No Content (Sem conteúdo) A requisição foi concluída com sucesso e não há dados
para serem devolvidos.
401 Unauthorized (Não autorizado) A requisição não inclui informações sobre autenticação, ou
as credenciais fornecidas são inválidas
404 Not Found (Não Encontrado) o recurso referenciado no URL não foi encontrado
405 Method Not Allowed (Método não o método requisitado não é aceito para o recurso
permitido) especificado
500 Internal Server Erro (Erro interno do Um erro inesperado ocorreu durante o processamento da
Servidor) requisição