python
história:
O Python foi concebido no final de 1989 por Guio van Rossum no Instituto de Pesquisa
Nacional para Matemática e Ciência da Computação (CWI), nos Países Baixos, como um
sucessor da ABC capaz de tratar exceções e prover interface com o sistema operacional
Amoeba através de scripts.
Sobre:
Python e uma linguagem de tipagem dinâmica( não e preciso declara o que vai entra na
variável)
Dados:
No python temos string dado em texto sempre entre ‘’ ou “”;
Int números inteiros;
Float números quebrados usando sempre o ponto ex: 23.45;
Bool nesse temos os dados que vão retornar True ou False.
Você pode muda os tipos dos dados( essa ação e chamada de type convertion, type casting,
coercion)
A = int(a) interpolação e quando vc coloca a %f por exemplo
List as famosas listas feita usando os []
Print(‘testando %f’, (variável)
Comandos mais usados:
Print (‘vai escrever o que vc quiser na tela’) tudo entre as () são argumentos;
Input e a adição de dados;
Type vai dizer o tipo do dado;
Pass ou ellipis(...) usado para deixa um espaço vago no código;
Len vai conta os índices desse dado;
Comentários:
De uma linha #;
Sep vao colocar alguma coisa entres os espaços;
End junta as linhas;
\n faz uma quebra de linha;
Também temos as docstrings pra usa múltiplas linha (isso não e um comentário e uma
docstrig) elas podem ser “”” ou ‘’’
Operadores:
+ além de soma ele faz a concatenação;
-:
/ divisão;
** potencia;
== igual;
!= diferente;
And e or;
// divisão inteiras
<, >, <=, >= ;
Precedência () depois ** , depois * , //,/, % e depois +, -
Operadores lógicos:
If true;
If else;
If a not in;
Is not , is geralmente são muito usado com none
Laços de repetição temos apenas o while
Formatando valores:
Vc pode usar a função print(‘{}’.format(variável)) ou a mais pratica print(f’{variável}’)
:f para diminuir um numero float;
Print(f’variavel:.2f)
:s texto;
:d int.
< esquerda
> direita
- centro
Esse comandos vão adiciona elementos na sua variável
Print(f’{a;g>34})
Try and except :
onde vc coloca um bloco de código que executa ignorando um erro ou talvez esse dado não
execute algum comando do seu código
Se ele não executa nada esse código acaba caindo em no except
Boas praticas:
Constantes são variáveis que nunca mudam
Muitas condições em if faz o código se torna complexo
Não declare a variável fora do bloco
Laços de repetição :
While e for
Quando vc sai do while sem ser forçado ou por uma quebra vc pode coloca um else em baixo
para ser executado
While True:
Print(‘hello word’)
Else:
Print(‘certo’)
If isinstance(variável, str) pra validar o tipo no tipo e possível coloca uma tupla e coloca um ou
mais valores
If isinstance(variável, (str, int))
Range:
Um dos inteiráveis mais interessantes
Range(start, stop, step)
Indices = range(len(lista)
Também funciona
Listas:
Esse espaço vai ser voltado a escrever tudo sobre listas já que e um dado mais complexo e
mais usado um dado mutável
Feita com []
Del [] usado para remover um item da lista
Srt ou lista.Split() vai quebra as str no espaço criando uma lista lembrando que tem que joga
isso em uma variável ou direto no print
Lista.append(item ou variável) adiciona coisas
Lista.pop(item ou variável) remove o ultimo valor ou onde vc escolhe
Lista.insert(0, valor que você vai coloca)
Variável’’.join(variavel) Join vai junta as listas, str, duplas com elemento que vc coloca
List.clear() limpa a sua lista
Tambem e possível concatena as listas transformando elas em uma
Lista.extend(lista_x)
Alguns cuidados que se teve toma com dados mutáveis quando vc muda uma coisa vc acaba
mudando ele em todas as áreas
Listab = listaA.copy()
Copinha a lista a assim você faze alterações na a e ter um copia solida da A
E possível coloca a *resto isso coloca todas os índices que não serão usados em uma variável
Geralmente quando essa ferramenta e usada essa variável e definida como *_
Tuplas:
Tuplas são listas imutáveis mais rápida que lista
Criada com () ou apenas não colocando nada
E possível altera uma lista pra tupla e Vice-versa com o tupla(list)
Imprecisão de numero flutuante:
Como as linguagens salvam esse números fazem aparecer um erro no seu código
se a soma de 0.1 + 0.7 for feita o numero que aparecera será 0.7999999999999 e não 0.8
pra resolver isso você vai ter que ir no arquivo imprecisao.py
Interpretado python:
"""
python mod.py (executa o mod)
python -u (unbuffered)
python -m mod (lib mod como script)
python -c 'cmd' (comando)
python -i mod.py (interativo com mod)
The Zen of Python, por Tim Peters
Bonito é melhor que feio.
Explícito é melhor que implícito.
Simples é melhor que complexo.
Complexo é melhor que complicado.
Plano é melhor que aglomerado.
Esparso é melhor que denso.
Legibilidade conta.
Casos especiais não são especiais o bastante para quebrar as regras.
Embora a praticidade vença a pureza.
Erros nunca devem passar silenciosamente.
A menos que sejam explicitamente silenciados.
Diante da ambiguidade, recuse a tentação de adivinhar.
Deve haver um -- e só um -- modo óbvio para fazer algo.
Embora esse modo possa não ser óbvio à primeira vista a menos que você seja holandês.
Agora é melhor que nunca.
Embora nunca frequentemente seja melhor que *exatamente* agora.
Se a implementação é difícil de explicar, é uma má ideia.
Se a implementação é fácil de explicar, pode ser uma boa ideia.
Namespaces são uma grande ideia -- vamos fazer mais dessas!
"""
Ternária:
E mais fácil so printa
Funções :
Uma função pode ou não receber valores se e coloca valores e obrigado a coloca os
valores(também chamados de parâmetros)
Argumentos nomeados são aqueles que vc indica a ordem, a partir que um argumento e
nomeado todos a frente dele são obrigados ao mesmo
e valores padrão são definidos na base do código
quando e usado *args e possível receber um a quantidade ilimitada de argumento posicionais
ou não nomeados qundo * kwargs e possível receber uma quantidade ilimitada de argumento
nomeados
Argumentos nomeados e não nomeados em funções Python
Argumento nomeado tem nome com sinal de igual
Argumento não nomeado recebe apenas o argumento (valor)
Escopo:
Quando e definido uma variável ela e definida em um espoco específico
nos temos o escopo global sem estar e nenhum lugar específico
Temos os escopos dentro de funções, que podendo ter funções dentro de outras funções a
mesma com seu próprio escopo
Se a variável não estiver definida naquela função ela ira pegar a externa mais próxima. Esse
movimento só acontece de interno pra externo nunca de externo pra interno
Call Stack é uma ferramenta que usa pequenas partes da memoria do pc para fazer o código
roda
Termos técnicos: Higher Order Functions e First-Class Functions
Academicamente, os termos Higher Order Functions e First-Class Functions têm
significados diferentes.
Higher Order Functions - Funções que podem receber e/ou retornar outras
funções
First-Class Functions - Funções que são tratadas como outros tipos de dados
comuns (strings, inteiros, etc...)
Não faria muita diferença no seu código, mas penso que deveria lhe informar isso.
Observação: esses termos podem ser diferentes e ainda refletir o mesmo significado.
Dicionário:
Estrutura de dados com chave e valor
Também e possível construir com base na função dict()
Se for criado chaves iguais o valor da ultima que sera usado
Temos algumas funções principais para dicionários
Como Keys()
Que mostra as a chaves, com isso podemos pegar essas chaves e transforma em uma tuple ou
list qualquer coisa pra visualização fica melhor
No lugar de Keys pode ser usado values() e items()
Temos também e get() que e feito para tratar um erro
Setdefault() também trata erros, mas se aquela chave que for chamada não existir e possível
escolher um valor padrão
Se a chave gênero não existir o valor padrão dela será ‘ não declarado’ também pode fazer isso
com get()
Copys em dicionários:
Temos 3 tipos de copia a primeira
Nessa não esta feito uma copia. As duas listas estão conectadas tudo que for mudado em uma
e mudado na outra
Com essa e feita uma shallow copy nessa os dados imutáveis (str,int,...) que forem mudados na
original não serão afetados, dados mutáveis como lista são modificados nas duas
Duas listas completamente independes
Com pop() e tirado a chave, mas o valor continua
Popitem() remove a ultima chave(e item) apenas a ultima
Dic.upadate()
introdução à List comprehension:
Mapeamento quando você pega um valor de uma lista e transforma ou não esse dado
Fazendo isso os índices serão o mesmos (com valor modificado)
Essa nova lista poder ter items a mais, mas os que já estava continua no mesmo lugar
Para fazer a modificação de valores e preciso desempacotar a lista
Filtro e um if após o for que não tem else feito para filtrar o que vai pra sua nova lista
No primeiro if o dado vai ser modificado ou não, e vai entra
O segundo e uma condição pra ver se o dado vai entra na lista
Esse if são sempre pegando o dado original
Podem ser feita com dicionário e dupla mas vc tem que usar dupla com{}
Falsy e truthy
São apenas os valores valor falso e verdadeiro dado a alguns elementos
lista = []
dicionario = {}
conjunto = set()
tupla = ()
string = ''
inteito = 0
flutuante = 0.0
nada = None
falso = False
intervalo = range(0)
todos esse são falsy
Chegando atributos/ nomes:
Quando e declarado um objeto o mesmo tem nomes que pode ser observados
Todos o atributos definidos no seu objeto
Obs a formas de usar o modulo __init__ estão no arquivo init
Use o debug console pra ver e usar isso
O comando hasttr() vai ver se o objeto tem o não aquela método sem quebra o código
com o getattr e possível usar os métodos diretos do objetos como uma variável que o método
foi colocado ou uma lista
Interavel e interator :
Os objetos interavel ele dá os elementos um por vez
O interator apenas sabe o próximo elemento. Interador não sabe o ultimo elemento não sabe
o primeiro apenas o próximo
Cada vez que dá um next e gastado esse elemento e quando ele gasta todos para no ultimo e
aparece um erro na tela
Generator:
Generator e uma função que sabe pausa. Todo genator e um interad, mas nem todo interator
e um generator
Então o generator não vai salvar toda a informação na memoria ele vai entrega a informação
em partes
A lista aqui e maior que o generator
Só que a lista vai ter toda a informação dela índices, começo e fim, len ...
O generator so tem o próximo elemento
E possível fazer a fução generator
Try e except:
ja foi visto que eles são usados para tratar erros
Tem inúmeros nomes de erros como o Zero
A class mais alta de erros e a Exception
Nesse casa ele ira pegar qualquer erro que não esteja especificado acima e joga pra ela
Esse __class__ e __name__ são usados para falar o erro e seu nome, esse as joga o erro e uma
variável que no caso e error
Finally sempre vai ser executado
hierarquia de erros
módulos:
existe alguma forma de fazer o import
Nessa e feito todo o import de tudo, com o name espac com isso e possível usar variáveis dos
nomes da função
Com o from e possível importa funções especificas
E possível troca o nome da função ou ate do import
Agora uma má pratica e importa tudo sem o name space
Modularização:
Quando e feito o import dos seu próprios arquivos o arquivo que você e seu arquivo main
geralmente quando se faz um programa você faz uma pasta main e seu programa funciona em
torno dela
Só e possível puxa pacotes da mesma pasta(package)
Importando um package:
Quando e possível usar __all__ na pasta que não e o main que ira ser importado e possível
limitar o que vai sair desse modulo
Aqui apenas a essa variável será usada
Todas a formas de importa um modulo em package
Curiosidades sobre convenções de nomes
Como você viu na aula anterior, usamos certas convenções para nomes de variáveis,
funções, classes e assim por diante. Essas convenções tem um nome que podemos usar
para nos referir ao modo como estamos nomeando determinados objetos em nosso
programa: PascalCase, camelCase e snake_case.
PascalCase - significa que todas as palavras iniciam com letra maiúscula e nada
é usado para separá-las, como
em: MinhaClasse , Classe , MeuObjeto , MeuProgramaMuitoLegal .
Essa á a convenção utilizada para classes em Python;
camelCase - a única diferença de camelCase para PascalCase é a
primeira letra. Em camelCase a primeira letra sempre será minúscula e o
restante das palavras deverá iniciar com letra maiúscula. Como
em: minhaFuncao , funcaoDeSoma , etc... Essa conversão não é usada em
Python (apesar de eu confundir as duas e às vezes acabar
chamando camelCase de PascalCase ou vice-versa, mas agora você sabe a
diferença);
snake_case - este é o padrão usado em Python para definir qualquer coisa que
não for uma classe. Todas as letras serão minúsculas e separadas por um
underline, como em: minha_variavel , funcao_legal , soma .
Os padrões usados em Python são: snake_case para qualquer
coisa e PascalCase para classes.
Qualquer importação feita tem que ser relacionada ao seu main quando se tem uma package
Esse ponto antes do modulo representa o package que você esta pode ser colocado o próprio
nome também
Variável livre e quando a variável não esta no escopo que a função chama
Letra aqui e uma variável livre para função soma. Um variável livre pode ser usada, mas
modificada, mas quando e colocado o comando nonlocal isso se torna possível
Decoradoras e decoradores:
Decoradoras são as funções que são usadas para passa o código agora os decoradores são
ferramentas que ajudam a usar os decoradores os syntax_sugar usado com o @
Tambem e possível cria uma fabrica de decoradores e parâmetros a ela como visto na
aula40.py’
Count:
Count e um interador do intertools
Veja na aula44
Combinations , permutations e product:
Uma forma fácil de fazer a misturas dos dados em um plano cartesiano
Aula45
Outro comando do itertoools e o groupby:
Que e possível ver na aula47 e 46
Os métodos partial, reduce, map e filter estão na aula48
Funções recursivas ou recursividade:
Usadas quando se tem quando se tem um problema grande, e possível dividir esse problema
em várias partes
Na prática e uma função que retorna ela mesma
Essas funções têm alguns elementos
Como o caso recursivo que e o problema que o código vai resolver
O caso recursivo aqui e multiplicação de 2 até 44, mas esse código esta errado porque ele vai
geral uma quantidade de call Stack(o limite de call Stack e 1k no python) absurdas uma Stack
overflow pra isso vamos precisa de um caso base, que vai fazer o código para de retorna a
própria função.
Nessa função têm um loop então ela irá passar por todos os elementos. Fazendo ser possível
mudar esses elementos
Ambient virtual:
A muitas maneiras de se utilizar ambientes virtuais em python, mas aqui a que vamos usar e
venv.
Na pasta venv e colocado a sua versão de python e todas as bibliotecas de terceiros. Isso e
usado para não ter um acúmulo de versões e documentos de cada trabalho no seu pc e
também utilizado para ser usado novamente em outra época por exemplo dá manutenção em
um site antigo.
E possível dá qualquer nome ao ambiente, mas os mais comuns são: venv, env
Se e colocando um ponto antes do nome sua pasta do ambiente virtual fica oculta
Lembrando que quando o ambiente virtual for executado ele vai usar o python que foi
guardado que pode ser diferente do python global da sua máquina
Quando e criando o venv ele tem algumas pastas:
Lib: tudo que for instalado de terceiros vai pra la
Para ativar o ambiente virtual primeiro e preciso cria o ambiente com python -m venv nome
do ambiente
E logo depois e so usa nome\scripts\activate e deactivate para desativar
Agora com seu ambiente virtual instalado e ativo e possível baixar coisas de fora do python
para e somente o ambiente virtual sem afeta o python global.
Utilizando o pypi onde vai ter uma série de ferramentas para serem usada em python
Usando por exemplo pip install PyMySQL para instalar uma biblioteca sql
Ser quiser atualizar e so colocar um pip install –upgrade e se tiver algum problema de erro e
so tentar python -m pip install o que você quiser.
Para desinstalar e necessário apenas o comando pip uninstall pymysql se quiser pular a
confirmação e só coloca um -y na frente
Pip freeze vai dizer o qtem instalado na no seu ambiente virtual
pip index versions pymysql para ver todas as versões pymysql
geralmente a pessoas tem várias coisas instalada nos ambientes virtuais então e possível fazer
um pip freeze > requiments.txt para pode baixar tudo de uma forma mais fácil
fazendo um pip install -r .\requirements.txt
criando arquivos com python:
Quando e criada uma pasta e possível especificar o caminho que a pasta vai ou não. Se não for
colocada a pasta ficara no arquivo que você está, mas e possível especificar o caminho
Essas duas barras são usadas apenas no Windows(ser não der certo e so coloca um r antes do
caminho).
Porem não e possível apenas abrir o arquivo como editar ele com os context manager
W usado para escrever
R leitura
W+ para escrita e leitura
Quando o ‘’w’’ e usado ele apaga tudo que já tem no arquivo. O ‘’a’’ escreve tudo abaixo do
conteúdo que já existe no arquivo
Sempre que um arquivo e aperto ele TEM quer ser fechado
With vai ser usado como o open só que mais seguro porque ele abre e fecha o arquivo sozinho
Json:
Uma estrutura de envio de arquivos baseada em js. Json só e bem simples no seu uso não
consegue enviar métodos nem estruturas muitos complexas com um set
Aqui estávamos enviando o arquivo e possível usar om encoding= ‘utf8’ para usa acentos e
caracteres especiais
Aqui estou abrindo o json que não tem mais no meu python é uma coisa de fora. Lembrando
que o json pode modifica um pouco os dados nesse caminho uma tupla pode se torna uma
lista por exemplo
Positional-only parametrs:
Um forma de limitar o usuário tudo que estive antes de barra tem que ser posicional
Tudo depois pode ser nomeado ou posicional
Keyword-only-Arguments:
Todos que estiverem na frente do * so poderão ser nomeados
Mas isso não que dizer que os de traz não podem ser nomeados esse * so indica que os da
frente tem que ser obrigatoriamente nomeados
Mas para fazer o código ficar mais limitado e possível usar a / e * juntos
Com isso os antes da / so podem ser posicionais e das frente do * so podem ser nomeados
Programação orientada a objetos poo:
A partir daqui e uma novo tópico que vai render muitas aulas e conhecimentos
Class:
Class vão reunir um grupo de objetos(instâncias). As class vão ter atributos(dados) e métodos,
para usar as classe temos o padrão de usar Pascalcase.
Obs: da uma olhada em calme case
As calss tem seus próprio escopo junto com os métodos
Esse funções iram ter seus escopos entao não posso usar valor em acelera
Como também não posso buscar aquele nome no escopo class sem mencionar a mesmo como
fiz no print comentado. E essa variável valor só pode ser nos métodos da class
As instancias são guardadas em com um formato de em dicionários como dic com isso e
possível visualizar e editar essa instancias de uma forma diferente
Uma coisa bastante interessante e que e possível manter o estados dentro da class
Nesse caso depois que self.tipo passa por andar o self.tipo ganha um estado
Nesse caso True isso pode ser usado e modificado com o código
Class method
Invés de pegar a instancia e cria e modificar ela com os method e possível pegar a própria class
e fazer uma extensão dela
Static method
Que não e nada mais que uma função normal só que protegida pelo namespace da class
Property
E normal em linguagens de programação usar atributos em forma de métodos para proteger
os atributos os famosos getter
Mas no python de uma forma específica de fazer isso com @property
Assim e possível chamar esse atributo protegido em função em forma de atributo
Setter
Setter e um método para tratar o atributo para usa um setter tem que ter um property so
olhar na aula67.py
Encapsulamento:
(modificadores de acesso: public, protected, private)
# Python NÃO TEM modificadores de acesso
# Mas podemos seguir as seguintes convenções
# (sem underline) = public
# pode ser usado em qualquer lugar
# _ (um underline) = protected
# não DEVE ser usado fora da classe
# ou suas subclasses.
# __ (dois underlines) = private
# "name mangling" (desfiguração de nomes) em Python
# _NomeClasse__nome_attr_ou_method
# só DEVE ser usado na classe em que foi
# declarado.
Relações entre classes
Associação: e uma relação que um elemento com outro do tipo fraca que um não depende do
outro
Agregação: uma associação do tipo fraca um elemento conecta a outro, mas um elemento
existe sem outro um sendo necessário de outro para realiza certa tarefa.
Dessa foram uma agregação geralmente envolve 1 para muitos
Composição: e uma forma agregação de forma mais específica nesse termo tudo vai ser mais
ou menos iguala a agregação, só que aqui uma depende da outra pra existir
Teoria de herança
Na era um objeto não depende de outro, mas sim um objeto e outro
Como cliente nesse caso ele faz parte de uma classe mais genérica que e Pessoa
O cliente não depende não usa ele faz parte de pessoa
Class Pessoa
Super class, base class, parent class
Class filha
Sub class, child class, derived class
Obs: um exemplo de herança simples na aula70.py
Sobreposição
Quando e escrito um method em uma derived class com o mesmo nome de um method na
super class da mesma, fazendo esse method ser rescrito.
Claro que esse fenômeno também acontece com atributos também
Herança múltipla
Quando uma class recebe varias classe fazendo um seu código ser genial usando e otimizando
ferramentas, como também pode deixar seu código desnecessariamente complexo e confuso
E tão confuso que o python usa um próprio sistema para organizar esssa ordem o famoso
c3 linearization um algoritmo que vai fazer o mro do código
Obs: explicação do problema do diamante na aula73.py
Abstração
Quando o programador não quer que uma class seja usada diretamente,
Pra isso existe o mixin uma class que reuni funções para serem usadas naquela família de class
ou em outra herança não conectada a aquela.
Abstract Base Class (abc):
Em python class abstratas não podem ser instanciadas diretamente, essa class tem property ,
setter .. (usando o @ abstractmethod como decorador interno) métodos concretos e
abstratos. @ abstractmethod não tem corpo e podem ser implementados mais tardes em
subclass lembrando que a abc e um molde de método e coisa que as subs class devem seguir
Exemplos de como usar o abstractmethod com property e setter estão na aula 76 e 77