Um repositório para estudar Pyhton do começo
🚧 Em construção
Este material começou com meu interesse pessoal em aprender Pyhton
Aos poucos, está se tornando um guia para outras pessoas que querem aprender Pyhton
A maneira mais simples de começar a programar é utilizando o Jupyter Notebooks. Dá uma espiada, tente instalar e comece a brincar.
Se você não tem conhecimento de qualquer linguagem de programação, não se preocupe. Eu recomendo que Python seja sua primeira linguagem de progamação. Sem dúvidas este é um ótimo começo. Você pode por exemplo acompanhar meus exercícios no Jupyter Notebook 🚧 Em construção
Você poderá acompanhar este guia e ir criando seus próprios exercícios, as dúvidas voce pode contar comigo no email. [email protected]
Você pode facilmente aprender Python na internet, lendo livros de Python , ou acessando a Documentação
Se você possui domínio básico de inglês, Eu recomendo fortemente que você siga este blog de Python
Para exercitar você precisa configurar um ambiente, seja na internet ou no seu computador
Eu vou ensinar duas formas de configura ambientes, uma através do Jupyter Notebooks, que é mais recomendável para quem está aprendendo Python ou para quem tem interesse em utilizar Python para fins científicos. Ambos estes ambinetes funcionam tanto na nuvem quanto na sua máquina local
Diversas formas de configurar um ambiente Python
Ou se preferir utilize o Jupyter Notebooks
A forma mais comum de aprender uma linguagem é começar pelo exemplo Olá mundo
MESSAGE = "Olá, mundo!"
print(MESSAGE, '\nAcabo de testar meu primeiro programa");
}
O Python foi desenhado para ser Limpo.
Simplicaidade é sempre o objetivo no Python, por isso é necessário respeitar algumas regras para que as coisas funcionem:
Indentação importa!
Indentação é o número de espaços que você coloca à esquerda de uma linha de código python
No Python, a indentação tem dois propósitos:
Facilitar a leitura por humanos (Formatação)
Preparar a leitura por computadores (Instrução)
Vamos ver como é em outras linguagens
# Um exemplo em python
x = 31 % 2
if x == 0:
print(x,'é par')
else
print(x,'é ímpar')
// Um exemplo em C++
int d = 31 % 2;
if d == 0 {
printf("%d é par d", );
} esle {
printf("%d é par ímpar", );
}
Observe C++ possui ;
ponto e vígula no final de cada linha
Mas no Python isto não é necessário, pois cada linha é uma instrução
Outra diferença sutil, mas muito importante é o símbolo de chaves {}
Em C++ as chaves {}
indicam o início e o fim de uma instrução. No python isto não é censsário.
Por quê? Devido à indentação. Em Python, sempre que um bloco de código estiver indentando isto irá representar que ele está em uma hierarquia inferior, ou seja, ele pertence ao bloco anterior sem indentação;
if x == 0:
print(x,'é par')
No código acima apenas será impresso "31 é par"
se a instrução if x == 0:
anterior for verdadeira.
Outro símbolo importante são os dois pontos :
. Este símbolo formaliza que em seguida irá iniciar o bloco
🚧 Nesta seção eu organizo os conteúdos por ordem alfabética. Se preferir uma sequência de estudos acompanhe o tutorial a seguir.
A sequência de estudo que eu tenho aprimorado para você que está começando do zero é a seguinte. E eu vou tentar explicar a razão disso:
É comum controlarmos algumas configurações pelo próprio cargo.toml. Como eu expliquei no exemplo hello world, a versão, o autor e outras informações do binário podem ser declaradas explicitamente no arquivo cargo.toml. Mas é interessante deixar outras informações em um arquivo .env, que você pode ler facilmente com o tutorial a seguir
pip install python-dotenv
"""
DOC STRINGS
"""
from dotenv import load_dotenv
config = load_dotenv(".env")
println!("KEY", config["user_name"]);
config["password"] = "unbush84likely8Fdetail42"
Ao executar uma aplicação pela linha de comandos, você pode passar parâmetros para ela
c:\App> python myapp.py ricardo
Você pode facilmente acessar estes parâmetros através do comando args()
import sys
args = sys.argv
name = args[0]
if name:
println!("Olá ", name)
else
println!("Olá mundo!")
Ao interagir com o seu programa o usuário o alimenta com dados. Muitas vezes é conveniente armazenar estes dados para serem recuperados no futuro, mesmo quando o programa é fechado e após abrí-lo novamente, o usuário pode precisar reutilizar estes dados ou compartilhá-los com outros dispositivos por exemplo. Neste exemplo eu mostro como salvar dados localmente ou em rede.
Vamos continuar nosso exemplo e prepará-lo para exportar a mensagem em um arquivo
import sys
args = sys.argv
name = args[0]
### Parabéns, você aprendeu a formatar strings
mensagem = f"Olá {name}!"
### E agora vamos salvar nossa mensagem em um arquivo externo
with open('mensagem.txt', 'w') as file:
file.write(mensagem)
Da mesma forma é necessário ler os dados gravados, ou então em alguns casos você vai querer ler arquivos que foram gerados por outros dispositivos e importá-los no seu sistema.
Há duas formas principais de ler estes arquivos, que eu divido em
🚧 Ler um arquivo simples A maneir mais prática mas nem sempre resolve.
🚧 Ler um arquivo grande no formato de stream Esta maneira poderoso permite gerenciar o uso de memória e ler arquivos gigantes.
Veja este exemplo básico
with open('mensagem.txt', 'w') as file:
conteudo = file.readlines()
for linha in conteudo:
print(linha)
Em qualquer linguagem de programação é uma boa prática manter o código limpo, e nunca criar funções muito grandes que tenham várias responsabilidades. Isto pode tornar o código confuso. Por isso nós vamos começar a refatorar o nosso código para quebrá-lo em vários métodos.
import sys
def salvar_no_arquivo(mensagem):
with open('mensagem.txt', 'w') as file:
file.write(mensagem)
args = sys.argv
name = args[0]
mensagem = f"Olá {name}!"
salvar_no_arquivo(mensagem)
Em primeiro lugar, lendo o código acima, vemos que não é adequado manter blocos de código que estejam em níveis diferentes dentro da hierarquia de procedimentos, isto é, o código precisa fazer sentido como um todo par aquem lê. Isto nos faz um convite relacionado ao idioma, e de agora em diante vamos fazer um esforço para escrever todo o código em português. Por isso vamos encapsular todo o comportamento de setup do programa no método chamado carregar_parametros
, isto nos permitirá no futuro utilizar um padrão de projetos (design pattern) muito interessante chamado Builder, que utiliza o conceito de Fluent Api. Mas não por enquanto.
import sys
def pegar_nome_usuario:
args = sys.argv
name = args[0]
return name
def salvar_no_arquivo(mensagem):
with open('mensagem.txt', 'w') as file:
file.write(mensagem)
name = pegar_nome_usuario
salvar_no_arquivo(f"Olá {name}!")
A linguagem ubíqua é um conceito do DDD que prega ao desenvolvedor utilizar aspectos da língua falada ao escrever seu código, isto é, deve-se utilizar um formato de narrativa que se aproxime da língua dos usuários finais, utilizando inclusive as mesmas palavras que ele utiliza para descrever aquela rotina. Veja que ao utilizar esta técnica o código fica mais fluido, e mais simples de ler, um dos preceitos do código limpo.
Em Python você pode utilizar return sempre que quiser realizar um retorno de um ou mais valores dentro de uma função def
def pegar_nome_usuario:
args = sys.argv
name = args[0]
return name
}
Se você acompanhou o primeiro tutorial já é capaz de compreender que você pode executar um script python passando na frente do nome do arquivo alguns parâmetros
Eu estou desenvolvendo um tutorial mais completo sobre CLI no repo cli with Python🚧
No entanto aqui eu vou dar uma breve introdução:
Neste exemplo nós vamos importar a biblioteca argparse para criar uma aplicação simples de linha de comando
pip install argparse
Um aplicativo binário compilado pelo Python pode ser facilmente integrado à Interface de Linha de comando de qualquer terminal, seja Linux, Windows ou Plataformas Embarcadas. Você pode chamar curl aplicativo.exe
e ele será executado. Mas vamos ver o que podemos fazer para torná-lo mais interativo.
A primeira coisa é trabalhar com argumentos, ou parâmetros, como vimos no tutorial anterior. Outra forma é coletar inputs do usuário, enquanto o programa está em execução.
# Import the argparse library
import argparse
import os
import sys
my_parser = argparse.ArgumentParser(name='name of user')
my_parser.add_argument('Path',
metavar='path',
type=str,
help='the path to list')
# Execute the parse_args() method
args = my_parser.parse_args()
input_path = args.Path
if not os.path.isdir(input_path):
print('The path specified does not exist')
sys.exit()
print('\n'.join(os.listdir(input_path)))
Aprenda o estado da arte com ARGPARSE
🚧 Se você quer começar logo veja meu tutorial de Interfaces Amigáveis com Python
Aqui nós experimentamos algums recursos básicos de interface. Mesmo utilizando CLI é possível criar boas interfaces. Em seguida avanço um pouco mais criando interfaces "bonitas" com TUI que são interfaces visuais usando ASCII (exclusivo para terminais e aplicações de linhas de comando).
Se pretende criar interfaces mais avançadas como UI do Sistema operacional como Janelas do Windows, componentes Nativos eu também tenho este estudo. 🚧 Interfaces Nativas com Python
Também estou desenvolvendo este material sobre o Estado da Arte das Interfaces com Python e componentes Web com 🚧 Interfaces com Python - Estado da Arte
Se você tem interesse por games dê uma olhada nestes 🚧 Experimentos com Python - Games
Nesta série de coletâneas eu vou exibir exemplos mais práticos possíveis. Por conta disso, eu vou poupar entrar em detalhes.
mport smtplib, ssl
port = 465 # For SSL
smtp_server = "smtp.gmail.com"
sender_email = "[email protected]" # Enter your address
receiver_email = "[email protected]" # Enter receiver address
password = input("Type your password and press enter: ")
message = """\
Subject: Hi there
This message is sent from Python."""
context = ssl.create_default_context()
with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message
Consulte o tutorial completo do blog dicasdepython
import csv
with open('arquivo.csv', 'rb') as csvfile:
linhas = csv.reader(csvfile, delimiter=',', quotechar='"')
for linha in linhas:
for coluna in linha:
print(coluna, '|')
print('\n')
Vamos fazer um programa para ler o seguinte json
[
{
"nome": "José",
"idade": 25
},
{
"nome": "Maria",
"idade": 19
}
]
import json
with open("dados.json", encoding='utf-8') as meu_json:
dados = json.load(meu_json)
for pessoa in dados:
print(f"nome: {pessoa.nome} idade: {pessoa.idade}")
Consulte também psycopg2 Consulte também PySQLite
import sqlite3
conn = sqlite3.connect('clientes.db')
cursor = conn.cursor()
cursor.execute("""
INSERT INTO clientes (nome, idade, cpf, email, fone, cidade, uf, criado_em)
VALUES ('Aloisio', 87, '11111111111', '[email protected]', '98765-4322', 'Porto Alegre', 'RS', '2014-06-09')
""")
cursor.execute("""
SELECT * FROM clientes;
""")
for linha in cursor.fetchall():
print(linha)
# alterando os dados da tabela
cursor.execute("""
UPDATE clientes
SET fone = ?, criado_em = ?
WHERE id = ?
""", (novo_fone, novo_criado_em, id_cliente))
conn.commit()
conn.close()
import io
conn = sqlite3.connect('clientes.db')
with io.open('clientes_dump.sql', 'w') as f:
for linha in conn.iterdump():
f.write('%s\n' % linha)
print('Backup realizado com sucesso.')
print('Salvo como clientes_dump.sql')
conn.close()
Nesta seção eu dedico uma parte especial ao SQLite. Em seguida eu recomendo você experimentar um banco de dados Profissional que suporta grande volume de dados como Postgresql 🚧 [Trabalhando com Banco de Dados]
Neste diretório eu reúno um estudo completo de SQL com Python, incluindo discutindo alguns fundamentos de SQL [SQL completo com Python]
import logging
logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
logging.error('And non-ASCII stuff, too, like Øresund and Malmö')
veja este tutorial avançado de log (Em inglês)
Eu recomendo acompanhar a minha trilha de FastApi com Pythn
Esta lib tqdm
nos dá uma boa amostra do quanto Python é legal
from time import sleep
from tqdm import tqdm
for n in tqdm(range(100)):
sleep(1)
Esta simples linha de código nos dá uma barra de progresso bem legal para visualizar como anda o nosso processo. Pense num processo demorado, esta lib irá criar um feedeback para o usuário em tempo real, sem muito esforço.
20%| ▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
Acesse a documentação completa
The examples by subject are in \General Folder
Os recursos sintáticos da linguagem
As variáveis são declaradas com qualquer nome seguidos do símbolo =
igual e o valor.
name = 'Ricardo'
email = '[email protected]'
O tipo da variável é inferido em runtime (em tempo de execução) de acordo com o valor que foi atribuído. Portanto o Python é uma linguagem fracamente tipada
number = 1 # O número é inteiro
number = '1' # Agora o número é string
Portanto tome cuidado com os nomes das variáveis, pois o seu tipo pode mudar.
Módulos são formas de criar programas em arquivos separados para que possam ser reaproveitados ou chamados de diversos outros lugares. Isto permite centralizar a sua regra de negócios e facilita o trabalho de dar manutenção no código.
from module import some
Repetições são bem legais em Python
Veja os exemplos:
for x in range(10){ // range(10) gera uma lista que vai de 0..9 , 10 não é incluído
if x%2==0
print!(f"{x} é par")}
if x==5:
continue;
print(f"{x}")
if x==5:
return x //Retorna o valor de x
while True:
try:
x = int(input("Digite um número: "))
break
### Manipulando erros conhecidos
except ValueError:
print("Oops! Este não é um número. Tente novamente...")
### Manipulando outros erros
except:
print("Oops! Erro desconhecido")
Veja em detalhes 🚧 [manipulação de erros](https://docs.python.org/3/tutorial/errors.html docs
Python has full support on docstrings. Docstrings are commets in code you can write to make your code most readable for third consumers and colabs.
All about documentations
Veja este tópico (em inglês)
Testes são o coração de algumas arquiteturas de software, como TDD
Para escrever testes você pode fazer algo parecido com isso
assert sum([1, 2, 3]) == 6, "Should be 6"
Veja testing (em inglês)
Isto irá impedir que alguém altere o valor do array sem verificar se de fato ele poderá ser mudado sem quebrar o código legado