O autor e a editora empenharam-se para citar adequadamente e dar o devido crédito a todos os detentores dos direitos autorais de qualquer material utilizado neste livro, dispondo-se a possíveis acertos caso, inadvertidamente, a identificação de algum deles tenha sido omitida. Não é responsabilidade da editora nem do autor a ocorrência de eventuais perdas ou danos a pessoas ou bens que tenham origem no uso desta publicação. Apesar dos melhores esforços do autor, do tradutor, do editor e dos revisores, é inevitável que surjam erros no texto. Assim, são bem-vindas as comunicações de usuários sobre correções ou sugestões referentes ao conteúdo ou ao nível pedagógico que auxiliem o aprimoramento de edições futuras. Os comentários dos leitores podem ser encaminhados à LTC — Livros Técnicos e Científicos Editora pelo e-mail [email protected]. Traduzido de INTRODUCTION TO COMPUTING USING PYTHON: AN APPLICATION DEVELOPMENT FOCUS, FIRST EDITION Copyright © 2012 John Wiley & Sons, Inc. All rights reserved. Authorised translation from the English language edition published by John Wiley & Sons Limited. Responsibility for the accuracy of the translation rests solely with LTC — Livros Técnicos e Cientifícos Editora Ltda., and is not the responsibility of John Wiley & Sons Limited. No part of this book may be reproduced in any form without the written permission of the original copyright holder, John Wiley & Sons Limited. ISBN 978-0-470-61846-2 Portuguese edition copyright © 2016 by LTC — Livros Técnicos e Científicos Editora Ltda. All rights reserved. Direitos exclusivos para a língua portuguesa Copyright © 2016 by LTC — Livros Técnicos e Científicos Editora Ltda. Uma editora integrante do GEN | Grupo Editorial Nacional Reservados todos os direitos. É proibida a duplicação ou reprodução deste volume, no todo ou em parte, sob quaisquer formas ou por quaisquer meios (eletrônico, mecânico, gravação, fotocópia, distribuição na internet ou outros), sem permissão expressa da editora. Travessa do Ouvidor, 11 Rio de Janeiro, RJ − CEP 20040-040 Tels.: 21-3543-0770 / 11-5080-0770 Fax: 21-3543-0896 [email protected] www.ltceditora.com.br Design de capa: Wendy Lai Foto de capa: ©simon2579/iStockphoto Produção digital: Geethik CIP-BRASIL. CATALOGAÇÃO NA PUBLICAÇÃO SINDICATO NACIONAL DOS EDITORES DE LIVROS, RJ P526i Perkovic, Ljubomir Introdução à computação usando Python : um foco no desenvolvimento de aplicações / Ljubomir Perkovic ; tradução Daniel Vieira. - 1. ed. - Rio de Janeiro : LTC, 2016. il. ; 28 cm Tradução de: Introduction to computing using python: an application development focus Inclui índice ISBN 978-85-216-3092-0 1. Computação. I. Vieira, Daniel. II. Título. 16-30406 CDD: 004 CDU: 004 Ao meu pai, Milan Perković (1937-1970), que não teve a chance de concluir seu livro. Sumário Prefácio 1 Introdução à Ciência da Computação 1.1 Ciência da Computação O que os Profissionais da Computação Fazem? Modelos, Algoritmos e Programas Ferramentas do Ofício O que É Ciência da Computação? 1.2 Sistemas de Computação Hardware do Computador Sistemas Operacionais Redes e Protocolos de Rede Linguagens de Programação Bibliotecas de Software 1.3 Linguagem de Programação Python Pequena História do Python Configurando o Ambiente de Desenvolvimento Python 1.4 Pensamento Computacional Um Exemplo de Problema Abstração e Modelagem Algoritmo Tipos de Dados Atribuições e Estruturas de Controle de Execução Resumo do Capítulo 2 Tipos de Dados Python 2.1 Expressões, Variáveis e Atribuições Expressões Algébricas e Funções Expressões e Operadores Booleanos Variáveis e Atribuições Nomes de Variáveis 2.2 Strings Operadores de String Operador de Indexação 2.3 Listas Operadores de Lista Listas São Mutáveis, Strings Não Métodos de Lista 2.4 Objetos e Classes Tipo de Objeto Valores Válidos para Tipos Numéricos Operadores para Tipos Numéricos Criando Objetos Conversões de Tipo Implícitas Conversões de Tipo Explícitas Métodos de Classe e Programação Orientada a Objeto 2.5 Biblioteca Padrão Python Módulo math Módulo fractions 2.6 Estudo de Caso: Objetos Turtle Graphics Resumo do Capítulo Soluções dos Problemas Práticos Exercícios 3 Programação Imperativa 3.1 Programas em Python Nosso Primeiro Programa Python Módulos Python Função Embutida print() Entrada Interativa com input() Função eval() 3.2 Estruturas de Controle de Execução Decisões de Caminho Único Decisões de Caminho Duplo Estruturas de Iteração Aninhando Estruturas de Fluxo de Controle Função range() 3.3 Funções Definidas pelo Usuário Nossa Primeira Função versus print() return Definições de Função São Instruções de “Atribuição” Comentários Docstrings 3.4 Variáveis e Atribuições em Python Tipos Mutáveis e Imutáveis Atribuições e Mutabilidade Troca (swapping) 3.5 Passagem de Parâmetros Passagem de Parâmetro Imutável Passagem de Parâmetro Mutável 3.6 Estudo de Caso: Automatizando o Turtle Graphics Resumo do Capítulo Soluções dos Problemas Práticos Exercícios Problemas 4 Dados de Texto, Arquivos e Exceções 4.1 Revisão de Strings Representações de String Revisão do Operador de Indexação Métodos de String 4.2 Saída Formatada Função print() Método de String format() Alinhando Dados em Colunas 4.3 Arquivos Sistema de Arquivos Abrindo e Fechando um Arquivo Padrões para Leitura de um Arquivo de Texto Gravando em um Arquivo de Texto 4.4 Erros e Exceções Erros de Sintaxe Exceções Embutidas 4.5 Estudo de Caso: Registrando o Acesso ao Arquivo Uma Pequena Função Wrapper Registrando Nomes de Arquivo Obtendo e Formatando Data e Hora Implementação Final de openLog() Resumo do Capítulo Soluções dos Problemas Práticos Exercícios Problemas 5 Estruturas de Controle de Execução 5.1 Controle de Decisão e a Instrução if Decisões em Três Vias (e Mais!) Ordenação das Condições 5.2 Laço e Padrões de Iteração for Padrão de Laço: Laço de Iteração Padrão de Laço: Laço Contador Padrão de Laço: Laço Acumulador Acumulando Tipos Diferentes Padrões de Laço: Laço Aninhado 5.3 Mais sobre Listas: Listas Bidimensionais Listas Bidimensionais Listas Bidimensionais e o Padrão de Laço Aninhado 5.4 Laço while 5.5 Mais Padrões de Laço Padrões de Iteração: Laço de Sequência Padrão de Laço: Laço Infinito Padrão de Laço: Laço e Meio 5.6 Estruturas Adicionais de Controle de Iteração Instrução break Instrução continue Instrução pass Resumo do Capítulo Soluções dos Problemas Práticos Exercícios Problemas 6 Contêineres e Aleatoriedade 6.1 Dicionários Índices Definidos pelo Usuário como Motivação para Dicionários Propriedades da Classe de Dicionário Operadores de Dicionário Métodos de Dicionário Um Dicionário como um Substituto para a Condição Multivias Dicionário como uma Coleção de Contadores 6.2 Outros Tipos de Contêiner Embutidos Classe tuple Objetos Podem Ser Chaves de Dicionário tuple Revisão do Método de Dicionário items() Classe set Usando o Construtor para Remover Duplicatas set Operadores set Métodos set 6.3 Codificações de Caracteres e Strings Codificações de Caracteres ASCII Unicode Codificação UTF-8 para Caracteres Unicode 6.4 Módulo random Escolhendo um Inteiro Aleatório Escolhendo um “Real” Aleatório Embaralhando, Escolhendo e Examinando Aleatoriamente 6.5 Estudo de Caso: Jogos de Sorte Blackjack Criando e Misturando o Baralho de Cartas Distribuindo uma Carta Calculando o Valor de uma Mão Comparando as Mãos do Jogador e da Casa Função Blackjack Principal Resumo do Capítulo Soluções dos Problemas Práticos Exercícios Problemas 7 Namespaces 7.1 Encapsulamento em Funções Reutilização de Código Modularidade (ou Decomposição Procedural) Encapsulamento (ou Ocultação de Informações) Variáveis Locais Namespaces Associados a Chamadas de Função Namespaces e a Pilha de Programa 7.2 Namespaces Globais versus Locais Variáveis Globais Variáveis com Escopo Local Variáveis com Escopo Global Alterando Variáveis Globais Dentro de uma Função 7.3 Fluxo de Controle Excepcional Exceções e Fluxo de Controle Excepcional Capturando e Manipulando Exceções O Manipulador de Exceção Padrão Capturando Exceções de Determinado Tipo Manipuladores de Exceção Mútliplos Controlando o Fluxo de Controle Excepcional 7.4 Módulos como Namespaces Atributos do Módulo O que Acontece Quando um Módulo é Importado Caminho de Busca do Módulo Módulo de Alto Nível Diferentes Maneiras de Importar Atributos de Módulo 7.5 Classes como Namespaces Uma Classe é um Namespace Métodos de Classe São Funções Definidas no Namespace da Classe Resumo do Capítulo Soluções dos Problemas Práticos Exercícios Problemas 8 Programação Orientada a Objeto 8.1 Definindo uma Nova Classe em Python Métodos da Classe Ponto Uma Classe e Seu Namespace Cada Objeto Tem um Namespace Associado Implementação da Classe Ponto Variáveis de Instância Instâncias Herdam Atributos de Classe Definição de Classe de Forma Mais Geral Documentando uma Classe Classe Animal 8.2 Exemplos de Classes Definidas pelo Usuário Operador de Construtor Sobrecarregado Construtor Padrão Jogando com a Classe Carta 8.3 Criando Novas Classes Contêiner Criando uma Classe que Representa um Baralho de Cartas Implementando a Classe (de Cartas) Baralho Classe Contêiner Queue Implementando uma Classe de Fila 8.4 Operadores Sobrecarregados Operadores São Métodos de Classe Tornando a Classe Amiga do Usuário Ponto Contrato entre o Construtor e o Operador repr() Tornando a Classe Queue Amigável ao Usuário 8.5 Herança Herdando Atributos de uma Classe Definição de Classe Geral Sobrescrevendo Métodos de Superclasse Estendendo Métodos da Superclasse Implementando uma Classe Herdando de Queue list 8.6 Exceções Definidas pelo Usuário Levantando uma Exceção Classes de Exceção Definidas pelo Usuário Melhorando o Encapsulamento da Classe Queue 8.7 Estudo de Caso: Indexação e Iteradores Sobrecarga dos Operadores de Indexação Iteradores e Padrões de Projeto POO Resumo do Capítulo Soluções dos Problemas Práticos Exercícios Problemas 9 Interfaces Gráficas do Usuário 9.1 Fundamentos do Desenvolvimento GUI com tkinter Widget : A Janela GUI Tk Widget para Exibição de Texto Label Exibindo Imagens Posicionando Widgets Arrumando Widgets em uma Grade 9.2 Widgets Baseados em Evento tkinter Widget e Manipuladores de Evento Button Eventos, Manipuladores de Evento e mainloop() O Widget Entry Widget e Vínculo de Eventos Text Padrões de Evento e a Classe Eventdotkinter 9.3 Criando GUIs Widget Canvas Widget como um Widget Organizador Frame 9.4 POO para GUIs Fundamentos de POO para GUI Widgets Compartilhados São Atribuídos a Variáveis de Instância Dados Compartilhados São Atribuídos a Variáveis de Instância 9.5 Estudo de Caso: Desenvolvendo uma Calculadora Botões da Calculadora e Passagem de Argumentos aos Manipuladores Implementando o Manipulador de Evento “Não Oficial” click() Resumo do Capítulo Soluções dos Problemas Práticos Exercícios Problemas 10 Recursão 10.1 Introdução à Recursão Funções Recursivas Pensamento Recursivo