# Introdução à programação com Python

Introdução à programação com Python, de forma que o/a aluno/a possa construir seu primeiro projeto: sistema web, Arduino ou jogo usando o Godot engine.
Aula 1: Link do slide
Aula 2: Link do slide
Aula 3: Link do Slide

#### O que é Python?

Neste módulo iremos aprender sobre algoritmos para desenvolvimento de softwares e que são fundamentais para áreas mais complicadas como Ciência de Dados, Engenharia de Software, Inteligência das Coisas, etc.
Python é uma linguagem de programação de alto nível, isto é, uma linguagem mais próxima da linguagem humana do que a de máquina. Baseada em um desenvolvimento ágil com maior produtividade e facilidade na leitura de códigos.
* Como surgiu?
Foi desenvolvida por Guido van Rossum em 1989 no Instituto de Pesquisa Nacional para Matemática e Ciência da Computação (CWI), como um sucessor da linguagem de programação ABC. O Python surgiu junto a uma necessidade de uma linguagem descomplicada e que pudesse ter as qualidades da linguagem ABC junto com qualidades da linguagem C, ou seja, com uma maior interação com o sistema operacional, com tratamento de exceções etc.
* Onde é usado?
É muito utilizado para o desenvolvimento de sites com a famosa biblioteca Django. Também é utilizada para análise de dados com a biblioteca Matplotlib, utilizada para traçar gráficos de funções de maneira precisa e automatizada pelo software. É utilizada também para manipulação de bancos de dados com a biblioteca SQLObject.
* Licença
Python possui uma licença livre aprovada pela Iniciativa pelo Código Aberto (OSI), e compatível com a Licença Pública Geral GNU (GPL). Ela prevê (entre outras coisas) que binários da linguagem sejam distribuídos sem a necessidade de fornecer o código fonte junto.

#### O que é um algoritmo?

Um algoritmo é uma coleção de instruções a ser seguido pela máquina, em uma estrutura sequencial, onde a ordem das instruções fazem total diferença no resultado final. Todos os algoritmos até de estruturas mais complexas ainda possuem a ordem sequencial como base.
* Exemplos de algoritmo
Algoritmo para fazer brigadeiro:
Despeje uma caixinha de leite condensado em uma panela.
Despeje na mesma panela uma caixa creme de leite.
Despeje na mesma panela uma porção de duas colheres de chocolate em pó.
Misture os ingredientes na mesma panela.
Ligue uma das boca do fogão, e coloque a panela sobre o fogo.
Misture os ingredientes na panela sobre o fogo até o brigadeiro chegar ao ponto.
Desligue o fogo.
Despeje o brigadeiro em um prato e deixe esfriar.
Um algoritmo é como uma receita, um passo a passo, que deve ser escrito de maneira que não seja ambígua. Por trás de um algoritmo há uma lógica na qual se realiza uma função ou resolve um problema. Por trás de todo algoritmo há uma lógica de programação por trás.
* Palavras reservadas
TODO: Adicionar uma lista de todas as palavras reservadas em Python, ou seja, palavras que não podem ser usadas como nomes de variáveis.

#### Programa Básico:

print("Olá, Mundo!")
** Função de saída
** A função print é utilizada para mostrar na tela os dados desejados.
* Variáveis
Dentro da programação é possível criarmos objetos chamados variáveis que guardam dados, e também podemos nomear a variável para que possamos acessar o dado que foi guardado durante o algoritmo. Podemos também realizar operações com variáveis como adição, subtração, divisão e multiplicação, e manipular dados chamados de variáveis.
* Tipo de Dado
No Python não é necessário especificar inicialmente qual o tipo de dado que a variável irá armazenar, diferentemente de outras linguagens de programação.
* Inteiro (Int)
** Tipo de dado que representam os valores inteiros ( int ) que são agrupados na memória em 32 bits ou 64 bits podendo ter diversos valores de -(2^(31)) até 2^(31) − 1 para 32 bits, e de -(2^(63)) até 2^(63) − 1 para 64 bits.
Exemplo: 150; 0; -65.
* Números de Ponto Flutuante (Float)
** Tipo de dado usado em cálculos; representa valores muito grandes ou valores muito pequenos indo de 10^(-308) a 10^(308) . Para que um valor seja considerado no tipo float na linguagem python, basta que ele tenha um ponto decimal ou tenha um expoente de 10.
Exemplo: 1.2; 0.035.
* Caracter (Char)
** tipo de dado que representa os caracteres alfanuméricos, podendo ser uma letra, número ou caractere especial, porém com esse tipo de dados as operações de adição e multiplicação não ocorrerão de maneiras matematicamente corretas. Para criação manual desse tipo de dado é necessário colocar o caractere desejado entre aspas simples.
Exemplo: 'a'; '1'; '@'.
* Texto (String)
** tipo de dado que representa frases ou textos sendo ele uma cadeia de caracteres, ou uma lista de caracteres podendo eles serem letras, números ou caracteres especiais. Para criação manual desse tipo de dado é necessário colocar o caractere desejado entre aspas duplas.
Exemplo: "João"; "12345"; "O_@#*q".
* Lista
** Tipo de dado que representa um conjunto de tipos de dados. Existem listas de inteiros (int), strings, etc. Também é possível colocar diferentes tipos de dados na mesma lista. Podemos aceder a um elemento de uma lista utilizando um número a partir de 0 (0,1,2,3,…) entre parênteses retos.
Exemplo: minhalista = [“Gabriel”, “Joana”, 12345]
minhalista[0] representa o dado “Gabriel”.
minhalista[1] representa o dado “Joana”.
* Dicionários (Dict)
** Tipo de dado semelhante a uma lista, porém este tipo de dado associa dados de uma lista (values) com um determinada chave que permite aceder ao elemento (keys). Podemos aceder a um elemento de um dicionário utilizando a chave associada ao elemento.
Exemplo: meudicio = {"nome": Eduardo, "estado": "A dormir"}
meudicio["estado"] representa o dado "A dormir".
meudicio["nome"] representa o dado "Eduardo".
* Booleano (Bool)
** Tipo de dado que representa os valores verdadeiro (True) e falso (False), sendo também um subconjunto dos inteiros, podendo ser interpretado como 1 (verdadeiro) e 0 (falso), ou seja, binário.
Exemplo: True, False, 0, 1.
* Atribuição
Para determinarmos qual valor a variável vai guardar utilizamos o sinal de igual ‘ = ‘, ditando primeiro o nome que vamos dar à variável, depois o sinal de igual, depois o valor que desejamos guardar.
Exemplo:

#### Operadores Lógicos

Para realizar comparações entre valores utilizamos os operadores lógicos
| Operadores | significado |
| > | X MAIOR QUE Y |
| < | X MENOR QUE Y |
| == | X IGUAL A Y |
| <= | X MENOR OU IGUAL A Y |
| >= | X MAIOR OU IGUAL A Y |
| != | X DIFERENTE DE Y |

###### Operadores matemáticos

Para realizar as operações matemáticas utilizamos os seguintes código:
Suponha que X e Y sejam duas variáveis de valor matemático (int ou float).
* Soma ( + ): X + Y
* Subtração ( - ): X - Y
* Divisão ( / ): X / Y
* Divisão inteira ( // ): X // Y
* Multiplicação ( * ): X * Y
* Potência ( ** ): X ** Y
* Resto ou Módulo (%): X % Y
Para a realização de operações mais complexas utilizamos a biblioteca Math, que será vista em casos mais pontuais.

#### Estrutura Sequencial

Em todos os algoritmos que vamos produzir é de suma importância nos atentarmos à ordem das instruções, como se fosse um passo a passo, uma sequência de instruções para se chegar ao resultado desejado. Sendo seu fluxo grama o seguinte esquema:
Exemplo de código:
* Entrada de dados
A entrada de dados faz ligação do seu algoritmo com o usuário, podendo receber informações que são digitadas pelo usuário e utilizá-las no seu programa, como a idade, o nome ou qualquer outra informação que você solicite.
Para receber os dados utilizamos a função input que recebe um valor de tipo string, então mesmo que você peça um número ao usuário, como a idade dele/a, o número obtido dessa requisição será do tipo string.
Na função input, podemos colocar informações que serão apresentadas ao usuário quando a requisição do input for feita, por exemplo: input(“Qual a sua idade?”) → dessa forma a mensagem “Qual a sua idade?” irá surgir na tela antes do usuário digitar, podendo ser uma maneira de informar ele o que deve ser digitado.
É importante lembrar-se de guardar o valor recebido pelo input em uma variável para que ele não se perca e possa ser utilizado em seu programa.
* Exemplo de código:
Resultado: <nome digitado> tem <idade digitada> anos.

###### Exercícios sugeridos:

* Soma de dois números
* Faça um programa que peça as 4 notas bimestrais e mostre a média.
* Faça um programa que converta metros para centímetros.
* Faça um Programa que peça a temperatura em graus Fahrenheit, transforme e mostre a temperatura em graus Celsius. Fórmula:
C = 5 * ((F-32) / 9)
Fonte dos exercícios: https://wiki.python.org.br/EstruturaSequencial

#### Estruturas de Seleção

Dentro do python podemos criar um mesmo algoritmo que dê um resultado final diferente, dependendo dos dados que são obtidos do usuário ou que estão sendo processados pelo programa. Podemos criar condições para que caso a condição seja verdadeira o programa irá ter um comportamento, e caso contrário ele terá outro. Mais especificamente, se a condição for verdadeira, será executada uma sequência de comandos definidos pelo programador, caso contrário outra sequência de comandos será executada.
* Condicionais
Nas estruturas de seleção utilizamos condicionais formados por operadores lógicos que irão definir o comportamento do programa. Logo podemos comparar valores, sendo eles iguais ou não, diferentes, maiores ou menores, a comparação em si terá um valor lógico verdadeiro ou falso.
Exemplos:
* 5 > 2: Verdadeiro
* 5 >= 5: Verdadeiro
* 1 <= 9: Verdadeiro
* 'c'== 'C': Falso → Sensitive Case (o python diferencia letras maiúsculas de minúsculas)
* IF (se):
O python possui a palavra ‘ if ‘ reservada, logo não é possível criar uma variável com esse nome. Exemplo da estrutura básica de uma condição: if (condição):
É de suma importância a endentação na estrutura de seleção para que o algoritmo funcione corretamente. É como se o algoritmo estivesse dentro de um compartimento que é delimitado pelo espaço desde o começo da linha.
Exemplo:
Além do ‘ if ’ temos o ‘ elif ‘ (senão se) e o ‘ else ‘ (senão), que funcionam de maneira similar ao ‘ if ‘, porém são usados em conjunto. O ‘ if ‘ será sempre a primeira alternativa, caso a condição do ‘ if ‘ seja verdadeira, o programa irá executar o algoritmo determinado para o ‘ if ‘ e não executará o ‘elif ‘ e o ‘ else ‘. Analogamente, caso a condição do ‘ if ‘ seja falsa, não será executado o algoritmo do ‘ if ’, e o programa irá verificar se a condição do ‘ elif ’ é verdadeira, e executar o algoritmo caso seja. O ‘ else ‘ normalmente não possui condição, pois é utilizado como o que deve ser feito caso nenhuma das condições anteriores sejam verdadeiras. A indentação das estruturas de seleção é a seguinte.

#### Estrutura de repetição

Uma estrutura de repetição em Python é um bloco de código que permite repetir um determinado algoritmo, determinadas vezes. Em Python, estas estruturas de repetição (Loops) são o while (enquanto) e o for (para).
As estruturas de repetição são utilizadas estrategicamente, em momentos em que uma determinada tarefa tenha que ser realizada diversas vezes, de maneira similar a um ciclo de repetição que irá iniciar se uma condição especificada pelo programador for verdadeira e irá encerrar o laço de repetição quando a condição se tornar falsa.
OBS: Faça com que a condição do laço de repetição tenha como elemento uma das variáveis que serão manipuladas dentro do laço. Caso contrário, possivelmente o laço irá se tornar um ‘ loop infinito ’.
* While
Um dos laços de repetição que pode ser utilizado é o laço ‘ while ‘ ( Enquanto ) que possui a seguinte estrutura:
Exemplos:
* Este bloco de código repete uma determinada instrução para sempre (enquanto verdadeiro). O while True: é útil para jogos (gameloops, ou seja, estruturas de repetição que repetem as instruções do jogo para sempre), mantendo o programa (jogo) a correr.
Exemplo: Validação de dados
* For
Outro laço de repetição que podemos utilizar é o ‘ for ‘ ( Para) que possui uma estrutura diferente, ele possui uma variável própria que deve ser nomeada e que irá passear por uma lista que será definida pelo programador.
Função range: A função range é utilizada para a criação de uma sequência de números, sendo seu início definido por ‘ i ‘ e tendo seu em ‘ j - 1 ’ que é são valores a serem definidos pelo programador. Logo os parâmetros da função se estabelecem da seguinte forma: range( início, fim, passo)
OBS: O passo é a quantia que a sequência irá percorrer, pulando a quantidade especificada no espaço ‘passo’ na sequência que será gerada.
Exemplos:
* Este bloco de código repete uma instrução 5 vezes. Para esclarecer, o programa vai retornar os seguintes dados:
O i é uma variável declarada na estrutura de repetição for, cujos valores mudam a cada iteração (1,2,3,4,5,…).

#### Vetores

Os vetores são um tipo de dado que não é nativo ao Python, ou seja, por defeito, este tipo de dado não está incluído no Python. Contudo, podemos criar o nosso tipo de dado Vetor recorrendo a uma funcionalidade do Python que se chama class (classe). A classe é um tipo de dado especial que pode ser usado para definir tipos de dados pelo usuário. Esta funcionalidade faz parte de um paradigma de programação chamado de Programação Orientada a Objetos (OOP). Em Python, todos os Tipos de Dados (datatypes) são contidos em Objetos (Objects). Isto implica que as variáveis no Python são Objetos. Objetos contém dados que tem tipos de dados mais simples (int, float, char, string, bool, etc.) e contém métodos (funções internas de uma classe que podem ser utilizadas para manipular os dados de um objeto que descende da classe).
Exemplo:
* Notas: Comentários começam com # em Python. O método __init__ inicializa os dados do objeto.
O cálculo da magnitude (comprimento do vetor) baseia-se no Teorema de Pitágoras, onde a magnitude é a hipotenusa do triângulo retângulo e as componentes x e y do vetor são os catetos. O cálculo do ângulo do vetor utiliza a função arco tangente atan para converter a razão trigonométrica obtida pela divisão entre as componentes do vetor no ângulo formado pela amplitude entre o vetor e o eixo horizontal (Ox).

#### Matrizes

As matrizes são um tipo de dado que, tal como os vetores, não são nativos no Python e podem ser implementados com uma classe. São um conceito matemático que originou da Álgebra Linear e têm diversas aplicações no desenvolvimento de jogos, nomeadamente para perspectiva e projeções espaciais.
Exemplo:

#### Recursividade

A recursividade é uma técnica e paradigma de programação que envolve uma função (sub-rotina) chamar a si própria quando está em execução. Isto é útil para funções matemáticas tal como a função fatorial (n!).
Exemplo: