Title: Introdução à Lógica e Programação

Capa

Capítulo 1 - Introdução à Lógica

Sem título ObjetivoCapDEAD

Ao longo deste estudo, buscaremos primeiramente entender os conceitos fundamentais da lógica, uma pedra angular na tomada de decisão e raciocínio. Uma vez estabelecida essa base, mergulharemos no universo das proposições, conectivos e argumentos, elementos essenciais para a construção e análise de raciocínios lógicos. Avançando para o aprendizado das operações lógicas e suas diversas aplicações no campo da computação, dominaremos a técnica de construção de tabelas verdade, ferramentas fundamentais para visualizar e analisar valores verdade de proposições compostas. Em seguida, iremos aprofundar-nos em conceitos mais complexos, como tautologias, contradições e contingências, explorando suas nuances e significados. Através da avaliação da implicação e equivalência lógica, poderemos discernir relações entre proposições, culminando no discernimento entre argumentos válidos e inválidos, um passo crucial para o desenvolvimento de raciocínios lógicos sólidos e confiáveis.

Sem título Text

Introdução

No coração da matemática, da filosofia e da computação, encontra-se a lógica: a disciplina que nos ensina a pensar com clareza, coerência e precisão. Ela não apenas molda a maneira como compreendemos o mundo, mas também como o mundo digital compreende a si mesmo. Neste capítulo, embarcaremos em uma viagem exploratória através dos principais conceitos que compõem a lógica.

Tirinha

1

2

3

4

Sem título Text

Proposições e conectivos

Neste subcapítulo, vamos explorar os fundamentos das sentenças, proposições e conectivos. Esses conceitos são essenciais para o entendimento da lógica como ferramenta de análise e raciocínio.

As sentenças são fundamentais na lógica, pois são os blocos de construção para a formação de argumentos e raciocínios. Elas podem ser classificadas de diversas formas.

- As sentenças afirmativas são aquelas que afirmam uma informação ou estabelecem uma proposição como verdadeira. Por exemplo, "O sol nasce no leste" e "2 + 2 = 4" são sentenças afirmativas.
- As sentenças negativas, por sua vez, negam uma informação ou estabelecem uma proposição como falsa. Um exemplo de sentença negativa é "Não choveu ontem" ou "O número 7 não é par".
- As sentenças imperativas expressam ordens, comandos ou solicitações. Elas têm a função de fazer um pedido ou dar uma instrução. Por exemplo, "Feche a porta", "Estude para a prova" e "Pare de fumar" são sentenças imperativas.
- As sentenças exclamativas expressam emoções intensas, surpresa, admiração, entre outros sentimentos. Elas são usadas para expressar algo de forma enfática. Exemplos de sentenças exclamativas são "Que belo dia!", "Que lindo!" e "Que incrível!".
- Por fim, as sentenças interrogativas são usadas para fazer perguntas e obter informações. Elas expressam dúvida ou solicitam esclarecimento sobre algo. Exemplos de sentenças interrogativas são "Você vai à festa?", "Qual é o seu nome?" e "O que você está fazendo?".

Essas sentenças também podem ser classificadas entre abertas e fechadas. A diferença entre sentenças abertas e fechadas está relacionada à completude da informação contida na sentença.

- Sentenças fechadas são aquelas que possuem um sentido completo e podem ser classificadas como verdadeiras ou falsas. Elas não dependem de nenhuma informação adicional para serem avaliadas. Por exemplo, "O céu é azul" e "O Brasil é um país na América do Sul" são sentenças fechadas.
- Já as sentenças abertas são aquelas que possuem uma estrutura incompleta e dependem de variáveis ou preenchimentos para terem um sentido completo. Elas precisam ser acompanhadas de informações adicionais para serem avaliadas. Por exemplo, a sentença "x + 5 = 10" é uma sentença aberta, pois depende do valor atribuído à variável x para ser classificada como verdadeira ou falsa. A inclusão de um valor específico para x, como x = 5, transforma a sentença em uma sentença fechada.

Proposições

As proposições são sentenças que podem ser classificadas como verdadeiras (V) ou falsas (F). Elas são a base da lógica e nos permitem fazer afirmações diversas sobre o mundo.

"Uma proposição é uma sentença fechada (afirmativa ou negativa) que pode ser considerada verdadeira ou falsa."

Por exemplo "Hoje está chovendo" e "2 + 2 = 4" são proposições, pois podem ser avaliadas como verdadeiras ou falsas. No entanto, "Existe vida em outros planetas?" não é uma proposição, pois não é possível atribuir um valor de verdade a ela.

Sentença vs. Proposição: A Batalha dos Significados!

1

2

3

4

5

6

7

8

Sem título Text

Conectivos Lógicos

Os conectivos lógicos são os elementos que permitem combinar proposições a fim de formar expressões mais complexas. Os principais conectivos lógicos são a negação, a conjunção, a disjunção, a implicação e a equivalência. A seguir, vamos explicar cada um deles.

Negação (~): inverte o valor de uma proposição.

A negação é um conectivo unário que inverte o valor de verdade de uma proposição. Por exemplo, a negação da proposição "Hoje está chovendo" resulta na proposição "Hoje não está chovendo". Outra forma sob a qual a negação pode ser expressa é através do símbolo (¬).

Sem título Tabela Visual com Scroll

P

~P

V

F

Sem título Text

Conjunção (∧): une duas proposições.

Seu valor verdade depende da validade das duas proposições.

A conjunção é um conectivo binário que combina duas proposições com o objetivo de formar uma nova proposição. A conjunção é verdadeira apenas quando ambas as proposições são verdadeiras. Por exemplo, a conjunção das proposições "Hoje está chovendo" e "Estou com um guarda-chuva" resulta na proposição "Hoje está chovendo e estou com um guarda-chuva".

Sem título Tabela Visual com Scroll

P

Q

P ^ Q

V

F

Sem título Text

Disjunção (∨): une duas proposições.

Seu valor verdade depende da validade de pelo menos uma das proposições.

A disjunção, ou disjunção inclusiva, é outro conectivo binário que combina duas proposições. A disjunção é verdadeira quando pelo menos uma das proposições é verdadeira. Por exemplo, a disjunção das proposições "Hoje está chovendo" e "Amanhã será um dia ensolarado" resulta na proposição "Hoje está chovendo ou amanhã será um dia ensolarado".

Sem título Tabela Visual com Scroll

P

Q

P v Q

V

F

Sem título Text

Disjunção Exclusiva (∨): une duas proposições.

Seu valor verdade depende da validade de uma das proposições, mas não das duas ao mesmo tempo.

A disjunção exclusiva, representada pelo símbolo "ou exclusivo" ou "ou... ou", indica que apenas uma das proposições é verdadeira, mas não as duas ao mesmo tempo. Diferentemente da disjunção inclusiva, a disjunção exclusiva é falsa quando ambas as proposições são verdadeiras. Por exemplo, a disjunção exclusiva das proposições "Hoje irá chover" e "Amanhã será um dia  ensolarado" resulta na proposição "Ou hoje irá chover ou amanhã será um dia ensolarado".

Sem título Tabela Visual com Scroll

P

Q

P v Q

V

F

Sem título Text

Implicação (→): estabelece uma relação de causa e efeito entre duas proposições.

A implicação, ou condicional, é um conectivo binário que relaciona duas proposições. A implicação estabelece uma relação de causa e efeito, indicando que se a primeira proposição for verdadeira, então a segunda proposição também será verdadeira. Quando temos uma implicação, a primeira proposição é chamada de antecedente e a segunda, de consequente. Por exemplo, na implicação "Se chove, então a rua fica molhada", a chuva é o antecedente e a rua ficar molhada é o consequente.

Sem título Tabela Visual com Scroll

P

Q

P → Q

V

F

Sem título Text

Equivalência (↔): indica que duas proposições possuem o mesmo valor lógico.

A equivalência, ou bicondicional, é um conectivo binário que indica que duas proposições têm o mesmo valor de verdade. Se ambas as proposições são verdadeiras ou ambas são falsas, então elas são consideradas equivalentes. Por exemplo, a equivalência das proposições "Amanhã será domingo" e "Hoje é sábado" resulta na proposição "Amanhã será domingo se, e somente se, hoje é sábado".

Sem título Tabela Visual com Scroll

P

Q

P ↔ Q

V

F

.

Q: Qual das seguintes opções é uma proposição?
- A lua orbita a Terra. (correct)
- O que você está fazendo?
- Talvez chova amanhã.

Q: Qual conectivo lógico é usado para representar o "E" lógico?
- Conjunção (∧) (correct)
- Disjunção (∨)
- Negação (¬)

Q: Se chover (P), então eu vou levar um guarda-chuva (Q).
- Se chover, eu definitivamente levarei um guarda-chuva. (correct)
- Se eu levar um guarda-chuva, então choverá.
- Se chover, não levarei um guarda-chuva.

Feedback (0 to 33%): Pode melhorar
Feedback (34 to 66%): Bom
Feedback (67 to 100%): Ótimo

Sem título Text

Escrita de Fórmulas

Na lógica proposicional, as fórmulas desempenham um papel fundamental na representação e manipulação de proposições e seus conectivos lógicos. Para garantir a clareza e a precisão das expressões lógicas, é essencial seguir as regras adequadas ao escrever fórmulas.

Assim, neste subcapítulo, abordaremos a maneira correta de construir fórmulas corretas na lógica proposicional.

Símbolos e Conectivos

A lógica proposicional utiliza símbolos para representar proposições e conectivos lógicos. Os símbolos mais comuns incluem letras maiúsculas (P, Q, R...) para proposições simples e conectivos lógicos como ¬ (negação), ∧ (conjunção), ∨ (disjunção), → (implicação) e ↔ (equivalência). É importante usar esses símbolos de forma consistente e correta ao escrever fórmulas.

Parênteses e Precedência

Os parênteses são usados para indicar a precedência de operações na lógica proposicional. É essencial utilizar parênteses corretamente para evitar ambiguidades e garantir que as fórmulas sejam interpretadas corretamente. Por exemplo, em uma expressão como (P ∧ Q) ∨ R, os parênteses indicam que a conjunção deve ser avaliada antes da disjunção.

Em geral a precedência segue a seguinte ordem:

1. Negação (~)
2. Conjunção (^), Disjunção (v) e Disjunção exclusiva (∨)
3. Implicação (→)
4. Equivalência (↔).

Essa ordem de precedência assegura que as operações lógicas sejam avaliadas de maneira consistente e precisa, permitindo a construção e a análise de proposições complexas de forma coerente com os princípios da lógica formal. O uso adequado da precedência dos conectivos lógicos é fundamental para a formulação e resolução de problemas lógicos e matemáticos.

Uso de Negação

A negação é representada pelos símbolos ¬ ou ~ e é usada para expressar a negação de uma proposição. Ao utilizar a negação, é importante aplicá-la corretamente à proposição. Por exemplo, ¬P representa a negação da proposição P.

Uso de Conectivos

Os conectivos lógicos (conjunção, disjunção, implicação e equivalência) são usados para combinar proposições e construir proposições compostas. É fundamental utilizar os conectivos corretamente e seguir suas regras de aplicação. Por exemplo, P ∧ Q representa a conjunção das proposições P e Q.

Exemplos de Fórmulas Corretas

- P → Q
- ¬(P ∨ Q)
- (P ∧ Q) ∨ R
- (P → Q) ∧ (Q → R)
- (P ↔ Q) → R
- ¬P ∨ (Q ∧ R)
- ¬(P ∧ Q) ∨ (R ∨ S)
- (P → Q) ↔ (¬Q → ¬P)
- (P ∧ Q) → (Q ∨ R)
- (P ∨ Q) ∧ (¬P ∨ R)

Exemplos de Fórmulas Incorretas

- P ∧ ∧ Q (falta de proposição entre os conectivos)
- P¬ → Q (o conectivo de negação veio após a proposição e não antes)
- ¬P Q (falta de conectivo entre a negação e a proposição)
- ¬(P → Q (falta de parênteses de fechamento)
- ¬P → (Q ∨ R)) (parênteses desnecessários)
- P → ∨ Q (falta de proposição após o conectivo)
- (P ∧ Q)) ∨ (R ∧ S) ∧ T (excesso de parênteses)
- ¬(P ∧ Q ∨ R) (falta de parênteses para indicar a precedência correta)

Pode-se constatar que, ao escrever fórmulas na lógica proposicional, é crucial seguir as regras gramaticais estabelecidas. O uso adequado de símbolos, conectivos, parênteses e negação é essencial para expressar corretamente as relações lógicas entre proposições. Além disso, é importante estar atento a erros comuns que podem comprometer a interpretação correta das fórmulas. Ao dominar a maneira correta de escrever fórmulas, você estará mais bem equipado para realizar deduções lógicas e raciocinar de forma clara e precisa.

Quiz - escrita de fórmulas

Q: A forma da escrita da fórmula ¬(¬Q ∨ R) está
- Correta. (correct)
- Errada.

Q: A forma da escrita da fórmula (S ∨ T) → (Q ∧ R) está
- Correta. (correct)
- Errada.

Q: A forma da escrita da fórmula P¬ ↔ ¬Q está
- Errada. (correct)
- Correta.

Feedback (0 to 33%): Pode melhorar
Feedback (34 to 66%): Bom
Feedback (67 to 100%): Ótimo

Sem título Text

Construção de tabelas verdade

Neste subcapítulo, iremos abordar a construção de tabelas verdade. Essa ferramenta é essencial para analisar a validade das proposições lógicas e de seus argumentos.

Uma tabela verdade é uma representação sistemática de todas as combinações possíveis dos valores verdade das proposições componentes de uma expressão lógica. Ela permite determinar se a expressão é verdadeira ou falsa em cada caso. Ao analisar todas essas combinações das proposições envolvidas em um argumento, podemos determinar se o argumento é válido ou inválido.

A construção de tabelas verdade envolve identificar todas as proposições que compõem a expressão lógica e listar todas as combinações possíveis de valores verdade para essas proposições. Em seguida, é aplicado o valor de verdade da expressão lógica em cada combinação, preenchendo as colunas da tabela.

Por exemplo, suponhamos a existência de duas proposições, A e B, e a expressão lógica é "A ou B". Nesse caso, construiremos uma tabela com duas colunas, uma para A e outra para B. Em cada linha da tabela, atribuiremos um valor de verdade a A e a B, e, em uma terceira coluna, preencheremos o valor de verdade da expressão "A ou B" para cada combinação.

1. A seguir, apresentaremos de como construir uma tabela verdade:
2. Identifique as proposições envolvidas na expressão lógica;
3. Liste todas as possíveis combinações de valores lógicos para as proposições. Se tivermos n proposições, haverá 2n combinações.
4. Para cada combinação, determine o valor lógico resultante da expressão.
5. Organize os resultados em uma tabela, com as colunas representando as proposições e o resultado lógico da expressão.

Exemplo de construção de tabela verdade

Vamos construir a tabela verdade para a expressão lógica (P ∨ Q) ∧ (~R).

Sem título Tabela Visual com Scroll

P

Q

R

P v Q

~R

(P ∨ Q) ∧ (~R)

V

F

Sem título Text

Tautologias, contradições e contingências

Neste subcapítulo, iremos abordar os conceitos de tautologias, contradições e contingências. Esses termos são utilizados para classificar proposições de acordo com sua verdade ou falsidade em diferentes situações.

Uma tautologia é uma proposição que é verdadeira em todas as situações possíveis. Em outras palavras, não importa o valor verdade atribuído às suas variáveis, a tautologia sempre será verdadeira. Por exemplo, a proposição "P ∨ ~P" é uma tautologia, pois a operação lógica "∨" resulta em verdadeiro sempre que pelo menos uma das proposições é verdadeira.

Por outro lado, uma contradição é uma proposição que é falsa em todas as situações possíveis. Não importa o valor verdade atribuído às suas variáveis, a contradição sempre será falsa. Por exemplo, a proposição "P ∧ ~P" é uma contradição, pois a operação lógica "∧" resulta em falso quando ambas as proposições são falsas.

Por fim, temos as contingências, que são proposições que podem ser verdadeiras ou falsas dependendo das situações consideradas. Elas não são tautologias nem contradições. Por exemplo, a proposição "Está chovendo" é uma contingência, pois pode ser verdadeira em alguns dias e falsa em outros, dependendo das condições climáticas.

O estudo das tautologias, contradições e contingências é fundamental para a compreensão da lógica e para a análise de argumentos válidos. Ao identificar se uma proposição é uma tautologia, contradição ou contingência, podemos avaliar sua importância e utilizar esse conhecimento na construção de raciocínios sólidos.

Argumentos

Além dos conectivos lógicos, também exploraremos o conceito de argumento. Um argumento é uma sequência de proposições em que uma delas é a conclusão e as outras são as premissas, ou seja, as proposições que fornecem suporte ou justificativa para a conclusão.

A validade de um argumento está relacionada à sua estrutura lógica, independentemente do conteúdo específico das proposições envolvidas.

Um argumento válido é aquele em que, se todas as premissas forem verdadeiras, a conclusão também será necessariamente verdadeira. Em outras palavras, a conclusão segue logicamente das premissas. A validade de um argumento está diretamente ligada à sua forma lógica, e não à verdade das proposições em si. Mesmo que as premissas sejam falsas, se o argumento for válido, a conclusão ainda será verdadeira.

Por outro lado, um argumento inválido é aquele em que a conclusão não é necessariamente verdadeira, mesmo que todas as premissas sejam verdadeiras. Nesse caso, a conclusão não se segue logicamente das premissas, indicando uma falha no raciocínio. Mesmo que todas as premissas sejam verdadeiras, é possível que a conclusão seja falsa.

A validade de um argumento pode ser determinada por meio de técnicas de raciocínio lógico, como a aplicação de regras de inferência e a construção de tabelas verdade. A análise dos conectivos lógicos e a identificação da estrutura lógica do argumento são fundamentais para avaliar sua validade.

É importante desenvolver a habilidade de reconhecer e avaliar argumentos válidos e inválidos, pois isso nos permite avaliar criticamente o raciocínio presente em textos, discursos e argumentações diversas. A lógica é uma ferramenta essencial para o pensamento crítico e para a construção de argumentos consistentes e coerentes.

Sem título Tabela Visual com Scroll

Exemplo de argumento válido

Premissas

Conclusão

Válido/Inválido

P → Q

P

Q → R

R

Válido

P → Q

~Q

~P

Inválido

Sem título Tabela Visual com Scroll

Exemplo de argumento inválido

Premissas

Conclusão

Válido/Inválido

P → Q

~Q

P

Inválido

P v Q

P

Q

Sem título Text

O vídeo a seguir apresenta uma explicação detalhada dos conceitos abordados nesta aula.

Sem título Text

Conclusão

Ao longo deste capítulo, navegamos pelo fascinante oceano da lógica proposicional, explorando suas profundezas e apreciando a beleza que ela tem a oferecer. Como qualquer jornada, começamos com o básico, introduzindo o conceito de proposições e a forma como conectivos atuam como pontes, unindo essas proposições para criar afirmações mais complexas e multifacetadas.

Ao abordarmos a escrita de fórmulas, nos tornamos artistas, pintando quadros de lógica com nosso pincel. Cada fórmula, com sua estrutura única, nos revelou os segredos por trás das afirmações, ajudando-nos a compreender mais profundamente a natureza da lógica em si.

Da arte da formulação, passamos para a ciência da construção de tabelas verdade. Essas tabelas, com sua disposição clara e estruturada, serviram como um farol, guiando-nos através das complexidades da lógica e proporcionando um meio de visualizar a verdade (ou falsidade) de nossas proposições compostas.

E, finalmente, nos deparamos com os enigmas da lógica: tautologias, contradições e contingências. Esses conceitos, embora possam parecer abstratos à primeira vista, são essenciais para compreender a natureza da verdade e como as proposições interagem entre si.

Concluímos este capítulo com uma apreciação mais profunda e uma compreensão mais nítida da lógica proposicional. A lógica, em sua essência, é tanto uma arte quanto uma ciência, e é uma ferramenta poderosa para navegar em um mundo repleto de afirmações, argumentos e informações. Armados com esse conhecimento, estamos mais preparados do que nunca para enfrentar desafios lógicos e para lidar com os conceitos de programação que virão a seguir!

Glossário

Este glossário oferece uma visão geral dos conceitos fundamentais abordados nos tópicos mencionados. É uma ferramenta útil para quem busca uma rápida referência ou revisão desses conceitos.

Lógica proposicional: Ramo da lógica que lida com proposições que podem ser verdadeiras ou falsas e as relações entre elas.

Proposição: Uma declaração ou afirmação que tem um valor verdade definido, seja verdadeiro (V) ou falso (F).

Conectivo: Símbolo ou palavra que combina proposições simples para formar proposições compostas.

Conjunção: Conectivo lógico que representa o "E" lógico. Resulta em verdadeiro somente se ambas as proposições forem verdadeiras.

Disjunção: Conectivo lógico que representa o "OU" lógico. Resulta em verdadeiro se pelo menos uma das proposições for verdadeira.

Negação: Conectivo lógico que inverte o valor verdade da proposição.

Implicação: Conectivo lógico que representa a relação "se... então...".

Bicondicional: Conectivo que representa "se, e somente se".

Fórmula: Uma combinação de símbolos lógicos que representa uma proposição ou relação entre proposições.

Tabela Verdade: Uma tabela que mostra todas as combinações possíveis de valores verdade para proposições e o resultado de uma proposição composta.

Tautologia: Uma proposição composta que é sempre verdadeira, independentemente dos valores verdade de suas proposições componentes.

Contradição: Uma proposição composta que é sempre falsa, independentemente dos valores-verdade de suas proposições componentes.

Contingência: Uma proposição composta que não é nem uma tautologia nem uma contradição. Seu valor verdade depende dos valores verdade de suas proposições componentes.

Equivalência Lógica: Duas proposições são logicamente equivalentes se tiverem o mesmo valor verdade em todas as situações possíveis.

Sem título CustomCSS

Capítulo 2 - Introdução à Programação

Sem título ObjetivoCapDEAD

No desenvolvimento das competências essenciais em Sistemas para Internet, é imperativo começar com uma fundação sólida. Este capítulo é meticulosamente construído para proporcionar uma compreensão clara e concisa dos conceitos fundamentais relacionados a algoritmos. Ao desembrulhar os complexos pacotes de lógica e sequenciamento que compõem os algoritmos, buscamos criar uma base robusta sobre a qual se possa construir conhecimentos mais avançados e especializados.

Avançamos através do jardim diversificado de linguagens de programação e paradigmas utilizados na implementação de algoritmos. Essa exploração é essencial para equipar os aprendizes com as ferramentas e técnicas necessárias para serem proficientes na tradução de lógica algorítmica em código funcional e eficiente. Várias linguagens e estilos de programação são examinados, cada um com suas características únicas, vantagens e aplicabilidades, proporcionando uma visão abrangente e perspicaz.

Sem título Text

Introdução

No universo da computação, os algoritmos atuam como o coração pulsante que direciona a lógica e as funções de diversos sistemas e aplicações. Este capítulo destina-se a desvendar os mistérios dos algoritmos, proporcionando uma compreensão sólida de seus conceitos fundamentais e de como eles são implementados em diferentes linguagens de programação e paradigmas. Ao navegar por este capítulo, os estudantes serão conduzidos através de uma jornada que começa com a compreensão de programas de computador e desemboca em implementações práticas, utilizando linguagens e ferramentas contemporâneas.

Sem título Text

Programas de Computador

Adentrando o universo computacional, deparamo-nos inicialmente com a magia e a mística dos algoritmos e programas de computador.

Algoritmos são como quebra-cabeças lógicos que definem uma sequência de passos para resolver um problema específico. Eles são a concepção inicial, o plano ou a receita que delineia como uma tarefa computacional que deve ser executada. Cada algoritmo é único em sua abordagem para resolver um problema, utilizando uma variedade de estruturas de controle, tais como sequências, decisões e loops, para orquestrar a lógica do programa.

“Assim pode-se definir algoritmo como um conjunto de instruções, como uma receita, constituído de um número finito de passos.”

A implementação de um algoritmo envolve traduzi-lo para um código de programação, permitindo que seja executado por um computador. Essa transição da abstração à concretização é um processo meticuloso e criativo, onde as linguagens de programação atuam como a ponte, proporcionando as ferramentas e a sintaxe necessárias para expressar a lógica do algoritmo de forma que possa ser compreendida e processada por uma máquina.

Tirinha

1

2

3

4

Sem título Text

Programas de computador, por sua vez, são o produto da implementação de algoritmos. Eles são coleções de instruções codificadas que, quando executadas, orientam o computador através de uma série de tarefas, permitindo que ele realize operações complexas, manipule dados, interaja com usuários e outros sistemas, e muito mais.

Cada programa é um executor fiel de algoritmos, os quais definem a sequência lógica e as regras necessárias para a realização dessas tarefas.

Dessa forma, o desenvolvimento de um programa requer a seleção apropriada de algoritmos que melhor atendam às necessidades da tarefa em questão, bem como a escolha de uma linguagem de programação adequada para a sua implementação. A eficácia de um programa é frequentemente determinada pela eficiência e precisão dos algoritmos que ele incorpora.

Linguagens de Programação

Adentrando o reino encantado da programação, a programação em blocos emerge como um farol de iniciação, conduzindo os aprendizes através dos mares, por vezes tempestuosos, da lógica e da codificação. Essa abordagem visual e intuitiva desmistifica os conceitos fundamentais da programação, permitindo que os navegadores, independentemente de sua idade ou experiência, possam se apropriar das rédeas do pensamento computacional e criar algoritmos de maneira engajadora e compreensível.

Nesta paradisíaca ilha de blocos, cada peça se encaixa de maneira lógica e harmônica, construindo estruturas e sequências que dão vida às ideias e soluções. A ausência de sintaxes complexas e a apresentação gráfica facilitam a concentração na lógica e no fluxo do algoritmo, proporcionando uma experiência de aprendizagem rica e menos propensa a frustrações.

Code.org: a construção dos fundamentos

Code.org é uma plataforma educacional que facilita o aprendizado dos conceitos básicos de programação e computação. Utilizando uma abordagem baseada em blocos, permite que os usuários, especialmente os iniciantes, compreendam e implementem algoritmos sem a necessidade de lidar com a sintaxe textual complicada das linguagens de programação.

Figura 1 - Programação em blocos no Code.org.

Sem título Text

Fonte: adaptado de Computação na Escola (hiperlink de Computação na Escola)

A programação em blocos favorece uma compreensão visual e intuitiva dos algoritmos, contribuindo para o desenvolvimento de habilidades lógicas e de resolução de problemas dos aprendizes.

Code.org brilha como uma estrela no universo da programação em blocos. Essa plataforma educacional robusta é uma constelação de recursos, tutoriais e atividades que estão meticulosamente organizados para facilitar o aprendizado auto-dirigido e a exploração criativa. A missão da Code.org é democratizar a programação, tornando-a acessível e atraente para todos, e sua abordagem centrada no aluno é evidência de seu compromisso com essa nobre causa.

No Code.org, os aprendizes são convidados a embarcar em jornadas exploratórias, onde os desafios e os projetos são apresentados como aventuras, cada uma contribuindo para o fortalecimento e a expansão do repertório de habilidades de programação. O design intuitivo da plataforma, complementado por instruções claras e suporte, facilita a imersão dos usuários no processo de solucionar problemas e criar algoritmos usando blocos visuais.

Sem título Text

Scratch: o reino da criatividade e inovação

O Scratch é outra ferramenta influente que promove a aprendizagem de programação através de uma interface baseada em blocos. Ela fomenta a criatividade e a colaboração, permitindo que os usuários criem jogos, histórias e animações interativas.

O Scratch, criação do MIT*, é uma plataforma onde crianças e adultos podem se expressar criativamente, concebendo e compartilhando projetos interativos, jogos, histórias e animações. Na verdade, o Scratch é mais do que uma ferramenta de programação: é uma comunidade vibrante de criadores, educadores e aprendizes que partilham e colaboram, enriquecendo o ecossistema com uma diversidade de ideias e projetos.

A programação em blocos no Scratch é uma experiência dinâmica e gratificante. Os blocos coloridos e categorizados incentivam a exploração e a experimentação, enquanto o ambiente de programação, repleto de recursos, apoia a criação de projetos multifacetados e interativos.

Observamos, assim, como algumas ferramentas de programação em blocos são capazes de proporcionar experiências de aprendizagem significativas e envolventes. Elas humanizam a arte da programação, transformando-a em uma expressão criativa e um meio de inovação e resolução de problemas.

A programação em blocos, com sua simplicidade, acessibilidade e poder, atua como um catalisador que impulsiona os indivíduos na direção de conquistas mais elevadas no domínio da tecnologia. Facilita a construção de uma fundação sólida e confiante, sobre a qual os aprendizes podem erguer estruturas mais complexas de conhecimento e habilidade, explorando linguagens e paradigmas de programação mais avançados.

Quiz

Q: O que caracteriza a programação em blocos?
- Utilizar blocos visuais que representam diferentes funções ou comandos. (correct)
- Escrever código usando sintaxe específica.
- Programar apenas em linguagens de baixo nível.

Q: Qual é uma ferramenta popular para programação em blocos?
- Scratch (correct)
- Python
- JavaScript

Q: Por que a programação em blocos é geralmente recomendada para iniciantes e crianças?
- Porque facilita o entendimento dos conceitos de programação através de uma interface visual. (correct)
- Porque requer conhecimento avançado em matemática.
- Porque utiliza uma sintaxe complexa e difícil de entender.

Feedback (0 to 33%): Pode melhorar
Feedback (34 to 66%): Bom
Feedback (67 to 100%): Ótimo

Sem título Text

O Princípio da Programação Estruturada

Em um jardim bem organizado de conceitos e práticas de programação, floresce vigorosamente a programação estruturada. Essa metodologia encoraja os programadores a cultivarem programas com uma estrutura clara, composta de componentes ou blocos de código que são facilmente compreensíveis e modificáveis. Enraizada em princípios sólidos que serão analisados ao longo da disciplina, como modularidade, clareza e eficiência, a programação estruturada promove a criação de código robusto e eficiente, facilitando o cultivo de soluções computacionais duradouras e de qualidade.

A partir dos próximos capítulos, iremos abordar conceitos sobre variáveis e comandos de programação estruturada. Nessa jornada digital pelo conhecimento, daremos ênfase à linguagem Python. Então, que tal falar um pouco sobre ela agora?

Python: A Serpente Encantadora da Programação Estruturada

Emergindo com elegância e poder no reino das linguagens de programação estruturada, encontramos o Python. Esta linguagem encantadora captura os corações e mentes dos programadores com sua sintaxe clara, legibilidade e flexibilidade. O Python abraça e exemplifica os princípios da programação estruturada, oferecendo um conjunto rico de recursos e ferramentas que facilitam a organização do código em estruturas lógicas e coesas.

A modularidade é uma jóia na coroa do Python. A linguagem promove a decomposição de programas em módulos e funções, incentivando a reutilização de código e a separação de preocupações. Funções no Python são cidadãos de primeira classe, permitindo que os programadores definam blocos de código reutilizáveis e autônomos que podem ser invocados de maneira conveniente e eficiente. Esse foco na modularidade facilita a manutenção, compreensão e extensão dos programas.

O Python orquestra o fluxo de controle com maestria. Ele oferece uma variedade de construções, como loops e estruturas condicionais, que permitem aos programadores direcionar o fluxo de execução de programas com precisão e clareza. O design intuitivo das estruturas de controle do Python e a ênfase na legibilidade tornam o código facilmente compreensível, alinhando-se harmoniosamente com os princípios da programação estruturada.

O Python não apenas floresce na elegância de sua sintaxe e estrutura, mas também na riqueza de seu ecossistema. Uma vasta gama de bibliotecas e frameworks estão à disposição dos programadores, proporcionando soluções prontas e eficientes para uma ampla gama de problemas e domínios. Este ecossistema vibrante e ativo alimenta a criatividade e a inovação, permitindo que os programadores se concentrem em resolver problemas únicos e em realizar contribuições significativas.

Um dos charmes mais magnéticos do Python é sua ênfase na legibilidade. O design sintático da linguagem, juntamente com as convenções de codificação, promove a criação de código que é acessível e compreensível para outros desenvolvedores. Essa característica alinha-se maravilhosamente com os princípios da programação estruturada, celebrando a clareza e a comunicação eficaz através do código.

Clique aqui neste vídeo para assistir a uma explicação detalhada dos conceitos abordados nesta aula.

Sem título Text

Conclusão

Este subcapítulo proporcionou uma exploração dos conceitos e práticas fundamentais envolvidos na implementação de algoritmos e programas de computador. Através dessa jornada, de algoritmos abstratos a programas concretos e funcionais, desvendamos o processo criativo e técnico de dar vida às soluções computacionais, fornecendo uma base sólida para nos aprofundarmos ainda mais nos mistérios e maravilhas do mundo da programação.

Glossário

Este glossário oferece uma visão geral dos conceitos fundamentais abordados nos tópicos mencionados. É uma ferramenta útil para quem busca uma rápida referência ou revisão desses conceitos.

Algoritmo: Sequência finita e bem definida de instruções destinadas a realizar uma tarefa específica. Um algoritmo deve ser claro, eficaz e deve ter um fim depois de executar suas instruções.

Código de computador: Conjunto de instruções escritas em uma linguagem de programação que é interpretada ou compilada para ser executada por um computador. O código de computador forma a base de software e aplicativos.

Code.org: Uma plataforma educacional sem fins lucrativos que visa aumentar o acesso à informática para estudantes. Oferece cursos de codificação e atividades interativas, especialmente focadas em programação em blocos.

Linguagem de Programação: Um vocabulário e conjunto de regras gramaticais para instruir um computador a realizar tarefas específicas. Linguagens de programação incluem Python, Java, C++, entre outras.

Paradigma de programação: Um estilo ou maneira de programar, que oferece e determina a estrutura e a execução de programas e códigos. Exemplos incluem programação orientada a objetos, programação estruturada e programação funcional.

Programa de computador: Um conjunto de instruções que, quando executadas, são processadas por um computador para realizar uma função específica ou resolver um problema particular.

Programação em blocos: Uma abordagem visual para programação, onde os usuários podem arrastar e soltar blocos que representam diferentes funções ou comandos em programas, muito usada para fins educacionais e iniciantes na programação.

Programação estruturada: Um paradigma de programação que enfatiza a importância de um fluxo de controle claro e estruturado, utilizando sub-rotinas, loops e estruturas condicionais.

Python: Uma linguagem de programação de alto nível, interpretada e de propósito geral, conhecida por sua legibilidade e sintaxe clara. Amplamente utilizada para desenvolvimento web, análise de dados, inteligência artificial, entre outros.

Scratch: Uma plataforma de programação visual baseada em blocos, desenvolvida pelo MIT, que permite que crianças e iniciantes criem histórias interativas, jogos e animações, facilitando o aprendizado de conceitos de programação.

Sem título CustomCSS

Capítulo 3 - Modelo de dados e comandos básicos

Sem título ObjetivoCapDEAD

O objetivo deste capítulo é aprofundar nossos conhecimentos em lógica de programação, com especial atenção à linguagem Python. Exploraremos desde um resumo da história do Python até a instalação de seu ambiente de desenvolvimento. Além disso, abordaremos modelos de dados, que abrangem variáveis, constantes e tipos de dados, bem como entrada e conversão de dados.

Sem título Text

Introdução

À medida em que avançamos em nossa jornada pelo mundo da programação, torna-se essencial escolher uma linguagem que facilite a expressão clara e eficiente de nossas ideias. Conforme abordado no capítulo anterior, nosso foco será na linguagem Python, reconhecida tanto por sua popularidade quanto por sua versatilidade. Após escolhermos Python como nosso foco, neste capítulo abordaremos o ambiente de desenvolvimento, modelos de dados, que abrangem variáveis, constantes e tipos de dados, além de detalhar a entrada e conversão de dados.

Prepare-se para mergulhar na programação com Python, uma linguagem intuitiva e amplamente suportada por uma comunidade ativa, ideal para iniciantes que dão seus primeiros passos e para especialistas que buscam aprofundar seus conhecimentos.

Tirinha

1

[Image: Tirinha: Quadro 1]

2

[Image: Tirinha: Quadro 2]

3

[Image: Tirinha: Quadro 3]

4

[Image: Tirinha: Quadro 4]

Sem título Image Slide

[Image: Tirinha: Quadro 5]

Sem título Image Slide

[Image: Tirinha: Quadro 6]

Sem título Image Slide

[Image: Tirinha: Quadro 7]

Sem título Image Slide

[Image: Tirinha: Quadro 8]

Sem título Text

A Linguagem Python

A história do Python começa por volta dos anos 80 do século XX, quando o programador holandês Van Rossum (figura 1) utilizava o laboratório do grupo CWI (Distributed & Interactive Systems) para trabalhar no desenvolvimento de uma linguagem de programação chamada ABC, juntamente com o Sistema Operacional AMOEBA. Nesse tempo, Rossum começou a pensar em uma nova linguagem que possuísse uma sintaxe semelhante à da ABC e com o acesso semelhante ao do AMOEBA. Foi assim que surgiu a linguagem Python, lançada publicamente em 1991 com sua primeira versão pública, a versão 0.9.0.

Figura 1 - Guido Van Rossum, criador da Linguagem Python.

[Image: Guido Van Rossum, criador da Linguagem Python]

Sem título Text

Fonte: https://gvanrossum.github.io/

A escolha da linguagem Python para essa disciplina se deve à sua simplicidade e facilidade de aprendizado. Isso acontece principalmente por causa  da sua sintaxe clara e legível, que possibilita que os alunos se concentrem em aprender conceitos de programação em vez de se perderem em sintaxes complexas, comuns em outras linguagens. Além disso, Python se beneficia de uma comunidade de programadores bastante ativa e uma ampla variedade de materiais didáticos disponíveis. Conforme o índice TIOBE de novembro de 2023 (TIOBE SOFTWARE BV, 2023), que mede a popularidade das linguagens de programação com base em critérios específicos, Python se destaca como a linguagem de programação mais popular do mundo.

Atualmente o Python é uma linguagem de programação amplamente usada em diversas aplicações, tais como desenvolvimento web, aplicações GUI para desktop, jogos, ciência de dados, programação de redes e aplicações educacionais. Como exemplo das diversas aplicações do Python, veremos a seguir um infográfico com grandes empresas que usam Python em seus projetos.

Figura 2 - Python no mundo corporativo e como crédito colocar

Infográfico

[Image: Infográfico]

Sem título Text

Fonte: adaptado pelo autor

Ambiente de desenvolvimento Python

Para iniciar suas atividades no mundo da programação em Python, você precisa instalar o seu ambiente de desenvolvimento. Para isso, primeiramente, é necessário instalar a versão mais recente do Python, disponível no site oficial da Python Software Foundation, e, em seguida, configurar um ambiente adequado para editar e executar o seu código Python.

Sem título Text

Ao iniciarem seu caminho na programação, muitos optam por escrever seus códigos em editores de texto. Nesse método, o código é digitado no editor e, para executá-lo, utiliza-se uma janela de terminal separada. Caso erros ou falhas sejam identificados, o processo inclui retornar ao editor para corrigir os problemas e, em seguida, executar novamente o código no terminal. Este ciclo de escrever, corrigir e testar é uma prática comum entre os iniciantes na codificação.

Embora a prática de utilizar um editor de texto simples possa ser adequada para iniciantes, como ao escrever um programa básico de "Olá, Mundo!", ela pode tornar-se limitante à medida que você avança para níveis intermediários. Com o aumento da complexidade do código, surge a necessidade de uma ferramenta mais robusta, que ofereça mais do que a simples edição de texto, facilitando o gerenciamento de códigos mais complexos e a identificação de erros.

Um ambiente que oferece não apenas a capacidade de codificar, testar e executar, mas também recursos como destaque de sintaxe, correspondência de parênteses, preenchimento automático, depuração e sugestões de código, é conhecido como Ambiente de Desenvolvimento Integrado (IDE). Um IDE é uma ferramenta abrangente que facilita significativamente o processo de desenvolvimento de software.

Entre as opções mais populares de IDEs para desenvolvimento em Python, destacam-se PyCharm, Visual Studio Code, Jupyter Notebooks,  Sublime Text e Eclipse com PyDev.

Sem título Text

Ao iniciarem seu caminho na programação, muitos optam por escrever seus códigos em editores de texto. Nesse método, o código é digitado no editor e, para executá-lo, utiliza-se uma janela de terminal separada. Caso erros ou falhas sejam identificados, o processo inclui retornar ao editor para corrigir os problemas e, em seguida, executar novamente o código no terminal. Este ciclo de escrever, corrigir e testar é uma prática comum entre os iniciantes na codificação.

Embora a prática de utilizar um editor de texto simples possa ser adequada para iniciantes, como ao escrever um programa básico de "Olá, Mundo!", ela pode tornar-se limitante à medida que você avança para níveis intermediários. Com o aumento da complexidade do código, surge a necessidade de uma ferramenta mais robusta, que ofereça mais do que a simples edição de texto, facilitando o gerenciamento de códigos mais complexos e a identificação de erros.

Um ambiente que oferece não apenas a capacidade de codificar, testar e executar, mas também recursos como destaque de sintaxe, correspondência de parênteses, preenchimento automático, depuração e sugestões de código, é conhecido como Ambiente de Desenvolvimento Integrado (IDE). Um IDE é uma ferramenta abrangente que facilita significativamente o processo de desenvolvimento de software.

Entre as opções mais populares de IDEs para desenvolvimento em Python, destacam-se PyCharm, Visual Studio Code, Jupyter Notebooks,  Sublime Text e Eclipse com PyDev.

Figura 3 – IDEs para Python e como crédito colocar

[Image: Logo IDE's]

Sem título Text

Fonte: adaptado pelo autor

O PyCharm se destaca por sua interface limpa e altamente personalizável, tornando-se uma escolha ideal para iniciantes em Python. Este IDE oferece uma variedade de funções para personalizar o espaço de trabalho, além de contar com recursos integrados da linguagem Python para um acesso rápido e preciso. Com facilidades como guias passo a passo para a criação de funções e acesso direto a manuais de bibliotecas com apenas um clique, o PyCharm simplifica o processo de aprendizado e desenvolvimento. Além disso, dispõe de funcionalidades essenciais, como console integrado e ferramentas de depuração.

Sem título Text

Apesar de ser mais adequado usar uma IDE para desenvolvimento em Python, existem situações em que programar sem um ambiente de  desenvolvimento completo é necessário, especialmente para iniciantes. Nessas ocasiões, compiladores online podem oferecer uma solução prática. O Online-Python é um exemplo desses compiladores. Esta plataforma permite escrever, executar e compartilhar código Python diretamente pelo navegador, eliminando a necessidade de instalar qualquer software.

Após a instalação do ambiente de desenvolvimento, você já está pronto para criar seu primeiro programa em Python. Como exemplo inicial, vamos escrever o tradicional 'Olá mundo'. Veja abaixo o código.

# Seu primeiro código em Python
print("Olá mundo") #Saída: Olá Mundo

Sem título Text

É importante saber que, no código acima, o texto que aparece após o símbolo # é conhecido como comentário. Na programação, os comentários são anotações feitas no código para explicar partes do programa ou para impedir a execução de certas partes do código. É importante destacar que os comentários não são executados pelos programas e que eles são cruciais para a sua qualidade, pois esclarecem o código, facilitando sua compreensão e manutenção por outros programadores.

Nas seções seguintes, exploraremos os conceitos fundamentais de modelos de dados em Python, abrangendo variáveis e constantes. Além disso, abordaremos os comandos de entrada de dados e conversão de tipos.

Modelo de dados

Modelos de dados em linguagens de programação descrevem as estruturas e os tipos de dados que podem ser manipulados por uma linguagem. Eles especificam como os dados são representados, armazenados e como podem ser acessados ou alterados dentro de um programa. Os conceitos fundamentais na modelagem de dados em qualquer linguagem de programação incluem variáveis, constantes e tipos de dados.

As variáveis nas linguagens de programação são utilizadas para armazenar informações que podem variar durante a execução do programa. Em Python, para declarar uma variável, basta definir um nome para ela e atribuir-lhe um valor inicial. Os nomes das variáveis em Python devem começar com letras e podem incluir números e o sublinhado (_), mas não devem conter letras acentuadas, cedilhas, espaços ou caracteres especiais, tais como $, #, @. Além disso, convencionou-se em Python que nomes de variáveis começam com letra minúscula, assim como, em nomes compostos por mais de uma palavra, utiliza-se o sublinhado para separar as palavras. É importante também observar que existem restrições para nomes de variáveis, como nomes que iniciam com números e o uso de palavras reservadas da linguagem.

Com relação às constantes, nas  linguagens de programação elas são utilizadas para armazenar valores que não mudam durante a execução de um programa. Embora Python não tenha um tipo de dado constante nativo, a convenção é usar nomes em maiúsculas para representar valores que não devem mudar, como por exemplo PI = 3.14. Estes são tratados como constantes simbólicas, já que Python, sendo uma linguagem dinâmica, não impede a atribuição de valores a essas constantes.

Veja abaixo uma tabela que resume as principais regras e convenções para a declaração e nomeação de variáveis e constantes em Python.

Tabela 1 - Regras e Convenções de variáveis em Python

Sem título Tabela Visual com Scroll

Variáveis

Declaração:

Basta definir um nome para ela e atribuir-lhe um valor inicial(ex: variável = valor)

Uso:

Armazenar informações que podem variar durante a execução do programa.

Nomes de Variáveis

Composição:

Podem conter letras (a-z, A-Z), números (0-9), e o caracter sublinhado(_).

Início:

Devem começar com uma letra.

Caracteres proibidos:

Letras acentuadas, cedinhas, espaços, e caracteres especias como $,#,@, etc. Não são permitidos, exceto o sublinhado(_).

Convenção de nomeclatura:

Começam com letras minúsculas; em nomes compostos por mais de uma palavra, utiliza-se o sublinhado para separá-las (ex: minha_variável).

Restrições Adicionais

Nomes com números:

Nomes que começam com números não são permitidos.

Palavras reservadas:

Palavras reservadas da linguagem(ex:  if, else, for, while, class, def, etc.) não podem ser usadas como nomes de variáveis.

Constantes

Nomeação:

Constantes são convencionalmente nomeadas com todas as letras maiúsculas (ex: MINHA_CONSTANTE).

Armazenar valores que não mudam durante a execução de um programa.

Sem título Text

Fonte: Adaptado pelo autor

A seguir, temos um exemplo de código que demonstra a atribuição de valores a variáveis.

# criando duas variáveis
matricula = 123456
aluno = "Nome do aluno"

Sem título Text

Depois das explicações sobre os conceitos de variáveis e constantes, o outro conceito fundamental que precisamos entender na modelagem de dados em Python são os tipos de dados disponíveis na linguagem.

Python é uma linguagem de tipagem dinâmica, o que significa que o tipo de uma variável é determinado no momento da execução, e não na declaração. Isso implica que o tipo de uma variável é determinado automaticamente no momento da sua atribuição, e não é necessário declará-lo explicitamente durante a definição da variável. Veja o exemplo a seguir, em que uma mesma variável em Python é atribuída a diferentes tipos de dados durante a execução do programa.

# Variáveis com diferentes tipos de dados
variavel = "Wagner de Oliveira"
variavel = 40
variavel = 1.73
variavel = True

Sem título Text

Embora no Python a mudança de tipo em uma variável seja permitida, não é recomendado abusar dessa flexibilidade, pois isso pode tornar mais difícil a descoberta e a correção de erros em seu programa. Portanto, é aconselhável pensar em cada variável como tendo um único tipo. Se for necessário armazenar um valor de um tipo diferente, é preferível criar uma nova variável.

Nesse momento, iremos tratar dos tipos de dados básicos no Python, que são inteiro (int), real (float), texto (str) e booleano (bool). É importante notar que não abordaremos agora todos os tipos de dados disponíveis em Python. A tabela abaixo descreve esses tipos e suas respectivas descrições.

Tabela 2 - Tipos de dados básicos em python

Sem título Tabela Visual com Scroll

Tipo

Descrição

Inteiro (int)

Representa os números inteiros, ou seja, qualquer valor numérico sem a parte fracionária. Exemplos: 0, -1, 234, -98.

Real (float)

Compreende os números reais, compostos por uma parte inteira e uma parte fracionária separadas por um ponto decimal. Exemplos: 0.0, 8.95, 2.1.

Texto (str)

Informações compostas por zero ou mais caracteres alfanuméricos colocados entre aspas ou apóstrofos. Exemplos: 'IFRN', 'José da Silva', 'Rua das flores, n. 44', 'a'.

Booleano (bool)

Corresponde às informações que podem assumir os valores lógicos verdadeiro (True) ou falso (False). Exemplos: encontrado = False, encontrado = True.

Sem título Text

Fonte: Adptado pelo autor

Considerando a natureza de tipagem dinâmica do Python, se você precisar verificar o tipo de um valor, pode utilizar o comando type (valor). Essa ferramenta é útil para determinar o tipo de um valor no Python. Veja o exemplo a seguir, que foi apresentado anteriormente, agora exibindo o resultado da execução da função type em cada atribuição dos diferentes tipos de dados.

# Variáveis com diferentes tipos de dados
variavel = "Wagner de Oliveira"
print(type(variavel)) #Saída: <class 'str'>
variavel = 40
print(type(variavel)) #Saída: <class 'int'>
variavel = 1.73
print(type(variavel)) #Saída: <class 'float'>
variavel = True
print(type(variavel)) #Saída: <class 'bool'>

Sem título Text

Entrada de dados e conversão de tipos

Nos exemplos de códigos que apresentamos, declaramos as variáveis e atribuímos valores a elas diretamente no código. Porém, em situações reais, precisamos interagir com os usuários para obter a entrada de dados para o programa. No Python, para capturar essas informações do usuário, usamos a função input(). A seguir, apresentamos um exemplo de código no qual solicitamos dados de entrada do usuário utilizando a função input().

# Utilizando a função input()
nome = input("Informe seu nome completo");
idade = input("Informe sua idade");
altura = input("Informe sua altura");

Sem título Text

Quando usamos a função input() no Python, o que recebemos de volta é sempre uma string. Dessa forma, no código acima, mesmo que o usuário tenha a intenção de informar um texto (para o nome), um número inteiro (para a idade) e um número real (para a altura), as variáveis nome, idade e altura armazenam os valores como strings. Para utilizar esses valores nos tipos de dados apropriados, é necessário convertê-los manualmente. Felizmente, Python facilita esse processo com suas funções de conversão de tipos.

Por exemplo, a função int() é utilizada para converter strings em inteiros, como na conversão da idade do usuário. Da mesma forma, float() é adequada para converter strings em números reais, como na altura. Assim, podemos reescrever o código anterior para converter os dados de entrada imediatamente para os tipos mais apropriados:

# Utilizando a função input() e conversão de tipos
nome = input("Informe seu nome completo")
idade = int(input("Informe sua idade"))
altura = float(input("Informe sua altura"))
print(type(nome)) #Saída: <class 'str'>
print(type(idade)) #Saída: <class 'int'>
print(type(altura)) #Saída: <class 'float'>

Sem título Text

Além disso, temos funções como str(), para transformar outros tipos de dados em strings, e bool(), para converter valores em booleanos. Essas funções de conversão de dados são fundamentais para garantir que os dados sejam manipulados no tipo correto ao longo do seu programa.

A tabela a seguir resume as principais funções de conversão de tipos em Python que discutimos, destacando suas utilidades e incluindo exemplos de uso.

Sem título Tabela Visual com Scroll

Função de conversão

Descrição

Exemplo de uso

int(x)

Converte x para um número inteiro.

idade = int(input("Informe sua idade")). Converte a entrada do usuário para um inteiro.

float(x)

Converte x para um número de ponto flutuante.

altura = float(input("Informe sua altura")).
Converte a entrada do usuário para um float.

str(x)

Converte x para uma string.

ano str = str(2023).
Converte um número inteiro em uma string representando esse número.

bool(x)

Converte x para um valor booleano.

ativo = bool(input("Ativo (True/False)? "))
Converte a entrada do usuário para um booleano.

Sem título Text

Só se aprende a programar programando

Seguindo o princípio amplamente reconhecido de que a melhor maneira de aprender programação é praticando ativamente, os capítulos a partir de agora incluirão uma seção dedicada a exercícios práticos, intitulada 'Só se aprende a programar programando'.

Os exercícios a seguir são projetados para ajudá-lo a praticar e aprimorar suas habilidades em Python. Encorajamos você a tentar resolvê-los por conta própria. Após as tentativas, você poderá consultar as soluções propostas no GitHub do curso, disponíveis em https://github.com/.

1. Desenvolva um programa que leia o nome de uma pessoa e mostre uma mensagem de boas-vindas na tela.
2. Desenvolva um programa que declare três variáveis: uma para armazenar o nome de um aluno, outra para a sua idade, e uma terceira para o seu curso.
3. Desenvolva um programa que declare uma variável para cada tipo de dado básico em Python (inteiro, real, texto e booleano). Atribua valores apropriados a cada uma e utilize a função type() para imprimir o tipo de cada variável.
4. Desenvolva um programa onde uma variável é inicialmente declarada como um tipo de dado e, em seguida, é reatribuída com um valor de um tipo diferente (por exemplo, de inteiro para string). Use a função type() para demonstrar a mudança de tipo da variável.
5. Desenvolva um programa que peça ao usuário para inserir sua idade e altura em metros usando a função input(). Depois, converta esses valores para os tipos de dados apropriados, e então use a função type() para demonstrar a mudança de tipo da variável.

Conclusão

Neste capítulo, exploramos a lógica e a programação em Python, cobrindo desde a história e escolha da linguagem até a configuração do ambiente de desenvolvimento e conceitos fundamentais, como modelos de dados, entrada e conversão de dados. Demonstramos a aplicação prática desses conceitos com exemplos e exercícios, ressaltando a importância da prática contínua no desenvolvimento de habilidades de programação. Encerramos este capítulo lembrando que a verdadeira habilidade em Python, assim como em qualquer linguagem de programação, é alcançada através da prática ativa e da resolução de desafios concretos. Lembre-se: só se aprende a programar programando, e cada desafio superado é um passo adiante nesta jornada empolgante.

Glossário

Constante: Um valor que não muda ao longo da execução do programa.

Conversão de tipos: O processo de alteração de um tipo de dado em outro. Em Python, inclui as funções int() para converter para inteiro, float() para números de ponto flutuante, str() para strings, e bool() para valores booleanos (True ou False).

DE (Ambiente de Desenvolvimento Integrado): Um software que fornece ferramentas integradas para a edição de código, depuração e execução de programas.

Entrada de dados: Processo de receber dados do usuário durante a execução de um programa. Em Python, a função input() é comumente usada para este propósito.

Python: Uma linguagem de programação de alto nível, conhecida por sua clareza, simplicidade e uso amplo em diversas áreas.

String: Uma sequência de caracteres usada para representar texto.

Tipagem dinâmica: Característica do Python onde o tipo de uma variável é determinado automaticamente no momento da atribuição do valor.

Variável: Um identificador usado para armazenar valores que podem mudar durante a execução de um programa.

Sem título CustomCSS

Capítulo 4 - Operadores e Expressões

Sem título ObjetivoCapDEAD

O objetivo deste capítulo é avançarmos nos conhecimentos da linguagem de programação Python. Exploraremos operadores e expressões, abrangendo expressões aritméticas, operadores de atribuição, expressões lógicas e operadores relacionais. Além disso, abordaremos a manipulação e a formatação de texto.

Sem título Text

Introdução

Dando continuidade à jornada pelo mundo da programação em Python, neste capítulo abordaremos os operadores, expressões, e a manipulação e formatação de texto. Prepare-se para prosseguir no mundo da programação Python, aprendendo novos conceitos importantes para o seu desenvolvimento em programação.

Sem título Text

Operadores e expressões

No capítulo anterior, abordamos os conceitos de variáveis, constantes e seus respectivos tipos de dados. Agora, nosso foco será a manipulação desses dados, com ênfase nos operadores e na construção de expressões. Esses elementos são fundamentais para realizar cálculos, fazer comparações e conduzir testes lógicos. Portanto, compreender como criar expressões e entender os valores que elas produzem é essencial para avançar nos conhecimentos em Python.

Tirinha

1

2

3

4

5

Sem título Text

Uma expressão em Python é uma combinação válida de variáveis, constantes e operadores que resulta em um valor após sua avaliação. Por exemplo, ao digitar o número 10 no interpretador Python, temos uma expressão simples composta por uma constante do tipo inteiro: o valor 10. Se digitarmos 2 * 4.0, criamos uma expressão do tipo real, que inclui duas constantes e o operador de multiplicação (*), resultando no valor 8.0.

Conforme ilustrado pela definição e pelo exemplo, expressões são frequentemente formadas por operadores. Existem diversos operadores disponíveis, variando de acordo com o tipo de expressão. Nas seções seguintes, trabalharemos com expressões aritméticas (inteiros e reais), operadores de atribuição, expressões lógicas (verdadeiro – True ou falso – False) e operadores relacionais (resultados de comparações, verdadeiro ou falso).

Expressões aritméticas

As expressões aritméticas operam sobre valores inteiros ou reais. Se todos os operandos em uma expressão são inteiros, o resultado também será inteiro, com exceção da divisão, pois no Python 3 a divisão sempre resulta  em real. Por exemplo, 4 / 2 (4 dividido por 2) resultará em 2.0. O resultado de uma expressão numérica será real se ela incluir valores reais ou uma combinação de operandos inteiros e reais.

A Tabela 1 apresenta os símbolos usados para os operadores aritméticos e seus significados. Devido às limitações do teclado do computador, alguns símbolos diferem daqueles tradicionalmente aprendidos na escola. Por exemplo, a multiplicação é representada por “*” (asterisco) e a exponenciação por “**” (dois asteriscos).

Tabela 1 - Operadores aritméticos

Sem título Tabela Visual com Scroll

Operador

Significado

Exemplos

+

Adição

2 + 3 x = y + 2

-

Subtração

6 - 1 x - a - 2

*

Multiplicação

7 * 3 num * 2

/

Divisão

15 / 3 (4 + 4) / 2

//

Parte inteira da divisão

15 // 2 (resultado é 7)

%

Resto da divisão

6 % 2 (resultado é 0)

**

Exponenciação

2 ** 3 (resultado é 8)

Sem título Text

Fonte: Adaptado pelo autor

Em Python, as expressões são formuladas de maneira linear, o que significa que são escritas em uma única linha de texto, seguindo uma sequência lógica e contínua. Por exemplo, a expressão (5 x 3 ) / 2 (5 vezes 3 dividido por 2) deve ser traduzida em Python na forma linear como 5 * 3 / 2. É importante destacar que a linguagem estabelece uma ordem para a avaliação de operadores, conhecida como precedência. Operadores com maior precedência são avaliados (calculados) primeiro que aqueles com menor precedência. Quando temos operadores de mesma precedência sendo avaliados, a ordem de avaliação é da esquerda para a direita.

A lista de precedência, detalhada na Tabela 2 indica que, em uma expressão aritmética, primeiro devemos resolver a exponenciação, depois, na mesma prioridade, a multiplicação, a divisão e o resto, seguindo a ordem da esquerda para direita. Por fim, são realizadas a adição e a subtração.

Tabela 2 - Ordem de precedência dos operadores aritméticos.

Sem título Tabela Visual com Scroll

Precedência

Operadores

Nome

1

**

Exponenciação

2

* / // %

Multiplicação e divisão

3

+ -

Adição e subtração

Sem título Text

Fonte: Adaptado pelo autor

Se desejar forçar a avaliação de operadores com precedência menor antes de um de prioridade maior, você deve colocar essa parte da expressão entre parênteses. Por exemplo, na expressão 2 + 3 * 4, a multiplicação é realizada primeiro. No entanto, se a expressão for escrita como (2 + 3) * 4, a adição dentro dos parênteses é realizada antes da multiplicação.

É importante observar que os operadores de adição e de multiplicação apresentam um comportamento diferente quando utilizados em strings. Por exemplo, o comando print("Segunda, " + "-feira") concatena a string "Segunda" com a string "-feira", resultando em Segunda-feira. Por outro lado, o operador de multiplicação, quando usado com strings, repete a string um determinado número de vezes. Por exemplo, print(2 * "Nome") repete a string "Nome" duas vezes, gerando a string "NomeNome".

Operadores de atribuição

Em Python, os operadores de atribuição são usados para atribuir valores às variáveis durante a execução de um programa. O mais básico dentre eles é o sinal de igual (=), que atribui um valor a uma variável. Além dele, existem operadores que combinam operações aritméticas com a atribuição, como +=, -=, *=, e /=, que, além de executar a operação matemática correspondente, atribuem o resultado à variável, simplificando a programação de cálculos matemáticos. A Tabela 3 apresenta os operadores de atribuição, fornecendo uma descrição e um exemplo para cada um deles.

Tabela 3 - Operadores de atribuição.

Sem título Tabela Visual com Scroll

Operador

Descrição

Exemplo

=

Atribuição simples. Atribui um valor à  variável.

x = 5 Resultado em x igual a 5

+=

Atribuição de adição. Adiciona um valor à variável e atribui o resultado.

x = 10
x += 2
Resulta em x igual a 12

-=

Atribuição de subtração. Subtrai um valor da variável e atribui o resultado.

x = 10
x -= 2
Resulta em x igual a 8

*=

Atribuição de multiplicação. Multiplica a variável por um valor e atribui o resultado.

x = 5
x *= 3
Resulta em x igual a 15

/=

Atribuição de divisão. Divide a variável por um valor e atribui o resultado.

x = 10
x /= 2
Resulta em x igual a 5

//=

Atribuição de quociente inteiro da divisão. Realiza a divisão inteira da variável por um valor e atribui o resultado.

x = 10
x //= 3
Resulta em x igual a 3

%=

Atribuição de resto inteiro da divisão. Calcula o módulo (resto da divisão) da variável por um valor e atribui o resultado.

x = 10
x %= 3
Resulta em x igual a 1

**=

Atribuição de potência. Eleva a variável a um valor e atribui o resultado.

x = 3
x **= 2
Resulta em x igual a 9

Sem título Text

Fonte: Adaptado pelo autor

Expressões lógicas

Uma expressão lógica é composta por operadores lógicos ou de comparação (relacionais). O resultado da avaliação de uma expressão lógica é sempre um valor lógico, ou seja, verdadeiro (True) ou falso (False). Os operadores lógicos em Python são Or, And e Not, conforme detalhado na Tabela 4.

Tabela 4 - Operadores lógicos

Sem título Tabela Visual com Scroll

Operador

Significado

Exemplos

Or

Ou (disjunção)

x or y

And

E (conjunção)

(2 > x) and (y < z)

Not

Não (negação)

not(a == b)

Sem título Text

Fonte: Adaptado pelo autor

Na Tabela 5,  apresentamos a tabela verdade para cada operador lógico. As tabelas verdade mostram o resultado de todas as possíveis combinações de valores entre operandos que estão conectados usando algum operador lógico.

Tabela 5 - Tabela verdade dos operadores lógicos

Sem título Tabela Visual com Scroll

A

B

A and B

A or B

not A

not B

False

True

Sem título Text

Fonte: Adaptado pelo autor

A precedência entre os operadores lógicos ocorre da seguinte forma: inicialmente, é feita a negação (not); posteriormente, é tratado o "e" (and) e, por fim, o "ou" (or).

Expressões relacionais

Os operadores relacionais são utilizados para se fazer comparações entre expressões. O resultado dessas comparações é lógico, ou seja, verdadeiro (True) ou falso (False). Os operadores relacionais em Python são detalhados na tabela 6.

Tabela 6 - Operadores relacionais

Sem título Tabela Visual com Scroll

Operador

Significado

Exemplos

==

Igual a

4 == 3 (resulta em False)

>

Maior que

4 > 3 (Resulta em True)

<

Menor que

4 < 3 (Resulta em False)

>=

Maior ou igual a

4 >= 3 (Resulta em True)

<=

Menor ou igual a

4 <=3 (Resulta em False)

!=

Diferente de

4 != 3 (Resulta em True)

Sem título Text

Fonte: Adaptado pelo autor

Dentre os operadores relacionais mencionados, os operadores de teste de igualdade (==) e de diferença (!=) são os que geralmente causam mais dúvidas. É importante não confundir o teste de igualdade com o operador de atribuição (=), que é usado para atribuir um valor a uma variável. Por outro lado, o teste de diferença, sendo o oposto do operador de igualdade, simplesmente verifica se dois valores são distintos.

Em Python, os operadores relacionais possuem igual precedência entre si. Portanto, levando em conta todos os operadores da linguagem que discutimos até agora, a Tabela 7, a seguir, classifica-os da maior para a menor precedência. Lembre-se de que os parênteses têm a mais alta precedência e, dessa forma, podem forçar a avaliação de uma expressão com menor precedência.

Tabela 7 - Precedência dos operadores em Python.

Sem título Tabela Visual com Scroll

Precedência

Operador

Descrição

1.

()

Parênteses

2.

**

Exponenciação

3.

*

/

//

%

Multiplicação

Divisão

Divisão inteira

Resto da divisão

4.

+

-

Adição

Subtração

5.

>

>=

<

<=

!=

Relacionais

6.

not

Lógico NOT

7.

and

Lógico AND

8.

or

Lógico OR

9.

=

+=

-=

*=

/=

//=

%=

**=

Atribuição

Sem título Text

Fonte: Adaptado pelo autor

Manipulação e formatação de texto

Prosseguindo com os estudos sobre manipulação de dados e focando agora no tipo de dados texto (strings), o Python oferece uma ampla variedade de operações úteis para a manipulação e formatação de texto. Essas funcionalidades tornam a linguagem particularmente eficiente no trabalho com strings.

A manipulação de textos básica no Python é realizada através de métodos integrados. Esses métodos possibilitam realizar diversas tarefas. Primeiro, vamos explorar a função len, que é usada para determinar o comprimento de uma string, incluindo espaços e caracteres especiais.

texto = "Esta é apenas uma simples string."
print(len(texto)) # Saída: 33

Sem título Text

Agora, voltando aos métodos de string, podemos alterar nossa string e substituir uma palavra usando o método replace.

texto = "Esta é apenas uma simples string."
texto = texto.replace("simples", "pequena")
print(texto) # Saída: Esta é uma pequena string.

Sem título Text

Em seguida, vamos contar quantas vezes uma palavra ou caractere específico aparece na string, utilizando para isso o método count.

texto = "Esta é apenas uma simples string."
print(texto.count("s")) # Saída: 5

Sem título Text

Também podemos localizar a posição de uma letra ou palavra específica com o método find.

texto = "Esta é apenas uma simples string."
print(texto.find("a")) # Saída: 3

Sem título Text

E para dividir a string em palavras, aplicamos o método split:

texto = "Esta é apenas uma simples string."
print(texto.split()) # Saída: ['Esta', 'é', 'apenas', 'uma', 'pequena', 'string.']

Sem título Text

A seguir, apresentamos a Tabela 8, que resume as funções de manipulação de texto em Python, abordadas anteriormente. Cada função é acompanhada de uma descrição e de um novo exemplo de aplicação.

Tabela 8 - Funções de manipulação de strings.

Sem título Tabela Visual com Scroll

Função

Descrição

Exemplo

len

Determina o comprimento de uma string, incluindo espaços e caracteres especiais.

texto = "Olá, mundo!"
print(len(texto))
# Saída: 11

replace

Substitui uma palavra ou caractere em uma string por outra.

texto = "Gato e cachorro."
texto = texto.replace("cachorro", "peixe")
print(texto)
# Saída: Gato e peixe.

count

Conta quantas vezes uma palavra ou caractere aparece na string.

texto = "Abacaxi é bom."
print(texto.count("a"))
# Saída: 3

find

Localiza a posição de uma letra ou palavra específica na string.

texto = "Bem-vindo ao lar."
print(texto.find("o"))
# Saída: 8

split

Divide a string em palavras ou segmentos, com base em um delimitador especificado (espaço, por padrão).

texto = "Dividir esta frase."
print(texto.split())
# Saída: ['Dividir', 'esta', 'frase.']

Sem título Text

Fonte: Adaptado pelo autor

Além das funções mencionadas anteriormente, é possível acessar caracteres específicos ou fatias de uma string utilizando a notação de colchetes [ ]. Essa notação é a mesma empregada para acessar elementos de uma lista, assunto que será explorado mais adiante na disciplina. É importante observar que, em Python, os índices começam em 0. Além disso, o índice final em uma fatia de string não é incluído na substring resultante. Por exemplo, [1:3] retorna os caracteres nos índices 1 e 2, mas não inclui o caractere no índice 3. Se o índice inicial ou final da fatia for omitido, o Python automaticamente assume, respectivamente, o início ou o fim da string. O código a seguir serve como exemplo para ilustrar melhor essa notação.

s = "Olá, mundo!"
print(s[0]) # Saída: 'O'
print(s[:3]) # Saída: Olá
print(s[5:]) # Saída: 'mundo!'
print(s[:]) # Saída: 'Olá, mundo!'
print(s[::-1]) # Saída: '!odnum ,álO'

Sem título Text

Na última linha do código acima, observa-se a aplicação da técnica de fatiamento para inverter uma palavra ou frase. Para isso, utilizou-se um terceiro parâmetro no fatiamento para indicar a inversão, ou seja, retornar toda a frase de trás para frente, por meio do uso do -1.

Quando se trata de formatação de texto em Python, muitas vezes se busca um controle mais refinado sobre a apresentação dos dados, além da simples exibição de valores separados por espaços. Existem diversas maneiras de realizar essa formatação. Neste momento, vamos focar em duas delas: o uso das f-strings e o método str.format().

Uma das formas mais simples e eficientes de formatar strings em Python é fazer o uso de strings formatadas literalmente, conhecidas como f-strings, que foram incluídas a partir do Python 3.6. Para usar uma f-string, inicia-se a string com 'f' ou 'F' antes das aspas. Dentro dessa string, pode-se incluir expressões Python entre os caracteres '{' e '}', que podem se referir a variáveis ou valores literais. O código a seguir serve como exemplo para ilustrar o uso das f-strings.

evento = "ENEM"
print(f"Resultado do {evento} {ano}")
#Saída: Resultado do ENEM 2020

Sem título Text

Nesse exemplo, a expressão {evento} dentro da f-string é substituída pelo valor da variável evento. O mesmo ocorre na expressão {ano}, que foi substituída pela valor da variável ano.

Outra maneira de formatar textos em Python é através do método str.format() das strings, que proporciona uma abordagem um pouco mais complexa. Ainda é necessário utilizar os caracteres '{' e '}' para delinear onde as variáveis serão substituídas. Além disso, esse método permite a inclusão de diretivas de formatação detalhadas. Contudo, é preciso também fornecer explicitamente as informações que serão inseridas na formatação. O código a seguir serve como exemplo para ilustrar o uso do método str.format().

percentual = votos_sim / (votos_sim + votos_nao)
resultado = "{} Votos a favor {:.2%}".format(votos_sim, percentual)
print(resultado) # Saída: 30120654 Votos a favor 66.53%

Sem título Text

Neste exemplo, definimos duas variáveis, votos_sim e votos_nao, que representam a contagem de votos. Em seguida, calculamos o percentual de votos a favor por meio de uma simples operação aritmética. O resultado é formatado usando o método format(), onde a string de resultado contém dois conjuntos de chaves "{}" que funcionam como espaços reservados para os valores que serão formatados. O primeiro conjunto de chaves {} é substituído pelo valor de votos_sim. Já o segundo conjunto {:.2%} é utilizado para formatar o valor do percentual. Nesse caso, :.2% formata o número como um percentual com duas casas decimais. Assim, o valor 0.6653 é apresentado como 66.53%.

Só se aprende a programar programando

Os exercícios a seguir são projetados para ajudá-lo a praticar e aprimorar suas habilidades em Python. Encorajamos você a tentar resolvê-los por conta própria. Após as tentativas, você poderá consultar as soluções propostas no GitHub do curso, disponíveis em https://github.com/.

Escreva um programa que solicite ao usuário seu peso (em quilogramas) e altura (em metros), calcule e imprima o Índice de Massa Corporal (IMC), que é calculado pela divisão do peso da pessoa (em quilogramas) pelo quadrado de sua altura (em metros).

Desenvolva uma calculadora que execute as quatro operações matemáticas básicas (adição, subtração, multiplicação e divisão), com dois números fornecidos pelo usuário.

Escreva um programa que converta metros para centímetros e milímetros. O usuário deve digitar a medida em metros e o programa deve mostrar o resultado formatado da seguinte maneira: "10 metros equivalem a 1000 centímetros e 10000 milímetros”.

Escreva um programa que leia uma string do usuário e imprima-a invertida. Por exemplo, se o usuário digitar "Python", o programa deve imprimir "nohtyP".
Desenvolva um programa que solicite o nome, telefone e e-mail de um contato. Use métodos de formatação de textos do Python para organizar e exibir essas informações em um formato de agenda, da seguinte forma: "Contato: João Silva, Telefone: 999999999, E-mail: joao.silva@email.com".

Conclusão

Neste capítulo, avançamos no entendimento das operações e expressões em Python, incluindo expressões aritméticas, operadores de atribuição, expressões lógicas e relacionais. Além disso, finalizamos o conteúdo abordando a manipulação e formatação de texto (strings), uma capacidade extremamente valiosa no Python.

Encerramos o capítulo com a proposição de exercícios, que são projetados para reforçar os conteúdos por meio da aplicação prática do que foi aprendido. A programação é uma habilidade que se aprimora com a prática e esses exercícios oferecem uma oportunidade para melhorar o seu conhecimento em Python.

Glossário

Expressões: Combinação de variáveis, constantes e operadores que resulta em um valor após ser avaliada.

Expressões aritméticas: São expressões que operam sobre valores inteiros ou reais.

Operadores de atribuição: Usados para atribuir valores às variáveis durante a execução de um programa.

Expressões lógicas:  São expressões compostas por operadores lógicos ou relacionais em que o resultado da avaliação é sempre um valor lógico, ou seja, verdadeiro (True) ou falso (False).

Operadores relacionais: Utilizados para se fazer comparações entre expressões, sendo o resultado sempre um valor lógico, ou seja, verdadeiro (True) ou falso (False).

Manipulação e formatação de texto: Refere-se a técnicas em Python para alterar, dividir, e formatar strings.

Sem título CustomCSS

Capítulo 5 - Estruturas Condicionais

Sem título ObjetivoCapDEAD

Esse capítulo é dedicado a desvendar os aspectos cruciais do controle de fluxo na programação. O objetivo é fornecer a você uma compreensão profunda e prática de como os programas tomam decisões e direcionam o fluxo de execução com base em diferentes condições. Para atingir essa meta, o capítulo é estruturado em três objetivos principais: 

Compreender o controle de fluxo e suas implementações em Python.
Aprender a utilizar estruturas condicionais simples e compostas.
Entender e aplicar condições aninhadas em lógicas de decisão mais complexas.

Em resumo, este capítulo tem por objetivo equipá-lo com conhecimentos e habilidades fundamentais no uso do controle de fluxo e estruturas condicionais em Python, capacitando-o a escrever códigos mais dinâmicos, eficientes e inteligentes.

Sem título Text

Introdução

Neste capítulo, exploraremos um dos conceitos fundamentais da programação: as estruturas condicionais. Essenciais para a tomada de decisões em programas, elas permitem que o código reaja de maneira diferente a condições variadas. Utilizaremos a linguagem Python para ilustrar esses conceitos devido à sua sintaxe clara e legível, que facilita o aprendizado.

Sem título Text

Controle de fluxo

Inicialmente, é preciso que nos familiarizaremos com o conceito fundamental de controle de fluxo em programação. Esse conceito é a espinha dorsal de como os programas operam e tomam decisões.

O controle de fluxo em programação é a ordem na qual as instruções são executadas. Em Python, como em muitas linguagens de programação, o fluxo padrão é linear, seguindo a ordem das instruções como escritas. No entanto, para criar programas mais dinâmicos e inteligentes, muitas vezes é necessário alterar esse fluxo baseando-se em certas condições. Isso é feito usando estruturas condicionais.

Em nossos estudos iniciais, exploramos programas construídos a partir de instruções sequenciais, onde cada comando é executado um após o outro, seguindo um fluxo linear e direto. Para ilustrar esse conceito, consideremos a tarefa de calcular o consumo médio de um veículo, que envolve determinar a quantidade de combustível gasto (em litros) para percorrer uma certa distância (em quilômetros).

Com base no conhecimento que adquirimos até agora, esse problema pode ser resolvido com uma série de comandos em sequência. Vamos analisar o seguinte exemplo de código: primeiramente, o programa lê as entradas do usuário utilizando o comando input e armazena esses dados em variáveis. Em seguida, realiza o cálculo do consumo médio dividindo a distância percorrida pelo combustível consumido e, finalmente, exibe o resultado formatado na tela.

Cálculo do consumo médio de combustível

# Cálculo do consumo médio de combustível.
distancia = float(input(“Quantidade de quilômetros percorridos: “))
combustivel = float(input(“Quantidade de litros de combustível gasto: “))
consumo = distancia/combustível
print(“O consumo médio do veículo foi de {:.1f} km/l”.format(consumo))

Sem título Text

Esse exemplo demonstra um programa que opera de maneira sequencial e linear, necessitando de apenas duas informações para realizar um cálculo simples e fornecer um resultado ao usuário.

Agora, imagine se quiséssemos expandir a funcionalidade desse programa para oferecer o resultado em diferentes unidades, como quilômetros por litro (km/l) ou metros por litro (m/l). Nesse cenário, seria necessário introduzir uma tomada de decisão no programa para escolher a unidade de medida a ser apresentada.

Sem título Text

No dia a dia, estamos constantemente tomando decisões, desde escolher onde almoçar até decidir se vamos ao cinema ou ficamos em casa. Essas decisões são baseadas em critérios pessoais, como preferências ou recursos disponíveis.

Da mesma forma, em programação, frequentemente precisamos que nosso código tome decisões ou realize testes. Esses testes podem verificar, por exemplo, se uma entrada é um número válido antes de realizar um cálculo, ou se um usuário atende a um critério específico, como ter uma idade mínima de 18 anos.

Dessa forma, a fim de resolver problemáticas como estas, é necessário introduzir os conceitos de estruturas de controle, também conhecidas como estrutura condicionais. Esse conhecimento será fundamental para guiar a execução de diferentes trechos de código com base na análise de condições específicas.

Estruturas condicionais simples e compostas

As estruturas condicionais permitem que os programas executem diferentes blocos de código com base na avaliação de uma ou mais condições. A seguir, serão abordados exemplos práticos e cenários onde essas estruturas são aplicáveis, permitindo aos leitores entender como e quando usar cada uma delas da maneira mais eficaz.

Estrutura condicional simples

Iniciaremos o estudo pela estrutura condicional simples, que é aquela que permite ao programa tomar uma decisão baseada na avaliação de uma condição. Essa estrutura é geralmente implementada usando a palavra-chave if em muitas linguagens de programação, incluindo Python, Java, C++, entre outras.

A sintaxe básica do comando if em Python é:

if condição

# Bloco de código executado se a condição for verdadeira

Sem título Text

O funcionamento de uma estrutura condicional simples pode ser descrito da seguinte maneira:

- Avaliação da condição: Primeiro, uma condição específica é avaliada. Essa condição é uma expressão que retorna um valor booleano, ou seja, verdadeiro (True) ou falso (False).
- Execução condicional: Se a condição for verdadeira (True), o programa executa um bloco de código associado ao if. Se a condição for falsa (False), esse bloco de código é ignorado.

Importante: Uma expressão pode ser uma constante, uma variável ou uma combinação de ambas com operadores, que, após avaliada, retorna um valor.

Antes de mergulharmos em um exemplo, vale destacar dois pontos: a palavra if deve ser escrita em minúsculas, e o dois-pontos (":") após a condição indicam o início de um bloco de comandos.

Um bloco de comandos é um conjunto de instruções agrupadas dentro de uma estrutura, como o if. Em Python, blocos são definidos por indentação, que pode ser feita com tabulações ou espaços, e deve ser consistente. Todos os comandos em um bloco devem estar alinhados com a mesma quantidade de espaços ou tabulações.

Para ilustrar, consideremos um programa que lê dois números diferentes e indica qual deles é o maior:

condições if

n1 = int(input("Informe o primeiro número: "))
n2 = int(input("Informe o segundo número: "))
print("O primeiro número é maior do que o segundo")
print("O segundo número é maior do que o primeiro")

Sem título Text

Nesse código, as variáveis n1 e n2 armazenam os números inseridos pelo usuário. O programa usa duas estruturas condicionais if para comparar esses números. Se n1 for maior que n2, a mensagem correspondente é exibida, e vice-versa.

A indentação após cada if indica quais comandos pertencem a cada bloco condicional. É essa indentação que define o escopo de cada if, determinando a execução condicional dos comandos.

Sem título Image Slider

Sem título Image Slide

[Image: Tirinha: Quadro 1]

Sem título Image Slide

[Image: Tirinha: Quadro 2]

Sem título Image Slide

[Image: Tirinha: Quadro 3]

Sem título Image Slide

[Image: Tirinha: Quadro 4]

Sem título Image Slide

[Image: Tirinha: Quadro 5]

Sem título Image Slide

[Image: Tirinha: Quadro 6]

Sem título Image Slide

[Image: Tirinha: Quadro 7]

Sem título Text

Estrutura condicional composta

Para otimizar o exemplo acima, podemos usar a estrutura condicional composta if-else, que executa um bloco de comandos se a condição for verdadeira, e outro bloco se for falsa.

Para otimizar o exemplo acima, poderíamos usar uma estrutura condicional composta. Esse tipo de estrutura expande a funcionalidade da estrutura condicional simples, permitindo que o programa não apenas execute um bloco de código quando uma condição for verdadeira, mas também execute um bloco de código alternativo quando essa condição for falsa.

A sintaxe para if-else em Python é:

if e else

if condição:
# Bloco de código executado se a condição for verdadeira
else:
# Bloco de código executado se a condição for falsa

Sem título Text

O funcionamento da estrutura condicional composta pode ser explicado em duas partes principais:

- Execução condicional com if: Assim como na estrutura condicional simples, o programa avalia uma condição. Se essa condição for verdadeira (True), um bloco de código associado ao if é executado.
- Execução alternativa com else: Se a condição avaliada pelo if for falsa (False), o programa executa um bloco de código alternativo definido após a palavra-chave else.

Agora, que tal aprimorarmos o nosso programa anterior? Com a utilização da estrutura condicional composta if-else, temos:

if e else

n1 = int(input("Informe o primeiro número: "))
n2 = int(input("Informe o segundo número: "))
print("O primeiro número é maior do que o segundo")
else:
print("O segundo número é maior do que o primeiro")

Sem título Text

Nesse novo exemplo, a estrutura condicional avalia se n1 é maior que n2. Se sim, exibe a primeira mensagem; caso contrário, exibe a segunda. Esse método reduz a necessidade de múltiplas verificações if, tornando o código mais eficiente e legível.

Quiz

Q: Qual é a função da estrutura condicional simples if em Python?
- Executar um bloco de código se uma condição específica for verdadeira. (correct)
- Comparar duas variáveis e retornar a maior.
- Repetir um bloco de código várias vezes.

Q: Qual é a sintaxe correta para escrever uma estrutura condicional composta (if...else) em Python?
- if condição:
     # Bloco de código
else:
     # Outro bloco de código (correct)
- if condição
     # Bloco de código
else
     # Outro bloco de código
- if condição:
     # Bloco de código
else condição:
     # Outro bloco de código

Q: Como uma condição em uma estrutura if é avaliada em Python?
- A condição é avaliada e, se for verdadeira, executa o bloco de código abaixo dela. (correct)
- A condição verifica se o bloco de código abaixo dela contém erros.
- A condição sempre retorna True.

Feedback (0 to 33%): Pode melhorar
Feedback (34 to 66%): Bom
Feedback (67 to 100%): Ótimo

Sem título Text

Condições aninhadas

As condições aninhadas representam um avanço na complexidade das estruturas condicionais, permitindo que você implemente lógicas de decisão mais intrincadas em seus programas. Em uma condição aninhada, uma estrutura condicional (como if ou else) é colocada dentro de outra, permitindo testar múltiplas condições em sequência ou em diferentes níveis de profundidade.

- Aninhamento de condições: Uma condição aninhada ocorre quando você tem uma instrução if dentro de outra instrução if, ou um else que contém outro if ou else. Isso permite testar uma série de condições diferentes, uma após a outra, ou com base nos resultados de condições anteriores.
- Avaliação sequencial: Primeiro, o programa avalia a condição externa. Se essa condição for verdadeira, ele passa para a próxima condição interna, e assim por diante. Se uma condição externa é falsa, o programa pode pular toda a cadeia de condições internas, dependendo de como a lógica está estruturada.

Em Python, condições aninhadas são comumente escritas com a combinação de if e else. A estrutura fica assim:

if e else

if condição1:
# Executa se condição1 for verdadeira
else:
if condição2:
# Executa se condição1 e condição2 forem verdadeiras
else:
# Executa se condição1 for verdadeira e condição2 falsa
else:
# Executa se condição1 for falsa

Sem título Text

Condições aninhadas são extremamente úteis para lidar com cenários complexos de decisão, onde várias condições diferentes precisam ser avaliadas de maneira sequencial ou dependente. Elas adicionam profundidade à lógica de programação e permitem a criação de códigos mais sofisticados e precisos. No entanto, é importante usar condições aninhadas com cuidado para evitar a criação de código excessivamente complicado ou difícil de entender. Uma boa prática é manter a clareza e a legibilidade, talvez quebrando estruturas aninhadas muito complexas em funções separadas.

Quando enfrentamos situações que requerem múltiplos casos de teste em uma mesma situação, com apenas um resultado possível, as condições aninhadas tornam-se uma ferramenta essencial.

Imagine que precisamos classificar jogadores de futebol em diferentes categorias baseadas em suas idades. Esse é um exemplo clássico de onde múltiplas condições precisam ser avaliadas sequencialmente até encontrar a categoria correta para cada jogador. Para tal, empregamos uma série de instruções if aninhadas, como mostrado no exemplo a seguir.

condicionais

idade = int(input("Informe a idade do jogador: "))
if idade >= 5:
print("Categoria: Infantil")
else:
print("Categoria: Juvenil")
else:
print("Categoria: Profissional")
else:
print("Categoria: Sênior")
else:
print("Não existe categoria para a idade acima de 55 anos!")
else:
print("Não existe categoria para a idade abaixo de 5 anos!")

Sem título Text

Embora esse código seja funcional e direto, ele pode se tornar extenso e visualmente desafiador. No entanto, o Python oferece uma maneira mais elegante de lidar com múltiplas condições aninhadas através do uso de elif. A palavra elif é uma abreviação de else if (senão-se), simplificando a estrutura de condições aninhadas e tornando o código mais legível e conciso

condicionais

idade = int(input("Informe a idade do jogador: "))
if idade >= 5:
print("Categoria: Infantil")
elif idade <= 18:
print("Categoria: Juvenil")
elif idade <= 37:
print("Categoria: Profissional")
elif idade <= 55:
print("Categoria: Sênior")
else:
print("Não existe categoria para a idade acima de 55 anos!")
else:
print("Não existe categoria para a idade abaixo de 5 anos!")

Sem título Text

Com o elif, eliminamos a necessidade de múltiplos blocos else aninhados, facilitando a leitura e a manutenção do código. Cada condição é avaliada em sequência, e apenas o bloco de código correspondente à primeira condição verdadeira é executado, seguindo a mesma lógica do exemplo anterior, mas de forma mais eficiente e pythonica.

Sem título Emphasis Card

Quer aprofundar os seus conhecimentos sobre os assuntos estudados neste capítulo? Veja a seguir algumas videoaulas que podem ser interessantes:
https://www.youtube.com/watch?v=K10u3XIf1-Q&t=0s
https://www.youtube.com/watch?v=j9bYDjaAYzw&t=0s

Sem título Text

Só se aprende a programar programando

Os exercícios a seguir são projetados para ajudá-lo a praticar e aprimorar suas habilidades em Python. Encorajamos você a tentar resolvê-los por conta própria. Após as tentativas, você poderá consultar as soluções propostas no GitHub do curso, disponíveis em https://github.com/.

1. Desenvolva um programa que solicite ao usuário um número e imprima se esse número é positivo, negativo ou zero.
2. Escreva um programa que retorne o maior e menor número da lista.
3. Desenvolva um programa que leia um número inteiro e informe se ele é divisível por cinco e por três ao mesmo tempo.
4. Faça um programa que peça um ano e determine se ele é um ano bissexto ou não.
5. Desenvolva um programa que calcule o Índice de Massa Corporal.

Conclusão

Ao encerrarmos este capítulo sobre estruturas condicionais em Python, refletimos sobre os insights e habilidades adquiridos. Desde a compreensão do controle de fluxo, passando pelas estruturas condicionais simples (if) e compostas (if...else), até as condições aninhadas (elif), trilhamos um caminho de aprendizado essencial para qualquer programador.

Você agora tem uma compreensão sólida de como criar programas que reagem e se adaptam a diferentes condições, um conhecimento fundamental na construção de soluções eficazes e dinâmicas em programação. As habilidades adquiridas aqui servirão como alicerce para todas as suas futuras aventuras em codificação, permitindo-lhe construir programas mais complexos e sofisticados.

Contudo, a viagem pela linguagem Python está longe de terminar. O próximo capítulo promete ser igualmente empolgante e informativo, onde mergulharemos no mundo das estruturas de repetição. Assim como as estruturas condicionais, as estruturas de repetição são vitais para a programação. Elas permitem que executemos um bloco de código várias vezes, o que é extremamente útil para tarefas como processar itens em uma lista, realizar cálculos iterativos ou simplesmente repetir uma ação até que uma condição específica seja atendida.

Continue sua jornada de aprendizado com entusiasmo e curiosidade, pois cada novo tópico é uma peça fundamental na construção de sua carreira como desenvolvedor.

Glossário

Este glossário oferece uma visão geral dos conceitos fundamentais abordados nos tópicos mencionados. É uma ferramenta útil para quem busca uma rápida referência ou revisão desses conceitos.

Aninhamento: O ato de colocar uma estrutura condicional dentro de outra. Usado em Python para criar lógicas de decisão mais complexas.

Bloco de comandos: Conjunto de instruções que são executadas juntas. Em Python, os blocos são definidos pela indentação.

Booleano: Um tipo de dado em Python que pode ter apenas dois valores: verdadeiro (`True`) ou falso (`False`).

Comparação: Em Python, operadores de comparação como `==`, `!=`, `>`, `<`, `>=`, `<=` são usados para comparar valores.

Condição: Uma expressão em programação que é avaliada como verdadeira ou falsa. Usada para controlar o fluxo de execução em estruturas condicionais.

Controle de fluxo: O controle da ordem de execução das instruções em um programa. As estruturas condicionais são um tipo de controle de fluxo.

Estrutura condicional: Uma instrução em programação que executa diferentes blocos de código baseada em determinadas condições.

Expressão: Combinação de valores, variáveis e operadores que, quando avaliada, retorna um valor. Expressões são fundamentais nas condições das estruturas condicionais.

Indentação: Espaços ou tabulações usados no início de uma linha de código para definir blocos de comandos em Python.

Operadores lógicos: Em Python, operadores como `and`, `or`, e `not` são usados para combinar ou modificar condições booleanas.

Python: Uma linguagem de programação de alto nível, conhecida por sua clareza e simplicidade. Amplamente utilizada para desenvolvimento web, ciência de dados, automação e muitas outras aplicações.

Sintaxe: O conjunto de regras que define a combinação correta de símbolos que são considerados um programa válido em Python.

Sem título CustomCSS

Capítulo 6 - Estruturas de repetição

Sem título ObjetivoCapDEAD

Neste capítulo, focaremos em aprofundar o entendimento das estruturas de repetição em Python, com os seguintes objetivos: Entender a importância e o funcionamento das estruturas de repetição em Python, reconhecendo sua utilidade na otimização da escrita de código. Aprender a implementar a estrutura for para ciclos de repetição com um número definido de iterações, adequada para situações com contagem ou sequência conhecida. Dominar a estrutura while para ciclos baseados em condições, ideal para situações com número indeterminado de iterações. Além disso, é primordial desenvolver a habilidade de escolher a estrutura de repetição mais adequada para diferentes tipos de problemas de programação. Cada estrutura tem suas particularidades, e saber quando usar for ou while pode significar a diferença entre um código eficiente e um código que não atende às necessidades de maneira otimizada.

Sem título Text

Introdução

No universo da programação, as estruturas de repetição desempenham um papel fundamental ao permitir que executemos um conjunto de instruções repetidamente, até que uma determinada condição seja ou deixe de ser atendida. Este capítulo foca em desvendar as nuances e aplicabilidades dessas estruturas, essenciais para qualquer desenvolvedor que deseja escrever códigos limpos e eficientes.

Ao trabalharmos com Python, rapidamente percebemos que muitas tarefas envolvem a repetição de procedimentos semelhantes. Seja processando itens em uma lista, lendo dados de um arquivo ou até mesmo gerando uma sequência de números, as estruturas de repetição apresentam-se como ferramentas poderosas que economizam tempo, evitam redundâncias e aumentam a clareza do código.

No entanto, entender como e quando utilizar essas estruturas não é apenas uma questão de economia de esforço. É sobre compreender a lógica por trás da programação iterativa e como ela se aplica a problemas reais. Neste capítulo, exploraremos dois tipos principais de estruturas de repetição em Python, cada uma com suas características únicas, oferecendo diferentes maneiras de abordar a iteração, desde situações em que o número de repetições é conhecido de antemão até cenários onde a continuação do loop depende da satisfação de uma condição dinâmica.

Esse conhecimento é essencial para qualquer estudante de Sistemas para Internet, pois a habilidade de implementar loops eficientes e entender sua lógica é crucial para o desenvolvimento de qualquer programa ou aplicativo. Com essas ferramentas em seu arsenal, você estará um passo mais perto de se tornar um desenvolvedor Python proficient, capaz de lidar com os desafios práticos da programação no mundo real.

Sem título Text

Estrutura de repetição for

Com o conhecimento que adquirimos até agora sobre a linguagem Python, estamos prontos para criar diversos programas que realizem cálculos e tomem decisões com base no valor de expressões.

Agora, vamos nos aprofundar em uma nova instrução que nos permite repetir trechos de código em nossos programas. Você pode estar se perguntando como isso pode ser útil. De fato, a repetição de código é uma ferramenta extremamente vantajosa na programação, pois ajuda a evitar a redundância e possibilita a resolução de uma gama mais ampla de problemas.

Considere o seguinte problema:

"Seu professor pediu para que você calculasse a média aritmética das notas da sua turma na disciplina de programação. Se a turma for composta por 8 alunos, a média corresponde à soma das notas dividida por oito."

Até o momento, a solução implicaria criar oito variáveis para armazenar cada nota antes de efetuar o cálculo. Veja o código que resolve esse problema:

Cálculo da média da turma

# Código 1: Cálculo da média da turma
soma = 0
n1 = float(input("Informe a nota do aluno 1: "))
soma += n1
n2 = float(input("Informe a nota do aluno 2: "))
soma += n2
n3 = float(input("Informe a nota do aluno 2: "))
soma += n3
n4 = float(input("Informe a nota do aluno 2: "))
soma += n4
n5 = float(input("Informe a nota do aluno 2: "))
soma += n5
n6 = float(input("Informe a nota do aluno 2: "))
soma += n6
n7 = float(input("Informe a nota do aluno 2: "))
soma += n7
n8 = float(input("Informe a nota do aluno 2: "))
soma += n8
media = soma / 8
print("A média da turma é:", media)

Sem título Text

Na solução acima, a soma das notas é feita após a leitura de cada uma. Inicialmente, a variável “soma” é igual a 0. A cada nova nota lida, ela é adicionada à “soma”. Esse processo se repete para todas as oito notas.

No entanto, podemos simplificar esse processo usando uma estrutura de repetição que permite repetir automaticamente o trecho de código para ler as notas e acumulá-las na variável em questão. Sendo assim, vamos reescrever o programa usando a estrutura de repetição for.

No Python, existem duas formas principais de criar uma estrutura de repetição:

- For: Usado para iterar sobre um bloco de código um número determinado de vezes.
- While: Usado para repetir um bloco de código até que uma condição seja satisfeita.

Vamos ver como o for pode ser usado para simplificar o cálculo da média da turma:

Cálculo da média da turma utilizando a estrutura de repetição FOR.

# Código 2: Cálculo da média da turma utilizando a estrutura de repetição FOR.
soma = 0
for i in range(1, 9):
nota = float(input(f"Informe a nota do aluno {i}: "))
soma += nota
media = soma / 8
print("A média da turma é:", media)

Sem título Text

Observe como o código com repetição é mais enxuto e eficiente. A estrutura for itera sobre um intervalo de números (neste caso, de um a oito) e, em cada iteração, lê a nota de um aluno e a adiciona à soma.

A sintaxe do comando for em Python é:

estrutura for

for item in range(início, fim, passo):
# Bloco de código a ser repetido

Sem título Text

Por exemplo, para imprimir os números de 0 a 9, podemos usar:

Escrita dos números de 0 a 9 utilizando a estrutura FOR

# Código 3: Escrita dos números de 0 a 9 utilizando a estrutura FOR
for i in range(10):
print(i)

Sem título Text

E para escrever os números de 9 a 0:

Escrita dos números de 9 a 0 utilizando a estrutura FOR

# Código 4: Escrita dos números de 9 a 0 utilizando a estrutura FOR
print(i)

Sem título Text

Porém, para utilizar a estrutura for com maestria, é preciso entender bem como funciona uma outra função... a range(). Essa é uma função embutida extremamente útil, especialmente quando combinada com loops, como for. Ela é usada para gerar uma sequência de números, seguindo uma lógica específica definida pelos argumentos que recebe. A função range() pode ser usada de várias maneiras, dependendo do número de argumentos fornecidos.

1. Um argumento: Quando fornecido apenas um argumento, range(n), ela gera uma sequência de números de 0 a n-1. Por exemplo, range(5) produzirá 0, 1, 2, 3, 4.

for i in range(5):
print(i)

Sem título Text

2. Dois argumentos: Quando dois argumentos são fornecidos, range(start, stop), a sequência começará no número “start” e terminará em “stop-1”. Por exemplo, range(2, 6) gerará 2, 3, 4, 5.

for i in range(2, 6):
print(i)

Sem título Text

3. Três argumentos: Com três argumentos, range(start, stop, step), o terceiro argumento especifica o passo, ou seja, a diferença entre cada número na sequência. Por exemplo, range(2, 10, 2) produzirá 2, 4, 6, 8.

Sem título Text

A função range() é particularmente útil para loops, permitindo que o código seja executado um determinado número de vezes, iterando sobre uma sequência de números de maneira eficiente e clara.

Quiz

Q: Qual é o propósito da função range() em um loop for em Python?
- Criar uma sequência de números que o loop for pode iterar. (correct)
- Gerar uma lista aleatória de números.
- Calcular a média de uma série de números.

Q: No contexto de um loop for em Python, o que acontece se você omitir o valor inicial na função range()?
- O loop começará a partir do número 0. (correct)
- O loop começará a partir do número 1.
- O loop não será executado.

Q: Como você escreveria um loop for em Python para imprimir os números de 1 a 5?
- for i in range(1, 6):
     print(i) (correct)
- for i in range(1, 5):
     print(i)
- for i in range(5):
     print(i)

Feedback (0 to 33%): Pode melhorar
Feedback (34 to 66%): Bom
Feedback (67 to 100%): Ótimo

Sem título Text

Deseja aprofundar seus conhecimentos sobre os assuntos estudados neste tópico? Assista ao vídeo abaixo.

Sem título Text

Estrutura de repetição while

Agora, vamos explorar a estrutura de repetição while, uma ferramenta poderosa para repetir um bloco de código várias vezes com base em uma condição.

A sintaxe do comando while em Python é:

sintaxe while

while condição:
comandos_verdadeiro

Sem título Text

Nesse tipo de instrução, a condição é uma expressão que deve retornar verdadeiro (True) ou falso (False). Os comandos dentro do while são executados repetidamente enquanto a condição for verdadeira. Quando a condição se torna falsa, o programa sai do loop e continua com as instruções subsequentes.

A seguir, vamos reescrever o programa de cálculo da média da turma usando o comando while:

Cálculo da média da turma com a estrutura de repetição WHILE

# Código 5: Cálculo da média da turma com a estrutura de repetição WHILE
soma = 0
quantidade = 1
while quantidade <= 8:
nota = float(input(f"Informe a nota do aluno {quantidade}: "))
soma += nota
quantidade += 1
media = soma / 8
print("A média da turma é:", media)

Sem título Text

Nesse código, inicializamos “soma” com 0 e “quantidade” com 1. O loop while se repete enquanto “quantidade” for menor ou igual a 8, lendo a nota de cada aluno e acumulando na variável “soma”. A cada iteração, “quantidade” é incrementada em 1. Quando “quantidade” chega a 9, a condição do while se torna falsa, e o programa calcula e imprime a média.

O funcionamento da estrutura while pode ser resumido a partir do diagrama da figura 3. Na primeira etapa, você deve fornecer o valor inicial da variável de controle. Isso ocorre apenas uma vez, antes de chegarmos à etapa de teste da expressão do while. Nessa etapa, por sua vez, é feito o teste para saber se a repetição deve ser ou não realizada. Caso a expressão devolva o valor verdade verdadeiro (True), as instruções no corpo do while são realizadas. Uma dessas instruções geralmente é a atualização da variável de controle. Após essa atualização, o teste é feito novamente. Esse processo se repete até que a expressão de teste se torne falsa e o programa vá para a próxima instrução após while.

Figura 1 - Diagrama de funcionamento da estrutura WHILE.

[Image: Diagrama While]

Sem título Text

Fonte: adaptado pelo autor

Antes de você tentar resolver seus próprios problemas com o while, vamos praticar um pouco mais com alguns exemplos...

Suponha que você queira imprimir todos os números pares de 2 até 100, incluindo os próprios 2 e 100. Pois bem, vamos criar juntos essa repetição. Primeiro, qual seria o valor inicial da repetição? Se queremos ir de 2 até 100, então o valor inicial é 2.  Suponha que a variável de controle se chama “par”. Nesse caso, ela deve receber o inteiro 2, o primeiro par do intervalo (par = 2). O valor final é 100. Sendo assim, nossa expressão de teste deve ir até 100 (par <= 100). Agora falta apenas trabalharmos com a atualização da variável “par”, que deve crescer de 2 em 2, até chegar em 100 (par += 2).

Impressão de todos os números pares de 2 a 100

# Código 6: Impressão de todos os números pares de 2 a 100
print(par)

Sem título Text

E se quisermos que o usuário defina o valor final do intervalo para imprimir números pares:

Impressão de todos os números pares de 2 a um número definido pelo usuário

# Código 7: Impressão de todos os números pares de 2 a um número definido pelo usuário
limite = int(input("Digite o valor final do intervalo: "))
if limite >= 2:
while par <= limite:
print(par)
else:
print("Valor inválido. O número deve ser maior ou igual a 2.")

Sem título Text

Esses exemplos demonstram como a estrutura de repetição while pode ser utilizada para executar tarefas repetitivas de forma eficiente. Lembre-se de sempre garantir que a condição do while em algum momento se torne falsa, para evitar loops infinitos.

Deseja aprofundar seus conhecimentos sobre os assuntos estudados neste tópico? Assista ao vídeo abaixo.

Sem título Text

Só se aprende a programar programando

Os exercícios a seguir são projetados para ajudá-lo a praticar e aprimorar suas habilidades em Python. Encorajamos você a tentar resolvê-los por conta própria. Após as tentativas, você poderá consultar as soluções propostas no GitHub do curso, disponíveis em https://github.com/.

1. Escreva um programa que utilize um loop while para imprimir os números de 50 a 5.
2. Crie um programa que peça ao usuário para inserir um número e, usando um loop for, imprima a tabuada desse número de 1 a 10.
3. Desenvolva um programa que some todos os números ímpares de 1 a 100 usando um loop while.
4. Faça um programa que imprima os 10 primeiros elementos da sequência de Fibonacci usando um loop for.
5. Desenvolva um programa que leia um número inteiro e diga se ele é ou não um número primo.

Conclusão

À medida que encerramos nosso estudo sobre as estruturas de repetição em Python, é importante enfatizar a versatilidade e o poder que essas construções trazem para a programação. Este capítulo abordou dois tipos fundamentais de loops – for e while –, cada um com suas características e aplicações específicas. Compreender profundamente essas estruturas é vital para qualquer desenvolvedor que deseja escrever códigos eficientes e elegantes.

As estruturas de repetição são cruciais para a eficiência e o controle na programação, uma vez que economizam tempo e esforço, contribuindo para um código mais limpo e de fácil manutenção. Essas estruturas permitem um controle preciso sobre operações repetitivas. A escolha entre utilizar o loop for ou while depende do contexto: enquanto o for é ideal para situações com um número definido de iterações ou para iterar sobre elementos de uma coleção, o while se adapta melhor a condições de término incertas ou dependentes de uma condição específica.

Além disso, a habilidade de usar eficazmente essas estruturas de repetição é significativamente aprimorada por meio da prática e experimentação em diversos cenários e problemas, destacando a importância do exercício contínuo para o desenvolvimento de habilidades de programação.

Dominar as estruturas de repetição em Python é um aspecto crucial da programação eficiente. Ao praticar e explorar essas estruturas, você desenvolverá uma compreensão mais profunda e habilidades mais fortes, essenciais para resolver uma variedade de desafios de programação. Continue aplicando essas ferramentas essenciais em seus projetos para avançar ainda mais em sua jornada como profissional na área de Sistemas para Internet.

Glossário

Este glossário oferece uma visão geral dos conceitos fundamentais abordados nos tópicos mencionados. É uma ferramenta útil para quem busca uma rápida referência ou revisão desses conceitos.

Acumulador: Uma variável que guarda um valor acumulado ao longo de iterações em um loop. No exemplo, soma é usada como um acumulador para as notas.

Comandos_verdadeiro: Parte do bloco de código dentro de uma estrutura de repetição que é executada quando a condição é verdadeira.

Condição: Uma expressão em um loop que é avaliada em cada iteração. Se for verdadeira, o loop continua; se for falsa, o loop termina.

Estrutura de repetição: Uma construção de programação usada para repetir um bloco de instruções enquanto uma condição específica é atendida.

For: Uma estrutura de repetição utilizada para iterar sobre uma sequência, executando um bloco de código um número específico de vezes.

Incremento: O processo de aumentar o valor de uma variável, geralmente utilizado em loops para avançar para a próxima iteração.

Input: Função em Python usada para ler uma entrada do usuário. No exemplo, é usada para ler as notas dos alunos.

Loop Infinito: Uma condição onde o loop continua sem parar devido a uma condição que nunca se torna falsa.

Print: Função em Python usada para imprimir informações na tela. No exemplo, é usada para exibir a média da turma.

Proficient: Refere-se ao nível de habilidade e competência em um campo ou atividade específica. Ser proficient em Python significa ter um conhecimento profundo e prático da linguagem.

Sintaxe: O conjunto de regras e padrões que definem a estrutura de um código em uma linguagem de programação. A sintaxe do while em Python é um exemplo.

Variável de controle: Uma variável usada para controlar a execução de um loop. No exemplo, quantidade é usada como variável de controle para o loop while.

While: Uma estrutura de repetição em Python que executa um bloco de código enquanto uma condição especificada é verdadeira.

Sem título CustomCSS

Capítulo 7 - Estruturas de dados

Sem título ObjetivoCapDEAD

O objetivo deste capítulo é explorar as principais estruturas de dados disponíveis em Python, como listas, tuplas, conjuntos e dicionários, detalhando suas características, usos e vantagens para fornecer uma compreensão de suas funcionalidades no contexto da programação Python.

Sem título Text

Introdução

Neste capítulo, abordaremos as estruturas de dados em Python, começando com sua definição e a importância delas na resolução de problemas, enfatizando como as estruturas de dados são fundamentais para a organização e manipulação eficiente de dados e informações. Trataremos das principais estruturas de dados disponíveis em Python, incluindo listas, tuplas, conjuntos e dicionários, detalhando suas características, usos e vantagens. Isso proporcionará um entendimento abrangente de suas funcionalidades no contexto da programação em Python.

Sem título Text

O que são estruturas de dados?

De acordo com Dedov (2020), os algoritmos são ferramentas essenciais na resolução de problemas e, para abordar alguns desses problemas de forma eficiente, é necessário estruturar os dados de maneira adequada. Nesse contexto, os algoritmos frequentemente se valem de estruturas de dados, enquanto as próprias estruturas de dados dependem de algoritmos para seu funcionamento efetivo. Dedov enfatiza ainda que as estruturas de dados são, em essência, formatos projetados para armazenar, gerenciar, manipular ou organizar dados e informações. Ele destaca que cada tipo de estrutura de dados apresenta suas vantagens e desvantagens específicas.

Para exemplificar o conceito de estruturas de dados, considere o exemplo de uma biblioteca de livros. Nessa biblioteca, os livros (dados) são arranjados em prateleiras (estruturas de dados), e a maneira como são organizados — seja por autor, gênero ou título — reflete diferentes tipos de estruturas de dados. Quando um leitor busca um livro específico, o método que ele utiliza para encontrá-lo assemelha-se a um algoritmo, que depende fortemente de como os livros estão organizados. Se a biblioteca estiver desorganizada, achar um livro específico torna-se uma tarefa árdua, ilustrando assim a necessidade de uma estrutura de dados eficiente.

A linguagem de programação Python oferece uma variedade de estruturas de dados integradas, cada uma possuindo características e usos específicos. Essas estruturas desempenham um papel fundamental na manipulação de dados dentro do ambiente Python, pois oferecem aos programadores a capacidade de organizar informações de forma lógica e eficiente. De maneira análoga a uma biblioteca bem organizada, que facilita a localização de um livro específico, uma escolha acertada de estrutura de dados em Python pode simplificar e acelerar significativamente o processo de desenvolvimento e execução de um programa.

Nas seções seguintes, exploraremos as principais estruturas de dados integradas em Python, incluindo listas, tuplas, dicionários e conjuntos. Cada uma dessas estruturas possui características únicas e aplicações específicas, as quais serão detalhadamente discutidas para proporcionar um entendimento abrangente de suas funcionalidades e utilidades no contexto da programação Python.

Listas

Certamente, você já criou uma lista alguma vez na vida. Podemos citar diversos exemplos, como uma lista de compras no supermercado, a lista dos seus filmes favoritos, a lista das matérias que você precisa estudar mais. Tomemos, por exemplo, a lista de compras do supermercado. Imagine que você precisa comprar os seguintes itens: arroz, feijão, macarrão, cogumelo, pizza e leite.

Em Python, poderíamos representar essa lista de compras utilizando uma estrutura de dados chamada lista, cujos elementos são organizados de forma linear, separados por vírgulas e envolvidos por um par de colchetes, onde cada elemento possui sua posição na lista, denominada de índice. O primeiro elemento é sempre o índice zero e a cada elemento inserido na lista esse valor é incrementado. No exemplo da lista de compras, o índice zero é o arroz e o último índice, número 5, é o leite.

Veja a implementação da lista de compras em Python:

lista

lista_de_compras = ["arroz", "feijão", "macarrão", "cogumelo", "pizza", "leite"]
print(lista_de_compras)

Sem título Text

Conforme exemplificado anteriormente, a declaração de uma lista em Python é um processo bastante simples. Para definir uma lista, todos os itens ou elementos devem ser colocados dentro de colchetes [], sendo cada um separado por vírgulas. Além disso, é possível criar uma lista vazia, ou seja, uma lista que não contém nenhum item. Para isso, basta utilizar colchetes vazios, sem inserir elementos entre eles. Quanto aos tipos de itens que podem ser armazenados em uma lista, eles podem ser de tipos variados, incluindo tipos primitivos como inteiros (int), números de ponto flutuante (float), strings (str) e valores booleanos (bool). Além desses, tipos mais complexos também são aceitos, como outras listas.

Veja a implementação de exemplos de declaração de lista em Python:

lista

# Criando uma lista vazia
lista_vazia = []
print("Lista Vazia:", lista_vazia)

# Criando uma lista com um único elemento
lista_um_elemento = ["Python"]
print("Lista com um elemento:", lista_um_elemento)

# Criando uma lista com múltiplos elementos
print("Lista com múltiplos elementos:", lista_multipla)

# Criando uma lista com diferentes tipos de dados
# Esta lista contém uma string, um inteiro, um float e uma tupla
print("Lista mista:", lista_mista)

# Criando uma lista aninhada
# Esta lista contém três listas menores como elementos
print("Lista aninhada:", lista_aninhada)

Sem título Text

Assim como no caso das strings, o Python oferece uma ampla variedade de operações úteis para a manipulação de listas. Estas funções e métodos permitem realizar diversas operações essenciais, tornando as listas ferramentas poderosas e flexíveis para programação. Aqui estão algumas das principais funções e métodos para manipulação de listas em Python:

Tabela 1 - Métodos e funções e para manipulação de listas em Python

Sem título Tabela Visual com Scroll

Categoria

Tipo

Nome

Descrição

Exemplo de código

Adição

Método

append(item)

Adiciona um item ao final da lista.

lista = [1, 2, 3]
lista.append(4)
# Resultado: [1, 2, 3, 4]

extend(iterável)

Adiciona os elementos de um iterável (string, lista, tupla, conjunto, etc.) ao final de outra lista.

lista = [1, 2, 3]
lista.extend([4, 5])
# Resultado: [1, 2, 3, 4, 5]
lista.extend("Python")
# Resultado: [1, 2, 3, 4, 5, 'P', 'y', 't', 'h', 'o', 'n']

insert(indice,item)

Insere um item em uma posição específica.

lista = [1, 2, 3]
lista.insert(1, 4)
# Resultado: [1, 4, 2, 3]

Remoção

remove(item)

Remove a primeira ocorrência do item.

lista = [1, 2, 3, 2]
lista.remove(2)
# Resultado: [1, 3, 2]

pop(indice)

Remove e retorna o item em uma posição.

lista = [1, 2, 3]
item = lista.pop(1)
# Resultado: item=2, lista=[1, 3]

clear()

Remove todos os itens da lista.

lista = [1, 2, 3]
lista.clear()
# Resultado: []

del lista[indice]

Remove o item em uma posição. Se não for informado a posição, a lista será destruída totalmente.

lista = [1, 2, 3]
del lista[1]
# Resultado: lista=[1, 3]
del lista
# Resultado: lista destruída totalmente

Pesquisa

index(item)

Retorna o índice da primeira ocorrência de um item.

lista = [1, 2, 3, 2]
indice = lista.index(2)
# Resultado: indice=1

count(item)

Retorna o número de ocorrências do item.

lista = [1, 2, 3, 2]
contagem = lista.count(2)
# Resultado: contagem=2

Função

enumerate(iterável)

Retorna um objeto enumerado que fornece pares de índice-valor à medida que percorre um iterável (string, lista, tupla, conjunto, etc.)

lista = ['a', 'b', 'c', 'd']
for indice, valor in enumerate(lista):
   print(f'Índice: {indice}, Valor: {valor}')
# Resultado:
# Índice: 0, Valor: a
# Índice: 1, Valor: b
# Índice: 2, Valor: c
# Índice: 3, Valor: d

Ordenação

sort()

Ordena a lista em ordem crescente.

lista = [3, 1, 2]<br>lista.sort()
# Resultado: [1, 2, 3]

sort(reverse = True)

Ordena a lista em ordem decrescente.

lista = [3, 1, 2]
lista.sort(reverse=True)
# Resultado: [3, 2, 1]

sorted(lista)

Retorna uma nova lista ordenada.

lista = [3, 1, 2]
nova_lista = sorted(lista)
# Resultado: nova_lista=[1, 2, 3],
lista original não é modificada

Inversão

reverse()

Inverte a ordem dos elementos na lista.

lista = [1, 2, 3]
lista.reverse()
# Resultado: [3, 2, 1]

Cópia

list(iterável)

Converte um iterável (string, lista, tupla, conjunto, etc.) em uma lista.

lista = [1, 2, 3]
copia_lista = list(lista)
# Resultado: copia_lista=[1, 2, 3]

Comprimento

len(lista)

Retorna o número de elementos na lista.

lista = [1, 2, 3]
comprimento = len(lista)
# Resultado: comprimento=3

Agregação

sum(lista)

Retorna a soma dos elementos na lista.

lista = [1, 2, 3]
soma = sum(lista)
# Resultado: soma=6

min(lista)

Retorna o menor elemento na lista.

lista = [1, 2, 3]
menor = min(lista)
# Resultado: menor=1

max(lista)

Retorna o maior elemento na lista.

lista = [1, 2, 3]
maior = max(lista)
# Resultado: maior=3

Sem título Text

Fonte: Adaptado pelo autor

Tuplas

Uma tupla é uma estrutura de dados semelhante a uma lista, com uma diferença importante: os elementos inseridos em uma tupla não podem ser alterados, diferente de uma lista onde podem ser alterados livremente. Isso significa que, uma vez que você cria uma tupla, não pode adicionar, remover ou alterar seus elementos.

Vamos tomar como exemplo a lista de compras do supermercado que mencionamos anteriormente. Agora, vamos representar essa lista como uma tupla:

lista

lista_de_compras = ("arroz", "feijão", "macarrão", "cogumelo", "pizza", "leite")

Sem título Text

A declaração de uma tupla em Python segue um processo semelhante ao de uma lista, em que, para definir uma tupla, você coloca os elementos dentro de parênteses (), separados por vírgulas. Assim como nas listas, é possível criar uma tupla vazia, ou seja, uma tupla que não contém nenhum elemento, utilizando parênteses vazios, sem inserir elementos entre eles. Quanto aos tipos de itens que podem ser armazenados em uma tupla, eles são os mesmos que os das listas e podem incluir tipos primitivos como inteiros (int), números de ponto flutuante (float), strings (str) e valores booleanos (bool). Além disso, as tuplas também podem conter tipos mais complexos, como outras tuplas.

Veja a implementação de exemplos de declaração de tuplas em Python:

tupla

# Definindo uma tupla vazia
tupla_vazia = ()
print("Tupla Vazia:", tupla_vazia)

# Definindo uma tupla com um único elemento
# Lembre-se de incluir uma vírgula após o elemento
tupla_um_elemento = ("Python",)
print("Tupla com um elemento:", tupla_um_elemento)

# Definindo uma tupla com múltiplos elementos
print("Tupla com múltiplos elementos:", tupla_multipla)

# Definindo uma tupla com diferentes tipos de dados
# Esta tupla contém uma string, um inteiro, um float e uma tupla
print("Tupla mista:", tupla_mista)

# Definindo uma tupla aninhada
# Esta tupla contém três tuplas menores como elementos
print("Tupla aninhada:", tupla_aninhada)

Sem título Text

No código acima, é importante observar que, ao declarar uma tupla com um único um elemento, a presença da vírgula após o elemento é essencial. Isso informa ao Python que você está criando uma tupla com um único elemento, em vez de apenas um valor entre parênteses.

Assim como no caso nas listas, o Python oferece uma ampla variedade de operações úteis para a manipulação de tuplas. Muitas funções e métodos que funcionam com listas também funcionam com tuplas, desde que não envolvam modificação direta dos elementos, uma vez que as tuplas são imutáveis, dessa forma, as funções len(), sum(), min(), max(), enumerate(), sorted(), e métodos como index() e count() podem ser usados ​​tanto com listas quanto com tuplas.

Com relação às principais vantagens para uso das tuplas comparados às listas. Conforme já mencionado, uma das principais é a sua característica de imutabilidade, o que significa que, uma vez que você cria uma tupla, seus elementos permanecem intocáveis, evitando mudanças acidentais mantendo assim a integridade dos dados, além da interação sobre os dados ser mais rápida e, consequentemente, possuir um ganho de desempenho com relação às listas. Além disso, as tuplas podem ser usadas como chaves em dicionários, e elas são mais eficientes em termos de consumo de memória e processamento. Além disso, elas podem ser usadas como elementos em conjuntos (sets). No entanto, lembre-se de que as listas também têm suas vantagens, como a flexibilidade para modificar elementos. A escolha entre tuplas e listas deve ser baseada nas necessidades específicas do seu programa e nos requisitos de segurança e imutabilidade dos dados.

Conjuntos

Se você recordar das aulas do ensino médio, certamente lembrará que na matemática, um dos conceitos fundamentais é o de conjunto. Este pode ser definido como uma coleção não ordenada de objetos distintos, que podem ser números, letras, elementos de um universo específico ou até mesmo outros conjuntos. Os conjuntos desempenham um papel fundamental na resolução de problemas matemáticos e em várias áreas da ciência, permitindo a representação de grupos de elementos de maneira organizada e eficiente.

Em Python, encontramos uma estrutura de dados chamada 'set', que se alinha perfeitamente com o conceito matemático de conjunto. Os sets em Python são coleções não ordenadas de elementos únicos, o que implica que não podem conter elementos duplicados. Os sets, assim como os conjuntos na matemática, desempenham um papel importante na organização e manipulação de dados em muitos cenários de programação e análise de dados.

A declaração de um set (conjunto) em Python segue um processo simples, semelhante ao de uma lista ou tupla. Para definir um set, você utiliza chaves {}, e os elementos são separados por vírgulas. Assim como nas listas e tuplas, é possível criar um set vazio, ou seja, um conjunto que não contém nenhum elemento, usando chaves vazias {}. Outra maneira de criar um set é utilizando a função set(), na qual você passa um iterável (como uma lista ou tupla) como argumento, e ela cria um set contendo os elementos únicos desse iterável. Quanto aos tipos de itens que podem ser armazenados em um set, eles são os mesmos que os permitidos em listas e tuplas, abrangendo tipos primitivos como inteiros (int), números de ponto flutuante (float), strings (str) e valores booleanos (bool). Adicionalmente, sets também podem conter tipos mais complexos, incluindo outros sets.

Veja a implementação de exemplos de declaração de sets em Python:

conjuntos

# Declarando um set vazio usando chaves
set_vazio = set()
print("Set Vazio:", set_vazio)

# Declarando um set com elementos
# Os elementos são únicos e não há duplicatas
print("Meu Set:", meu_set)

# Declarando um set a partir de uma lista usando a função set()
# O set será criado contendo os elementos únicos da lista
set_da_lista = set(lista)
print("Set a partir de uma Lista:", set_da_lista)

# Declarando um set com diferentes tipos de dados
print("Set Misto:", set_misto)

Sem título Text

Os Sets são particularmente valiosos quando se trata de realizar operações de conjunto. Eles permitem manipular coleções de elementos únicos de forma eficiente. Três das operações mais comuns em sets são a união, interseção e diferença.

União de Conjuntos

A operação de união de conjuntos combina todos os elementos únicos de dois ou mais conjuntos em um novo conjunto. Para realizar a união de conjuntos em Python, você pode usar o método union() ou o operador "|". Por exemplo, se tivermos dois conjuntos conjunto_a e conjunto_b, a união deles resultará em um novo conjunto contendo todos os elementos únicos presentes em ambos.

união conjuntos

# Criando dois conjuntos

# Realizando a união dos conjuntos com o método union
uniao_metodo = conjunto_a.union(conjunto_b)
# Resultado: União de Conjuntos (com método union): {1, 2, 3, 4, 5, 6, 7, 8}
print("União de Conjuntos (com método union):", uniao_metodo)

# Realizando a união dos conjuntos com o operador |
uniao_operador = conjunto_a | conjunto_b
print("União de Conjuntos (com operador |):", uniao_operador)

Sem título Text

Interseção de Conjuntos

A operação de interseção de conjuntos retorna um novo conjunto contendo apenas os elementos que são comuns a todos os conjuntos envolvidos. Você pode realizar a interseção de conjuntos em Python usando o método intersection() ou o operador "&". Suponhamos que temos dois conjuntos conjunto_a e conjunto_b. A interseção deles criará um novo conjunto com os elementos que estão presentes em ambos.

interseção conjuntos

# Criando dois conjuntos

# Realizando a interseção dos conjuntos com o método intersection
intersecao_metodo = conjunto_a.intersection(conjunto_b)
# Resultado: Interseção de Conjuntos (com método intersection): {4, 5}
print("Interseção de Conjuntos (com método intersection):", intersecao_metodo)

# Realizando a interseção dos conjuntos com o operador &
intersecao_operador = conjunto_a & conjunto_b
# Resultado: Interseção de Conjuntos (com operador &): {4, 5}
print("Interseção de Conjuntos (com operador &):", intersecao_operador)

Sem título Text

Diferença de Conjuntos

A operação de diferença de conjuntos retorna um novo conjunto contendo os elementos que estão presentes em um conjunto, mas não no outro. Você pode calcular a diferença de conjuntos em Python usando o método difference() ou o operador "-". Por exemplo, ao calcular a diferença entre conjunto_a e conjunto_b, você obterá um novo conjunto com os elementos que estão em conjunto_a mas não em conjunto_b.

diferença conjuntos

# Criando dois conjuntos

# Calculando a diferença entre os conjuntos com o método difference()
diferenca_metodo = conjunto_a.difference(conjunto_b)
# Resultado: Diferença de Conjuntos (A - B) com método difference(): {1, 2, 3}
print("Diferença de Conjuntos (A - B) com método difference():", diferenca_metodo)

# Calculando a diferença entre os conjuntos com o operador -
diferenca_operador = conjunto_a - conjunto_b
# Resultado: Diferença de Conjuntos (A - B) com operador -: {1, 2, 3}
print("Diferença de Conjuntos (A - B) com operador -:", diferenca_operador)

Sem título Text

Dicionários

Além das estruturas de dados que já exploramos, como listas, tuplas e sets, o Python oferece outra importante estrutura de dados chamada dicionário. Enquanto as listas, tuplas e sets são coleções de elementos ordenados ou não, os dicionários são coleções de pares de chave-valor, onde cada valor é acessado através de uma chave única. Essa estrutura de dados é extremamente útil quando você precisa associar informações específicas a cada elemento, tornando mais eficiente o acesso e a manipulação de dados em diversas situações.

Para melhor compreender o conceito de dicionário em Python, vamos usar o exemplo de um supermercado. Imagine que você tem um dicionário onde cada chave é o nome de um produto e o valor associado é o preço deste produto. Por exemplo, em um supermercado temos os produtos maça, pão e leite, com os seus respectivos preços, R$1,50, R$ 2,00 e R$ 3,25. Esses dados podem ser estruturados em um dicionário em Python da seguinte forma:

dicionário

Sem título Text

Neste exemplo, as chaves são "maçã", "pão" e "leite", enquanto os valores associados são os preços dos respectivos produtos. Com um dicionário, você pode rapidamente encontrar o preço de um item simplesmente consultando a chave.

A declaração de um dicionário em Python é um pouco diferente das já vistas em listas, tuplas e sets. Para criar um dicionário, utilizamos chaves "{}" para conter os pares de chave-valor, com cada chave sendo única dentro do dicionário. Os elementos são separados por vírgulas, e cada par chave-valor é separado por dois pontos ":". Assim como nas listas, tuplas e sets, é possível criar um dicionário vazio, usando apenas as chaves "{}" sem nenhum elemento dentro. Além dessa sintaxe com o uso de chaves, os dicionários também podem ser criados com a função dict(). Essa função permite criar um dicionário a partir de sequências de pares chave-valor ou argumentos de palavras-chave.

Com relação aos tipos de dados permitidos para os dicionários, as chaves podem ser de tipos variados, como strings ou inteiros, mas devem ser imutáveis. Já os valores associados a essas chaves podem ser de qualquer tipo, inclusive outras coleções como listas, tuplas ou outros dicionários.

Veja a implementação de exemplos de declaração de dicionários em Python:

declaração de dicionário

# Declarando um dicionário vazio para um carrinho de compras
carrinho_vazio = {}
print("Carrinho de Compras Vazio:", carrinho_vazio)

# Declarando um dicionário com produtos e preços
# As chaves são os nomes dos produtos e os valores são os preços
print("Estoque do Supermercado:", estoque_supermercado)

# Declarando um dicionário usando a função dict() com produtos e preços
precos_com_dict = dict(maçã=1.20, banana=2.50, arroz=15.00)
print("Preços com dict():", precos_com_dict)

# Declarando um dicionário a partir de uma lista de tuplas com produtos e preços
precos_da_lista = dict(lista_de_produtos)
print("Preços a partir de uma Lista de Tuplas:", precos_da_lista)

Sem título Text

Assim como no caso das listas, o Python oferece uma ampla variedade de operações úteis para a manipulação de dicionários. Na tabela abaixo estão algumas das principais funções e métodos para manipulação de dicionários em Python.

Tabela 2 - Métodos e funções e para manipulação de dicionários em Python

Sem título Tabela Visual com Scroll

Categoria

Tipo

Nome

Descrição

Exemplo

Acesso

Método

get(key)

Retorna o valor para a chave, se existir.

d.get('chave')

Visualização

items()

Retorna uma visualização dos pares de chave-valor do dicionário.

d.items()

keys()

Retorna uma visualização das chaves do dicionário.

d.keys()

values()

Retorna uma visualização dos valores do dicionário.

d.values()

Remoção

pop(key)

Remove o item com a chave especificada e retorna seu valor

d.pop('chave')

popitem()

Remove e retorna um par (chave, valor) do dicionário.

d.popitem()

clear()

Remove todos os itens do dicionário.

d.clear()

Atualização

update([other])

Atualiza o dicionário com os pares de chave-valor de outro dicionário ou pares (chave, valor).

d.update({'outra_chave': 'outro_valor'})

Sem título Text

Fonte: Adaptado pelo autor

Nos exemplos, d representa um dicionário existente, com d = {'chave': 'valor'}.

Só se aprende a programar programando

Os exercícios a seguir são projetados para ajudá-lo a praticar e aprimorar suas habilidades em Python. Encorajamos você a tentar resolvê-los por conta própria. Após as tentativas, você poderá consultar as soluções propostas no GitHub do curso, disponíveis em https://github.com/.

1. Crie uma lista com os seguintes produtos de supermercado: ["maçã", "banana", "cenoura", "arroz", "frango"]. Em seguida, escreva um programa que acesse e imprima o terceiro item da lista.
2. Crie uma tupla com os nomes de três departamentos de um supermercado: ("padaria", "laticínios", "hortifruti"). Escreva um programa que acesse e imprima o primeiro item da tupla.
3. Crie um set com alguns produtos disponíveis em um supermercado: {"tomate", "batata", "cebola", "maçã", "banana"}. Depois, escreva um programa que remova o item "cebola" do set e imprima o set após a remoção.
4. Crie um dicionário que mapeia produtos a seus preços: {"maçã": 1.00, "banana": 0.50, "cenoura": 0.30}. Escreva um programa que acesse e imprima o preço da "banana".
5. Crie um dicionário vazio para armazenar a quantidade de diferentes produtos comprados por um cliente. Adicione alguns itens ao dicionário, como {"maçã": 5, "banana": 2}. Em seguida, remova o item "banana" do dicionário e imprima o dicionário após a remoção.

Conclusão

Neste capítulo, vimos como as estruturas de dados em Python são fundamentais para uma programação eficiente e organizada. Cada estrutura tem suas características únicas e aplicações específicas, adequadas para diferentes necessidades e cenários de programação. As listas e tuplas são ideais para coletar elementos sequenciais, com a diferença de que as tuplas são imutáveis. Os conjuntos são úteis para operações matemáticas de conjuntos e para garantir a unicidade dos elementos, enquanto os dicionários oferecem uma maneira eficiente de associar e acessar dados por meio de pares chave-valor.

Encerramos o capítulo com a proposição de exercícios, que são projetados para reforçar os conteúdos por meio da aplicação prática do que foi aprendido. A programação é uma habilidade que se aprimora com a prática, e esses exercícios oferecem uma oportunidade para melhorar o seu conhecimento em Python.

Glossário

Estruturas de Dados: Formatos projetados para armazenar, gerenciar, manipular ou organizar dados, essenciais para o funcionamento efetivo de algoritmos.

Lista: Estrutura de dados em Python que armazena elementos de forma linear, com cada elemento acessível por um índice.

Índice: A posição numérica de um elemento em uma lista, começando do zero.

Tupla: Estrutura de dados similar à lista, mas imutável. Os elementos de uma tupla não podem ser alterados após sua criação.

Set (Conjunto): Estrutura de dados em Python que representa uma coleção não ordenada de elementos únicos.

Dicionário: Estrutura de dados em Python que armazena pares de chave-valor, permitindo acesso rápido a valores com base em chaves.

Chave: Um identificador único em um dicionário usado para acessar um valor correspondente.

Sem título CustomCSS

Capítulo 8 - Modularização, bibliotecas e tratamento de erros

Sem título ObjetivoCapDEAD

O objetivo deste capítulo é explorar três conceitos fundamentais em Python: Modularização, Bibliotecas e Tratamento de Erros. Abordaremos a Modularização, destacando a importância de dividir o código em módulos e funções para organização e reutilização. Em seguida, exploraremos as Bibliotecas em Python, mostrando como importá-las para aproveitar funcionalidades pré-construídas. Por fim, abordaremos o Tratamento de Erros, ensinando a identificar e lidar com diferentes erros e exceções em Python, e a implementar estruturas de tratamento de erros para situações inesperadas.

Sem título Text

Introdução

Chegamos ao último capítulo da jornada pelo mundo da programação em Python na disciplina de Introdução à Lógica e Programação. Agora, é hora de mergulharmos em conceitos mais avançados que são cruciais para o desenvolvimento de software eficiente e robusto: Modularização, Bibliotecas e Tratamento de Erros em Python.

Este capítulo é um marco em sua jornada de aprendizado, preparando você não apenas para escrever programas em Python, mas também para pensar como um programador experiente, apto a resolver problemas complexos com eficiência e elegância. Vamos mergulhar nesses conceitos mais avançados e dar um grande passo em direção à programação em Python.

Sem título Text

Modularização

A modularização é uma técnica de programação que visa organizar o código em partes menores, reutilizáveis e mais facilmente gerenciáveis. Esta abordagem facilita a divisão do código em módulos ou funções, permitindo ao programador concentrar-se em resolver pequenas partes do problema de cada vez. Além de tornar o código mais legível, essa estratégia simplifica a manutenção.

Conforme explica Said (2007), um módulo consiste em um conjunto de comandos que formam uma seção de um algoritmo com uma função bem definida, sendo o mais independente possível do restante do algoritmo. O autor também destaca que um módulo é composto por uma sequência de comandos que operam sobre um conjunto de objetos, os quais podem ser classificados como globais ou locais. Os objetos globais são acessíveis tanto dentro do módulo em que foram declarados quanto em outros módulos, enquanto os objetos locais estão confinados ao módulo onde foram criados.

As variáveis em Python são exemplos claros de objetos que podem ser classificados como globais ou locais, de acordo com a forma e o local de suas declarações. O escopo de uma variável, que define o contexto em que ela é estabelecida e sua acessibilidade, é determinado principalmente pela posição da variável no código. Variáveis locais, definidas dentro de um bloco de código específico, são limitadas a esse escopo específico e não podem ser acessadas fora dele. Por outro lado, variáveis globais são definidas no corpo principal do código e estão acessíveis em qualquer parte do programa, podendo ser referenciadas em outros blocos de código, quando necessário.

Considere o seguinte exemplo para ilustrar a definição de variáveis globais e locais em Python:

variáveis

# Variável global
numero = 10

if numero > 5:
# Variável local ao bloco 'if'
mensagem = "Número é maior que 5."
else:
# Outra variável local ao bloco 'else'
mensagem_alternativa = "Número não é maior que 5."
# Acessando a variável 'mensagem' fora do seu escopo
print(mensagem)
# Isso funcionará porque 'mensagem' foi definida em um bloco que foi executado
# Tentando acessar a variável 'mensagem_alternativa' fora do seu escopo

# print(mensagem_alternativa) # Descomente para ver o erro. Isso resultará em um erro se o bloco 'else' não for executado

Sem título Text

Neste exemplo, número é uma variável global. Dentro do bloco if, declaramos a variável mensagem, e dentro do bloco else, declaramos mensagem_alternativa. Se o bloco if for executado, a variável mensagem será criada e poderá ser acessada fora do bloco. No entanto, se o bloco else não for executado (como neste caso, pois numero > 5 é verdadeiro), a variável mensagem_alternativa não será criada, e qualquer tentativa de acessá-la fora do bloco else resultará em um erro.

Após entender o escopo de variáveis em Python, e como podem ser classificadas como globais ou locais, avançamos para outro conceito fundamental na modularização de código: as funções. Elas são blocos de código que executam uma tarefa específica e que podem ser reutilizadas. A modularização por meio de funções reduz a repetição de trechos de código e torna o programa mais legível. Por exemplo, se você necessita realizar um cálculo específico em diversas partes do seu programa, pode integrá-lo em uma função. Essa função pode ser chamada sempre que o cálculo for necessário, o que economiza tempo, reduz a probabilidade de erros e torna o código mais claro e fácil de compreender.

Até agora em nossa jornada de aprendizado, temos utilizado várias funções nativas do Python, que desempenham papéis essenciais em nossos programas. Um exemplo é a função print(), que utilizamos frequentemente para exibir informações na tela. Outras funções como input() e type() também têm sido fundamentais, permitindo-nos interagir com o usuário e entender os tipos de dados com os quais estamos trabalhando. Agora, vamos dar um passo adiante e aprender como criar nossas próprias funções personalizadas, adaptadas para atender necessidades específicas em nossos programas.

Uma função em Python é criada utilizando a palavra-chave def, seguida pelo nome da função e um par de parênteses. Dentro dos parênteses, podem ser incluídos parâmetros, caso a função necessite de entrada de dados. Após os parênteses, dois-pontos são adicionados para indicar o início do bloco de código associado à função, conhecido como o corpo da função. É neste bloco de código, indentado, que as instruções da função são definidas e serão executadas quando a função for chamada. Além disso, uma função pode retornar um valor usando a palavra-chave return. Caso a instrução return não seja especificada, a função retornará None por padrão. Uma vez definida, a função pode ser chamada em qualquer parte do programa simplesmente utilizando seu nome, seguido de parênteses.

Veja a implementação de um exemplo de criação e chamada de uma função em Python:

funçao

# Definição de uma função chamada 'cumprimentar'
def cumprimentar(nome):
# Corpo da função: um bloco de código indentado após os dois-pontos
mensagem = f"Olá, {nome}! Bem-vindo ao mundo da programação em Python."
# A função retorna a mensagem
return mensagem

# Uma vez definida, a função 'cumprimentar' pode ser chamada com um nome como parâmetro
saudacao = cumprimentar("João")
print(saudacao) # Exibe "Olá, João! Bem-vindo ao mundo da programação em Python."

Sem título Text

Quanto à passagem de parâmetros nas funções, é importante esclarecer como Python lida com eles. Na linguagem Python, a passagem de parâmetros nas funções é realizada por referência, o que significa que a função recebe uma referência ao mesmo objeto na memória, e não uma cópia independente dele. Isso se aplica a todos os tipos de dados. Entretanto, o comportamento na prática pode parecer como se fosse uma passagem por valor no caso de tipos imutáveis, como inteiros, strings e tuplas. Quando um objeto imutável é alterado dentro de uma função, isso resulta na criação de um novo objeto local, sem alterar o objeto original. Por outro lado, para tipos mutáveis, como listas, dicionários e conjuntos, qualquer modificação do parâmetro dentro da função reflete diretamente no objeto original, já que a referência aponta para o mesmo objeto na memória.

Veja a implementação de um código em Python para ilustrar a passagem de parâmetros por referência para objetos mutáveis e imutáveis.

funçao

# Função para modificar um objeto imutável (por exemplo, um inteiro)
def modificar_imutavel(x):
return x

# Função para modificar um objeto mutável (por exemplo, uma lista)
def modificar_mutavel(lst):
lst.append(4)
return lst

# Objeto imutável
print("Antes de modificar_imutavel:", a) # Vai imprimir: Antes de modificar_imutavel: 5
modificar_imutavel(a)
print("Depois de modificar_imutavel:", a) # Vai imprimir: Depois de modificar_imutavel: 5

# Objeto mutável
print("Antes de modificar_mutavel:", b) # Vai imprimir: Antes de modificar_mutavel: [1, 2, 3]
modificar_mutavel(b)
print("Depois de modificar_mutavel:", b) # Vai imprimir: Depois de modificar_mutavel: [1, 2, 3, 4]

Sem título Text

Neste código, a função modificar_imutavel tenta modificar um objeto imutável (neste caso, um inteiro), mas a alteração não é refletida fora da função. Isso ocorre porque o inteiro é imutável, e qualquer modificação resulta em um novo objeto sendo criado. Por outro lado, a função modificar_mutavel modifica um objeto mutável (uma lista), e as alterações são refletidas fora da função. Isso acontece porque a lista é mutável, e a função trabalha diretamente com a referência ao objeto original na memória.

Um outro aspecto importante na definição de parâmetros de funções em Python é a capacidade de estabelecer valores padrão. Isso significa que, se um valor para determinado parâmetro não for especificado no momento da chamada da função, o valor padrão previamente definido será automaticamente utilizado. Para atribuir um valor padrão a um parâmetro, basta indicar esse valor na definição da função, ao lado do parâmetro correspondente.

Veja a implementação de um código em Python para ilustrar o conceito de valores padrão em parâmetros de funções.

funçao

# Definindo uma função com um valor padrão para um parâmetro
def saudacao(nome="Mundo"):
return f"Olá, {nome}!"

# Chamando a função sem passar um argumento
# Utiliza o valor padrão "Mundo"
print(saudacao()) # Saída: Olá, Mundo!

# Chamando a função passando um argumento
# O argumento "João" substitui o valor padrão
print(saudacao("Alice")) # Saída: Olá, João!

# Definindo uma função com um parâmetro sem valor padrão e outro com valor padrão
def soma(a, b=0):
return a + b

# Chamando a função com apenas um argumento
# O segundo parâmetro usa o valor padrão 0
print(soma(5)) # Saída: 5

# Chamando a função com dois argumentos
# Ambos os parâmetros são especificados, sem usar o valor padrão
print(soma(5, 3)) # Saída: 8

Sem título Text

Neste exemplo, a função saudacao é definida com um parâmetro nome, que tem um valor padrão "Mundo". Quando a função é chamada sem um argumento, ela usa esse valor padrão. Na função soma, o parâmetro b tem um valor padrão de 0, permitindo que a função seja chamada com apenas um argumento. Isso demonstra como os valores padrão podem tornar os parâmetros opcionais e aumentar a flexibilidade das funções.

Após termos explorado as funções em Python e sua contribuição significativa para a modularização de programas, torna-se oportuno expandir nosso entendimento para o conceito de bibliotecas em Python. As bibliotecas representam extensões da ideia de modularização. Elas não apenas permitem encapsular e reutilizar código, como as funções, mas também avançam um passo além. Bibliotecas são conjuntos de módulos, incluindo funções, classes e variáveis, organizados de maneira lógica e coerente para fornecer funcionalidades mais amplas e complexas. Na próxima seção, abordaremos as bibliotecas em Python, fundamentais para entender a popularidade e a extensão da linguagem.

Bibliotecas

A popularidade e ampla utilização do Python devem-se muito às suas bibliotecas, que são coleções de módulos que fornecem funcionalidades prontas, variando de operações matemáticas simples a complexos frameworks de desenvolvimento web. Essas bibliotecas permitem aos desenvolvedores aproveitar recursos preexistentes, evitando a necessidade de se reinventar a roda e acelerando o processo de desenvolvimento. Neste contexto, exploraremos conceitos essenciais relacionados às bibliotecas Python.

Podemos categorizar as bibliotecas em Python em duas principais: as Bibliotecas Padrão e as Bibliotecas de Terceiros. A Biblioteca Padrão do Python inclui uma série de funcionalidades para operações comuns, como manipulação de arquivos, operações de rede e gerenciamento de sistemas. Estas bibliotecas fazem parte integrante da instalação padrão do Python e estão disponíveis imediatamente, sem necessidade de instalação adicional. Por outro lado, as bibliotecas de terceiros necessitam de instalação separada, frequentemente feita através de ferramentas como o pip. Estas bibliotecas oferecem uma ampla gama de funcionalidades, abrangendo desde análise de dados até desenvolvimento de jogos.

A Tabela 1, a seguir, fornece um panorama das bibliotecas mais utilizadas na comunidade Python, abrangendo desde tarefas básicas de programação até aplicações avançadas em análise de dados, desenvolvimento web e machine learning. É importante notar que esta é apenas uma pequena amostra da vasta coleção disponível, que faz do Python uma linguagem tão poderosa e flexível para desenvolvedores.

Tabela 1 - Bibliotecas mais utilizadas na comunidade Python

Sem título Tabela Visual com Scroll

Categoria

Nome

Descrição

Biblioteca Padrão

math

Fornece funções matemáticas básicas

datetime

Funções para manipulação de datas e horas

os

Interage com funcionalidades do sistema operacional.

sys

Interage com o interpretador Python

json

Codificação e decodificação em JSON

Biblioteca de Terceiros

numpy

Suporte para arrays e matrizes grandes, e funções matemáticas

pandas

Estruturas de dados e análise de dados

matplotlib

Criação de gráficos e visualização de dados

requests

Facilita a realização de solicitações HTTP

flask

Microframework para desenvolvimento web

django

Framework de alto nível para desenvolvimento web

scikit-learn

Ferramentas para análise de dados e machine learning

tensorflow

Biblioteca de machine learning e inteligência artificial

beautfulsoup

Ferramentas para parsing de documentos HTML e XML

Sem título Text

Fonte: Adaptado pelo autor

Utilizar uma biblioteca em Python geralmente envolve duas etapas principais. Primeiramente, se a biblioteca não faz parte da Biblioteca Padrão do Python, é necessário instalá-la. Essa instalação é comumente realizada utilizando o gerenciador de pacotes pip. Após a instalação, a biblioteca, ou partes específicas dela, podem ser importadas para o seu código, permitindo assim o uso de suas funcionalidades.

Por exemplo, para instalar a biblioteca requests, que é uma ferramenta popular para realizar requisições HTTP, você usaria o seguinte comando na linha de comando:

pip install

pip install requests

Sem título Text

Após a instalação, a biblioteca pode ser usada no seu programa Python:

requests

# Supondo que a biblioteca 'requests' já tenha sido instalada com pip
import requests
# Usando a biblioteca para fazer uma requisição GET a um website
response = requests.get('https://www.example.com')
print(response.text)

Sem título Text

Neste exemplo, após instalarmos a biblioteca requests com pip, ela é importada para o programa. Então, a função get é usada para fazer uma requisição HTTP GET a um site e imprimir o conteúdo da resposta.

Nesta disciplina, não iremos tratar da criação de bibliotecas em Python. No entanto, compreender como as bibliotecas funcionam é essencial para qualquer desenvolvedor Python. Seja utilizando funcionalidades preexistentes para acelerar seu trabalho ou compartilhando suas próprias criações com a comunidade, o conhecimento sobre bibliotecas é valioso.

Sem título Text

Tratamento de erros

Na jornada da programação, encontrar erros é uma parte inevitável do processo. Em Python, os erros podem ocorrer por diversas razões, desde sintaxe incorreta até operações inválidas em tempo de execução. Saber como identificar, entender e corrigir esses erros é fundamental para qualquer desenvolvedor. Esta seção aprofunda-se no processo de depuração em Python.

A depuração, ou debugging, refere-se ao processo de identificar e corrigir erros ou bugs em um programa. Primeiramente, é necessário entender as diferenças entre os tipos de erros em Python. Em seguida, detalharemos as ferramentas e técnicas disponíveis para auxiliar na depuração.

Em Python, os erros são geralmente classificados em duas categorias principais: Erros de Sintaxe e Exceções. Os Erros de Sintaxe, também conhecidos como erros de parse, surgem quando o código viola as regras gramaticais da linguagem, como o esquecimento de um parêntese ou o uso de um caractere inválido. Esses erros são identificados pelo interpretador antes da execução do programa e precisam ser corrigidos para que o código possa ser executado. Por outro lado, as exceções ocorrem durante a execução do programa, mesmo quando o código está sintaticamente correto. Estes incluem situações como tentar dividir um número por zero ou acessar uma chave inexistente em um dicionário. As exceções indicam problemas mais complexos relacionados à lógica e ao fluxo do programa.

A Tabela 2 lista os principais tipos de erros em Python, categorizados como Erros de Sintaxe e Exceções, incluindo seus nomes e descrições.

Tabela 2 - Principais tipos de erros em Python

Sem título Tabela Visual com Scroll

Tipo

Nome do erro

Descrição

Erro de sintaxe

SyntaxError

Ocorre quando o Python encontra um erro na sintaxe do código.

IndentationError

Específico do Python, surge quando as regras de indentação não são seguidas corretamente.

Exceção

NameError

Acontece quando uma variável ou nome de função que não foi definido é utilizado.

TypeError

Surge quando uma operação ou função é aplicada a um objeto de um tipo inapropriado.

ValueError

Ocorre quando uma função ou operação recebe um argumento com o tipo correto, mas com um valor inadequado.

IndexError

Gerado ao tentar acessar um índice fora do intervalo em listas, tuplas ou outras sequências.

KeyError

Surge ao tentar acessar uma chave que não existe em um dicionário.

AttributeError

Ocorre quando uma referência a um atributo ou uma atribuição falha.

IOError/OSError

Relacionado a falhas de input/output, como erros ao abrir ou escrever em um arquivo.

ZeroDivisionError

Acontece quando há uma tentativa de dividir um número por zero.

Sem título Text

Fonte: Adaptado pelo autor

Com relação às ferramentas e técnicas disponíveis para auxiliar na depuração, é importante começar entendendo como os erros de sintaxe e exceção são apresentados pelo Python.

Quando um erro de sintaxe ocorre, o interpretador Python exibe uma mensagem indicando o tipo do erro, seguida pela linha do código onde o erro foi detectado. Frequentemente, uma seta (^) aponta para o local exato onde o interpretador identificou o problema. Isso facilita a identificação e correção do erro pelo programador.

Por exemplo, considere o seguinte trecho de código:

erros

# Definindo uma função para calcular a média de uma lista de números
def calcular_media(numeros):
soma = sum(numeros)
quantidade = len(numeros)) # Erro de sintaxe: parêntese extra
media = soma / quantidade
return media # Erro de indentação: espaço extra antes de 'return'

# Lista de números

# Chamando a função e imprimindo a média
print("A média é:", calcular_media(numeros))

# A execução deste código resultará nas seguintes mensagens de erro:
# Erro de Sintaxe:
# File "<stdin>", line 4
# quantidade = len(numeros))
# SyntaxError: invalid syntax

# Após corrigir o erro de sintaxe, um novo erro de indentação será encontrado:
# File "<stdin>", line 5
# return media
# IndentationError: unexpected indent

Sem título Text

Neste código, identificamos inicialmente um erro de sintaxe, causado por um parêntese extra na expressão quantidade = len(numeros)), que resulta em um SyntaxError. É essencial corrigir este erro primeiro, removendo o parêntese extra, para permitir o processamento correto do código. Após essa correção, descobrimos um segundo problema: um IndentationError, provocado por um espaço adicional no início da linha return media. Assim, é necessário resolver o primeiro erro para que o interpretador possa avançar e identificar o segundo.

No caso das exceções, quando elas ocorrem, o interpretador Python fornece uma mensagem de erro detalhada, conhecida como traceback. Esta mensagem ajuda a identificar e corrigir o problema. A mensagem de erro inicia-se com o nome da exceção, descrevendo o tipo de erro ocorrido, e é seguida por uma descrição mais detalhada do erro. O traceback, então, apresenta o stack trace, detalhando a sequência de chamadas de função que conduziram ao erro, com cada linha representando um ponto específico no código onde uma função foi executada.

Por exemplo, considere o seguinte trecho de código:

erros

def dividir(a, b):
# Esta função tenta dividir dois números
return a / b

def calcular():
# Esta função chama 'dividir' com valores que levarão a uma exceção
y = 0 # O valor 0 aqui causará uma exceção de divisão por zero
resultado = dividir(x, y)
print("O resultado é:", resultado)

# Chamada da função 'calcular'
calcular()

# Ao executar este código, o Python gerará uma exceção 'ZeroDivisionError'.
# A mensagem de erro será algo como:
# Traceback (most recent call last):
# File "<stdin>", line 13, in <module>
# File "<stdin>", line 9, in calcular
# File "<stdin>", line 3, in dividir
# ZeroDivisionError: division by zero

# A mensagem de erro 'ZeroDivisionError: division by zero' indica o tipo de erro.
# O 'Traceback' mostra a sequência de chamadas, iniciando da função 'calcular'
# até a função 'dividir' onde o erro ocorreu, com as linhas de código específicas.

Sem título Text

Neste exemplo, a função calcular chama a função dividir, passando 10 e 0 como argumentos. Como a divisão por zero não é permitida, ocorre a exceção ZeroDivisionError. O traceback fornecido pelo interpretador detalha a sequência de chamadas de função, mostrando exatamente onde e como o erro ocorreu. Este tipo de informação é essencial para a depuração eficiente em Python.

Após compreender como os erros de sintaxe e as exceções são apresentados no interpretador Python, é importante avançar para as ferramentas e técnicas de depuração disponíveis na linguagem. Uma das técnicas mais simples e eficazes é o uso da função print(). Essa técnica envolve a inserção de declarações de print() em pontos-chave do programa. Isso permite monitorar o fluxo de execução e os valores das variáveis, facilitando a identificação de onde e por que um erro ou comportamento inesperado está ocorrendo.

Além da técnica de depuração usando print(), outra ferramenta importante à disposição dos desenvolvedores Python é o depurador integrado, conhecido como pdb. O pdb é um depurador interativo que oferece mais funcionalidades do que simplesmente imprimir valores de variáveis. Com o pdb, é possível pausar a execução do programa, inspecionar o estado das variáveis, avançar a execução do código passo a passo, entre outras funcionalidades. Para obter mais detalhes sobre o pdb, sugerimos a consulta da documentação oficial do Python.

Por fim, a próxima técnica para tratamento de erros e exceções no Python é o uso das diretivas try, except e finally. Essas diretivas permitem lidar com exceções de maneira controlada no código Python.

A diretiva try é usada para executar um bloco de código que pode potencialmente causar uma exceção. Dentro deste bloco, coloca-se o código que está sob análise para captura de erros. Seguindo o bloco try, utiliza-se a diretiva except para especificar o tratamento de exceções específicas. Com ela, define-se o que deve ser feito caso ocorra uma exceção. É possível criar múltiplos blocos except para lidar com diferentes tipos de exceções de maneira individualizada. Finalmente, o bloco finally, que é opcional, serve para executar código independentemente do resultado do bloco try - seja uma execução bem-sucedida ou a ocorrência de uma exceção. Este bloco é especialmente útil para realizar ações de limpeza ou finalização, como fechar arquivos ou conexões de banco de dados, garantindo que essas ações sejam executadas independentemente do sucesso ou falha dos blocos anteriores.

O código a seguir é um exemplo básico de como essas diretivas podem ser usadas:

try except finally

try:
# código que pode gerar uma exceção
resultado = 10 / 0 # Isso gerará uma exceção de divisão por zero
except ZeroDivisionError:
# código para tratar a exceção de divisão por zero
resultado = 0
finally:
# código que será executado independentemente de exceções
print("Executando ações de limpeza")

Sem título Text

Neste exemplo, o código dentro do bloco try gera uma exceção de divisão por zero. O bloco except captura essa exceção e lida com ela definindo resultado como 0. Em seguida, o bloco finally garante que as ações de limpeza sejam executadas, independentemente de ocorrer uma exceção ou não.

Chegamos ao final da seção sobre tratamento de erros. É importante entender que a depuração é uma habilidade essencial que todos os programadores devem cultivar. Com o tempo e a prática, desenvolver uma compreensão dos erros comuns e aprender a interpretar mensagens de erro ajudará a acelerar o processo de desenvolvimento e produzir código mais robusto e eficiente.

Só se aprende a programar programando

Os exercícios a seguir são projetados para ajudá-lo a praticar e aprimorar suas habilidades em Python. Encorajamos você a tentar resolvê-los por conta própria. Após as tentativas, você poderá consultar as soluções propostas no GitHub do curso, disponíveis em https://github.com/.

1. Escreva um programa que defina uma função chamada calcular_media que recebe uma lista de números como parâmetro e retorna a média desses números. Certifique-se de incluir tratamento de exceção para lidar com possíveis erros, como divisão por zero, e forneça uma mensagem de erro apropriada. Em seguida, crie uma lista de números e utilize a função calcular_media para calcular a média e exibi-la.
2. Utilize a biblioteca datetime do Python para criar um programa que imprima a data e a hora atuais no seguinte formato: "DD-MM-AAAA HH:MM". Em seguida, use a mesma biblioteca para calcular quantos dias faltam para o seu próximo aniversário e imprima o resultado.
3. Escreva um programa que peça ao usuário para inserir um número inteiro. Use tratamento de erros para garantir que o programa não trave se o usuário inserir um tipo de dado inválido (como uma string ou um float). Se um erro de valor for capturado, imprima uma mensagem de erro amigável e peça novamente ao usuário para inserir um número inteiro.
4. Crie uma função chamada dividir que aceite dois números como argumentos. A função deve retornar o resultado da divisão do primeiro número pelo segundo. Use um bloco try-except para capturar e tratar a exceção ZeroDivisionError, caso o segundo número seja zero. Nessa situação, a função deve imprimir uma mensagem explicando que não é possível dividir por zero e retornar None. Teste a função com diferentes pares de números.
5. Desenvolva uma função chamada calcular_log que receba dois parâmetros: um número x e uma base b. A função deve calcular o logaritmo de x na base b. Implemente isso usando a função log(x, base) da biblioteca math. Contudo, é comum que erros possam ocorrer ao calcular logaritmos, como o logaritmo de um número negativo ou o logaritmo com base negativa ou zero. Utilize um bloco try-except para capturar e tratar esses casos, especificamente as exceções ValueError e ZeroDivisionError. Em caso de exceção, a função deve imprimir uma mensagem adequada para o usuário e retornar None. Após definir a função, teste-a com diferentes valores para x e b, incluindo valores que gerarão exceções.

Conclusão

Neste último capítulo de Introdução à Lógica e Programação em Python, abordamos temas avançados cruciais para o desenvolvimento de software: Modularização, Bibliotecas e Tratamento de Erros. Aprendemos como modularizar o código em funções e módulos para termos uma melhor organização e reutilização. Também exploramos como utilizar bibliotecas em Python, facilitando o desenvolvimento de aplicações. Além disso, estudamos como identificar e gerir diferentes tipos de erros e exceções, garantindo que nossos programas respondam adequadamente a situações imprevistas.

Este capítulo não só marca um progresso significativo na sua jornada de aprendizado de Python, mas também prepara-o para enfrentar desafios de programação mais complexos, usar bibliotecas de forma eficiente e lidar profissionalmente com erros. Parabéns pelo avanço e continue explorando o vasto mundo da programação.

Glossário

Modularização: Uma técnica de programação que visa organizar o código em partes menores, reutilizáveis e mais facilmente gerenciáveis, como módulos ou funções.

Módulo: Um conjunto de comandos com uma função bem definida, que é independente do restante do algoritmo.

Variáveis Globais: Variáveis acessíveis em qualquer parte do programa, incluindo outros módulos.

Variáveis Locais: Variáveis limitadas ao módulo onde foram criadas e que não podem ser acessadas fora dele.

Escopo: O contexto em que uma variável é definida e sua acessibilidade.

Função: Um bloco de código que executa uma tarefa específica e pode ser reutilizado em diferentes partes do programa.

Parâmetros: Valores passados para uma função como entrada.

Passagem de Parâmetros por Referência: Quando uma função recebe uma referência ao objeto na memória, e não uma cópia independente, tornando possível modificar o objeto original.

Passagem de Parâmetros por Valor: Em casos de tipos imutáveis, pode parecer como se uma cópia independente do valor fosse passada para a função.

Bibliotecas: Coleções de módulos que fornecem funcionalidades prontas, incluindo operações matemáticas, desenvolvimento web, análise de dados, entre outros.

Bibliotecas Padrão: Parte integrante da instalação padrão do Python, incluindo funcionalidades comuns como manipulação de arquivos e operações de rede.

Bibliotecas de Terceiros: Bibliotecas que precisam ser instaladas separadamente e abrangem uma ampla gama de funcionalidades, como análise de dados e desenvolvimento de jogos.

Erros de Sintaxe: Erros que ocorrem devido a problemas na estrutura gramatical do código, detectados antes da execução do programa.

Exceções: Erros que ocorrem durante a execução do programa, mesmo quando o código está sintaticamente correto.

Traceback: Uma mensagem de erro detalhada que ajuda a identificar e corrigir problemas, mostrando a sequência de chamadas de função onde o erro ocorreu.

Depuração: O processo de identificar e corrigir erros em um programa.

Sem título CustomCSS

Ficha catalográfica

Sem título Ficha Catalográfica

PRESIDENTE DA REPÚBLICA
Luiz Inácio Lula da Silva
MINISTRO DA EDUCAÇÃO
Camilo Sobreira de Santana
SECRETÁRIO DE EDUCAÇÃO PROFISSIONAL E TECNOLÓGICA
Marcelo Bregagnoli

REITOR
José Arnóbio de Araújo Filho

PRÓ-REITORA DE PESQUISA E INOVAÇÃO
Francinaide de Lima Silva Nascimento

CAMPUS AVANÇADO NATAL - ZONA LESTE
DIRETOR-GERAL
José Roberto Oliveira dos Santos

DIRETOR DE EDUCAÇÃO A DISTÂNCIA E TECNOLOGIA EDUCACIONAL
Wagner de Oliveira

COMITÊ EDITORIAL DA DIRETORIA DE EDUCAÇÃO A DISTÂNCIA E TECNOLOGIAS
EDUCACIONAIS - CAMPUS AVANÇADO NATAL - ZONA LESTE/IFRN

PRESIDENTE
Wagner de Oliveira

SUPLENTES
João Moreno Vilas Boas de Souza Silva
Allen Gardel Dantas de Luna
Josenildo Rufino da Costa
Leonardo dos Santos Feitoza

MEMBROS
José Roberto Oliveira dos Santos
Albérico Teixeira Canário de Souza
Glacio Gley Menezes de Souza
Wagner Ramos Campos

PUBLICAÇÃO | EQUIPE

AUTORIA
João Moreno Vilas Boas e Wagner de Oliveira

CAPA
Iasmin Soares
do Nascimento

PROGRAMAÇÃO
Cibele Regina Barros Diniz
Gersuer Henrique Sousa de Oliveira
Luiz Gustavo Oliveira Rocha
Matheus Mathias Rocha Lúcio de Moraes
Rafaela Araújo de Albuquerque
Ramon de Sousa Vieira

REVISÃO
Maria Valeska Rocha
da Silva

PRODUÇÃO
Williany Bezerra de Souza

DIAGRAMAÇÃO
Amanda da Costa Marques

IMAGENS
Amanda da Costa Marques
Kyvia Victoria de Brito Torres
Yasmin Vitoria Moreira Freire
Iasmin Soares do Nascimento

PROGRAMA DE FOMENTO
Universidade Aberta do Brasil (UAB)

Boas, João Moreno Vilas.

              B662i Introdução a lógica e programação: curso de tecnologia em sistemas para internet [livro eletrônico] / João Moreno Vilas Boas, Wagner de Oliveira. – Natal : IFRN, 2025. 96 p. ; il ; PDF

ISBN nº 978-65-84831-54-4

           1. Educação. 2. Projeto - AVA. 3. Curso. 4. Informática. 5 Lógica - Docência. I. Oliveira, Wagner de. Título

SIBi/IFRN                                                                                                       CDU 004.414.2

Sistema Integrado de Bibliotecas
Elaborada pelo Bibliotecário
Ezequiel da Costa Soares Neto – CRB-15/613

Sem título CustomCSS

Referências

Sem título Text

Referências

BARRY, P. Use a cabeça! Python. Rio de Janeiro: Alta Books, 2018.

CURSO Python #10: Condições (Parte 1). Condução: Gustavo Guanabara. [S.l.: s.n.], 2017. 1 vídeo (34 min). Publicado pelo canal Curso em Vídeo. Disponível em: https://www.youtube.com/watch?v=K10u3XIf1-Q&t=1s. Acesso em: 10 dez. 2023.

CURSO Python #12: Condições Aninhadas. Condução: Gustavo Guanabara. [S. l.: s.n.], 2017. 1 vídeo (29 min). Publicado pelo canal Curso em Vídeo. Disponível em: https://www.youtube.com/watch?v=j9bYDjaAYzw&t=233s. Acesso em: 18 dez. 2023.

CURSO Python #13 - Estrutura de repetição for. Condução: Gustavo Guanabara. [S.l.: s.n.], 2017. 1 vídeo (35 min). Publicado pelo canal Curso em Vídeo. Disponível em: https://www.youtube.com/watch?v=cL4YDtFnCt4&t=3s . Acesso em: 12 dez. 2023.

CURSO Python #14 - Estrutura de repetição while. Condução: Gustavo Guanabara. [S.l: s.n.], 2017. 1 vídeo (38 min). Publicado pelo canal Curso em Vídeo. Disponível em: https://www.youtube.com/watch?v=LH6OIn2lBaI&t=1s. Acesso em: 20 dez. 2023.

DOJÔ BYLEARN. Conheça as grandes empresas que usam Python. 2020. Disponível em: https://dojo.bylearn.com.br/python/grandes-empresas-que-usam-python/.  Acesso em: 02 dez. 2023.

ENDERTON, H. B. A mathematical introduction to logic. 2. ed. San Diego: Academic Press, 2001.

FORBELLONE, A. L. V.; EBERSPACHER, H. F. Lógica de programação: a construção de algoritmos e estruturas de dados. São Paulo: Prentice Hall, 2005.

MANZANO, N. G.; OLIVEIRA, J. F. Algoritmos: lógica para desenvolvimento de programação de computadores. 28ª ed. São Paulo: Érica, 2016.

MENDELSON, E. Introdução à lógica matemática. 5. ed. Rio de Janeiro: LTC, 2004.

MENEZES, N. N. C. Introdução à programação com Python: algoritmos e lógica de programação para iniciantes. 3ª ed. São Paulo: Novatec, 2019.

MORTARI, C. A. Introdução à lógica. 2. ed. São Paulo: Unesp, 2017.

PAIVA, F. A. P.; et al. Introdução a Python com aplicações de sistemas operacionais. Natal: Editora IFRN, 2020. 240 p.

PYTHON. O tutorial de Python. [S.l.]: [s.d.]. Disponível em: https://docs.python.org/pt-br/3/tutorial/. Acesso em: 02 dez. 2023.

ROVEDA, U. Empresas que usam Python e 7 razões para aprender Python em 2021. Kenzie Academy Brasil, 2020. Disponível em: https://kenzie.com.br/blog/empresas-que-usam-python/. Acesso em: 02 dez. 2023.

RODRIGUES, C. Quais os sistemas desenvolvidos na linguagem Python no mundo. LinkedIn, 2023. Disponível em: https://www.linkedin.com/pulse/quais-os-sistemas-desenvolvidos-na-linguagem-python-mundo-carlos/?originalSubdomain=pt.  Acesso em: 02 dez. 2023.

SAID, R. Curso de Lógica de Programação. São Paulo: Digerati Books, 2007. 144 p.

TIOBE Software BV. Índice TIOBE. Disponível em: https://www.tiobe.com/tiobe-index/. Acesso em: 02 dez. 2023.

VARELA, H.; PEVIANI, C. T. Scratch: um jeito divertido de aprender programação. Casa do Código, 2017.

Sem título CustomCSS