Eric Matthes Novatec Copyright © 2015 by Eric Matthes. Title of English-language original: Python Crash Course, ISBN 978-1-59327-603-4, published by No Starch Press. Portuguese-language edition copyright © 2016 by Novatec Editora Ltda. All rights reserved. 3 Copyright © 2015 por Eric Matthes. Título original em Inglês: Python Crash Course, ISBN 978-1- 59327-603-4, publicado pela No Starch Press. Edição em Português copyright © 2016 pela Novatec Editora Ltda. Todos os direitos reservados. © Novatec Editora Ltda. 2016. 4 Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. É proibida a reprodução desta obra, mesmo parcial, por qualquer processo, sem prévia autorização, por escrito, do autor e da Editora. Editor: Rubens Prates Assistente editorial: Priscila Yoshimatsu Tradução: Lúcia A. Kinoshita Revisão gramatical: Smirna Cavalheiro Editoração eletrônica: Carolina Kuwabata 5 ISBN: 978-85-7522-602-5 Histórico de edições impressas: 6 Maio/2016 Primeira edição Novatec Editora Ltda. Rua Luís Antônio dos Santos 110 02460-000 – São Paulo, SP – Brasil Tel.: +55 11 2959-6529 Fax: +55 11 2950-8869 Email: novatec@novatec.com.br Site: www.novatec.com.br Twitter: twitter.com/novateceditora Facebook: facebook.com/novatec LinkedIn: linkedin.com/in/novatec 7 Para meu pai, que sempre teve tempo de responder às minhas perguntas sobre programação, e para Ever, que está começando a fazer suas perguntas. 8 Sumário Agradecimentos Introdução A quem este livro se destina? O que você pode esperar do livro? Por que Python? Parte I ■ Conceitos básicos 1 ■ Iniciando Configurando seu ambiente de programação Python 2 e Python 3 Executando trechos de código Python Hello World! Python em sistemas operacionais diferentes Python no Linux Python no OS X Python no Windows Resolvendo problemas de instalação Executando programas Python a partir de um terminal No Linux e no OS X No Windows Resumo 2 ■ Variáveis e tipos de dados simples O que realmente acontece quando executamos hello_world.py Variáveis Nomeando e usando variáveis Evitando erros em nomes ao usar variáveis Strings Mudando para letras maiúsculas e minúsculas em uma string usando métodos 9 Combinando ou concatenando strings Acrescentando espaços em branco em strings com tabulações ou quebras de linha Removendo espaços em branco Evitando erros de sintaxe com strings Exibindo informações em Python 2 Números Inteiros Números de ponto flutuante Evitando erros de tipo com a função str() Inteiros em Python 2 Comentários Como escrever comentários? Que tipos de comentário você deve escrever? Zen de Python Resumo 3 ■ Introdução às listas O que é uma lista? Acessando elementos de uma lista A posição dos índices começa em 0, e não em 1 Usando valores individuais de uma lista Alterando, acrescentando e removendo elementos Modificando elementos de uma lista Acrescentando elementos em uma lista Removendo elementos de uma lista Organizando uma lista Ordenando uma lista de forma permanente com o método sort() Ordenando uma lista temporariamente com a função sorted() Exibindo uma lista em ordem inversa Descobrindo o tamanho de uma lista Evitando erros de índice quando trabalhar com listas Resumo 4 ■ Trabalhando com listas Percorrendo uma lista inteira com um laço Observando os laços com mais detalhes 10 Executando mais tarefas em um laço for Fazendo algo após um laço for Evitando erros de indentação Esquecendo-se de indentar Esquecendo-se de indentar linhas adicionais Indentando desnecessariamente Indentando desnecessariamente após o laço Esquecendo os dois-pontos Criando listas numéricas Usando a função range() Usando range() para criar uma lista de números Estatísticas simples com uma lista de números List comprehensions Trabalhando com parte de uma lista Fatiando uma lista Percorrendo uma fatia com um laço Copiando uma lista Tuplas Definindo uma tupla Percorrendo todos os valores de uma tupla com um laço Sobrescrevendo uma tupla Estilizando seu código Guia de estilo Indentação Tamanho da linha Linhas em branco Outras diretrizes de estilo Resumo 5 ■ Instruções if Um exemplo simples Testes condicionais Verificando a igualdade Ignorando as diferenças entre letras maiúsculas e minúsculas ao verificar a igualdade Verificando a diferença Comparações numéricas 11 Testando várias condições Verificando se um valor está em uma lista Verificando se um valor não está em uma lista Expressões booleanas Instruções if Instruções if simples Instruções if-else Sintaxe if-elif-else Usando vários blocos elif Omitindo o bloco else Testando várias condições Usando instruções if com listas Verificando itens especiais Verificando se uma lista não está vazia Usando várias listas Estilizando suas instruções if Resumo 6 ■ Dicionários Um dicionário simples Trabalhando com dicionários Acessando valores em um dicionário Adicionando novos pares chave-valor Começando com um dicionário vazio Modificando valores em um dicionário Removendo pares chave-valor Um dicionário de objetos semelhantes Percorrendo um dicionário com um laço Percorrendo todos os pares chave-valor com um laço Percorrendo todas as chaves de um dicionário com um laço Percorrendo as chaves de um dicionário em ordem usando um laço Percorrendo todos os valores de um dicionário com um laço Informações aninhadas Uma lista de dicionários Uma lista em um dicionário Um dicionário em um dicionário Resumo 12 7 ■ Entrada de usuário e laços while Como a função input() trabalha Escrevendo prompts claros Usando int() para aceitar entradas numéricas Operador de módulo Aceitando entradas em Python 2.7 Introdução aos laços while Laço while em ação Deixando o usuário decidir quando quer sair Usando uma flag Usando break para sair de um laço Usando continue em um laço Evitando loops infinitos Usando um laço while com listas e dicionários Transferindo itens de uma lista para outra Removendo todas as instâncias de valores específicos de uma lista Preenchendo um dicionário com dados de entrada do usuário Resumo 8 ■ Funções Definindo uma função Passando informações para uma função Argumentos e parâmetros Passando argumentos Argumentos posicionais Argumentos nomeados Valores default Chamadas de função equivalentes Evitando erros em argumentos Valores de retorno Devolvendo um valor simples Deixando um argumento opcional Devolvendo um dicionário Usando uma função com um laço while Passando uma lista para uma função Modificando uma lista em uma função 13 Evitando que uma função modifique uma lista Passando um número arbitrário de argumentos Misturando argumentos posicionais e arbitrários Usando argumentos nomeados arbitrários Armazenando suas funções em módulos Importando um módulo completo Importando funções específicas Usando a palavra reservada as para atribuir um alias a uma função Usando a palavra reservada as para atribuir um alias a um módulo Importando todas as funções de um módulo Estilizando funções Resumo 9 ■ Classes Criando e usando uma classe Criando a classe Dog Criando uma instância a partir de uma classe Trabalhando com classes e instâncias Classe Car Definindo um valor default para um atributo Modificando valores de atributos Herança Método __init__() de uma classe-filha Herança em Python 2.7 Definindo atributos e métodos da classe-filha Sobrescrevendo métodos da classe-pai Instâncias como atributos Modelando objetos do mundo real Importando classes Importando uma única classe Armazenando várias classes em um módulo Importando várias classes de um módulo Importando um módulo completo Importando todas as classes de um módulo Importando um módulo em um módulo Definindo o seu próprio fluxo de trabalho Biblioteca-padrão de Python 14 Estilizando classes Resumo 10 ■ Arquivos e exceções Lendo dados de um arquivo Lendo um arquivo inteiro Paths de arquivo Lendo dados linha a linha Criando uma lista de linhas de um arquivo Trabalhando com o conteúdo de um arquivo Arquivos grandes: um milhão de dígitos Seu aniversário está contido em pi? Escrevendo dados em um arquivo Escrevendo dados em um arquivo vazio Escrevendo várias linhas Concatenando dados em um arquivo Exceções Tratando a exceção ZeroDivisionError Usando blocos try-except Usando exceções para evitar falhas Bloco else Tratando a exceção FileNotFoundError Analisando textos Trabalhando com vários arquivos Falhando silenciosamente Decidindo quais erros devem ser informados Armazenando dados Usando json.dump() e json.load() Salvando e lendo dados gerados pelo usuário Refatoração Resumo 11 ■ Testando o seu código Testando uma função Testes de unidade e casos de teste Um teste que passa Um teste que falha 15 Respondendo a um teste que falhou Adicionando novos testes Testando uma classe Uma variedade de métodos de asserção Uma classe para testar Testando a classe AnonymousSurvey Método setUp() Resumo Parte II ■ Projetos Projeto 1 ■ Invasão alienígena 12 ■ Uma espaçonave que atira Planejando o seu projeto Instalando o Pygame Instalando pacotes Python com o pip Instalando o Pygame no Linux Instalando o Pygame no OS X Instalando o Pygame no Windows Dando início ao projeto do jogo Criando uma janela do Pygame e respondendo às entradas do usuário Definindo a cor de fundo Criando uma classe de configurações Adicionando a imagem de uma espaçonave Criando a classe Ship Desenhando a espaçonave na tela Refatoração: o módulo game_functions Função check_events() Função update_screen() Pilotando a espaçonave Respondendo a um pressionamento de tecla Permitindo um movimento contínuo Movendo tanto para a esquerda quanto para a direita Ajustando a velocidade da espaçonave Limitando o alcance da espaçonave Refatorando check_events() 16 Uma recapitulação rápida alien_invasion.py settings.py game_functions.py ship.py Atirando Adicionando as configurações dos projéteis Criando a classe Bullet Armazenando projéteis em um grupo Disparando os projéteis Apagando projéteis antigos Limitando o número de projéteis Criando a função update_bullets() Criando a função fire_bullet() Resumo 13 ■ Alienígenas! Revisando o seu projeto Criando o primeiro alienígena Criando a classe Alien Criando uma instância do alienígena Fazendo o alienígena aparecer na tela Construindo a frota de alienígenas Determinando quantos alienígenas cabem em uma linha Criando linhas de alienígenas Criando a frota Refatorando create_fleet() Adicionando linhas Fazendo a frota se mover Movendo os alienígenas para a direita Criando configurações para a direção da frota Verificando se um alienígena atingiu a borda Fazendo a frota descer e mudando a direção Atirando nos alienígenas Detectando colisões com os projéteis Criando projéteis maiores para testes Repovoando a frota 17 Aumentando a velocidade dos projéteis Refatorando update_bullets() Encerrando o jogo Detectando colisões entre um alienígena e a espaçonave Respondendo a colisões entre alienígenas e a espaçonave Alienígenas que alcançam a parte inferior da tela Fim de jogo! Identificando quando determinadas partes do jogo devem executar Resumo 14 ■ Pontuação Adicionando o botão Play Criando uma classe Button Desenhando o botão na tela Iniciando o jogo Reiniciando o jogo Desativando o botão Play Ocultando o cursor do mouse Passando para o próximo nível Modificando as configurações de velocidade Reiniciando a velocidade Pontuação Exibindo a pontuação Criando um painel de pontuação Atualizando a pontuação à medida que os alienígenas são eliminados Garantindo que todos os acertos sejam contabilizados Aumentando a quantidade de pontos Arredondando a pontuação Pontuações máximas Exibindo o nível Exibindo o número de espaçonaves Resumo Projeto 2 ■ Visualização de dados 15 ■ Gerando dados Instalando o matplotlib 18 No Linux No OS X No Windows Testando o matplotlib A galeria do matplotlib Gerando um gráfico linear simples Alterando o tipo do rótulo e a espessura do gráfico Corrigindo o gráfico Plotando e estilizando pontos individuais com scatter() Plotando uma série de pontos com scatter() Calculando dados automaticamente Removendo os contornos dos pontos de dados Definindo cores personalizadas Usando um colormap Salvando seus gráficos automaticamente Passeios aleatórios Criando a classe RandomWalk() Escolhendo as direções Plotando o passeio aleatório Gerando vários passeios aleatórios Estilizando o passeio Colorindo os pontos Plotando os pontos de início e de fim Limpando os eixos Adicionando pontos para plotagem Alterando o tamanho para preencher a tela Lançando dados com o Pygal Instalando o Pygal Galeria do Pygal Criando a classe Die Lançando o dado Analisando os resultados Criando um histograma Lançando dois dados Lançando dados de tamanhos diferentes Resumo 19 16 ■ Fazendo download de dados Formato de arquivo CSV Fazendo parse dos cabeçalhos de arquivos CSV Exibindo os cabeçalhos e suas posições Extraindo e lendo dados Plotando dados em um gráfico de temperatura Módulo datetime Plotando datas Plotando um período de tempo maior Plotando uma segunda série de dados Sombreando uma área do gráfico Verificação de erros Mapeando conjuntos de dados globais: formato JSON Fazendo download dos dados da população mundial Extraindo dados relevantes Convertendo strings em valores numéricos Obtendo os códigos de duas letras dos países Construindo um mapa-múndi Plotando dados numéricos em um mapa-múndi Criando um mapa completo de populações Agrupando os países de acordo com a sua população Estilizando mapas-múndi com o Pygal Clareando a cor do tema Resumo 17 ■ Trabalhando com APIs Usando uma API web Git e GitHub Requisitando dados usando uma chamada de API Instalando o pacote requests Processando uma resposta de API Trabalhando com o dicionário de resposta Resumo dos principais repositórios Monitorando os limites da taxa de uso da API Visualizando os repositórios usando o Pygal Aperfeiçoando os gráficos do Pygal 20