




























































































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Abordagem dos tópicos do Curso de Ciências da Computação usando uma linguagem simples, portável, procedural e orientada a objetos e atual: Pyton
Tipologia: Notas de estudo
1 / 247
Esta página não é visível na pré-visualização
Não perca as partes importantes!





























































































Tópicos
Capítulo 1: O caminho do programa Capítulo 1: O caminho do programa Capítulo 2: Variáveis, expressões e comandos 2.1 Valores e tipos 2.2 Variáveis 2.3 Nomes de variáveis e palavras reservadas 2.4 Comandos 2.5 Avaliando expressões 2.6 Operadores e operandos 2.7 Ordem dos operadores 2.8 Operações com strings 2.9 Composição 2.11 Glossário Capítulo 2: Variáveis, expressões e comandos 2.1 Valores e tipos 2.2 Variáveis 2.3 Nomes de variáveis e palavras reservadas 2.4 Comandos 2.5 Avaliando expressões 2.6 Operadores e operandos 2.7 Ordem dos operadores 2.8 Operações com strings 2.9 Composição 2.11 Glossário Capítulo 3: Funções 3.1 Chamadas de funções 3.2 Conversão entre tipos 3.3 Coerção entre tipos 3.4 Funções matemáticas 3.5 Composição 3.6 Adicionando novas funções 3.7 Definições e uso 3.8 Fluxo de execução 3.9 Parâmetros e argumentos 3.10 Variáveis e parâmetros são locais 3.11 Diagramas da pilha 3.12 Funções com resultados 3.13 Glossário Capítulo 3: Funções Capítulo 4: Condicionais e recursão 4.1 O operador módulo 4.2 Expressões booleanas 4.3 Operadores lógicos 4.4 Execução condicional 4.5 Execução alternativa 4.6 Condicionais encadeados 4.7 Condicionais aninhados 4.8 A instrução return 4.9 Recursividade 4.10 Diagramas de pilha para funções recursivas 4.11 Recursividade infinita 4.12 Entrada pelo teclado 4.13 Glossário Capítulo 4: Condicionais e recursão 4.1 O operador módulo 4.2 Expressões booleanas 4.3 Operadores lógicos 4.4 Execução condicional 4.5 Execução alternativa 4.6 Condicionais encadeados 4.7 Condicionais aninhados 4.8 A instrução return 4.9 Recursividade 4.10 Diagramas de pilha para funções recursivas 4.11 Recursividade infinita 4.12 Entrada pelo teclado 4.13 Glossário Capítulo 5: Funções frutíferas 5.1 Valores de retorno 5.2 Desenvolvimento de programas 5.3 Composição 5.4 Funções booleanas 5.5 Mais recursividade
5.6 Voto de confiança (Leap of faith) 5.7 Mais um exemplo 5.8 Checagem de tipos 5.9 Glossário Capítulo 5: Funções frutíferas 5.1 Valores de retorno 5.2 Desenvolvimento de programas 5.3 Composição 5.4 Funções booleanas 5.5 Mais recursividade 5.6 Voto de confiança (Leap of faith) 5.7 Mais um exemplo 5.8 Checagem de tipos 5.9 Glossário Capítulo 6: Iteração Capítulo 6: Iteração Capítulo 7: Strings Capítulo 7: Strings Capítulo 8: Listas Capítulo 8: Listas Capítulo 9: Tuplas Capítulo 9: Tuplas Capítulo 10: Dicionários Capítulo 10: Dicionários Capítulo 11: Arquivos e exceções Capítulo 11: Arquivos e exceções Capítulo 12: Classes e objetos Capítulo 12: Classes e objetos Capítulo 13: Classes e funções Capítulo 13: Classes e funções Capítulo 14: Classes e métodos Capítulo 14: Classes e métodos Capítulo 15: Conjuntos de objetos Capítulo 15: Conjuntos de objetos Capitulo 16: Herança Capitulo 16: Herança Capítulo 17: Listas encadeadas Capítulo 18: Pilhas Capítulo 18: Pilhas Capítulo 19: Filas Capítulo 19: Filas Capítulo 20: Árvores Capítulo 20: Árvores
A meta deste livro é ensinar a você a pensar como um cientista da computação. Esta maneira de pensar combina algumas das melhores características da matemática, enge matemáticos, os cientistas da computação usam linguagens formais para representar idéias (especificamente, computações). Como engenheiros, eles projetam coisas, monta componentes e avaliando as vantagens e desvantagens de diferentes alternativas. Como cientistas naturais, eles observam o comportamento de sistemas complexos, formula
A mais importante habilidade para um cientista da computação é a solução de problemas. A solucão de problemas é a habilidade de formular questões, pensar criativame expressar uma solução de forma clara e precisa. Ocorre que aprender a programar é uma excelente oportunidade de praticar as habilidades da solução de problemas. É por i caminho do programa?.
Em um nível, você estará aprendendo a programar, uma habilidade útil por si mesma. Em outro nível, você estará usando a programação como meio para um fim. À medida tornará mais claro.
1.1 A linguagem de programação Python
A linguagem de programação que você estará aprendendo é Python. Python é um exemplo de uma linguagem de programação de alto nível ; outras linguagens de alto n falar são C, C++, Perl e Java.
Como você poderia deduzir a partir das palavras ?linguagem de alto nível?, também existem as ?linguagens de baixo nível?, às vezes chamadas de ?linguagens de máquina? o (?linguagens de montagem?). Dito de maneira simples, computadores só podem executar programas escritos em linguagens de baixo nível. Deste modo, programas escritos que ser processados antes que possam rodar. Este processamento extra toma algum tempo, o que é uma pequena desvantagem das linguagens de alto nível.
Mas as vantagens são enormes. Primeiro, é muito mais fácil programar em uma linguagem de alto nível. Programas escritos em uma linguagem de alto nível levam menos t mais curtos e fáceis de ler, e é mais provável que estejam corretos. Segundo, as linguagens de alto nível são portáveis , o que significa que elas podem rodar em tipos diferent ou nenhuma modificação. Programas em baixo nível só podem rodar em um único tipo de computador e precisam ser re-escritos para rodar em outro tipo.
Devido a estas vantagens, quase todos os programas são escritos em linguagens de alto nível. As de baixo nível são utilizadas somente para umas poucas aplicações especializ
Dois tipos de programas processam linguagens de alto nível, traduzindo-as em linguagens de baixo nível: interpretadores e compiladores. Um interpretador lê um progr alto nível e o executa, ou seja, faz o que o programa diz. Ele processa o programa um pouco de cada vez, alternadamente: ora lendo algumas linhas, ora realizando computaç
XXXfigura p.2a
Um compilador lê o programa e o traduz completamente antes que o programa comece a rodar. Neste caso, o programa escrito em linguagem de alto nível é chamado de có traduzido é chamado de código objeto ou executável. Uma vez que um programa é compilado, você pode executá-lo repetidamente, sem que precise de nova tradução.
XXXfigura p.2b
Python não é tão indulgente. Se existir um único erro de sintaxe em qualquer lugar em seu programa, o interpretador Python exibirá uma mensagem de erro e terminará, e programa. Durante as primeiras semanas da sua carreira como programador, você provavelmente perderá um bocado de tempo procurando erros de sintaxe. Conforme gan cometerá menos erros e os encontrará mais rapidamente.
1.3.2 Erros em tempo de execução ( runtime errors )
O segundo tipo de erro é o erro de runtime, ou erro em tempo de execução, assim chamado porque não aparece até o momento em que você rode o programa. Estes erros são exceções porque eles normalmente indicam que alguma coisa excepcional (e ruim) aconteceu.
Erros de runtime são raros nos programas simples que você verá nos primeiros capítulos, assim levará algum tempo até que você encontre um.
1.3.3 Erros de semântica
O terceiro tipo de erro é o erro de semântica (mais comumente chamado erro de lógica). Se existe um erro de semântica em seu programa, ele vai rodar com sucesso, no s irá gerar quaisquer mensagens de erro, mas ele não fará a coisa certa. Fará alguma outra coisa. Especificamente, ele fará aquilo que você tiver dito a ele que faça.
O problema é que o programa que você escreveu não é aquele que você queria escrever. O significado do programa (sua semântica ou lógica) está errado. Identificar erros sem manhas porque requer que você trabalhe de trás para frente, olhando a saída do programa e tentando imaginar o que ele está fazendo.
1.3.4 Depuração experimental ( Debugging )
Uma das habilidades mais importantes que você vai adquirir é a de depurar. Embora possa ser frustrante, depurar é uma das partes mais intelectualmente ricas, desafiadora programação.
De certa maneira, a depuração é como um trabalho de detetive. Você se depara com pistas, e tem que deduzir os processos e eventos que levaram aos resultados que aparecem
Depurar também é como uma ciência experimental. Uma vez que você tem uma idéia do que está errado, você modifica o seu programa e tenta de novo. Se a sua hipótese esta prever o resultado da modificação e fica um passo mais perto de um programa que funciona. Se a sua hipótese estava errada, você tem que tentar uma nova. Como Sherlock tiver eliminado o impossível, aquilo que restou, ainda que improvável, deve ser a verdade.? (Arthur Conan Doyle, O sinal dos quatro ).
Para algumas pessoas, programação e depuração são a mesma coisa. Ou seja, programar é o processo de gradualmente depurar um programa até que ele faça o que você qu começar com um programa que faça alguma coisa e ir fazendo pequenas modificações, depurando-as conforme avança, de modo que você tenha sempre um programa que fu
Por exemplo, o Linux é um sistema operacional que contém milhares de linhas de código, mas começou como um programa simples que Linus Torvalds usou para explorar o Larry Greenfield, ?Um dos primeiros projetos de Linus Torvalds foi um programa que deveria alternar entre imprimir AAAA e BBBB. Isto depois evoluiu até o Linux?. ( The Li
Capítulos posteriores farão mais sugestões sobre depuração e outras práticas de programação.
1.4 Linguagens naturais e linguagens formais
Linguagens naturais são as linguagens que as pessoas falam, como o português, o inglês e o espanhol. Elas não foram projetadas pelas pessoas (muito embora as pessoa nelas); elas evoluíram naturalmente.
Linguagens formais são linguagens que foram projetadas por pessoas para aplicações específicas. Por exemplo, a notação que os matemáticos usam é uma linguagem for em denotar relações entre números e símbolos. Os químicos usam uma linguagem formal para representar a estrutura química das moléculas. E, mais importante:
Linguagens de programação são linguagens formais que foram desenvolvidas para expressar computações.
As linguagens formais tendem a ter regras estritas quanto à sintaxe. Por exemplo, 3 + 3 = 6 é uma expressão matemática sintaticamente correta, mas 3=+6$ não é. H2O sintaticamente correto, mas 2Zz não é.
As regras de sintaxe são de dois tipos, um relacionado aos tokens , outro à estrutura. ?Tokens? são os elementos básicos da linguagem, como as palavras, números, e elemen com 3=+6$ é que $ não é um token válido em linguagem matemática (pelo menos até onde sabemos). Do mesmo modo, 2Zz é inválida porque não existe nenhum elemento
O segundo tipo de erro de sintaxe está relacionado à estrutura de uma expressão? quer dizer, ao modo como os tokens estão arrumados. A expressão 3=+6$ é estruturalme colocar um sinal de ?mais? imediatamente após um sinal de ?igual?. Do mesmo modo, fórmulas moleculares devem ter índices subscritos colocados depois do nome do eleme
Como exercício, crie o que pareça ser uma frase bem estruturada em português com ?tokens? irreconhecíveis dentro dela. Depois escreva outra frase com todos os ?tok estrutura inválida.
Quando você lê uma frase em português ou uma expressão em uma linguagem formal, você tem de imaginar como é a estrutura da frase (embora, em uma linguagem natur inconscientemente). Este processo é chamado parsing (análise sintática).
Por exemplo, quando você ouve a frase, ?O outro sapato caiu?, Você entende que ?o outro sapato? é o sujeito e ?caiu? é o verbo. Uma vez que você analisou a frase, você pode i semântica da frase. Assumindo que você saiba o que é um sapato e o que significa cair, você entenderá o sentido geral desta frase.
Muito embora as linguagens formais e as naturais tenham muitas características em comum? tokens , estrutura, sintaxe e semântica? existem muitas diferenças:
ambigüidade
As linguagens naturais estão cheias de ambigüidades, as quais são contornadas pelas pessoas pelo uso de pistas contextuais e outras informações. Já as linguagens for para ser quase ou totalmente desprovidas de ambigüidade, o que significa que qualquer expressão tem exatamente um sentido, independente do contexto.
redundância
Para compensar a ambigüidade e reduzir mal-entendidos, as linguagens naturais empregam de muita redundância. Consequentemente, elas são em muitos casos prol excesso. As linguagens formais são menos redundantes e mais concisas.
literalidade
As linguagens naturais estão cheias de expressões idiomáticas e metáforas. Se eu digo ?O outro sapato caiu?, provavelmente não existe nenhum sapato e nada caindo. querem dizer exatamente o que dizem.
Pessoas que crescem falando uma linguagem natural? todo mundo? muitas vezes têm dificuldade para se acostumar com uma linguagem formal. De várias maneiras, a dife naturais é como a diferença entre poesia e prosa, porém mais acentuada:
poesia
As palavras são usadas pela sua sonoridade além de seus sentidos e o poema como um todo cria um efeito ou uma reação emocional. A ambigüidade não é apenas freq vezes proposital.
prosa
O sentido literal das palavras é mais importante, e a estrutura contribui mais para o significado. A prosa é mais fácil de analisar do que a poesia, mas ainda é muitas v
programas
O significado de um programa de computador é exato e literal, e pode ser inteiramente entendido pela análise de seus tokens e de sua estrutura.
Aqui vão algumas sugestões para a leitura de programas (e de outras linguagens formais). Primeiro, lembre-se que linguagens formais são muito mais densas do que linguag demorado lê-las. A estrutura, também, é muito importante, logo, geralmente não é uma boa idéia ler de cima para baixo, da esquerda para a direita. Em vez disso, aprenda a cabeça, identificando os tokens e interpretando a estrutura. Finalmente, os detalhes são importantes. Pequenas coisas como erros ortográficos e má pontuação, com as quai linguagens naturais, podem fazer uma grande diferença em uma linguagem formal.
1.5 O primeiro programa
Tradicionalmente, o primeiro programa escrito em uma nova linguagem de programação é chamado de ?Alô, Mundo!? porque tudo que ele faz é apresentar as palavras ?Alô assim:
print ?Alô, Mundo!?
Isto é um exemplo de um comando print , o qual na realidade não ?imprime? nada em papel. Ele apresenta o valor na tela. Neste caso, o resultado são as palavras:
Alô, Mundo!
As aspas no programa marcam o começo e o fim do valor; elas não aparecem no resultado final.
Algumas pessoas julgam a qualidade de uma linguagem de programação pela simplicidade do programa ?Alô, Mundo!?. Por este padrão, Python se sai tão bem quanto é poss
1.6 Glossário
solução de problemas ( problem solving )
O processo de formular um problema, encontrar uma solução e expressar esta solução.
linguagem de alto nível ( high-level language )
Uma linguagem de programação como Python que é projetada para ser fácil para seres humanos lerem e escreverem.
linguagem de baixo nível ( low-level language )
Uma linguagem de programação que é concebida para ser fácil para um computador executar; também chamadas de "linguagem de máquina" ou "linguagem assembl montagem)
portabilidade ( portability )
Característica de um programa que roda em mais de um tipo de computador.
interpretar ( interpret )
Executar um programa escrito em uma linguagem de alto nível traduzindo-o uma linha de cada vez.
compilar ( compile )
Traduzir todo um programa escrito em uma linguagem de alto nível para uma de baixo nível de um só vez, em preparação para uma execução posterior.
código fonte ( source code )
Um programa em uma linguagem de alto nível, antes de ter sido compilado.
código objeto ( object code )
A saída do compilador, depois que ele traduziu o programa.
executável ( executable )
Um outro nome para código objeto que está pronto para ser executado.
script
Um programa guardado em um arquivo (normalmente um que será interpretado).
2.4 Comandos 2.5 Avaliando expressões 2.6 Operadores e operandos 2.7 Ordem dos operadores 2.8 Operações com strings 2.9 Composição 2.11 Glossário Capítulo 3: Funções 3.1 Chamadas de funções 3.2 Conversão entre tipos 3.3 Coerção entre tipos 3.4 Funções matemáticas 3.5 Composição 3.6 Adicionando novas funções 3.7 Definições e uso 3.8 Fluxo de execução 3.9 Parâmetros e argumentos 3.10 Variáveis e parâmetros são locais 3.11 Diagramas da pilha 3.12 Funções com resultados 3.13 Glossário Capítulo 3: Funções Capítulo 4: Condicionais e recursão 4.1 O operador módulo 4.2 Expressões booleanas 4.3 Operadores lógicos 4.4 Execução condicional 4.5 Execução alternativa 4.6 Condicionais encadeados 4.7 Condicionais aninhados 4.8 A instrução return 4.9 Recursividade 4.10 Diagramas de pilha para funções recursivas 4.11 Recursividade infinita 4.12 Entrada pelo teclado 4.13 Glossário Capítulo 4: Condicionais e recursão 4.1 O operador módulo 4.2 Expressões booleanas 4.3 Operadores lógicos 4.4 Execução condicional 4.5 Execução alternativa 4.6 Condicionais encadeados 4.7 Condicionais aninhados 4.8 A instrução return 4.9 Recursividade 4.10 Diagramas de pilha para funções recursivas 4.11 Recursividade infinita 4.12 Entrada pelo teclado 4.13 Glossário Capítulo 5: Funções frutíferas 5.1 Valores de retorno 5.2 Desenvolvimento de programas 5.3 Composição 5.4 Funções booleanas 5.5 Mais recursividade 5.6 Voto de confiança (Leap of faith) 5.7 Mais um exemplo 5.8 Checagem de tipos 5.9 Glossário Capítulo 5: Funções frutíferas 5.1 Valores de retorno 5.2 Desenvolvimento de programas 5.3 Composição 5.4 Funções booleanas 5.5 Mais recursividade 5.6 Voto de confiança (Leap of faith) 5.7 Mais um exemplo 5.8 Checagem de tipos 5.9 Glossário Capítulo 6: Iteração Capítulo 6: Iteração Capítulo 7: Strings Capítulo 7: Strings Capítulo 8: Listas Capítulo 8: Listas Capítulo 9: Tuplas Capítulo 9: Tuplas Capítulo 10: Dicionários
Capítulo 10: Dicionários Capítulo 11: Arquivos e exceções Capítulo 11: Arquivos e exceções Capítulo 12: Classes e objetos Capítulo 12: Classes e objetos Capítulo 13: Classes e funções Capítulo 13: Classes e funções Capítulo 14: Classes e métodos Capítulo 14: Classes e métodos Capítulo 15: Conjuntos de objetos Capítulo 15: Conjuntos de objetos Capitulo 16: Herança Capitulo 16: Herança Capítulo 17: Listas encadeadas Capítulo 18: Pilhas Capítulo 18: Pilhas Capítulo 19: Filas Capítulo 19: Filas Capítulo 20: Árvores Capítulo 20: Árvores
A meta deste livro é ensinar a você a pensar como um cientista da computação. Esta maneira de pensar combina algumas das melhores características da matemática, enge matemáticos, os cientistas da computação usam linguagens formais para representar idéias (especificamente, computações). Como engenheiros, eles projetam coisas, monta componentes e avaliando as vantagens e desvantagens de diferentes alternativas. Como cientistas naturais, eles observam o comportamento de sistemas complexos, formula
A mais importante habilidade para um cientista da computação é a solução de problemas. A solucão de problemas é a habilidade de formular questões, pensar criativame expressar uma solução de forma clara e precisa. Ocorre que aprender a programar é uma excelente oportunidade de praticar as habilidades da solução de problemas. É por i caminho do programa?.
Em um nível, você estará aprendendo a programar, uma habilidade útil por si mesma. Em outro nível, você estará usando a programação como meio para um fim. À medida tornará mais claro.
1.1 A linguagem de programação Python
A linguagem de programação que você estará aprendendo é Python. Python é um exemplo de uma linguagem de programação de alto nível ; outras linguagens de alto n falar são C, C++, Perl e Java.
Como você poderia deduzir a partir das palavras ?linguagem de alto nível?, também existem as ?linguagens de baixo nível?, às vezes chamadas de ?linguagens de máquina? o (?linguagens de montagem?). Dito de maneira simples, computadores só podem executar programas escritos em linguagens de baixo nível. Deste modo, programas escritos que ser processados antes que possam rodar. Este processamento extra toma algum tempo, o que é uma pequena desvantagem das linguagens de alto nível.
Mas as vantagens são enormes. Primeiro, é muito mais fácil programar em uma linguagem de alto nível. Programas escritos em uma linguagem de alto nível levam menos t mais curtos e fáceis de ler, e é mais provável que estejam corretos. Segundo, as linguagens de alto nível são portáveis , o que significa que elas podem rodar em tipos diferent ou nenhuma modificação. Programas em baixo nível só podem rodar em um único tipo de computador e precisam ser re-escritos para rodar em outro tipo.
Devido a estas vantagens, quase todos os programas são escritos em linguagens de alto nível. As de baixo nível são utilizadas somente para umas poucas aplicações especializ
Dois tipos de programas processam linguagens de alto nível, traduzindo-as em linguagens de baixo nível: interpretadores e compiladores. Um interpretador lê um progr alto nível e o executa, ou seja, faz o que o programa diz. Ele processa o programa um pouco de cada vez, alternadamente: ora lendo algumas linhas, ora realizando computaç
XXXfigura p.2a
Um compilador lê o programa e o traduz completamente antes que o programa comece a rodar. Neste caso, o programa escrito em linguagem de alto nível é chamado de có traduzido é chamado de código objeto ou executável. Uma vez que um programa é compilado, você pode executá-lo repetidamente, sem que precise de nova tradução.
XXXfigura p.2b
Python é considerada uma linguagem interpretada porque os programas em Python são executados por um interpretador. Existem duas maneiras de usar o interpretador: n modo de script. No modo de linha de comando, você digita programas em Python e o interpretador mostra o resultado:
$ python Python 1.5.2 (#1, Feb 1 2000, 16:32:16) Copyright 1991-1995 Stichting Mathematish Centrum, Amsterdam
print 1 + 1 2
A primeira linha deste exemplo é o comando que inicia o interpretador Python. As duas linhas seguintes são mensagens do interpretador. A terceira linha começa com >>>, interpretador para indicar que ele está pronto. Nós digitamos print 1 + 1 , e o interpretador respondeu 2.
Você também pode escrever um programa em um arquivo e usar o interpretador para executar o conteúdo deste arquivo. Um arquivo como este é chamado de script. Por ex para criar um arquivo chamado leticia.py com o seguinte conteúdo:
print 1 + 1
Por convenção, arquivos que contenham programas em Python têm nomes que terminam com .py.
Para executar o programa, temos de dizer ao interpretador o nome do script:
programação.
De certa maneira, a depuração é como um trabalho de detetive. Você se depara com pistas, e tem que deduzir os processos e eventos que levaram aos resultados que aparecem
Depurar também é como uma ciência experimental. Uma vez que você tem uma idéia do que está errado, você modifica o seu programa e tenta de novo. Se a sua hipótese esta prever o resultado da modificação e fica um passo mais perto de um programa que funciona. Se a sua hipótese estava errada, você tem que tentar uma nova. Como Sherlock tiver eliminado o impossível, aquilo que restou, ainda que improvável, deve ser a verdade.? (Arthur Conan Doyle, O sinal dos quatro ).
Para algumas pessoas, programação e depuração são a mesma coisa. Ou seja, programar é o processo de gradualmente depurar um programa até que ele faça o que você qu começar com um programa que faça alguma coisa e ir fazendo pequenas modificações, depurando-as conforme avança, de modo que você tenha sempre um programa que fu
Por exemplo, o Linux é um sistema operacional que contém milhares de linhas de código, mas começou como um programa simples que Linus Torvalds usou para explorar o Larry Greenfield, ?Um dos primeiros projetos de Linus Torvalds foi um programa que deveria alternar entre imprimir AAAA e BBBB. Isto depois evoluiu até o Linux?. ( The Li
Capítulos posteriores farão mais sugestões sobre depuração e outras práticas de programação.
1.4 Linguagens naturais e linguagens formais
Linguagens naturais são as linguagens que as pessoas falam, como o português, o inglês e o espanhol. Elas não foram projetadas pelas pessoas (muito embora as pessoa nelas); elas evoluíram naturalmente.
Linguagens formais são linguagens que foram projetadas por pessoas para aplicações específicas. Por exemplo, a notação que os matemáticos usam é uma linguagem for em denotar relações entre números e símbolos. Os químicos usam uma linguagem formal para representar a estrutura química das moléculas. E, mais importante:
Linguagens de programação são linguagens formais que foram desenvolvidas para expressar computações.
As linguagens formais tendem a ter regras estritas quanto à sintaxe. Por exemplo, 3 + 3 = 6 é uma expressão matemática sintaticamente correta, mas 3=+6$ não é. H2O sintaticamente correto, mas 2Zz não é.
As regras de sintaxe são de dois tipos, um relacionado aos tokens , outro à estrutura. ?Tokens? são os elementos básicos da linguagem, como as palavras, números, e elemen com 3=+6$ é que $ não é um token válido em linguagem matemática (pelo menos até onde sabemos). Do mesmo modo, 2Zz é inválida porque não existe nenhum elemento
O segundo tipo de erro de sintaxe está relacionado à estrutura de uma expressão? quer dizer, ao modo como os tokens estão arrumados. A expressão 3=+6$ é estruturalme colocar um sinal de ?mais? imediatamente após um sinal de ?igual?. Do mesmo modo, fórmulas moleculares devem ter índices subscritos colocados depois do nome do eleme
Como exercício, crie o que pareça ser uma frase bem estruturada em português com ?tokens? irreconhecíveis dentro dela. Depois escreva outra frase com todos os ?tok estrutura inválida.
Quando você lê uma frase em português ou uma expressão em uma linguagem formal, você tem de imaginar como é a estrutura da frase (embora, em uma linguagem natur inconscientemente). Este processo é chamado parsing (análise sintática).
Por exemplo, quando você ouve a frase, ?O outro sapato caiu?, Você entende que ?o outro sapato? é o sujeito e ?caiu? é o verbo. Uma vez que você analisou a frase, você pode i semântica da frase. Assumindo que você saiba o que é um sapato e o que significa cair, você entenderá o sentido geral desta frase.
Muito embora as linguagens formais e as naturais tenham muitas características em comum? tokens , estrutura, sintaxe e semântica? existem muitas diferenças:
ambigüidade
As linguagens naturais estão cheias de ambigüidades, as quais são contornadas pelas pessoas pelo uso de pistas contextuais e outras informações. Já as linguagens for para ser quase ou totalmente desprovidas de ambigüidade, o que significa que qualquer expressão tem exatamente um sentido, independente do contexto.
redundância
Para compensar a ambigüidade e reduzir mal-entendidos, as linguagens naturais empregam de muita redundância. Consequentemente, elas são em muitos casos prol excesso. As linguagens formais são menos redundantes e mais concisas.
literalidade
As linguagens naturais estão cheias de expressões idiomáticas e metáforas. Se eu digo ?O outro sapato caiu?, provavelmente não existe nenhum sapato e nada caindo. querem dizer exatamente o que dizem.
Pessoas que crescem falando uma linguagem natural? todo mundo? muitas vezes têm dificuldade para se acostumar com uma linguagem formal. De várias maneiras, a dife naturais é como a diferença entre poesia e prosa, porém mais acentuada:
poesia
As palavras são usadas pela sua sonoridade além de seus sentidos e o poema como um todo cria um efeito ou uma reação emocional. A ambigüidade não é apenas freq vezes proposital.
prosa
O sentido literal das palavras é mais importante, e a estrutura contribui mais para o significado. A prosa é mais fácil de analisar do que a poesia, mas ainda é muitas v
programas
O significado de um programa de computador é exato e literal, e pode ser inteiramente entendido pela análise de seus tokens e de sua estrutura.
Aqui vão algumas sugestões para a leitura de programas (e de outras linguagens formais). Primeiro, lembre-se que linguagens formais são muito mais densas do que linguag demorado lê-las. A estrutura, também, é muito importante, logo, geralmente não é uma boa idéia ler de cima para baixo, da esquerda para a direita. Em vez disso, aprenda a cabeça, identificando os tokens e interpretando a estrutura. Finalmente, os detalhes são importantes. Pequenas coisas como erros ortográficos e má pontuação, com as quai linguagens naturais, podem fazer uma grande diferença em uma linguagem formal.
1.5 O primeiro programa
Tradicionalmente, o primeiro programa escrito em uma nova linguagem de programação é chamado de ?Alô, Mundo!? porque tudo que ele faz é apresentar as palavras ?Alô assim:
print ?Alô, Mundo!?
Isto é um exemplo de um comando print , o qual na realidade não ?imprime? nada em papel. Ele apresenta o valor na tela. Neste caso, o resultado são as palavras:
Alô, Mundo!
As aspas no programa marcam o começo e o fim do valor; elas não aparecem no resultado final.
Algumas pessoas julgam a qualidade de uma linguagem de programação pela simplicidade do programa ?Alô, Mundo!?. Por este padrão, Python se sai tão bem quanto é poss
1.6 Glossário
solução de problemas ( problem solving )
O processo de formular um problema, encontrar uma solução e expressar esta solução.
linguagem de alto nível ( high-level language )
Uma linguagem de programação como Python que é projetada para ser fácil para seres humanos lerem e escreverem.
linguagem de baixo nível ( low-level language )
Uma linguagem de programação que é concebida para ser fácil para um computador executar; também chamadas de "linguagem de máquina" ou "linguagem assembl montagem)
portabilidade ( portability )
Característica de um programa que roda em mais de um tipo de computador.
interpretar ( interpret )
Executar um programa escrito em uma linguagem de alto nível traduzindo-o uma linha de cada vez.
compilar ( compile )
Traduzir todo um programa escrito em uma linguagem de alto nível para uma de baixo nível de um só vez, em preparação para uma execução posterior.
código fonte ( source code )
Um programa em uma linguagem de alto nível, antes de ter sido compilado.
código objeto ( object code )
A saída do compilador, depois que ele traduziu o programa.
executável ( executable )
Um outro nome para código objeto que está pronto para ser executado.
script
Um programa guardado em um arquivo (normalmente um que será interpretado).
programa ( program )
Um conjunto de instruções que especifica uma computação.
algoritmo ( algorithm )
Um processo geral para solução de uma certa categoria de problemas.
bug
Um erro em um programa.
depuração ( debugging )
O processo de encontrar e remover qualquer um dos três tipos de erros de programação.
sintaxe ( syntax )
A estrutura de um programa.
erro de sintaxe ( syntax error )
Um erro em um programa que torna impossível a análise sintática (logo, também impossível a interpretação).
Capítulo 3: Funções Capítulo 4: Condicionais e recursão 4.1 O operador módulo 4.2 Expressões booleanas 4.3 Operadores lógicos 4.4 Execução condicional 4.5 Execução alternativa 4.6 Condicionais encadeados 4.7 Condicionais aninhados 4.8 A instrução return 4.9 Recursividade 4.10 Diagramas de pilha para funções recursivas 4.11 Recursividade infinita 4.12 Entrada pelo teclado 4.13 Glossário Capítulo 4: Condicionais e recursão 4.1 O operador módulo 4.2 Expressões booleanas 4.3 Operadores lógicos 4.4 Execução condicional 4.5 Execução alternativa 4.6 Condicionais encadeados 4.7 Condicionais aninhados 4.8 A instrução return 4.9 Recursividade 4.10 Diagramas de pilha para funções recursivas 4.11 Recursividade infinita 4.12 Entrada pelo teclado 4.13 Glossário Capítulo 5: Funções frutíferas 5.1 Valores de retorno 5.2 Desenvolvimento de programas 5.3 Composição 5.4 Funções booleanas 5.5 Mais recursividade 5.6 Voto de confiança (Leap of faith) 5.7 Mais um exemplo 5.8 Checagem de tipos 5.9 Glossário Capítulo 5: Funções frutíferas 5.1 Valores de retorno 5.2 Desenvolvimento de programas 5.3 Composição 5.4 Funções booleanas 5.5 Mais recursividade 5.6 Voto de confiança (Leap of faith) 5.7 Mais um exemplo 5.8 Checagem de tipos 5.9 Glossário Capítulo 6: Iteração Capítulo 6: Iteração Capítulo 7: Strings Capítulo 7: Strings Capítulo 8: Listas Capítulo 8: Listas Capítulo 9: Tuplas Capítulo 9: Tuplas Capítulo 10: Dicionários Capítulo 10: Dicionários Capítulo 11: Arquivos e exceções Capítulo 11: Arquivos e exceções Capítulo 12: Classes e objetos Capítulo 12: Classes e objetos Capítulo 13: Classes e funções Capítulo 13: Classes e funções Capítulo 14: Classes e métodos Capítulo 14: Classes e métodos Capítulo 15: Conjuntos de objetos Capítulo 15: Conjuntos de objetos Capitulo 16: Herança Capitulo 16: Herança Capítulo 17: Listas encadeadas Capítulo 18: Pilhas Capítulo 18: Pilhas Capítulo 19: Filas Capítulo 19: Filas Capítulo 20: Árvores Capítulo 20: Árvores
2.1 Valores e tipos
O valor (por exemplo, letras e números) é uma das coisas fundamentais que um programa manipula. Os valores que já vimos até agora foram o 2 (como resultado, quando Mundo!".
Esses valores pertencem a tipos diferentes: 2 é um inteiro, e "Alô, Mundo!" é uma string , assim chamada porque "string", em inglês, quer dizer seqüência, série, cadeia "série de letras". Você (e o interpretador) consegue identificar strings porque elas aparecem entre aspas.
O comando print também funciona com inteiros:
print 4 4
Se você estiver em dúvida sobre qual é o tipo de um determinado valor, o interpretador pode revelar:
type("Alô, Mundo!") <type 'string'> type(17) <type 'int'>
Nenhuma surpresa: strings pertencem ao tipo string e inteiros pertencem ao tipo int. Menos obviamente, números com um ponto decimal pertencem a um tipo chamado são representados em um formato chamado ponto flutuante [1]:
type(3.2) <type 'float'>
[1] N.T.: Observe o uso de ponto no lugar da vírgula para separar a parte inteira da parte fracionária.
O que dizer de valores como "17" e "3.2"? Eles parecem números, mas estão entre aspas, como strings:
type("17") <type 'string'> type("3.2") <type 'string'>
Eles são strings.
Ao digitar um número grande, é tentador usar pontos entre grupos de três dígitos, assim: 1.000.000. Isso não funciona porque Python usa o ponto como separador decimal inglês, resulta numa expressão válida, mas não no número que queríamos representar:
print 1,000, 1 0 0
Não é nada do que se esperava! Python interpreta 1,000,000 como uma tupla, algo que veremos no Capítulo 9. Por hora, lembre-se apenas de não colocar vírgulas nos núm
2.2 Variáveis
Uma das características mais poderosas de uma linguagem de programação é a habilidade de manipular variáveis. Uma variável é um nome que se refere a um valor.
O comando de atribuição cria novas variáveis e dá a elas valores:
mensagem = "E aí, Doutor?" n = 17 pi = 3.
Este exemplo faz três atribuições. A primeira atribui a string "E aí, Doutor?" a uma nova variável chamada mensagem. A segunda dá o valor inteiro 17 a n, e a terceir flutuante 3.14159 à variável chamada pi.
Uma maneira comum de representar variáveis no papel é escrever o nome delas com uma seta apontando para o valor da variável. Esse tipo de figura é chamado de diagram que estado cada variável está (pense nisso como o estado de espírito da variável). O diagrama a seguir mostra o resultado das instruções de atribuição:
XXXfigura pg.
O comando print também funciona com variáveis:
print mensagem E aí, Doutor? print n 17 print pi
Em cada um dos casos, o resultado é o valor da variável. Variáveis também têm tipo; novamente, podemos perguntar ao interpretador quais são eles:
type(mensagem) <type 'string'> type(n) <type 'int'> type(pi) <type 'float'>
O tipo de uma variável é o tipo do valor ao qual ela se refere.
mensagem = "E aí, Doutor?" mensagem 'E aí, Doutor?' print mensagem E aí, Doutor?
Quando Python exibe o valor de uma expressão, usa o mesmo formato que você usaria para entrar com o valor. No caso de strings, isso significa que as aspas são incluídas [ imprime o valor da expressão, que, neste caso, é o conteúdo da string.
Num script , uma expressão sozinha é um comando válido, porém sem efeito. O script :
17
"Alô, Mundo!" 1 + 1
não produz qualquer saída. Como você mudaria o "script" para exibir os valores destas quatro expressões?
2.6 Operadores e operandos
Operadores são símbolos especiais que representam computações como adição e multiplicação. Os valores que o operador usa são chamados operandos.
Todas as expressões seguintes são válidas em Python e seus significados são mais ou menos claros:
20+32 hora-1 hora60+minuto minuto/60 52 (5+9)(15-7)
Em Python, os símbolos +, -, / e o uso de parênteses para agrupamento têm o mesmo significado que em matemática. O asterisco (*) é o símbolo para multiplicação e ** é o
Quando um nome de variável aparece no lugar de um operando, ele é substituído pelo valor da variável, antes da operação ser executada.
Adição, subtração, multiplicação e potenciação fazem o que se espera, mas você pode ficar surpreso com a divisão. A operação seguinte tem um resultado inesperado:
minuto = 59 minuto/ 0
O valor de minuto é 59 e, em aritmética convencional, 59 dividido por 60 é 0,98333, não 0. A razão para a discrepância é que Python está realizando uma divisão inteira.
Quando ambos os operandos são inteiros, o resultado tem de ser também um inteiro e, por convenção, a divisão inteira sempre arredonda para baixo, mesmo em casos com está muito próximo:
minuto*100/ 98
De novo, o resultado é arredondado para baixo, mas agora pelo menos a resposta é aproximadamente correta. A alternativa é usar a divisão em ponto flutuante, o que verem
2.7 Ordem dos operadores
Quando mais de um operador aparece em uma expressão, a ordem de avaliação depende das regras de precedência. Python segue as mesmas regras de precedência para a matemática. O acrônimo PEMDAS é uma maneira prática de lembrar a ordem das operações:
Parênteses têm a mais alta precedência e podem ser usados para forçar uma expressão a ser avaliada na ordem que você quiser. Já que expressões entre parênteses sã (3-1) é 4, e (1+1)(5-2) é 8. Você também pode usar parênteses para tornar uma expressão mais fácil de ler, como em (minuto * 100) / 60 , ainda que iss Exponenciação ou potenciação tem a próxima precedência mais alta, assim 21+1 é 3 e não 4, e 313 é 3 e não 27. Multiplicação e Divisão têm a mesma precedência, que é mais alta do que a da Adição e da Subtração, que também têm a mesma precedência. Assim 23-1 dá 5 em ve (lembre-se de que na divisão inteira, 2/3=0). Operadores com a mesma precedência são avaliados da esquerda para a direita. Assim, na expressão minuto100/60, a multiplicação acontece primeiro, resultando transforma produzindo 98. Se as operações tivessem sido avaliadas da direita para a esquerda, o resultado poderia ter sido 591, que é 59 , que está errado.
2.8 Operações com strings
De maneira geral, você não pode executar operações matemáticas em strings, ainda que as strings se pareçam com números. O que segue é inválido (assumindo que mensag
mensagem-1 "Alô"/123 mensagem*"Alô" "15"+
Interessante é o operador +, que funciona com strings, embora ele não faça exatamente o que você poderia esperar. Para strings, o operador + representa concatenação , q operandos ligando-os pelos extremos. Por exemplo:
fruta = "banana" assada = " com canela" print fruta + assada
A saída deste programa é banana com canela. O espaço antes da palavra com é parte da string e é necessário para produzir o espaço entre as strings concatenadas.
O operador * também funciona com strings; ele realiza repetição. Por exemplo, "Legal"*3 é "LegalLegaLegal". Um dos operadores tem que ser uma string; o outro te
Por um lado, esta interpretação de + e * faz sentido pela analogia entre adição e multiplicação. Assim como 43 equivale a 4+4+4, não é de estranhar que "Legal"3 seja "Legal"+"Legal"+"Legal". Por outro lado, uma diferença significativa separa concatenação e repetição de adição e multiplicação. Você saberia mencionar uma propri que não ocorre na concatenação e na repetição?
2.9 Composição
Até agora, vimos os elementos de um programa -- variáveis, expressões, e instruções ou comandos -- isoladamente, sem mencionar como combiná-los.
Uma das características mais práticas das linguagens de programação é a possibilidade de pegar pequenos blocos e combiná-los numa composição. Por exemplo, nós sabe sabemos como exibi-los; acontece que podemos fazer as duas coisas ao mesmo tempo:
print 17 + 3 20
Na realidade, a soma tem que acontecer antes da impressão, assim, as ações não estão na realidade acontecendo ao mesmo tempo. O ponto é que qualquer expressão envolv pode ser usada dentro de um comando print. Você já tinha visto um exemplo disto:
print "Número de minutos desde a meia-noite: ", hora*60+minuto
Esta possibilidade pode não parecer muito impressionante agora, mas você verá outros exemplos em que a composição torna possível expressar computações complexas de m
Atenção: Existem limites quanto ao lugar onde você pode usar certos tipos de expressão. Por exemplo, o lado esquerdo de um comando de atribuição tem que ser um nome de Assim, o seguinte não é válido: minuto+1 = hora.
2.11 Glossário
valor ( value ) Um número ou string (ou outra coisa que ainda vamos conhecer) que pode ser atribuída a uma variável ou computada em uma expressão. tipo ( type ) Um conjunto de valores. O tipo de um valor determina como ele pode ser usado em expressões. Até agora, os tipos vistos são: inteiros (tipo int), números em ponto-fl (tipo string). ponto-flutuante ( floating-point ) Formato para representar números que possuem partes fracionárias. variável ( variable ) Nome que se refere a um valor. comando ( statement ) Trecho de código que representa uma instrução ou ação. Até agora, os comandos vistos foram de atribuição e exibição. atribuição ( assignment ) Comando que atribui um valor a uma variável. diagrama de estado ( state diagram ) Representação gráfica de um conjunto de variáveis e os valores aos quais elas se referem. palavra-chave ( keyword ) Palavra reservada usada pelo compilador para analisar o programa; você não pode usar palavras-chave como if, def, e while como nomes de variáveis. operador ( operator ) Símbolo especial que representa uma computação simples, como adição, multiplicação ou concatenação de strings. operando ( operand ) Um dos valores sobre o qual o operador opera. expressão ( expression ) Combinação de variáveis, operadores e valores, que representa um resultado único. avaliar ( evaluate ) Simplificar uma expressão através da realização de operações, para produzir um valor único. divisão inteira ( integer division ) Operação que divide um inteiro por outro e resulta em um inteiro. A divisão inteira resulta no número de vezes que o numerador é divisível pelo denominador e descarta regras de precedência ( rules of precedence ) O conjunto de regras que governa a ordem em que expressões envolvendo múltiplos operadores e operandos são avaliadas. concatenar ( concatenate ) Juntar dois operandos lado a lado. composição ( composition ) Habilidade de combinar expressões e comandos simples em expressões e comandos compostos, de forma a representar computações complexas de forma concisa. comentário ( comment ) Informação em um programa dirigida a outros programadores (ou qualquer pessoa que esteja lendo o código fonte) e que não tem efeito na execução do programa.
System Message: INFO/1 (
Duplicate implicit target name: "capítulo 2: variáveis, expressões e comandos".
Tópicos
Capítulo 1: O caminho do programa Capítulo 1: O caminho do programa Capítulo 2: Variáveis, expressões e comandos 2.1 Valores e tipos 2.2 Variáveis 2.3 Nomes de variáveis e palavras reservadas 2.4 Comandos 2.5 Avaliando expressões 2.6 Operadores e operandos 2.7 Ordem dos operadores 2.8 Operações com strings 2.9 Composição 2.11 Glossário
Capítulo 8: Listas Capítulo 9: Tuplas Capítulo 9: Tuplas Capítulo 10: Dicionários Capítulo 10: Dicionários Capítulo 11: Arquivos e exceções Capítulo 11: Arquivos e exceções Capítulo 12: Classes e objetos Capítulo 12: Classes e objetos Capítulo 13: Classes e funções Capítulo 13: Classes e funções Capítulo 14: Classes e métodos Capítulo 14: Classes e métodos Capítulo 15: Conjuntos de objetos Capítulo 15: Conjuntos de objetos Capitulo 16: Herança Capitulo 16: Herança Capítulo 17: Listas encadeadas Capítulo 18: Pilhas Capítulo 18: Pilhas Capítulo 19: Filas Capítulo 19: Filas Capítulo 20: Árvores Capítulo 20: Árvores
2.1 Valores e tipos
System Message: INFO/1 (
Duplicate implicit target name: "2.1 valores e tipos".
O valor (por exemplo, letras e números) é uma das coisas fundamentais que um programa manipula. Os valores que já vimos até agora foram o 2 (como resultado, quando Mundo!".
Esses valores pertencem a tipos diferentes: 2 é um inteiro, e "Alô, Mundo!" é uma string , assim chamada porque "string", em inglês, quer dizer seqüência, série, cadeia "série de letras". Você (e o interpretador) consegue identificar strings porque elas aparecem entre aspas.
O comando print também funciona com inteiros:
print 4 4
Se você estiver em dúvida sobre qual é o tipo de um determinado valor, o interpretador pode revelar:
type("Alô, Mundo!") <type 'string'> type(17) <type 'int'>
Nenhuma surpresa: strings pertencem ao tipo string e inteiros pertencem ao tipo int. Menos obviamente, números com um ponto decimal pertencem a um tipo chamado são representados em um formato chamado ponto flutuante [4]:
type(3.2) <type 'float'>
[3] N.T.: Observe o uso de ponto no lugar da vírgula para separar a parte inteira da parte fracionária.
O que dizer de valores como "17" e "3.2"? Eles parecem números, mas estão entre aspas, como strings:
type("17") <type 'string'> type("3.2") <type 'string'>
Eles são strings.
Ao digitar um número grande, é tentador usar pontos entre grupos de três dígitos, assim: 1.000.000. Isso não funciona porque Python usa o ponto como separador decimal inglês, resulta numa expressão válida, mas não no número que queríamos representar:
print 1,000, 1 0 0
Não é nada do que se esperava! Python interpreta 1,000,000 como uma tupla, algo que veremos no Capítulo 9. Por hora, lembre-se apenas de não colocar vírgulas nos núm
2.2 Variáveis
System Message: INFO/1 (
Duplicate implicit target name: "2.2 variáveis".
Uma das características mais poderosas de uma linguagem de programação é a habilidade de manipular variáveis. Uma variável é um nome que se refere a um valor.
O comando de atribuição cria novas variáveis e dá a elas valores:
mensagem = "E aí, Doutor?" n = 17 pi = 3.
Este exemplo faz três atribuições. A primeira atribui a string "E aí, Doutor?" a uma nova variável chamada mensagem. A segunda dá o valor inteiro 17 a n, e a terceir flutuante 3.14159 à variável chamada pi.
Uma maneira comum de representar variáveis no papel é escrever o nome delas com uma seta apontando para o valor da variável. Esse tipo de figura é chamado de diagram que estado cada variável está (pense nisso como o estado de espírito da variável). O diagrama a seguir mostra o resultado das instruções de atribuição:
XXXfigura pg.
O comando print também funciona com variáveis:
print mensagem E aí, Doutor? print n 17 print pi
Em cada um dos casos, o resultado é o valor da variável. Variáveis também têm tipo; novamente, podemos perguntar ao interpretador quais são eles:
type(mensagem) <type 'string'> type(n)
<type 'int'>
type(pi) <type 'float'>
O tipo de uma variável é o tipo do valor ao qual ela se refere.
2.3 Nomes de variáveis e palavras reservadas
System Message: INFO/1 (
Duplicate implicit target name: "2.3 nomes de variáveis e palavras reservadas".
Os programadores geralmente escolhem nomes significativos para suas variáveis -- eles documentam para o quê a variável é usada.
Nomes de variáveis podem ser arbitrariamente longos. Eles podem conter tanto letras quanto números, mas têm de começar com uma letra. Embora seja válida a utilização convenção, não usamos. Se você o fizer, lembre-se de que maiúsculas e minúsculas são diferentes. Bruno e bruno são variáveis diferentes.
O caractere para sublinhado ( _ ) pode aparecer em um nome. Ele é muito utilizado em nomes com múltiplas palavras, tal como em meu_nome ou preco_do_cha_na_ch
Se você der a uma variável um nome inválido, causará um erro de sintaxe:
76trombones = "grande parada" SyntaxError: invalid syntax muito$ = 1000000 SyntaxError: invalid syntax class = "Ciencias da Computacao 101" SyntaxError: invalid syntax
76trombones é inválida porque não começa com uma letra. muito$ é inválida porque contém um caractere ilegal, o cifrão. Mas o que está errado com class?
Ocorre que class é uma das palavras reservadas em Python. Palavras reservadas definem as regras e a estrutura da linguagem e não podem ser usadas como nomes de
Python tem 29 palavras reservadas:
and def exec if not return assert del finally import or try break elif for in pass while class else from is print yield continue except global lambda raise
Pode ser útil ter essa lista à mão [#]_. Se o interpretador acusar erro sobre um de seus nomes de variável e você não souber porquê, veja se o nome está na lista.
[4] N.T.: esta lista pode ser obtida através do próprio interpretador Python, com apenas dois comandos:
System Message: WARNING/2 (
Literal block expected; none found.
import keyword print keyword.kwlist
2.4 Comandos