Programação em Python: Uma Introdução à Ciência da Computação
Este é um livro-texto introdutório do nível universitário projetado para ensinar os princípios fundamentais da ciência da computação usando Python como linguagem de programação principal. Foca na resolução de problemas, no design e na programação por meio de um modelo de abordagem espiralada e uma abordagem orientada para gráficos.
Visão Geral do Curso
📚 Resumo do Conteúdo
Este é um livro-texto introdutório de nível universitário projetado para ensinar os princípios fundamentais da ciência da computação usando Python como linguagem principal de programação. Ele foca na resolução de problemas, no design e na programação por meio de um modelo de cobertura espiralada e uma abordagem orientada a gráficos.
Uma introdução suave e abrangente à arte da ciência da computação por meio da perspectiva do Python.
Autor: John M. Zelle
Agradecimentos: Guido van Rossum (Prefácio), Jim Leisy, e colegas acadêmicos da Wartburg College e diversas universidades, incluindo Owen Astrachan, Cay Horstmann e Nell Dale.
🎯 Objetivos de Aprendizagem
- Distinguir entre hardware/software e algoritmos/programas.
- Explicar como um interpretador Python traduz código de alto nível em instruções executáveis por meio de bytecode.
- Definir e invocar funções simples em Python usando parâmetros e argumentos.
- Listar e descrever as seis etapas do Processo de Desenvolvimento de Software.
- Aplicar regras de sintaxe do Python para criar identificadores válidos e expressões matemáticas com precedência correta de operadores.
- Diferenciar os modelos de variáveis "Caixa" e "Nota-cola" e explicar o processo de avaliação e atribuição.
- Distinguir os tipos de dados
intefloate aplicar conversões explícitas de tipo. - Implementar o padrão de acumulador para resolver problemas matemáticos como fatoriais.
- Utilizar a biblioteca
mathdo Python para resolver equações algébricas, incluindo a fórmula quadrática. - Definir e aplicar conceitos centrais de POO: objetos, métodos, acessores, mutadores e aliasing.
🔹 Lição 1: Introdução à Ciência da Computação e Noções Básicas do Python
Visão Geral: Esta lição apresenta a ciência da computação como o estudo de processos computáveis, e não apenas o estudo de máquinas físicas. Os alunos explorarão o conceito da "Máquina Universal", onde o software fornece o poder para transformar hardware em qualquer ferramenta imaginável. A sessão termina com uma introdução técnica às noções básicas do Python, incluindo sua execução baseada em interpretador, definição de funções e a distinção entre sintaxe e semântica.
Resultados de Aprendizagem:
- Distinguir entre hardware/software e algoritmos/programas.
- Explicar como um interpretador Python traduz código de alto nível em instruções executáveis por meio de bytecode.
- Definir e invocar funções simples em Python usando parâmetros e argumentos.
🔹 Lição 2: O Processo de Desenvolvimento de Software e Programas Simples
Visão Geral: Esta lição apresenta a abordagem sistemática para criar software por meio do processo de desenvolvimento de seis etapas e os blocos fundamentais da programação em Python. Os alunos explorarão a sintaxe básica, incluindo identificadores, expressões e atribuição, contrastando o modelo de variável "Nota-cola" com conceitos tradicionais. A lição termina com a implementação de laços definidos usando a função range() para lidar com cálculos repetitivos.
Resultados de Aprendizagem:
- Listar e descrever as seis etapas do Processo de Desenvolvimento de Software.
- Aplicar regras de sintaxe do Python para criar identificadores válidos e expressões matemáticas com precedência correta de operadores.
- Diferenciar os modelos de variáveis "Caixa" e "Nota-cola" e explicar o processo de avaliação e atribuição.
🔹 Lição 3: Representação de Dados Numéricos e a Biblioteca Math
Visão Geral: Esta lição explora como os computadores representam e manipulam dados numéricos, distinguindo números inteiros discretos (inteiros) das aproximações de números reais (ponto flutuante). Os alunos aprenderão a realizar cálculos complexos usando operadores embutidos no Python e a biblioteca math, enquanto compreendem as limitações subjacentes da representação binária e da precisão.
Resultados de Aprendizagem:
- Distinguir os tipos de dados
intefloate aplicar conversões explícitas de tipo. - Implementar o padrão de acumulador para resolver problemas matemáticos como fatoriais.
- Utilizar a biblioteca
mathdo Python para resolver equações algébricas, incluindo a fórmula quadrática.
🔹 Lição 4: Gráficos Orientados a Objetos e GUIs Interativas
Visão Geral: Esta lição transfere os alunos da programação baseada em texto para interfaces gráficas de usuário (GUIs) usando uma abordagem orientada a objetos (OO). Os alunos aprenderão a manipular objetos gráficos (pontos, linhas, formas), gerenciar sistemas de coordenadas e criar programas interativos que respondem a cliques do mouse, pressionamentos de teclas e entradas de texto.
Resultados de Aprendizagem:
- Definir e aplicar conceitos centrais de POO: objetos, métodos, acessores, mutadores e aliasing.
- Construir e exibir objetos gráficos, incluindo Pontos, Linhas, Círculos, Retângulos, Elipses e Polígonos.
- Implementar transformações de coordenadas e elementos interativos (mouse/teclado/caixas de entrada) para criar GUIs funcionais.
🔹 Lição 5: Sequências: Strings, Listas e Entrada/Saída de Arquivos
Visão Geral: Esta lição explora como a ciência da computação representa e manipula sequências de dados, com foco específico em strings e listas. Os alunos aprenderão os mecanismos de indexação e fatiamento, a distinção crítica entre objetos mutáveis e imutáveis, e como interagir com dados externos por meio do processamento de arquivos. Além disso, a lição aborda codificação de dados via Unicode e os princípios fundamentais da criptografia usando cifras básicas.
Resultados de Aprendizagem:
- Realizar manipulações avançadas de strings e listas usando indexação, fatiamento e métodos embutidos (split, join, upper, lower).
- Projetar e implementar algoritmos básicos de codificação/descodificação e cifras criptográficas (César e Substituição).
- Desenvolver programas de processamento em lote que abrem, leem, processam e fecham arquivos de dados externos.
🔹 Lição 6: Definição de Funções e Escopo de Variáveis
Visão Geral: Esta lição explora a transição de escrever scripts monolíticos para criar programas modulares usando funções. Ela cobre a sintaxe para definir e chamar funções, o mecanismo de passagem de informações por meio de parâmetros formais e reais, e como as funções comunicam resultados de volta por meio de valores de retorno (incluindo múltiplos valores e o objeto None). Os alunos também aprenderão sobre escopo de variáveis — especificamente a diferença entre variáveis locais e globais — e como funções podem modificar parâmetros mutáveis para influenciar o estado do programa.
Resultados de Aprendizagem:
- Demonstrar como definir e invocar funções para reduzir duplicação de código e melhorar a estrutura do programa.
- Diferenciar entre parâmetros formais e reais e explicar o correspondência por posição.
- Implementar funções que retornam um único valor, múltiplos valores ou padrão para o objeto
None.
🔹 Lição 7: Estruturas de Decisão e Tratamento de Exceções
Visão Geral: Esta lição introduz estruturas de decisão, que permitem que os programas executem sequências diferentes de instruções com base em condições específicas. Os alunos aprenderão a formar expressões booleanas usando operadores relacionais, implementar decisões simples, duplas e múltiplas, e usar aninhamento para lógica complexa. A lição também aborda execução modular com a variável __name__ e gerenciamento robusto de erros por meio do tratamento de exceções.
Resultados de Aprendizagem:
- Implementar estruturas de decisão simples, duplas e múltiplas usando
if,elseeelif. - Construir e avaliar expressões booleanas usando operadores relacionais e ordenação lexicográfica para strings.
- Aplicar o padrão
try-exceptpara lidar com erros em tempo de execução e evitar falhas no programa.
🔹 Lição 8: Laços Indefinidos e Lógica Booleana
Visão Geral: Esta lição transita dos laços definidos ("contados") para laços indefinidos, que executam com base em condições, em vez de uma sequência fixa. Os alunos dominarão a instrução while e diversos padrões de design para processamento de dados, incluindo laços interativos, laços com sinalizador e laços baseados em arquivos. Além disso, a lição aborda a Lógica Booleana, fornecendo as ferramentas algébricas necessárias para construir e simplificar estruturas de tomada de decisão complexas no código.
Resultados de Aprendizagem:
- Projetar e implementar laços indefinidos usando a instrução
whiledo Python. - Aplicar padrões comuns de laço, incluindo laços interativos, laços com sinalizador e o padrão de leitura inicial.
- Simplificar condições lógicas complexas usando Álgebra Booleana e Leis de DeMorgan.
🔹 Lição 9: Simulação, Design e Refinamento Progressivo
Visão Geral: Esta lição explora o processo sistemático de desenvolver programas de computador complexos por meio do Design Top-Down e do Refinamento Progressivo. Os alunos aprenderão a decompor problemas grandes em partes menores e gerenciáveis usando abstração e modularização, visualizar hierarquias de programas por meio de Diagramas de Estrutura, e implementar simulações usando técnicas de Monte Carlo. O currículo também aborda estratégias de desenvolvimento iterativo como Prototipagem e Desenvolvimento em Espiral, além de métodos robustos de teste como Testes Unitários.
Resultados de Aprendizagem:
- Decompor um problema complexo em subproblemas menores e solucionáveis usando o Design Top-Down.
- Construir e interpretar Diagramas de Estrutura que ilustram fluxo de dados (parâmetros e valores de retorno) entre módulos.
- Aplicar técnicas de simulação de Monte Carlo para modelar eventos probabilísticos usando a biblioteca
randomdo Python.
🔹 Lição 10: Definição de Classes e Programação Baseada em Eventos
Visão Geral: Esta lição transita da abordagem procedural baseada em funções para o design baseado em objetos usando classes em Python. Os alunos aprenderão a encapsular dados (variáveis de instância) e comportamentos (métodos) em uma única unidade, criar widgets de interface gráfica interativa, e gerenciar o fluxo do programa por meio de programação baseada em eventos e loops de animação sincronizados.
Resultados de Aprendizagem:
- Diferenciar entre designs de programas baseados em funções e baseados em objetos.
- Definir classes personalizadas em Python usando construtores (
__init__), variáveis de instância e o parâmetroself. - Implementar encapsulamento e documentação usando docstrings.
🔹 Lição 11: Coleções de Dados: Listas Avançadas e Dicionários
Visão Geral: Esta lição explora técnicas avançadas de coleção de dados em Python, com foco na natureza versátil de listas e dicionários. Os alunos aprenderão a distinguir listas de arrays tradicionais, realizar operações complexas em listas como fatiamento e ordenação de registros, e aplicar mapeamento não sequencial através de dicionários. O módulo culmina com a aplicação dessas estruturas em análises estatísticas e algoritmos clássicos como o Crivo de Eratóstenes.
Resultados de Aprendizagem:
- Contrastar as listas dinâmicas do Python com arrays de tamanho fixo e homogêneos.
- Realizar manipulações avançadas de listas, incluindo fatiamento, exclusão seletiva e ordenação personalizada de registros de objetos.
- Implementar algoritmos estatísticos (média, mediana, desvio padrão) e designs baseados em tabelas usando coleções.
🔹 Lição 12: Princípios do Design Orientado a Objetos (OOD)
Visão Geral: Esta lição explora a transição do design funcional top-down para o Design Orientado a Objetos (OOD), uma abordagem centrada em dados onde sistemas são descritos como uma coleção de "caixas pretas" interativas (objetos). Os alunos aprenderão a identificar objetos e métodos candidatos, implementar simulações multi-classe como Racquetball e Poker com Dados, e aplicar os três pilares da POO: Encapsulamento, Polimorfismo e Herança. A lição culmina com a gestão de interações complexas em interfaces gráficas (GUIs) por meio de herança e sobrecarga de métodos.
Resultados de Aprendizagem:
- Identificar classes e métodos potenciais a partir de um enunciado de problema analisando substantivos e verbos.
- Implementar uma simulação complexa com múltiplos objetos usando classes estruturadas (por exemplo,
Player,Game,Stats). - Distinguir e aplicar os conceitos fundamentais de encapsulamento, polimorfismo e herança.
🔹 Lição 13: Projeto de Algoritmos, Recursão e Eficiência
Visão Geral: Esta lição explora as técnicas fundamentais usadas para resolver problemas computacionais de forma eficiente. Ela abrange estratégias de busca, os mecanismos da resolução recursiva de problemas (casos-base e etapas recursivas), e uma comparação entre algoritmos de ordenação como Selection Sort e Merge Sort para entender como o design de algoritmos afeta o desempenho.
Resultados de Aprendizagem:
- Comparar e implementar estratégias de Busca Linear e Busca Binária.
- Projetar funções recursivas usando casos-base e etapas recursivas para problemas como inversão de string e exponenciação rápida.
- Analisar trade-offs de desempenho entre recursão e iteração e entre diferentes algoritmos de ordenação (n^2 vs. n \log n).