├── .gitignore ├── 2022-05-04-revisao-POO ├── main.py └── src │ ├── __init__.py │ ├── passaro.py │ ├── passaro_africano.py │ └── passaro_europeu.py ├── 2022-05-05-serializacao ├── exemplo_csv.py ├── exemplo_json.py ├── exemplo_open.py ├── files │ ├── AirQualityUCI.csv │ └── maicon.json └── site_python.py ├── 2022-05-19-testes ├── main.py ├── requirements.txt └── tests │ ├── __init__.py │ ├── test_execicios_funcoes.py │ └── test_execicios_funcoes_2.py ├── 2022-05-24-testes ├── docs │ ├── diagramas │ │ └── aluguel de veiculos.drawio │ └── imagens │ │ └── veiculos.png ├── requirements.txt ├── src │ ├── __init__.py │ ├── cadastro_veiculo.py │ └── veiculo.py └── tests │ ├── __init__.py │ ├── test_cadastro_veiculos.py │ └── test_veiculo.py ├── 2022-05-26-testes ├── .gitignore ├── docs │ ├── diagramas │ │ └── aluguel de veiculos.drawio │ └── imagens │ │ └── veiculos.png ├── requirements.txt ├── src │ ├── __init__.py │ ├── cadastro_veiculo.py │ └── veiculo.py └── tests │ ├── __init__.py │ ├── cadastro_veiculos_inserir.feature │ ├── cadastro_veiculos_remover.feature │ ├── steps │ └── cadastro_veiculo_step.py │ ├── test_cadastro_veiculos.py │ └── test_veiculo.py ├── 2022-05-31-http ├── 200.jpeg ├── main.py └── requirements.txt ├── 2022-06-02-rest-api ├── api-aluguel-veiculos │ ├── .gitignore │ ├── README.md │ ├── app.py │ ├── docs │ │ ├── diagramas │ │ │ └── aluguel de veiculos.drawio │ │ ├── examples │ │ │ ├── app.py │ │ │ └── exemplo_filter.py │ │ └── imagens │ │ │ ├── clientes.png │ │ │ └── veiculos.png │ ├── requirements.txt │ ├── src │ │ ├── __init__.py │ │ ├── business │ │ │ ├── __init__.py │ │ │ ├── aluguel.py │ │ │ ├── cadastro_abstract.py │ │ │ ├── cadastro_cliente.py │ │ │ ├── cadastro_veiculo.py │ │ │ └── controle_aluguel.py │ │ ├── entities │ │ │ ├── __init__.py │ │ │ ├── automovel.py │ │ │ ├── caminhao.py │ │ │ ├── cliente.py │ │ │ ├── entity.py │ │ │ ├── pessoa_fisica.py │ │ │ ├── pessoal_juridica.py │ │ │ └── veiculo.py │ │ └── exceptions │ │ │ ├── __init__.py │ │ │ ├── base_aluguel_error.py │ │ │ ├── cliente_not_found_error.py │ │ │ └── not_found_error.py │ └── tests │ │ ├── __init__.py │ │ └── business │ │ ├── __init__.py │ │ ├── test_cadastro_cliente_consultar.py │ │ └── test_cadastro_cliente_inserir.py └── client-http │ └── client_http.py ├── 2022-06-14-database-mysql ├── main.py └── requirements.txt ├── 2022-06-28-django ├── MER.mwb ├── MER.png └── README.md ├── 2022-06-30-django ├── .gitignore ├── README.md ├── aluguel_veiculos │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_alter_aluguel_options.py │ │ └── __init__.py │ ├── models.py │ ├── serializer.py │ ├── tests.py │ ├── urls.py │ └── views.py ├── manage.py ├── requirements.txt └── setup │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── 2022-07-05-drf └── aluguel_veiculos │ ├── .gitignore │ ├── README.md │ ├── aluguel_veiculos │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models │ │ ├── __init__.py │ │ ├── aluguel.py │ │ ├── cliente.py │ │ └── veiculo.py │ ├── serializers │ │ ├── __init__.py │ │ ├── cliente_serializer.py │ │ └── veiculo_serializer.py │ ├── tests.py │ ├── validator │ │ ├── __init__.py │ │ └── cpf_validator.py │ └── views │ │ ├── __init__.py │ │ ├── cliente_viewset.py │ │ └── veiculo_viewset.py │ ├── configuracoes │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py │ ├── docs │ ├── inst_django.md │ └── inst_django_rest_framework.md │ ├── manage.py │ └── requirements.txt ├── 2022-07-07-drf-tests ├── .gitignore ├── README.md ├── docs │ ├── inst_django.md │ └── inst_django_rest_framework.md ├── locadora │ ├── __init__.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models │ │ ├── __init__.py │ │ └── cliente.py │ ├── serializers │ │ ├── __init__.py │ │ └── cliente_serializer.py │ ├── tests │ │ ├── __init__.py │ │ └── test_cliente.py │ └── views │ │ ├── __init__.py │ │ └── cliente_viewset.py ├── manage.py └── settings │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── 2022-07-16 ├── .gitignore ├── README.md ├── aluguel_veiculos │ ├── __init__.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_aluguel_valor_alter_aluguel_data_devolucao_and_more.py │ │ ├── 0003_alter_aluguel_valor.py │ │ ├── 0004_alter_aluguel_valor.py │ │ └── __init__.py │ ├── models │ │ ├── __init__.py │ │ ├── aluguel.py │ │ ├── cliente.py │ │ └── veiculo.py │ ├── serializers │ │ ├── __init__.py │ │ ├── aluguel_serializer.py │ │ ├── cliente_serializer.py │ │ ├── lista_alugueis_cliente_serializer.py │ │ └── veiculo_serializer.py │ ├── tests.py │ ├── urls.py │ ├── validator │ │ ├── __init__.py │ │ └── cpf_validator.py │ └── views │ │ ├── __init__.py │ │ ├── aluguel_viewset.py │ │ ├── cliente_viewset.py │ │ ├── lista_alugueis_cliente_viewset.py │ │ ├── lista_clientes_veiculo_viewset.py │ │ └── veiculo_viewset.py ├── configuracoes │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── docs │ ├── front_exemplo │ │ ├── form.html │ │ ├── index.html │ │ └── script.js │ ├── inst_django.md │ └── inst_django_rest_framework.md ├── manage.py └── requirements.txt ├── Encontro01--15-02-2022-onboarding ├── desafio01.py ├── desafio02-gabarito.py └── desafio02.py ├── Encontro02--17-02-2022-int-float-string ├── 01-int-float.py └── 02-string.py ├── Encontro03--22-02-2022-list-dict-set ├── 01-list.py ├── 02-dicts.py └── 03-sets.py ├── Encontro04--24-02-2022-if-else-elif └── 01-if-else-elif.py ├── Encontro05--08-03-2022-for-while ├── 01-for.py └── 02-while.py ├── Encontro06--10-03-2022-funcoes └── 01-funcoes.py ├── Encontro07_08--15-03-2022-modulos-pacotes-venv ├── calculo.py ├── main.py └── material.md ├── Encontro09_10--10-22-03-2022-modulos-builin-bingo ├── bingo.py ├── cartela.py ├── distancia_terrestre.py └── sorteio.py ├── Encontro12--31-03-2022-projetos-portifolio-jogo-forca ├── jogo_forca_alunos.py ├── jogo_forca_ao_vivo.py └── utils.py ├── Encontro13--05-04-2022-projetos-portifolio-quad-mag └── quadrado_magico_4x4.py ├── Encontro14--07-04-2022-sorteio-code-war ├── Sorteio.csv ├── quadrado_magico_4x4.py ├── sorteio.py └── sorteio2.py ├── Encontros-POO ├── E15-12-04-2022-introducao │ ├── main.py │ └── pessoas.py ├── E16-14-04-2022-her-pol-encaps │ ├── 01-funcionarios.py │ ├── 02-heranca_polimorfismo_aves.py │ ├── impostos.py │ ├── pessoas.py │ └── vendas.py └── E17-19-04-2022-comparacao-obj │ ├── comparacao_classes.py │ ├── diuvida │ ├── main.py │ ├── one_underscore.py │ └── two_underscores.py │ └── erros_customizados_heranca.py ├── Exercícios ├── 00-desafios.pdf ├── 01-int-float.pdf ├── 02-listas.pdf ├── 03-dicts-sets.pdf ├── 04-if-elif-else.pdf ├── 05-laço-repetição.pdf ├── 06-funções.pdf ├── 07-poo.pdf └── Gabaritos │ ├── 01-int-float │ ├── exercicio01.py │ ├── exercicio02.py │ ├── exercicio03.py │ ├── exercicio04.py │ └── exercicio05.py │ ├── 02-listas │ ├── exercicio01.py │ ├── exercicio02.py │ ├── exercicio03.py │ ├── exercicio04.py │ ├── exercicio05.py │ ├── exercicio06.py │ └── exercicio07.py │ ├── 03-dicts-sets │ ├── exercicio01.py │ ├── exercicio02.py │ ├── exercicio03.py │ ├── exercicio04.py │ └── exercicio05.py │ ├── 04-if-else-elif │ ├── exercicio01.py │ ├── exercicio02.py │ ├── exercicio03.py │ ├── exercicio04.py │ └── exercicio05.py │ ├── 05-laço-repetição │ ├── exercicio01.py │ ├── exercicio02.py │ ├── exercicio03.py │ ├── exercicio04.py │ ├── exercicio05.py │ └── exercicio06.py │ └── 06-funções │ ├── exercicio01.py │ ├── exercicio02.py │ ├── exercicio03.py │ ├── exercicio04.py │ └── exercicio05.py ├── Gabarito-Code-War ├── .gitignore ├── README.md ├── app.py └── src │ ├── __init__.py │ ├── constantes.py │ ├── gerador.py │ └── resolvedor.py └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | Exercícios/*.docx 2 | __pycache__/ 3 | *.pyc -------------------------------------------------------------------------------- /2022-05-04-revisao-POO/main.py: -------------------------------------------------------------------------------- 1 | from src.passaro_africano import PassaroAfricano 2 | from src.passaro_europeu import PassaroEuropeu 3 | 4 | 5 | 6 | passaro_africano = PassaroAfricano(1, 1) 7 | passaro_africano_1 = PassaroAfricano(10, 20) 8 | 9 | print(passaro_africano.calcula_velocidade()) 10 | print(passaro_africano_1.calcula_velocidade()) 11 | 12 | passaro_africano.incrementa_tempo(10) 13 | passaro_africano.incrementa_distancia(15) 14 | 15 | print(passaro_africano.calcula_velocidade()) 16 | print(passaro_africano_1.calcula_velocidade()) 17 | 18 | -------------------------------------------------------------------------------- /2022-05-04-revisao-POO/src/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-05-04-revisao-POO/src/__init__.py -------------------------------------------------------------------------------- /2022-05-04-revisao-POO/src/passaro.py: -------------------------------------------------------------------------------- 1 | 2 | class Passaro(): 3 | 4 | def __init__(self, distancia, tempo): 5 | self.__distancia = distancia 6 | self.__tempo = tempo 7 | 8 | def calcula_velocidade(self): 9 | return self.__distancia/self.__tempo 10 | 11 | def incrementa_tempo(self, incremento: int): 12 | self.__tempo += incremento 13 | 14 | def incrementa_distancia(self, incremento: int): 15 | self.__distancia += incremento 16 | -------------------------------------------------------------------------------- /2022-05-04-revisao-POO/src/passaro_africano.py: -------------------------------------------------------------------------------- 1 | from src.passaro import Passaro 2 | 3 | 4 | class PassaroAfricano(Passaro): 5 | pass 6 | -------------------------------------------------------------------------------- /2022-05-04-revisao-POO/src/passaro_europeu.py: -------------------------------------------------------------------------------- 1 | from .passaro import Passaro 2 | 3 | 4 | class PassaroEuropeu(Passaro): 5 | pass 6 | -------------------------------------------------------------------------------- /2022-05-05-serializacao/exemplo_csv.py: -------------------------------------------------------------------------------- 1 | import csv 2 | 3 | 4 | class Pessoa(): 5 | def __init__(self): 6 | self.nome = None 7 | self.idade = None 8 | self.cidade = None 9 | 10 | pessoa1 = Pessoa(nome="João", idade=35, cidade="São José do Rio Preto") 11 | 12 | 13 | with open('files/pessoas.csv', 'w', newline='\n') as csvfile: 14 | arquivo_csv = csv.writer(csvfile, delimiter=';', quotechar='|', quoting=csv.QUOTE_MINIMAL) 15 | arquivo_csv.writerow(['Spam'] * 5 + ['Baked Beans']) 16 | arquivo_csv.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam']) -------------------------------------------------------------------------------- /2022-05-05-serializacao/exemplo_json.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | class Veiculo(): 4 | def __init__(self): 5 | self.marca = None 6 | self.modelo = None 7 | 8 | def salvar(self): 9 | print("teste") 10 | 11 | 12 | class Pessoa(): 13 | def __init__(self): 14 | self.nome = None 15 | self.idade = None 16 | self.cidade = None 17 | self.veiculos: list = [] 18 | 19 | fusca = Veiculo() 20 | fusca.marca = "VW" 21 | fusca.modelo = "fusca" 22 | 23 | chevete = Veiculo() 24 | chevete.marca = "GM" 25 | chevete.modelo = "chevete" 26 | 27 | chevete.salvar() 28 | 29 | 30 | maicon = Pessoa() 31 | maicon.nome = 'Maicon' 32 | maicon.idade = 35 33 | maicon.cidade = 'Curitiba' 34 | maicon.veiculos.append(fusca.__dict__) 35 | maicon.veiculos.append(chevete.__dict__) 36 | 37 | 38 | maicon_json = json.dumps(maicon.__dict__) 39 | 40 | 41 | with open('files/maicon.json', 'rb') as arquivo: 42 | teste = arquivo.read() 43 | 44 | # with open('files/maicon.json', 'r') as arquivo: 45 | # lista_de_maicons = arquivo.read() 46 | 47 | # lista = json.loads(lista_de_maicons) 48 | 49 | print("FIM") 50 | 51 | 52 | 53 | # { 54 | # "en": "English", 55 | # "es": "Spanish", 56 | # "fr": "French", 57 | # "ja": "Japanese", 58 | # "ko": "Korean", 59 | # "pt-br": "Brazilian Portuguese", 60 | # "zh-cn": "Simplified Chinese", 61 | # "zh-tw": "Traditional Chinese" 62 | # } 63 | 64 | 65 | # maicon = '{"nome": "maicon","idade": 35,"cidade": "curitiba"}' 66 | 67 | # print(maicon) 68 | 69 | 70 | # objeto_maicon = json.loads(maicon) 71 | 72 | # print(objeto_maicon) 73 | -------------------------------------------------------------------------------- /2022-05-05-serializacao/exemplo_open.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | maicon_json = '' 5 | 6 | print(maicon_json) 7 | 8 | 9 | with open('files/maicon.json') as file: 10 | maicon_json = file.read() 11 | 12 | 13 | print(maicon_json) 14 | 15 | 16 | print("FIM") -------------------------------------------------------------------------------- /2022-05-05-serializacao/files/maicon.json: -------------------------------------------------------------------------------- 1 | { 2 | "nome": "Maicon", 3 | "idade": 35, 4 | "cidade": "Curitiba", 5 | "veiculo": [ 6 | { 7 | "marca": "VW", 8 | "modelo": "fusca" 9 | }, 10 | { 11 | "marca": "GM", 12 | "modelo": "chevete" 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /2022-05-05-serializacao/site_python.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | 4 | cadeia_caracteres = '{"en": "English","es": "Spanish","fr": "French","ja": "Japanese","ko": "Korean", "pt-br": "Brazilian Portuguese", "zh-cn": "Simplified Chinese", "zh-tw": "Traditional Chinese"}' 5 | 6 | dicionario = json.loads(cadeia_caracteres) 7 | 8 | cadeia_caracteres = '' 9 | 10 | cadeia_caracteres = json.dumps(dicionario) 11 | 12 | 13 | print(dicionario['en']) 14 | 15 | print(dicionario['pt-br']) -------------------------------------------------------------------------------- /2022-05-19-testes/main.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | def reverso(valor): 4 | return int("".join(reversed(str(valor)))) -------------------------------------------------------------------------------- /2022-05-19-testes/requirements.txt: -------------------------------------------------------------------------------- 1 | attrs==21.4.0 2 | iniconfig==1.1.1 3 | packaging==21.3 4 | pluggy==1.0.0 5 | py==1.11.0 6 | pyparsing==3.0.9 7 | pytest==7.1.2 8 | tomli==2.0.1 9 | -------------------------------------------------------------------------------- /2022-05-19-testes/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-05-19-testes/tests/__init__.py -------------------------------------------------------------------------------- /2022-05-19-testes/tests/test_execicios_funcoes.py: -------------------------------------------------------------------------------- 1 | from unittest import TestCase 2 | from main import reverso 3 | 4 | 5 | class TestExerciciosFuncoes(TestCase): 6 | 7 | 8 | def test_numero_reverso(self): 9 | # Dado 10 | valor = [127, 123, 12141] 11 | resultado = [] 12 | 13 | # Quando 14 | for i in valor: 15 | resultado.append(reverso(i)) 16 | 17 | # Entao 18 | valor_retorno = [721, 321, 14121] 19 | self.assertEqual(resultado, valor_retorno) -------------------------------------------------------------------------------- /2022-05-19-testes/tests/test_execicios_funcoes_2.py: -------------------------------------------------------------------------------- 1 | from pytest import fixture 2 | from main import reverso 3 | 4 | @fixture 5 | def fix(): 6 | print('teste') 7 | 8 | 9 | def test_reverso(fix): 10 | # Dados 11 | valor = 127 12 | 13 | # Quando 14 | resultado = reverso(valor) 15 | 16 | # Entao 17 | assert resultado == 721 18 | 19 | 20 | def test_reverso_array(): 21 | # Dados 22 | valor = [127, 123, 12141] 23 | resultado = [] 24 | 25 | # Quando 26 | for i in valor: 27 | resultado.append(reverso(i)) 28 | 29 | # Entao 30 | valor_retorno = [721, 321, 14121] 31 | 32 | # Entao 33 | assert resultado == valor_retorno 34 | -------------------------------------------------------------------------------- /2022-05-24-testes/docs/imagens/veiculos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-05-24-testes/docs/imagens/veiculos.png -------------------------------------------------------------------------------- /2022-05-24-testes/requirements.txt: -------------------------------------------------------------------------------- 1 | attrs==21.4.0 2 | iniconfig==1.1.1 3 | packaging==21.3 4 | pluggy==1.0.0 5 | py==1.11.0 6 | pyparsing==3.0.9 7 | pytest==7.1.2 8 | tomli==2.0.1 9 | -------------------------------------------------------------------------------- /2022-05-24-testes/src/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-05-24-testes/src/__init__.py -------------------------------------------------------------------------------- /2022-05-24-testes/src/cadastro_veiculo.py: -------------------------------------------------------------------------------- 1 | 2 | class CadastroVeiculo(): 3 | 4 | def __init__(self) -> None: 5 | self.__lista = [] 6 | 7 | def inserir(self, entity): 8 | try: 9 | self.__lista.append(entity) 10 | except Exception as ex: 11 | raise ex 12 | else: 13 | return True 14 | 15 | def consultar(self, id): 16 | lista = list(filter(lambda x: x.id == id, self.__lista)) 17 | if len(lista) > 0: 18 | return lista[0] 19 | 20 | def remover_por_id(self, id): 21 | try: 22 | veiculo = self.consultar(id) 23 | self.__lista.remove(veiculo) 24 | except Exception as ex: 25 | raise ex 26 | else: 27 | return True 28 | -------------------------------------------------------------------------------- /2022-05-24-testes/src/veiculo.py: -------------------------------------------------------------------------------- 1 | 2 | class Veiculo(): 3 | 4 | def __init__(self, id, placa, km) -> None: 5 | self.__id = id 6 | self.__placa = placa 7 | self.__km = km 8 | 9 | @property 10 | def id(self): 11 | return self.__id 12 | 13 | @property 14 | def placa(self): 15 | return self.__placa 16 | 17 | @property 18 | def km(self): 19 | return self.__km -------------------------------------------------------------------------------- /2022-05-24-testes/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-05-24-testes/tests/__init__.py -------------------------------------------------------------------------------- /2022-05-24-testes/tests/test_cadastro_veiculos.py: -------------------------------------------------------------------------------- 1 | from src.veiculo import Veiculo 2 | from src.cadastro_veiculo import CadastroVeiculo 3 | 4 | 5 | def test_retorno_inserir(): 6 | # Dado 7 | veiculo = Veiculo('123', 'rere', 'erer') 8 | cadastro = CadastroVeiculo() 9 | 10 | # Quando 11 | resultado = cadastro.inserir(veiculo) 12 | 13 | # Entao 14 | assert resultado 15 | 16 | 17 | def test_consultar_veiculo_cadastrado_por_id(): 18 | # Dado 19 | veiculo = Veiculo('123', 'rere', 'erer') 20 | cadastro = CadastroVeiculo() 21 | 22 | # Quando 23 | cadastro.inserir(veiculo) 24 | resultado = cadastro.consultar('123') 25 | 26 | # Entao 27 | assert resultado.id == '123' 28 | 29 | 30 | def test_consultar_id_veiculo_inserido(): 31 | # Dado 32 | veiculo = Veiculo('1321', 'gol', 1263456) 33 | cadastro = CadastroVeiculo() 34 | 35 | # Quando 36 | cadastro.inserir(veiculo) 37 | resultado = cadastro.consultar('1321') 38 | 39 | # Entao 40 | assert resultado.id == '1321' 41 | 42 | 43 | def test_consultar_km_veiculo_inserido(): 44 | # Dado 45 | veiculo = Veiculo('1321', 'gol', 1263456) 46 | cadastro = CadastroVeiculo() 47 | 48 | # Quando 49 | cadastro.inserir(veiculo) 50 | resultado = cadastro.consultar('1321') 51 | 52 | # Entao 53 | assert resultado.km == 1263456 54 | 55 | 56 | def test_consultar_placa_veiculo_inserido(): 57 | # Dado 58 | veiculo = Veiculo('1321', 'gol', 1263456) 59 | cadastro = CadastroVeiculo() 60 | 61 | # Quando 62 | cadastro.inserir(veiculo) 63 | resultado = cadastro.consultar('1321') 64 | 65 | # Entao 66 | assert resultado.placa == 'gol' 67 | 68 | 69 | def test_remover_por_id_veiculo(): 70 | # Dado 71 | veiculo = Veiculo('1321', 'gol', 1263456) 72 | cadastro = CadastroVeiculo() 73 | 74 | # Quando 75 | cadastro.inserir(veiculo) 76 | resultado = cadastro.remover_por_id('1321') 77 | 78 | # Entao 79 | assert resultado 80 | 81 | def test_validar_remocao(): 82 | # Dado 83 | veiculo_a = Veiculo('1321', 'gol', 1263456) 84 | cadastro = CadastroVeiculo() 85 | 86 | # Quando 87 | cadastro.inserir(veiculo_a) 88 | cadastro.remover_por_id('1321') 89 | 90 | resultado = cadastro.consultar('1321') 91 | 92 | # Entao 93 | assert resultado is None -------------------------------------------------------------------------------- /2022-05-24-testes/tests/test_veiculo.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | from src.veiculo import Veiculo 3 | 4 | 5 | def test_inserir_set_placa_veiculo_error(): 6 | # Dado 7 | veiculo = Veiculo('123', 'rere', 'erer') 8 | 9 | # Quando 10 | # Entao 11 | with pytest.raises(AttributeError): 12 | veiculo.placa = 'teste' 13 | 14 | 15 | def test_inserir_set_id_veiculo_error(): 16 | # Dado 17 | veiculo = Veiculo('123', 'rere', 'erer') 18 | 19 | # Quando 20 | # Entao 21 | with pytest.raises(AttributeError): 22 | veiculo.id = 'teste' 23 | 24 | 25 | def test_inserir_set_km_veiculo_error(): 26 | # Dado 27 | veiculo = Veiculo('123', 'rere', 'erer') 28 | 29 | # Quando 30 | # Entao 31 | with pytest.raises(AttributeError): 32 | veiculo.km = 'teste' 33 | -------------------------------------------------------------------------------- /2022-05-26-testes/.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | .vscode 3 | .venv 4 | .pytest_cache -------------------------------------------------------------------------------- /2022-05-26-testes/docs/imagens/veiculos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-05-26-testes/docs/imagens/veiculos.png -------------------------------------------------------------------------------- /2022-05-26-testes/requirements.txt: -------------------------------------------------------------------------------- 1 | attrs==21.4.0 2 | autopep8==1.6.0 3 | behave==1.2.6 4 | coverage==6.4 5 | iniconfig==1.1.1 6 | packaging==21.3 7 | parse==1.19.0 8 | parse-type==0.6.0 9 | pluggy==1.0.0 10 | py==1.11.0 11 | pycodestyle==2.8.0 12 | pyparsing==3.0.9 13 | pytest==7.1.2 14 | pytest-cov==3.0.0 15 | six==1.16.0 16 | toml==0.10.2 17 | tomli==2.0.1 18 | -------------------------------------------------------------------------------- /2022-05-26-testes/src/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-05-26-testes/src/__init__.py -------------------------------------------------------------------------------- /2022-05-26-testes/src/cadastro_veiculo.py: -------------------------------------------------------------------------------- 1 | 2 | class CadastroVeiculo(): 3 | 4 | def __init__(self) -> None: 5 | self.__lista = [] 6 | 7 | def inserir(self, entity): 8 | try: 9 | self.__lista.append(entity) 10 | except Exception as ex: 11 | raise ex 12 | else: 13 | return True 14 | 15 | def consultar(self, id): 16 | lista = list(filter(lambda x: x.id == id, self.__lista)) 17 | if len(lista) > 0: 18 | return lista[0] 19 | 20 | def remover_por_id(self, id): 21 | try: 22 | veiculo = self.consultar(id) 23 | self.__lista.remove(veiculo) 24 | except Exception as ex: 25 | raise ex 26 | else: 27 | return True 28 | 29 | def listar_todos(self): 30 | return self.__lista -------------------------------------------------------------------------------- /2022-05-26-testes/src/veiculo.py: -------------------------------------------------------------------------------- 1 | 2 | class Veiculo(): 3 | 4 | def __init__(self, id, placa, km) -> None: 5 | self.__id = id 6 | self.__placa = placa 7 | self.__km = km 8 | 9 | @property 10 | def id(self): 11 | return self.__id 12 | 13 | 14 | @property 15 | def placa(self): 16 | return self.__placa 17 | 18 | @property 19 | def km(self): 20 | return self.__km -------------------------------------------------------------------------------- /2022-05-26-testes/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-05-26-testes/tests/__init__.py -------------------------------------------------------------------------------- /2022-05-26-testes/tests/cadastro_veiculos_inserir.feature: -------------------------------------------------------------------------------- 1 | # language: pt 2 | 3 | Funcionalidade: teste de cadastro de veiculos inserir 4 | 5 | 6 | Cenario: validar o retorno do metodo inserir veiculo 7 | Dado o veiculo com placa "jtc1988", identificacao "123" e quilometragem "123546" 8 | Quando efetuado o cadastro 9 | Entao o resultado deve ser "Verdadeiro" 10 | 11 | Cenario: validar o retorno do metodo inserir veiculos 12 | Dado o veiculo com placa "teste", identificacao "45645" e quilometragem "464564" 13 | Quando efetuado o cadastro 14 | Entao o veiculo cadastrado deve ter os dados placa "teste", identificacao 45645 e quilometragem "464564" 15 | 16 | Cenario: validar veiculos cadastrados 17 | Dados o cadastrado dos dados de veiculos 18 | |id | placa | km | 19 | | 1 |"jtc1988" |"1231" | 20 | | 2 |"jtc1988" |"1231" | 21 | | 3 |"jtc1988" |"1231" | 22 | | 4 |"jtc1988" |"1231" | 23 | Quando listado todos os veiculos 24 | Entao o resultado de ser 25 | |id | placa | km | 26 | | 1 |"jtc1988" |"1231" | 27 | | 2 |"jtc1988" |"1231" | 28 | | 3 |"jtc1988" |"1231" | 29 | | 4 |"jtc1988" |"1231" | 30 | -------------------------------------------------------------------------------- /2022-05-26-testes/tests/cadastro_veiculos_remover.feature: -------------------------------------------------------------------------------- 1 | # language: pt 2 | 3 | Funcionalidade: Testar a rotina de remoção de veiculos de uma lista 4 | 5 | 6 | Cenario: validar a remoção por id 7 | Dados o cadastrado dos dados de veiculos 8 | |id | placa | km | 9 | | 1 |"jtc1988" |"1231" | 10 | | 2 |"jtc1988" |"1231" | 11 | | 3 |"jtc1988" |"1231" | 12 | | 4 |"jtc1988" |"1231" | 13 | Quando o veiculo com id "1" for removido 14 | Entao a quantidade de veiculos cadastrados deve ser 3 15 | -------------------------------------------------------------------------------- /2022-05-26-testes/tests/steps/cadastro_veiculo_step.py: -------------------------------------------------------------------------------- 1 | from src.cadastro_veiculo import CadastroVeiculo 2 | from src.veiculo import Veiculo 3 | 4 | 5 | @given(u'o veiculo com placa "{placa}", identificacao "{id}" e quilometragem "{km}"') 6 | def step_impl(context, placa, id, km): 7 | context.veiculo = Veiculo(id, placa, km) 8 | 9 | 10 | @when(u'efetuado o cadastro') 11 | def step_impl(context): 12 | context.cadastro = CadastroVeiculo() 13 | context.resultado = context.cadastro.inserir(context.veiculo) 14 | 15 | 16 | @then(u'o resultado deve ser "Verdadeiro"') 17 | def step_impl(context): 18 | assert context.resultado == True 19 | 20 | 21 | @then(u'o veiculo cadastrado deve ter os dados placa "{placa}", identificacao {id} e quilometragem "{km}"') 22 | def step_impl(context, placa, id, km): 23 | resultado = context.cadastro.consultar(id) 24 | 25 | assert (resultado.placa == placa) and (resultado.km == km) 26 | 27 | 28 | @given(u'o cadastrado dos dados de veiculos') 29 | def step_impl(context): 30 | context.cadastro = CadastroVeiculo() 31 | for dado in context.table: 32 | veiculo = Veiculo(dado['id'], dado['placa'], dado['km']) 33 | context.cadastro.inserir(veiculo) 34 | 35 | 36 | @when(u'o veiculo com id "{id}" for removido') 37 | def step_impl(context, id): 38 | context.cadastro.remover_por_id(id) 39 | 40 | 41 | @then(u'a quantidade de veiculos cadastrados deve ser {quantidade}') 42 | def step_impl(context, quantidade): 43 | resultado = context.cadastro.listar_todos() 44 | assert len(resultado) == int(quantidade) 45 | 46 | @when(u'listado todos os veiculos') 47 | def step_impl(context): 48 | context.veiculos = context.cadastro.listar_todos() 49 | 50 | 51 | @then(u'o resultado de ser') 52 | def step_impl(context): 53 | for row in context.table: 54 | resultado = list(filter(lambda x: x.id == row['id'], context.veiculos)) 55 | assert resultado[0].placa == row['placa'] and resultado[0].km == row['km'] 56 | -------------------------------------------------------------------------------- /2022-05-26-testes/tests/test_cadastro_veiculos.py: -------------------------------------------------------------------------------- 1 | from src.veiculo import Veiculo 2 | from src.cadastro_veiculo import CadastroVeiculo 3 | 4 | 5 | def test_retorno_inserir(): 6 | # Dado 7 | veiculo = Veiculo('123', 'rere', 'erer') 8 | cadastro = CadastroVeiculo() 9 | 10 | # Quando 11 | resultado = cadastro.inserir(veiculo) 12 | 13 | # Entao 14 | assert resultado 15 | 16 | 17 | def test_consultar_veiculo_cadastrado_por_id(): 18 | # Dado 19 | veiculo = Veiculo('123', 'rere', 'erer') 20 | cadastro = CadastroVeiculo() 21 | 22 | # Quando 23 | cadastro.inserir(veiculo) 24 | resultado = cadastro.consultar('123') 25 | 26 | # Entao 27 | assert resultado.id == '123' 28 | 29 | 30 | def test_consultar_id_veiculo_inserido(): 31 | # Dado 32 | veiculo = Veiculo('1321', 'gol', 1263456) 33 | cadastro = CadastroVeiculo() 34 | 35 | # Quando 36 | cadastro.inserir(veiculo) 37 | resultado = cadastro.consultar('1321') 38 | 39 | # Entao 40 | assert resultado.id == '1321' 41 | 42 | 43 | def test_consultar_km_veiculo_inserido(): 44 | # Dado 45 | veiculo = Veiculo('1321', 'gol', 1263456) 46 | cadastro = CadastroVeiculo() 47 | 48 | # Quando 49 | cadastro.inserir(veiculo) 50 | resultado = cadastro.consultar('1321') 51 | 52 | # Entao 53 | assert resultado.km == 1263456 54 | 55 | 56 | def test_consultar_placa_veiculo_inserido(): 57 | # Dado 58 | veiculo = Veiculo('1321', 'gol', 1263456) 59 | cadastro = CadastroVeiculo() 60 | 61 | # Quando 62 | cadastro.inserir(veiculo) 63 | resultado = cadastro.consultar('1321') 64 | 65 | # Entao 66 | assert resultado.placa == 'gol' 67 | 68 | 69 | def test_remover_por_id_veiculo(): 70 | # Dado 71 | veiculo = Veiculo('1321', 'gol', 1263456) 72 | cadastro = CadastroVeiculo() 73 | 74 | # Quando 75 | cadastro.inserir(veiculo) 76 | resultado = cadastro.remover_por_id('1321') 77 | 78 | # Entao 79 | assert resultado 80 | 81 | def test_validar_remocao(): 82 | # Dado 83 | veiculo_a = Veiculo('1321', 'gol', 1263456) 84 | cadastro = CadastroVeiculo() 85 | 86 | # Quando 87 | cadastro.inserir(veiculo_a) 88 | cadastro.remover_por_id('1321') 89 | 90 | resultado = cadastro.consultar('1321') 91 | 92 | # Entao 93 | assert resultado is None -------------------------------------------------------------------------------- /2022-05-26-testes/tests/test_veiculo.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | from src.veiculo import Veiculo 3 | 4 | 5 | def test_inserir_set_placa_veiculo_error(): 6 | # Dado 7 | veiculo = Veiculo('123', 'rere', 'erer') 8 | 9 | # Quando 10 | # Entao 11 | with pytest.raises(AttributeError): 12 | veiculo.placa = 'teste' 13 | 14 | 15 | def test_inserir_set_id_veiculo_error(): 16 | # Dado 17 | veiculo = Veiculo('123', 'rere', 'erer') 18 | 19 | # Quando 20 | # Entao 21 | with pytest.raises(AttributeError): 22 | veiculo.id = 'teste' 23 | 24 | 25 | def test_inserir_set_km_veiculo_error(): 26 | # Dado 27 | veiculo = Veiculo('123', 'rere', 'erer') 28 | 29 | # Quando 30 | # Entao 31 | with pytest.raises(AttributeError): 32 | veiculo.km = 'teste' 33 | -------------------------------------------------------------------------------- /2022-05-31-http/200.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-05-31-http/200.jpeg -------------------------------------------------------------------------------- /2022-05-31-http/main.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | # 401 Não autorizado 4 | url = 'https://sandbox-api.openbank.stone.com.br/api/v1/payment_links/41564531341564/orders' 5 | headers = {'user-agent': 'my-app/0.0.1'} 6 | 7 | r = requests.get(url, headers=headers) 8 | 9 | print(r.status_code) 10 | 11 | # GET 12 | # gatinho_200 = requests.get("https://http.cat/200") 13 | 14 | # with open("200.jpeg", 'wb') as file: 15 | # for chunk in gatinho_200: 16 | # file.write(chunk) 17 | 18 | # print(gatinho_200.status_code) 19 | 20 | 21 | # #POST 22 | # payload = {'key1': 'value1', 'key2': 'value2'} 23 | 24 | # r = requests.post("https://httpbin.org/post", data=payload) 25 | # print(r.text) -------------------------------------------------------------------------------- /2022-05-31-http/requirements.txt: -------------------------------------------------------------------------------- 1 | certifi==2022.5.18.1 2 | charset-normalizer==2.0.12 3 | idna==3.3 4 | requests==2.27.1 5 | urllib3==1.26.9 6 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/README.md: -------------------------------------------------------------------------------- 1 | # aluguel-veiculos 2 | 3 | ## UML 4 | 5 | ### Cadastro de clientes 6 | 7 | ![Cliente](docs/imagens/clientes.png) 8 | 9 | 10 | ### Cadastro de veiculos 11 | 12 | ![Veiculo](docs/imagens/veiculos.png) -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, jsonify, request 2 | from src.business.cadastro_cliente import CadastroCliente 3 | from src.entities.pessoa_fisica import PessoaFisica 4 | 5 | app = Flask(__name__) 6 | 7 | cadastro_cliente = CadastroCliente() 8 | 9 | 10 | @app.route("/cliente", methods=['POST']) 11 | def inserir_cliente(): 12 | dados = request.json 13 | 14 | cliente = PessoaFisica(dados['id'], dados['endereco'], dados['telefone'], dados['cpf'], dados['nome']) 15 | cadastro_cliente.inserir(cliente) 16 | 17 | return "ok", 201 18 | 19 | @app.route("/cliente") 20 | def consultar_clientes(): 21 | resultado = cadastro_cliente.listar_todos() 22 | 23 | return jsonify(resultado[0].__dict__) 24 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/docs/examples/app.py: -------------------------------------------------------------------------------- 1 | from src.business.cadastro_cliente import CadastroCliente 2 | from src.entities.cliente import Cliente 3 | from src.entities.pessoa_fisica import PessoaFisica 4 | from src.entities.pessoal_juridica import PessoaJuridica 5 | from src.exceptions.base_aluguel_error import BaseAluguelError 6 | 7 | 8 | cliente = Cliente('1', 'rua 1', '9988-4433', 'Maicon') 9 | 10 | cliente_pessoa_fisica = PessoaFisica( 11 | '2', 'rua 2', '9999-5555', '542.521.532-85', 'Henrique') 12 | cliente_pessoa_juridica = PessoaJuridica( 13 | '3', 'rua 3', '9999-7777', '12.169.185/0001-42', 'Henrique LTDA') 14 | 15 | 16 | cadastro = CadastroCliente() 17 | 18 | cadastro.inserir(cliente) 19 | cadastro.inserir(cliente_pessoa_fisica) 20 | cadastro.inserir(cliente_pessoa_juridica) 21 | 22 | try: 23 | pessoa_juridica = cadastro.consultar('3') 24 | print(pessoa_juridica.nome) 25 | 26 | pessoa_anonima = cadastro.consultar('2') 27 | print(pessoa_anonima.nome) 28 | 29 | cadastro.remover_por_id('1') 30 | 31 | cadastro.remover_por_id('5') 32 | 33 | todos_clientes = cadastro.listar_todos() 34 | 35 | # print(todos_clientes) 36 | 37 | cadastro.remover_por_entidade(cliente_pessoa_juridica) 38 | 39 | todos_clientes = cadastro.listar_todos() 40 | except BaseAluguelError as ex: 41 | print(f"DEU O ERRO, {ex.mensagem}") 42 | 43 | 44 | 45 | 46 | print('FIM') 47 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/docs/examples/exemplo_filter.py: -------------------------------------------------------------------------------- 1 | from traceback import print_list 2 | from src.business.cadastro_cliente import CadastroCliente 3 | from src.entities.cliente import Cliente 4 | from src.entities.entity import Entity 5 | from src.entities.pessoa_fisica import PessoaFisica 6 | from src.entities.pessoal_juridica import PessoaJuridica 7 | 8 | 9 | cliente = Cliente('1', 'rua 1', '9988-4433', 'Maicon') 10 | 11 | 12 | cliente_pessoa_fisica = PessoaFisica( 13 | '2', 'rua 2', '9999-5555', '542.521.532-85', 'Henrique') 14 | cliente_pessoa_juridica = PessoaJuridica( 15 | '3', 'rua 3', '9999-7777', '12.169.185/0001-42', 'Henrique LTDA') 16 | 17 | lista_clientes = [] 18 | 19 | lista_clientes.append(cliente) 20 | lista_clientes.append(cliente_pessoa_fisica) 21 | lista_clientes.append(cliente_pessoa_juridica) 22 | 23 | lista_filtrada = [] 24 | 25 | # 1 26 | # for cliente in lista_clientes: 27 | # if cliente.id == '3': 28 | # lista_filtrada.append(cliente) 29 | 30 | # 2 31 | # def valida_id(cliente, id): 32 | # resultado = cliente.id == id 33 | # return resultado 34 | 35 | # for cliente in lista_clientes: 36 | # if valida_id(cliente, '3'): 37 | # lista_filtrada.append(cliente) 38 | 39 | # 3 40 | # funcao = lambda cliente: cliente.id == '3' 41 | # lista_filtrada = list(filter(funcao, lista_clientes)) 42 | 43 | # 4 44 | id = '3' 45 | lista_filtrada = list(filter(lambda cliente: cliente.id == id, lista_clientes)) 46 | 47 | 48 | print(lista_filtrada[0].nome) -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/docs/imagens/clientes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-06-02-rest-api/api-aluguel-veiculos/docs/imagens/clientes.png -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/docs/imagens/veiculos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-06-02-rest-api/api-aluguel-veiculos/docs/imagens/veiculos.png -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/requirements.txt: -------------------------------------------------------------------------------- 1 | attrs==21.4.0 2 | autopep8==1.6.0 3 | click==8.1.3 4 | Flask==2.1.2 5 | importlib-metadata==4.11.4 6 | iniconfig==1.1.1 7 | itsdangerous==2.1.2 8 | Jinja2==3.1.2 9 | MarkupSafe==2.1.1 10 | packaging==21.3 11 | pluggy==1.0.0 12 | py==1.11.0 13 | pycodestyle==2.8.0 14 | pyparsing==3.0.9 15 | pytest==7.1.2 16 | toml==0.10.2 17 | tomli==2.0.1 18 | Werkzeug==2.1.2 19 | zipp==3.8.0 20 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-06-02-rest-api/api-aluguel-veiculos/src/__init__.py -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/business/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-06-02-rest-api/api-aluguel-veiculos/src/business/__init__.py -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/business/aluguel.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from src.entities.cliente import Cliente 3 | from src.entities.veiculo import Veiculo 4 | 5 | 6 | class Aluguel(): 7 | 8 | def __init__(self): 9 | self.cliente: Cliente = None 10 | self.veiculo: Veiculo = None 11 | self.ativo: bool = True 12 | self.data_retirada: datetime = datetime.now() 13 | self.data_devolucao: datetime = datetime.now() 14 | self.valor_diaria: float = None 15 | self.valor_apagar: float = None 16 | 17 | def aluguel(self, cliente: Cliente, veiculo: Veiculo, valor_diaria: float): 18 | pass 19 | 20 | def devolucao(self): 21 | pass 22 | 23 | def calcular_valor_apagar(self, cliente: Cliente, veiculo: Veiculo) -> float: 24 | pass 25 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/business/cadastro_abstract.py: -------------------------------------------------------------------------------- 1 | from abc import ABC 2 | from typing import List 3 | from src.entities.entity import Entity 4 | from src.exceptions.not_found_error import NotFoundError 5 | 6 | class CadastroAbtract(ABC): 7 | 8 | def __init__(self): 9 | self.__lista = [] 10 | 11 | def inserir(self, entidade: Entity) -> None: 12 | self.__lista.append(entidade) 13 | 14 | def consultar(self, id: str) -> Entity: 15 | entidade = list(filter(lambda x: x.id == id, self.__lista)) 16 | 17 | if entidade == []: 18 | raise NotFoundError("Entidade não encontrada.") 19 | 20 | return entidade[0] 21 | 22 | def remover_por_id(self, id: str) -> None: 23 | entidade = self.consultar(id) 24 | self.__lista.remove(entidade) 25 | 26 | def remover_por_entidade(self, entidade: Entity) -> None: 27 | self.__lista.remove(entidade) 28 | 29 | def listar_todos(self) -> List[Entity]: 30 | return self.__lista 31 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/business/cadastro_cliente.py: -------------------------------------------------------------------------------- 1 | from src.entities.cliente import Cliente 2 | from src.exceptions.cliente_not_found_error import ClienteNotFoundError 3 | from src.exceptions.not_found_error import NotFoundError 4 | from .cadastro_abstract import CadastroAbtract 5 | 6 | 7 | class CadastroCliente(CadastroAbtract): 8 | 9 | def consultar(self, id: str) -> Cliente: 10 | try: 11 | return super().consultar(id) 12 | except NotFoundError: 13 | raise ClienteNotFoundError('Cliente não encontrado.') 14 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/business/cadastro_veiculo.py: -------------------------------------------------------------------------------- 1 | from typing import List 2 | from src.business.cadastro_abstract import CadastroAbtract 3 | from src.entities.veiculo import Veiculo 4 | 5 | 6 | class CadastroVeiculo(CadastroAbtract): 7 | 8 | def __init__(self) -> None: 9 | self.__veiculos: List[Veiculo] = [] 10 | 11 | def inserir(self, veiculo: Veiculo): 12 | self.__veiculos.append(veiculo) 13 | 14 | def consultar(self, id: str) -> Veiculo: 15 | veiculo = list(filter(lambda x: x.id == id, self.__veiculos)) 16 | return veiculo[0] 17 | 18 | def remover_por_id(self, id: str) -> None: 19 | veiculo = self.consultar(id) 20 | self.__veiculos.remove(veiculo) 21 | 22 | def remover_por_entidade(self, veiculo: Veiculo) -> None: 23 | self.__veiculos.remove(veiculo) 24 | 25 | def listar_todos(self) -> List[Veiculo]: 26 | return self.__veiculos 27 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/business/controle_aluguel.py: -------------------------------------------------------------------------------- 1 | 2 | from src.business.aluguel import Aluguel 3 | 4 | 5 | class ControleAluguel(): 6 | 7 | def __init__(self): 8 | self.__lista: list(Aluguel) = None 9 | 10 | def controle_aluguel(self): 11 | pass 12 | 13 | def registra_aluguel(self, placa: str): 14 | pass 15 | 16 | def consulta_aluguel(self, placa: str) -> Aluguel: 17 | pass 18 | 19 | def listar_alugueis_ativos(self) -> list(Aluguel): 20 | pass 21 | 22 | def listar_alugueis_concluidos(self) -> list(Aluguel): 23 | pass 24 | 25 | def listar_todos(self) -> list(Aluguel): 26 | pass 27 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/entities/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-06-02-rest-api/api-aluguel-veiculos/src/entities/__init__.py -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/entities/automovel.py: -------------------------------------------------------------------------------- 1 | from src.entities.veiculo import Veiculo 2 | 3 | 4 | class Automovel(Veiculo): 5 | 6 | def __init__(self, id: str, placa: str, km: float, bagageiro: int, portas: int): 7 | super().__init__(id, placa, km) 8 | self.__bagageiro = bagageiro 9 | self.__portas = portas 10 | 11 | @property 12 | def bagageiro(self) -> int: 13 | return self.__bagageiro 14 | 15 | @property 16 | def portas(self) -> int: 17 | return self.__portas 18 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/entities/caminhao.py: -------------------------------------------------------------------------------- 1 | from src.entities.veiculo import Veiculo 2 | 3 | 4 | class Cominhao(Veiculo): 5 | 6 | def __init__(self, id: str, placa: str, km: float, carga: float): 7 | super().__init__(id, placa, km) 8 | self.__carga = carga 9 | 10 | @property 11 | def carga(self) -> float: 12 | return self.__carga 13 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/entities/cliente.py: -------------------------------------------------------------------------------- 1 | from .entity import Entity 2 | 3 | 4 | class Cliente(Entity): 5 | 6 | def __init__(self, id: str, endereco: str, telefone: str, nome: str): 7 | super().__init__(id) 8 | self.__endereco: str = endereco 9 | self.__telefone: str = telefone 10 | self.__nome: str = nome 11 | 12 | @property 13 | def endereco(self) -> str: 14 | return self.__endereco 15 | 16 | @property 17 | def telefone(self) -> str: 18 | return self.__telefone 19 | 20 | @property 21 | def nome(self) -> str: 22 | return self.__nome 23 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/entities/entity.py: -------------------------------------------------------------------------------- 1 | 2 | class Entity(): 3 | 4 | def __init__(self, id: str): 5 | self.__id: str = id 6 | 7 | @property 8 | def id(self) -> str: 9 | return self.__id 10 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/entities/pessoa_fisica.py: -------------------------------------------------------------------------------- 1 | from .cliente import Cliente 2 | 3 | 4 | class PessoaFisica(Cliente): 5 | 6 | def __init__(self, id: str, endereco: str, telefone: str, cpf: str, nome: str): 7 | super().__init__(id, endereco, telefone, nome) 8 | self.__cpf = cpf 9 | 10 | @property 11 | def cpf(self) -> str: 12 | return self.__cpf 13 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/entities/pessoal_juridica.py: -------------------------------------------------------------------------------- 1 | from .cliente import Cliente 2 | 3 | 4 | class PessoaJuridica(Cliente): 5 | 6 | def __init__(self, id: str, endereco: str, telefone: str, cnpj: str, nome: str): 7 | super().__init__(id, endereco, telefone, nome) 8 | self.__cnpj = cnpj 9 | 10 | @property 11 | def cnpj(self) -> str: 12 | return self.__cnpj 13 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/entities/veiculo.py: -------------------------------------------------------------------------------- 1 | from src.entities.entity import Entity 2 | 3 | 4 | class Veiculo(Entity): 5 | 6 | def __init__(self, id: str, placa: str, km: float): 7 | super().__init__(id) 8 | self.__placa = placa 9 | self.__km = km 10 | 11 | @property 12 | def placa(self) -> str: 13 | return self.__placa 14 | 15 | @property 16 | def km(self) -> float: 17 | return self.__km 18 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/exceptions/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-06-02-rest-api/api-aluguel-veiculos/src/exceptions/__init__.py -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/exceptions/base_aluguel_error.py: -------------------------------------------------------------------------------- 1 | class BaseAluguelError(Exception): 2 | 3 | def __init__(self, *args: object) -> None: 4 | self.mensagem = args[0] 5 | super().__init__(*args) -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/exceptions/cliente_not_found_error.py: -------------------------------------------------------------------------------- 1 | from src.exceptions.not_found_error import NotFoundError 2 | 3 | 4 | class ClienteNotFoundError(NotFoundError): 5 | 6 | def __init__(self, *args: object) -> None: 7 | super().__init__(*args) -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/src/exceptions/not_found_error.py: -------------------------------------------------------------------------------- 1 | from src.exceptions.base_aluguel_error import BaseAluguelError 2 | 3 | 4 | class NotFoundError(BaseAluguelError): 5 | 6 | def __init__(self, *args: object) -> None: 7 | super().__init__(*args) -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-06-02-rest-api/api-aluguel-veiculos/tests/__init__.py -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/tests/business/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-06-02-rest-api/api-aluguel-veiculos/tests/business/__init__.py -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/tests/business/test_cadastro_cliente_consultar.py: -------------------------------------------------------------------------------- 1 | from unittest import TestCase, result 2 | from src.entities.cliente import Cliente 3 | from src.business.cadastro_cliente import CadastroCliente 4 | from src.exceptions.cliente_not_found_error import ClienteNotFoundError 5 | 6 | 7 | class TestCadastroClienteConsultar(TestCase): 8 | 9 | def test_consulta_cliente_id(self): 10 | # Dado 11 | cliente = Cliente('10', 'Rua teste, 550', '99871-2403', 'Monique') 12 | cadastro = CadastroCliente() 13 | 14 | # Quando 15 | cadastro.inserir(cliente) 16 | resultado = cadastro.consultar(cliente.id) 17 | 18 | # Então 19 | self.assertEqual(resultado.id, '10') 20 | 21 | def test_consulta_cliente_id_especifico(self): 22 | # Dado 23 | cliente_a = Cliente('10', 'Rua teste, 550', '99871-2403', 'Monique') 24 | cliente_b = Cliente('20', 'Rua jose, 50', '99565-2403', 'Matheus') 25 | cadastro = CadastroCliente() 26 | 27 | # Quando 28 | cadastro.inserir(cliente_a) 29 | cadastro.inserir(cliente_b) 30 | resultado = cadastro.consultar('20') 31 | 32 | # Então 33 | self.assertEqual(resultado.id, '20') 34 | 35 | def test_consulta_cliente_erro(self): 36 | # Dado 37 | cliente_a = Cliente('10', 'Rua teste, 550', '99871-2403', 'Monique') 38 | cliente_b = Cliente('20', 'Rua jose, 50', '99565-2403', 'Matheus') 39 | cadastro = CadastroCliente() 40 | 41 | # Quando 42 | cadastro.inserir(cliente_a) 43 | cadastro.inserir(cliente_b) 44 | 45 | # Entao 46 | with self.assertRaises(ClienteNotFoundError): 47 | cadastro.consultar('40') 48 | -------------------------------------------------------------------------------- /2022-06-02-rest-api/api-aluguel-veiculos/tests/business/test_cadastro_cliente_inserir.py: -------------------------------------------------------------------------------- 1 | from unittest import TestCase 2 | from src.entities.cliente import Cliente 3 | from src.business.cadastro_cliente import CadastroCliente 4 | 5 | 6 | class TestCadastroClienteInserir(TestCase): 7 | 8 | def __init__(self, methodName: str = ...) -> None: 9 | super().__init__(methodName) 10 | self.cliente = None 11 | self.cadastro = None 12 | 13 | def setUp(self): 14 | self.cadastro = CadastroCliente() 15 | 16 | def test_inserir_cliente(self): 17 | # dado 18 | cliente = Cliente('1', 'rua 1', '9988-4433', 'Maicon') 19 | 20 | # quanto 21 | self.cadastro.inserir(cliente) 22 | resultado = self.cadastro.listar_todos() 23 | 24 | # entao 25 | self.assertTrue(resultado[-1].nome == 'Maicon') 26 | 27 | def test_retorno_inserir_cliente(self): 28 | # dado 29 | cliente = Cliente('1', 'rua 1', '9988-4433', 'Aluno') 30 | 31 | # quanto 32 | resultado = self.cadastro.inserir(cliente) 33 | 34 | # entao 35 | self.assertTrue(resultado == None) 36 | 37 | def test_inserir_quantidade(self): 38 | # dado 39 | cliente = Cliente('1', 'rua 1', '9988-4433', 'Maicon') 40 | 41 | # quanto 42 | self.cadastro.inserir(cliente) 43 | resultado = self.cadastro.listar_todos() 44 | 45 | # entao 46 | self.assertTrue(len(resultado) == 1) -------------------------------------------------------------------------------- /2022-06-02-rest-api/client-http/client_http.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import json 3 | 4 | url = "http://127.0.0.1:5000/cliente" 5 | 6 | payload = json.dumps({ 7 | "id": "123332434", 8 | "endereco": "Rua das flores", 9 | "telefone": "41 9999-4561", 10 | "cpf": "350.356.356-45", 11 | "nome": "Maicon" 12 | }) 13 | 14 | headers = { 15 | 'Content-Type': 'application/json' 16 | } 17 | 18 | response = requests.request("POST", url, headers=headers, data=payload) 19 | # response = requests.request("GET", url, headers=headers) 20 | 21 | print(response.text) 22 | -------------------------------------------------------------------------------- /2022-06-14-database-mysql/main.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | import mysql.connector 3 | 4 | cnx = mysql.connector.connect( 5 | user='maicon', 6 | password='123456', 7 | host='127.0.0.1', 8 | database='employees') 9 | 10 | query = ("SELECT first_name, last_name, hire_date FROM employees " 11 | "WHERE hire_date BETWEEN %s AND %s") 12 | 13 | cursor = cnx.cursor() 14 | 15 | hire_start = datetime.date(1999, 1, 1) 16 | hire_end = datetime.date(1999, 12, 31) 17 | 18 | cursor.execute(query, (hire_start, hire_end)) 19 | 20 | for (first_name, last_name, hire_date) in cursor: 21 | print("{}, {} was hired on {:%d %b %Y}".format( 22 | last_name, first_name, hire_date)) 23 | 24 | cursor.close() 25 | cnx.close() 26 | -------------------------------------------------------------------------------- /2022-06-14-database-mysql/requirements.txt: -------------------------------------------------------------------------------- 1 | autopep8==1.6.0 2 | mysql-connector-python==8.0.29 3 | protobuf==4.21.1 4 | pycodestyle==2.8.0 5 | toml==0.10.2 6 | -------------------------------------------------------------------------------- /2022-06-28-django/MER.mwb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-06-28-django/MER.mwb -------------------------------------------------------------------------------- /2022-06-28-django/MER.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-06-28-django/MER.png -------------------------------------------------------------------------------- /2022-06-28-django/README.md: -------------------------------------------------------------------------------- 1 | # Django 2 | 3 | ## Projeto 4 | 5 | Ambiente virtual do python 6 | ``` 7 | python3 -m venv .venv 8 | ``` 9 | 10 | Ativação ambiente virtual Linux 11 | ``` 12 | source .venv/bin/activate 13 | ``` 14 | 15 | Ativação ambiente virtual Windows 16 | ``` 17 | .venv\Scripts\activate.bat 18 | ``` 19 | 20 | instalação django 21 | ``` 22 | pip install django 23 | ``` 24 | 25 | criação projeto 26 | ``` 27 | django-admin startproject configuracoes . 28 | ``` 29 | 30 | configurações de idioma. 31 | no arquivo ***configuracoes/settings.py*** altere as constantes 32 | 33 | LANGUAGE_CODE = 'pt-br' 34 | TIME_ZONE = 'America/Sao_Paulo' 35 | 36 | criar um novo app 37 | ``` 38 | python manage.py startapp projeto 39 | ``` 40 | 41 | ``` 42 | sudo apt-get install python3-dev default-libmysqlclient-dev build-essential 43 | 44 | pip install mysqlclient 45 | ``` 46 | 47 | https://docs.djangoproject.com/pt-br/4.0/ref/databases/#mysql-notes 48 | 49 | https://docs.djangoproject.com/en/4.0/intro/tutorial02/ 50 | 51 | https://docs.djangoproject.com/pt-br/4.0/ref/contrib/admin/ -------------------------------------------------------------------------------- /2022-06-30-django/.gitignore: -------------------------------------------------------------------------------- 1 | .venv 2 | .vscode 3 | .env 4 | *.sqlite3 5 | __pycache__ -------------------------------------------------------------------------------- /2022-06-30-django/README.md: -------------------------------------------------------------------------------- 1 | # Django 2 | 3 | ## Projeto aluguel de veículos 4 | 5 | Ambiente virtual do python 6 | ``` 7 | python3 -m venv .venv 8 | ``` 9 | 10 | Ativação ambiente virtual Linux 11 | ``` 12 | source .venv/bin/activate 13 | ``` 14 | 15 | Ativação ambiente virtual Windows 16 | ``` 17 | .venv\Scripts\activate.bat 18 | ``` 19 | 20 | instalação django 21 | ``` 22 | pip install django 23 | ``` 24 | 25 | criação projeto 26 | ``` 27 | django-admin startproject configuracoes . 28 | ``` 29 | 30 | configurações de idioma. 31 | no arquivo ***configuracoes/settings.py*** altere as constantes 32 | 33 | LANGUAGE_CODE = 'pt-br' 34 | TIME_ZONE = 'America/Sao_Paulo' 35 | 36 | criar um novo app 37 | ``` 38 | python manage.py startapp aluguel_veiculos 39 | ``` 40 | 41 | ``` 42 | sudo apt-get install python3-dev default-libmysqlclient-dev build-essential 43 | 44 | pip install mysqlclient 45 | ``` 46 | 47 | https://docs.djangoproject.com/pt-br/4.0/ref/databases/#mysql-notes 48 | 49 | https://docs.djangoproject.com/en/4.0/intro/tutorial02/ 50 | 51 | https://docs.djangoproject.com/pt-br/4.0/ref/contrib/admin/ -------------------------------------------------------------------------------- /2022-06-30-django/aluguel_veiculos/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-06-30-django/aluguel_veiculos/__init__.py -------------------------------------------------------------------------------- /2022-06-30-django/aluguel_veiculos/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from aluguel_veiculos.models import Aluguel, Cliente, Veiculo 3 | 4 | 5 | class ClienteAdmin(admin.ModelAdmin): 6 | fields = ('nome', 'endereco', 'telefone', 'tipo') 7 | list_display = ('tipo', 'nome') 8 | 9 | 10 | class AluguelAdmin(admin.ModelAdmin): 11 | pass 12 | 13 | 14 | class VeiculoAdmin(admin.ModelAdmin): 15 | list_display = ('placa',) 16 | 17 | 18 | admin.site.register(Cliente, ClienteAdmin) 19 | admin.site.register(Veiculo, VeiculoAdmin) 20 | admin.site.register(Aluguel, AluguelAdmin) 21 | -------------------------------------------------------------------------------- /2022-06-30-django/aluguel_veiculos/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class AluguelVeiculosConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'aluguel_veiculos' 7 | -------------------------------------------------------------------------------- /2022-06-30-django/aluguel_veiculos/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.5 on 2022-06-30 23:13 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | initial = True 10 | 11 | dependencies = [ 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='Cliente', 17 | fields=[ 18 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('nome', models.CharField(max_length=100)), 20 | ('endereco', models.CharField(max_length=100)), 21 | ('telefone', models.CharField(max_length=14)), 22 | ('cpf', models.CharField(max_length=11, null=True)), 23 | ('cnpj', models.CharField(max_length=14, null=True)), 24 | ('tipo', models.CharField(choices=[('PF', 'Fisica'), ('PJ', 'Juridica')], default='PF', max_length=2)), 25 | ], 26 | ), 27 | migrations.CreateModel( 28 | name='Veiculo', 29 | fields=[ 30 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 31 | ('placa', models.CharField(max_length=7)), 32 | ('km', models.FloatField()), 33 | ('carga', models.FloatField()), 34 | ('bagageiro', models.IntegerField()), 35 | ('portas', models.IntegerField()), 36 | ('tipo', models.CharField(choices=[('VL', 'Automovel'), ('VP', 'Caminhao')], default='VL', max_length=2)), 37 | ], 38 | ), 39 | migrations.CreateModel( 40 | name='Aluguel', 41 | fields=[ 42 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 43 | ('data_retirada', models.DateField()), 44 | ('data_devolucao', models.DateField()), 45 | ('km_rodado', models.FloatField()), 46 | ('cliente', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='aluguel_veiculos.cliente')), 47 | ('veiculo', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='aluguel_veiculos.veiculo')), 48 | ], 49 | ), 50 | ] 51 | -------------------------------------------------------------------------------- /2022-06-30-django/aluguel_veiculos/migrations/0002_alter_aluguel_options.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.5 on 2022-07-01 00:12 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('aluguel_veiculos', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='aluguel', 15 | options={'verbose_name_plural': 'Alugueis'}, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /2022-06-30-django/aluguel_veiculos/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-06-30-django/aluguel_veiculos/migrations/__init__.py -------------------------------------------------------------------------------- /2022-06-30-django/aluguel_veiculos/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class Cliente(models.Model): 5 | PESSOA_FISICA = 'PF' 6 | PESSOA_JURIDICA = 'PJ' 7 | 8 | CLIENTE_CHOICES = [ 9 | (PESSOA_FISICA, 'Fisica'), 10 | (PESSOA_JURIDICA, 'Juridica'), 11 | ] 12 | nome = models.CharField(max_length=100) 13 | endereco = models.CharField(max_length=100) 14 | telefone = models.CharField(max_length=14) 15 | cpf = models.CharField(max_length=11, null=True) 16 | cnpj = models.CharField(max_length=14, null=True) 17 | tipo = models.CharField(max_length=2, choices=CLIENTE_CHOICES, default=PESSOA_FISICA) 18 | 19 | def __str__(self) -> str: 20 | return self.nome 21 | 22 | 23 | class Veiculo(models.Model): 24 | TIPO_AUTOMOVEL = "VL" 25 | TIPO_CAMINHAO = "VP" 26 | 27 | VEICULO_CHOICES = [ 28 | (TIPO_AUTOMOVEL, "Automovel"), 29 | (TIPO_CAMINHAO,"Caminhao") 30 | ] 31 | 32 | placa = models.CharField(max_length=7) 33 | km = models.FloatField() 34 | carga = models.FloatField() 35 | bagageiro = models.IntegerField() 36 | portas = models.IntegerField() 37 | tipo = models.CharField(max_length=2, choices=VEICULO_CHOICES, default=TIPO_AUTOMOVEL) 38 | 39 | 40 | class Aluguel(models.Model): 41 | veiculo = models.ForeignKey(Veiculo, on_delete=models.CASCADE) 42 | cliente = models.ForeignKey(Cliente, on_delete=models.CASCADE) 43 | data_retirada = models.DateField() 44 | data_devolucao = models.DateField() 45 | km_rodado = models.FloatField() 46 | 47 | class Meta(): 48 | verbose_name_plural = 'Alugueis' 49 | -------------------------------------------------------------------------------- /2022-06-30-django/aluguel_veiculos/serializer.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from aluguel_veiculos.models import Cliente, Veiculo 3 | 4 | 5 | # Serializers define the API representation. 6 | class ClienteSerializer(serializers.HyperlinkedModelSerializer): 7 | 8 | class Meta(): 9 | model = Cliente 10 | fields = ['url', 'nome', 'endereco', 'telefone', 'cpf', 'cnpj', 'tipo'] 11 | 12 | 13 | # Serializers define the API representation. 14 | class VeiculoSerializer(serializers.HyperlinkedModelSerializer): 15 | 16 | class Meta(): 17 | model = Veiculo 18 | fields = ['url', 'placa', 'km', 'carga', 'bagageiro', 'portas', 'tipo'] 19 | -------------------------------------------------------------------------------- /2022-06-30-django/aluguel_veiculos/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /2022-06-30-django/aluguel_veiculos/urls.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-06-30-django/aluguel_veiculos/urls.py -------------------------------------------------------------------------------- /2022-06-30-django/aluguel_veiculos/views.py: -------------------------------------------------------------------------------- 1 | from rest_framework import viewsets 2 | 3 | from aluguel_veiculos.models import Cliente, Veiculo 4 | from aluguel_veiculos.serializer import ClienteSerializer, VeiculoSerializer 5 | 6 | 7 | class ClienteViewSet(viewsets.ModelViewSet): 8 | queryset = Cliente.objects.all() 9 | serializer_class = ClienteSerializer 10 | 11 | 12 | class VeiculoViewSet(viewsets.ModelViewSet): 13 | queryset = Veiculo.objects.all() 14 | serializer_class = VeiculoSerializer -------------------------------------------------------------------------------- /2022-06-30-django/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'setup.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /2022-06-30-django/requirements.txt: -------------------------------------------------------------------------------- 1 | asgiref==3.5.2 2 | backports.zoneinfo==0.2.1 3 | Django==4.0.5 4 | mysqlclient==2.1.1 5 | python-dotenv==0.20.0 6 | sqlparse==0.4.2 7 | -------------------------------------------------------------------------------- /2022-06-30-django/setup/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-06-30-django/setup/__init__.py -------------------------------------------------------------------------------- /2022-06-30-django/setup/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for setup project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'setup.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /2022-06-30-django/setup/urls.py: -------------------------------------------------------------------------------- 1 | """setup URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/4.0/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import include, path 18 | from rest_framework import routers 19 | 20 | from aluguel_veiculos.views import ClienteViewSet, VeiculoViewSet 21 | 22 | 23 | router = routers.DefaultRouter() 24 | router.register(r'cliente', ClienteViewSet) 25 | router.register(r'veiculo', VeiculoViewSet) 26 | 27 | urlpatterns = [ 28 | path('', include(router.urls)), 29 | path('admin/', admin.site.urls), 30 | path('api-auth/', include('rest_framework.urls')) 31 | ] 32 | -------------------------------------------------------------------------------- /2022-06-30-django/setup/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for setup project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'setup.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/README.md: -------------------------------------------------------------------------------- 1 | # Django 2 | 3 | ## Passo a passo 4 | 5 | ## [Instalação Django](docs/inst_django.md#sub-section) 6 | 7 | ## [Instalação Django Rest Framework](docs/inst_django_rest_framework.md#sub-section) 8 | 9 | ## Documentação: 10 | 11 | ### [django mysql](https://docs.djangoproject.com/pt-br/4.0/ref/databases/#mysql-notes) 12 | 13 | ### [django Admin](https://docs.djangoproject.com/pt-br/4.0/ref/contrib/admin/) 14 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/__init__.py -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class AluguelVeiculosConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'aluguel_veiculos' 7 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.6 on 2022-07-05 23:01 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | initial = True 10 | 11 | dependencies = [ 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='Cliente', 17 | fields=[ 18 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('nome', models.CharField(max_length=100)), 20 | ('endereco', models.CharField(max_length=100)), 21 | ('telefone', models.CharField(max_length=14)), 22 | ('cpf', models.CharField(max_length=11, null=True)), 23 | ('cnpj', models.CharField(max_length=14, null=True)), 24 | ('tipo', models.CharField(choices=[('PF', 'Fisica'), ('PJ', 'Juridica')], default='PF', max_length=2)), 25 | ], 26 | ), 27 | migrations.CreateModel( 28 | name='Veiculo', 29 | fields=[ 30 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 31 | ('placa', models.CharField(max_length=7)), 32 | ('km', models.FloatField()), 33 | ('carga', models.FloatField()), 34 | ('bagageiro', models.IntegerField()), 35 | ('portas', models.IntegerField()), 36 | ('tipo', models.CharField(choices=[('VL', 'Automovel'), ('VP', 'Caminhao')], default='VL', max_length=2)), 37 | ], 38 | ), 39 | migrations.CreateModel( 40 | name='Aluguel', 41 | fields=[ 42 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 43 | ('data_retirada', models.DateField()), 44 | ('data_devolucao', models.DateField()), 45 | ('km_rodado', models.FloatField()), 46 | ('cliente', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='aluguel_veiculos.cliente')), 47 | ('veiculo', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='aluguel_veiculos.veiculo')), 48 | ], 49 | options={ 50 | 'verbose_name_plural': 'Alugueis', 51 | }, 52 | ), 53 | ] 54 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/migrations/__init__.py -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/models/__init__.py: -------------------------------------------------------------------------------- 1 | from .aluguel import Aluguel 2 | from .cliente import Cliente 3 | from .veiculo import Veiculo -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/models/aluguel.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from aluguel_veiculos.models.cliente import Cliente 3 | from aluguel_veiculos.models.veiculo import Veiculo 4 | 5 | 6 | class Aluguel(models.Model): 7 | veiculo = models.ForeignKey(Veiculo, on_delete=models.CASCADE) 8 | cliente = models.ForeignKey(Cliente, on_delete=models.CASCADE) 9 | data_retirada = models.DateField() 10 | data_devolucao = models.DateField() 11 | km_rodado = models.FloatField() 12 | 13 | class Meta(): 14 | verbose_name_plural = 'Alugueis' 15 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/models/cliente.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class Cliente(models.Model): 5 | PESSOA_FISICA = 'PF' 6 | PESSOA_JURIDICA = 'PJ' 7 | 8 | CLIENTE_CHOICES = [ 9 | (PESSOA_FISICA, 'Fisica'), 10 | (PESSOA_JURIDICA, 'Juridica'), 11 | ] 12 | nome = models.CharField(max_length=100) 13 | endereco = models.CharField(max_length=100) 14 | telefone = models.CharField(max_length=14) 15 | cpf = models.CharField(max_length=11, null=True) 16 | cnpj = models.CharField(max_length=14, null=True) 17 | tipo = models.CharField( 18 | max_length=2, choices=CLIENTE_CHOICES, default=PESSOA_FISICA) 19 | 20 | def __str__(self) -> str: 21 | return self.nome 22 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/models/veiculo.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class Veiculo(models.Model): 5 | TIPO_AUTOMOVEL = "VL" 6 | TIPO_CAMINHAO = "VP" 7 | 8 | VEICULO_CHOICES = [ 9 | (TIPO_AUTOMOVEL, "Automovel"), 10 | (TIPO_CAMINHAO, "Caminhao") 11 | ] 12 | 13 | placa = models.CharField(max_length=7) 14 | km = models.FloatField() 15 | carga = models.FloatField() 16 | bagageiro = models.IntegerField() 17 | portas = models.IntegerField() 18 | tipo = models.CharField( 19 | max_length=2, choices=VEICULO_CHOICES, default=TIPO_AUTOMOVEL) 20 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/serializers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/serializers/__init__.py -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/serializers/cliente_serializer.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from aluguel_veiculos.models.cliente import Cliente 3 | import re 4 | 5 | from aluguel_veiculos.validator.cpf_validator import valida_cpf 6 | 7 | 8 | class ClienteSerializer(serializers.HyperlinkedModelSerializer): 9 | telefone = serializers.CharField(min_length=9) 10 | cnpj = serializers.CharField(required=False) 11 | cpf = serializers.CharField(required=False) 12 | 13 | class Meta(): 14 | model = Cliente 15 | fields = "__all__" 16 | 17 | def validate(self, data): 18 | if (data.get("tipo") == 'PJ') and (data.get("cnpj") == None): 19 | raise serializers.ValidationError( 20 | {'Tipo': 'Se tipo igual a PJ o cnpj é obrigatorio'}) 21 | elif (data.get("tipo") == 'PF') and (data.get("cpf") == None): 22 | raise serializers.ValidationError( 23 | 'Se tipo igual a PF o cpf é obrigatorio') 24 | 25 | return data 26 | 27 | def validate_tipo(self, tipo): 28 | return tipo 29 | 30 | def validate_nome(self, nome): 31 | return nome 32 | 33 | def validate_cpf(self, cpf): 34 | if valida_cpf(cpf): 35 | raise serializers.ValidationError( 36 | {'CPF': 'CPF deve ser numerico'}) 37 | 38 | return cpf 39 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/serializers/veiculo_serializer.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from aluguel_veiculos.models.veiculo import Veiculo 3 | 4 | 5 | class VeiculoSerializer(serializers.HyperlinkedModelSerializer): 6 | 7 | class Meta(): 8 | model = Veiculo 9 | fields = "__all__" 10 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/validator/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/validator/__init__.py -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/validator/cpf_validator.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | 4 | def valida_cpf(cpf): 5 | return not re.match(r'^([\s\d]+)$', cpf) 6 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/views/__init__.py -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/views/cliente_viewset.py: -------------------------------------------------------------------------------- 1 | from rest_framework import viewsets 2 | from rest_framework import permissions 3 | from aluguel_veiculos.models.cliente import Cliente 4 | from aluguel_veiculos.serializers.cliente_serializer import ClienteSerializer 5 | 6 | 7 | class ClienteViewset(viewsets.ModelViewSet): 8 | 9 | serializer_class = ClienteSerializer 10 | queryset = Cliente.objects.all() 11 | permission_classes = [permissions.IsAuthenticated] 12 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/aluguel_veiculos/views/veiculo_viewset.py: -------------------------------------------------------------------------------- 1 | from rest_framework import viewsets 2 | from rest_framework import permissions 3 | from aluguel_veiculos.models.veiculo import Veiculo 4 | from aluguel_veiculos.serializers.veiculo_serializer import VeiculoSerializer 5 | 6 | 7 | class VeiculoViewset(viewsets.ModelViewSet): 8 | serializer_class = VeiculoSerializer 9 | queryset = Veiculo.objects.all() 10 | permission_classes = [permissions.IsAuthenticated] 11 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/configuracoes/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-05-drf/aluguel_veiculos/configuracoes/__init__.py -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/configuracoes/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for configuracoes project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configuracoes.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/configuracoes/urls.py: -------------------------------------------------------------------------------- 1 | """configuracoes URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/4.0/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import include, path 18 | from rest_framework import routers 19 | from aluguel_veiculos.views.cliente_viewset import ClienteViewset 20 | from aluguel_veiculos.views.veiculo_viewset import VeiculoViewset 21 | 22 | router = routers.DefaultRouter() 23 | router.register(r'cliente', ClienteViewset) 24 | router.register(r'veiculo', VeiculoViewset) 25 | 26 | 27 | urlpatterns = [ 28 | path('admin/', admin.site.urls), 29 | path('', include(router.urls)), 30 | path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) 31 | ] 32 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/configuracoes/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for configuracoes project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configuracoes.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/docs/inst_django.md: -------------------------------------------------------------------------------- 1 | # Instalação Django 2 | 3 | ## [Menu principal](./../README.md) 4 | 5 | ## Projeto 6 | 7 | Ambiente virtual do python 8 | ``` 9 | python3 -m venv .venv 10 | ``` 11 | 12 | Ativação ambiente virtual Linux 13 | ``` 14 | source .venv/bin/activate 15 | ``` 16 | 17 | Ativação ambiente virtual Windows 18 | ``` 19 | .venv\Scripts\activate.bat 20 | ``` 21 | 22 | instalação django 23 | ``` 24 | pip install django 25 | ``` 26 | 27 | criação projeto 28 | ``` 29 | django-admin startproject configuracoes . 30 | ``` 31 | 32 | configurações de idioma. 33 | no arquivo ***configuracoes/settings.py*** altere as constantes 34 | 35 | LANGUAGE_CODE = 'pt-br' 36 | TIME_ZONE = 'America/Sao_Paulo' 37 | 38 | criar um novo app 39 | ``` 40 | python manage.py startapp projeto 41 | ``` 42 | 43 | ``` 44 | sudo apt-get install python3-dev default-libmysqlclient-dev build-essential 45 | 46 | pip install mysqlclient 47 | ``` 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/docs/inst_django_rest_framework.md: -------------------------------------------------------------------------------- 1 | # django rest framework 2 | 3 | ## [Menu principal](./../README.md#main-section) 4 | 5 | ## Instalação 6 | 7 | pip install djangorestframework 8 | pip install markdown 9 | pip install django-filter 10 | 11 | 12 | ## Configuração 13 | 14 | No arquivo ***configuracoes/settings.py*** adicionar o 'rest_framework' aos APPS 15 | 16 | INSTALLED_APPS = [ 17 | ... 18 | 'rest_framework', 19 | ] 20 | 21 | 22 | no arquivo ***configuracoes/urls.py*** 23 | 24 | ... 25 | from rest_framework import routers 26 | 27 | router = routers.DefaultRouter() 28 | 29 | urlpatterns = [ 30 | ... 31 | path('', include(router.urls)), 32 | path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) 33 | ] 34 | 35 | ## Paginação 36 | A paginação permite controlar quantos objetos por página são retornados. Para habilitá-lo, adicione as seguintes linhas ***configuracoes/settings.py*** 37 | 38 | REST_FRAMEWORK = { 39 | 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 40 | 'PAGE_SIZE': 10 41 | } -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configuracoes.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /2022-07-05-drf/aluguel_veiculos/requirements.txt: -------------------------------------------------------------------------------- 1 | asgiref==3.5.2 2 | autopep8==1.6.0 3 | backports.zoneinfo==0.2.1 4 | Django==4.0.6 5 | django-filter==22.1 6 | djangorestframework==3.13.1 7 | importlib-metadata==4.12.0 8 | Markdown==3.3.7 9 | mysqlclient==2.1.1 10 | pycodestyle==2.8.0 11 | python-dotenv==0.20.0 12 | pytz==2022.1 13 | sqlparse==0.4.2 14 | toml==0.10.2 15 | zipp==3.8.0 16 | -------------------------------------------------------------------------------- /2022-07-07-drf-tests/README.md: -------------------------------------------------------------------------------- 1 | # Django 2 | 3 | ## Passo a passo 4 | 5 | ## [Instalação Django](docs/inst_django.md#sub-section) 6 | 7 | ## [Instalação Django Rest Framework](docs/inst_django_rest_framework.md#sub-section) 8 | 9 | ## Documentação: 10 | 11 | ### [django mysql](https://docs.djangoproject.com/pt-br/4.0/ref/databases/#mysql-notes) 12 | 13 | ### [django Admin](https://docs.djangoproject.com/pt-br/4.0/ref/contrib/admin/) 14 | -------------------------------------------------------------------------------- /2022-07-07-drf-tests/docs/inst_django.md: -------------------------------------------------------------------------------- 1 | # Instalação Django 2 | 3 | ## [Menu principal](./../README.md) 4 | 5 | ## Projeto 6 | 7 | Ambiente virtual do python 8 | ``` 9 | python3 -m venv .venv 10 | ``` 11 | 12 | Ativação ambiente virtual Linux 13 | ``` 14 | source .venv/bin/activate 15 | ``` 16 | 17 | Ativação ambiente virtual Windows 18 | ``` 19 | .venv\Scripts\activate.bat 20 | ``` 21 | 22 | instalação django 23 | ``` 24 | pip install django 25 | ``` 26 | 27 | criação projeto 28 | ``` 29 | django-admin startproject configuracoes . 30 | ``` 31 | 32 | configurações de idioma. 33 | no arquivo ***configuracoes/settings.py*** altere as constantes 34 | 35 | LANGUAGE_CODE = 'pt-br' 36 | TIME_ZONE = 'America/Sao_Paulo' 37 | 38 | criar um novo app 39 | ``` 40 | python manage.py startapp projeto 41 | ``` 42 | 43 | ``` 44 | sudo apt-get install python3-dev default-libmysqlclient-dev build-essential 45 | 46 | pip install mysqlclient 47 | ``` 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /2022-07-07-drf-tests/docs/inst_django_rest_framework.md: -------------------------------------------------------------------------------- 1 | # django rest framework 2 | 3 | ## [Menu principal](./../README.md#main-section) 4 | 5 | ## Instalação 6 | 7 | pip install djangorestframework 8 | pip install markdown 9 | pip install django-filter 10 | 11 | 12 | ## Configuração 13 | 14 | No arquivo ***configuracoes/settings.py*** adicionar o 'rest_framework' aos APPS 15 | 16 | INSTALLED_APPS = [ 17 | ... 18 | 'rest_framework', 19 | ] 20 | 21 | 22 | no arquivo ***configuracoes/urls.py*** 23 | 24 | ... 25 | from rest_framework import routers 26 | 27 | router = routers.DefaultRouter() 28 | 29 | urlpatterns = [ 30 | ... 31 | path('', include(router.urls)), 32 | path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) 33 | ] 34 | 35 | ## Paginação 36 | A paginação permite controlar quantos objetos por página são retornados. Para habilitá-lo, adicione as seguintes linhas ***configuracoes/settings.py*** 37 | 38 | REST_FRAMEWORK = { 39 | 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 40 | 'PAGE_SIZE': 10 41 | } -------------------------------------------------------------------------------- /2022-07-07-drf-tests/locadora/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-07-drf-tests/locadora/__init__.py -------------------------------------------------------------------------------- /2022-07-07-drf-tests/locadora/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class LocadoraConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'locadora' 7 | -------------------------------------------------------------------------------- /2022-07-07-drf-tests/locadora/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.6 on 2022-07-08 00:02 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Cliente', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('nome', models.CharField(max_length=120)), 19 | ], 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /2022-07-07-drf-tests/locadora/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-07-drf-tests/locadora/migrations/__init__.py -------------------------------------------------------------------------------- /2022-07-07-drf-tests/locadora/models/__init__.py: -------------------------------------------------------------------------------- 1 | from .cliente import Cliente -------------------------------------------------------------------------------- /2022-07-07-drf-tests/locadora/models/cliente.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class Cliente(models.Model): 5 | nome = models.CharField(max_length=120) -------------------------------------------------------------------------------- /2022-07-07-drf-tests/locadora/serializers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-07-drf-tests/locadora/serializers/__init__.py -------------------------------------------------------------------------------- /2022-07-07-drf-tests/locadora/serializers/cliente_serializer.py: -------------------------------------------------------------------------------- 1 | from dataclasses import fields 2 | from pyexpat import model 3 | from rest_framework import serializers 4 | from locadora.models.cliente import Cliente 5 | 6 | 7 | class ClienteSerializer(serializers.ModelSerializer): 8 | nome = serializers.CharField(min_length=10, max_length=120) 9 | 10 | class Meta: 11 | model = Cliente 12 | fields = "__all__" 13 | -------------------------------------------------------------------------------- /2022-07-07-drf-tests/locadora/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-07-drf-tests/locadora/tests/__init__.py -------------------------------------------------------------------------------- /2022-07-07-drf-tests/locadora/tests/test_cliente.py: -------------------------------------------------------------------------------- 1 | import json 2 | from django.test import TestCase 3 | from rest_framework.test import APIClient 4 | from locadora.models.cliente import Cliente 5 | from rest_framework import status 6 | 7 | 8 | class ClienteTestCase(TestCase): 9 | 10 | def setUp(self) -> None: 11 | self.client = APIClient() 12 | 13 | def test_cliente_nome_error(self): 14 | # dado 15 | cliente = {"nome": "maicon"} 16 | 17 | # quando 18 | response = self.client.post('/cliente/', cliente, format='json') 19 | 20 | # entao 21 | self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) 22 | 23 | def test_cliente_nome_error_message(self): 24 | # dado 25 | cliente = {"nome": "maicon"} 26 | 27 | # quando 28 | response = self.client.post('/cliente/', cliente, format='json') 29 | 30 | # entao 31 | self.assertEqual( 32 | json.loads(response.content), { 33 | "nome": ["Certifique-se de que este campo tenha mais de 10 caracteres."]} 34 | ) 35 | 36 | def test_cliente_post_sucesso(self): 37 | # dado 38 | cliente = {"nome": "maicon francisco"} 39 | 40 | # quando 41 | response = self.client.post('/cliente/', cliente, format='json') 42 | 43 | # entao 44 | self.assertEqual(response.status_code, status.HTTP_201_CREATED) 45 | 46 | def test_cliente_create(self): 47 | # dado 48 | Cliente.objects.create(nome="Maicon") 49 | 50 | # quando 51 | cliente = Cliente.objects.get(nome="Maicon") 52 | 53 | # entao 54 | self.assertEqual(cliente.nome, 'Maicon') 55 | -------------------------------------------------------------------------------- /2022-07-07-drf-tests/locadora/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-07-drf-tests/locadora/views/__init__.py -------------------------------------------------------------------------------- /2022-07-07-drf-tests/locadora/views/cliente_viewset.py: -------------------------------------------------------------------------------- 1 | from rest_framework.response import Response 2 | from rest_framework import viewsets 3 | from locadora.models.cliente import Cliente 4 | from locadora.serializers.cliente_serializer import ClienteSerializer 5 | 6 | 7 | class ClienteViewset(viewsets.ModelViewSet): 8 | 9 | queryset = Cliente.objects.all() 10 | serializer_class = ClienteSerializer 11 | -------------------------------------------------------------------------------- /2022-07-07-drf-tests/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /2022-07-07-drf-tests/settings/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-07-drf-tests/settings/__init__.py -------------------------------------------------------------------------------- /2022-07-07-drf-tests/settings/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for settings project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /2022-07-07-drf-tests/settings/urls.py: -------------------------------------------------------------------------------- 1 | """settings URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/4.0/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import include, path 18 | from rest_framework import routers 19 | from locadora.views.cliente_viewset import ClienteViewset 20 | 21 | router = routers.DefaultRouter() 22 | router.register(r'cliente', ClienteViewset) 23 | 24 | urlpatterns = [ 25 | path('admin/', admin.site.urls), 26 | path('', include(router.urls)), 27 | path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) 28 | ] 29 | -------------------------------------------------------------------------------- /2022-07-07-drf-tests/settings/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for settings project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /2022-07-16/README.md: -------------------------------------------------------------------------------- 1 | # Django 2 | 3 | ## Passo a passo 4 | 5 | ## [Instalação Django](docs/inst_django.md#sub-section) 6 | 7 | ## [Instalação Django Rest Framework](docs/inst_django_rest_framework.md#sub-section) 8 | 9 | ## Documentação: 10 | 11 | ### [django mysql](https://docs.djangoproject.com/pt-br/4.0/ref/databases/#mysql-notes) 12 | 13 | ### [django Admin](https://docs.djangoproject.com/pt-br/4.0/ref/contrib/admin/) 14 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-16/aluguel_veiculos/__init__.py -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class AluguelVeiculosConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'aluguel_veiculos' 7 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.6 on 2022-07-05 23:01 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | initial = True 10 | 11 | dependencies = [ 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='Cliente', 17 | fields=[ 18 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('nome', models.CharField(max_length=100)), 20 | ('endereco', models.CharField(max_length=100)), 21 | ('telefone', models.CharField(max_length=14)), 22 | ('cpf', models.CharField(max_length=11, null=True)), 23 | ('cnpj', models.CharField(max_length=14, null=True)), 24 | ('tipo', models.CharField(choices=[('PF', 'Fisica'), ('PJ', 'Juridica')], default='PF', max_length=2)), 25 | ], 26 | ), 27 | migrations.CreateModel( 28 | name='Veiculo', 29 | fields=[ 30 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 31 | ('placa', models.CharField(max_length=7)), 32 | ('km', models.FloatField()), 33 | ('carga', models.FloatField()), 34 | ('bagageiro', models.IntegerField()), 35 | ('portas', models.IntegerField()), 36 | ('tipo', models.CharField(choices=[('VL', 'Automovel'), ('VP', 'Caminhao')], default='VL', max_length=2)), 37 | ], 38 | ), 39 | migrations.CreateModel( 40 | name='Aluguel', 41 | fields=[ 42 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 43 | ('data_retirada', models.DateField()), 44 | ('data_devolucao', models.DateField()), 45 | ('km_rodado', models.FloatField()), 46 | ('cliente', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='aluguel_veiculos.cliente')), 47 | ('veiculo', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='aluguel_veiculos.veiculo')), 48 | ], 49 | options={ 50 | 'verbose_name_plural': 'Alugueis', 51 | }, 52 | ), 53 | ] 54 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/migrations/0002_aluguel_valor_alter_aluguel_data_devolucao_and_more.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.6 on 2022-07-12 00:40 2 | 3 | import datetime 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('aluguel_veiculos', '0001_initial'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='aluguel', 16 | name='valor', 17 | field=models.FloatField(default=0), 18 | preserve_default=False, 19 | ), 20 | migrations.AlterField( 21 | model_name='aluguel', 22 | name='data_devolucao', 23 | field=models.DateField(default=datetime.date.today), 24 | ), 25 | migrations.AlterField( 26 | model_name='aluguel', 27 | name='data_retirada', 28 | field=models.DateField(default=datetime.date.today), 29 | ), 30 | ] 31 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/migrations/0003_alter_aluguel_valor.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.6 on 2022-07-12 00:59 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('aluguel_veiculos', '0002_aluguel_valor_alter_aluguel_data_devolucao_and_more'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='aluguel', 15 | name='valor', 16 | field=models.FloatField(null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/migrations/0004_alter_aluguel_valor.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.6 on 2022-07-12 01:00 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('aluguel_veiculos', '0003_alter_aluguel_valor'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='aluguel', 15 | name='valor', 16 | field=models.FloatField(default=0, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-16/aluguel_veiculos/migrations/__init__.py -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/models/__init__.py: -------------------------------------------------------------------------------- 1 | from .aluguel import Aluguel 2 | from .cliente import Cliente 3 | from .veiculo import Veiculo -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/models/aluguel.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | from django.db import models 3 | from aluguel_veiculos.models.cliente import Cliente 4 | from aluguel_veiculos.models.veiculo import Veiculo 5 | 6 | 7 | class Aluguel(models.Model): 8 | veiculo = models.ForeignKey(Veiculo, on_delete=models.CASCADE) 9 | cliente = models.ForeignKey(Cliente, on_delete=models.CASCADE) 10 | data_retirada = models.DateField(default=datetime.date.today) 11 | data_devolucao = models.DateField(default=datetime.date.today) 12 | km_rodado = models.FloatField() 13 | valor = models.FloatField(null=True, default=0) 14 | 15 | class Meta(): 16 | verbose_name_plural = 'Alugueis' 17 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/models/cliente.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class Cliente(models.Model): 5 | PESSOA_FISICA = 'PF' 6 | PESSOA_JURIDICA = 'PJ' 7 | 8 | CLIENTE_CHOICES = [ 9 | (PESSOA_FISICA, 'Fisica'), 10 | (PESSOA_JURIDICA, 'Juridica'), 11 | ] 12 | nome = models.CharField(max_length=100) 13 | endereco = models.CharField(max_length=100) 14 | telefone = models.CharField(max_length=14) 15 | cpf = models.CharField(max_length=11, null=True) 16 | cnpj = models.CharField(max_length=14, null=True) 17 | tipo = models.CharField( 18 | max_length=2, choices=CLIENTE_CHOICES, default=PESSOA_FISICA) 19 | 20 | def __str__(self) -> str: 21 | return self.nome 22 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/models/veiculo.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class Veiculo(models.Model): 5 | TIPO_AUTOMOVEL = "VL" 6 | TIPO_CAMINHAO = "VP" 7 | 8 | VEICULO_CHOICES = [ 9 | (TIPO_AUTOMOVEL, "Automovel"), 10 | (TIPO_CAMINHAO, "Caminhao") 11 | ] 12 | 13 | placa = models.CharField(max_length=7) 14 | km = models.FloatField() 15 | carga = models.FloatField() 16 | bagageiro = models.IntegerField() 17 | portas = models.IntegerField() 18 | tipo = models.CharField( 19 | max_length=2, choices=VEICULO_CHOICES, default=TIPO_AUTOMOVEL) 20 | 21 | def __str__(self) -> str: 22 | return self.placa -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/serializers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-16/aluguel_veiculos/serializers/__init__.py -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/serializers/aluguel_serializer.py: -------------------------------------------------------------------------------- 1 | from email.policy import default 2 | from rest_framework import serializers 3 | from aluguel_veiculos.models.aluguel import Aluguel 4 | 5 | 6 | class AluguelSerializer(serializers.HyperlinkedModelSerializer): 7 | km_rodado = serializers.FloatField() 8 | data_retirada = serializers.DateField(read_only=True) 9 | data_devolucao = serializers.DateField(read_only=True) 10 | valor = serializers.FloatField(required=False, read_only=True) 11 | 12 | def create(self, validated_data): 13 | 14 | validated_data['valor'] = validated_data['km_rodado'] * 1.5 15 | return super().create(validated_data) 16 | 17 | class Meta(): 18 | model = Aluguel 19 | fields = "__all__" 20 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/serializers/cliente_serializer.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from aluguel_veiculos.models.cliente import Cliente 3 | import re 4 | 5 | from aluguel_veiculos.validator.cpf_validator import valida_cpf 6 | 7 | 8 | class ClienteSerializer(serializers.HyperlinkedModelSerializer): 9 | telefone = serializers.CharField(min_length=9) 10 | cnpj = serializers.CharField(required=False) 11 | cpf = serializers.CharField(required=False) 12 | 13 | class Meta(): 14 | model = Cliente 15 | fields = "__all__" 16 | 17 | # def validate(self, data): 18 | # if (data.get("tipo") == 'PJ') and (data.get("cnpj") == None): 19 | # raise serializers.ValidationError( 20 | # {'Tipo': 'Se tipo igual a PJ o cnpj é obrigatorio'}) 21 | # elif (data.get("tipo") == 'PF') and (data.get("cpf") == None): 22 | # raise serializers.ValidationError( 23 | # 'Se tipo igual a PF o cpf é obrigatorio') 24 | 25 | # return data 26 | 27 | def validate_tipo(self, tipo): 28 | return tipo 29 | 30 | def validate_nome(self, nome): 31 | return nome 32 | 33 | def validate_cpf(self, cpf): 34 | if valida_cpf(cpf): 35 | raise serializers.ValidationError( 36 | {'CPF': 'CPF deve ser numerico'}) 37 | 38 | return cpf 39 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/serializers/lista_alugueis_cliente_serializer.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from aluguel_veiculos.models.aluguel import Aluguel 3 | 4 | 5 | class ListaAlugueisClienteSerializer(serializers.ModelSerializer): 6 | veiculo = serializers.ReadOnlyField(source='veiculo.placa') 7 | cliente = serializers.ReadOnlyField(source='cliente.nome') 8 | 9 | class Meta: 10 | model = Aluguel 11 | fields = [ 12 | 'cliente', 13 | 'veiculo', 14 | 'data_retirada', 15 | 'data_devolucao', 16 | 'km_rodado', 17 | 'valor', 18 | ] 19 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/serializers/veiculo_serializer.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from aluguel_veiculos.models.veiculo import Veiculo 3 | 4 | 5 | class VeiculoSerializer(serializers.HyperlinkedModelSerializer): 6 | 7 | class Meta(): 8 | model = Veiculo 9 | fields = "__all__" 10 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import include, path 2 | from rest_framework import routers 3 | from aluguel_veiculos.views.aluguel_viewset import AluguelViewset 4 | from aluguel_veiculos.views.cliente_viewset import ClienteViewset 5 | from aluguel_veiculos.views.lista_alugueis_cliente_viewset import ListaAlugueisClienteViewset 6 | from aluguel_veiculos.views.lista_clientes_veiculo_viewset import ListaClientesVeiculoViewset 7 | from aluguel_veiculos.views.veiculo_viewset import VeiculoViewset 8 | 9 | router = routers.DefaultRouter() 10 | router.register(r'clientes', ClienteViewset) 11 | router.register(r'veiculos', VeiculoViewset) 12 | router.register(r'alugueis', AluguelViewset) 13 | 14 | 15 | urlpatterns = [ 16 | path('', include(router.urls)), 17 | path('clientes//alugueis/', ListaAlugueisClienteViewset.as_view()), 18 | path('veiculos//alugueis/', ListaClientesVeiculoViewset.as_view()), 19 | path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) 20 | ] 21 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/validator/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-16/aluguel_veiculos/validator/__init__.py -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/validator/cpf_validator.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | 4 | def valida_cpf(cpf): 5 | return not re.match(r'^([\s\d]+)$', cpf) 6 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-16/aluguel_veiculos/views/__init__.py -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/views/aluguel_viewset.py: -------------------------------------------------------------------------------- 1 | from rest_framework import viewsets 2 | from rest_framework import permissions 3 | from aluguel_veiculos.models.aluguel import Aluguel 4 | from aluguel_veiculos.serializers.aluguel_serializer import AluguelSerializer 5 | 6 | 7 | class AluguelViewset(viewsets.ModelViewSet): 8 | 9 | serializer_class = AluguelSerializer 10 | queryset = Aluguel.objects.all() 11 | permission_classes = [permissions.IsAuthenticated] 12 | 13 | def create(self, request, *args, **kwargs): 14 | return super().create(request, *args, **kwargs) 15 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/views/cliente_viewset.py: -------------------------------------------------------------------------------- 1 | from rest_framework import viewsets, filters 2 | from rest_framework import permissions 3 | from aluguel_veiculos.models.cliente import Cliente 4 | from aluguel_veiculos.serializers.cliente_serializer import ClienteSerializer 5 | from django_filters.rest_framework import DjangoFilterBackend 6 | 7 | 8 | class ClienteViewset(viewsets.ModelViewSet): 9 | 10 | serializer_class = ClienteSerializer 11 | queryset = Cliente.objects.all() 12 | # permission_classes = [permissions.IsAuthenticated] 13 | 14 | filter_backends = [ 15 | DjangoFilterBackend, 16 | filters.OrderingFilter, 17 | filters.SearchFilter 18 | ] 19 | search_fields = ['nome', 'endereco'] 20 | ordering_fields = ['nome'] 21 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/views/lista_alugueis_cliente_viewset.py: -------------------------------------------------------------------------------- 1 | from rest_framework import generics 2 | from aluguel_veiculos.models.aluguel import Aluguel 3 | from aluguel_veiculos.serializers.lista_alugueis_cliente_serializer import ListaAlugueisClienteSerializer 4 | 5 | 6 | class ListaAlugueisClienteViewset(generics.ListAPIView): 7 | 8 | def get_queryset(self): 9 | queryset = Aluguel.objects.filter(cliente_id=self.kwargs['pk']) 10 | return queryset 11 | 12 | serializer_class = ListaAlugueisClienteSerializer 13 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/views/lista_clientes_veiculo_viewset.py: -------------------------------------------------------------------------------- 1 | from rest_framework import generics 2 | from aluguel_veiculos.models.aluguel import Aluguel 3 | from aluguel_veiculos.serializers.lista_alugueis_cliente_serializer import ListaAlugueisClienteSerializer 4 | 5 | 6 | class ListaClientesVeiculoViewset(generics.ListAPIView): 7 | 8 | def get_queryset(self): 9 | queryset = Aluguel.objects.filter(veiculo_id=self.kwargs['pk']) 10 | return queryset 11 | 12 | serializer_class = ListaAlugueisClienteSerializer 13 | -------------------------------------------------------------------------------- /2022-07-16/aluguel_veiculos/views/veiculo_viewset.py: -------------------------------------------------------------------------------- 1 | from rest_framework import viewsets 2 | from rest_framework import permissions 3 | from aluguel_veiculos.models.veiculo import Veiculo 4 | from aluguel_veiculos.serializers.veiculo_serializer import VeiculoSerializer 5 | 6 | 7 | class VeiculoViewset(viewsets.ModelViewSet): 8 | serializer_class = VeiculoSerializer 9 | queryset = Veiculo.objects.all() 10 | permission_classes = [permissions.IsAuthenticated] 11 | -------------------------------------------------------------------------------- /2022-07-16/configuracoes/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/2022-07-16/configuracoes/__init__.py -------------------------------------------------------------------------------- /2022-07-16/configuracoes/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for configuracoes project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configuracoes.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /2022-07-16/configuracoes/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import include, path 3 | 4 | urlpatterns = [ 5 | path('v1/', include('aluguel_veiculos.urls')), 6 | ] 7 | -------------------------------------------------------------------------------- /2022-07-16/configuracoes/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for configuracoes project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configuracoes.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /2022-07-16/docs/front_exemplo/form.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | TESTE 9 | 10 | 11 | 12 | 13 |
14 | 15 |
16 | 17 |
18 | 21 |
22 | 23 |
24 |
25 |
26 | 29 |
30 | 31 |
32 |
33 |
34 | 37 |
38 | 39 |
40 |
41 |
42 | 45 |
46 | 50 |
51 |
52 |
53 | 54 |
55 |
56 | 57 | 58 | -------------------------------------------------------------------------------- /2022-07-16/docs/front_exemplo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Youtube 7 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /2022-07-16/docs/front_exemplo/script.js: -------------------------------------------------------------------------------- 1 | function fazPost(url, body) { 2 | console.log("Body=", body) 3 | let request = new XMLHttpRequest() 4 | request.open("POST", url, true) 5 | request.setRequestHeader("Content-type", "application/json") 6 | request.send(JSON.stringify(body)) 7 | 8 | request.onload = function() { 9 | if(this.status == 201){ 10 | alert('Sucesso!') 11 | } 12 | console.log(this.responseText) 13 | } 14 | 15 | return request.responseText 16 | } 17 | 18 | 19 | function cadastraCliente() { 20 | event.preventDefault() 21 | let url = "http://127.0.0.1:8000/v1/clientes/" 22 | let nome = document.getElementById("nome").value 23 | let telefone = document.getElementById("telefone").value 24 | let endereco = document.getElementById("endereco").value 25 | let tipo = document.getElementById("tipo").value 26 | 27 | body = { 28 | "nome": nome, 29 | "telefone": telefone, 30 | "endereco": endereco, 31 | "tipo": tipo 32 | 33 | } 34 | 35 | fazPost(url, body) 36 | } 37 | 38 | function fazGet(url) { 39 | let request = new XMLHttpRequest() 40 | request.open("GET", url, false) 41 | request.send(null) 42 | return request.responseText 43 | } 44 | 45 | function criaLinha(cliente) { 46 | console.log(cliente) 47 | linha = document.createElement("tr"); 48 | tdId = document.createElement("td"); 49 | tdNome = document.createElement("td"); 50 | tdId.innerHTML = cliente.nome 51 | tdNome.innerHTML = cliente.endereco 52 | 53 | linha.appendChild(tdId); 54 | linha.appendChild(tdNome); 55 | 56 | return linha; 57 | } 58 | 59 | function main() { 60 | let data = fazGet("http://127.0.0.1:8000/v1/clientes/"); 61 | let clientes = JSON.parse(data); 62 | let tabela = document.getElementById("tabela"); 63 | clientes.results.forEach(element => { 64 | let linha = criaLinha(element); 65 | tabela.appendChild(linha); 66 | }); 67 | // Para cada cliente 68 | // criar uma linha 69 | // adicionar na tabela 70 | } 71 | 72 | main() -------------------------------------------------------------------------------- /2022-07-16/docs/inst_django.md: -------------------------------------------------------------------------------- 1 | # Instalação Django 2 | 3 | ## [Menu principal](./../README.md) 4 | 5 | ## Projeto 6 | 7 | Ambiente virtual do python 8 | ``` 9 | python3 -m venv .venv 10 | ``` 11 | 12 | Ativação ambiente virtual Linux 13 | ``` 14 | source .venv/bin/activate 15 | ``` 16 | 17 | Ativação ambiente virtual Windows 18 | ``` 19 | .venv\Scripts\activate.bat 20 | ``` 21 | 22 | instalação django 23 | ``` 24 | pip install django 25 | ``` 26 | 27 | criação projeto 28 | ``` 29 | django-admin startproject configuracoes . 30 | ``` 31 | 32 | configurações de idioma. 33 | no arquivo ***configuracoes/settings.py*** altere as constantes 34 | 35 | LANGUAGE_CODE = 'pt-br' 36 | TIME_ZONE = 'America/Sao_Paulo' 37 | 38 | criar um novo app 39 | ``` 40 | python manage.py startapp projeto 41 | ``` 42 | 43 | ``` 44 | sudo apt-get install python3-dev default-libmysqlclient-dev build-essential 45 | 46 | pip install mysqlclient 47 | ``` 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /2022-07-16/docs/inst_django_rest_framework.md: -------------------------------------------------------------------------------- 1 | # django rest framework 2 | 3 | ## [Menu principal](./../README.md#main-section) 4 | 5 | ## Instalação 6 | 7 | pip install djangorestframework 8 | pip install markdown 9 | pip install django-filter 10 | 11 | 12 | ## Configuração 13 | 14 | No arquivo ***configuracoes/settings.py*** adicionar o 'rest_framework' aos APPS 15 | 16 | INSTALLED_APPS = [ 17 | ... 18 | 'rest_framework', 19 | ] 20 | 21 | 22 | no arquivo ***configuracoes/urls.py*** 23 | 24 | ... 25 | from rest_framework import routers 26 | 27 | router = routers.DefaultRouter() 28 | 29 | urlpatterns = [ 30 | ... 31 | path('', include(router.urls)), 32 | path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) 33 | ] 34 | 35 | ## Paginação 36 | A paginação permite controlar quantos objetos por página são retornados. Para habilitá-lo, adicione as seguintes linhas ***configuracoes/settings.py*** 37 | 38 | REST_FRAMEWORK = { 39 | 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 40 | 'PAGE_SIZE': 10 41 | } -------------------------------------------------------------------------------- /2022-07-16/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configuracoes.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /2022-07-16/requirements.txt: -------------------------------------------------------------------------------- 1 | asgiref==3.5.2 2 | autopep8==1.6.0 3 | backports.zoneinfo==0.2.1 4 | Django==4.0.6 5 | django-filter==22.1 6 | djangorestframework==3.13.1 7 | importlib-metadata==4.12.0 8 | Markdown==3.3.7 9 | mysqlclient==2.1.1 10 | pycodestyle==2.8.0 11 | python-dotenv==0.20.0 12 | pytz==2022.1 13 | PyYAML==6.0 14 | sqlparse==0.4.2 15 | toml==0.10.2 16 | uritemplate==4.1.1 17 | zipp==3.8.0 18 | -------------------------------------------------------------------------------- /Encontro01--15-02-2022-onboarding/desafio01.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 15/02/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: recebe do usuário distância em km e velocidade média em km/h e imprime na tela o tempo em horas da viagem 6 | """ 7 | 8 | # Desafio 01 9 | 10 | distancia = float(input("Digite a distância em km: ")) 11 | 12 | velocidade_media = float(input("Digite a velocidade média em km/h: ")) 13 | 14 | tempo_total_horas = distancia / velocidade_media 15 | 16 | print(f"\nO tempo estimado é de {tempo_total_horas:.2f} horas\n") 17 | print(f"{distancia} -> {velocidade_media}") 18 | -------------------------------------------------------------------------------- /Encontro01--15-02-2022-onboarding/desafio02-gabarito.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 15/02/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: 6 | O programa lê do usuário duas quantidades, dias e quilômetros. 7 | Considera-se que o preço por dia seja R$60 e que o preço por quilômetro rodado seja R$0.65. 8 | Calcula-se o preço total do aluguel de um veículo e imprime-o na tela, formatando a saída com 7 dígitos e 2 casas decimais. 9 | """ 10 | 11 | # Desafio 02 - gabarito 12 | 13 | qtd_km = int(input("Digite a quantidade de quilometros percorridos: ")) 14 | 15 | qtd_dias = int(input("Digite quantos dias você ficou com o carro:")) 16 | 17 | preco_por_dia = 60 18 | preco_por_km = 0.15 19 | 20 | preco_total_km = qtd_km * preco_por_km 21 | preco_total_dia = qtd_dias * preco_por_dia 22 | 23 | preco_a_pagar = preco_total_km + preco_total_dia 24 | 25 | print(f"Total a pagar: R$ {preco_a_pagar:7.2f}") 26 | -------------------------------------------------------------------------------- /Encontro01--15-02-2022-onboarding/desafio02.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 15/02/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: exercício proposto na aula introdutória para elucidar a criatividade dos alunos e 6 | começarem a obter a perceção do que um código faz. O enunciado será escrito ao final da aula, ao 7 | vivo, após análise dos alunos. 8 | """ 9 | 10 | # Desafio 02: o que esse pequeno trecho de código faz? 11 | 12 | qtd_km = int(input("Digite a quantidade de quilometros percorridos: ")) 13 | 14 | qtd_dias = int(input("Digite quantos dias você ficou com o carro:")) 15 | 16 | preco_por_dia = 60 17 | preco_por_km = 0.15 18 | 19 | preco_total_km = qtd_km * preco_por_km 20 | preco_total_dia = qtd_dias * preco_por_dia 21 | 22 | preco_a_pagar = preco_total_km + preco_total_dia 23 | 24 | print(f"Total a pagar: R$ {preco_a_pagar:7.2f}") 25 | -------------------------------------------------------------------------------- /Encontro02--17-02-2022-int-float-string/01-int-float.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 17/02/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: Introdução aos tipos de dados (int, float) 6 | """ 7 | 8 | aluno = "Henrique Branco" 9 | 10 | nota1 = float(input("Digite a primeira nota: ")) 11 | 12 | nota2 = float(input("Digite a segunda nota: ")) 13 | 14 | nota3 = float(input("Digite a terceira nota: ")) 15 | 16 | media = (nota1 + nota2 + nota3) / 3 17 | 18 | media_arred = round(media, 2) 19 | 20 | print(f"\nA média do aluno {aluno} é {media}") 21 | -------------------------------------------------------------------------------- /Encontro02--17-02-2022-int-float-string/02-string.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 17/02/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: Introdução aos tipos de dados (string) 6 | """ 7 | 8 | nome = " henrique Alves Junqueira Nogueira Branco " 9 | 10 | ### Métodos de string com a sintaxe nome.metodo() 11 | 12 | print(f"Nome em maiúsculo: {nome.upper()}") 13 | 14 | print(f"Nome em minúsculo: {nome.lower()}") 15 | 16 | print(f"Primeira letra em maiúsculo: {nome.capitalize()}") 17 | 18 | # Atenção às aspas duplas e simples! Comentamos isso na aula! 19 | print(f"Contando quantas vezes a letra 'a' aparece no nome: {nome.count('a')}") 20 | 21 | print(f"Removendo espaços em branco no começo e final da string: {nome.strip()}") 22 | 23 | # Cuidado com as aspas de novo! Se misturar, dá ruim! 24 | print(f"Substituindo meu nome por algo engraçado: {nome.replace('henrique', 'xpto')}") 25 | 26 | print(f"Separando o nome em partes: {nome.split()}") 27 | 28 | ### Função len() 29 | 30 | # Os espaços em branco contam, lembram? 31 | print(f"A minha string contém {len(nome)} caracteres") -------------------------------------------------------------------------------- /Encontro03--22-02-2022-list-dict-set/02-dicts.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 24/02/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: Introdução aos tipos de dados - dicionários 6 | """ 7 | 8 | ### INTRODUÇÃO BÁSICA 9 | 10 | ## Característica dos dicionários 11 | # São estruturas de dados de mapeamento, de de-para, chave-valor 12 | # Começam com {} e tem : que dividem os partes de chave:valor e vírgula separando um par de chave e valor do outro 13 | 14 | sigla_estado = {"SP" : "São Paulo", "MG" : "Minas Gerais"} 15 | 16 | # Podemos criar um dicionário idêntico com a função dict() 17 | # Reparem que as chaves são passadas como parâmetros nomeados da função dict(), e não como string 18 | # O resultado é o mesmo dicionário da linha 14 19 | sigla_estado = dict(SP="São Paulo", MG="Minas Gerais") 20 | print(f"Dicionário inicial: {sigla_estado}") 21 | 22 | # ---------------------------------------------------------------------------------------------------- 23 | ### ACESSANDO ELEMENTOS DE UM DICIONÁRIO 24 | 25 | # Acessamos um valor de um dicionário a partir da sua chave usando a notação de [] 26 | print(f"\nO valor para a chave 'SP' é {sigla_estado['SP']}") 27 | 28 | # Caso uma chave não exista, o código gera um erro. Descomente a linha 29 abaixo e execute o código 29 | # KeyError: "RJ" -> Ela não existe no dicionário 30 | # print(sigla_estado["RJ"]) 31 | 32 | # Podemos criar uma chave que não existe atribuindo um valor à ela 33 | sigla_estado["RJ"] = "Rio de Janeiro" 34 | print(f"\nA nova chave foi criada: {sigla_estado}") 35 | 36 | 37 | # ---------------------------------------------------------------------------------------------------- 38 | ### MÉTODOS MAIS COMUNS DE DICIONÁRIOS 39 | 40 | # Alguns que não necessitam de exemplos são: clear() e copy() 41 | # clear() limpa o dicionário e copy() cria uma cópia dele 42 | 43 | # Retornando apenas as chaves do meu dicionário 44 | print(f"\nTransformando as chaves em uma lista: {list(sigla_estado)}") 45 | print(f"\nTransformando as chaves em um outro objeto: {sigla_estado.keys()}") 46 | 47 | # Retornando os valores do meu dicionário 48 | print(f"\nValores do meu dicionário: {sigla_estado.values()}") 49 | 50 | # Retornando os pares de chave-valor 51 | print(f"\nPares de chave-valor: {sigla_estado.items()}") 52 | 53 | # ---------------------------------------------------------------------------------------------------- 54 | ### CHECANDO EXISTENCIA DE ITENS NO DICIONÁRIO 55 | check_sp = "SP" in sigla_estado 56 | print(f"\nA sigla SP está nas chaves? Resposta: {check_sp}") 57 | 58 | check_se = "SE" in sigla_estado 59 | print(f"\nA sigla SE está nas chaves? Resposta: {check_se}") 60 | -------------------------------------------------------------------------------- /Encontro03--22-02-2022-list-dict-set/03-sets.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 24/02/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: Introdução aos tipos de dados - sets 6 | """ 7 | 8 | ### INTRODUÇÃO BÁSICA 9 | 10 | ## Característica dos sets: 11 | # Conjuntos matemáticos (sim, aquelas bolinhas com intersecção no meio!) 12 | # Não há como acessar por posição (posições são aleatórias) 13 | # Elementos únicos, exclusivos, sem repetição 14 | 15 | ## Formas de se criar um set 16 | # Usando a notação {} 17 | # Percebam que é diferente de um dicionário, pois dict tem {} : e , separando as chaves e valores 18 | conjunto_a = {1,2,3,4,1,2,3,4,1,2,3,4} 19 | print(f"Conjunto A: {conjunto_a}") 20 | 21 | # Podemos usar a função set() para transformar outros objetos em um set 22 | facilitador = set("Henrique Alves") # Transformando uma string para um set (sem letras repetidas) 23 | 24 | # Fazendo a mesma coisa com outra string 25 | letras_aleatorias = set("HeibfnAs ") # reparem no espaço ao final 26 | 27 | # ---------------------------------------------------------------------------------------------------- 28 | ### O PODER DOS SETS: COMPARANDO CONJUNTOS! 29 | 30 | # Pergunta 1: Quais letras em comum temos em `facilitador` e `letras_aleatorias`? 31 | print(f"Resp 1: {facilitador.intersection(letras_aleatorias)}") 32 | 33 | # Pergunta 2: Quais letras temos em `facilitador` que não estão em `letras_aleatorias`? 34 | print(f"Resp 2: {facilitador - letras_aleatorias}") 35 | 36 | # Pergunta 3: Quais letras temos em `letras_aleatorias` que não estão em `facilitador`? 37 | print(f"Resp 3: {letras_aleatorias - facilitador}") 38 | 39 | # Pergunta 4: Quantas letras não repetidas temos ao total, quando consideramos `facilitador` e `letras_aleatorias`? 40 | print(f"Resp 4: {len(facilitador.union(letras_aleatorias))}") 41 | 42 | # Pergunta 5: Quais letras estão ou em `letras_aleatorias` ou em `facilitador` mas não em ambos ao mesmo tempo? 43 | print(f"Resp 5: {facilitador.symmetric_difference(letras_aleatorias)}") 44 | 45 | # Pergunta 6: A letra F está em `facilitador` 46 | print(f"Resp 6: {'F' in facilitador}") 47 | 48 | # Pergunta 7: `letras_aleatorias` é um subconjunto de `facilitador`? 49 | # Em outras palavras, `letras_aleatorias` está contida em `facilitador`? 50 | # ou ainda: `facilitador` contém TODAS as letras de `letras_aleatorias`? 51 | print(f"Resp 7: {letras_aleatorias.issubset(facilitador)}") 52 | 53 | # e assim por diante! Pensou em conjunto, comparação de conjunto pensou em sets!!! -------------------------------------------------------------------------------- /Encontro04--24-02-2022-if-else-elif/01-if-else-elif.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 24/02/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: Estrutura condicional (if, elif, else) 6 | """ 7 | 8 | aluno = "Henrique Branco" 9 | 10 | # Criando uma lista vazia 11 | notas = [] 12 | 13 | # Adicionando a primeira nota (input do usuário) à lista 14 | notas.append(float(input("Digite a primeira nota: "))) 15 | 16 | # Adicionando a segunda nota (input do usuário) à lista 17 | notas.append(float(input("Digite a segunda nota: "))) 18 | 19 | # Adicionando a terceira nota (input do usuário) à lista 20 | notas.append(float(input("Digite a terceira nota: "))) 21 | 22 | # Calculando a média das notas (não temos nenhuma função pronta!) 23 | nota_media = sum(notas) / len(notas) 24 | 25 | # Definindo padrões de aprovação 26 | nota_minima_aprovacao = 7 27 | nota_minima_rec = 6 28 | 29 | # Verificação de aprovação do aluno 30 | if nota_media >= nota_minima_aprovacao: 31 | status = "aprovado" 32 | 33 | # Verificação de reprovação ou recuperação, caso aluno não tenha sido aprovado 34 | elif nota_media >= nota_minima_rec: 35 | 36 | ## Chance de eliminar a nota mais baixa 37 | 38 | # Nota mínima 39 | nota_minima = min(notas) 40 | 41 | # Índice da nota mínima na lista 42 | nota_minima_indice = notas.index(nota_minima) 43 | 44 | # Eliminando a nota mínia através do seu índice 45 | notas.pop(nota_minima_indice) 46 | 47 | # Recalcula a média 48 | nota_media = sum(notas) / len(notas) 49 | 50 | # Define o status do aluno com a nova média 51 | if nota_media >= nota_minima_aprovacao: 52 | status = f"aprovado com {len(notas)}" 53 | else: 54 | status = "recuperação" 55 | 56 | # Se nenhuma das condições acima foi atendida, então o aluno está reprovado! 57 | else: 58 | status = "reprovado" 59 | 60 | # Arredondando a média para 2 casas decimais 61 | nota_media_arred = round(nota_media, 2) 62 | 63 | # Imprime o resultado final na tela 64 | print(f"\nA média do aluno {aluno} é {nota_media_arred} e este aluno tem o seguinte status: {status}") 65 | -------------------------------------------------------------------------------- /Encontro05--08-03-2022-for-while/01-for.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 08/03/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: Estrutura de repetição (for e while) 6 | """ 7 | 8 | # Criando um dicionário vazio, que vai receber o nome como chave e uma lista de notas como valor 9 | fechamento = dict() 10 | 11 | # Recebe do usuário quantos alunos serão cadastrados 12 | numero_alunos = int(input("Querido usuário, quantos alunos serão? ")) 13 | 14 | # Recebe quantas notas por aluno serão cadastradas 15 | numero_notas = int(input("Quantas notas por aluno? ")) 16 | 17 | # Laço de repetição para cadastro de alunos 18 | for _ in range(numero_alunos): 19 | 20 | # Lê o nome do aluno 21 | nome = input("Digite o nome do aluno: ") 22 | 23 | # Cria no dicionário uma chave com o nome do aluno, e o valor sendo uma lista vazia 24 | fechamento[nome] = [] 25 | 26 | # Laço de repetição para ler as notas do aluno 27 | for _ in range(numero_notas): 28 | 29 | # Lê a nota daquele aluno 30 | nota = int(input(f"Digite a nota do {nome}: ")) 31 | 32 | # Coloca a nota na lista 33 | fechamento[nome].append(nota) 34 | 35 | # Laço no dicionário para calcular a média de cada aluno e imprimir na tela 36 | for aluno, notas in fechamento.items(): 37 | 38 | # Calcula a média 39 | media = sum(notas) / len(notas) 40 | 41 | # Imprime o nome do aluno e a média na tela 42 | print(f"A média do aluno {aluno} foi {media}!") 43 | -------------------------------------------------------------------------------- /Encontro05--08-03-2022-for-while/02-while.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 10/03/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: Estrutura de repetição (for e while) 6 | """ 7 | 8 | # Criando um dicionário vazio, que vai receber o nome como chave e uma lista de notas como valor 9 | fechamento = dict() 10 | 11 | # Recebe o nome do usuário 12 | nome = input("Digite o nome do aluno: ") 13 | 14 | # Inicia o dicinário com o nome do aluno com chave e uma lista vazia 15 | fechamento[nome] = [] 16 | 17 | # Inicializa a condição para entrar na repetição while 18 | condicao = "S" 19 | 20 | # Enquanto a condição for "S" 21 | while condicao == "S": 22 | 23 | # Lê uma nota do usuário 24 | nota = int(input("Digite uma nota: ")) 25 | 26 | # Coloca essa nota na lista 27 | fechamento[nome].append(nota) 28 | 29 | # Pergunta se o usuário quer cadastrar mais notas (atualiza a condição) 30 | # Atenção ao .upper() ao final! 31 | condicao = input("Deseja entrar com mais uma nota? S ou N? ").upper() 32 | 33 | # Se a condição tiver uma única lera e for "S" 34 | if len(condicao) == 1 and condicao == "S": 35 | 36 | # Continua o laço de repetição 37 | continue 38 | 39 | # Caso a condição tenha uma letra e for "N" 40 | elif len(condicao) == 1 and condicao == "N": 41 | 42 | # Interrompe o laço 43 | break 44 | 45 | # Em todos os outros casos diferente dos acima 46 | else: 47 | # Pede para o usuário digitar uma opção válida 48 | print("Condição inválida! Digite uma condição válida!") 49 | 50 | # Lê novamente a condição 51 | condicao = input("Deseja entrar com mais uma nota? S ou N? ") 52 | -------------------------------------------------------------------------------- /Encontro06--10-03-2022-funcoes/01-funcoes.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 10/03/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: funções 6 | """ 7 | 8 | # Definição da função para cálculo da média 9 | # A função recebe uma lista como parâmetro e retorna um float 10 | def calcula_media(lst: list) -> float: 11 | """Calcula a média aritimérica.""" 12 | 13 | # Retorna o cálculo da média da lista 14 | return sum(lst) / len(lst) 15 | 16 | # Função para cálculo da média ponderada 17 | # A função recebe `valores` que é uma lista, `pesos` que é uma tupla e retorna um float 18 | # O parâmetro valores é obrigatório 19 | # O parâmetro pesos é opcional. Se não for passado: 20 | # * Criamos uma tupla com vários números de mesmo tamanho (número de elementos) do parâmetro `valores` 21 | def calcula_media_ponderada(valores: list, pesos: tuple or None = None) -> float: 22 | """Calcula a média ponderada.""" 23 | 24 | # Se não for passado o parâmetro de pesos 25 | if not pesos: 26 | 27 | # Criamos uma tupla cheia de 1, com mesmo número de elementos de `valores` 28 | pesos = (1,) * len(valores) 29 | 30 | # Inicia uma soma acumulativa com zero 31 | numerador = 0 32 | 33 | # Soma dos pesos 34 | denominador = sum(pesos) 35 | 36 | # Iterando por cada par de valor, peso 37 | for valor, peso in zip(valores, pesos): 38 | 39 | # Soma cumulativa da multiplicação de cada valor por cada peso 40 | numerador = numerador + valor * peso 41 | 42 | # Retornando a média ponderada 43 | return numerador / denominador 44 | 45 | # Criando um dicionário vazio, que vai receber o nome como chave e uma lista de notas como valor 46 | fechamento = dict() 47 | 48 | # Recebe do usuário quantos alunos serão cadastrados 49 | numero_alunos = int(input("Querido usuário, quantos alunos serão? ")) 50 | 51 | # Recebe quantas notas por aluno serão cadastradas 52 | numero_notas = int(input("Querido usuário, quantas notas por aluno? ")) 53 | 54 | # Laço de repetição para cadastro de alunos 55 | for _ in range(numero_alunos): 56 | 57 | # Lê o nome do aluno 58 | nome = input("Digite o nome do aluno: ") 59 | 60 | # Cria no dicionário uma chave com o nome do aluno, e o valor sendo uma lista vazia 61 | fechamento[nome] = [] 62 | 63 | # Laço de repetição para ler as notas do aluno 64 | for _ in range(numero_notas): 65 | 66 | # Lê a nota daquele aluno 67 | nota = int(input(f"Digite a nota do {nome}: ")) 68 | 69 | # Coloca a nota na lista 70 | fechamento[nome].append(nota) 71 | 72 | # Laço no dicionário para calcular a média de cada aluno e imprimir na tela 73 | for aluno, notas in fechamento.items(): 74 | 75 | # Chamamos a função de cálculo de média ponderada, sem passar os pesos (opcional) 76 | media = calcula_media_ponderada(notas) 77 | 78 | # Imprime o nome do aluno e a média na tela 79 | print(f"A média do aluno {aluno} foi {media}!") 80 | -------------------------------------------------------------------------------- /Encontro07_08--15-03-2022-modulos-pacotes-venv/calculo.py: -------------------------------------------------------------------------------- 1 | def calcula_media_ponderada(valores: list, pesos: tuple or None = None) -> float: 2 | """Calcula a média ponderada.""" 3 | 4 | # Se não for passado o parâmetro de pesos 5 | if not pesos: 6 | 7 | # Criamos uma tupla cheia de 1, com mesmo número de elementos de `valores` 8 | pesos = (1,) * len(valores) 9 | 10 | # Inicia uma soma acumulativa com zero 11 | numerador = 0 12 | 13 | # Soma dos pesos 14 | denominador = sum(pesos) 15 | 16 | # Iterando por cada par de valor, peso 17 | for valor, peso in zip(valores, pesos): 18 | 19 | # Soma cumulativa da multiplicação de cada valor por cada peso 20 | numerador = numerador + valor * peso 21 | 22 | # Retornando a média ponderada 23 | return numerador / denominador 24 | -------------------------------------------------------------------------------- /Encontro07_08--15-03-2022-modulos-pacotes-venv/main.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 15/03/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: módulos 6 | """ 7 | 8 | from calculo import calcula_media_ponderada 9 | 10 | fechamento = dict() 11 | 12 | numero_alunos = int(input("Querido usuário, quantos alunos serão? ")) 13 | numero_notas = int(input("Querido usuário, quantas notas por aluno? ")) 14 | 15 | for _ in range(numero_alunos): 16 | 17 | nome = input("Digite o nome do aluno: ") 18 | 19 | fechamento[nome] = [] 20 | 21 | for _ in range(numero_notas): 22 | 23 | nota = int(input(f"Digite a nota do {nome}: ")) 24 | 25 | fechamento[nome].append(nota) 26 | 27 | 28 | for aluno, notas in fechamento.items(): 29 | media = calcula_media_ponderada(notas) 30 | print(f"A média do aluno {aluno} foi {media}!") 31 | -------------------------------------------------------------------------------- /Encontro07_08--15-03-2022-modulos-pacotes-venv/material.md: -------------------------------------------------------------------------------- 1 | # Definições 2 | - **Script:** arquivo `.py` com comandos python 3 | - **Módulo:** arquivo `.py` somente com funções e definições 4 | - **Pacote:** pasta com vários módulos 5 | - **Ambiente virtual:** ambiente isolado para projetos 6 | 7 | - **Documentação venv:** https://docs.python.org/3/library/venv.html 8 | 9 | -------------------------------------------------------------------------------- /Encontro09_10--10-22-03-2022-modulos-builin-bingo/bingo.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 24/03/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: BINGO do zero! 6 | 7 | Uma cartela de BINGO consiste em 5 colunas de 5 números que são rotulados com as letras B, I, N, G e O. 8 | Atenção: Google it, para quem nunca viu uma cartela dessas! 9 | 10 | Existem 15 números que podem aparecer sob cada letra respeitando a regra abaixo. 11 | - B -> números variando de 1 a 15 (inclusos) 12 | - I -> números variando de 16 a 30 (inclusos) 13 | - N -> números variando de 31 a 45 (inclusos) 14 | - ... e assim por diante 15 | 16 | Passo número 0: 17 | - Escreva uma função que crie uma cartela de BINGO aleatória. Dica(podemos usar um dicionário!). 18 | - As chaves serão as letras B, I, N, G e O. 19 | - Os valores serão as listas de cinco números aleatórios respeitando a regra dos intervalos de cada letra. 20 | 21 | Passo número 1: 22 | - Escreva uma segunda função que exiba a cartela de BINGO com as colunas rotuladas apropriadamente 23 | - Formate a saída no terminal para que a cartela seja impressa em forma de colunas (letras e seus valores abaixo) 24 | 25 | Passo número 2: 26 | - Sorteie uma letra e número aleatório (respeitando a regra) e veja se a cartela contém aquele número. 27 | 28 | # Lição de casa para os alunos!! 29 | Passo número 3: 30 | - Sorteie 50 (letras e) números e verifique se a cartela é vencedora ou não. 31 | - Uma cartela é vencedora quando preencher uma linha ou coluna inteira com números sorteados. 32 | 33 | Passo número desafio: 34 | - Simule 1.000 jogos que sorteiam TODOS os números até que uma mesma cartela seja preenchida e contabilize: 35 | * O número mínimo de sorteio para que a carteja seja vencedora (não necessariamente preencher toda a cartela!) 36 | * A média do número de sorteios para que a carteja seja vencedora 37 | * O número máximo de sorteios para que a cartela seja vencedora 38 | """ 39 | 40 | import cartela 41 | import sorteio 42 | 43 | cartela_1 = cartela.gerar() 44 | 45 | cartela.imprime(cartela_1) 46 | 47 | letra_sorteada, numero_sorteado = sorteio.sorteia() 48 | 49 | if cartela.numero_existe(cartela_1, letra_sorteada, numero_sorteado): 50 | cartela_1 = cartela.marca_numero(cartela_1, letra_sorteada, numero_sorteado, " ") 51 | 52 | cartela.imprime(cartela_1) 53 | -------------------------------------------------------------------------------- /Encontro09_10--10-22-03-2022-modulos-builin-bingo/cartela.py: -------------------------------------------------------------------------------- 1 | """Módulo com funções e variáveis para cartela de bingo.""" 2 | 3 | from collections import defaultdict 4 | from random import randint, seed 5 | 6 | # Travando a aleatoriedade da cartela 7 | seed(1) 8 | 9 | LETRAS = ("B", "I", "N", "G", "O") 10 | 11 | 12 | def min_max(letra: str) -> tuple[int]: 13 | """Gera o valor mínimo e máximo para a letra dada. 14 | 15 | Args: 16 | letra (str): Letra de input 17 | 18 | Returns: 19 | tuple[int]: valores mínimo e máximo 20 | """ 21 | intervalo = {"B": (1, 15), "I": (16, 30), "N": (31, 45), "G": (46, 60), "O": (61, 75)} 22 | 23 | minimo, maximo = intervalo[letra][0], intervalo[letra][1] 24 | 25 | return minimo, maximo 26 | 27 | 28 | # Passo número 0 29 | def gerar() -> defaultdict[str, list[int]]: 30 | """Gera uma cartela com 5 números aleatórios para cada letra.""" 31 | 32 | cartela = defaultdict(list) 33 | 34 | for letra in LETRAS: 35 | # Coletar o número mínimo e máximo de cada letra 36 | minimo, maximo = min_max(letra) 37 | 38 | while len(cartela[letra]) < 5: 39 | # Gerar um número aleatório 40 | num_aleatorio = randint(minimo, maximo) 41 | 42 | # Verificar se o número não existe naquela letra 43 | if num_aleatorio in cartela[letra]: 44 | continue 45 | 46 | # Colocar número aleatório na lista 47 | cartela[letra].append(num_aleatorio) 48 | 49 | # Ordena em ordem crescente os números 50 | cartela[letra].sort() 51 | 52 | return cartela 53 | 54 | 55 | # Passo número 1: 56 | def imprime(cartela: dict[str, list[int]]) -> None: 57 | """Formata a cartela para imprimir na tela 58 | 59 | Args: 60 | cartela (dict[str, list[int]]): cartela de entrada 61 | """ 62 | 63 | print(" B I N G O") 64 | 65 | # Para cada linha ele imprime os elementos daquela linha na tela 66 | for linha in range(5): 67 | 68 | # Gera a lista de elementos já formatada 69 | lista_str = [str(lista[linha]).zfill(2) for lista in cartela.values()] 70 | 71 | # Junta a lista de strings para impressão com uma `,` 72 | string = ", ".join(lista_str) 73 | 74 | print(string) 75 | 76 | 77 | # Passo 2 (além!) 78 | def marca_numero(cartela: defaultdict, letra: str, numero: int, caracter: str): 79 | # Coletar o índice da lista do número sorteado 80 | indice = cartela[letra].index(numero) 81 | 82 | cartela[letra][indice] = caracter 83 | 84 | return cartela 85 | 86 | 87 | # Passo 2: 88 | def numero_existe(cartela, letra, numero): 89 | if numero in cartela[letra]: 90 | print("Você acertou um número!") 91 | return True 92 | print("Você errou!") 93 | return False 94 | -------------------------------------------------------------------------------- /Encontro09_10--10-22-03-2022-modulos-builin-bingo/distancia_terrestre.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 22/03/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: 6 | 7 | A superfície da Terra é curva, e a distância entre os graus de longitude varia com a latitude. 8 | Como resultado, encontrar a distância entre dois pontos na superfície da Terra é mais complicado do que simplesmente usar o teorema de Pitágoras. 9 | Sejam (t1, g1) e (t2, g2) a latitude e a longitude de dois pontos na superfície da Terra. 10 | A distância entre esses pontos, acompanhando a superfície da Terra, em quilômetros é: 11 | 12 | distancia = 6371,01 x arccos(sen(t1) x sen(t2) + cos(t1) x cos(t2) x cos(g1 - g2)) 13 | 14 | O valor 6371,01 na equação anterior não foi selecionado aleatoriamente. 15 | É o raio médio da Terra em quilômetros. 16 | 17 | Crie um programa que permita ao usuário inserir a latitude e longitude de dois pontos da Terra em graus. 18 | Seu programa deve exibir a distância entre os pontos, seguindo a superfície da terra, em quilômetros. 19 | 20 | Dica¹: as funções trigonométricas do Python operam em radianos. 21 | Como resultado, você vai precisa converter a entrada do usuário de graus para radianos antes de calcular a distância com a fórmula discutida anteriormente. 22 | O módulo math contém um função chamada radianos que converte de graus para radianos. 23 | 24 | Dica²: 25 | Latitude varia de -90° (sul) até +90° (norte). O ponto de latitude 0° é a linha do equador 26 | Longitude varia de -180° (leste) até +180° (oeste). O ponto de longitude 0° é o meridiano de Greenwich 27 | """ 28 | 29 | from math import acos, cos, radians, sin 30 | 31 | print("Primeiro ponto: ") 32 | coord_str = input("Digite a primeira coordenada em graus sem espaços separadas por vírgula: ") 33 | coord_lista_str = coord_str.split(",") 34 | t1, g1 = list(map(float, coord_lista_str)) 35 | 36 | t1 = radians(t1) 37 | g1 = radians(g1) 38 | 39 | print("Segundo ponto: ") 40 | t2 = radians(float(input("Digite a latitude em graus: "))) 41 | g2 = radians(float(input("Digite a longitude em graus: "))) 42 | 43 | # distancia = 6371,01 x arccos(sen(t1) x sen(t2) + cos(t1) x cos(t2) x cos(g1 - g2)) 44 | distancia = 6371.01 * acos(sin(t1) * sin(t2) + cos(t1) * cos(t2) * cos(g1 - g2)) 45 | 46 | print(f"A distância em quilômetros calculada é: {distancia}") 47 | 48 | # t1 = -20.8480435 49 | # g1 = -49.3872444 50 | 51 | # t2 = -25.4947402 52 | # g2 = -49.4298817 53 | 54 | # ~700 km 55 | -------------------------------------------------------------------------------- /Encontro09_10--10-22-03-2022-modulos-builin-bingo/sorteio.py: -------------------------------------------------------------------------------- 1 | """Módulo para gerar números aleatórios""" 2 | import cartela 3 | 4 | 5 | def sorteia(): 6 | """Sorteia um número para o bingo.""" 7 | 8 | # letra_sorteada = choice(cartela.LETRAS) 9 | letra_sorteada = "G" 10 | 11 | minimo, maximo = cartela.min_max(letra_sorteada) 12 | 13 | # numero_sorteado = randint(minimo, maximo) 14 | numero_sorteado = 60 15 | 16 | print(f"A combinação sorteada foi {letra_sorteada}{numero_sorteado}") 17 | 18 | return letra_sorteada, numero_sorteado 19 | -------------------------------------------------------------------------------- /Encontro12--31-03-2022-projetos-portifolio-jogo-forca/jogo_forca_alunos.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 31/03/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: Construa um jogo da forca! 6 | 7 | A palavra secreta é representada por uma linha de traços em cada letra da palavra. 8 | Esta pode vir de uma variável ou arquivo, como achar melhor. 9 | Se o jogador que adivinha sugerir uma letra que ocorre na palavra, o programa a escreve em todas as posições corretas. 10 | Se a letra sugerida for incorreta, o programa deve mostrar isso de alguma forma (desenho, mensagem, etc.). 11 | As tentativas (acertos e erros) são definidas em variáveis. 12 | Quando se esgotarem as tentativas, o programa finaliza dizendo que o jogador perdeu e mostra a palavra correta. 13 | 14 | Algumas funções, importações e variáveis foram pré-definidas para auxiliá-los! 15 | """ 16 | 17 | # from random import ? 18 | 19 | 20 | def get_secret_word(): 21 | """Devolve uma palavra aleatória de uma lista.""" 22 | ... 23 | 24 | 25 | def print_game_board(): 26 | """Imprime a situação atual do jogo.""" 27 | ... 28 | 29 | 30 | def read_input_player(): 31 | """Lê uma letra do usuário.""" 32 | ... 33 | 34 | 35 | def guess_letter(): 36 | """Verifica se uma letra está na palavra secreta ou já foi jogada, seja certa ou errada.""" 37 | ... 38 | 39 | 40 | def game_continue(): 41 | """Função que decide se jogo já encerrou ou não.""" 42 | ... 43 | 44 | 45 | # secret_word = ? # variável para palavra secreta 46 | correct_letters = [] # variável que armazena as letras corretas já jogadas 47 | missed_letters = [] # variável que armazena as letras incorretas já jogadas 48 | error = 0 # erro inicial 49 | attempts = 6 # tentativas 50 | 51 | while game_continue(): 52 | print_game_board() 53 | read_input_player() 54 | guess_letter() 55 | -------------------------------------------------------------------------------- /Encontro12--31-03-2022-projetos-portifolio-jogo-forca/utils.py: -------------------------------------------------------------------------------- 1 | WORDS = [ 2 | "simples", 3 | "facilitador", 4 | "abraços", 5 | "guerra", 6 | "sucesso", 7 | "tensão", 8 | "parafernalha", 9 | "soco", 10 | ] 11 | 12 | STATUS = [ 13 | r""" 14 | _____________ 15 | | | 16 | | 17 | | 18 | | 19 | |===================== 20 | """, 21 | r""" 22 | _____________ 23 | | | 24 | | O 25 | | 26 | | 27 | |===================== 28 | """, 29 | r""" 30 | _____________ 31 | | | 32 | | O 33 | | | 34 | | 35 | |===================== 36 | """, 37 | r""" 38 | _____________ 39 | | | 40 | | O 41 | | /| 42 | | 43 | |===================== 44 | """, 45 | r""" 46 | _____________ 47 | | | 48 | | O 49 | | /|\ 50 | | 51 | |===================== 52 | """, 53 | r""" 54 | _____________ 55 | | | 56 | | O 57 | | /|\ 58 | | / 59 | |===================== 60 | """, 61 | r""" 62 | ___________.._______ 63 | | .__________))______| 64 | | | / / || 65 | | |/ / || 66 | | | / ||.-''. 67 | | |/ |/ _ \ 68 | | | || `/,| 69 | | | (\\`_.' 70 | | | .-`--'. 71 | | | /Y . . Y\ 72 | | | // | | \\ 73 | | | // | . | \\ 74 | | | ') | | (` 75 | | | ||'|| 76 | | | || || 77 | | | || || 78 | | | || || 79 | | | / | | \ 80 | ''''''''''|_`-' `-' |'''| 81 | |'|'''''''\ \ ''|'| 82 | | | \ \ | | 83 | : : \ \ : : 84 | . . `' . . 85 | VOCÊ PERDEU, NOOB! 86 | """, 87 | ] 88 | -------------------------------------------------------------------------------- /Encontro13--05-04-2022-projetos-portifolio-quad-mag/quadrado_magico_4x4.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Quadrado mágico: Um quadrado mágico é aquele dividido em linhas e colunas, 7 | com um número em cada posição e no qual a soma das linhas, colunas e diagonais é a mesma. 8 | Por exemplo, veja um quadrado mágico de lado 4, com números de 1 a 16: 9 | 01 05 09 16 10 | 06 07 02 10 11 | 08 03 04 11 12 | 12 15 14 13 13 | Elabore uma função que identifica e mostra na tela todos os quadrados mágicos com as características acima. 14 | Dica: produza todas as combinações possíveis e verifique a soma quando completar cada quadrado. 15 | Usar um vetor (lista) de 1 a 16 parece ser mais simples que usar uma matriz 4x4. 16 | 17 | Extra: Permita que o usuário indique o tamanho do cubo mágico (2x2, 3x3, 4x4, etc.) 18 | """ 19 | 20 | # Sem dicas agora! Tentem elaborar toda a lógica do zero! 21 | -------------------------------------------------------------------------------- /Encontro14--07-04-2022-sorteio-code-war/Sorteio.csv: -------------------------------------------------------------------------------- 1 | 1;Ingrid Teixeira da Silva Alves 2 | 1;Thaylane Stephanie Coelho Santos 3 | 1;Ricardo Yugo Ikedo 4 | 1;Danilson Macedo Perez 5 | 1;Mayara de Andrade Barreto 6 | 2;Francislei Oliveira Brand�o de Sousa 7 | 2;Patricia Del Castanhel Claumann Moro 8 | 2;Laurin Caroline Lopes Avila Paier 9 | 2;Maly Leventhal Aronis 10 | 2;Caio Alves da Silva 11 | 3;Fernanda Pioli da Rosa 12 | 3;Vitor Hugo Martins Ferreira 13 | 3;Tain� Sgobin 14 | 3;Tain� Aparecida Soares Eler 15 | 3;Sthefany Romeiro Bien Monteiro 16 | 4;Raquel Reiner Tavares 17 | 4;B�rbara Mirelli de Oliveira Pinto 18 | 4;Renata Lobo Alves 19 | 4;Flavia Lobo Alves 20 | 4;Juliana Santana da Costa 21 | 5;Anderson esteves de Mac�da 22 | 5;Isadora Silveira de Lima 23 | 5;Larissa Chagas Cordeiro 24 | 5;Lucas Valen�a de �vila Nascimento 25 | 5;Bruna Moraes da Silva 26 | 6;Aline dos Santos Oliveira 27 | 6;Giselly Batista Landim Dantas 28 | 6;Stephanie Custodio Santana 29 | 6;Luisa Maria Horta Maia 30 | 6;Vitor de Oliveira Vieira 31 | 7;Naira Soares Evangelista 32 | 7;Jo�o Victor Pereira Sobreira Vieira 33 | 7;Bruno Ribeiro Barbosa 34 | 7;Monique Yafuso Piquet 35 | 7;Jo�o Victor Maia de Freitas 36 | 8;Ricardo Protta da Silveira 37 | 8;Bruna Pivotto Roncen 38 | 8;Viviane Araujo Vieira 39 | 8;Thais Lima de Oliveira 40 | 8;Caroline Ermogenes Menezes 41 | 9;Lucas Bezerra de Freitas 42 | 9;Agna Souza Santos 43 | 9;Maria Bet�nia de Paiva nunes 44 | 9;Vin�cius Cuozzo Martins Borges 45 | 9;Rafael Pires Paes Leme 46 | 10;Pedro Augusto Santiago Junior 47 | 10;Iara Varj�o Barbosa 48 | 10;Andressa da Conceicao Santana Ribeiro 49 | 10;Rafael Bombarda Oda 50 | 10;Vin�cius Augusto Carneiro 51 | 11;Rodrigo Xavier dos Santos 52 | 11;Cinthia Lopes Saliba Libanio 53 | 11;Talita Pereira de Assis Pontes 54 | 11;Lucas de Jesus Theberge da Rosa 55 | 11;Raquel Rodrigues da Silva Machado 56 | 12;Y�ra Damasceno Ferreira de Vasconcellos 57 | 12;Luna Barros da Silva Gouv�a 58 | 12;Mateus Vasques Ferreira 59 | 12;Paloma Arruda Coutinho 60 | 20;Flavia Fernandes dos Santos 61 | 20;Ludmila Cust�dio Tim�teo 62 | 20;William Machado 63 | 20;Jaqueline Rocha Otero 64 | 20;�ngela Maria Felini 65 | 21;Thiago Wiliam Pires Sousa 66 | 21;Felipe Fontes Vi�ozo 67 | 21;Lucas Vilela 68 | 21;Lyndalee Muniz Pereira Noraes 69 | 21;Marcelo Lopes Valerio 70 | 22;Rafael Kenji Utsunomiya 71 | 22;Camila Rodrgues Costa 72 | 22;Guilherme Felipe Pacheco Braga 73 | 22;Carolina De Lima 74 | 22;Wallery Gon�alves de Oliveira Gomes 75 | 23;Lucas Mattos de Lima Sobral 76 | 23;Luiz Gabriel Macedo da Silva 77 | 23;Igor de Abreu Medeiros 78 | 23;Daniel Salom�o Doretto 79 | 23;Lucas Simoes Alcantara Dantas 80 | 23;Larissa Henriques Evangelista Castro 81 | 30;V�tor Mateus de Brito 82 | 30;Yuri Aoyama da Costa 83 | 30;Igor Gabryell Mendes Melo 84 | 30;Pedro Henrique Prestes Concei��o 85 | 30;Thainara Lessa Furforo 86 | 31;L�gia Pereira Silva de Oliveira 87 | 31;Let�cia Arroyo Torres 88 | 31;Henrique Cezar C�ndido Xavier Ferreira 89 | 31;Lucas Borges Fernandes 90 | 31;Vinicius Miranda Santos 91 | 32;Silvio Pereira Gomes 92 | 32;Aline Patr�cia dos Santos 93 | 32;Daniel Pereira da Concei��o 94 | 32;Jo�o Igor Francisco Rosi 95 | 32;Matheus de Lucena Soares 96 | 33;Hugo Guimar�es Alves 97 | 33;Heitor de Pinho Freitas 98 | 33;Daniel Dutra Badra 99 | 41;Miguel Zaqueu Louren�o Ara�jo 100 | 41;Pedro Henrique Birindiba Batista 101 | 41;Julio Machado Pontes 102 | 41;Jalvo Alef Oliveira Santos 103 | 42;Bruno Tropia Marotta Teixeira dos Santos 104 | 42;Lucas Ramos Krause dos Santos Rocha 105 | 42;Felipe Lira Concei��o de Azevedo 106 | 42;Tamara Barbosa Passos 107 | 42;Gabriel Duarte Rodrigues Bastos 108 | -------------------------------------------------------------------------------- /Encontro14--07-04-2022-sorteio-code-war/quadrado_magico_4x4.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | Enunciado: 5 | Quadrado mágico: Um quadrado mágico é aquele dividido em linhas e colunas, 6 | com um número em cada posição e no qual a soma das linhas, colunas e diagonais é a mesma. 7 | Por exemplo, veja um quadrado de lado 4, com números de 1 a 16: 8 | 01 05 09 16 9 | 06 07 02 10 10 | 08 03 04 11 11 | 12 15 14 13 12 | Elabore uma função que identifica e mostra na tela todos os quadrados mágicos com as características acima. 13 | Dica: produza todas as combinações possíveis e verifique a soma quando completar cada quadrado. 14 | Usar um vetor (lista) de 1 a 16 parece ser mais simples que usar uma matriz 4x4. 15 | Extra: Permita que o usuário indique o tamanho do cubo mágico (2x2, 3x3, 4x4, etc.) 16 | """ 17 | 18 | # Sem dicas agora! Tentem elaborar toda a lógica do zero! 19 | 20 | import itertools 21 | 22 | numeros = (1, 2, 3, 4, 5, 6, 7, 8, 9) 23 | 24 | for c in itertools.permutations(numeros, r=9): 25 | 26 | soma_primeira_linha = c[0] + c[1] + c[2] 27 | soma_segunda_linha = c[3] + c[4] + c[5] 28 | soma_terceira_linha = c[6] + c[7] + c[8] 29 | 30 | soma_primeira_colua = c[0] + c[3] + c[6] 31 | soma_segunda_colua = c[1] + c[4] + c[7] 32 | soma_terceira_colua = c[2] + c[5] + c[8] 33 | 34 | soma_diagonal = c[0] + c[4] + c[8] 35 | soma_segunda_diagonal = c[2] + c[4] + c[6] 36 | 37 | set_somas = set( 38 | [ 39 | soma_primeira_linha, 40 | soma_segunda_linha, 41 | soma_terceira_linha, 42 | soma_primeira_colua, 43 | soma_segunda_colua, 44 | soma_terceira_colua, 45 | soma_diagonal, 46 | soma_segunda_diagonal, 47 | ] 48 | ) 49 | 50 | if (len(set_somas) == 1) and list(set_somas)[0] == 15: 51 | print("Temos um quadrado mágico!") 52 | print(c) 53 | -------------------------------------------------------------------------------- /Encontro14--07-04-2022-sorteio-code-war/sorteio.py: -------------------------------------------------------------------------------- 1 | import csv 2 | from collections import defaultdict 3 | from random import choice 4 | 5 | # 2 equipes completas ganham da stone 6 | # 1 equipe completa ganha da how 7 | # 3 ganham da stone individual 8 | 9 | equipes = defaultdict(list) 10 | 11 | with open("Sorteio.csv", encoding="utf-8") as csvfile: 12 | arquivo = csv.reader(csvfile, delimiter=";", quotechar="|") 13 | for linha in arquivo: 14 | nome_aluno = linha[1].strip().replace(" ", " ") 15 | numero_equipe = linha[0] 16 | equipes[numero_equipe].append(nome_aluno) 17 | 18 | # 1 - 40 -> 2 sorteios Stone 19 | # 1 - 40 -> 1 sorteios How 20 | # 3 pessoas -> 3 brindes individuais da Stone 21 | 22 | # 2 equipes 23 | for _ in range(2): 24 | 25 | print("Sorteio do brinde da Stone!") 26 | 27 | equipe_sorteada = choice(list(equipes.keys())) 28 | pessoas_sorteadas = equipes[equipe_sorteada] 29 | 30 | print(f"A equipe sorteada foi {equipe_sorteada}...") 31 | 32 | for pessoa in pessoas_sorteadas: 33 | print(f"\nParabéns {pessoa}, você ganhou um brinde da Stone!") 34 | 35 | equipes.pop(equipe_sorteada) 36 | print("*" * 60) 37 | 38 | 39 | # 1 equipe 40 | print("Sorteio do brinde da How!") 41 | equipe_sorteada = choice(list(equipes.keys())) 42 | pessoas_sorteadas = equipes[equipe_sorteada] 43 | 44 | print(f"A equipe sorteada foi {equipe_sorteada}...") 45 | 46 | # 3 sorteios individuais 47 | for pessoa in pessoas_sorteadas: 48 | print(f"\nParabéns {pessoa}, você ganhou um brinde da How!") 49 | 50 | equipes.pop(equipe_sorteada) 51 | print("*" * 60) 52 | 53 | pessoas_nao_sorteadas = [] 54 | 55 | for lista_nomes in equipes.values(): 56 | pessoas_nao_sorteadas.extend(lista_nomes) 57 | 58 | print("Sorteio individual do brinde da Stone! \o/") 59 | 60 | # 3 sorteios individuais 61 | for _ in range(3): 62 | 63 | pessoa_sortuda = choice(pessoas_nao_sorteadas) 64 | 65 | pessoa_sortuda_indice = pessoas_nao_sorteadas.index(pessoa_sortuda) 66 | 67 | print(f"Parabéns {pessoa_sortuda}! Você ganhou um brinde individual!") 68 | 69 | pessoas_nao_sorteadas.pop(pessoa_sortuda_indice) 70 | -------------------------------------------------------------------------------- /Encontro14--07-04-2022-sorteio-code-war/sorteio2.py: -------------------------------------------------------------------------------- 1 | from random import randint, seed 2 | 3 | seed(888) 4 | 5 | numeros_sorteados = [] 6 | 7 | for _ in range(18): 8 | n = randint(1, 89) 9 | if n not in numeros_sorteados: 10 | numeros_sorteados.append(n) 11 | 12 | for s in sorted(numeros_sorteados): 13 | print(s) 14 | 15 | # 11 - Henrique César 16 | # 23 - Ricardo Silveira 17 | # 35 - Iara Varjão Barbosa 18 | # 48 - Maly 19 | # 49 - Flávia Fernandes dos Santos 20 | # 50 - Lyndalee 21 | # 51 - Thalita Peireira de Assis Pontes 22 | # 54 - Rafael Pires Paes Leme 23 | # 56 - Lucas Nascimento 24 | # 57 - Pedro Henrique Birindiba 25 | # 64 - Pedro Henrique Prestos Conceição 26 | # 70 - Marcos Antônio Barros Lisboa 27 | # 75 - Anderson Steves de Maceda 28 | # 81 - Heitor de Pinho Freitas 29 | # 82 - Danilson Macedo Perez 30 | 31 | # Sorteio do Léo 32 | # 27 - Lucas Matos de Lima Sobral 33 | # 65 - Marcelo Lopes Valério 34 | # 73 - Eliabe Gustavo Mendes 35 | -------------------------------------------------------------------------------- /Encontros-POO/E15-12-04-2022-introducao/main.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 12/04/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: POO - introdução 6 | """ 7 | 8 | from pessoas import Funcionario 9 | 10 | funcionario1 = Funcionario("João", "Silva", 5000) 11 | 12 | funcionario2 = Funcionario("Henrique", "Alves Junqueira Nogueira Branco", 5000) 13 | 14 | funcionario3 = Funcionario("Sérgio", "Ramos", 4500) 15 | 16 | funcionario1.__salario_inicial = 10000 17 | 18 | print(funcionario1.__salario_inicial) 19 | -------------------------------------------------------------------------------- /Encontros-POO/E15-12-04-2022-introducao/pessoas.py: -------------------------------------------------------------------------------- 1 | class Funcionario: 2 | 3 | aumento_percentual: float = 0.1 4 | 5 | # DOIS UNDERLINES! 6 | # Método construtor! 7 | def __init__(self, nome: str, sobrenome: str, salario_inicial: int): 8 | self.nome: str = nome 9 | self.sobrenome: str = sobrenome 10 | self.__salario_inicial = salario_inicial 11 | self.email = f"{self.nome.lower()}.{self.sobrenome.lower().split()[-1]}@email.com" 12 | 13 | def dar_aumento(self) -> None: 14 | if hasattr(self, "salario_atual"): 15 | self.salario_atual = self.salario_atual * (1 + Funcionario.aumento_percentual) 16 | else: 17 | self.salario_atual = self.__salario_inicial * (1 + Funcionario.aumento_percentual) 18 | -------------------------------------------------------------------------------- /Encontros-POO/E16-14-04-2022-her-pol-encaps/01-funcionarios.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 14/04/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: POO - parte 2 6 | """ 7 | 8 | from pessoas import Funcionario 9 | 10 | funcionario1 = Funcionario("João", "Silva", 5000) 11 | 12 | funcionario2 = Funcionario("Henrique", "Alves Junqueira Nogueira Branco", 5000) 13 | 14 | funcionario3 = Funcionario("Sérgio", "Ramos", 4500) 15 | 16 | funcionario1.dar_aumento() 17 | 18 | print(funcionario1.dar_aumento()) 19 | -------------------------------------------------------------------------------- /Encontros-POO/E16-14-04-2022-her-pol-encaps/02-heranca_polimorfismo_aves.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 14/04/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: Exemplo simples sobre herança e polimorfismo 6 | """ 7 | # Classe mãe Ave 8 | class Ave: 9 | def __init__(self, numero_de_patas, cor, tamanho): 10 | self.numero_de_patas = numero_de_patas 11 | self.cor = cor 12 | self.tamanho = tamanho 13 | 14 | def voar(self): 15 | print("Ave voando!") 16 | 17 | 18 | # Subclasse de Ave: herança! 19 | class Tucano(Ave): 20 | def __init__(self, machando_no_olho): 21 | 22 | # Iniciando os atributos da classe mãe 23 | super().__init__(self, 2, "colorido", "pequeno porte") 24 | 25 | # Atributi específico da classe Tucano 26 | self.tem_machando_no_olho = machando_no_olho 27 | 28 | # Sobrescrevendo o método da classe mãe: polimorfismo! 29 | def voar(self): 30 | print("Voando como um tucano!") 31 | 32 | 33 | # Criando um objeto da classe Ave 34 | ave_generica = Ave(2, "preta", "grande porte") 35 | 36 | # Criando um objeto da classe Tucano 37 | tucano1 = Tucano(True) 38 | 39 | # Método `voar`do objeto ave_generica do tipo Ave 40 | ave_generica.voar() 41 | 42 | # Método `voar` do objeto tucano1 da classe Tucano 43 | tucano1.voar() 44 | 45 | # Atributo `tem_machando_no_olho` do objeto tucano1 da classe Tucano 46 | print(tucano1.tem_machando_no_olho) 47 | -------------------------------------------------------------------------------- /Encontros-POO/E16-14-04-2022-her-pol-encaps/impostos.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 14/04/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: Encapsulamento - Venda e Imposto 6 | """ 7 | 8 | 9 | class Imposto: 10 | def calcula(self): 11 | pass 12 | 13 | # DOIS UNDERLINES! 14 | def __str__(self): 15 | return "Print da classe imposto" 16 | 17 | def __repr__(self): 18 | return "Representação da classe imposto" 19 | 20 | 21 | class ICMS(Imposto): 22 | def calcula(self, valor_bruto): 23 | return valor_bruto * (1 - 0.05) 24 | 25 | 26 | class IPI(Imposto): 27 | def calcula(self, valor_bruto): 28 | return valor_bruto * (1 - 0.15) 29 | 30 | 31 | class ISS(Imposto): 32 | def calcula(self, valor_bruto): 33 | return valor_bruto * (1 - 0.10) 34 | 35 | 36 | class COFINS(Imposto): 37 | def calcula(self, valor_bruto): 38 | return valor_bruto * (1 - 0.03) 39 | -------------------------------------------------------------------------------- /Encontros-POO/E16-14-04-2022-her-pol-encaps/pessoas.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 14/04/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: Atributos privados do objeto e @property 6 | """ 7 | 8 | 9 | class Funcionario: 10 | 11 | aumento_percentual: float = 0.1 12 | 13 | # DOIS UNDERLINES! 14 | # Método construtor! 15 | def __init__(self, nome: str, sobrenome: str, salario_inicial: int): 16 | self.nome: str = nome 17 | self.sobrenome: str = sobrenome 18 | self._salario_inicial = salario_inicial 19 | self.email = f"{self.nome.lower()}.{self.sobrenome.lower().split()[-1]}@email.com" 20 | 21 | # Criando uma propriedade chamada `salario_inicial` 22 | # A ideia é permitir o acesso de leitura, mas não de modificação, ao atributo privado `_salario_inicial` 23 | @property 24 | def salario_inicial(self): 25 | return self._salario_inicial 26 | 27 | def dar_aumento(self) -> None: 28 | """Amplia o salário do funcionário em 10%. O novo salario será definido no atributo `salario_atual`""" 29 | if hasattr(self, "salario_atual"): 30 | self.salario_atual = self.salario_atual * (1 + Funcionario.aumento_percentual) 31 | else: 32 | self.salario_atual = self._salario_inicial * (1 + Funcionario.aumento_percentual) 33 | -------------------------------------------------------------------------------- /Encontros-POO/E16-14-04-2022-her-pol-encaps/vendas.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 14/04/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: Encapsulamento - Venda e Imposto 6 | """ 7 | 8 | from impostos import COFINS, ICMS, IPI, ISS, Imposto 9 | 10 | 11 | class Venda: 12 | def __init__(self, valor_bruto: float, imp: Imposto): 13 | self.valor_bruto = valor_bruto 14 | self.tributo = imp 15 | 16 | def calcula_valor_liquido(self): 17 | return self.tributo.calcula(self.valor_bruto) 18 | 19 | 20 | v1 = Venda(10000.00, ICMS()) 21 | v2 = Venda(1000, IPI()) 22 | v3 = Venda(124091, ISS()) 23 | v4 = Venda(1231, COFINS()) 24 | 25 | print(v1.calcula_valor_liquido()) 26 | -------------------------------------------------------------------------------- /Encontros-POO/E17-19-04-2022-comparacao-obj/comparacao_classes.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 19/04/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: POO - parte 3 - comparação entre objetos de classes próprias 6 | """ 7 | 8 | 9 | class Employee: 10 | def __init__(self, name, salary) -> None: 11 | self.name = name 12 | self.salary = salary 13 | 14 | def __eq__(self, obj) -> bool: 15 | if (self.name == obj.name) and (self.salary == obj.salary): 16 | return True 17 | return False 18 | 19 | # greater than or equal (maior ou igual que) 20 | def __ge__(self, other) -> bool: 21 | return self.salary >= other.salary 22 | 23 | # less than or equal (menor ou igual que) 24 | def __le__(self, other) -> bool: 25 | return self.salary <= other.salary 26 | 27 | # greater than (maior que) 28 | def __gt__(self, other) -> bool: 29 | return self.salary > other.salary 30 | 31 | # less than (menor que) 32 | def __lt__(self, other) -> bool: 33 | return self.salary < other.salary 34 | 35 | 36 | emp1 = Employee("Joao", 2000) 37 | emp2 = Employee("Joao", 5000) 38 | 39 | print(emp1 == emp2) 40 | print(emp1 >= emp2) 41 | print(emp1 <= emp2) 42 | print(emp1 > emp2) 43 | print(emp1 < emp2) 44 | -------------------------------------------------------------------------------- /Encontros-POO/E17-19-04-2022-comparacao-obj/diuvida/main.py: -------------------------------------------------------------------------------- 1 | from one_underscore import * 2 | 3 | ex1 = One() 4 | print(ex1._private_attr) 5 | 6 | # _private_function() 7 | 8 | # --- 9 | 10 | # Usar __ em herança (evitar conflito entre os atributos das classes) 11 | from two_underscores import * 12 | 13 | d2 = TwoChild() 14 | print(d2.__private_attr) 15 | # print(dir(d2)) 16 | -------------------------------------------------------------------------------- /Encontros-POO/E17-19-04-2022-comparacao-obj/diuvida/one_underscore.py: -------------------------------------------------------------------------------- 1 | class One: 2 | def __init__(self): 3 | self.public_attr = 10 4 | self._private_attr = 100 5 | 6 | 7 | def _private_function(): 8 | print("Você não deveria mexer aqui!") 9 | -------------------------------------------------------------------------------- /Encontros-POO/E17-19-04-2022-comparacao-obj/diuvida/two_underscores.py: -------------------------------------------------------------------------------- 1 | class Two: 2 | def __init__(self): 3 | self.__private_attr = 20 4 | 5 | 6 | class TwoChild(Two): 7 | def __init__(self): 8 | super().__init__() 9 | -------------------------------------------------------------------------------- /Encontros-POO/E17-19-04-2022-comparacao-obj/erros_customizados_heranca.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Data: 19/04/2022 4 | Autor: Henrique Junqueira Branco 5 | Enunciado: POO - parte 3 6 | """ 7 | 8 | a = 1 9 | b = 0 10 | 11 | try: 12 | print(a / b) 13 | except ZeroDivisionError: 14 | print("O código continua normalmente!!!") 15 | 16 | # Má prática except: pass 17 | 18 | 19 | class SalaryNotInRangeError(Exception): 20 | """Exceção gerada quando o salário não está dentro da faixa especificada. 21 | 22 | Attributes: 23 | salary (int): salário que gerou o erro 24 | message (str): mensagem ao usuário 25 | """ 26 | 27 | def __init__(self, salary, message="Salário não está na faixa especificada (5000, 15000)"): 28 | self.salary = salary 29 | self.message = message 30 | super().__init__(self.message) 31 | 32 | def __str__(self): 33 | return f"{self.salary} -> {self.message}" 34 | 35 | 36 | salary = int(input("Digite um salário: ")) 37 | if not 5000 < salary < 15000: 38 | raise SalaryNotInRangeError(salary) 39 | -------------------------------------------------------------------------------- /Exercícios/00-desafios.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/Exercícios/00-desafios.pdf -------------------------------------------------------------------------------- /Exercícios/01-int-float.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/Exercícios/01-int-float.pdf -------------------------------------------------------------------------------- /Exercícios/02-listas.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/Exercícios/02-listas.pdf -------------------------------------------------------------------------------- /Exercícios/03-dicts-sets.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/Exercícios/03-dicts-sets.pdf -------------------------------------------------------------------------------- /Exercícios/04-if-elif-else.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/Exercícios/04-if-elif-else.pdf -------------------------------------------------------------------------------- /Exercícios/05-laço-repetição.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/Exercícios/05-laço-repetição.pdf -------------------------------------------------------------------------------- /Exercícios/06-funções.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/Exercícios/06-funções.pdf -------------------------------------------------------------------------------- /Exercícios/07-poo.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/Exercícios/07-poo.pdf -------------------------------------------------------------------------------- /Exercícios/Gabaritos/01-int-float/exercicio01.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Faça um programa que receba dois números inteiros do usuário, A e B e imprima na tela as seguintes operações: 7 | 1) A soma de A e B; 8 | 2) A diferença quando se subtrai B de A; 9 | 3) O produto (multiplicação) entre A e B; 10 | 4) O quociente (parte inteira da divisão) quando se divide A por B; 11 | 5) O resto da divisão entre A e B; 12 | 6) O resultado de log10 de A; 13 | 7) O resultado de A elevado a B; 14 | """ 15 | 16 | from math import log10 17 | 18 | A = int(input("Digite o número A: ")) 19 | 20 | B = int(input("Digite o número B: ")) 21 | 22 | print(f"1) {A + B}") 23 | 24 | print(f"2) {B - A}") 25 | 26 | print(f"3) {A * B}") 27 | 28 | print(f"4) {A // B}") 29 | 30 | print(f"5) {A % B}") 31 | 32 | print(f"6) {log10(A)}") 33 | 34 | print(f"7) {A ^ B}") -------------------------------------------------------------------------------- /Exercícios/Gabaritos/01-int-float/exercicio02.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Faça um programa que receba a base e altura de um triângulo e imprima a área dele. 7 | """ 8 | 9 | base = float(input("Digite a base do triângulo: ")) 10 | 11 | altura = float(input("Digite a altura do triângulo: ")) 12 | 13 | # Fórmula no enunciado (arquivo word) 14 | area = base * altura / 2 15 | 16 | print(f"A área do triàngulo é: {area}") 17 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/01-int-float/exercicio03.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | No exercício 02 você calculou a área de um triângulo a partir da sua base e altura. Faça um programa que receba os 3 lados de um triângulo (s1, s2 e s3) e calcule sua área. 7 | Compare a resposta com o exercício acima, dada das mesmas entradas. 8 | Os resultados devem ser idênticos. 9 | """ 10 | 11 | s1 = float(input("Digite o primeiro lado do triângulo: ")) 12 | 13 | s2 = float(input("Digite o segundo lado do triângulo: ")) 14 | 15 | s3 = float(input("Digite o terceiro lado do triângulo: ")) 16 | 17 | # Fórmula no enunciado (arquivo word) 18 | s = (s1 + s2 + s3) / 2 19 | 20 | # Fórmula no enunciado (arquivo word) 21 | area = (s * (s - s1) * (s - s2) * (s - s3)) ** (1 / 2) 22 | 23 | print(f"A área do triângulo é {area}") 24 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/01-int-float/exercicio04.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Faça um programa que receba do usuário seu peso em kg e altura em metros e imprima o Índice de Massa Corporal (IMC) do usuário. 7 | """ 8 | 9 | peso = float(input("Digite o seu peso em kg: ")) 10 | 11 | altura = float(input("Digite a sua altura em metros: ")) 12 | 13 | # Fórmula no enunciado (arquivo word) 14 | imc = peso / (altura**2) 15 | 16 | print(f"O IMC calculado é {imc}") 17 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/01-int-float/exercicio05.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Escreva um programa que leia do usuário um número de 4 dígitos e imprima a soma destes dígitos. 7 | Exemplo, se o usuário digitar 3141 seu programa deverá imprimir na tela 3+1+4+1=9. 8 | """ 9 | 10 | numero = input("Digite um número de 4 dígitos: ") 11 | 12 | # Enquanto a entrada não tiver 4 digitos ou todos eles não forem numéricos: 13 | while len(numero) != 4 or not numero.isnumeric(): 14 | 15 | # Solicita novamente um número ao usuário 16 | numero = input("Número inválido! Digite um número válido de 4 dígitos: ") 17 | 18 | soma = int(numero[0]) + int(numero[1]) + int(numero[2]) + int(numero[3]) 19 | 20 | print(f"{numero[0]}+{numero[1]}+{numero[2]}+{numero[3]}={soma}") 21 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/02-listas/exercicio01.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Crie uma variável do tipo lista com 5 elementos (você escolhe quais serão). Imprima na tela o elemento e sua respectiva posição na lista. 7 | """ 8 | 9 | lst = [1, 3, 6, "Uma string qualquer", [7, 7, 7]] 10 | 11 | # Laço para iterar pelas posições e elementos da lista 12 | # Link da documentação oficial para função enumerate: 13 | # https://docs.python.org/3/library/functions.html#enumerate 14 | 15 | for posicao, elemento in enumerate(lst): 16 | print(f"Elemento {elemento} na posição {posicao}") 17 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/02-listas/exercicio02.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Crie uma lista com 10 elementos (você escolhe quais serão) e imprima a lista na ordem inversa. 7 | """ 8 | 9 | lst = [1, 3, 6, "Uma string qualquer", [7, 7, 7]] 10 | 11 | # Inverte a lista. A partir daqui a lista estará invertida! 12 | lst.reverse() 13 | 14 | print(lst) 15 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/02-listas/exercicio03.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Crie uma lista com 6 números inteiros. Imprima o maior, o menor e suas respectivas posições. 7 | """ 8 | 9 | lst = [5, 4, 6, 8, 3, 4] 10 | 11 | maior = max(lst) 12 | menor = min(lst) 13 | 14 | posicao_maior = lst.index(maior) 15 | posicao_menor = lst.index(menor) 16 | 17 | print(f"O maior elemento é o {maior} e está na posição {posicao_maior}") 18 | print(f"O menor elemento é o {menor} e está na posição {posicao_menor}") 19 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/02-listas/exercicio04.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Faça um programa que receba a temperatura média de cada mês do ano e armazene-as em uma lista. 7 | Em seguida, calcule a média anual das temperaturas e mostre a média calculada juntamente com todas as temperaturas acima da média anual, e em que mês elas ocorreram (mostrar o mês por extenso) 8 | """ 9 | 10 | meses = ( 11 | "janeiro", 12 | "fevereiro", 13 | "março", 14 | "abril", 15 | "maio", 16 | "junho", 17 | "julho", 18 | "agosto", 19 | "setembro", 20 | "outubro", 21 | "novembro", 22 | "dezembro", 23 | ) 24 | 25 | 26 | temperaturas = [] 27 | 28 | # Laço de repetição para ler as temperatudas dos meses 29 | for mes in meses: 30 | 31 | # Lê a temperatura de cada mês 32 | temperatura = float(input(f"Digite a temperatura (°C) do mês de {mes}: ")) 33 | 34 | # Adiciona na lista 35 | temperaturas.append(temperatura) 36 | 37 | # Calcula a média anual das temperaturas, arredondando para 2 casas decimais 38 | media_temp_anual = round(sum(temperaturas) / len(temperaturas), 2) 39 | 40 | print(f"Meses com a temperatura acima da média anual de {media_temp_anual}°C:") 41 | 42 | # Laço de repetição para percorrer todas as temperaturas e suas posições na lista 43 | # Link da documentação oficial para função enumerate: 44 | # https://docs.python.org/3/library/functions.html#enumerate 45 | for indice, temp in enumerate(temperaturas): 46 | 47 | # Checagem se a temperatura é maior do que a média anual 48 | if temp > media_temp_anual: 49 | 50 | # Os índices começam por 0! 51 | # Para fazer com que os índices correspondam ao número dos meses, soma-se 1 ao índice 52 | # Janeiro no índice 0 é o mês 1 53 | # Fevereiro no índice 1 é o mês 2 54 | # e assim por diante... 55 | print(f"{indice+1} - {meses[indice]}") 56 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/02-listas/exercicio05.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Dada a seguinte lista lst = [10, 20, [300, 400, [5000, 6000], 500], 30, 40] adicione o elemento 7000 logo após o elemento 6000 na lista. 7 | """ 8 | 9 | lst = [10, 20, [300, 400, [5000, 6000], 500], 30, 40] 10 | 11 | # Lembre-se: a indexação começa por 0! 12 | # Passo 1. Primeiro acessamos o terceiro elemento (índice 2) da lista, que é o [300, 400, [5000, 6000], 500] 13 | # Passo 2. Da lista do passo 1, selecionamos o terceiro elemento (índice 2) dessa lista, que é [5000, 6000] 14 | # Passo 3. Finalmente, adicionamos o elemento 7000 à lista do passo 2 15 | lst[2][2].append(7000) 16 | 17 | print(lst) 18 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/02-listas/exercicio06.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Faça um programa que remova strings vazias de uma lista de strings. 7 | 8 | Exemplo: 9 | dada a lista ["Olá", "", "meu", "nome", "", "é", "facilitador", ""] a saída deve ser 10 | >> ["Olá", "meu", "nome", "é", "facilitador"] 11 | """ 12 | 13 | lst = ["Olá", "", "meu", "nome", "", "é", "facilitador", ""] 14 | 15 | # Inicializa outra lista vazia, onde vamos colocar as strings que não são vazias 16 | lst_sem_str_vazias = [] 17 | 18 | # Laço para percorrer todas as palavras da lista, incluindo as strings vazias 19 | for palavra in lst: 20 | 21 | # Se a string não for vazia (sim, isso é uma condição!) 22 | if palavra: 23 | 24 | # Adiciona a palavra à lista de strings não vazias 25 | lst_sem_str_vazias.append(palavra) 26 | 27 | print(lst_sem_str_vazias) 28 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/02-listas/exercicio07.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Dada a lista de strings [“1”, “7”, “99”, “15”] construa um programa que converte todos os elementos desta lista para inteiro. 7 | 8 | Faça também o inverso, dada a mesma lista só que agora de elementos inteiros, converta todos os elementos para int. 9 | """ 10 | ### PARTE N° 1 - CONVERTER LISTA DE STR PARA INT 11 | 12 | # Solução n° 1 - usando a função `map` 13 | # Obs: mais difícli de fazer, escreve menos código, precisa pesquisar mais do que o facilitador passou nos encontros...) 14 | 15 | lista_string = ["1", "7", "99", "15"] 16 | 17 | # Usamos a função `map` que aplica uma função, `int` no caso, à todos os elementos da lista 18 | # A função `map` retorna um objeto do tipo `map`, transformamos esse objeto para lista com `list` 19 | # Documentação oficial da função `map`: https://docs.python.org/3/library/functions.html#map 20 | lista_string_convertida_1 = list(map(int, lista_string)) 21 | 22 | print( 23 | f"Lista de strings convertidas para inteiros - solução número 1: {lista_string_convertida_1}" 24 | ) 25 | 26 | # Forma n° 2: usando loop for 27 | 28 | lista_string_convertida_2 = [] 29 | 30 | for elemento in lista_string: 31 | 32 | # Transforma o elemento para inteiro 33 | elemento_int = int(elemento) 34 | 35 | # Adiciona na lista criada 36 | lista_string_convertida_2.append(elemento_int) 37 | 38 | print( 39 | f"Lista de strings convertidas para inteiros - solução número 2: {lista_string_convertida_2}" 40 | ) 41 | 42 | ### PARTE N° 2 - CONVERTER LISTA DE INT PARA STR 43 | 44 | # Usando somente a solução n° 2: 45 | 46 | lista_int = [1, 7, 99, 15] 47 | 48 | # Usamos a função `map` que aplica uma função, `str` no caso, à todos os elementos da lista 49 | # A função `map` retorna um objeto do tipo `map`, transformamos esse objeto para lista com `list` 50 | # Documentação oficial da função `map`: https://docs.python.org/3/library/functions.html#map 51 | lista_int_convertida_1 = list(map(str, lista_int)) 52 | 53 | print(f"Lista de inteiros convertidos para string - solução número 1: {lista_int_convertida_1}") 54 | 55 | # Experimentem fazer com a solução n° 2 também, é mais simples porém mais trabalhosa! 56 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/03-dicts-sets/exercicio01.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Faça um programa que responda as seguintes perguntas: 7 | 8 | 1. Quantos alunos estão matriculados na escola, no total? 9 | 2. Quantos e quais estão matriculados APENAS em INGLES? 10 | 3. Quantos e quais estão matriculados APENAS em FRANCES? 11 | 4. Quantos e quais estão matriculados EM AMBOS os cursos? 12 | 5. Quantos alunos estão matriculados somente em francês ou somente em inglês, mas não em ambos os cursos? 13 | 14 | """ 15 | 16 | alunos_ingles = { 17 | "João Alves dos Santos", 18 | "Maria Magalhães", 19 | "Antônio da Silva Ferreira", 20 | "José Júnior Jarbas", 21 | "Henrique da Silva Sauro", 22 | "Joaquina Ferreira da Silva", 23 | "Fabiana Aparecida Bianco", 24 | "Marrone Gutierres", 25 | "Carlos Magno Farad", 26 | "Antônio da Silva Júnior Amaral", 27 | } 28 | 29 | alunos_frances = { 30 | "João Alves dos Santos", 31 | "Antônio da Silva Ferreira", 32 | "Fernanda Abdala Mohamed", 33 | "Abner Mignon Alib", 34 | "Alisson Figueiredo", 35 | "Henrique da Silva Sauro", 36 | "Maria Magalhães", 37 | "Marrone Gutierres", 38 | "Joaquina Ferreira da Silva", 39 | } 40 | 41 | print(f"Resp 1) - {len(alunos_ingles.union(alunos_frances))}", end="\n\n") 42 | 43 | print(f"Resp 2) - {len(alunos_ingles) - len(alunos_frances)}. Os alunos são: {alunos_ingles - alunos_frances}", end="\n\n") 44 | 45 | print(f"Resp 3) - {len(alunos_frances) - len(alunos_ingles)}. Os alunos são: {alunos_frances - alunos_ingles}", end="\n\n") 46 | 47 | print( 48 | f"Resp 4) - {len(alunos_ingles.intersection(alunos_frances))}. Os alunos são: {alunos_ingles.intersection(alunos_frances)}", 49 | end="\n\n", 50 | ) 51 | 52 | print(f"Resp 5) - {len(alunos_ingles.symmetric_difference(alunos_frances))}") 53 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/03-dicts-sets/exercicio02.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Faça um programa que lê uma sigla de um estado do usuário e imprime na tela o nome completo do estado. 7 | """ 8 | 9 | estado_sigla = { 10 | "RR": "Roraima", 11 | "AP": "Amapá", 12 | "AM": "Amazonas", 13 | "PA": "Pará", 14 | "AC": "Acre", 15 | "RO": "Rondônia", 16 | "TO": "Tocantins", 17 | "MA": "Maranhão", 18 | "PI": "Piauí", 19 | "CE": "Ceará", 20 | "RN": "Rio Grande do Norte", 21 | "PB": "Paraíba", 22 | "PE": "Pernambuco", 23 | "AL": "Alagoas", 24 | "SE": "Sergipe", 25 | "BA": "Bahia", 26 | "MT": "Mato Grosso", 27 | "DF": "Distrito Federal", 28 | "GO": "Goiás", 29 | "MS": "Mato Grosso do Sul", 30 | "MG": "Minas Gerais", 31 | "ES": "Espírito Santo", 32 | "RJ": "Rio de Janeiro", 33 | "SP": "São Paulo", 34 | "PR": "Paraná", 35 | "SC": "Santa Catarina", 36 | "RS": "Rio Grande do sul", 37 | } 38 | 39 | sigla = input("Digite uma sigla: ") 40 | 41 | if sigla in estado_sigla: 42 | print(f"O nome completo do estado é {estado_sigla[sigla]}") 43 | else: 44 | print("Sigla inválida!") 45 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/03-dicts-sets/exercicio03.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Faça um programa que ordene um dicionário por seus valores 7 | """ 8 | 9 | dict_to_order = {"matemática": 81, "física": 83, "química": 87} 10 | 11 | ### Explicação! 12 | # Usei a função `sorted` para ordenar nosso dicionário passando algun argumentos extras 13 | # Link da documentação oficial da função `sorted`: https://docs.python.org/3/library/functions.html#sorted 14 | 15 | # dict_to_order.items() -> retorna uma lista de tuplas com chaves e valores de um dicionário: [("matemática", 81), ("física", 83), ("química", 87)] 16 | # O argumento `key` precisa ser uma função (veja na documentação oficial). 17 | # Para esse argumento usei uma função anônima lambda que faz o seguinte: dado uma tupla, retorna o segundo valor dela (índice 1) 18 | # Obs: lembre-se que a indexação começa por zero, então o índice 1 é o segundo valor, que refere-se aos valores do dicionário 19 | 20 | # Basicamente o argumento `key` está nos dizendo que devemos ordenar pelos segundos elementos das tuplas de chave-valor! 21 | # Usamos o argumento `reverse=True` para definir a ordem decrescente 22 | 23 | # O resultado disso tudo é uma lista de tuplas ordenadas pelo segundo elemento (valor do dicionário) 24 | # [("química", 87), ("física", 83), ("matemática", 81)] 25 | 26 | # Por fim, transformamos essa lista de tuplas de volta em um dicionário! o/ 27 | 28 | ordered_dict = dict(sorted(dict_to_order.items(), key=lambda tupla: tupla[1], reverse=True)) 29 | 30 | print(ordered_dict) 31 | 32 | # PS: esse foi difícil, não foi? =( 33 | # Eu sei, mas estamos aqui para ajudar você a seguir em frente!! 34 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/03-dicts-sets/exercicio04.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Escreva um programa para encontrar o tamanho do comprimento das strings nos valores de dicionário 7 | """ 8 | 9 | entrada = {1: "vermelho", 2: "azul", 3: "marrom"} 10 | 11 | saida = dict() 12 | 13 | for chave, valor in entrada.items(): 14 | saida[chave] = len(valor) 15 | 16 | print(saida) 17 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/03-dicts-sets/exercicio05.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Faça um programa que encontre as notas mínimas e máximas de um dicionário, e imprima-os na tela com as suas respectivas chaves. 7 | """ 8 | 9 | entrada = {"Theodoro": 20, "Márcia": 50, "Júnior": 80} 10 | 11 | # Coletando todos os valores do dicionário e transformando-os em uma lista 12 | valores = list(entrada.values()) 13 | 14 | # Valores máximo e mínimo da lista 15 | valor_max = max(valores) 16 | valor_min = min(valores) 17 | 18 | # Índices (posições) máximo e mínimo dos respectivos valores 19 | indice_max = valores.index(valor_max) 20 | indice_min = valores.index(valor_min) 21 | 22 | # A partir do índice, conseguimos extrair o nome transformando as chaves dos dicionários em uma lista 23 | # Passo a passo de list(entrada.keys())[indice_max] 24 | # entrada.keys() -> retorna um objeto keys a partir do dicionário 25 | # transformamos esse objeto em lista -> list(entrada.keys()) 26 | # da lista de nomes, coletamos o índice correspondente aos valores máximos e mínimos 27 | print(f"Nota máxima -> {list(entrada.keys())[indice_max]}: {valor_max}") 28 | print(f"Nota mínima -> {list(entrada.keys())[indice_min]}: {valor_min}") 29 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/04-if-else-elif/exercicio01.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Escreva um programa que diga se um número dado pelo usuário é par ou ímpar. 7 | """ 8 | 9 | numero = int(input("Digite um número: ")) 10 | 11 | # Conceito de número par: se o resto da divisão por 2 for zero, então é par. Caso contrário, é ímpar 12 | if numero % 2 == 0: 13 | print(f"O número {numero} é par.") 14 | else: 15 | print(f"O número {numero} é ímpar.") 16 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/04-if-else-elif/exercicio02.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Escreva um programa que receba dois números e imprima na tela se o primeiro é divisível pelo segundo. 7 | """ 8 | 9 | A = int(input("Digite o primeiro número: ")) 10 | 11 | B = int(input("Digite o segundo número: ")) 12 | 13 | if A % B == 0: 14 | print(f"{A} é divisível por {B}") 15 | else: 16 | print(f"{A} não é divisível por {B}") 17 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/04-if-else-elif/exercicio03.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Escreva um programa que leia um valor de nível sonoro do usuário em decibéis. 7 | Se o valor for um dos que estão na tabela, o programa deve retornar aquele barulho. 8 | Caso o número esteja entre algum dos valores da tabela, o programa deve dizer entre quais barulhos o valor digitado está. 9 | Seu programa deve informar também quando o valor for menor que o ruído mínimo da tabela e maior que ruído máximo. 10 | 11 | Obs: tabela no enunciado do exercício 12 | """ 13 | 14 | db = int(input("Digite um valor em decibéis (dB): ")) 15 | 16 | if db == 130: 17 | print("Valor sonoro de uma britadeira.") 18 | elif 106 < db < 130: 19 | print("Valor sonoro entre britadeira e cortador de grama.") 20 | elif db == 106: 21 | print("Valor sonoro de um cortador de grama.") 22 | elif 70 < db < 106: 23 | print("Valor sonoro entre cortador de grama e despertador.") 24 | elif db == 70: 25 | print("Valor sonoro de um despertador.") 26 | elif 40 < db < 70: 27 | print("Valor sonoro entre despertador e cômodo silencioso.") 28 | elif db == 70: 29 | print("Valor sonoro de um cômodo silencioso.") 30 | elif db < 70: 31 | print("Valor sonoro abaixo de um cômodo silencioso.") 32 | else: 33 | print("Valor sonoro acima de uma britadeira.") 34 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/04-if-else-elif/exercicio04.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Faça um programa que imprima na tela se um dado ano é bissexto ou não de acordo com as regras na ordem abaixo: 7 | 8 | 1. Um ano que é divisível por 400 é bissexto. 9 | 2. Dos anos que não entram na regra 1, se o ano for divisível por 100 então ele não é bissexto. 10 | 3. Dos anos que não entram na regra 2, se o ano for divisível por 4 então ele é um ano bissexto. 11 | 4. Todos os outros anos não são bissextos 12 | """ 13 | 14 | ano = int(input("Digite um ano com 4 digitos: ")) 15 | 16 | if ano % 400 == 0: 17 | eh_bissexto = True 18 | 19 | elif ano % 100 == 0: 20 | eh_bissexto = False 21 | 22 | elif ano % 4 == 0: 23 | eh_bissexto = True 24 | 25 | else: 26 | eh_bissexto = False 27 | 28 | print(f"{ano} é bissexto? Resp: {eh_bissexto}") 29 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/04-if-else-elif/exercicio05.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Escreva um programa que receba uma string e diga se ela tem o formato de uma placa veicular brasileira (no formato antigo) com três letras, um traço e quatro números. 7 | Exemplos: 8 | • Dada a entrada ABT-1234 o programa deveria exibir True 9 | • Dada a entrada JKL9999 o programa deveria exibir False 10 | • Qualquer outra entrada que fuja do padrão de 3 letras, um traço e quatro números, o programa deverá exibir False 11 | """ 12 | 13 | # Documentação sobre fatiamento de sequencias: https://python-reference.readthedocs.io/en/latest/docs/brackets/slicing.html 14 | # Documentação do método .isalpha() de strings: https://docs.python.org/3/library/stdtypes.html#str.isalpha 15 | # Documentação do método .isupper() de strings: https://docs.python.org/3/library/stdtypes.html#str.isupper 16 | # Documentação do método .isdigit() de strings: https://docs.python.org/3/library/stdtypes.html#str.isdigit 17 | 18 | placa = input("Digite uma placa: ") 19 | 20 | # Validação se a placa tem 8 caracteres (o traço conta!) 21 | if len(placa) != 8: 22 | placa_valida = False 23 | 24 | # Se a placa tiver 8 caracteres, faremos outras validações 25 | else: 26 | # Aqui separamos apenas as possíveis letras da placa 27 | possiveis_letras = placa[:3] 28 | 29 | # ... e aqui os possíveis números 30 | possiveis_numeros = placa[-4:] 31 | 32 | # e até o caracter traço (-) 33 | traco = placa[3] 34 | 35 | if ( 36 | # Todas as possíveis letras pertencem ao alfabeto? São letras mesmo? 37 | possiveis_letras.isalpha() 38 | # ... e estão em maiúscula? 39 | and possiveis_letras.isupper() 40 | # ... e os possíveis números são digitos de 0 a 9? 41 | and possiveis_numeros.isdigit() 42 | # ... e o traço é mesmo um traço? Poderia ser qualquer outro caracter, não? 43 | and traco == "-" 44 | ): 45 | # Confirmando todas as hipóteses acima, então a placa é válida! 46 | placa_valida = True 47 | 48 | else: 49 | # Se alguma das hipóteses não for válida, então a placa inteira náo é válida 50 | placa_valida = False 51 | 52 | print(f"A placa {placa} é válida? Resp: {placa_valida}") 53 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/05-laço-repetição/exercicio01.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Neste exercício, você criará um programa que calcula a média de uma coleção de valores inseridos pelo usuário e imprime-a na tela. 7 | O usuário digitará 0 como um valor para indicar que nenhum outro valor será fornecido. 8 | Seu programa deve exibir uma mensagem de erro se o primeiro valor inserido pelo usuário for 0. 9 | Atenção! 10 | Como o 0 é um valor de condição de parada, ele não deve entrar no cálculo da média! 11 | """ 12 | 13 | lista_valores = [] 14 | 15 | while 0 not in lista_valores: 16 | valor = float(input("Digite um valor (ou digite 0 para encerrar a entrada de valores): ")) 17 | 18 | if valor != 0: 19 | lista_valores.append(valor) 20 | else: 21 | break 22 | 23 | if not lista_valores: 24 | print("Não encontrei nenhum valor na lista!") 25 | 26 | else: 27 | print(f"A média dos valores calculados é: {sum(lista_valores) / len(lista_valores)}") 28 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/05-laço-repetição/exercicio02.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Escreva um programa que exiba uma tabela de conversão de temperatura para graus Celsius e graus Fahrenheit. 7 | A tabela deve incluir linhas para todas as temperaturas entre 0 e 100 graus Celsius que são múltiplos de 10 graus Celsius. 8 | Dê um título apropriado para cada coluna. 9 | A fórmula para converter entre graus Celsius e graus Fahrenheit podem ser encontrados na Internet (faz parte do exercício pesquisar!) 10 | """ 11 | 12 | print("°C -> °F") 13 | for temp_celsius in range(10, 101, 10): 14 | temp_fahrenheit = int(temp_celsius * 9 / 5 + 32) 15 | print(f"{temp_celsius} -> {temp_fahrenheit}") 16 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/05-laço-repetição/exercicio03.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Um determinado zoológico cobra a entrada com base na idade do visitante. 7 | Os visitantes com 2 anos de idade ou menos não pagam para entrar. 8 | Crianças entre 3 e 12 anos custa R$14,00. 9 | Idosos com 65 anos ou mais custam R$18,00. 10 | A entrada para todos os outros visitantes é de R$23,00. 11 | Crie um programa que comece lendo do usuário as idades de todos os visitantes de um determinado grupo, com uma idade inserida em cada linha. 12 | O usuário digitará uma linha em branco para indicam que não há mais visitantes no grupo. 13 | Em seguida, seu programa deve exibir o custo de admissão para o grupo com uma mensagem apropriada. 14 | O custo deve ser exibido usando duas casas decimais. 15 | """ 16 | 17 | continuar = True 18 | 19 | preco_final = 0.0 20 | 21 | print("Digite as idades para adicionar integrantes ao grupo...") 22 | print("... ou pressione enter para deixar em branco e encerrar!") 23 | 24 | while continuar: 25 | idade = input("Digite uma idade para continuar: ") 26 | 27 | if not idade: 28 | continuar = False 29 | 30 | else: 31 | idade = int(idade) 32 | 33 | if 3 <= idade <= 12: 34 | preco_final += preco_final + 14 35 | elif 13 <= idade <= 64: 36 | preco_final += preco_final + 23 37 | elif 65 <= idade: 38 | preco_final += preco_final + 18 39 | 40 | print(f"O preço final do grupo é R${preco_final:.2f}") 41 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/05-laço-repetição/exercicio04.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Uma aproximação para o valor de pi pode ser calculado a partir da fórmula abaixo (uma série infinita): 7 | 8 | pi≈3+4/2x3x4-4/4x5x6+4/6x7x8-4/8x9x10+4/10x11x12-4/12x13x14+⋯ 9 | 10 | Escreva um programa que calcule o número pi com 15 aproximações. 11 | A primeira aproximação deve considerar apenas o primeiro termo da série, ou seja 3. 12 | A segunda aproximação deve considerar a soma até o segundo termo, e assim por diante! 13 | """ 14 | 15 | pi = 0 16 | 17 | for aprox in range(15): 18 | if aprox == 0: 19 | pi += 3 20 | continue 21 | 22 | dobro_aprox = aprox * 2 23 | denominador = dobro_aprox * (dobro_aprox + 1) * (dobro_aprox + 2) 24 | 25 | if aprox % 2 != 0: 26 | pi += 4 / denominador 27 | else: 28 | pi -= 4 / denominador 29 | 30 | print(f"O número pi com 15 aproximações é {pi}") 31 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/05-laço-repetição/exercicio05.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Em uma competição de ginástica, cada atleta recebe votos de sete jurados. 7 | A melhor e a pior nota são eliminadas. 8 | A sua nota fica sendo a média dos votos restantes. 9 | Você deve fazer um programa que receba o nome do ginasta e as notas dos sete jurados alcançadas pelo atleta em sua apresentação e depois informe a sua média, conforme a descrição acima informada (retirar o melhor e o pior salto e depois calcular a média com as notas restantes). 10 | As notas não são informadas ordenadas. 11 | Um exemplo de saída do programa deve ser conforme o exemplo abaixo: 12 | Atleta: Aparecido Parente 13 | Nota: 9.9 14 | Nota: 7.5 15 | Nota: 9.5 16 | Nota: 8.5 17 | Nota: 9.0 18 | Nota: 8.5 19 | Nota: 9.7 20 | 21 | Resultado final: 22 | Atleta: Aparecido Parente 23 | Melhor nota: 9.9 24 | Pior nota: 7.5 25 | Média: 9,04 26 | 27 | """ 28 | 29 | notas = [] 30 | 31 | nome = input("Atleta: ") 32 | for _ in range(7): 33 | nota = float(input("Nota: ")) 34 | notas.append(nota) 35 | 36 | maior_nota = max(notas) 37 | indice_maior_nota = notas.index(maior_nota) 38 | notas.pop(indice_maior_nota) 39 | 40 | menor_nota = min(notas) 41 | indice_menor_nota = notas.index(menor_nota) 42 | notas.pop(indice_menor_nota) 43 | 44 | print("Resultado final:") 45 | print(f"Atleta: {nome}") 46 | print(f"Melhor nota: {maior_nota}") 47 | print(f"Pior nota: {menor_nota}") 48 | print(f"Média: {sum(notas) / len(notas)}") 49 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/05-laço-repetição/exercicio06.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Sendo H = 1 + 1/2 + 1/3 + 1/4 + ... + 1/N, faça um programa que calcule o valor de H com N termos. 7 | """ 8 | 9 | N = int(input("Digite o valor de N: ")) 10 | 11 | H = 0 12 | 13 | # Variável i começa em i e vai até N. 14 | # Como range não conta a variável N, soma-se 1 à ela. 15 | for i in range(1, N + 1): 16 | H += 1 / i 17 | 18 | print(H) 19 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/06-funções/exercicio01.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Em uma determinada país, as tarifas de táxi consistem em uma tarifa básica de R$4,00 mais R$0,25 para cada 140 metros percorridos. 7 | Escreva uma função que receba a distância percorrida (em quilômetros) como único parâmetro e retorna a tarifa total como único resultado. 8 | Escreva um programa que demonstre o uso da sua função. 9 | """ 10 | 11 | 12 | def calcula_tarifa(dist_km: float) -> float: 13 | # dist_km * 1_000 -> transforma km em metros 14 | # / 140 (para cada 140 metros) 15 | # * 0.25 multiplica pelo valor em R$ 16 | return 4 + dist_km * 1_000 / 140 * 0.25 17 | 18 | 19 | print( 20 | f"Para uma disância de 0,14 km (1.400 metros) o valor total da corrida é: {calcula_tarifa(0.14)}" 21 | ) 22 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/06-funções/exercicio02.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Escreva uma função que, dado três comprimentos de retas quaisquer, diga se essas três retas podem ou não formar um triângulo, retornando true em caso positivo e false em caso negativo. 7 | 8 | Dica n°1: Se algum dos comprimentos for negativo ou zero, não é possível formar um triângulo. 9 | Dica n°2: se qualquer um dos comprimentos for maior ou igual à soma dos outros dois, então os comprimentos não podem ser usados para formar um triângulo. 10 | Caso contrário, eles podem formar um triângulo. 11 | """ 12 | 13 | 14 | def forma_triangulo(a: int, b: int, c: int) -> bool: 15 | 16 | zerados_ou_negativos = a <= 0 or b <= 0 or c <= 0 17 | 18 | lado_maior_que_soma_dos_outros = a > b + c or b > a + c or c > a + b 19 | 20 | if zerados_ou_negativos or lado_maior_que_soma_dos_outros: 21 | return False 22 | 23 | return True 24 | 25 | 26 | print(f"É possível formar um triângulo com os lados 3, 4 e 5? Resp: {forma_triangulo(3,4,5)}") 27 | print(f"É possível formar um triângulo com os lados 1, 1 e 10? Resp: {forma_triangulo(1,1,10)}") 28 | print(f"É possível formar um triângulo com os lados 0, 4 e 5? Resp: {forma_triangulo(0,4,5)}") 29 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/06-funções/exercicio03.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Faça uma função que retorne o reverso de um número inteiro informado. Por exemplo: 127 -> 721. 7 | """ 8 | 9 | 10 | def inverte_numero(a: int) -> int: 11 | return int("".join(reversed(str(a)))) 12 | 13 | 14 | print(inverte_numero(127)) 15 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/06-funções/exercicio04.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Embaralha palavras: Construa uma função que receba uma string como parâmetro e devolva outra string com os carateres embaralhados. 7 | Por exemplo: se função receber a palavra python, pode retornar npthyo, ophtyn ou qualquer outra combinação possível, de forma aleatória. 8 | Padronize em sua função que todos os caracteres serão devolvidos em caixa alta ou caixa baixa, independentemente de como foram digitados. 9 | """ 10 | 11 | from random import shuffle 12 | 13 | 14 | def embaralha_string(str_input: str) -> str: 15 | str_list = [letra.upper() for letra in str_input] 16 | shuffle(str_list) 17 | return "".join(str_list) 18 | 19 | 20 | print(embaralha_string("Python")) 21 | -------------------------------------------------------------------------------- /Exercícios/Gabaritos/06-funções/exercicio05.py: -------------------------------------------------------------------------------- 1 | """ 2 | How Bootcamps - Stone - /código[s] 3 | Autor: Henrique Junqueira Branco 4 | 5 | Enunciado: 6 | Quadrado mágico: Um quadrado mágico é aquele dividido em linhas e colunas, com um número em cada posição e no qual a soma das linhas, colunas e diagonais é a mesma. 7 | Por exemplo, veja um quadrado mágico de lado 3, com números de 1 a 9: 8 | 8 3 4 9 | 1 5 9 10 | 6 7 2 11 | Elabore uma função que identifica e mostra na tela todos os quadrados mágicos com as características acima. 12 | Dica: produza todas as combinações possíveis e verifique a soma quando completar cada quadrado. 13 | Usar um vetor (lista) de 1 a 9 parece ser mais simples que usar uma matriz 3x3. 14 | """ 15 | 16 | from itertools import permutations 17 | 18 | # Tupla com todos os possíveis números a serem alocados nas posições do quadrado 19 | todos_os_numeros = (1, 2, 3, 4, 5, 6, 7, 8, 9) 20 | 21 | # Aqui fazemos uma repetição para gerar todas as combinações possíveis de quadrados. 22 | # Se contarmos todos os quadrados (mesmo os não mágicos), teremos: 23 | # 9 para primeira posição, 8 para segunda posição, 7 para terceira, e assim por diante... 24 | # 9 x 8 x7 x 6 x 5 x 4 x 3 x 2 x 1 = 362.880 25 | # Para cada uma das possibilidades, verificamos se a soma das colunas, linhas e diagonais resultam em um mesmo número 26 | for combinacao in permutations(todos_os_numeros, 9): 27 | 28 | # Equivalente à combinacao[0] + combinacao[1] + combinacao[2] 29 | soma_primeira_linha = sum(combinacao[:3]) 30 | 31 | # Equivalente à combinacao[3] + combinacao[4] + combinacao[5] 32 | soma_segunda_linha = sum(combinacao[3:6]) 33 | 34 | # Equivalente à combinacao[6] + combinacao[7] + combinacao[8] 35 | soma_terceira_linha = sum(combinacao[6:]) 36 | 37 | # Equivalente à combinacao[0] + combinacao[3] + combinacao[6] 38 | soma_primeira_coluna = sum(combinacao[::3]) 39 | 40 | # Equivalente à combinacao[1] + combinacao[4] + combinacao[7] 41 | soma_segunda_coluna = sum(combinacao[1::3]) 42 | 43 | # Equivalente à combinacao[2] + combinacao[5] + combinacao[8] 44 | soma_terceira_coluna = sum(combinacao[2::3]) 45 | 46 | soma_primeira_diagonal = combinacao[0] + combinacao[4] + combinacao[8] 47 | soma_segunda_diagonal = combinacao[2] + combinacao[4] + combinacao[6] 48 | 49 | # Tupla com todas as somas 50 | somas = ( 51 | soma_primeira_linha, 52 | soma_segunda_linha, 53 | soma_terceira_linha, 54 | soma_primeira_coluna, 55 | soma_segunda_coluna, 56 | soma_terceira_coluna, 57 | soma_primeira_diagonal, 58 | soma_segunda_diagonal, 59 | ) 60 | 61 | # Se a tupla contiver um único número (uma mesma soma para todas as linhas, colunas e diagonais) 62 | if len(set(somas)) == 1: 63 | print("Temos um quadrado mágico!") 64 | print(combinacao) 65 | -------------------------------------------------------------------------------- /Gabarito-Code-War/.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | .venv -------------------------------------------------------------------------------- /Gabarito-Code-War/README.md: -------------------------------------------------------------------------------- 1 | # Labirinto com Python 2 | 3 | ## Inspiração 4 | 5 | Desafio Projeto para Ensino do Labirinto com Analogias ao Google Maps / Problema do Minotauro / Aspirador de Pó. 6 | 7 | ## Executar 8 | 9 | ``` 10 | python app.py 11 | ``` 12 | 13 | 14 | -------------------------------------------------------------------------------- /Gabarito-Code-War/app.py: -------------------------------------------------------------------------------- 1 | from src.gerador import gerar 2 | from src.resolvedor import resolver 3 | 4 | if __name__ == "__main__": 5 | labirinto, posicao_inicial = gerar() 6 | 7 | resolver(posicao_inicial, labirinto) 8 | -------------------------------------------------------------------------------- /Gabarito-Code-War/src/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howbootcamps/pythoncodigos/b9a5c79886da73f99b3a7958c7464f19d3c223f1/Gabarito-Code-War/src/__init__.py -------------------------------------------------------------------------------- /Gabarito-Code-War/src/constantes.py: -------------------------------------------------------------------------------- 1 | SIM_NAO_VISITADO = 'N' 2 | SIM_PAREDE = '#' 3 | CAMINHO_PERCORRIDO = "2" 4 | SIM_CAMINHO = ' ' 5 | 6 | ESQUERDA = [0, -1] 7 | DIREITA = [0, 1] 8 | CIMA = [-1, 0] 9 | BAIXO = [1, 0] 10 | 11 | ROBO = "4" 12 | SAIDA = "S" 13 | 14 | MOVIMENTOS_POSSIVEIS = [ 15 | CIMA, 16 | DIREITA, 17 | BAIXO, 18 | ESQUERDA, 19 | ] 20 | 21 | VELOCIDADE = 0.1 -------------------------------------------------------------------------------- /Gabarito-Code-War/src/resolvedor.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from time import sleep 4 | from src import constantes 5 | 6 | 7 | CAMINHO = [] 8 | 9 | 10 | def print_labirinto(labirinto): 11 | os.system('cls' if os.name == 'nt' else 'clear') 12 | print("") 13 | for linha in labirinto: 14 | print("".join(linha)) 15 | print("") 16 | 17 | 18 | def movimento(labirinto, posicao: tuple, movimento: list, voltar=False): 19 | caminho = constantes.SIM_CAMINHO if voltar else constantes.CAMINHO_PERCORRIDO 20 | 21 | labirinto[posicao[0]][posicao[1]] = caminho 22 | labirinto[posicao[0] + movimento[0]][posicao[1] + movimento[1]] = constantes.ROBO 23 | 24 | if voltar: 25 | CAMINHO.append(posicao) 26 | 27 | return [posicao[0] + movimento[0], posicao[1] + movimento[1]] 28 | 29 | 30 | def verifica_movimento(labirinto, posicao: tuple, movimento: list, voltar=False) -> bool: 31 | if labirinto[posicao[0] + movimento[0]][posicao[1] + movimento[1]] == constantes.SAIDA: 32 | print("SUCESSO") 33 | sys.exit() 34 | 35 | caminho = labirinto[posicao[0] + movimento[0]][posicao[1] + movimento[1]] 36 | 37 | if voltar: 38 | return caminho == constantes.CAMINHO_PERCORRIDO 39 | else: 40 | nao_percorrido = [posicao[0] + movimento[0], posicao[1] + movimento[1]] not in CAMINHO 41 | return caminho == constantes.SIM_CAMINHO and nao_percorrido 42 | 43 | 44 | def movimentar(labirinto, posicao_atual, movimentos): 45 | movimentou = False 46 | for m in movimentos: 47 | if verifica_movimento(labirinto, posicao_atual, m): 48 | posicao_atual = movimento(labirinto, posicao_atual, m) 49 | movimentou = True 50 | break 51 | 52 | if not movimentou: 53 | for m in movimentos: 54 | if verifica_movimento(labirinto, posicao_atual, m, True): 55 | posicao_atual = movimento(labirinto, posicao_atual, m, True) 56 | break 57 | 58 | print_labirinto(labirinto) 59 | sleep(constantes.VELOCIDADE) 60 | movimentar(labirinto, posicao_atual, movimentos) 61 | 62 | 63 | def resolver(posicao_inicial, labirinto): 64 | labirinto[posicao_inicial[0]][posicao_inicial[1]] = constantes.ROBO 65 | print_labirinto(labirinto) 66 | 67 | movimentar(labirinto, posicao_inicial, constantes.MOVIMENTOS_POSSIVEIS) 68 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Boas-vindas ao Bootcamp - Análise de Dados com Python e Pandas :purple_heart: 2 | 3 | Sabe aqueles códigos dos nossos encontros? Aqui vocês encontram todos eles para não perder nada :sunglasses: 4 | --------------------------------------------------------------------------------