Introdução à Programação Python e Tk

6.303 visualizações

Publicada em

Lâminas para um curso de Python e Tk

Publicada em: Tecnologia
0 comentários
5 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
6.303
No SlideShare
0
A partir de incorporações
0
Número de incorporações
39
Ações
Compartilhamentos
0
Downloads
348
Comentários
0
Gostaram
5
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Introdução à Programação Python e Tk

  1. 1. 1 Introdu¸˜o ` Programa¸˜o em Python e ca a ca Tk Carlos A. P. Campani 22 de abril de 2005
  2. 2. 2 Copyright c 2005 Carlos A. P. Campani. ´ E garantida a permiss˜o para copiar, distribuir e/ou a modificar este documento sob os termos da Licen¸a de c Documenta¸ao Livre GNU (GNU Free Documentation c˜ License), Vers˜o 1.2 ou qualquer vers˜o posterior a a publicada pela Free Software Foundation; sem Se¸oes c˜ Invariantes, Textos de Capa Frontal, e sem Textos de Quarta Capa. Uma c´pia da licen¸a ´ inclu´ na se¸ao o c e ıda c˜ intitulada ”GNU Free Documentation License”. veja: http://www.ic.unicamp.br/~norton/fdl.html.
  3. 3. ˆ REFERENCIAS 3 Referˆncias e [1] Catunda, Marco Python: guia de consulta r´pida, Ed. a Novatec, 2001. [2] Python Documentation Index. http://www.python.org/doc/. [3] Lundh, Fredrik An Introduction to Tkinter, 1999. http://www.pythonware.com/library/tkinter/ an-introduction-to-tkinter.pdf
  4. 4. ˆ REFERENCIAS 4 Links (Python Language Website) http://www.python.org (Python Resources) http://www.vex.net/parnassus/ (Tcl/Tk Site) http://www.tcl.tk
  5. 5. ˆ REFERENCIAS 5 Material do Curso (Lˆminas do curso) a http://www.ufpel.tche.br/~campani/laminas.pdf (Lˆminas para Impress˜o) a a http://www.ufpel.tche.br/~campani/laminas4.ps.gz (Programas exemplo) http://www.ufpel.tche.br/~campani/FileDialog.tar.gz http://www.ufpel.tche.br/~campani/swpackage.tar.gz
  6. 6. ˆ REFERENCIAS 6 Programas • Python 2.1; • Tk 8; • Python-tkinter 2.1; • vi; • emacs; • gnuplot e m´dulo Gnuplot; o
  7. 7. ˆ REFERENCIAS 7 • Numeric 2.0; • MySQL 3; • Python-MySQLdb; • XFreeGL (OpenGL)/ Mesa3D; • PyOpenGL 2. • PIL 1.1.5
  8. 8. ˆ REFERENCIAS 8 Obtendo os Programas • Pacotes rpm ou tarball; • Bin´rio (pr´-compilado) ou source (tem que compilar); a e • P´ginas oficiais dos programas; a • Distribui¸˜es Linux; co • http://rpmfind.net; • http://sourceforge.net.
  9. 9. ˆ REFERENCIAS 9 Instalando os Programas em Linux Instalando pacotes rpm: $ su <senha de root> % rpm -i <arquivo pacote> % ^D $ Compilando o fonte: $ su <senha de root> % cd <diret´rio do fonte> o % ./configure % ./make % ./make install
  10. 10. 1 OBJETIVOS DO CURSO 10 1 Objetivos do Curso • Introduzir a linguagem Python para alunos que j´ a saibam programar; • Mostrar, de forma introdut´ria, aspectos avan¸ados o c de Python, tais como scripts para web, acesso a MySQL, suporte a audio e OpenGL; • Introduzir o toolkit Tk e mostrar como desenvolver rapidamente aplica¸˜es baseadas em janelas co usando-o.
  11. 11. 2 CARACTER´ ISTICAS DE PYTHON 11 2 Caracter´ ısticas de Python • Criada por Guido van Rossum em 1991; • Evolu¸ao do C c˜ • Linguagem de script e linguagem de programa¸ao; c˜ – Exemplos de linguagens de script: Tcl, Perl, etc. – Objetivo: substituir C e Java; • Interpretada e interativa; • Multiplataforma: Unices, Windows e Mac (no Linux ´ pr´-instalado); e e • Possui suporte a POO;
  12. 12. 2 CARACTER´ ISTICAS DE PYTHON 12 • Estruturas de controle e de dados avan¸adas (mais c poderosas que C e Java); – Lista encadeada e tabela hash como primitivas da linguagem; – Tratamento de erros de execu¸˜o; ca • Dispensa BEGIN e END (obriga a endenta¸ao e a c˜ estrutura¸˜o do programa); ca • Tipagem dinˆmica (n˜o ´ necess´rio declarar a a e a vari´veis); a • Combinados, os ultimos trˆs itens significam que os ´ e programas em Python s˜o muito menores e mais a “limpos” que os equivalentes em C e Java;
  13. 13. 2 CARACTER´ ISTICAS DE PYTHON 13 • Mais verifica¸˜es de erros de sintaxe/execu¸ao que C; co c˜ • Modular (organiza o namespace); from Tkinter import * root = Tk() ou import Tkinter root = Tkinter.Tk() • Ideal para prototipa¸ao r´pida de aplica¸oes; c˜ a c˜ • Gr´ficos em janelas usando-se m´dulo Tkinter; a o • Pode ser extendida usando-se C e C++ (escrevendo-se novos m´dulos); o
  14. 14. 2 CARACTER´ ISTICAS DE PYTHON 14 • Profiling; • Programa¸˜o cient´ ca ıfica (NumPy e Gnuplot); • Computa¸˜o gr´fica (PyOpenGL); ca a • Acesso ao servidor MySQL (Python-MySQLdb); • Linguagem de Cola (glue language); Exemplo: vocˆ pode usar em FORTRAN aquele e pacote gr´fico que s´ funciona em C; a o • Scripts CGI (usando-se m´dulo CGI); o ´ • Finalmente: E software livre!
  15. 15. 3 ´ TEORIA VERSUS PRATICA 15 3 Teoria Versus Pr´tica a • “Aprender a sintaxe de uma linguagem n˜o ´ tudo”; a e • Metodologia de desenvolvimento de software; – M´todos sistem´ticos; e a – Redu¸ao de problemas; c˜ – Herdar resultados; – Semˆntica formal; a • Teoria e pr´tica andam juntas. a
  16. 16. 4 USANDO O INTERPRETADOR 16 4 Usando o Interpretador 4.1 Usando o Interpretador - Modo Interativo $ python Python 2.1 (#1, jul 4 2001, 23:56:02) [GCC 2.95.3 200110315 (release) (conectiva)] on linux-i386 Type "copyright", "credits" or "license" for more information. >>>
  17. 17. 4 USANDO O INTERPRETADOR 17 Control-D abandona o interpretador. >>> ^D $
  18. 18. 4 USANDO O INTERPRETADOR 18 >>> 2+2 4 >>> 2+ File "<stdin>", line 1 2+ ^ SyntaxError: invalid syntax >>> # Este ´ um coment´rio e a ... 2*2 4 >>> 7/3 2 >>> 7./3. 2.3333333333333335 Observe o prompt secund´rio ... a
  19. 19. 4 USANDO O INTERPRETADOR 19 >>> 1/0 Traceback (most recent call last): File "<stdin>", line 1, in ? ZeroDivisionError: integer division or modulo by zero >>> print "Esta ´ uma linha extremamente e ... longa que foi dividida." Esta ´ uma linha extremamente longa que foi dividida. e >>>
  20. 20. 4 USANDO O INTERPRETADOR 20 Aten¸˜o! ca • Atribui¸ao: =; c˜ • Igualdade: ==. (inspirado em C)
  21. 21. 4 USANDO O INTERPRETADOR 21 >>> a = 10 >>> a 10 >>> a += 1 >>> a 11 >>> b = c = 0 >>> a,b = b,a >>> a 0 >>> b 11 >>> c 0
  22. 22. 4 USANDO O INTERPRETADOR 22 >>> x = 15 >>> x 15 >>> x = 3.1415 >>> x 3.1415000000000002 Lembre-se: Tipagem dinˆmica! a
  23. 23. 4 USANDO O INTERPRETADOR 23 >>> print "Ol´, mundo!" a Ol´, mundo! a >>> x = 15 >>> print x+1,x-1,2*x,x/2 16 14 30 7 >>> print "x=%d"%x x=15 >>> y = 1.5 >>> print "x=%dny=%4.2f"%(x,y) x=15 y=1.50
  24. 24. 4 USANDO O INTERPRETADOR 24 >>> z = "x=%dny=%4.2f"%(x,y) >>> print z x=15 y=1.50 >>> print "x=";print x x= 15 >>> print "x=",;print x x= 15
  25. 25. 4 USANDO O INTERPRETADOR 25 >>> if 1: print "verdadeiro" ... verdadeiro >>> if 0: print "verdadeiro" ... >>> Observa¸˜es: co • Valores-verdade: 0 e 1; • ... ´ o prompt secund´rio. e a
  26. 26. 4 USANDO O INTERPRETADOR 26 >>> if x<10: ... print x, ... print "menor" ... else: ... print x, ... print "maior" ... 15 maior >>> Observa¸˜es: co • Observe o prompt secund´rio ao final da estrutura; a • N˜o misturar espa¸os e tabula¸oes em um mesmo a c c˜ bloco (erro!).
  27. 27. 4 USANDO O INTERPRETADOR 27 Tupla: >>> x=(1,2,3) >>> x[0] 1 >>> x[1] 2 >>> x[-1] 3 >>> x[-2] 2 >>>
  28. 28. 4 USANDO O INTERPRETADOR 28 Lista encadeada: >>> x = [1,2,3] >>> x [1,2,3] >>> x[0] = 10 >>> x [10,2,3] >>> x+[4,5] [10,2,3,4,5] >>> x [10,2,3] >>> x.append(1000) [10,2,3,1000]
  29. 29. 4 USANDO O INTERPRETADOR 29 >>> x [10,2,3,1000] >>>
  30. 30. 4 USANDO O INTERPRETADOR 30 String: >>> x = "Gr^mio FBPA" e >>> y = " - o maior de todos" >>> print x+y Gr^mio FBPA - o maior de todos e Fun¸˜o: ca >>> x = float >>> x <built-in function float> >>> x(2) 2.0
  31. 31. 4 USANDO O INTERPRETADOR 31 Binding: amarra¸ao entre nomes e valores em um c˜ namespace. Sempre que ocorre uma atribui¸˜o, ocorre uma ca amarra¸ao entre vari´vel e valor. c˜ a >>> a = a+1 A ocorrˆncia de a a esquerda da atribui¸ao ´ uma e c˜ e referˆncia ao objeto (L-value). Observe que tudo em e Python s˜o objetos, inclusive n´meros. A ocorrˆncia de a a u e a direita da atribui¸˜o (R-value) deve ser de-referenciada. ca
  32. 32. 4 USANDO O INTERPRETADOR 32 Valor 15 X Namespace “Tipo do valor e n˜o tipo da vari´vel (nome)”. a a
  33. 33. 4 USANDO O INTERPRETADOR 33 >>> x = 3 >>> y = 3 >>> print x==y # sim, pois tem o mesmo valor 1 >>> print x is y # sim, pois n´meros iguais sempre s~o o mesmo objeto u a 1 >>> x = [1,2] >>> y = [1,2] >>> print x==y # sim, pois s~o iguais a 1 >>> print x is y # n~o, pois s~o objetos (estruturas) diferentes a a 0 >>> x = y = [1,2] >>> print x==y # sim, pois s~o iguais a 1 >>> print x is y # sim, pois s~o o mesmo objeto (mesma estrutura) a 1
  34. 34. 4 USANDO O INTERPRETADOR 34 >>> x[0] = 10 >>> print x [10,2] >>> print y # [10,2] , pois s~o o mesmo objeto a [10,2] >>> x = y = 3 >>> x = 10 >>> print x 10 >>> print y # 3 (n~o muda pois ´ outro objeto - n~o estruturado) a e a 3
  35. 35. 4 USANDO O INTERPRETADOR 35 4.2 Usando o Interpretador - Modo Programado 4.2.1 Exemplo: Programa Ol´, mundo a $ vi teste.py <i> #!/usr/bin/python print "Ol´, mundo!" a <esc> :wq $ python teste.py Ol´, mundo! a $ chmod a+x teste.py $ ./teste.py Ol´, mundo! a $
  36. 36. 4 USANDO O INTERPRETADOR 36 4.2.2 Editando os Programas ´ vi E encontrado em qualquer sistema Unix; reconhece programas Python e fornece alguma ajuda atrav´s de cores nos comandos; e
  37. 37. 4 USANDO O INTERPRETADOR 37
  38. 38. 4 USANDO O INTERPRETADOR 38 emacs Editor encontrado em qualquer instala¸˜o Linux; reconhece ca programas Python e permite executar o programa dentro do pr´prio editor. o
  39. 39. 4 USANDO O INTERPRETADOR 39
  40. 40. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 40 5 Programa¸˜o B´sica Python ca a 5.1 Identificadores Exemplos: x, a10, carlos campani Observa¸˜o: x = X ca
  41. 41. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 41 5.2 N´ meros u Decimal: 15 Hexadecimal: 0x1f Octal: 020 Inteiro longo: 15L, 0x1fL, 020L Ponto flutuante: 327.2, 0., .33333, 2.01e-10 Complexos: 3+2j
  42. 42. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 42 >>> a = 3+2j >>> b = complex(1,0) >>> print a+b (4+2j) >>> a.real 3.0 >>> a.imag 2.0 >>>
  43. 43. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 43 5.3 Strings >>> print ’ol´’ a ol´a >>> print "’Machado de Assis’ ´ o nome de um grande escritor" e ’Machado de Assis’ ´ o nome de um grande escritor e >>> print ’"´rico Ver´ssimo" ´ o nome de um grande escritor’ E ı e "´rico Ver´ssimo" ´ o nome de um grande escritor E ı e >>> print "Eis uma aspa: "." Eis uma aspa: ". >>> frase = "Esta ´ a primeira linha.nE esta ´ a segunda!" e e >>> print frase Esta ´ a primeira linha. e E esta ´ a segunda! e >>>
  44. 44. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 44 Caracteres de escape: Escape Significado " aspas n nova linha <XXX> ASCII caracter octal x<XXX> ASCII caracter hexadecimal u<XXXX> Unicode
  45. 45. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 45 Para n˜o considerar os caracteres de escape use “r” antes da string: a >>> print "PrimeironSegundo" Primeiro Segundo >>> print r"PrimeironSegundo" PrimeironSegundo Suporte ao padr˜o Unicode: a >>> print u"Ol´, mundo!" a Ol´, mundo! a
  46. 46. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 46 Algumas opera¸oes sobre strings: c˜ >>> print "Ol´, "+"mundo" # concatena¸~o a ca Ol´, mundo a >>> print "Python"*2 # repeti¸~o ca PythonPython >>> print "Python"[0] # indexa¸~o ca P >>> print "Python"[-2] # indexa¸~o para tr´s ca a o >>> print "Python"[1:4] # particionar yth
  47. 47. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 47 5.4 Operadores • Operadores aritm´ticos: e Operador Descri¸ao c˜ + adi¸ao c˜ - subtra¸˜o ca * multiplica¸ao c˜ / divis˜o a % resto da divis˜o a ** exponencia¸ao c˜ x = x+y pode ser substituido por x += y. Isto funciona para todos os operadores aritm´ticos. e
  48. 48. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 48 • Operadores l´gicos: o Operador Descri¸ao c˜ and e l´gico o or ou l´gico o not nega¸ao c˜ S˜o considerados valores falsos em Python: None, 0, a 0.0, () ou [] (seq¨ˆncia vazia) e {} (dicion´rio ue a vazio). Todo o resto ´ considerado verdadeiro. e
  49. 49. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 49 • Compara¸˜es: co Operador Descri¸ao c˜ > maior < menor == igual >= maior ou igual <= menor ou igual <> ou != diferente is mesmo objeto in est´ contido a
  50. 50. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 50 >>> if ’a’ in [’a’,’b’,’c’]: ... print "contido" ... contido
  51. 51. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 51 • Operadores de bits: Operador Descri¸ao c˜ | ou ^ ou exclusivo & e << desloca para a esquerda >> desloca para a direita ~ nega¸ao c˜
  52. 52. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 52 Exemplos: >>> 3 | 4 7 >>> 3 & 4 0 >>> 4 << 1 8 >>> 4 << 2 16 >>> ~3 -4
  53. 53. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 53 5.5 Sequˆncias e Dicion´rios e a • Seq¨ˆncias: strings, tuplas e listas; ue Exemplos: – Tupla: (1,2,3); Observa¸˜o: () ´ a tupla vazia e (1,) ´ uma ca e e tupla com um elemento. – Lista: [1,2,3]; Observa¸˜o: [] ´ a lista vazia. ca e
  54. 54. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 54 Opera¸˜es com seq¨ˆncias: co ue Operador Descri¸˜o ca x in s pertinˆncia e x not in s n˜o pertinˆncia a e s1 + s2 concatena¸ao c˜ s*n s concatenado n vezes s[i] indexa¸˜o ca s[i:j] particionar len(s) tamanho da seq¨ˆncia ue min(s) e max(s) menor e maior valor
  55. 55. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 55 Exemplos: >>> x = (10,30,20) >>> print len(x) 3 >>> print max(x) 30 >>> print min(x) 10 >>> print x[0:2] (10,30) >>> x = [1,2,3] >>> print x[0:2] [1,2]
  56. 56. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 56 No particionamento os valores default s˜o o primeiro a elemento e o ultimo respectivamente, de forma que ´ a[:] ´ uma parti¸˜o idˆntica a lista original (foi feita e ca e apenas uma c´pia). o >>> a = b = [1,2,3] >>> c = a[:] >>> a[0] = 15 >>> a [15,2,3] >>> b [15,2,3] >>> c [1,2,3]
  57. 57. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 57 Opera¸˜es com listas: co Operador Descri¸˜o ca s[i]=x e s1[i:j]=s2 substitui¸ao c˜ del s[i:j] remove elementos s.append(x) adiciona elemento s1.extend(s2) adiciona lista s.count(x) conta n´mero de ocorrˆncias u e s.index(x) menor ´ ındice de x
  58. 58. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 58 Opera¸˜es com listas (continua¸˜o) co ca s.insert(i,x) insere na posi¸˜o i ca s.pop(i) ou s.pop() retira elemento (default=−1) s.remove(x) remove elemento x s.reverse() reverte a lista s.sort() ordena lista
  59. 59. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 59 Usando listas como pilhas (´ltimo a entrar ´ o u e primeiro a sair): >>> pilha = [1,2,3] >>> pilha.append(4) >>> pilha [1,2,3,4] >>> pilha.pop() 4 >>> pilha.pop() 3 >>> pilha [1,2]
  60. 60. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 60 Usando listas como filas (o primeiro a entrar ´ o e primeiro a sair): >>> fila = [1,2,3] >>> fila.append(4) >>> fila [1,2,3,4] >>> fila.pop(0) 1 >>> fila.pop(0) 2 >>> fila [3,4]
  61. 61. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 61 Implementando CAR e CDR: >>> s=[1,2,3] >>> s[0] # CAR 1 >>> s[1:] # CDR [2,3]
  62. 62. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 62 • Dicion´rios: S˜o conjuntos de pares chave-valor; a a Exemplos: >>> x={’Carlos’ : ’15-11-1962’, ’Fantomas’ : ’15-11-1960’} >>> x[’Carlos’] ’15-11-1962’
  63. 63. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 63 Opera¸˜es com dicion´rios: co a len(d) tamanho do dicion´rio a d[k] valor da chave k d[k]=x atribui¸ao c˜ del d[k] remove par chave-valor d.clear() apaga todos os elementos d.copy() retorna c´pia do dicion´rio o a d.has_key(k) verdadeiro se a chave existe d.items() retorna lista de todos os elementos
  64. 64. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 64 Opera¸˜es com dicion´rios (continua¸ao) co a c˜ d.keys() lista de todas as chaves d1.update(d2) atualiza todas as chaves d.values() lista de todos os valores
  65. 65. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 65 Exemplo: >>> x[’Fantomas’] = ’10-11-1960’ >>> x.items() [(’Carlos’,’15-11-1962’),(’Fantomas’, ’10-11-1960’)] >>> x.has_key(’Carlos’) 1
  66. 66. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 66 5.6 co ´ Algumas Fun¸˜es Uteis abs(n) Valor absoluto; apply(fun¸˜o,args) Chama uma fun¸˜o com seus ca ca argumentos; Exemplo: >>> def soma(x,y): ... return x+y ... >>> apply(soma,[3,4]) 7 complex(r,i) Cria um n´mero complexo; u
  67. 67. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 67 eval(e) Avalia uma express˜o; a Exemplo: >>> eval("10+5") 15 float(x) Converte string ou inteiro em ponto flutuante; int(x) Converte para inteiro; len(s) Retorna o tamanho de um objeto;
  68. 68. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 68 list(s) Retorna uma lista contendo os elementos de uma seq¨ˆncia; ue Exemplo: >>> list("abc") [’a’,’b’,’c’] >>> list((1,2,3)) [1,2,3] long(x) Converte para inteiro longo; pow(x,y) Calcula xy ;
  69. 69. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 69 range Retorna uma lista contendo uma seq¨ˆncia de ue n´meros; u Exemplo: >>> range(1,6) [1,2,3,4,5] >>> range(0,4) [0,1,2,3] >>> range(2,11,2) [2,4,6,8,10] >>> range(10,5,-1) [10,9,8,7,6]
  70. 70. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 70 raw input(s) Leitura da entrada padr˜o (n˜o formata); a a Exemplo: >>> x = raw_input("x=") x=15 >>> print x 15 >>> y = raw_input() 2003 >>> print y 2003
  71. 71. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 71 str(x) Converte para string; tuple(s) Converte uma seq¨ˆncia para uma tupla; ue Exemplo: >>> tuple("abc") (’a’,’b’,’c’)
  72. 72. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 72 5.7 Estruturas de Controle 5.7.1 if if x>0: print "maior que zero"
  73. 73. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 73 if a>b: print a else: print b Observe endenta¸ao (com brancos ou tabula¸˜es, mas c˜ co sempre coerente).
  74. 74. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 74 Substitui o case/switch. if x<0: print "negativo" elif x==0: print "zero" else: print "positivo" Permite quantos elif forem necess´rios. a
  75. 75. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 75 5.7.2 while Exemplo (fatorial): n,fat = 5,1 while n>1: fat = n*fat n -= 1 print fat Exemplo (Fibonacci): a,b = 0,1 while b<15: print b a,b = b,a+b
  76. 76. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 76 5.7.3 for >>> for i in [1,2,3,4,5]: ... print i ... 1 2 3 4 5 >>>
  77. 77. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 77 >>> for i in range(1,6): ... print i ... 1 2 3 4 5 >>>
  78. 78. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 78 >>> for i in [’Ticiano’,’Jo~o Vitor’,’Luana’]: a ... print i ... Ticiano Jo~o Vitor a Luana
  79. 79. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 79 Muitas vezes ´ necess´rio modificar a lista que est´ sendo e a a usada no la¸o for, o que ´ perigoso pois pode fazer o la¸o c e c perder-se. Nestes casos usa-se uma c´pia obtida por o particionamento. Exemplo (apagar todos os elementos da lista com tamanho maior que 10): >>> s = [’Carlos Campani’,’Marcia’,’Luana’] >>> for i in s[:]: ... if len(i)>10: ... s.remove(i) ... >>> print s [’Marcia’,’Luana’]
  80. 80. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 80 Exemplo (sele¸ao direta): c˜ for i in range(0,len(v)): ind=v[i:].index(min(v[i:])) v[i],v[ind+i]=v[ind+i],v[i]
  81. 81. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 81 Usando lista para construir uma matriz 3 × 3: >>> m = [] >>> for ind in range(0,9): ... m.append(ind*2) ... >>> m [0, 2, 4, 6, 8, 10, 12, 14, 16] >>> i,j = 2,3 >>> m[(i-1)*3+j-1] = 7 # matriz[2,3] = 7 >>> m [0, 2, 4, 6, 8, 7, 12, 14, 16]
  82. 82. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 82 5.7.4 break Interrompe o la¸o mais interior. c Exemplo: achou = 0 for i in s: if i == x: achou = 1 break
  83. 83. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 83 5.7.5 continue Reinicia o la¸o. c Exemplo: for i in s[:]: if len(i) <= 10: continue else: s.remove(i)
  84. 84. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 84 5.7.6 else O else de um la¸o ´ executado quando o la¸o termina c e c normalmente (n˜o pela ocorrˆncia de um break). a e 5.7.7 pass while 1: # espera por Control-C pass
  85. 85. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 85 5.8 Tratamento de Excess˜es o try: trata erros de execu¸ao. c˜ try: bloco except: bloco try: bloco except erro: bloco Erros: ZeroDivisionError, NameError, TypeError, etc.
  86. 86. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 86 Exemplo: x = 0 try: y=1/x except ZeroDivisionError: print "erro"
  87. 87. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 87 Observa¸˜o: except pode receber mais de um erro ca (identificadores de erros separados por v´ ırgulas).
  88. 88. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 88 5.9 Fun¸˜es co def fat(x): if x<2: return 1 else: return x*fat(x-1) >>> print fat(5) 120
  89. 89. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 89 def fat(x): if x: return x*fat(x-1) else: return 1 Observe a utilidade do valor-verdade falso poder ser 0.
  90. 90. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 90 def count(s): # retorna tamanho da seq¨encia u^ if s: return count(s[1:])+1 else: return 0 Observe a utilidade do valor-verdade falso poder ser [], () ou "": podemos usar esta fun¸ao com lista, tupla ou c˜ string.
  91. 91. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 91 Em Python n˜o existem procedimentos, s´ fun¸oes. Se a a o c˜ fun¸ao n˜o retorna nada n˜o ´ necess´rio void. c˜ a a e a def ola(): print "Ol´, mundo" a >>> ola() Ol´, mundo a
  92. 92. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 92 Para declarar uma vari´vel como global use a declara¸˜o a ca global. Exemplo: def teste(): global x x = 15
  93. 93. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 93 Podemos definir valores default para os argumentos de uma fun¸ao: c˜ >>> def teste(x,y=10,z=’Python’): ... print x,y,z ... >>> teste(15) 15 10 Python >>> teste(15,15,’Monty Python’) 15 15 Monty Python >>> teste(1,’A Vida de Brian’,’Monty Python’) 1 A Vida de Brian Monty Python
  94. 94. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 94 Valores default s˜o avaliados dentro do escopo de a defini¸ao e n˜o dinamicamente: c˜ a >>> i = 15 >>> def teste(a=i): ... print a ... >>> i = 10 >>> teste() 15
  95. 95. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 95 Podemos definir fun¸˜es com um n´mero arbitr´rio de co u a argumentos (argumentos excedentes ser˜o transformados a em uma tupla): def fprintf(f,formato,*args): f.write(formato % args)
  96. 96. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 96 Passagem de Parˆmetros: a ´ • E o casamento entre parˆmetros reais e parˆmetros a a formais; • Tipos de Passagem de Parˆmetros: a – Tipo Entrada. Ex: PASCAL (Passagem por Valor – padr˜o); a – Tipo Entrada-Sa´ ıda. Ex: PASCAL (Passagem por Referˆncia – VAR); e – Tipo Sa´ (raro). Ex: Passagem por Resultado; ıda – Em Python todos os argumentos s˜o passados por a referˆncia a objeto (c´pia da referˆncia). e o e
  97. 97. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 97 Para declarar fun¸˜es anˆnimas, Python usa nota¸˜o co o ca lambda: >>> f = lambda x,y : x+y >>> print f(10,15) 25
  98. 98. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 98 Para documentar as fun¸˜es use strings de documenta¸˜o. co ca def ola(): " Esta fun¸ao ´ um exemplo " c~ e pass
  99. 99. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 99 5.10 Programa¸˜o Funcional ca Listas+CAR+CDR+Fun¸oes Anˆnimas=Programa¸ao c˜ o c˜ Funcional
  100. 100. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 100 5.11 Manipula¸˜o de Arquivos ca • Abrir arquivo com f = open(nome,modo) (modo pode ser “r”, “w” ou “r+”; f ´ um descritor); e • Ler arquivo com f.read(); • Escrever no arquivo com f.write(string); • Flush: f.flush(); • Fechar arquivo com f.close().
  101. 101. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 101 Exemplo: >>> f = open("teste.txt","r") >>> x = f.read() >>> f.close()
  102. 102. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 102 5.12 Alguns M´dulos do Python o • Extendem as capacidades do interpretador; • Organizam o namespace; • Podemos definir novos m´dulos em C ou Python, ou o importar m´dulos feitos por outros. o
  103. 103. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 103 sys Acesso `s fun¸˜es do sistema; a co Exemplo: #!/usr/bin/python import sys print sys.argv $ ./teste.py a b c [’teste.py’,’a’,’b’,’c’]
  104. 104. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 104 pickle Convers˜o de objetos em stream bytes (permite a salvar em arquivo qualquer objeto Python); >>> import pickle >>> f = open("teste.pick","w") >>> pickle.dump(("ola",[1,2,3]),f) >>> f.close() >>> f = open("teste.pick","r") >>> print pickle.load(f) (’ola’,[1,2,3]) >>> f.close() >>>
  105. 105. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 105 string Tratamento de strings; >>> import string >>> string.atoi("15") 15 >>> string.strip(" Como vai? ") ’Como vai?’ >>>
  106. 106. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 106 re Trata express˜es regulares; o math Fun¸˜es matem´ticas; co a >>> import math >>> print math.sin(.5) 0.479425538604 random Gera¸˜o de n´meros aleat´rios; ca u o Exemplo: >>> import random >>> print random.random() 0.466429115742
  107. 107. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 107 calendar Calend´rio perp´tuo; a e Exemplo: >>> import calendar >>> print calendar.month(2003,2) February 2003 Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  108. 108. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 108 os Relacionado ao sistema operacional; Exemplo: >>> import os >>> os.system("ls -l") total 3 drwxrwxr-x 2 carlos carlos 4096 Aug 25 20:39 Mail drwxrwxr-x 2 carlos carlos 4096 Feb 17 11:56 docs drwxrwxr-x 2 carlos carlos 4096 Feb 17 21:46 tmp 0 >>>
  109. 109. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 109 os.path Trata caminhos de diret´rios; o Exemplo: >>> import os.path >>> print os.path.abspath(".") /home/carlos Tkinter Acesso ao Tk; signal Intercepta¸ao de eventos ass´ c˜ ıncronos; sockets Interface de rede; thread Cria¸˜o de threads; ca
  110. 110. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 110 gzip Compress˜o e descompress˜o gzip; a a readline GNU readline; zipfile Manuseio de arquivos zip.
  111. 111. 5 ¸˜ ´ PROGRAMACAO BASICA PYTHON 111 5.13 Pydoc Completa documenta¸ao dos m´dulos do Python ao c˜ o estilo das man pages do Unix. $ pydoc sys
  112. 112. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 112 6 Programa¸˜o Orientada a ca Objetos 6.1 Conceitos B´sicos a • A POO surgiu na ´rea de simula¸ao de sistemas e a c˜ interfaces gr´ficas; a • Simula e Smalltalk; • Facilita a programa¸˜o ao fornecer um mecanismo de ca abstra¸˜o de dados que estimula o reuso de c´digo e ca o disciplina os programadores a usar de forma correta o c´digo que ser´ reusado. o a
  113. 113. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 113 Objeto Uma unidade contendo dados e m´todos para e manipular estes dados; Classe Um molde para cria¸˜o de objetos; ca Encapsulamento Os dados e m´todos que manipulam e estes dados est˜o definidos dentro de uma unidade de a c´digo que esconde os detalhes de implementa¸ao o c˜ (abstra¸˜o), permitindo que o programador acesse o ca c´digo atrav´s de uma interface p´blica (ao contr´rio o e u a da implementa¸˜o que ´ privada); ca e Heran¸a Permite o reuso de c´digo atrav´s de um c o e mecanismo de classes e subclasses que s˜o herdadas a das primeiras, criando uma hierarquia;
  114. 114. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 114 Mensagens As chamadas aos m´todos s˜o entendidas e a como envio de mensagens para os objetos (toda a computa¸˜o de um programa ´ entendida como uma ca e seq¨ˆncia de mensagens enviadas de objeto para ue objeto); Polimorfismo Cada operador, entendido como uma mensagem enviada a seus operandos reage segundo o contexto (o objeto que est´ sendo usado); a Instancia¸˜o Criar um objeto a partir de uma classe. ca
  115. 115. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 115 6.2 Programa¸˜o Orientada a Objetos em Python ca • Definindo classes em Python Sem heran¸a: c class nome: bloco Heran¸a simples: c class nome(classe-pai): bloco Heran¸a m´ ltipla (quando existe mais de uma classe-pai): c u class nome(classe-pai-1,classe-pai-2,...): bloco • Definindo m´todos da classe: usa-se def. e • Em Python, podemos documentar as classes usando strings de documenta¸˜o. ca
  116. 116. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 116 • Exemplo: class atomo: def __init__(self,numat,x,y,z): self.numat = numat self.pos = (x,y,z) def simbolo(self): return TabSimbAt[self.numat] def __repr__(self): return "NumAtom=%d X=%d Y=%d Z=%d"%(self.numat, self.pos[0],self.pos[1],self.pos[2]) • Observa¸oes: c˜ – self ´ o pr´prio objeto; e o – init ´ o contrutor da classe; e – repr ´ a rotina de impress˜o. e a
  117. 117. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 117 • Instanciando: >>> atomo = atomo(2,0,1,0) >>> print atomo NumAtom=2 X=0 Y=1 Z=0 >>> print atomo.simbolo() He >>>
  118. 118. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 118 • Polimorfismo: >>> class A: ... def get(self): ... print "Ol´, mundo" a ... >>> class B: ... def get(self): ... print "Python" ... >>> a = A() >>> b = B() >>> a.get() Ol´, mundo a >>> b.get() Python a e b s˜o objetos diferentes e a mensagem .get() reage de forma diferente a em cada um.
  119. 119. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 119 • Observa¸ao: tudo que tiver c˜ na frente ´ privado; e class esconde: def __init__(self,x,y): self.__x = x # x ´ privado e self.y = y # y ´ p´blico e u def impx(self): print self.__x >>> e = esconde(10,15) >>> print e.y 15 >>> e.impx() 10 • M´todo privado: e class teste: def __secreto(self): # m´todo privado e ...
  120. 120. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 120 • Definindo a classe molecula: class molecula: def __init__(self,nome="desconhecida"): self.nome = nome self.listadeatomos = [] def adicatomo(self,atomo): self.listadeatomos.append(atomo) def __repr__(self): s = "" for a in self.listadeatomos: s = s+"%sn"%a return "Nome=%snLista de atomos=n%s"%(self.nome,s) • Instanciando H2 : >>> hidro1 = atomo(1,0,0,0) >>> hidro2 = atomo(1,1,0,0) >>> h2 = molecula("Mol´cula de Hidrog^nio (H2)") e e >>> h2.adicatomo(hidro1) >>> h2.adicatomo(hidro2)
  121. 121. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 121 • Herdando uma classe: class substancia(molecula): def __init__(self,nome,propriedades): molecula.__init__(self,nome) self.propriedades = propriedades def adicatomo(self,atomo): molecula.adicatomo(self,atomo) def __repr__(self): return "Molecula %snPropriedades=%s"%(self.nome, self.propriedades) • Observa¸oes: c˜ – class substancia(molecula): indica que substancia est´ sendo herdada a de molecula (molecula ´ a superclasse, substancia ´ a subclasse); e e – molecula. init (self,nome) significa a chamada do m´todo construtor e pai; – J´ a repr foi totalmente reescrito.
  122. 122. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 122 • Atributo de classe e de instˆncia: a class teste: x = 10 # atributo global (de classe) def __init__(self,n): self.y = n # atributo de inst^ncia a ...
  123. 123. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 123 • Outro exemplo de heran¸a: c class Alimento: def __init__(self,nome,quantidade): self.nome=nome self.quantidade=quantidade def __repr__(self): return "Nome=%snQuantidade=%s"%(self.nome, self.quantidade) class Leite(Alimento): def __init__(self,nome,quantidade,lipideos): Alimento.__init__(self,nome,quantidade) self.lipideos=lipideos class Sucrilhos(Alimento): def __init__(self,nome,quantidade): Alimento.__init__(self,nome,quantidade) self.vitaminas=[] def adicvitamina(self,vitamina,quantidade): self.vitaminas.append((vitamina,quantidade))
  124. 124. 6 ¸˜ PROGRAMACAO ORIENTADA A OBJETOS 124 Alimento N s NNN ssss NNN ysssss NNN N& Leite Sucrilhos
  125. 125. 7 PYTHON AVANCADO ¸ 125 7 Python Avan¸ado c 7.1 M´dulo Gnuplot - Programa¸˜o o ca Cient´ ıfica • M´dulo para acessar o programa externo gnuplot; o • Home page: http://gnuplot-py.sourceforge.net.
  126. 126. 7 PYTHON AVANCADO ¸ 126 import Gnuplot,math x=[] i=0.0 while i<2*math.pi: x.append([i,math.sin(i)]) i+=0.005 g=Gnuplot.Gnuplot() g.title("Seno") g.xlabel("X") g.ylabel("SEN(X)") g.plot(x) raw_input("pressione enter")
  127. 127. 7 PYTHON AVANCADO ¸ 127
  128. 128. 7 PYTHON AVANCADO ¸ 128 import Gnuplot,math x=[] y=[] i=0.0 while i<2*math.pi: x.append([i,math.sin(i)]) y.append([i,math.cos(i)]) i+=0.005 g=Gnuplot.Gnuplot() g.title("Seno/Cosseno") g.xlabel("X") g.ylabel("SEN(X)/COS(X)") g.plot(x,y) raw_input("pressione enter")
  129. 129. 7 PYTHON AVANCADO ¸ 129
  130. 130. 7 PYTHON AVANCADO ¸ 130 7.2 Numerical Python - Programa¸˜o ca Cient´ ıfica • Inclui muitos recursos do Matlab, mas ao contr´rio a deste ´ software livre; e • Multiplataforma; • Manipula¸˜o de matrizes e ´lgebra linear: ca a determinante, invers˜o de matriz, matriz transposta, a multiplica¸ao de matrizes, solu¸˜o de sistemas c˜ ca lineares, autovalores e autovetores, etc. • Home page: http://sourceforge.net/projects/numpy.
  131. 131. 7 PYTHON AVANCADO ¸ 131 Vetores, matrizes, shape e reshape: >>> from Numeric import * >>> from LinearAlgebra import * >>> a = arrayrange(0,2*pi,0.1) >>> print a [0.,0.1,0.2, ... 6.2] >>> sin(a) [0., 0.09983342, ... -0.0830894] >>> a = zero((3,3),Float) >>> print a [[0.,0.,0.], [0.,0.,0.], [0.,0.,0.]]
  132. 132. 7 PYTHON AVANCADO ¸ 132 >>> print a.shape (3,3) >>> reshape(a,(9,)) >>> print a [0.,0.,0.,0.,0.,0.,0.,0.,0.]
  133. 133. 7 PYTHON AVANCADO ¸ 133 Determinante: >>> a = ones((2,2),Float) >>> a = a*10 >>> print a [[10.,10.], [10.,10.]] >>> print determinant(a) 0.0
  134. 134. 7 PYTHON AVANCADO ¸ 134 Autovalores, autovetores e diagonaliza¸ao: c˜ >>> a = array([0,1,.5,.5]) >>> print a [0 1 .5 .5] >>> a = reshape(a,(2,2)) >>> print a [[ 0. 1.] [ .5 .5]] >>> val,vet = eigenvectors(a) >>> vet = transpose(vet) >>> q1 = inverse(vet) >>> dia = identity(n)*val >>> print vet
  135. 135. 7 PYTHON AVANCADO ¸ 135 [[ 0.70710678 -0.89442719] [ 0.70710678 0.4472136 ]] >>> print q1 [[ 0.47140452 0.94280904] [-0.74535599 0.74535599]] >>> print dia [[ 1. -0. ] [ 0. -0.5]]
  136. 136. 7 PYTHON AVANCADO ¸ 136 Multiplica¸ao de matrizes: c˜ >>> x = matrixmultiply(matrixmultiply(vet,dia),q1) >>> print x [[ -6.93618340e-17 1.00000000e-00] [ 5.00000000e-01 5.00000000e-01]]
  137. 137. 7 PYTHON AVANCADO ¸ 137 7.3 Internacionaliza¸˜o ca • M´dulo gettext; o • Acesso ` API GNU-gettext; a • Permite que as mensagens do aplicativo sejam escritas em diversas l´ ınguas, de forma que o usu´rio a possa escolher a l´ ıngua que deseja.
  138. 138. 7 PYTHON AVANCADO ¸ 138 7.4 Extendendo Python usando C e C++ • Escrevendo m´dulos em C ou C++; o • Partes do programa C: 1. Defini¸ao das fun¸oes C; c˜ c˜ 2. Tabela de m´todos; e 3. Fun¸˜o de inicializa¸˜o. ca ca • Todos os objetos Python tem py_ na frente; • PyArg Parse traduz de Python para C; • Py BuildValue traduz de C para Python.
  139. 139. 7 PYTHON AVANCADO ¸ 139 Exemplo: #include "Python.h" static PyObject *py_soma(PyObject *self, PyObject *args) { double a,b,c; PyArg_ParseTuple(args,"dd",&a,&b); c=a+b; return Py_BuildValue("d",c); } static PyMethodDef Somalib_methods[]={ {"soma",py_soma,METH_VARARGS}, {NULL,NULL} };
  140. 140. 7 PYTHON AVANCADO ¸ 140 void initSomalib() { (void) Py_InitModule("Somalib", Somalib_methods); }
  141. 141. 7 PYTHON AVANCADO ¸ 141 Como compilar: cc -I/usr/include/python2.1 -c Somalib.c cc -shared Somalib.o -o Somalib.so
  142. 142. 7 PYTHON AVANCADO ¸ 142 Como Python encontra os m´dulos? o • PYTHONPATH; • Diret´rio corrente; o • /usr/lib/python2.1/site-packages.
  143. 143. 7 PYTHON AVANCADO ¸ 143 Como usar: >>> import Somalib >>> Somalib.soma(10,20) 30 ou >>> from Somalib import * >>> soma(10,20) 30
  144. 144. 7 PYTHON AVANCADO ¸ 144 Outro exemplo: #include "Python.h" static PyObject *py_Imprime(PyObject *self, PyObject *args) { char *str; PyArg_ParseTuple(args,"s",&str); printf("%sn",str); Py_INCREF(Py_None); return Py_None; }
  145. 145. 7 PYTHON AVANCADO ¸ 145 static PyObject *py_Tamanho(PyObject *self, PyObject *args) { char *str; int t; PyArg_ParseTuple(args,"s",&str); t=0; while (str[t]!=0) t++; return Py_BuildValue("i",t); }
  146. 146. 7 PYTHON AVANCADO ¸ 146 static PyMethodDef TrataString_methods[]={ {"Tamanho",py_Tamanho,METH_VARARGS}, {"Imprime",py_Imprime,METH_VARARGS}, {NULL,NULL} }; void initTrataString() { (void) Py_InitModule("TrataString", TrataString_methods); }
  147. 147. 7 PYTHON AVANCADO ¸ 147 Para retornar None: Py_INCREF(Py_None) return Py_None
  148. 148. 7 PYTHON AVANCADO ¸ 148 7.5 Comunica¸˜o com Programas em ca Outras Linguagens (C, FORTRAN, LISP, PROLOG, etc.) • Todo programa pode comunicar-se com Python pelo dispositivo de entrada/sa´ padr˜o; ıda a • Usa-se popen ou popen2 para abrir um pipe com o programa.
  149. 149. 7 PYTHON AVANCADO ¸ 149 #include "stdio.h" main() { int x; scanf("%d",&x); printf("%d",x*2); } $ gcc -o teste.o teste.c
  150. 150. 7 PYTHON AVANCADO ¸ 150 >>> import os >>> f = os.popen("./teste.o","w") >>> f.write("15") >>> f.flush() >>> f.close()
  151. 151. 7 PYTHON AVANCADO ¸ 151 7.6 Profiling Permite determinar que partes do programa s˜o a “gargalos” de tempo e devem ser convertidas para C, aumentando o desempenho do programa de forma mais eficiente.
  152. 152. 7 PYTHON AVANCADO ¸ 152 import random,profile def escolhe(): global nums nums = [] for i in range(1,51): nums.append(int(100*random.random()+1)) def fat(n): if n<2: return 1.0 else: return float(n*fat(n-1)) def main(): global nums escolhe() for i in range(0,50): print nums[i],fat(nums[i]) profile.run(’main()’)
  153. 153. 7 PYTHON AVANCADO ¸ 153 ... 2253 function calls (104 primitive calls) in 0.140 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.100 0.100 <string>:1(?) 1 0.040 0.040 0.140 0.140 profile:0(main()) 0 0.000 0.000 profile:0(profiler) 50 0.000 0.000 0.000 0.000 random.py:154(random) 1 0.010 0.010 0.100 0.100 teste.py:12(main) 1 0.000 0.000 0.000 0.000 teste.py:2(escolhe) 2199/50 0.090 0.000 0.090 0.002 teste.py:7(fat)
  154. 154. 7 PYTHON AVANCADO ¸ 154 7.7 Python e OpenGL • OpenGL permite criar gr´ficos 3D (adiciona depth `s a a coordenadas de um ponto) e efetuar transforma¸oes c˜ de imagem (rota¸ao, transla¸ao, etc.) - home pages: c˜ c˜ http://www.opengl.org e http://pyopengl.sourceforge.net; • Placas gr´ficas aceleram as transforma¸˜es; a co • Criado pela Silicon Graphics (como padr˜o aberto); a Amado pelos produtores de jogos: Quake, Diablo, etc. • Implementa¸ao livre: Mesa3D ( home page: c˜ http://www.mesa3d.org).
  155. 155. 7 PYTHON AVANCADO ¸ 155 Fam´ OpenGL: ılia GL Biblioteca b´sica (comandos primitivos); a GLU Utilit´rios e comandos mais complexos (exemplo: a desenhar cilindro); GLX GL para X-Window; GLUT Caixa de ferramentas com recursos mais sofisticados (exemplo: desenhar esfera);
  156. 156. 7 PYTHON AVANCADO ¸ 156 7.7.1 Exemplo: Programa Esferas from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import *
  157. 157. 7 PYTHON AVANCADO ¸ 157 glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH) glutInitWindowSize(400,400) glClearColor(0.,0.,0.,1.) glutCreateWindow("Esferas") glEnable(GL_LIGHTING) lightZeroPosition = [-5.,2.,-5.,2.] lightZeroColor = [.2,.5,.7,.5] glLightfv(GL_LIGHT0,GL_POSITION,lightZeroPosition) glLightfv(GL_LIGHT0,GL_DIFFUSE,lightZeroColor) glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,0.5) glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,0.03) glEnable(GL_LIGHT0) glutDisplayFunc(display) glutMainLoop()
  158. 158. 7 PYTHON AVANCADO ¸ 158 def display(): glColor3f(1.,1.,1.) glTranslatef(0.,.25,-0.25) glutSolidSphere(.6,100.,5.) glTranslatef(-0.3,-0.6,.5) glutSolidSphere(.4,100.,5.) glutSwapBuffers()
  159. 159. 7 PYTHON AVANCADO ¸ 159
  160. 160. 7 PYTHON AVANCADO ¸ 160 7.8 PIL - Python Imaging Library • Processamento de imagens; • http://www.pythonware.com/products/pil/.
  161. 161. 7 PYTHON AVANCADO ¸ 161 >>> import Image >>> imagem = Image.open("darthmaul2.jpg") >>> print imagem.format, imagem.size, imagem.mode JPEG (1024, 768) RGB >>> imagem.save("darth.gif")
  162. 162. 7 PYTHON AVANCADO ¸ 162 7.9 Usando MySQL • M´dulo Python-MySQLdb; o • Vocˆ precisa de acesso ao servidor MySQL (senha). e
  163. 163. 7 PYTHON AVANCADO ¸ 163 Banco de dados “meu”, tabela “animal”: Nome Data de nascimento Hamster 2003-01-01 Rintintin 1950-11-15 Acar´ a 1994-11-15
  164. 164. 7 PYTHON AVANCADO ¸ 164 >>> import MySQLdb >>> con=MySQLdb.Connection(user="root",passwd= <senha>,db="meu") >>> curs=con.cursor() >>> curs.execute("select * from animal") >>> print curs.fetchall() ((’Hamster’, ’2003-01-01’), (’Rintintin’, ’1950-11-15’), (’Acara’, ’1994-11-15’)) >>> curs.execute("select nome from animal where nascimento>19940101") >>> print curs.fetchall() ((’Hamster’,), (’Acara’,)) >>> curs.execute("select nome from animal where nascimento>19940101 and nome<>’Acara’")
  165. 165. 7 PYTHON AVANCADO ¸ 165 >>> print curs.fetchall() ((’Hamster’,),) >>> curs.close() >>> con.close()
  166. 166. 7 PYTHON AVANCADO ¸ 166 7.10 Python como Linguagem de Cola (Glue Language) • Python consegue comunicar-se com outras linguagens, acessa gnuplot, OpenGL, MySQL etc. • Isto permite imaginar Python como uma “cola” entre estes recursos; • Podemos usar Python para acessar aquele pacote gr´fico maravilhoso, que s´ funciona com C, em um a o programa FORTRAN, ou ent˜o desenhar uma a interface gr´fica usando Tk para um programa a PROLOG (que originalmente n˜o possui suporte a para Tk);
  167. 167. 7 PYTHON AVANCADO ¸ 167 • Um m´dulo que permite Python comunicar-se com o outro programa ´ chamado de wrapper ; e • Podemos usar o swig (http://www.swig.org) para fazer wrappers.
  168. 168. 7 PYTHON AVANCADO ¸ 168 7.11 Scripts CGI • Primeiro instalar o servidor Apache corretamente; • Colocar os scripts no diret´rio cgi-bin criado na o instala¸˜o do servidor; ca • Dar previl´gio de execu¸ao para o script; e c˜ • Dois tipos de forms: POST e GET.
  169. 169. 7 PYTHON AVANCADO ¸ 169 7.11.1 Exemplo: Ol´, mundo a #!/usr/bin/python import cgi print "Content-Type: text/html" print print "<TITLE>CGI teste</TITLE>" print "<H1>Teste</H1>" print "Ol´, mundo!" a
  170. 170. 7 PYTHON AVANCADO ¸ 170 7.11.2 Exemplo: Formul´rio a <HTML> <HEAD> <TITLE>Teste</TITLE> </HEAD> <BODY> <H1>Enquete</H1> <P> Sua prefer^ncia de compra:<P> e <FORM action="http://localhost/cgi-bin/testecgi2.py" method="POST"> <SELECT Name="Prefere"> <OPTION Value="0">Selecione um</OPTION> <OPTION Value="1">Carro</OPTION> <OPTION Value="2">Casa</OPTION> </SELECT> <P> Sal´rio:<P> a <INPUT type="text" name="Valor" size="20"> </P>
  171. 171. 7 PYTHON AVANCADO ¸ 171 Sexo: <INPUT type="radio" name="Sexo" value="homem" checked>Homem <INPUT type="radio" name="Sexo" value="mulher">Mulher</P> <INPUT type="submit" value="Submeter" name="Botao"> </FORM> </BODY> </HTML>
  172. 172. 7 PYTHON AVANCADO ¸ 172 #!/usr/bin/python import cgi print "Content-Type: text/html" print print "<TITLE>CGI teste</TITLE>" form=cgi.FieldStorage() Prefere=form.getvalue("Prefere") Valor=form.getvalue("Valor") Sexo=form.getvalue("Sexo") if Prefere=="0": Preferencia="" elif Prefere=="1": Preferencia="Carro" else: Preferencia="Casa" print "Prefer^ncia: %s<p>"%(Preferencia) e print "Valor: %s<p>"%(Valor) print "Sexo: %s<p>"%(Sexo)
  173. 173. 7 PYTHON AVANCADO ¸ 173 Curiosidade: http://www.google.com GOOGLE=Linux+Python+MySQL
  174. 174. 7 PYTHON AVANCADO ¸ 174 7.12 Suporte a Som M´dulos sunau e wave. o import sunau i=sunau.open("pequeno.au","r") nchannels=i.getnchannels() samplewidth=i.getsampwidth() framerate=i.getframerate() nframes=i.getnframes() comptype=i.getcomptype() compname=i.getcompname() s=i.readframes(nframes) i.close()
  175. 175. 7 PYTHON AVANCADO ¸ 175 o=sunau.open("/dev/audio","w") o.setnchannels(nchannels) o.setsampwidth(samplewidth) o.setframerate(framerate) o.setnframes(nframes) o.setcomptype(comptype,compname) o.writeframes(s) o.close()
  176. 176. 7 PYTHON AVANCADO ¸ 176 7.13 ´ Processamento de Audio - Ecasound Processamento de ´udio em Python/Linux. a http://www.eca.cx/ecasound/
  177. 177. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 177 8 Programa¸˜o Gr´fica usando ca a Tk 8.1 Introdu¸˜o ao Tk ca • Conjunto de widgets projetado por John K. Ousterhout em 1987; • Home page: http://www.tcl.tk. • Tk = Tool kit (como uma biblioteca); • Widget (“coisinha”) ´ um objeto de interface de e usu´rio gr´fica; a a
  178. 178. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 178 • Originalmente projetado para ser usado com Tcl (Toolkit Control Language); • Tcl ´ muito limitado como linguagem; e • Pode ser usada tamb´m com Perl e Python; e • M´dulo Tkinter: interface Python-Tk - orientado a o objetos;
  179. 179. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 179 Como funcionam as chamadas do Tkinter? Seu programa P ython T kinter (P ython) tkinter (C) T k widgets (C e T cl) T k (C) Xlib Problema: a necessidade de acessar Tcl.
  180. 180. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 180 8.2 Usando o Tkinter • Tkinter ´ um wrapper para acessar Tk a partir de e Python; • Um wrapper ´ como uma camada que faz a e comunica¸ao de duas outras. c˜ Tk Tkinter Python
  181. 181. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 181 8.2.1 Alguns Widgets do Tk Label Exibe texto n˜o formatado; a Button Bot˜o (pode-se associar o clique do mouse com a um “callback”); Frame Container retangular usado para colocar uma hierarquia de widgets filhos (n˜o aparece na tela); a Text Texto formatado edit´vel; a Listbox Sele¸˜o de alternativas; ca
  182. 182. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 182 Canvas Exibe objetos gr´ficos (´ um container; pode ser a e usado para criar widgets personalizados); Checkbox Seleciona um valor booleano; Entry Campo de preenchimento de texto; Menu Permite criar os menus de um aplicativo; Scrollbar Barra de rolagem.
  183. 183. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 183 8.2.2 Exemplo: Ol´, mundo a from Tkinter import * root = Tk() lb = Label(root,text=Ol´, mundo!) a lb.pack() root.mainloop()
  184. 184. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 184 from Tkinter import * root = Tk() lb = Label(root,text=Ol´, mundo!) a lb.pack() root.mainloop() Descri¸˜o: ca root = Tk() root ´ o handler do widget ra´ (representa a aplica¸˜o); Tk() ´ o e ız ca e construtor da aplica¸˜o; ca Label observe que o construtor Label recebe o handler do root (widget mestre); Label ´ o widget escravo; e text=texto Op¸ao indicando o texto a ser exibido dentro do widget; c˜ lb Armazena o handler do widget; .pack() M´todo para “empacotar” um widget (exibe na tela); e ´ root.mainloop() E o loop do aplicativo (trata todos os eventos).
  185. 185. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 185
  186. 186. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 186 8.2.3 Exemplo: Ol´, mundo 2 a from Tkinter import * root = Tk() Label(root,text=Ol´, mundo!).pack() a root.mainloop() Observe que n˜o ´ necess´rio armazenar o handler. a e a
  187. 187. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 187 8.2.4 Widget Label: Algumas Op¸˜es co O construtor Label, assim como todos os outros m´todos e construtores de widgets, recebe as op¸oes na forma c˜ chave = valor
  188. 188. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 188 anchor Indica onde o texto ser´ posicionado dentro do a widget; Default ´ CENTER; Outros valores s˜o N, E, e a S, W, NE, NW, etc. background (bg) Cor do fundo; borderwidth (bd) Espessura da borda; font Fonte usado no texto; foreground (fg) Cor do texto exibido dentro do widget; height Altura do widget em linhas de texto; justify Alinhamento do texto: LEFT, CENTER (o default), RIGHT;
  189. 189. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 189 padx Espa¸o extra a direita e a esquerda do widget (em c pixels); pady Espa¸o extra acima e abaixo; c relief Aparˆncia do widget: FLAT (o default), RIDGE, e GROOVE, RAISED, e SUNKEN; text O texto a ser exibido (nova linha com n); width Largura do widget.
  190. 190. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 190 8.2.5 Empacotamento “Empacotar” significa colocar um widget em uma aplica¸ao (determinar sua posi¸˜o em rela¸˜o aos outros c˜ ca ca widgets).
  191. 191. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 191 1. Usando-se .pack() - Cria o layout empacotando widgets dentro de widgets de forma hier´rquica a (widgets mestre e escravo), tratando-os como blocos retangulares; Frame Frame Frame
  192. 192. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 192 Algumas op¸oes: c˜ anchor Posiciona ao empacotar: N, S, W, E, NE, etc. fill Preenche espa¸o dispon´ c ıvel: X, Y ou BOTH; side Posiciona os widgets ao empacotar: LEFT (da esquerda para a direita na ordem em que forem empacotados), RIGHT, TOP, BOTTOM.
  193. 193. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 193 2. Usando-se .grid() - Permite criar layouts baseado em uma grelha bidimensional (como uma tabela); 0 1 0 1
  194. 194. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 194 Algumas op¸oes: c˜ column Indica a coluna da grelha em que ser´ a posicionado o widget (come¸a em 0); c columnspan Caso se queira que o widget ocupe mais de uma coluna (junta c´lulas); e row Indica a linha da grelha (come¸a em 0); c rowspan Junta linhas; sticky Determina como o widget vai ocupar uma c´lula da grelha: N, S, W, E, N+S (ocupa todo o e espa¸o horizontal), E+W (ocupa todo o espa¸o c c vertical), N+E+S+W (preenche todo o espa¸o c dispon´ıvel).
  195. 195. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 195 3. Usando-se .place() - Permite posicionar explicitamente o widget;
  196. 196. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 196 Cuidado! Os empacotadores podem ser usados juntos em uma aplica¸ao, mas n˜o em um mesmo frame. c˜ a
  197. 197. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 197 8.2.6 Binding e Callback (Handler) • “Binding” ´ um mecanismo geral para associar uma e a¸˜o particular do usu´rio (evento) com um ca a comportamento definido espec´ ıfico da aplica¸˜o; ca • “Callback” ´ a chamada do handler; e • “Handler” ´ a fun¸ao/m´todo que responde ao e c˜ e evento.
  198. 198. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 198 8.2.7 M´todos Universais e • S˜o aqueles que existem para todos os widgets; a • Exemplos: .bind() Define bindings; .clipboard append() Insere na clipboard do Tk; .clipboard clear() Limpa a clipboard do Tk; .configure() ou .config() Configura o widget depois de criado; .destroy() Destr´i o widget; o
  199. 199. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 199 .event add() Cria eventos virtuais; .grab set() Captura todos os eventos da aplica¸˜o; ca .mainloop() Espera por eventos; .quit() Abandona o “mainloop”.
  200. 200. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 200 8.2.8 Exemplo: Ol´, mundo 3 a from Tkinter import * root = Tk() root.title(Teste) lb = Label(root,text=Ol´, mundo!,width=20) a lb.pack() root.mainloop() Observa¸˜o: width ´ dado em unidades de texto. ca e
  201. 201. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 201
  202. 202. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 202 8.2.9 Dimens˜es e Sistema de Coordenadas o • Especificar as dimens˜es em: c (cent´ o ımetros), i (polegadas), m (milimetros), p (pontos de impress˜o); a • Se n˜o especifica a dimens˜o, o valor ´ tomado como a a e pixels; • O sistema de coordenadas ´ relativo ao canto e superior esquerdo da janela, “x” refere-se a distˆncias a na horizontal e “y” refere-se a distˆncias na vertical. a
  203. 203. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 203 8.2.10 Exemplo: Ol´, mundo 4 a from Tkinter import * root = Tk() root.title(Teste) b = Button(root,bg=blue,fg=yellow,text=Ol´, mundo!, a width=20,command=root.quit) b.config(activebackground=yellow) # poderia ser feito na cria¸~o ca b.config(activeforeground=blue) b.pack() root.mainloop() Observa¸˜es: co • widget “Button” permite criar bot˜es clic´veis no aplicativo; o a • “bg” ´ a cor de fundo e “fg” ´ a cor do texto; e e • “command” define uma resposta ao evento “clicar no bot˜o”; a • “.config” ´ o m´todo para configurar widgets. e e
  204. 204. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 204
  205. 205. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 205 8.2.11 Widget Button Principais op¸oes: c˜ activebackground Cor de fundo quando o mouse est´ a sobre o widget; activeforeground Cor do texto quando o mouse est´ a sobre o widget; anchor Idˆntico a Label; e bd Espessura da borda; command Resposta ao clique; cursor Permite definir o cursor quando o mouse est´ a sobre o widget;
  206. 206. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 206 justify Idˆntico ao widget Label; e padx idem; pady idem; relief idem; text Texto que vai aparecer no bot˜o; a underline Indica a posi¸ao do caracter que ser´ c˜ a sublinhado no texto do widget e servir´ de atalho do a bot˜o (come¸a com 0); a c width Largura do bot˜o. a
  207. 207. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 207 8.2.12 Exemplo: Ol´, mundo 5 a from Tkinter import * def callback(): print (Ol´, mundo!) a root = Tk() root.title(Teste) frame = Frame(root) frame.pack() b = Button(frame,text=Fala vivente,command=callback) b2 = Button(frame,text=Tchau...,command=root.quit) b.pack(side=LEFT) b2.pack(side=LEFT) root.mainloop() • widget “Frame” ´ um “container” (n˜o aparece na tela); e a • “command=callback” define um callback para o bot˜o; a • “.pack(side=LEFT)” - packing com posi¸˜o. ca
  208. 208. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 208
  209. 209. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 209 8.2.13 Widget Frame Algumas op¸oes: c˜ background (bg) Cor de fundo do frame; borderwidth Espessura da borda (default ´ 0); e height Altura do frame; relief Idˆntico ao descrito em Label e Button; e width Largura do frame;
  210. 210. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 210 8.2.14 Exemplo: Ol´, mundo 6 a from Tkinter import * def callback(evento): # note o argumento evento do callback print (Ol´, mundo! x=%d y=%d%(evento.x,evento.y)) a root = Tk() root.title(Teste) frame = Frame(root) frame.pack() b = Button(frame,text=Clique duplo aqui) b.bind(Double-Button-1,callback) # binding de eventos b2 = Button(frame,text=Tchau...,command=root.quit) b.pack(side=TOP) # observe que side=TOP b2.pack(side=TOP,fill=X) # fill=X para ocupar todo o espa¸o c root.mainloop()
  211. 211. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 211
  212. 212. 8 ¸˜ ´ PROGRAMACAO GRAFICA USANDO TK 212 8.2.15 Mais Sobre Binding • Alguns tipos de eventos: Button O usu´rio pressionou um bot˜o com o a a mouse (exemplo: Button-1 ´ o bot˜o esquerdo e a do mouse); Configure O usu´rio mudou o tamanho do widget a (por exemplo, arrastando a borda da janela); Enter O mouse entrou na ´rea do widget; a Leave O mouse saiu da ´rea do widget; a Motion O usu´rio est´ arrastando o widget; a a

×