Baixe o app para aproveitar ainda mais
Prévia do material em texto
PDF gerado usando o pacote de ferramentas em código aberto mwlib. Veja http://code.pediapress.com/ para mais informações. PDF generated at: Fri, 06 Dec 2013 10:38:13 UTC Python Conteúdo Páginas Introdução 1 Instalação 2 Conceitos básicos 4 Interpretador interativo 4 Análise léxica 7 Indentação 8 Compilador de Byte 9 Variáveis e identificadores 9 Comentários e docstrings 10 Tipos e operadores 12 Estrutura dos blocos 15 Estrutura de dados 16 Funções 19 Módulos 20 Erros e exceções 21 Classes 23 Encapsulamento 25 Herança e polimorfismo 26 Python Avançado 27 Bibliotecas padrão 28 Bibliotecas externas 29 Programação com GUI 30 Tkinter 34 Python Wikipedia Bot 34 Referências 35 Referências Fontes e Editores da Página 36 Fontes, Licenças e Editores da Imagem 37 Licenças das páginas Licença 38 Introdução 1 Introdução Voltar para a página inicial. Em 1991, o matemático Guido van Rossum criou a linguagem de programação Python, escreveu na documentação oficial da linguagem um breve histórico do início do seu desenvolvimento. Conta que no final de 1990 nos laboratórios do CWI, foi criado o Python como uma linguagem de scripts para o Sistema Operacional Distribuído Amoeba. Evolucionada da linguagem ABC, que tinha um foco para usuários como físicos, engenheiros e lingüistas, ela nasce para ser uma linguagem para os leigos em computação também a utilizarem. Em 1995, continuando o trabalho na CNRI nos Estados Unidos e depois em 2000 na BeOpen.com, formando a BeOpen PythonLabs. Em outubro do mesmo ano, a PythonLabs mudou para Digital Creations, atualmente chama-se Zope Corporation3. Em 2001, a Python Software Foundation4 foi formada, uma organização não-comercial criada especificamente para trabalhar com propriedade intelectual do software. A Zope Corporation é um membro-patrocinador da PSF até hoje. Conta também que o nome “Python” teve a sua origem no grupo humorístico do cinema britânico Monty Python, criador do programa Monty Python Flying Circus. A linguagem foi pensada e estruturada para o ensino de programação, então ela teria que conter uma compreensão simples da estrutura para o fácil aprendizado e é isso que o Python apresenta, uma linguagem interpretada, de alto-nível e orientada a objeto. Sua sintaxe é simples e elegante, ideal para scripts e desenvolvimento de aplicações rápidas, RAD. Guido van Rossum em entrevista para BeOpen.com disse que "o difícil é criar uma linguagem que faça tanto sentido para outro ser humano quanto faz para uma máquina ler”, é costume em palestras sobre a linguagem dizer que “o que se pensa, escreve”. Próxima Instalação 2 Instalação Voltar para a página inicial. Microsoft Windows • Python já vem instalado com o OpenOffice.org, e o executável python.exe encontra-se no mesmo diretório que os demais aplicativos. • O download da última versão do software python para windows pode ser feita pelo site http:/ / www. python. org, através do link http:/ / www. python. org/ ftp/ python/ 2. 6. 1/ python-2. 6. 1. msi, para a versão 2.6.1, ou se preferir a versão 3.0 use este link: http:/ / www. python. org/ ftp/ python/ 3. 0/ python-3. 0. msi. •• A instalação é a padrão, abra o arquivo e vá clicando em avançar. •• Após a instalação, clique em: Iniciar / Programas / Python.2.X / IDLE e, Você deverá estar com uma janela de prompt aberta parecida com esta: Python 2.6.1 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. >>> Para que aconteça, digite no prompt de comando: c:\python26\python.exe Essa informação diz ao prompt de comando para executar o arquivo Python.exe (um programa) e diz o endereço onde esse arquivo está c:\ é a partição, ou o disco rígido, python26\ é a pasta onde o arquivo python.exe se encontra. UNIX / Linux Geralmente as distribuições UNIX/Linux já vem com o interpretador Python, por exemplo, no Kurumin Linux basta clicar no menu K → Desenvolvimento → Python. Mas caso não tiver instale com, por exemplo, Debian Linux, e entre no shell como superusuário e digite: localhost:~$ su Password: [senha] localhost:~# apt-get install python Reading Package Lists... Done Building Dependency Tree... Done ... ... •• Teste: localhost:~$ python Python 2.3.1 (#1, Jan 22 2005, 12:14:47) [GCC 3.3.2 20030908 (Debian prerelease)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> •• Source Instalação 3 Ou da maneira mais comum, caso sua distribuição Linux não possua um método de tratamento de pacotes/atualizações, pelo código fonte: Baixe a versão que desejar: http:/ / www. python. org/ ftp/ python/ 3. 0/ Python-3. 0. tgz http:/ / www. python. org/ ftp/ python/ 2. 6. 1/ Python-2. 6. 1. tgz Depois descompacte: $ tar -zxvf Python-3.0.tgz Torne-se superusuário: $ su Senha: Faça a pré-configuração: # ./configure Antes de prosseguir veja se não apareceu alguma mensagem indicando algum erro. Caso não exista nenhum erro, prossiga digitando: # make Neste caso pode ocorrer alguns avisos, como esse: "INFO: Can't locate Tcl/Tk libs and/or headers", avisando que não conseguiu localizar as bibliotecas para Tcl/Tk, caso o make não localize isso não poderá usar o modulo tkinter, usado na construção de interfaces básicas. Se não achou nenhum erro é só iniciar a instalação: # make install ou # make altinstall A primeira situação é normal, mas a segunda consta na documentação da linguagem, recomendado para quem quer mais que uma versão na mesma máquina, sem que esta última seja a versão padrão. Macintosh Assim como em sistemas Linux, já vem instalado em sistemas Mac OS X, mas indico aqui os links: •• Mac OS X 10.3 (Panther) http:/ / www. python. org/ ftp/ python/ 2. 4. 3/ Universal-MacPython-2. 4. 3-2006-04-07. dmg •• Mac OS X 10.3.9 ou 10.4 (Tiger) http:/ / www. pythonmac. org/ packages/ •• Mac OS X 10.5 (Leopard) Neste caso leia as instruções neste wiki em inglês: http:/ / wiki. python. org/ moin/ MacPython/ Leopard •• Mac OS X 10.6 (Snow Leopard) Conteúdo do site da Apple indica que virá instalado e versão 2.6, foi localizado no site Softpedia para a versão 3.0: http:/ / mac. softpedia. com/ get/ Developer-Tools/ Python-X. shtml Obs.: Mas antes de instalar qualquer versão do Python, teste (digitando python no console, como dito antes), porque na maioria dos sistemas operacionais (o MS Windows é uma exceção), já está instalado por padrão. Próxima Conceitos básicos 4 Conceitos básicos Voltar para a página inicial. •• Conceitos básicos •• Interpretador interativo •• Análise léxica •• Endentação •• Compilador de Byte •• Variáveis e identificadores •• Comentários e docstrings •• Tipos e operadores •• Estrutura dos blocos •• Estruturas de dados •• Funções •• Módulos •• Erros e exceções •• Classes •• Encapsulamento •• Herança e polimorfismo Próxima: Interpretador interativo Interpretador interativo Voltar para a página inicial. O interpretador interativo é uma característica diferencial da linguagem, porque há a possibilidade de testar e modificar funções antes de incluí-las nos programas. Isso pertime um grau de aprendizado relativamente alto em relação às outras linguagens. Por essa e outras característica é que Python é uma linguagem intuitivamente fácil de se aprender. Invocando o Interpretador: No Linux: Simplesmente abra um terminal e digite: $ python No Windows: Se instalado corretamente, vá no prompt do DOS e digite: python Caso o executável python.exe esteja instalado em algum lugar diferente (por exemplo, o OpenOffice.org inclui o python.exe, mas ele não fica disponível para o DOS), deve-se indicar o path completo. Por exemplo: "c:\Arquivos de programas\BrOffice.org 3\program\python.exe" (as aspas são necessárias por causado péssimo hábito de criarem-se diretórios com espaços em branco e caracteres não-ASCII no nome). Em qualquer caso, você verá o interpretador funcionando, como abaixo: Interpretador interativo 5 Python 2.3.3 (#1, Jan 22 2005, 12:14:47) [GCC 2.95.4 20011002 (Debian prerelease)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 1+1 2 >>> >>> a = 1+1 >>> print a 2 >>> É possível imprimir informações formatadas, este assunto será tratado mais adiante, em Python/Conceitos básicos/Tipos e operadores, mas apenas como ilustração, seguem dois exemplos, que devem ser familiares para quem conhece a função printf da linguagem C: >>> print "O fatorial de %d e' %d\n" % (5, 120) O fatorial de 5 e' 120 >>> print "%s nasceu em %d\n%s nasceu em %d\n" % ("Adao", -4700, "Abel", -4600) Adao nasceu em -4700 Abel nasceu em -4600 >>> Para terminar o interpretador e voltar ao sistema operacional, digite: >>> quit() ou >>> exit() Aprendendo a se virar Um dos fatores mais importantes na hora de se aprender uma nova linguagem de programação, é a de conhecer os recursos que ela pode nos oferecer, tais como seus módulos (conjunto de funções e classes que facilitam a vida do programador na hora de reutilizar códigos), sua sintaxe, suas funções nativas e estruturas de dados. Se, por exemplo, após desbravar vários tutoriais por aí, você se lembra que você ouviu falar de um módulo chamado "os", mas não sabe ao certo o que ele faz... O Interpretador Python oferece um recurso muito interessante, que ajuda na hora de saber um pouco da documentação de módulos, funções e classes. Digite do interpretador: >>> help() Você verá que aparecerá outro símbolo à esquerda do cursor, no lugar do ">>>" help> Tente digitar 'os' para se lembrar as funcionalidades que esse módulo nos fornece: help> os Interpretador interativo 6 Help on module os: NAME os - OS routines for Mac, DOS, NT, or Posix depending on what system we're on. FILE /usr/lib/python2.4/os.py MODULE DOCS http:/ / www. python. org/ doc/ current/ lib/ module-os. html DESCRIPTION This exports: - all functions from posix, nt, os2, mac, or ce, e.g. unlink, stat, etc. - os.path is one of the modules posixpath, ntpath, or macpath - os.name is 'posix', 'nt', 'os2', 'mac', 'ce' or 'riscos' . . . (etc...) A documentação do módulo aparecerá no prompt. Tente experimentar isso com outros módulos, funções e classes que você ouvir por aí! Para sair do modo de documentação, pressione "q". Para sair do modo "help>", digite "q" e dê enter. Curiosidade: Saiba mais sobre a filosofia Python digitando no interpretador: >>> import this Carregando linhas de código Muitos dos exemplos deste livro são escritos para serem digitados, linha a linha, no interpretador. Mas, obviamente, esta não é a melhor forma de entrar com programas. Um programa python escrito em um arquivo local, digamos, arquivo.py, pode ser carregado pelo interpretador através de: import arquivo As variáveis (incluindo-se aqui funções, classes, estruturas, constantes, etc) definidas em arquivo.py tornam-se imediatamente acessíveis ao interpretador usando-se arquivo.nome. Por exemplo, crie o seguinte arquivo e chame-o de fatorial.py: def fat(n): if n <= 1: return 1 return fat(n-1) * n Em seguida, entre no interpretador e digite: >>> import fatorial >>> fatorial.fat(5) Análise léxica 7 Análise léxica Voltar para a página inicial. No capítulo 2 do Manual de Referência da Linguagem Python diz que a análise léxica é uma análise do interpretador em sí, os programas são lidos por um parser, que divide o código em tokens. Todo programa é dividido em linhas lógicas que são separadas pelo token NEWLINE ou NOVA LINHA, as linhas físicas são trechos de código divididos pelo caracter ENTER. Linhas lógicas não podem ultrapassar linhas físicas com exceção de junção de linhas, por exemplo: if resultado > 2 \ and 1 <= 5 \ and 2 < 5: print ('Resultado: %f') % (d) ou meses_do_ano = ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'] Para a delimitação de blocos de códigos os delimitadores são colocados em uma pilha e diferenciados por INDENT e DEDENT. Iniciando a pilha com valor 0 (zero) e colocando valores maiores que os anteriores na pilha. Para cada começo de linha, o nível de endentação é comparado com o valor do topo da pilha, se o número da linha for igual ao topo da pilha, a pilha não é alterada, se o valor for maior a pilha recebe o nível de endentação da linha e o nome INDENT (empilhamento) se o nível de endentação for menor, então é desempilhado até chegar a um nível de endentação recebendo o nome DEDENT (desempilhamento) e se não encontrar nenhum valor é gerado um erro de endentação. Abaixo um exemplo de permutação, retirado do capítulo 2.1 sobre Estrutura de linhas na Análise léxica do Manual de Referência da linguagem (Language Reference Manual): def perm(l): NOVA LINHA INDENT if len(l) <= 1: NOVA LINHA INDENT return[1] NOVA LINHA DEDENT r = [ ] NOVA LINHA for i in range(len(l)): NOVA LINHA INDENT s = l[:i] + l[i+1:] NOVA LINHA p = perm(s) NOVA LINHA DEDENT for x in p: NOVA LINHA INDENT r.append(l[i:i+1]+x) NOVA LINHA DEDENT return r Indentação 8 Indentação Voltar para a página inicial. A endentação é uma característica peculiar na linguagem. Enquanto que os blocos são delimitados explicitamente em C, Java e PHP por chaves e em Pascal e Fortran por palavras-chave como then e endif, em Python blocos são delimitados por espaços ou tabulações formando uma endentação visual; não existem símbolos de “abre” e “fecha”. Python requer uma endentação padronizada. Em outras linguagens, como C/C++ ou JavaScript, a endentação não é necessária devido aos delimitadores de blocos, sendo utilizada somente para melhor visualização. Ao se usar um editor de texto comum, é fácil haver erros de endentação, sendo conveniente configurar o editor para a endentação do Python. As IDEs que suportam Python têm, em geral, a função de endentação automática. •• Endentação correta: def valor1(self): try: self.c = input('Primeiro Valor: ') c = self.c return c except: print 'Inválido!' self.valor1() •• Endentação incorreta: def valor1(self): try: self.c = input('Primeiro Valor: ') c = self.c return c except: print 'Inválido!' self.valor1() O código em si está correto para os dois exemplos, mas o analisador léxico irá verificar se, em cada bloco, a endentação e a exdentação estão coerentes. O analisador reconhecerá as diversas palavras-chave e verificará se os blocos estão endentados de acordo com o necessário. Compilador de Byte 9 Compilador de Byte Voltar para a página inicial. Python é uma linguagem de muito alto-nível como já dito, mas ela também pode compilar seus programas para que a próxima vez que o executar não precise compilar novamente o programa, ganhando assim velocidade na execução. Utilizando o interpretador interativo não é necessário a criação do arquivo de Python compilado, os comandos são executados interativamente. Mas ao chamarmos um programa ou um módulo, o interpretador irá verificar a análise léxica, sintática e irá compilar o código de alto-nível e executá-lo, esta é a máquina virtual Python.O código de byte da linguagem também é de alto-nível, ou seja, é mais legível aos seres humanos que o código de byte do C, por exemplo. Para desassemblar um código de byte é utilizado o módulo dis da biblioteca padrão da linguagem. Normalmente o Python trabalha com dois grupos de arquivos: 1. Os módulos do núcleo da linguagem, sua biblioteca padrão e os módulos independentes, criados pelo usuário. 2. No núcleo do interpretador existe o analisador léxico, o analisador sintático que utiliza Estruturas de Objetos (tempo de execução), o Compilador que aloca memória (tempo de execução) e depois do Avaliador de código que modifica o estado atual do programa (tempo de execução), mostrando resultado para o usuário. Variáveis e identificadores Voltar para a página inicial. Variáveis não precisam ser declaradas, mas precisam ser iniciadas antes de serem utilizadas. O nome das variáveis tem que começar com uma letra, não podendo ser espaço e são case sensitive (diferenciam maiúsculas de minúsculas). As variáveis não têm valores fixos, podem receber qualquer tipo de dado como números, strings, funções, classes, etc; recebendo o tipo do conteúdo atual. E também existem os identificadores reservados, que são próprios da linguagem como: Identificadores Função and e assert forçar um tipo para a variável break parar class definição da classe continue continuar def definição de função del deleção de objeto elif não-se else senão except exceção exec executar função finally finalizar função for definição de laço para from importar uma variável dentro de um módulo Variáveis e identificadores 10 global definição de variável global if definição de laço se import importação de módulos externos in em is e lambda funções recursivas not não or ou pass passar para outra função sem executá-la print imprimir na tela raise laço try return retornar objeto try definição de laço tente while definição de laço enquanto Comentários e docstrings Voltar para a página inicial. Há em todas as linguagens de programação a necessidade de documentar uma linha ou um bloco de código para documentar o que serve aquele bloco de código. Em Python comentários são iniciados com #, tudo que estiver depois do # será ignorado pelo interpretador, portanto considerado como comentários, o fechamento do comentário acaba quando acabar a linha do interpretador. As docstrings são mais comumente introduzidas no início de uma classe, de uma função ou no início do programa para definir o escopo do software ou o escopo de métodos, seu símbolo padrão são as três aspas duplas ou simples. Para quem está lendo o código do programa não existe muita diferença (exceto estética) entre comentários e docstrings, mas para o usuário a diferença é marcante, pois uma docstring não ´é ignorada pelo interpretador, mas passa a fazer parte do objeto sobre o qual ela foi definida, podendo ser acessada através do help. Por exemplo, entre com as linhas abaixo. Note que o arquivo não contém nenhum caracter fora do conjunto ASCII padrão (usar acentos pode dar problema no Windows): # # Comentarios: # def fat1(n): # Entre com fat1(n) para calcular o fatorial de n # Exemplo: fat1(5) if (n <= 1) return 1 return n * fat1(n-1) # Comentários e docstrings 11 # Docstrings: # def fat2(n): ''' Entre com fat2(n) para calcular o fatorial de n Exemplo: fat2(5) ''' if (n <= 1) return 1 return n * fat1(n-1) Após carregar as linhas, vamos fazer alguns testes: >>> fat1(3) >>> fat2(3) Note que, se você escreveu as linhas anteriores em um programa, por exemplo, fatorial.py, e incluiu o programa usando "import fatorial", então é preciso chamar funções através de fatorial.fat1(3) e fatorial.fat2(3), respectivamente. Para ver como funciona a docstring, entre agora com: >>> help(fat1) >>> help(fat2) Note que não existe documentação para fat1, mas fat2 tem a documentação escrita na docstring. Tipos e operadores 12 Tipos e operadores Voltar para a página inicial. Python é uma linguagem de tipos dinâmicos, ou seja, não é necessário fazer casting como em Java, Pascal ou C. Objetos Em Python tudo é objeto. Isso quer dizer que um objeto do tipo string, por exemplo, tem seus próprios métodos. O conceito de variável é uma associação entre um nome e um valor, mas não é necessário declarar o tipo da variável, portanto, o tipo relacionado a variável pode variar durante a execução do programa isto implica em muitos aspectos no uso da linguagem. Este conceito é chamado em programação de "duck typing" (tipagem do pato) - baseado na expressão, em inglês, devida a James Whitcomb Riley: Quando eu vejo uma ave que caminha como um pato, nada como um pato e grasna como um pato, eu chamo esta ave de "pato"[1] Tipos numéricos Existem 4 tipos numéricos: •• inteiro (int) •• ponto flutuante (float) •• booleano (bool) •• complexo (complex) Suportam adição, subtração, multiplicação e divisão e também podem se relacionar. Mesmo os tipos não sendo declarados explicitamente, eles sempre irão assumir um tipo de dado, abaixo, exemplos de retornos de tipos: •• Tipo inteiro: >>> a = 1 >>> type(a) <type 'int'> Um cuidado que se deve tomar é que o tipo inteiro é de precisão infinita, ou seja, um programador descuidado pode gerar um número inteiro que ocupe toda a memória do computador. Por exemplo, vimos anteriormente o arquivo fatorial.py: # Arquivo fatorial.py def fat(n): if n <= 1: return 1 return fat(n-1) * n Python consegue calcular o fatorial de qualquer inteiro, retornando sempre um inteiro, com precisão total. Os limites são apenas o tempo de processamento e a memória do computador: >>> import fatorial >>> a = fatorial.fat(5) >>> a Tipos e operadores 13 >>> b = fatorial.fat(a) >>> b >>> c = fatorial.fat(b) # nao faça isso!!! >>> c # nem chega aqui •• Tipo ponto flutuante: >>> a = 1.0 >>> type(a) <type 'float'> •• Tipo booleano: >>> a = True >>> type(a) <type 'bool'> •• Tipo complexo: >>> a = 4+3j >>> type(a) <type 'complex'> E eles mudam de tipo dinamicamente por exemplo, a variável a: >>> a = 1 >>> type(a) <type 'int'> >>> a = 1.0 >>> type(a) <type 'float'> >>> Operadores são símbolos que atuam sobre variáveis e valores. Existem: •• Operadores aritméticos (+, -, *, /, %, **, +=, -+, *=, /=, %=, **=): >>> a = 1 >>> b = 2 >>> print a + b 3 ou >>> a = 5 >>> print a**2 25 • Operadores de comparação (>, <, ==, >=, <=, <>, !=, is, in): >>> a = 1 >>> b = 2 >>> a == b False Tipos e operadores 14 >>> print a > b False •• Operadores lógicos (and, or, not): >>> nome = "leonardo" >>> idade = 22 >>> nome == "leonardo" and idade < 23 True •• Operadores de atribuição (=): >>> a = 1 Strings •• Substituição em strings: A substituição em strings acontece com o operador %, para substituir strings usa-se %s, para substituir decimais usa-se %d e para substituir floats usa-se %f. Exemplo simples: print "Bom dia! Hoje e' %02d/%02d/%04d" % (26, 1, 2011) Exemplo, escrevendo a saída formatada em um arquivo: from codecs import * f = open (‘arquivo.txt’, ‘a’, ‘utf-8’ ) f.write (‘ %s ‘ % nome_artigo() ) #A referência %s para strings f.close() Referências [1] Para mais detalhes sobre "duck typing", consulte a Wikipedia em inglês: w:en:Duck typing Estrutura dos blocos 15 Estrutura dos blocos Voltar para a página inicial. Em todas as linguagens de programação existem controles de fluxos de dados, em Python também é o mesmo sentido. Os identificadores pass, break e continue, são instruções muito usadas em controle de fluxos. A instrução condicional if em conjunto com o elif e else: from operadoresif operacao == '+': operação1 = operadores.somar(valor1, valor2) else: operação2 = operadores.diminuir (valor1, valor2) elif: print “Número errado!” Bloco while: >>> indice = 0 >>> while indice <=5: indice = indice + 1 print indice 1 2 3 4 5 6 >>> Obviamente que o bloco acima é um caso onde seria muito natural fazer um loop, especificando a priori quais os valores que o índice deve valer. A forma preferida é usar for. for pega seu parâmetro e percorre uma lista (que será vista no próximo capítulo, ../Estrutura de dados), repetindo o loop para todos seus valores. Como exemplo, o bloco acima pode ser reescrito como: for indice in [1,2,3,4,5]: print indice Será visto no próximo capítulo porque a instrução acima não é equivalente a: for indice in range(5): print indice Estrutura de dados 16 Estrutura de dados Voltar para a página inicial. Em Python existem dois tipos de estruturas de dados: •• Seqüências: são objetos ordenados e finitos •• Dicionários é um conjunto de elementos de mapeamentos indexados por chaves. As seqüências imutáveis são as strings e as tuplas, dois ou mais elementos de qualquer tipo dentro de parênteses e separados por vírgula. Exemplo de sequência com strings: >>> nome = 'leonardo' >>> len(nome) 8 >>> nome.capitalize() 'Leonardo' >>> nome.upper() 'LEONARDO' >>> nome 'leonardo' >>> Dicionários Dicionário é o outro tipo de seqüência que associam objetos. São separados por vírgulas e delimitados por chaves e associados por dois-pontos. >>> dic = {1:'mar', 2:'oceano', 3:'rio'} >>> len(dic) 3 >>> dic.items() [(1, 'mar'), (2, 'oceano'), (3, 'rio')] >>> dic.keys() [1, 2, 3] >>> dic.values() ['mar', 'oceano', 'rio'] Listas As seqüências mutáveis são as listas. Listas são elementos entre colchetes e separados por vírgula. Em outras linguagens chamadas de vetor. >>> lista = [1,2,3] >>> lista2 = [3,4,5] >>> lista.extend(lista2) >>> lista [1, 2, 3, 3, 4, 5] >>> len(lista) 6 Estrutura de dados 17 >>> lista.reverse() >>> lista [5, 4, 3, 3, 2, 1] >>> lista.sort() >>> lista [1, 2, 3, 3, 4, 5] >>> Construção de listas Existem várias formas de gerar listas de números. A mais simples é a função range, que gera uma lista de zero a n-1: >>> range(5) [0, 1, 2, 3, 4] >>> Para gerar uma lista que comece em um ponto arbitrário, passar este ponto como o início da lista: >>> range(10, 13) [10, 11, 12] >>> Caso o valor inicial seja maior ou igual ao valor final, a lista é vazia; listas decrescentes, ou listas que tenham um passo diferente de um podem ser geradas com um terceiro parâmetro: >>> range(5, 0) [] >>> range(10, 6, -2) [10, 8] >>> Uma forma curiosa de gerar estas listas é construir o objeto xrange; na prática, fazer um loop com xrange ou com range dá o mesmo resultado; para mais detalhes, consulte o help (help(xrange)): for indice in xrange(1, 6): print indice Operações com listas Listas podem ser unidas, através de extend. Como a lista é um objeto, usa-se a forma lista.extend(lista2): >>> lista1 = range(2) >>> lista2 = range(2, 4) >>> lista1.extend(lista2) >>> lista1 [0, 1, 2, 3] Listas também podem ser replicadas, usando-se *. Note que esta operação é comutativa: >>> [1, 2] * 3 [1, 2, 1, 2, 1, 2] >>> 3 * [1, 2] [1, 2, 1, 2, 1, 2] >>> Estrutura de dados 18 Pilhas Agora você deve estar se perguntando: "Sim, mas Python só oferece essas Estruturas de Dados?" Você pode não ter reparado, mas podemos utilizar as listas nativas do Python para trabalharmos com outras estruturas, como Pilhas, Filas, Árvores, Listas de Prioridades(Heaps), etc... Utilizando as listas como Pilhas: Pilhas nada mais são do que listas em que a inserção e a remoção de elementos acontece na mesma extremidade. >>> pilha = [10, 20, 30] >>> pilha.pop() 30 >>> pilha [10, 20] >>> pilha.append(50) >>> pilha [10, 20, 50] >>> pilha.append(100) >>> pilha.pop() 100 >>> pilha.pop() 50 >>> pilha [10, 20] >> len(pilha) 2 Utilizando as listas como Filas: Funções 19 Funções Voltar para a página inicial. Funções são blocos de código com nome e argumentos (algumas funções não possuem argumentos), usadas para realizar tarefas. Algumas funções já estão presentes no interpretador, como exemplo a usada no cálculo do seno de um ângulo que está presente na biblioteca math.sin de python. def NOME (argumento1, argumento2, ...): bloco de código Se a função retorna algum valor (linguagens de programação chamam funções que não retornam valor de subrotinas), usa-se a instrução "return valor". Exemplo: def soma(x, y): return x + y Funções podem não ter argumento, neste caso a lista de argumentos será vazia: def hello(): print "Hello, World!" Os argumentos pode vir "nus", ou seguidos de "= valor". No primeiro caso, não passar este argumento para a função dá erro, no segundo caso, o argumento toma, por default, o valor passado. Um cuidado deve ser tomado: se o valor é variável, ele é determinado no momento da definição da função. Por exemplo: >>> indice = 5 >>> def função (argumento = indice): ... print argumento >>> indice = 6 >>> função() 5 >>> print indice 6 Funções sem nome - lambda A vantagem é que podem ser usadas dentro de expressões f = lambda x: x**x a função acima substitui... def f(x): return x**x Funções lambda podem ser divididas em: nome variavel: ações Onde nome sempre será 'lambda', variável pode conter uma ou mais variáveis e ações pode ser uma potência ou referência a uma função matemática tipo Funções 20 import math f = lambda x,y : pow(x,y) Módulos Voltar para a página inicial. Cada arquivo em Python é chamado de módulo. Módulos são um conjunto de códigos como funções, classes, variáveis, etc. Vários módulos podem se comunicar através do comando import módulo. Importando módulos Existem dois modos principais de chamar módulos[1], como: >>>import wx >>>print wx.codificação() utf-8 ou >>>from wx import * >>>print codificação() utf-8 Nos dois modos, é lido o arquivo wx.py. Os dois modos de acesso estão corretos e não geraram erros, o funcionamento seria: procura o módulo e inicializá-o e o outro define o escopo do módulo. No primeiro modo (import modulo) existe um alto acoplamento devido ao modo de acesso ao módulo wx onde é efetuada as duas etapas para cada módulo. As funções (e variáveis) do módulo wx tornam-se disponíveis precedendo seu nome por wx., por exemplo, se em wx.py é definida uma variável A, então esta variável pode ser usada como wx.A. No segundo exemplo (from modulo import *) se ganharia flexibilidade de definir e reimportar todas as funções do módulo wx, incluindo a função codificação(). As funções e variáveis do módulo tornam-se acessíveis sem precisar prepor o wx.. Qual é o melhor método? Um dos principios da linguagem é que There should be one-- and preferably only one --obvious way to do it[2] (numa tradução livre Deve haver um - e apenas um - modo óbvio de fazer isso), e a importação de módulos não é exceção. Como regra geral, deve-se usar import modulo. A principal exceção (há outras, ver a referência ) é quando a própria documentação do módulo recomenda que se use from modulo import * (por exemplo, o tkinter) Módulos disponíveis Os módulos disponíveis estão armazenados na variável sys.modules, para ver quais são é preciso importar o módulo sys: Módulos 21 >>> import sys >>> sys.modules Ver também Python/Bibliotecas padrão. Referências [1] Importing Python Modules, por Fredrik Lundh (http:/ / effbot. org/ zone/ import-confusion. htm), no site effbot.org. Explica as diferenças entre import móduloe from módulo import *, além de um terceiro método não descrito neste tutorial [2] The Zen of Python (http:/ / python. org/ dev/ peps/ pep-0020/ ), site python.org Erros e exceções Voltar para a página inicial. Erros são humanos e sempre ocorrem ao escrevermos programas, sejam simples ou complexos, o modo de como as linguagens de programação nos retornam estes erros é que há mudança. Em Python, podem serem tratados muito elegantemente. O erro do Python é chamado de Traceback que é uma pilha criada quando ocorre a exceção. Guido van Rossum escreveu na documentação oficial que “quando ocorre uma exceção, o interpretador procura por um bloco de tratamento de exceções e então começa a desempilhar cada elemento da pilha de execução. Então desta forma saberemos quantos níveis depois do tratador de erros que houve a exceção”. O que condiz com a explicação do capítulo sobre Análise léxica. Abaixo alguns erros e seus tracebacks: >>> a = [5, 4, 3, 2] >>> print a[5] Traceback (most recent call last): File "<stdin>", line 1, in ? IndexError: list index out of range Há a possibilidade de: >>> a = 'livro' >>> try: ... print a + 1 ... except TypeError, erro: ... print "Um erro ocorreu: %s" % erro Um erro ocorreu: cannot concatenate 'str' and 'int' objects Erros e exceções 22 Erros são bem vindos! Um fato importante sobre o estilo da linguagem Python é que o programa deve, preferencialmente, cometer erros e tratá-los, ao invés de checar se a operação dará erro. Assim, se temos um vetor v de tamanho desconhecido, porém que, normalmente, terá mais de 10 elementos, e queremos modificar (se existir) seu décimo elemento, é possível fazê-lo de duas formas: ... if len(v) >= 10: v[9] = 666 else: print "Erro: v tem menos de dez elementos" ou: ... try: v[9] = 666 except: print "Erro: v tem menos de dez elementos" Considera-se que a segunda forma (EAFP, ou it's easier to ask for forgiveness than permission, frase atribuída a Grace Hopper) é melhor do que a primeira (LBYL, ou look before you leap)[1]. Referências [1] Glossary (http:/ / docs. python. org/ glossary. html), site docs.python.org Classes 23 Classes Voltar para a página inicial. Criamos o objeto classe com “class nome:”, ela é composta de atributos que representam este objeto. Quando a classe é atribuída a outro objeto, este objeto é chamado de instância da classe. Os métodos, que também são definidos para programação orientada a objetos, são funções dentro de uma classe. Todos os métodos ou atributos da classe são obrigados a passar por parâmetro ou argumento a palavra self antes de tudo, isso é convencionado pelo próprio desenvolvedor, por padrão se chama self, o self foi convencionado nos parâmetros dos métodos e atributos devido a filosofia da linguagem de estar tudo explícito, especificar de onde o valor vem. Assim os métodos são chamados objeto.metodo (argumento1, argumento2, ...) são definidos iguais a uma função. Os atributos da classe (ou variável da classe) podem ser instanciados em qualquer lugar da classe, e os atributos de instância (ou variável de instância) devem ser declarados dentro dos métodos utilizando o parâmetro self. class Nó: esquerda, direita, valor = None, None, 0 def __init__(self, valor): # construtor dos valores self.esquerda = None self.direita = None self.valor = valor class Ordenação: def __init__(self): # inicializa a raiz da árvore self.root = None def AdicionaNo(self, valor): return Nó(valor) def Inserir(self, raiz, valor): # inserir novo valor if raiz == None: # não há nenhum valor return self.AdicionaNo(valor) else: # já está na árvore if valor <= raiz.valor: # se os dados forem menores do que os armazenados # entra na sub-árvore do lado esquerdo raiz.esquerda = self.Inserir (raiz.esquerda, valor) else: # entra na sub-árvore do lado direito raiz.direita = self.Inserir (raiz.direita, valor) return raiz Brincando com instância de classe: Classes 24 class A: a = 1 # atributo publico __b = 2 # atributo privado a class A class B(A): __c = 3 # atributo privado def __init__(self): print self.a print self.__c a = A() print isinstance(a, B) # ''Objeto a'' é uma instância da ''classe B''? Falso. a = B() # Instancía o ''objeto a'' na ''classe B'' e imprime os atributos da classe. print isinstance(a, B) # ''Objeto a'' é uma instância da ''classe B''?Verdadeiro. b = B() # Instancía o ''objeto b'' na ''classe B'' e imprime os atributos da classe. print isinstance(b, B) # ''Objeto b'' é uma instância da ''classe B''? Verdadeiro. b = A() # Instancía o ''objeto b'' na ''classe A''. print isinstance(b, A) # ''Objeto b'' é uma instância da ''classe A''? Verdadeiro. Encapsulamento 25 Encapsulamento Voltar para a página inicial. Encapsulamento é a proteção dos atributos ou métodos de uma classe, em Python existem somente o public e o private e eles são definidos no próprio nome do atributo ou método. Atributos ou métodos iniciados por no máximo dois sublinhados e terminados por um sublinhado são privados e todas as outras formas são públicas. class A: a = 1 # atributo publico __b = 2 # atributo privado a class A class B(A): __c = 3 # atributo privado a B def __init__(self): print self.a print self.__c a = A() print a.a # imprime 1 b = B() print b.__b # Erro, pois __b é privado a classe A. print b.__c # Erro, __c é um atributo privado, somente chamado pela classe. print b._B__c # Imprime __c = 3, muito pouco utilizada, mas existe. Herança e polimorfismo 26 Herança e polimorfismo Voltar para a página inicial. Deitel, em "Programando em Java", diz que "quando utilizamos herança para criar uma classe a partir da classe existente, a nova classe herda os atributos e comportamentos dessa classe existente, podendo adicionar atributos e comportamentos para solucionar nossas necessidades". O polimorfismo condiz com a reutilização de código: é fato que ocorrem funções semelhantes em várias partes do software; então definimos estas funções em uma biblioteca, e todas as outras funções que dela precisarem poderão chamá-la sem a necessidade de reescrevê-la. class Pessoa: def __init__(self, nome ='', idade=0): self.nome = nome self.idade = idade def getIdade(self): return self.idade class PessoaCPF(Pessoa): def __init__(self, CPF, nome='', idade=0): Pessoa.__init__(self, nome, idade) self.CPF = CPF a = Pessoa() Pessoa.__init__(a, 'Leonardo', 22) b = PessoaCPF('122.333.332-1', nome='', idade=0) print a.nome # imprime Leonardo print a.idade # imprime 22 print b.CPF # imprime 122.333.332-1 Python Avançado 27 Python Avançado Voltar para a página inicial. List Comprehensions >>> lista = [[1,2,3], [4,5,6], [7,8,9]] >>> print [[r[col] for r in lista] for col in range(len(lista[0]))] [[1, 4, 7], [2, 5, 8], [3, 6, 9]] >>> >>> list_one = [2, 3, 4] >>> list_two = [2*i for i in list_one if i > 2] >>> list_two [6, 8] >>> # somando os números de 1 a 100 :) >>>sum(x for x in xrange(101)) >>>5050 Expresssões regulares Python consegue lidar com expressões regulares usando a biblioteca re[1]. Expressões regulares não podem ser usadas diretamente, é preciso criar uma variável que faça a interpretação das strings. Esta variável é de classe RegexObject. Por exemplo, para se criar uma RegexObject que identifique strings que comecem com a sequência "abc", podemos fazer:>>> import re >>> m = re.compile('^abc*') Exemplo de uso: >>> import re >>> txt = 'Maçã' >>> ER1 = re.compile('[a-z]', re.I) >>> print ER1.sub('.', txt) ..çã >>> ER2 = re.compile(r'\w', re.L) >>> print ER2.sub('.', txt) .... >>> uau = r'((((((((((.))))))))))\10' >>> re.sub(uau, '.', 'zz') Python Avançado 28 Referências [1] Regular Expression HOWTO (http:/ / www. amk. ca/ python/ howto/ regex/ regex. html), por A.M.Kuchling, em www.amk.ca Esta página é somente um esboço. Ampliando-a você ajudará a melhorar o Wikilivros. Bibliotecas padrão Voltar para a página inicial. •• Biblioteca math (funções matemáticas): >>> import math >>> x = 5 >>> math.sqrt(x) 2.2360679774997898 >>> from math import * >>> sin(x) -0.95892427466313845 >>> log(x) 1.6094379124341003 >>> cos(x) 0.28366218546322625 •• Biblioteca Tkinter (GUI padrão) from tkinter import * box = Button(text="Ok", command='exit') box.pack() box.mainloop() •• Biblioteca smtplib (E-mail) import smtplib server = smtplib.SMTP('mail.xx.net') # Envio de e-mail da conta @xy para a conta @xx server.sendmail('leonardo@xy.com', 'leonardo@xx.net', """To: leonardo@xx.net From: leonardo@xy.com Subject: Teste de envio de email Estou lhe enviando este email como um teste. """) server.quit() print 'Envio OK' •• Biblioteca time Bibliotecas padrão 29 Com ela podemos implementar por exemplo um contador, no caso mostrado abaixo o terminal dará uma pausa de 1 segundo entre cada impressão do intervalo "range(5)". >>> import time >>> for i in range(5): print i time.sleep(1) ... 0 1 2 3 4 >>> Bibliotecas externas Voltar para a página inicial. Urllib Um exemplo de uso da biblioteca urllib com leitor de RSS feedparser para o uso na internet. O exemplo abaixo faz o download do módulo feedparser depois faz a leitura do RSS da Últimas Notícias do site Terra [1]. >>> import urllib >>> url = 'http://diveintomark.org/projects/feed_parser/feedparser.py' >>> arq = urllib.urlopen(url) >>> open(‘feedparser.py’, ‘w’).write(arq.read()) >>> import feedparser >>> terra = feedparser.parse('http://rss.terra.com.br/0,,EI1,00.xml') >>> terra.values() [...] >>> Numpy Numpy é uma biblioteca matemática de código aberto para Python, com suporte a matrizes e vetores grandes, além de um grande número de funções matemáticas. O site oficial é http:/ / numpy. scipy. org/ . É importante lembrar que Python possui uma biblioteca matemática padrão, chamada Math. Essa biblioteca precisa ser instalada antes de ser usada, não vem por padrão. O exemplo abaixo mostra o uso da biblioteca Numpy na criação de arrays com valores aleatórios, e a manipulação desses valores. >>> import numpy >>> a = numpy.random.randn(25) #Cria um array com 25 valores aleatórios >>> len(a) #Informa o tamanho do array 25 >>> a #Mostra os valores do array Bibliotecas externas 30 array([-0.97662319, -0.91427827, -0.17596519, -1.07721448, -0.64067605, -1.21453417, -0.508037 , 1.0928856 , -0.4206412 , -0.40750775, -0.83259417, 0.41311712, -0.03811292, -0.41181049, 0.45493473, 0.5168261 , 0.38207838, 1.27969391, -0.91343678, -0.89708382, -0.94028084, 0.33992957, -1.73894293, 0.5228072 , 0.57514934]) >>> a[0:10] #Mostra os valores do array, de 0 até 10 array([-0.97662319, -0.91427827, -0.17596519, -1.07721448, -0.64067605, -1.21453417, -0.508037 , 1.0928856 , -0.4206412 , -0.40750775]) >>> a[0:4]*2 #Multiplicação dos valores 0 até 4 por 2 array([-1.95324639, -1.82855654, -0.35193039, -2.15442897]) >>> Referências [1] http:/ / www. terra. com. br Programação com GUI Voltar para a página inicial. Tkinter Ver artigo principal, Python/Tkinter Baseada em Tcl/Tk, o Tkinter é a interface padrão do Python. from Tkinter import * class App: def __init__(self, master): frame = Frame(master) frame.pack() self.button = Button(frame, text="QUIT", fg="red", command=frame.quit) self.button.pack(side=LEFT) self.hi_there = Button(frame, text="Hello", command=self.say_hi) self.hi_there.pack(side=LEFT) def say_hi(self): print "hi there, everyone!" root = Tk() app = App(root) root.mainloop() Programação com GUI 31 WxPython wxPython é um wrapper da biblioteca wxWindows. from wx import * ID_ABOUT = 101 ID_EXIT = 102 class MyFrame(wx.Frame): def __init__(self, parent, ID, title): wx.Frame.__init__(self, parent, ID, title, wx.DefaultPosition, wx.Size(200, 150)) self.CreateStatusBar() self.SetStatusText("This is the statusbar") menu = wx.Menu() menu.Append(ID_ABOUT, "&About", "More information about this program") menu.AppendSeparator() menu.Append(ID_EXIT, "E&xit", "Terminate the program") menuBar = wx.MenuBar() menuBar.Append(menu, "&File"); self.SetMenuBar(menuBar) class MyApp(wx.App): def OnInit(self): frame = MyFrame(None, -1, "Hello from wx.Python") frame.Show(True) self.SetTopWindow(frame) return True app = MyApp(0) app.MainLoop() PyGTK PyGTK é um wrapper para o Python criado por James Henstridge, construído sobre o GIMP Toolkit (GTK) a biblioteca usada pelo GNOME e muitas outras aplicações para Linux. import gtk class HelloWorld(gtk.Window): def __init__(self): gtk.Window.__init__(self) self.connect("delete_event", gtk.main_quit) self.set_border_width(10) self.set_title("Hello World!") hbox = gtk.HBox() self.add(hbox) Programação com GUI 32 self.button1 = gtk.Button("Button 1") self.button1.connect("clicked", self.button_pressed_cb) hbox.pack_start(self.button1) self.button2 = gtk.Button("Button 2") self.button2.connect("clicked", self.button_pressed_cb) hbox.pack_start(self.button2) def button_pressed_cb(self, button): print "Hello again - %s was pressed" % button.get_label() if __name__ == "__main__": win = HelloWorld() win.show_all() gtk.main() PyQt PyQT é um wrapper da linguagem Python para a biblioteca Qt, que é a base do KDE (ambiente desktop para sistemas operacionais parecidos com unix), como o Linux, por exemplo. O primeiro programa é o tradicional "Hello, world!" ou "Alô, mundo!", e mostra a facilidade de escrever na versão 4 do Qt. #!/usr/bin/env python import sys from PyQt4 import Qt # We instantiate a QApplication passing the arguments of the script to it: a = Qt.QApplication(sys.argv) # Add a basic widget to this application: # The first argument is the text we want this QWidget to show, the second # one is the parent widget. Since Our "hello" is the only thing we use (the # so-called "MainWidget", it does not have a parent. hello = Qt.QLabel("<h2>Hello, World</h2>") # ... and that it should be shown. hello.show() # Now we can start it. a.exec_() Esta é uma versão um pouco mais complicada do "Hello World": import sys from qt import * Programação com GUI 33 class HelloButton(QPushButton): def __init__(self, *args): QPushButton.__init__(self, *args) self.setText("Hello World") class HelloWindow(QMainWindow): def __init__(self, *args): QMainWindow.__init__(self, *args) self.button=HelloButton(self) self.setCentralWidget(self.button) def main(args): app=QApplication(args) win=HelloWindow()win.show() app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()")) app.exec_loop() if __name__=="__main__": main(sys.argv) Pygame Pygame é uma biblioteca multiplataforma construída sobre a SDL permitindo a criação de jogos e programas multimídia. import sys, pygame pygame.init() tam = width, height = 320, 240 vel = [2, 2] pet = 0, 0, 0 tela = pygame.display.set_mode(tam) bola = pygame.image.load("image.png") bolarc = bola.get_rect() tela.fill(pet) tela.blit(bola, bolarc) pygame.display.flip() Tkinter 34 Tkinter Tkinter é uma biblioteca padrão, que acompanha a distribuição oficial de Python. Tkinter é baseada no toolkit Tcl/Tk, da linguagem Tcl. Índice •• Primeiro programa •• Widgets •• Ligando eventos a callbacks Python Wikipedia Bot Voltar para a página inicial. A usabilidade do bot pode ser encontrada no manual do bot escrito na wikipedia em Como usar bots. •• Exemplo simples de chamada do artigo na tela da interface preferida no config.py: >>> >>> import wikipedia >>> site = wikipedia.getSite('pt', 'wikibooks') >>> artigo = wikipedia.Page(site, 'Python') >>> texto = artigo.get() >>> gui = wikipedia.ui.editText(texto) ... Referências 35 Referências Voltar para a página inicial. • Site Oficial da Linguagem Python [1] • Documentação oficial [2] • ActiveState Python Cookbook [3] • Java vs. Python por Steve Ferg [4] • Arquitetura Python [5] • Dive into Python por Mark Pilgrin [6] • Comunidade brasileira de Python [7] • Python na Prática por Christian Reis [8] •• [news:comp.lang.python Notícias da news:comp.lang.python] • How to Think Like a Computer Scientist: Learning with Python [9] Referências [1] http:/ / www. python. org [2] http:/ / docs. python. org/ [3] http:/ / aspn. activestate. com/ ASPN/ Cookbook/ Python [4] http:/ / www. ferg. org/ projects/ python_java_side-by-side. html [5] http:/ / wiki. cs. uiuc. edu/ cs427/ PYTHON [6] http:/ / diveintopython. org [7] http:/ / www. pythonbrasil. com. br [8] http:/ / www. async. com. br/ projects/ pnp/ pnp [9] http:/ / greenteapress. com/ thinkpython/ Fontes e Editores da Página 36 Fontes e Editores da Página Introdução Fonte: http://pt.wikibooks.org/w/index.php?oldid=186089 Contribuidores: Adriano Moreira, Helder.wiki, LeonardoG, Marcos Antônio Nunes de Moura, The fabio, 3 edições anónimas Instalação Fonte: http://pt.wikibooks.org/w/index.php?oldid=233163 Contribuidores: Albmont, Andrikmb, Jonas AGX, Jorge Morais, LeonardoG, Voyeg3r, Wbrito, 7 edições anónimas Conceitos básicos Fonte: http://pt.wikibooks.org/w/index.php?oldid=186074 Contribuidores: Andrikmb, LeonardoG Interpretador interativo Fonte: http://pt.wikibooks.org/w/index.php?oldid=234265 Contribuidores: Albmont, Andrikmb, Jonas AGX, LeonardoG, The fabio, 5 edições anónimas Análise léxica Fonte: http://pt.wikibooks.org/w/index.php?oldid=186075 Contribuidores: Jonas AGX, LeonardoG, 2 edições anónimas Indentação Fonte: http://pt.wikibooks.org/w/index.php?oldid=186084 Contribuidores: Albmont, Edudobay, Jorge Morais, LeonardoG, The fabio, 2 edições anónimas Compilador de Byte Fonte: http://pt.wikibooks.org/w/index.php?oldid=186078 Contribuidores: João Jerónimo, LeonardoG, 1 edições anónimas Variáveis e identificadores Fonte: http://pt.wikibooks.org/w/index.php?oldid=186088 Contribuidores: João Jerónimo, LeonardoG Comentários e docstrings Fonte: http://pt.wikibooks.org/w/index.php?oldid=186077 Contribuidores: Albmont, LeonardoG Tipos e operadores Fonte: http://pt.wikibooks.org/w/index.php?oldid=208370 Contribuidores: Albmont, Franprarod, LeonardoG, 1 edições anónimas Estrutura dos blocos Fonte: http://pt.wikibooks.org/w/index.php?oldid=197931 Contribuidores: Albmont, LeonardoG Estrutura de dados Fonte: http://pt.wikibooks.org/w/index.php?oldid=197933 Contribuidores: Albmont, LeonardoG, 1 edições anónimas Funções Fonte: http://pt.wikibooks.org/w/index.php?oldid=200920 Contribuidores: Ademarsv, Albmont, Jonas AGX, LeonardoG, Voyeg3r, 1 edições anónimas Módulos Fonte: http://pt.wikibooks.org/w/index.php?oldid=186086 Contribuidores: Albmont, LeonardoG Erros e exceções Fonte: http://pt.wikibooks.org/w/index.php?oldid=186079 Contribuidores: Albmont, LeonardoG Classes Fonte: http://pt.wikibooks.org/w/index.php?oldid=186076 Contribuidores: Albmont, LeonardoG, 1 edições anónimas Encapsulamento Fonte: http://pt.wikibooks.org/w/index.php?oldid=210338 Contribuidores: Albmont, Jorge Morais, LeonardoG, 3 edições anónimas Herança e polimorfismo Fonte: http://pt.wikibooks.org/w/index.php?oldid=186083 Contribuidores: Albmont, Edudobay, LeonardoG Python Avançado Fonte: http://pt.wikibooks.org/w/index.php?oldid=234263 Contribuidores: Albmont, Dante Cardoso Pinto de Almeida, Jonas AGX, LeonardoG, Marcos Antônio Nunes de Moura, 4 edições anónimas Bibliotecas padrão Fonte: http://pt.wikibooks.org/w/index.php?oldid=234264 Contribuidores: Albmont, Jonas AGX, LeonardoG, 1 edições anónimas Bibliotecas externas Fonte: http://pt.wikibooks.org/w/index.php?oldid=229324 Contribuidores: Albmont, Jonas AGX, LeonardoG, Voyeg3r Programação com GUI Fonte: http://pt.wikibooks.org/w/index.php?oldid=218922 Contribuidores: Albmont, Jorge Morais, LeonardoG, Lou cai, Marcos Antônio Nunes de Moura, 4 edições anónimas Tkinter Fonte: http://pt.wikibooks.org/w/index.php?oldid=207814 Contribuidores: Albmont Python Wikipedia Bot Fonte: http://pt.wikibooks.org/w/index.php?oldid=186092 Contribuidores: LeonardoG Referências Fonte: http://pt.wikibooks.org/w/index.php?oldid=186093 Contribuidores: Helder.wiki, LeonardoG, OsvaldoGago Fontes, Licenças e Editores da Imagem 37 Fontes, Licenças e Editores da Imagem Imagem:Rekopis chopin.jpg Fonte: http://pt.wikibooks.org/w/index.php?title=Ficheiro:Rekopis_chopin.jpg Licença: Public Domain Contribuidores: Andreagrossmann, Kevyn, Maire, Man vyi, Niki K, Subitosera, Tsca Licença 38 Licença Creative Commons Attribution-Share Alike 3.0 //creativecommons.org/licenses/by-sa/3.0/
Compartilhar