# Python #### Plataformas para Consulta e Pesquisa [Documentação do Python](https://docs.python.org/pt-br/3/) [W3Schools](https://www.w3schools.com/python/default.asp) OBS: Este está em inglês #### Exercícios de Fixação [Caderno de Exercícios](https://hackmd.io/@Monitoria/H1Pqopdbee) #### Adendo Os códigos disponíveis são feitos para o leitor poder copiá-los e testá-los ele mesmo. #### Fazendo Comentários em Python Comentários em Python são muito úteis para fazer anotações em seus códigos, além de criar lembretes e explicações do uso de certas linhas de código. - Para comentar uma única linha, utilizamos # ~~~python #Este é um comentário ~~~ - Para comentar múltiplas linhas, são utilizadas 3 aspas ou apóstrofos. ~~~python """ Este é um comentário de múltiplas linhas. """ ''' Este também é um comentário de múltiplas linhas. ''' ~~~ ## Introdução a Programação Em algum momento, você já pensou como programadores fazem para escrever mensagens na tela? Bem, uma das formas que eles fazem isso é a seguinte: ~~~python print("Olá, Mundo!") ~~~ Em Python, com este simples comando, imprimimos a mensagem "Olá, Mundo!", no terminal de quem executou o código, mas isso é um pouco impessoal. Para podermos tornar a mensagem mais personalizada, poderíamos pedir que o usuário inserisse seu nome e então apareceria na tela uma mensagem dizendo "Olá, {seu nome}". Acho que dessa forma não pareceria algo tão frio. ~~~python input("Digite seu nome: ") ~~~ Com o input, nós conseguimos coletar o nome do usuário, que foi digitado no terminal, mas como faríamos para por esse nome aparecer no print(). Para isso, precisaríamos utilizar variáveis, que são basicamente caixinhas feitas para armazenar informações, que então podem ser manipuladas. Para podermos utilizar uma variável seria basicamente assim: ~~~python nome = input("Digite seu nome") #Então inserimos a variável no texto. print("Olá, " + nome + "!") ~~~ Agora que o texto pode imprimir nosso nome, não parece mais algo tão distante. Esse código apresentado é o começo de Python e conforme nos aprofundamos nessa linguagem, nos tornamos mais capazes de fazer os programas mais diversos. Bem, agora que o básico foi visto, seria interessante se nos aprofundarmos mais no conteúdo que acabamos de ver. ## Variáveis Para definirmos uma variável em Python é necessário apenas o operador "=" e nada mais. ~~~python variavel = 12 print(variavel) ~~~ Desde que as regras de nomenclatura sejam seguidas, quase qualquer nome pode ser dado a uma variável. As regras são as seguintes. * Não se deve começar uma variável com números. * Não deve haver espaços entre as letras do nome da variável. * Não se pode utilizar nomes reservados pelo sistema (min, max, type, etc) * Não use caracteres especias e nem acentos nos nomes de variáveis, muitos interpretadores não são capazes de interpretar as variáveis se fizer isso. ~~~python #Exemplos de variáveis com nomes errados. 1nome = "texto" #Retorna erro. n ome = "texto" #Retorna erro. str = "texto" #Retorna erro ou até mesmo sobrescreve a função original. até = "até" #A maioria dos interpretadores retornará erro. ~~~ Variáveis em Python são divididas em diferentes tipos, os básicos são: Numéricas: * inteira <font color="#aa77bb">int</font> * flutuante <font color="#aa77bb">float</font> * booleana <font color="#aa77bb">bool</font> Não númericas: * strings <font color="#aa77bb">str</font> O Python faz o trabalho de determinar os tipos de variáveis automaticamente. ~~~python inteiro = 1 flutuante = 2.5 booleano = 0 texto = "Texto" print(type(inteiro)) # A função type retorna o tipo da variável. print(type(flutuante)) print(type(booleano)) print(type(texto)) ~~~ ### Coerção de Tipo Em Python, quando duas variáveis de tipos diferentes interagem, a própria linguagem tenta lidar com a situação, alterando o tipo da variável para o mais adequado, o nome disso é Coerção de Tipo ou Typecasting. O Python é capaz de realizar a coerção de tipo entre variáveis numéricas, porém não consegue fazer isso entre outros tipos de variáveis. ~~~python #Este não gera erro. inteiro = 1 flutuante = 2.5 booleano = True coercao = inteiro + flutuante + booleano print(coercao) ~~~ ~~~python #Este resulta em erro. texto = "texto" numero = 1 coercao = texto + 1 ~~~ Para lidar com este problema, nós utilizamos funções específicas, feitas para a coerção de tipo das variáveis. ~~~python a = 1 a = float(a) #Trasforma a variável em flutuante. print(type(a)) a = int(a) #Transforma a variável em inteira. print(type(a)) a = bool(a) #Transforma a variável em booliana print(type(a)) a = str(a) #Transforma a variável em texto. print(type(a)) ~~~ Se houver elementos não numéricos em um texto, a conversão para um tipo numérico resultará em erro. ## Entrada e Saída. ### Saida: print() Para realizar a saída de dados através de Python, você utiliza o comando print(). Ao utilizar o comando, a informação será impressa na tela. ~~~python print("Uma saída de informação.")~ ~~~ Para imprimir variáveis, é possível utilizar os seguintes métodos. ~~~python texto = "Um texto de exemplo." textos = "Outro texto de exemplo." #Sem texto dentro do print. print(texto) #Com texto dentro do print e/ou múltiplas variáveis #Método 1: Concatenação print("Este é um texto" + texto + "Outro texto" + {textos}) #Método 2: Pela própria função. print("Este é um texto", texto, "Outro texto", {textos}) #Método 3: FString print(f"Este é um texto {texto} Outro texto {textos}") ~~~ ### Entrada: input() Para realizar a entrada de dados em Python utilizamos o comando input(). Este comando irá esperar o usuário digitar os dados pelo terminal. ~~~python texto = input() #O desenvolvedor também pode optar por colocar uma mensagem de texto no input. texto = input("Esta é uma mensagem de texto: ") print(texto) ~~~ Todos os dados inseridos em um input são coletados como uma String. Para armazenar tipos de variáveis diferentes, usamos coerção de dados. ~~~python texto = input() inteiro = int(input()) flutuante = float(input()) booleano = bool(input()) type(texto) type(inteiro) type(flutuante) type(booleano) ~~~ ### Para a OBI Durante a Olimpíada Brasileira de informática, algumas questões irão exigir que você armazene mais de um dado em um único input, para fazer isso usamos o seguinte método. ~~~python x, y = input().split() print(x, y) ~~~ Através deste método, as informações separadas por um espaço serão coletadas separadamente. Porém, esta forma apenas armazena Strings. Para fazer a coerção, é necessário fazer o seguinte. ~~~python #Todas as variáveis com o mesmo tipo. x, y = [int(_) for _ in input().split()] type(x) type(y) #Variaveis de tipos diferentes. x, y = input().split() x = int(x) y = float(y) type(x) type(y) ~~~ Outro fator importante é que não se deve utilizar textos desnecessários nem na entrada e nem na saída de dados. A entrada e saída de dados é feita da seguinte forma: ~~~python a = input() print(a) ~~~ ## Operadores Em Python temos diversos operadores, os mais básicos são: ### Operadores basicos * = Utilizado para armazenar variáveis. ~~~python variavel = 12 print(variavel) ~~~ ### Opeadores Matemáticos * \+ Utilizado para soma e concatenação. Concatenação consiste na união de 2 textos. ~~~python soma = 1 + 2 concatenacao = "a" + "b" print(soma, concatenacao) ~~~ * \- Utilizado para subtração. ~~~python subtracao = 2 - 1 print(subtracao) ~~~ * \* Utilizado para multiplicação. ~~~python multiplicacao = 2 * 5 print(multiplicacao) ~~~ * / Utilizado para divisão ~~~python divisao = 9 / 3 print(divisao) ~~~ Também existem operadores feitos para realizar tarefas um pouco mais complicadas, eles são: * \*\* Utilizado para calcular potências. ~~~python potencia = 2 ** 3 print(potencia) ~~~ * // Utilizado para fazer divisões inteiras. ~~~python divisaoInteira = 5//2 print(divisaoInteira) ~~~ * % Utilizado para retornar o resto de divisões. ~~~python resto = 5 % 2 print(resto) ~~~ * +=, -=, *=, /= Utilizados para atribuir valores ao mesmo tempo que realiza uma soma com o valor original da variável. ~~~python a = 1 b = 2 c = 3 d = 10 a += 1 #Resulta em 2 (valor original + 1) b -= 1 #Resulta em 1 (Valor original - 1) c *= 3 #Resulta em 9 (Valor original * 3) d /= 2 #Resulta em 5 (Valor original / 2) ~~~ ### Aplicando conceitos matemáticos Apesar de existir uma biblioteca capaz de calcular raízes quadradas, nem sempre é possível ou eficiente utilizá-la, por isso, se aplicarmos o seguinte conceito matemático: e**(1/2) = ²√e Podemos calcular raízes sem a necessidade de bibliotecas externas. ~~~python raiz = 4**(1/2) print(raiz) ~~~ ## Condicionais Às vezes, durante a resolução de um problema, nos deparamos com um dilema, questões onde é necessário interpretar uma informação e então dar uma resposta com base no que nos foi dado. Para poder resolver essas questões, existem as condicionais. Condicionais são estruturas de decisão que executam um trecho específico do código caso certa condição seja atendida. Em Python, as estruturas de condição são: if, else e elif. ~~~python if 2 > 4: print("if") elif 2 < 1 print("elif") else: print("else") ~~~ ### if O if é a principal estrutura de decisão presente, sempre que houver a necessidade de uma condicional, ele estará presente. #### Sintaxe Por ser uma linguagem de tipagem fraca, o Python não exige chaves e parenteses para determinar uma condição e seus resultados, no lugar disso é necessário escrever apenas ":" ao final da linha, porém, por ser uma linguagem que exige indentação, é necessário deixar um espaço em branco antes do código para que o código seja identificado como parte do if, todas as linhas de código dentro desse if devem respeitar esse espaçamento e no caso de surgir um outra condicional mais espaçamento será necessário. Todas as perguntas interpretadas pelo Python são de sim ou não, por isso, ao utilizarmos uma condicional, receberemos apenas Verdadeiro ou Falso, se for verdadeiro, o programa executa o código dentro do IF e se for falso, ele não executa. ~~~python a = int(input()) if a < 10: #Declaração de uma condicional. print("A é menor que 10") #Item dentro da condicional (Demarcado pelo espaçamento) if a > 2: #Declaração de uma condicional dentro de outra condicional. print("Porém é maior que 2") #Item da nova condicional (Demarcado por um espaçamento maior) ~~~ #### Operadores de comparação Quando criamos uma condicional, estamos basicamente fazendo uma pergunta, devido a isso usamos diferentes sinais para diferentes perguntas. Os sinais utilizados nas condicionais são os seguintes. - == Para ver se A é igual a B (Diferente do sinal de atribuição que é "="). ~~~python a = 3 b = 4 if a == b: print("iguais") ~~~ - != Para ver se A != B. ~~~python a = 3 b = 4 if a != b: print("diferentes") ~~~ - \> Para ver se A é maior que B. ~~~python a = 3 b = 4 if a > b: print("maior") ~~~ - < Para ver se A é menor que B. ~~~python a = 3 b = 4 if a < b: print("menor") ~~~ - \>= Para ver se A é maior ou igual a B. ~~~python a = 3 b = 4 if a >= b: print("menor igual") ~~~ - <= Para ver se A é menor ou igual a B. ~~~python a = 3 b = 4 if a <= b: print("menor igual") ~~~ #### and, or e not Às vezes, quando necessitamos de expressões mais complexas, os operadores de comparação não são o suficiente. Por isso podemos utilizar and, or, () e not. - and O and é utilizado para formular perguntas mais complexas onde queremos que duas ou mais coisas sejam verdades. Para usá-lo basta escrever and entre uma expressão e outra. ~~~python a = 1 b = 2 if a > 0 and b < 3: print("and") ~~~ - or O or é utilizado para formular perguntas mais complexas onde queremos que uma ou outra coisa seja verdade. Para usá-lo basta escrever or entre uma expressão e outra. ~~~python a = 1 b = 2 if a > 0 or b > 3: print("or") ~~~ - () Os parenteses são utilizados para formular expressões onde seja necessário agrupar perguntas ou valores. Para fazer isso, basta colocar os parenteses ao redor das expressões que serão agrupadas. ~~~python a = 1 b = 1 c = 4 if a == b or (a > b and b < c): print("parenteses") ~~~ - not O not é utilizado para inverter uma expressão, fazendo com que o conteúdo do if só seja executado caso a afirmação não seja verdade. ~~~python a = 1 b = 2 if not (a > b): print("not") ~~~ Você também pode utilizar apenas uma variável no lugar de uma expressão quando montar um if. Nesse caso, o Python irá interpretar o dado dentro da variável para dar a resposta no caso de: - "", NULL e 0: Será retornado falso. - No caso de qualquer outro valor, será retornado verdadeiro. ### else E se quiséssemos executar algo quando a nossa condição não foi cumprida? É para esse tipo de situações que o else existe. Else segue uma estrutura semelhante à do if, e tem o mesmo espaçamento que ele, suas principais diferenças sendo que ele não tem uma condicional e só pode ser posto após um if. ~~~python a = 1 b = 2 if a > b: print(a) else: print(b) ~~~ ### elif E no caso de precisarmos de uma condição nova caso a anterior não tenha sido cumprida? Nesse caso, usaremos o elif, este funciona de modo semelhante ao else, só podendo ser posto após um if, porém no caso do elif nós devemos por uma condicional para que outra pergunta seja feita. Então, no caso de um if não ser verdadeiro, o elif será testado e, no caso de o if ser verdadeiro, o if será ignorado. ~~~python a = 1 b = 2 if a == b: print("iguais") elif a > b: print(a) elif b > a: print(b) ~~~ Tanto o else quanto o elif podem ser utilizados após um if ou outro elif. ## Loops Quando necessitamos repetir uma ação varias vezes ou fazer com que ela permaneça sendo executada por um tempo ideterminado, programar se torna algo muito trabalhoso ou até mesmo impossivel. Por esse motivo Python (e outras linguagens te programação) tem o while e o for, laços de repetição que iram executar os comandos inseridos dentro deles até que uma condição seja alcançado ou um certo número de repetições seja fei ### While While é um laço de repetição que, assim como o if, recbe uma condição e até que essa condição não seja mais cumprida, irá executar o código que esta dentro do while. Para declarar um while a estrutura será a mesma que para declarar um if. ~~~python a = 0 while a < 11: print(a) a +=1 ~~~ Enquanto a condição proposta for cumprida o loop irá continuar sendo executado. ### For Como visto no exemplo de código que utiliza while, caso queiramos que o loop se repita um determinado número de vezes, e não infinitamente, nós precisamos adicionar uma linha no código para que a variável de controle seja incrementada. Por causa disso, o while não seria a melhor opção para fazer esse tipo de operação, para esse caso, o laço de repetição ideal seria o for. ~~~python for a in range(11): print(a) ~~~ CComo pode ser visto, a sintaxe utilizada para implementar um for é distante daquela que utilizamos para declarar um if ou um while, mantendo somente a mesma regra de identação. Para se declarar um for, primeiramente, é necessário escrever for e em seguida o nome de uma variável, esta variável não precisa ser declarada anteriormente, pois ela é criada na execução do for, então iremos escrever in e definir o escopo em que está variável irá trabalhar, para isso utilizamos a função range. A função range pode receber até 3 parâmetros e o modo em que o for funciona é afetado pela quantidade de parâmetros recebidos pelo range. * Um parâmetro: O for irá aumentar o valor de i de um em um até que ele alcance o valor passado dentro do range(). ~~~python a = 6 #Valor limite de i for i in range(a): print(i) #No fim de cada loop i é aumentado em 1. ~~~ * Dois parâmetros: O for irá determinar o valor de i como o do primeiro parâmetro inserido e então irá aumentá-lo de um em um até que ele alcance o segundo parâmetro. ~~~python a = 6 #Valor inicial de i b = 12 #Valor limite de i for i in range(a, b): print(i) #No fim de cada loop é incrementado em 1. ~~~ * Três parâmetros: O for irá determinar o valor de i como o do primeiro parâmetro e então irá adicionar o valor do terceiro parâmetro passado até que ele alcance o valor do segundo parâmetro. ~~~python a = 12 #Valor inicial de i b = 1 #Valor limite de i c = -1 #Valor do incremento de i for i in range(a, b, c): print(i) #No fim de cada loop é incrementado em um valor igual ao terceiro parâmetro. ~~~ ### Quando Utilizar Agora que vimos ambos os laços de repetição, fomos capazes de ver que, apesar de poderem executar operações semelhantes, o modo no qual funcionam impacta onde eles são utilizados. No caso do WHILE, ele é melhor utilizado em laços de repetição sem uma quantidade de repetições definida, enquanto o FOR é mais bem utilizado quando se trabalha com um número de repetiçõs determinado.