Baixe o app para aproveitar ainda mais
Prévia do material em texto
unidade 3 PROGRAMAÇÃO Laboratório de unidade 3Programação Python Prezado estudante, Estamos começando uma unidade desta disciplina. Os textos que a compõem foram organizados com cuidado e atenção, para que você tenha contato com um conteúdo completo e atualizado tanto quanto possível. Leia com dedicação, realize as atividades e tire suas dúvidas com os tutores. Dessa forma, você, com certeza, alcançará os objetivos propostos para essa disciplina. OBJETIVO GERAL Desenvolver soluções algorítmicas em python com a manipulação de arquivos. OBJETIVOS ESPECÍFICOS • Descrever a estrutura básica de um algoritmo em Python. • Analisar algoritmos e programas. • Resolver problemas utilizando programação. • Descrever a organização de dados manipuláveis por um algoritmo na memória do computador. • Formular soluções algorítmicas empregando os diferentes operadores. • Interpretar soluções algorítmicas de manipulação de dados. • Discutir a utilização de comandos condicionais aninhados. • Realizar testes de mesa em problemas que utilizem comandos condicionais aninhados. • Praticar os comandos condicionais aninhados em problemas computacionais. • Descrever a utilização dos comandos iterativos for e while em estruturas aninhadas em problemas de nível inicial. • Desenvolver testes de mesa em programas que utilizem comandos iterativos aninhados. • Resolver problemas computacionais, utilizando comandos iterativos aninhados. • Diferenciar os tipos de arquivos. • Descrever as formas de manipulação de arquivos. • Identificar as operações com arquivos. • Explicar a leitura de arquivos no formato txt nos diferentes modos de abertura. • Definir a leitura de arquivos no formato csv nos diferentes modos de abertura. • Ler arquivos em diferentes problemas computacionais. unidade 3 O conteúdo deste livro é disponibilizado por SAGAH. Parte 1 Conceitos básicos de algoritmos em Python LABORATÓRIO DE PROGRAMAÇÃO 144 Conceitos básicos de algoritmos em Python Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: Descrever a estrutura básica de um algoritmo em Python. Analisar algoritmos e programas. Resolver problemas utilizando programação. Introdução As pessoas usam o pensamento lógico constantemente, muitas vezes sem perceber. Por exemplo, quando você acorda de manhã e realiza uma sequência de etapas até estar pronto para sair para o trabalho ou ir até a universidade, você está utilizando o pensamento lógico-algorítmico. Se todas essas etapas fossem escritas, obedecendo certa ordem, no formato de itens de uma lista, haveria um algoritmo. No seu cotidiano, sem se dar conta, você está continuamente resol- vendo problemas por meio do pensamento lógico. Na computação, isso não é diferente, e questões computacionais também podem ser resolvidas por meio do pensamento lógico-algorítmico. Neste capítulo, você vai estudar os conceitos básicos de algoritmos e ver como eles podem ser usados para resolver problemas computacio- nais. Para a solução desses problemas, é necessário usar o pensamento lógico-algorítmico, aplicado na forma de instruções e com etapas bem definidas para atingir determinado objetivo. Assim, você também vai verificar como essas instruções podem ser representadas por meio de estruturas visuais ou, na forma escrita, por meio de pseudocódigo. Além disso, você vai ver exemplos de algoritmos na linguagem de programação Python. 145 Programação Python UNIDADE 3 Conceitos básicos de algoritmos em Python PARTE 1 Resolução de problemas com programação No momento da concepção de um programa e para que haja coerência com o que se está propondo resolver, é necessária certa atenção para entender o pro- blema e apresentar uma solução viável. Descobrir um método para solucionar determinado problema não é uma tarefa tão simples assim. Dessa forma, a construção de um programa pode ser melhor executada quando se levam em conta alguns itens importantes. Veja a seguir. Requisitos do programa: você deve compreender as informações fornecidas (a entrada) e os resultados que devem ser produzidos (a saída). É preciso escrever uma descrição rigorosa da entrada e da saída, que cubra todos os casos do programa. Arquitetura: na programação, sempre existe a possibilidade de lidar com vários tipos de objetos e dados diferentes, como um cálculo, uma lista, uma simulação, entre outras infinitas situações. Para cada caso, haverá algumas operações básicas a serem executadas, como imprimir algo, adicionar algo ou mesmo buscar algo. O ideal é escrever essas operações na forma de pequenos procedimentos de algoritmo para resolver o problema de acordo com os requisitos do programa. Também é possível utilizar uma notação de linguagem natural, chamada pseu- docódigo, para fazer uma descrição narrativa dos passos e da ordem das instruções. Por sua vez, as instruções devem ser claras o bastante para determinar de forma única e completa as ações necessária em cada passo do programa. O pseudocódigo (ou pseudolinguagem) é uma forma de representação algorítmica (GUIMARÃES; LAGES, 1985). Além disso, é praticamente um programa escrito em linguagem natural e que tem a possibilidade de ser transmitido ao computador, com uso de algumas ferramentas que leem pseu- docódigos. Para escrever códigos em pseudocódigo, é necessário conhecer as instruções básicas de um pseudocódigo. A seguir, veja as instruções de uma pseudolinguagem. a) ESCREVA (“ ”): essa instrução é usada para exibir uma mensagem na tela. b) LEIA: essa instrução é usada para ler valores que são digitados no teclado. c) <- (recebe): essa instrução é usada como comando de atribuição. Conceitos básicos de algoritmos em Python2 LABORATÓRIO DE PROGRAMAÇÃO 146 d) INÍCIO: essa instrução é usada para iniciar o programa principal. e) FIM: essa instrução é usada para finalizar o algoritmo principal. f) VAR: essa instrução é usada para declarar variáveis. g) ALGORITMO: essa instrução é usada para indicar o início do programa. h) FIM ALGORITMO: essa instrução é usada para indicar o final do programa. i) ENQUANTO: essa instrução é usada para iterar enquanto uma condição for verdadeira. j) PARA: essa instrução é usada também para iterar enquanto uma con- dição for verdadeira. k) FIM PARA: essa instrução é usada para indicar o final da instrução PARA. l) SE ... ENTÃO: essa instrução é usada para avaliar se uma expressão é verdadeira ou falsa. Se for verdadeira, executa a instrução que está no corpo. m) SENÃO SE: essa instrução também é usada para avaliar se uma ex- pressão é verdadeira ou falsa. Se for verdadeira, executa a instrução que está no corpo. n) SENÃO: essa instrução é usada para avaliar uma expressão caso as instruções SE ou SENÃO SE não sejam executadas. o) FIM SE: essa instrução é usada para indicar o final da instrução SE. Veja a seguir um exemplo de algoritmo em pseudocódigo: ALGORITMO “somar e escrever se a soma é maior, menor ou igual a 10” VAR valor: real soma: real INÍCIO soma <- 0 ESCREVA (“Digite um ‘valor’ ou 0 para parar:”) LEIA valor 3Conceitos básicos de algoritmos em Python 147 Programação Python UNIDADE 3 Conceitos básicos de algoritmos em Python PARTE 1 Além de serem representados pela pseudolinguagem, algoritmos também podem ser representados por símbolos que compõem uma notação visual. O conjunto desses símbolos dispostos de forma estruturada é conhecido como fluxograma. Um fluxograma é um diagrama que descreve um processo, sistema ou algoritmo de computador. Ele é amplamente utilizado em vários campos para documentar, estudar, planejar, melhorar e comunicarprocessos (às vezes) complexos em diagramas claros e fáceis de entender. Os fluxogramas usam retângulos ovais, diamantes e outras formas para definir o tipo de etapa, juntamente com as setas de conexão para definir o fluxo e a sequência. Eles podem variar de gráficos simples e desenhados à mão a diagramas detalhados, desenhados por computador, representando várias etapas e rotas. Às vezes, os fluxogramas são chamados por nomes mais especializados, como fluxograma de processo, mapa de processos, fluxograma funcional, mapeamento de processos de negócios, modelagem e notação de processos de negócios (Business Process Model and Notation — BPMN) ou diagrama de fluxo de processos (Process Flow Diagram — PFD). Eles estão relacionados a outros diagramas populares, como Diagramas de Fluxo de Dados (DFDs) e diagramas de atividade da linguagem de modelagem unificada (Unified Modeling Language — UML). A seguir, veja os símbolos mais comuns de um fluxograma. ENQUANTO valor <> 0 FAÇA soma <- soma + valor ESCREVA (“Soma atual: soma”) ESCREVA (“Digite um ‘valor’ ou 0 para parar:”) LEIA valor FIMENQUANTO SE soma > 10 ENTÃO ESCREVA (“Soma é maior que 10”) SENÃO SE soma < 10 ENTÃO ESCREVA (“Soma é menor que 10”) SENÃO ESCREVA (“Soma é igual a 10”) FIM SE FIM FIM ALGORIMTO Conceitos básicos de algoritmos em Python4 LABORATÓRIO DE PROGRAMAÇÃO 148 Terminal: tem a forma oval e é usado para representar o início e o fim de um processo. Processo: tem a forma retangular e é obrigatório quando você inicia o fluxograma. Representa qualquer etapa do processo, como tarefas ou ações básicas. Seta (ou flecha): é usada para guiar o visualizador ao longo do caminho do fluxograma e indicar qual é a direção do fluxo de dados. Decisão: tem a forma de um diamante e simboliza que é necessária uma decisão para avançar. Pode ser uma escolha binária — por exemplo, sim ou não, verdadeiro ou falso — ou mesmo uma decisão mais complexa, com várias opções. Entrada/saída: tem a forma de um paralelogramo e simboliza a entrada ou a saída de dados. Com esses cinco símbolos básicos, você tem quase tudo o que é necessário para diagramar um fluxograma simples (Figura 1). Figura 1. Símbolos básicos de um fluxograma. Codificação: escolher adequadamente o que será utilizado para cada tipo de dado torna a solução do problema mais eficiente. É no momento da codificação que se escolhem as representações para os objetos de dados que serão utilizados no algoritmo. Quando já se tem um pseu- docódigo para a solução do problema, a tradução do algoritmo para uma linguagem de programação é quase imediata. Na linguagem de programação Python, por exemplo, existem vários tipos de objetos que representam os conceitos de listas, matrizes, dicionários, filas, pilhas, entre outras estruturas. 5Conceitos básicos de algoritmos em Python 149 Programação Python UNIDADE 3 Conceitos básicos de algoritmos em Python PARTE 1 A seguir, veja o mesmo algoritmo apresentado em pseudocódigo, mas agora escrito na linguagem de programação Python. # somar e escrever se a soma é maior, menor ou igual a 10 soma = 0 valor = float(input("Digite um 'valor' ou 0 para parar:")) while valor != 0: soma += valor print(f"Soma atual: {soma}") valor = float(input("Digite um 'valor' ou 0 para parar:")) if soma > 10: print("Soma é maior que 10") elif soma < 10: print("Soma é menor que 10") else: print("Soma é igual a 10") Análise de algoritmos e programas A razão mais objetiva para se analisar um algoritmo é descobrir suas carac- terísticas a fi m de avaliar sua adequação a várias aplicações, ou compará-lo com outros algoritmos para a mesma aplicação. Além disso, a análise de um algoritmo pode ajudar o desenvolvedor a entendê-lo melhor e sugerir melhorias. Os algoritmos tendem a se tornar mais curtos, mais simples e mais elegantes durante o processo de análise. Existe um ramo da ciência da computação teórica chamado complexidade de algoritmos, cujo objetivo é classificar os algoritmos de acordo com sua eficiência (SEDGEWICK; FLAJOLET, 2019). Do mesmo modo, um problema computacional comumente chamado de complexidade computacional é classificado de acordo com o seu nível de dificuldade. Essas classificações ge- ralmente se concentram no desempenho do pior caso na ordem de crescimento. Conceitos básicos de algoritmos em Python6 LABORATÓRIO DE PROGRAMAÇÃO 150 Um dos pontos principais da análise de um algoritmo é o tempo. Uma análise detalhada e completa do tempo de execução de um algoritmo envolve as etapas listadas a seguir. 1. Implementar o algoritmo completamente para a análise. 2. Determinar o tempo necessário para cada operação básica, tais como cálculos, repetições, instruções, etc. 3. Identificar quantidades desconhecidas que podem ser usadas para descrever a frequência de execução das operações básicas, como a quantidade de operações que crescem exponencialmente durante a execução do algoritmo. 4. Desenvolver um modelo realista para a entrada no programa. 5. Analisar as quantidades desconhecidas, assumindo a entrada modelada. 6. Calcular o tempo total de execução multiplicando o tempo pela frequên- cia de cada operação e adicionando todos os produtos da soma ao final. Os algoritmos geralmente são bem diferentes entre si, embora muitas vezes o objetivo deles seja o mesmo. Ao considerar um algoritmo para um problema específico, você deve começar a perceber os padrões, para que tipos de problemas semelhantes possam ser resolvidos com a ajuda desse algoritmo. Por exemplo, sabe-se que um conjunto de números pode ser classificado por meio de algoritmos diferentes. O número de comparações realizadas por um algoritmo pode ser diferente da quantidade de comparações realizadas por outro algoritmo, ainda que ambos sejam para a mesma entrada de dados. Portanto, a complexidade do tempo desses algoritmos pode ser diferente. Além disso, é necessário calcular o espaço de memória exigido por cada algoritmo. Assim, você deve levar em conta sob quais hipóteses o algoritmo vai operar. Geralmente, realizam-se os tipos de análise elencados a seguir. Pior caso: número máximo de etapas executadas em qualquer instância do algoritmo. Melhor caso: número mínimo de etapas executadas em qualquer ins- tância do algoritmo. Caso médio: número médio de etapas executadas em qualquer instância do algoritmo. Em resumo, a análise de algoritmo é o processo de analisar a capacidade de resolução de problemas do algoritmo em termos de tempo e tamanho necessá- rios (o tamanho da memória para armazenamento durante a implementação). 7Conceitos básicos de algoritmos em Python 151 Programação Python UNIDADE 3 Conceitos básicos de algoritmos em Python PARTE 1 Para saber mais sobre o assunto deste capítulo, acesse o link a seguir (em inglês). Nele, você vai encontrar excelentes explicações sobre níveis mais avançados de análises de algoritmos, tais como análise assintótica e análise amortizada. https://qrgo.page.link/RzqX5 Estrutura básica de algoritmo A estrutura básica de um algoritmo é formada por vários componentes, co- mumente encontrados na maioria dos algoritmos. Esses componentes deter- minam como se dará o fl uxo de execução da tarefa, desde a inicialização até o encerramento (MOKARZEL; SOMA, 2008). Assim, pode haver determinado problema que, para ser resolvido, requer uma quantidade maior ou menor de componentes, dependendo da sua complexidade. Dessa forma, a execução de um programa pode ser mais efi ciente quando é levado em conta o comporta- mento das estruturas básicas de algoritmos(Figura 2). Variáveis e constantes: esse componente de algoritmo possui conteúdo temporário e é usado para armazenar informações adicionais que uma instrução precisa para funcionar corretamente ou de forma efetiva. Seus valores podem variar conforme a execução do algoritmo progride, por isso o nome “variável”. Em contrapartida, as constantes armazenam valores que não são alterados durante a execução do algoritmo. Por exemplo, o valor PI usado para calcular a área do círculo é uma constante, já que seu valor não muda. Instruções: a instrução é um dos componentes principais de um algo- ritmo. Um algoritmo contém em si mesmo uma série de subalgoritmos, sendo que cada um deles executa uma tarefa menor. Por exemplo, realizar o cálculo de uma equação pode ser uma tarefa muito grande para ser feita por apenas uma instrução. Assim, algumas tarefas, tais como adição, subtração, multiplicação e divisão, podem ser consideradas ins- truções menores e auxiliam na tarefa principal, que, no caso, é calcular a equação. Dessa forma, todos os algoritmos podem ser, eventualmente, divididos ou fatorados em instruções menores. Conceitos básicos de algoritmos em Python8 LABORATÓRIO DE PROGRAMAÇÃO 152 Condicionais: em algum momento da execução de uma tarefa, alguns algoritmos podem ter de tomar determinadas decisões. Por exemplo, se a soma dos dois valores em questão for maior ou menor do que outro valor, quando comparados, a tarefa segue por determinado caminho de fluxo; caso contrário, a tarefa segue por outro caminho. Os componentes condi- cionais permitem que um algoritmo execute instruções seletivamente com base em certas condições que devem ser satisfeitas, dependendo do caso. Repetições: esse componente de algoritmo permite executar determinadas instruções repetidas vezes, até que dada condição seja satisfeita. Existem casos, como uma lista, em que é necessário repetir uma instrução para cada elemento existente. Há também outros casos em que é preciso repetir um conjunto de instruções até um objetivo ser alcançado, ou até uma condição ser satisfeita. As repetições podem conter em si outras instruções, incluindo repetições comumente chamadas de “repetições aninhadas”. Figura 2. Fluxograma das estruturas básicas de algoritmo para controle de fluxo de execução. Estruturas básicas de algoritmo em Python Antes de você se aprofundar no assunto das estruturas básicas em Python, deve entender o que realmente é essa linguagem e qual é o objeto pelo qual ela foi criada. Python é uma linguagem de programação e, como tal, possui algumas características ou atributos próprios. A seguir, veja o que, em síntese, esses atributos querem dizer. Tem sintaxe bonita: nesse atributo, estão em jogo as regras que determi- nam os comandos, as palavras reservadas, as declarações, a indentação do código, as descrições formais, os operadores, etc. 9Conceitos básicos de algoritmos em Python 153 Programação Python UNIDADE 3 Conceitos básicos de algoritmos em Python PARTE 1 Tem semântica inteligente: a semântica é o significado de cada item da sintaxe. Por exemplo, uma das instruções de repetição na linguagem de programação Python tem a sintaxe while, e a semântica dessa sintaxe é “repita enquanto a condição for verdadeira”. É uma linguagem interpretada: o interpretador do Python, que são os algoritmos internos da linguagem, executa o código-fonte diretamente, traduzindo cada linha de código para instruções de máquina. É de alto nível: o interpretador sabe lidar com os detalhes técnicos do computador. Assim, desenvolver um código é mais simples do que em linguagens de baixo nível, nas quais o programador deve se preocupar com detalhes da máquina, tais como quantidade de memória disponível, capacidade do processador, etc. É de propósito geral: o Python pode ser usado para desenvolver progra- mas em diversas áreas, ao contrário de linguagens de domínio específico, que são especializadas e atendem somente a determinada aplicação. É dinamicamente tipada: não é necessário informar o tipo no momento da declaração da variável. O interpretador se encarrega de descobrir que tipo tem cada variável. É fortemente tipada: em Python, não é possível realizar operações com tipos diferentes. Por exemplo, na tentativa de somar um valor do tipo int (inteiro) com outro valor do tipo list (lista), o Python levantará uma exceção de erro. Por essas e outras características, o Python consegue ser uma linguagem simples, de sintaxe bonita, legível e amigável. Além disso, muitas empresas, como a Nasa, o Google, o Facebook e a Amazon, utilizam o Python diariamente. Para instalar a linguagem Python, primeiramente deve-se realizar o download do interpretador da linguagem, acessando o primeiro link listado a seguir. Essa página contém os links dos instaladores para variados tipos de sistemas operacionais, tais como Windows, Linux e Mac OS X. Para cada tipo de sistema operacional, é recomendado seguir o guia de instalação específico do Python, disponível no segundo link. https://qrgo.page.link/2otU8 https://qrgo.page.link/oCyNg Conceitos básicos de algoritmos em Python10 LABORATÓRIO DE PROGRAMAÇÃO 154 O desenvolvimento do Python começou no final da década de 1980, por Guido van Rossum. Ele decidiu usar esse nome porque estava lendo um ro- teiro do Monty Python, um grupo de comédia britânico da década de 1970. Assim, a versão 1.0 do Python foi publicada em 1994, a versão 2.0, em 2000, e a versão 3.0, em 2008. Há diversos ambientes integrados de desenvolvimento (no inglês Integrated Develop- ment Environment — IDE) que dão suporte à linguagem de programação Python, sendo que alguns são mais simples e outros são mais complexos. Esses ambientes auxiliam significativamente nos seguintes quesitos: identificação das variáveis que foram declaradas; identificação dos erros no código; personalização do ambiente de trabalho; ocultação de parte do código para melhor visualização, etc. Ficam como dica alguns IDEs: PyCharm Edu Atom IDLE Spyder Assim, você pode pesquisar as características de cada um deles no Google, fa- zer o download no site do desenvolvedor do IDE e instalar o que você achar mais interessante. Os algoritmos geralmente são criados usando pseudocódigo e são in- dependentes das linguagens subjacentes, ou seja, um algoritmo pode ser implementado em mais de uma linguagem de programação. Da mesma forma, a maioria das linguagens de programação compartilha instruções básicas de código, como as repetições, os controles de fluxo, etc. Assim, quase todos os algoritmos têm a possiblidade de ser implementados na linguagem de programação Python. No Python, as variáveis, funções e estruturas de dados são tratadas como objetos. Um identificador no Python é um nome usado para identificar esses objetos. 11Conceitos básicos de algoritmos em Python 155 Programação Python UNIDADE 3 Conceitos básicos de algoritmos em Python PARTE 1 A seguir, veja exemplos de identificadores para nomear objetos: nome = "Paulo" idade = 25 estado _ civil = "solteiro" PI = 3.1415 Para declarar um identificador, você pode usar os conjuntos de letras (de A até Z e de a até z), os dígitos (de 0 a 9) e também o caractere especial subli- nhado (_) (ROSSUM, 2001). O Python não permite caracteres especiais para identificadores, tais como os símbolos @, $ e %, pois alguns deles também são operadores aritméticos nessa linguagem. O Python é uma linguagem de programação sensível ao caso (case-sensitive), ou seja, que faz distinção entre letras maiúsculas e letras minúsculas. Por exemplo, no Python, os objetos do tipo string “feliz” e “FELIZ” são diferentes entre si. Algumas linguagensde programação, como o Java e o PHP, exigem que, para cada bloco de código, seja usado um par de chaves para indicar o corpo do bloco. No Python, não são necessárias essas chaves, pois os blocos de código são indicados por um recuo de linha, que é chamado de indentação (PYTHON SOFTWARE FOUNDATION, 2019a). A quantidade de espaços em branco na indentação é variável (geralmente quatro espaços), porém todas as instruções dentro do bloco devem ser recuadas com a mesma quantidade de espaços. Assim, todas as linhas recuadas com o mesmo número de espaços formam um bloco de código, e este termina quando a próxima linha tiver uma indentação diferente. Conceitos básicos de algoritmos em Python12 LABORATÓRIO DE PROGRAMAÇÃO 156 Veja um exemplo de bloco de código com uma estrutura de controle de fluxo: if 'a' == 'b': # início do bloco print('a é igual a b') a = 2 + 2 b = 1 + 3 Um tipo de dado é na verdade um conjunto de valores com um conjunto de operações definidas para esses valores. O Python pode armazenar em memória diferentes tipos de dados, pois esses tipos estão embutidos nessa linguagem de programação. Por exemplo, imagine que seja necessário armazenar os dados do endereço de uma pessoa. Isso pode ser feito do seguinte modo: o número da casa da pessoa pode ser armazenado como um valor numérico, e o nome da rua em que a pessoa mora pode ser armazenado como texto. No Python, também é possível somar dois valores numéricos, mas não é possível somar um número e uma frase (texto). Os tipos de dados mais comuns que o Python possui são: numéricos, cadeias de caracteres (strings), listas, tuplas, conjuntos e dicionários (PYTHON SOFTWARE FOUNDATION, 2019b). Veja a seguir um exemplo dos tipos de dados lista e dicionário: lista = [1, 2, 3, 4] dicionario = { 'nome': 'Paulo', 'idade': 25, 'estado _ civil': 'solteiro' } 13Conceitos básicos de algoritmos em Python 157 Programação Python UNIDADE 3 Conceitos básicos de algoritmos em Python PARTE 1 Operadores são estruturas que podem manipular os valores dos dados (PYTHON SOFTWARE FOUNDATION, 2019c). O Python dispõe de um vasto conjunto de operadores para realizar operações. Esses operadores tam- bém são chamados de “operadores relacionais”. Por exemplo, os operadores de comparação analisam os valores em ambos os lados de uma expressão e decidem a relação entre eles. Os operadores mais comuns são os que realizam operações aritméticas, de comparação, lógicas, bit a bit, etc. Veja um exemplo de alguns operadores aritméticos: a = 2 + 2 # 4 b = 3 - 1 # 2 c = 4 * 3 # 12 d = 6 / 2 # 3 Estruturas de controle de fluxo avaliam expressões que produzem verda- deiro ou falso como resultado. No Python, a tomada de decisão é de extrema importância, pois é a antecipação das condições que ocorrem durante a execu- ção do programa. Com essas estruturas, é possível seguir determinado fluxo de execução e, de acordo com as condições (verdadeiro ou falso), tomar certas decisões (PYTHON SOFTWARE FOUNDATION, 2019d). Veja a seguir um exemplo de algumas estruturas de controle para decisão: if a > b: print('a é igual a b') elif a < b: print('a é diferente de b') else: print('a é b são iguais') Conceitos básicos de algoritmos em Python14 LABORATÓRIO DE PROGRAMAÇÃO 158 Uma estrutura de repetição permite executar uma instrução ou grupo de instruções várias vezes. A linguagem de programação Python fornece algumas estruturas para lidar com os requisitos de repetição. Essas estruturas testam repetidamente a expressão e, se ela for verdade, executam o primeiro conjunto; se a expressão for falsa, o que pode ser verificado na primeira vez que ela é testada, o fluxo segue para o fim da repetição (PYTHON SOFTWARE FOUNDATION, 2019d). Veja um exemplo de duas estruturas de repetição: # while i = 0 while i < 5: print(i) i += 1 # for for i in range(5): print(i) Nos links a seguir (em inglês), você pode consultar uma vasta gama de exemplos de estruturas em Python. https://qrgo.page.link/MXfDk https://qrgo.page.link/8yXEX https://qrgo.page.link/qftMj 15Conceitos básicos de algoritmos em Python 159 Programação Python UNIDADE 3 Conceitos básicos de algoritmos em Python PARTE 1 GUIMARÃES, A. M.; LAGES, N. A. C., Algoritmos e estruturas de dados. Rio de Janeiro: LTC, 1985. MOKARZEL, F.; SOMA, N. Introdução à ciência da computação. Rio de Janeiro: Elsevier, 2008. PYTHON SOFTWARE FOUNDATION. Built-in types. [2019c]. Disponível em: https://docs. python.org/3/library/stdtypes.html. Acesso em: 30 dez. 2019. PYTHON SOFTWARE FOUNDATION. Data types. [2019a]. Disponível em: https://docs. python.org/3/library/datatypes.html. Acesso em: 30 dez. 2019. PYTHON SOFTWARE FOUNDATION. Lexical analysis. [2019b]. Disponível em: https:// docs.python.org/3/reference/lexical_analysis.html?highlight=indent#indentation. Acesso em: 30 dez. 2019. PYTHON SOFTWARE FOUNDATION. More control flow tools. [2019d]. Disponível em: https://docs.python.org/3/tutorial/controlflow.html?highlight=elif#more-control- -flow-tools. Acesso em: 30 dez. 2019. ROSSUM, G. PEP 8: style guide for Python code. 2001. Disponível em: https://www. python.org/dev/peps/pep-0008/#naming-conventions. Acesso em: 30 dez. 2019. SEDGEWICK, R.; FLAJOLET, P. An introduction to the analysis of algorithms. [2019]. Dispo- nível em: https://aofa.cs.princeton.edu/home/. Acesso em: 30 dez. 2019. Leituras recomendadas PYTHON COURSE. Python3 tutorial. 2019. Disponível em: https://www.python-course. eu/python3_course.php. Acesso em: 30 dez. 2019. TUTORIALS POINT. DAA: methodology of analysis. 2019a. Disponível em: https://www. tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_al- gorithms_methodology.htm. Acesso em: 30 dez. 2019. TUTORIALS POINT. Python tutorial. 2019b. Disponível em: https://www.tutorialspoint. com/python/index.htm. Acesso em: 30 dez. 2019. W3SCHOOLS. Python tutorial. 2019. Disponível em: https://www.w3schools.com/ python/. Acesso em: 30 dez. 2019. Conceitos básicos de algoritmos em Python16 LABORATÓRIO DE PROGRAMAÇÃO 160 ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO PELA SAGAH PARA ESTA PARTE DA UNIDADE. PREZADO ESTUDANTE Os links para sites da Web fornecidos neste capítulo foram todos testados, e seu fun- cionamento foi comprovado no momento da publicação do material. No entanto, a rede é extremamente dinâmica; suas páginas estão constantemente mudando de local e conteúdo. Assim, os editores declaram não ter qualquer responsabilidade sobre qualidade, precisão ou integralidade das informações referidas em tais links. 17Conceitos básicos de algoritmos em Python unidade 3 O conteúdo deste livro é disponibilizado por SAGAH. Parte 2 Variáveis, tipos de dados e operadores de algoritmos em Python LABORATÓRIO DE PROGRAMAÇÃO 162 Variáveis, tipos de dados e operadores de algoritmos em Python Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: Descrever a organização de dados manipuláveis por um algoritmo na memória do computador. Formular soluções algorítmicas empregando os diferentes operadores. Interpretar soluções algorítmicas de manipulação de dados. Introdução Ao contrário de um ser humano, um computador não sabe a diferença entre a expressão “1234” e a expressão “abcd”. Para haver essa distinção em um sistema computacional, é necessária uma classificação que de- termine o que uma variável (ou objeto) pode conter. Variáveis e tipos de dados são fatores importantes em praticamente todas as linguagens de programação de computadores, incluindo a linguagem de programação Python. Quando os programadores criam aplicativosde computador, seja para desktop, mobile ou mesmo para a Web, os tipos de dados devem ser referenciados e usados corretamente para garantir o resultado adequado e um programa sem erros. Neste capítulo, você vai ver como manipular variáveis que armazenam qualquer tipo de dado, sejam dados numéricos, sequenciais ou lógicos. Você também vai conhecer uma variedade de operadores, como ope- radores aritméticos, relacionais (ou de comparação), binários, lógicos e de atribuição. Além disso, você vai estudar a estrutura e o processo de avaliação de expressões, incluindo os conceitos de precedência dos operadores e associatividade de um operador. 163 Programação Python UNIDADE 3 Variáveis, tipos de dados e operadores de algoritmos em Python PARTE 2 Gerenciamento de memória e variáveis Antes de você estudar as variáveis e os tipos de dados, deve compreender como o Python funciona e como as variáveis escritas em Python se comportam na memória de um computador. Para isso, é possível fazer uma analogia entre a memória de um computador e um livro de vários autores com espaços ainda vazios. Nesse livro, ainda não há muita coisa escrita nas páginas e, eventu- almente, diferentes autores aparecerão. Cada autor deseja algum espaço para escrever sua própria história. Porém, como eles não podem escrever um em cima do texto do outro, devem ter cuidado com as páginas em que escrevem. Assim, antes de começarem a escrever, consultam o gerente do livro. O gerente decide em que local do livro cada autor tem permissão para escrever. Como esse livro existe há muito tempo, muitas histórias contidas nele não são mais relevantes. Assim, quando ninguém lê ou faz referência àquelas histórias sem relevância, elas são removidas para abrir espaço para novas narrativas. Na verdade, em computação, é comum chamar blocos contíguos de “páginas de memória de comprimento fixo”. Portanto, essa analogia serve muito bem para se falar de memória de computador. Em essência, a memória do com- putador é como aquele livro, e os autores são como diferentes aplicativos ou processos que precisam armazenar dados na memória. O gerente, que decide onde os autores podem escrever no livro, desempenha o papel de um tipo de gerenciador de memória. Por fim, a pessoa que removeu as histórias antigas para dar lugar a novas é um coletor de lixo de memória. O gerenciamento de memória é o processo pelo qual os aplicativos leem e gravam dados. Um gerenciador de memória determina onde colocar os dados de um aplicativo. A memória, como as páginas do livro da analogia, são finitas. Logo, o gerente precisa encontrar algum espaço livre e fornecê-lo ao aplicativo. Esse processo de fornecer memória é geralmente chamado de alocação de memória. Assim, quando um dado não é mais necessário, ele pode ser excluído ou liberado. Porém, a pergunta que fica é: liberado para onde? De onde veio essa “memória”? Variáveis, tipos de dados e operadores de algoritmos em Python2 LABORATÓRIO DE PROGRAMAÇÃO 164 Em algum lugar do computador, existe um dispositivo físico que armazena dados quando se executa programas Python. Existem muitas camadas de abstração pelas quais o código Python passa antes que os objetos cheguem ao hardware. Uma das principais camadas acima do hardware (como RAM ou disco rígido) é o Sistema Operacional (SO). O SO realiza (ou nega) solici- tações para ler ou gravar o dado (ou informação) na memória. Acima do SO, existem aplicativos, um dos quais é a implementação padrão do Python, que vem por padrão incluída no sistema operacional, ou pode ser baixada do site oficial (www.python.org). O gerenciamento de memória para o código Python é tratado pelo aplicativo Python. O modo como o Python manipula e gerencia os dados de memória é o foco deste capítulo. A implementação padrão do Python, chamada de “CPython”, é escrita na linguagem de programação C (PYTHON SOFTWARE FOUNDATION, 2019b). Ela converte seu código Python em instruções que são executadas em uma máquina virtual. Máquinas virtuais são como computadores físicos, mas são implementadas em software. Elas geralmente processam instruções básicas semelhantes às instruções de montagem (assembly). Assim, Python é uma linguagem de programação interpretada. Seu código Python é previamente compilado para obter instruções mais legíveis para computador, chamadas bytecode. Essas instruções são interpretadas por uma máquina virtual quando o código Python é executado. É importante observar que existem outras implementações além do CPython. O IronPython, por exemplo, é compilado para execução no Com- mon Language Runtime (CLR) da Microsoft. O Jython também é compilado no bytecode da linguagem de programação Java para ser executado na Java Virtual Machine (JVM). O CPython é escrito na linguagem de programação C, que não suporta nativamente a programação orientada a objetos. Por esse motivo, existem alguns designs interessantes no código CPython. Tudo no Python é um objeto, mesmo tipos como int (inteiro) e str (string). Assim, em partes, isso é verdade em um nível de implementação no CPython. Existe uma estrutura chamada “PyObject”, que todos os outros objetos do 3Variáveis, tipos de dados e operadores de algoritmos em Python 165 Programação Python UNIDADE 3 Variáveis, tipos de dados e operadores de algoritmos em Python PARTE 2 CPython usam. Pode-se dizer que o PyObject é pai de todos os objetos em Python; ele contém apenas dois elementos: ob_refcnt, que é a contagem de referência, e ob_type, que é o ponteiro para outro tipo de objeto. A contagem de referência é usada para coleta de lixo. Então, há um ponteiro para o tipo de objeto real. Esse tipo de objeto é apenas outra estrutura que descreve um objeto Python, como um dict (dicionário) ou um int (inteiro). Cada objeto tem seu próprio alocador de memória específico e sabe fazer com que a memória o armazene. Além disso, cada objeto possui um desalo- cador de memória específico que “libera” a memória quando ela não é mais necessária. No entanto, há um fator importante envolvendo todo esse assunto sobre alocação e liberação de memória. A memória é um recurso compartilhado no computador, e situações desagradáveis podem acontecer se dois processos diferentes tentarem gravar (escrever) no mesmo local ao mesmo tempo. O Python tem um recurso chamado Global Interpreter Lock (GIL), que é uma solução para o problema comum de ter de lidar com recursos com- partilhados, como a memória em um computador (PYTHON SOFTWARE FOUNDATION, 2019b). Quando dois processos (ou threads) tentam modificar o mesmo recurso ao mesmo tempo, eles podem “pisar nos dedos” um do outro. O resultado final pode ser uma bagunça ilegível, em que nenhum dos processos termina como esperado. Considerando a analogia do livro apresen- tada anteriormente, suponha que dois autores decidam “teimosamente” que é a vez deles de escrever. Não apenas isso, mas ambos precisam escrever na mesma página do livro e, ainda, ao mesmo tempo. Cada um dos autores ignora a tentativa do outro de criar uma história e começa a escrever na página. O resultado final serão duas histórias, uma em cima da outra, o que tornará toda a página completamente ilegível. Uma solução viável para o problema de memória compartilhada é fazer um bloqueio global e único no interpretador toda vez que um processo interage com a memória (a página do livro). Nesse caso, em outras palavras, apenas um autor de cada vez pode escrever naquela página. O GIL do Python realiza isso bloqueando todo intérprete, o que significa que não é possível que outro processo interfira no processo que está sendo realizado. Quando o CPython manipula a memória, ele usa o GIL para garantir segurança. Assim, o geren- ciamento de memória é parte integrante do trabalho com computadores,e o Python lida com quase tudo nos bastidores. Na Figura 1, a seguir, veja um exemplo genérico do gerenciador de memória em Python. Variáveis, tipos de dados e operadores de algoritmos em Python4 LABORATÓRIO DE PROGRAMAÇÃO 166 Figura 1. Gerenciador de memória em Python. Variáveis em Python Em Python, quando se fala em variável, deve-se pensar em uma variável como um nome anexado a um objeto específi co (PYTHON SOFTWARE FOUNDATION, 2019c). No Python, as variáveis não precisam ser declaradas ou defi nidas com antecedência, como é o caso em muitas outras linguagens de programação, por exemplo, C ou Java. Para criar uma variável, basta defi nir um nome, atribuir um valor para ela e começar a usá-la. A atribuição é feita com um único sinal de igual (=): nome = "John" Isso é lido ou interpretado como “para ‘nome’, seja atribuído o valor ‘John’”. Uma vez feito isso, o identificador “nome” pode ser usado em uma instrução (ou declaração) ou expressão. Em muitas linguagens de programação, as variáveis são declaradas esta- ticamente. Isso significa que uma variável é inicialmente relacionada a um tipo de dados específico, e qualquer valor atribuído a ela durante sua vida útil deve ter sempre esse tipo. Variáveis em Python não estão sujeitas a essa restrição. No Python, uma variável pode ser atribuída a um valor de um tipo e, posteriormente, redesignada a um valor de tipo diferente. 5Variáveis, tipos de dados e operadores de algoritmos em Python 167 Programação Python UNIDADE 3 Variáveis, tipos de dados e operadores de algoritmos em Python PARTE 2 var = 5.7 print(id(var)) # Endereço na memória: 4557936080 print(var) # Resultado: 5.7 print(type(var)) # Resultado: <class 'float'> var = 'Agora eu sou uma string' print(id(var)) # Endereço na memória: 4497916832 print(var) ## Resultado: Agora eu sou uma string print(type(var)) # Resultado: <class 'str'> No exemplo que você acabou de ver, foi utilizada uma função chamada “type()”. Essa função tem o objetivo de imprimir o tipo de dado que um objeto possui. Quando são apresentadas as instruções do exemplo, o interpretador Python está realizando os passos listados a seguir. 1. Crie na memória um objeto do tipo ponto flutuante ( float) cujo iden- tificador é “var”. 2. Atribua-lhe o valor 5.7. 3. Exiba no console o número do identificador do objeto “var”. 4. Exiba no console o valor contido em “var”. 5. Exiba no console o tipo da classe do objeto “var”. 6. Crie na memória um novo objeto do tipo str cujo identificador é “var”, porém, como já existe um objeto na memória com esse identificador, antes, destrua o antigo objeto “var”. 7. Atribua-lhe o valor “Agora eu sou uma string”. 8. Exiba no console o número do identificador do objeto “var”. 9. Exiba no console o valor contido em “variável”. 10. Exiba no console o tipo da classe do objeto. Variáveis, tipos de dados e operadores de algoritmos em Python6 LABORATÓRIO DE PROGRAMAÇÃO 168 O Python possui um tipo de função interna chamado “type()” para determinar o tipo de dados de uma variável ou o seu valor. Outra função interna é a “isinstance()”, que existe para testar se um objeto é uma instância de outro objeto. Pode-se dizer que o Python é uma linguagem forte e dinamicamente tipada, ou seja, uma variável pode ser atribuída com outro tipo durante a sua vida útil no sistema, porém não é possível fazer operações com tipos diferentes, a menos que isso esteja muito bem definido previamente. Por exemplo, não é possível fazer uma operação de soma entre um tipo inteiro e um tipo string, a menos que seja sobrescrito como realizar essa operação, desenhando um método próprio para esse tipo de caso. O Python é também uma linguagem altamente orientada a objetos. De fato, praticamente todos os itens de dados em um programa Python são objetos de um tipo ou classe específica (esse ponto será tratado mais adiante neste capí- tulo). Assim, pode-se dizer que uma variável Python tem um nome simbólico (identificador) e é uma referência (ou ponteiro) para um objeto. Depois que um objeto é atribuído a uma variável, é possível se referir a ele com esse nome. Porém, os dados em si ainda estão contidos no objeto. Um dos comportamentos das referências para um objeto em Python se dá por meio de um contador de referências. Quando se atribui um valor para uma variável, por exemplo, “a = 1”, uma referência “a” é adicionada ao objeto e a contagem de referência do valor “1” é incrementada. Quando o Python executa a próxima instrução, por exemplo, “b = 1”, já que se trata do mesmo valor (1), um novo objeto não é inicializado. O mesmo objeto na memória com o valor “1” apenas possui outra referência “b”. Isso faz parte do processo de gerenciamento de memória Python. Para “c = 2”, um novo objeto é criado novamente, pois ele possui um novo valor “2” com “c” como referência agora apontando para “1”. Por fim, se for atribuído um valor para uma nova variável, por exemplo, “d = a”, o gerenciador de memória incrementa mais uma referência para o objeto “1”, tendo também “d” como variável. O mesmo ocorre para valores de uma lista quando os elementos dela têm o mesmo valor atribuído a outra variável anteriormente. 7Variáveis, tipos de dados e operadores de algoritmos em Python 169 Programação Python UNIDADE 3 Variáveis, tipos de dados e operadores de algoritmos em Python PARTE 2 a = 1 print(id(a)) # ID: 4447157152 - Valor 1 tem 1 referência (a) b = 1 print(id(b)) # ID: 4447157152 - Valor 1 tem 2 referências (a e b) c = 2 print(id(c)) # ID 4466998208 - Valor 2 tem 1 referência (c) d = a print(id(d)) # ID: 4447157152 - Valor 1 tem 3 referências (a, b e c) L = [1, 1, 1, 1] # Valor 1 tem 7 referências (a b, c, L[0], L[1], L[2} e L[3]) print(id(L[0])) # ID: 4447157152 print(id(L[1])) # ID: 4447157152 print(id(L[2])) # ID: 4447157152 print(id(L[3])) # ID: 4447157152 Os exemplos apresentados até agora usaram nomes curtos para as variáveis. Mas nomes de variáveis podem ser mais detalhados. De fato, geralmente é mais benéfico quando o nome da variável representa o seu conteúdo, pois isso torna o objetivo da variável mais evidente à primeira vista. Oficialmente, os nomes de variáveis no Python podem ter qualquer tamanho e podem consistir em letras maiúsculas e minúsculas (A–Z, a–z), dígitos (0–9) e caractere sublinhado (_). Uma restrição adicional é que, embora um nome de variável possa conter dígitos, o primeiro caractere de um nome de variável nunca pode ser um dígito. Não há nada que impeça a criação de variáveis diferentes no mesmo programa denominadas “iDade”, “idade” e “idadE”. Mas isso é extremamente desaconselhá- vel. Sem sombra de dúvida, qualquer um que tentasse ler o código ficaria confuso. Até mesmo o próprio programador do código, depois de ficar um tempo sem lidar com ele, ficaria confuso. Assim, vale a pena dar a uma variável um nome que seja descritivo o suficiente para esclarecer para que ela está sendo usada. Variáveis, tipos de dados e operadores de algoritmos em Python8 LABORATÓRIO DE PROGRAMAÇÃO 170 Suponha que seja preciso calcular o número de pessoas que estão se formando na faculdade. É possível escolher qualquer um dos seguintes nomes: numerodeformandos = 1500 # Todas minúsculas NUMERODEFORMANDOS = 1500 # Todas maiúsculas numeroDeFormandos = 1500 # Camel Case NumeroDeFormandos = 1500 # Pascal Case numero _ de _ formandos = 1500 # Snake Case print(numerodeformandos, NUMERODEFORMANDOS, numeroDeFormandos, NumeroDeFormandos, numero _ de _ formandos) Todos os exemplos que você acabou de ver são melhores nomes do que apenas um “n”, um “ndf” ou similares. Pelo menos, é possível dizer pelo nome qual valor a variável representa. Por outro lado, nem todos são igualmentelegíveis. Como em muitas situações, nesse caso a escolha é uma questão de preferência pessoal, mas a maioria das pessoas consideraria os dois primeiros exemplos (particularmente o que utiliza todas as letras maiúsculas), em que todas as letras são colocadas juntas, mais difíceis de ler. Os métodos mais usados para construir um nome de variável com várias palavras são os três últimos exemplos. A seguir, você vai conhecê-los melhor. Camel case: a segunda palavra e as subsequentes têm iniciais maiúsculas para facilitar a visualização dos limites dos termos. (Provavelmente, ocorreu a alguém em algum momento que as letras maiúsculas espa- lhadas pelo nome da variável se assemelham vagamente à corcundas dos camelos.) Pascal case: idêntico ao Camel case, exceto que a primeira palavra também tem inicial maiúscula. Snake case: as palavras são separadas por sublinhados. 9Variáveis, tipos de dados e operadores de algoritmos em Python 171 Programação Python UNIDADE 3 Variáveis, tipos de dados e operadores de algoritmos em Python PARTE 2 Os programadores que usam Python debatem calorosamente sobre qual dos métodos é preferível. Há argumentos para defender cada um desses estilos. O programador deve utilizar o que for mais atraente visualmente para ele. Assim, deve escolher um e usá-lo de forma consistente. As variáveis não são os únicos elementos que podem receber nomes em Python. Além delas, também se nomeiam funções, classes, módulos e assim por diante. As regras que se aplicam a nomes de variáveis também se aplicam a identificadores, o termo mais geral para nomes dados a objetos de programa. O Guia de Estilo para Código Python, também conhecido como PEP-0008, contém convenções de nomenclatura que listam padrões sugeridos para nomes de diferentes tipos de objetos. O PEP-0008 inclui as recomendações a seguir. Snake case: deve ser usado para funções e nomes de variáveis. Pascal case: deve ser usado para nomes de classe. Além das regras de sintaxe para os nomes de variáveis, ainda existe mais uma restrição para os nomes desses identificadores. A linguagem de progra- mação Python reserva um pequeno conjunto de palavras-chave (keywords) que designam funcionalidades especiais da linguagem. Nenhum objeto pode ter o mesmo nome que uma dessas palavras reservadas. No Python 3.7, existem 35 palavras-chave reservadas (Quadro 1). False def if raise continue break assert None del import return global for finally True elif in try pass not nonlocal and else is while class async yield as except lambda with from await or Quadro 1. Palavras-chave reservadas do Python É possível ver essa lista a qualquer momento digitando “help(‘keyword’)” em um terminal ou console com interpretador Python. As palavras reservadas diferenciam maiúsculas de minúsculas e devem ser usadas exatamente como mostrado no Quadro 1. Todas as keywords são escritas em letras minúsculas, Variáveis, tipos de dados e operadores de algoritmos em Python10 LABORATÓRIO DE PROGRAMAÇÃO 172 exceto False, None e True, que têm a primeira letra capitalizada. Se você tentasse criar uma variável com o mesmo nome de qualquer palavra reservada, isso resultaria em uma exceção (Exception) levantada pelo Python. Tipos de dados em Python Em geral, um tipo de dado defi ne o formato e os limites superior e inferior dos dados para que um programa possa usá-los adequadamente. No entanto, os tipos de dados Python são muito mais do que isso. No Python, não é preciso declarar uma variável mencionando explicitamente o tipo do dado. Esse recurso, como foi discutido anteriormente, é conhecido como “tipagem dinâmica” (PYTHON SOFTWARE FOUNDATION, 2019a). O Python determina o tipo de um valor diretamente na sintaxe do código e em tempo de execução. Por exemplo, as aspas marcam a declaração de um valor sequencial, os colchetes representam uma lista e as chaves são utilizadas para um dicionário. Além disso, os números não decimais serão atribuídos ao tipo inteiro, enquanto aqueles com um ponto decimal serão atribuídos para pontos fl utuantes. A seguir, está a lista de tipos de dados importantes comumente usados no Python. Depois, você vai conhecer melhor cada um deles e ver exemplos. Booleanos (booleans) Numéricos (numbers) Cadeias de caracteres (strings) Bytes Listas (lists) Tuplas (tuples) Conjuntos (sets) Dicionários (dictionaries) Tipos numéricos São um dos tipos de dados mais importantes em Python. Ao contrário de muitas linguagens que possuem apenas números inteiros e fl utuantes, o Python introduz o número complexo como um novo tipo de dado numérico. Os ti- pos de dados numéricos em Python são classifi cados usando as seguintes palavras-chave: int, fl oat e complex. Os tipos booleanos são considerados uma especialização do tipo inteiro. 11Variáveis, tipos de dados e operadores de algoritmos em Python 173 Programação Python UNIDADE 3 Variáveis, tipos de dados e operadores de algoritmos em Python PARTE 2 Booleano É um tipo de dado que quase todas as linguagens de programação possuem. O booleano em Python pode ter dois valores, verdadeiro ou falso. Esses valores são constantes e podem ser usados para atribuir ou comparar valores booleanos. Veja um exemplo simples a seguir. condicao = False if condicao: # Equivalente a: if condicao == True print("Continuar programa!") else: print("O programa será encerrado!") a = True + 0 # Resultado: 1 b = False + 0 # Resultado: 0 print(type(a)) # Resultado: <class 'int'> print(type(b)) # Resultado: <class 'int'> A expressão em um bloco de condições produzirá um valor booleano. O Python cria contextos booleanos para avaliar expressões. Seja qual for a expressão, o Python usará o contexto booleano para determinar seu valor verdadeiro. Como o Python possui muitos tipos de dados, eles operam com suas próprias regras para encontrar o resultado em um contexto booleano. Em alguns casos, as constantes booleanas True e False também podem atuar como números. É evidente no exemplo anterior que True é 1 e que o valor de False é 0. Eles se transformarão em números durante operações aritméticas. Inteiros A partir do Python 3, efetivamente não há limite para o quão longo um valor inteiro pode ser. Obviamente, ele é limitado pela quantidade de memória que o sistema possui, mas, para além disso, um número inteiro pode ser tão longo Variáveis, tipos de dados e operadores de algoritmos em Python12 LABORATÓRIO DE PROGRAMAÇÃO 174 quanto necessário. O Python interpreta uma sequência de dígitos numéricos e sem nenhum prefi xo como um número decimal de base 10. Outras sequências de caracteres podem ser anexadas a um valor inteiro para indicar uma base diferente de 10. O tipo subjacente de um número inteiro Python, independen- temente da base usada para especifi cá-lo, é chamado de int. print(10) # Base 10 (decimal) - Resultado 10 print(type(10)) # <class 'int'> print(0b10) # Base 2 (binário) - Resultado 2 print(type(0b10)) # <class 'int'> print(0o10) # base 8 (Octal) - Resultado 8 print(type(0o10)) # <class 'int'> print(0x10) # Base 16 (Hexadecimal) - Resultado 16 print(type(0x10)) # <class 'int'> print(4.2) # Resultado: 4.2 print(type(4.2)) # <class 'float'> print(0.12 * 10e8) # Resultado: 120000000.0 print(type(0.12 * 10e8)) # <class 'float'> print(complex(2, 3)) # Resultado: (2+3j) print(type(2 + 3j)) # <class 'complex'> Números de ponto flutuante Esse tipo designa um número de ponto fl utuante no Python. Valores fl utu- antes são especifi cados com um ponto (.) que separa os valores decimais dos valores inteiros. Um número de ponto fl utuante é aquele em que a posição do ponto decimal pode “fl utuar” em vez de estar em uma posição fi xa dentro de um número. Exemplos denúmeros de ponto fl utuante são: 1.23, 87.425 e 13Variáveis, tipos de dados e operadores de algoritmos em Python 175 Programação Python UNIDADE 3 Variáveis, tipos de dados e operadores de algoritmos em Python PARTE 2 9039454.2. Diferentes linguagens de programação ou sistemas podem ter limites de tamanho ou formas distintas de defi nir números de ponto fl utuante. Opcionalmente, o caractere “e” ou “E” seguido por um número inteiro, positivo ou negativo, pode ser anexado para especificar a notação científica. Uma notação de ponto flutuante é um cálculo matemático usado para exibir números longos de forma “curta”. Por exemplo, um número como 12.000.000 pode ser escrito como 12e6 ou também pode ser 0.12 * 10e8. No Python, não é preciso descrever a parte inteira do tipo float quando ela for zero. Para representar “0.5”, basta apenas descrever: “.5”. Veja como pode ser descrita uma expressão que eleva um valor “x” a meio: x**.5 seria o mesmo que x**(1/2). Números complexos O Python também suporta números complexos, ou números compostos por uma parte real e uma parte imaginária. Assim como a instrução “print()” é usada para imprimir valores, a função “complex()” é usada para criar números complexos. Essa função requer dois valores, o primeiro será a parte real do número complexo, enquanto o segundo valor será a parte imaginária. Tipos sequenciais Existem alguns tipos básicos e personalizados de sequências em Python: listas (objetos list) e tuplas (objetos tuple) são tipos básicos. Além disso, existem os tipos de sequências personalizados para o processamento de dados binários (objetos bytes) e as sequências de texto ou cadeias de caracteres (objetos str). Variáveis, tipos de dados e operadores de algoritmos em Python14 LABORATÓRIO DE PROGRAMAÇÃO 176 Cadeias de caracteres Uma sequência de um ou mais caracteres entre aspas simples (') ou aspas duplas (") é considerada string no Python. Qualquer letra, número ou símbolo pode fazer parte da sequência. Python também suporta sequências de várias linhas, que requerem estar entre aspas triplas ("""). Sequências de caracteres entre triplas de aspas (simples ou duplas) conservam o caractere de quebra de linha (\n) como parte da string. aspas _ simples = 'Esse tipo de string permite aspas "du- plas" incorporadas.' aspas _ duplas = "Esse tipo de string permite aspas 'sim- ples' incorporadas." tripla _ de _ aspas _ simples = '''Esse tipo de string permite aspas 'simples', "duplas" e ""triplas duplas""" incorporadas.''' tripla _ de _ aspas _ duplas = """Esse tipo de string permite aspas 'simples', "duplas" e '''tripla simples''' incorporadas.""" print(type(aspas _ simples)) # <class 'str'> print(aspas _ simples[0:5]) # Cinco primeiros caracteres print(aspas _ simples[1:5]) # Substring de 2 até 5 print(aspas _ simples[-6:-1]) # Cinco caracteres antes do último print(aspas _ simples[-2:]) # Dois últimos caracteres print(aspas _ simples[:2]) # Dois primeiros caracteres 15Variáveis, tipos de dados e operadores de algoritmos em Python 177 Programação Python UNIDADE 3 Variáveis, tipos de dados e operadores de algoritmos em Python PARTE 2 Bytes O byte é um tipo imutável em Python. Ele pode armazenar uma sequência de bytes (cada byte tem 8 bits) variando de 0 a 255. Semelhante ao que ocorre em uma lista, é possível buscar o valor de um único byte usando o índice. Mas não é possível modifi car o valor em nenhuma posição. A seguir, veja algumas diferenças entre byte e string. Os objetos do tipo byte contêm uma sequência de bytes, enquanto as strings contêm uma sequência de caracteres. Os bytes são objetos legíveis apenas para o computador, enquanto as strings estão na forma legível para os humanos. Como o byte é legível apenas por máquina, ele pode ser armazenado diretamente no disco. Já as strings precisam ser codificadas antes de serem armazenadas no disco. Um contexto em que os bytes são importantes é quando se executam operações de entrada e saída (E/S) com o buffer (espaço reservado) ativado. Considere, por exemplo, um programa que está recebendo continuamente os dados pela rede. Ele vai armazenando os dados que vêm pelo fluxo; depois que os cabeçalhos e terminadores de mensagens aparecem no fluxo, os dados recebidos são analisados. Então, o programa continua anexando mais bytes que estão chegando no buffer de forma contínua. objeto _ vazio = bytes(2) print(type(objeto _ vazio)) # <class 'bytes'> print(objeto _ vazio) # Resultado: b'\\x00\\x00' buffer = b'' while verificar _ mensagem(buffer): buffer += ler _ do _ socket() Variáveis, tipos de dados e operadores de algoritmos em Python16 LABORATÓRIO DE PROGRAMAÇÃO 178 Listas São construções semelhantes às strings, porém servem para armazenar objetos de tipo arbitrário em uma sequência ordenada. Uma lista é muito fl exível e não possui um tamanho fi xo. O índice de lista é também uma lista que começa com zero no Python. É uma coleção heterogênea de itens de tipos de dados variados. As listas em Python podem ser declaradas se os elementos forem colocados entre colchetes e forem separados por vírgulas. A seguir, veja as características importantes das listas Python: as listas são ordenadas; as listas podem conter objetos arbitrários; os elementos da lista podem ser acessados pelo índice; as listas podem ser aninhadas com profundidade arbitrária; as listas são mutáveis; as listas são dinâmicas. Tuplas As tuplas são imutáveis, ou seja, seus elementos não podem ser modifi cados ou excluídos depois de confi gurados. As tuplas geralmente têm melhor desempenho (seus dados podem ser acessados mais rapidamente) do que uma lista regular. Uma tupla é uma estrutura de dados ideal para uma lista de itens heterogêneos (que se diferem em tipo ou comprimento) cujo valor não muda. As tuplas são idênticas às listas em todos os aspectos, exceto pelos seguintes itens: as tuplas são definidas colocando-se os elementos entre parênteses em vez de entre colchetes; as tuplas são imutáveis; as tuplas podem ser embaladas e desembaladas (packed e unpacked). 17Variáveis, tipos de dados e operadores de algoritmos em Python 179 Programação Python UNIDADE 3 Variáveis, tipos de dados e operadores de algoritmos em Python PARTE 2 lista = [True, 1, 1.1, 1 + 2j, 'Teste', b'bytes', [1, 2, 3], (1, 2), {1: 'a'}] for elemento in lista: print(type(elemento)) # Resultados: # <class 'bool'> # <class 'int'> # <class 'float'> # <class 'complex'> # <class 'str'> # <class 'bytes'> # <class 'list'> # <class 'tuple'> # <class 'dict'> tupla = ('01', '02', '03') # Embalar (janeiro, fevereiro, marco) = tupla # desembalar print(janeiro) # Resultado: 01 print(fevereiro) # Resultado: 02 print(marco) # Resultado: 03 Mapas Um objeto de mapeamento mapeia valores hash (identifi cadores de tamanho fi xo e que podem ser ordenados) para objetos arbitrários. Mapeamentos são objetos mutáveis. Atualmente, existe apenas um tipo de mapeamento padrão, o dicionário. Dicionários O dicionário é um tipo de estrutura de dados utilizado para mapear ou asso- ciar itens. Um dicionário em Python é como um dicionário no mundo real e é composto por dois elementos, as chaves e os valores. As chaves devem ser elementos únicos, ou seja, em um dicionário, não pode haver duas chaves com Variáveis, tipos de dados e operadores de algoritmos em Python18 LABORATÓRIO DE PROGRAMAÇÃO 180 o mesmo nome ou valor. Os valores podem ser praticamente de qualquer tipo, por exemplo, uma lista ou lista de lista, numéricos, booleanos, etc. A seguir, veja as características dos dicionários. São mutáveis.Podem ter seus valores e chaves alterados. São dinâmicos. Eles podem crescer e encolher conforme necessário. Podem ser aninhados. Um dicionário pode conter outro dicionário ou uma lista. Os elementos do dicionário são acessados via chaves. Os dicionários podem ser criados colocando-se uma lista separada por vírgula de pares “chave:valor” entre chaves. Cada par de chave mapeia para seu valor associado. dicionario1 = dict() # mesmo que: dicionario = {} dicionario2 = { # chave numérica 1: 'futebol', 2: 'basebol' } print(dicionario2) # Resultado: {1: 'futebol', 2: 'basebol'} dicionario3 = dict({ # chaves de tipos diferentes 'classe': 'primeira', 1: [1, 2, 3] }) print(dicionario3) # Resultado: {'classe': 'primeira', 1: [1, 2, 3]} dicionario4 = dict([ # Criado com uma sequência de tuplas (1, 'teste1'), (2, 'teste2') ]) print(dicionario4) # Resultado: {1: 'teste1', 2: 'teste2'} 19Variáveis, tipos de dados e operadores de algoritmos em Python 181 Programação Python UNIDADE 3 Variáveis, tipos de dados e operadores de algoritmos em Python PARTE 2 Operadores em Python Como muitas outras linguagens de programação, o Python também reserva alguns caracteres especiais para atuar como operadores (PYTHON SOF- TWARE FOUNDATION, 2019d). Todo operador realiza algumas operações, como adição e multiplicação, para manipular dados e variáveis. As variáveis passadas como entrada para um operador são conhecidas como “operandos”. Operadores aritméticos São os símbolos que representam operações matemáticas aritméticas. Com operadores aritméticos, é possível realizar várias operações aritméticas, como adição, subtração, multiplicação, divisão, módulo, expoente, etc. O Python fornece várias maneiras para cálculos aritméticos, como função eval(), declarar variável e calcular ou mesmo chamar funções. No Quadro 2, a seguir, veja uma lista dos operadores aritméticos. Operador Propósito Uso + Adição a + b – Subtração a – b * Multiplicação a * b / Divisão a / b // Inteiro da divisão a // b % Módulo a % b ** Expoente a ** b Quadro 2. Lista dos operadores aritméticos Operadores de comparação Na programação Python, os operadores de comparação permitem determinar se dois valores são iguais ou se um é maior do que o outro, e então tomar uma decisão com base no resultado. O Quadro 3 descreve os operadores de comparação internos no Python. Variáveis, tipos de dados e operadores de algoritmos em Python20 LABORATÓRIO DE PROGRAMAÇÃO 182 Operador Propósito Uso > Maior que a > b < Menor que a < b == Igual a a == b != Diferente de a != b >= Maior ou igual a a >= b <= Menor ou igual a a <= b Quadro 3. Lista dos operadores de comparação Operadores lógicos Os operadores lógicos do Python permitem a tomada de decisões com base em várias condições. Os operandos agem como condições que podem resultar em um valor verdadeiro ou falso. O resultado dessa operação é verdadeiro ou falso (ou seja, um valor booleano). No entanto, nem todos esses operadores retornam um resultado booleano. Os operadores an e or retornam um de seus operandos em vez do valor booleano puro. Já o operador not sempre fornece um resultado booleano real. No Quadro 4, veja um exemplo que mostra como esses operadores funcionam no Python. Operador Propósito Uso and Se “a” for falso, então “a”; caso contrário, “b” a and b or Se “a” for falso, então “b”; caso contrário, “a” a or b not Se “a” for falso, então True; caso contrário, False not a Quadro 4. Lista dos operadores lógicos 21Variáveis, tipos de dados e operadores de algoritmos em Python 183 Programação Python UNIDADE 3 Variáveis, tipos de dados e operadores de algoritmos em Python PARTE 2 Operadores bit a bit Os operadores de bit a bit do Python processam os bits individuais de va- lores inteiros. Eles os tratam como sequências de bits binários. É possível usar operadores bit a bit para verifi car se um bit específi co está defi nido. Por exemplo, os sensores geralmente trabalham com bits específi cos que indicam se determinada função está ativa ou não. Em situações similares, esses operadores binários podem ajudar. No Quadro 5, veja uma lista dos operadores binários. Operador Propósito Uso & Retorna 1 se ambos os bits correspondentes forem 1 a & b | Retorna 1 se algum dos bits correspondentes for 1 a | b ~ Inverte todos os bits em um único operando ~ a ^ Retorna 1 se algum dos bits correspondentes for 1, mas não os dois a ^ b >> Desloca os bits de “a” para a direita, “b” número de vezes a >> b << Desloca os bits de “a” para a esquerda, “b” número de vezes a << b Quadro 5. Lista dos operadores binários Operadores de atribuição No Python, é possível usar operadores de atribuição para defi nir valores em variáveis. Por exemplo, a instrução “a = 4” usa um operador de atribuição primitivo que atribui o valor “4” ao operando esquerdo da instrução. No Quadro 6, está a lista de operadores compostos disponíveis no Python. Por exemplo, a instrução “a += 1” é adicionada à variável e, em seguida, atribui essa mesma variável. O operador será avaliado como “a = a + 1”. Variáveis, tipos de dados e operadores de algoritmos em Python22 LABORATÓRIO DE PROGRAMAÇÃO 184 Operador Exemplo Mesmo que = a = 1 a = 1 += a += 1 a = a + 1 –= a –= 1 a = a – 1 *= a *= 1 a = a * 1 /= a /= 1 a = a / 1 %= a %= 1 a = a % 1 **= a **= 1 a = a ** 1 &= a &= 1 a = a & 1 |= a |= 1 a = a | 1 ^= a ^= 1 a = a ^ 1 >>= a >>= 1 a = a >> 1 <<= a <<= 1 a = a << 1 Quadro 6. Lista dos operadores de atribuição Operadores avançados O Python também tem alguns operadores para fi ns especiais. Eles são conhe- cidos como “operadores avançados Python” e são os operadores de identidade e os operadores de associação. Veja a seguir. Operadores de identidade Esses operadores permitem comparar os locais de memória de dois objetos Python. Além disso, permitem saber se os objetos Python compartilham o mesmo endereço de memória. As variáveis com valores iguais não são ne- cessariamente idênticas. Como alternativa, é possível usar esses operadores para determinar se um valor é de uma classe ou tipo específi co. Consulte o Quadro 7 para entender mais sobre eles. 23Variáveis, tipos de dados e operadores de algoritmos em Python 185 Programação Python UNIDADE 3 Variáveis, tipos de dados e operadores de algoritmos em Python PARTE 2 Operador Propósito Uso is Retorna True se os operandos referenciam o mesmo objeto a is b is not Retorna True se os operandos não referenciam o mesmo objeto a is not b Quadro 7. Lista dos operadores de identidade Operadores de associação Os operadores de associação permitem testar se um valor é membro de outros objetos Python, como strings, listas ou tuplas. Além disso, esse operador também pode testar em um dicionário, mas apenas para a chave, não para o valor. No Quadro 8, veja os operadores de associação. Operador Propósito Uso in Retorna True se o valor existe na sequência 1 in [1, 2, 3] not in Retorna True se o valor não existe na sequência 4 not in {1:2, 2:7, 3:9} Quadro 8. Lista dos operadores de associação Precedência de operadores em Python Quando é agrupado um conjunto de valores, variáveis, operadores ou chamadas de função, é necessário ter uma ordem em que as operações e operadores são avaliados. Por exemplo: “3 + 4” é uma expressão simples em Python e con- tém apenas um operador e dois operandos. No entanto, uma expressão mais complexa pode incluir vários operadores, por exemplo, “2 * 4**4 + 5”. Para avaliar expressões complexas, o Python estabelece a regra de precedência, que governa a ordem em que as operações ocorrem. Aseguir está a lista da precedência dos operadores, da maior para a menor. Variáveis, tipos de dados e operadores de algoritmos em Python24 LABORATÓRIO DE PROGRAMAÇÃO 186 1. (**) — expoente 2. (~x) — bit a bit de negação 3. (+x, -x) — positivo, negativo 4. (*, /, %) — produto, divisão, resto 5. (+, –) — adição, subtração 6. (<<, >>) — deslocamento para a esquerda/direita 7. (&) — bit a bit AND 8. (̂ ) — bit a bit XOR 9. (|) — bit a bit OR 10. (in, not in, is, is not, <, <=, >, >=, !=, ==) — comparação, associação, identidade 11. (not x) — booleano NOT 12. (and) — booleano AND 13. (or) — booleano OR Os operadores na parte inferior da lista têm a menor precedência, e aqueles na parte superior da lista têm a mais alta precedência. Quaisquer operadores no mesmo item da lista têm a mesma precedência. Está claro que a multiplicação é realizada antes da adição, pois tem precedência mais alta, conforme a lista anterior. Da mesma forma, a potência tem a precedência mais alta entre todos os itens da lista. Por exemplo, na expressão “2 * 4**4 + 5”, primeiramente será avaliada a potência, depois será avaliado o produto e, por fim, será avaliada a adição. Na matemática, seria algo assim: {[2 * (4**4)] + 5}. PYTHON SOFTWARE FOUNDATION. Data types. [2019a]. Disponível em: https://docs. python.org/3/library/datatypes.html. Acesso em: 30 dez. 2019. PYTHON SOFTWARE FOUNDATION. Glossary. [2019b]. Disponível em: https://docs. python.org/3/glossary.html#term-bytecode. Acesso em: 30 dez. 2019. PYTHON SOFTWARE FOUNDATION. Identifiers and keywords. [2019c]. Disponível em: https://docs.python.org/3/reference/lexical_analysis.html#identifiers. Acesso em: 30 dez. 2019. PYTHON SOFTWARE FOUNDATION. Standard operators as functions. [2019d]. Disponível em: https://docs.python.org/3.8/library/operator.html. Acesso em: 30 dez. 2019. 25Variáveis, tipos de dados e operadores de algoritmos em Python LABORATÓRIO DE PROGRAMAÇÃO 188 ENCERRA AQUI O TRECHO DO LIVRO DISPONIBILIZADO PELA SAGAH PARA ESTA PARTE DA UNIDADE. PREZADO ESTUDANTE unidade 3 O conteúdo deste livro é disponibilizado por SAGAH. Parte 3 Comando condicional if (estruturas aninhadas) - Python LABORATÓRIO DE PROGRAMAÇÃO 190 Comando condicional if (estruturas aninhadas) — Python Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Discutir a utilização de comandos condicionais aninhados. � Realizar testes de mesa em problemas que utilizem comandos con- dicionais aninhados. � Praticar os comandos condicionais aninhados em problemas computacionais. Introdução Ao escrever um código, é possível determinar algumas condições, que serão executadas conforme o comando. Se a condição for verdadeira, uma estrutura será seguida; se for falsa, outra estrutura será seguida. Os comandos condicionais aninhados permitem que caminhos sejam orga- nizados dentro de uma mesma programação; a partir deles, as decisões serão executadas. Neste capítulo, você vai estudar sobre os comandos condicionais ani- nhados, verificando também como realizar testes de mesa em problemas que utilizem comandos condicionais aninhados e como praticar esses comandos em problemas computacionais. 191 Programação Python UNIDADE 3 Comando condicional if (estruturas aninhadas) - Python PARTE 3 Comandos condicionais aninhados e sua utilização No seu dia a dia, provavelmente, algumas decisões são tomadas com base em determinadas condições. Por exemplo: se um aluno leva 30 minutos para chegar até a universidade, e a aula começa às 8 horas, esse aluno precisa tomar a decisão sobre qual é a melhor hora para sair de casa, para que chegue pontualmente na universidade. Um exemplo mais simples é: se o aluno está cansado, então, ele vai dormir. Trata-se de condições simples que devem ser observadas para que uma decisão seja tomada. Isso também ocorre durante a programação, na qual se utilizam ações e tomadas de decisão. Para tanto, são utilizados os comandos condicionais — códigos que, quando incluídos na programação, dependem de uma ou mais condições para que sejam executados. Em programação, a escolha entre duas ou mais opções ocorre quando o programa lê os dados de um arquivo e realiza uma ação, tomando como base os dados lidos ou a entrada de um usuário. Essa escolha, no ambiente Python, é escrita a partir de uma instrução if, pela qual a condição é avaliada. Caso a condição seja verdadeira, serão realizadas as instruções apontadas como “então”. Se não for verdadeira, verificam-se as instruções após a instrução if, conforme leciona Lee (2011). Ao escrever os comandos no ambiente de programação Python, observa-se que a indentação deve ser rigorosamente seguida, pois, ao contrário de outras linguagens de programação, o ambiente Python define e articula os blocos a partir dos recuos que são reconhecidos. Sendo assim, a indentação não pode ser ignorada. De maneira análoga, pode-se imaginar a seguinte situação: ao comprar algo em uma loja, o comprador pode escolher se o pagamento vai ser realizado em cartão de crédito ou de débito ou em dinheiro. Se a compra vai ser paga em cartão, o comprador vai para um lado da fila; se vai ser paga em dinheiro, o comprador vai para o outro lado da fila. Caso o cartão seja recusado, a compra deverá ser paga em dinheiro, devendo o comprador se dirigir para a fila do dinheiro. Após o pagamento, quem pagou com cartão e quem pagou em dinheiro sairão com suas compras pelo mesmo lugar. Comando condicional if (estruturas aninhadas) — Python2 LABORATÓRIO DE PROGRAMAÇÃO 192 A Figura 1 exemplifica o uso do comando if, em que a condição será avaliada para dar sequência às próximas instruções de “então”. Figura 1. Comando if — aqui, emprega-se o termo “declaração” em referência a “comando”. Fonte: Adaptada de Lee (2011). declarações antes da declaração if condição declarações depois da declaração if então declarações Verdadeiro Falso Caso a condição seja verdadeira, será seguido um comando; caso seja falsa, outro comando será executado. Nas situações em que um comando só é realizado caso a condição seja verdadeira, após realizar a constatação, o programa executa o comando; se a condição for falsa, e o programa não for 3Comando condicional if (estruturas aninhadas) — Python 193 Programação Python UNIDADE 3 Comando condicional if (estruturas aninhadas) - Python PARTE 3 instruído com nenhum comando para a condição falsa, ele vai prosseguir para os próximos comandos que estão sem indentação. Comando condicional if O comando if é um comando condicional importante, que pode ser utilizado para a execução de códigos que comparem dois valores. Esse comando pode ser utilizado para as condições sim/não ou verdadeiro/falso. Ao ser utilizado, o comando if apresentará a estrutura representada na Figura 2. Figura 2. Representação genérica do comando if. if condição: comandoV1 comandoV2 Figura 3. Exemplo de comando if utilizando Python. O código da Figura 3 pode ser descrito da seguinte forma: se a temperatura for maior do que 30º, a variável estaCalor será verdadeira (True). Observa- -se que o comando foi executado, pois a variável estaCalor foi apontada como True. Isso porque a temperatura é de 35º, ou seja, maior do que 30º. Comando condicional if (estruturas aninhadas) — Python4 LABORATÓRIO DE PROGRAMAÇÃO 194 Comando condicional else Em programação, pode-se determinar algo que tenha duas respostas, isto é, duas instruções: uma para o caso de a condição ser verdadeira e outra para o caso de a condição ser falsa. O comando condicional else possibilita fazer alguma coisa quando a condição é avaliada como falsa. Nesse caso, a resposta poderá ser não, falso ou, até mesmo, 0. Ao utilizar
Compartilhar