2. O que é Python?O que é Python?
● Linguagem de programação de uso geral
● Linguagem de Alto Nível
● Suporte a múltiplos paradigmas de
programação
● Projetada para favorecer a legibilidade do
código
3. Linguagem de Programação?Linguagem de Programação?
● Linguagem (idioma) usado para dizer para o
computador o que ele deve fazer
● Idioma no qual o programador escreve os
programas de computador
● Tudo o que você usa no computador é um
programa, que foi escrito por um
programador em alguma linguagem de
programação.
4. Foco em legibilidadeFoco em legibilidade
● Legibilidade: facilidade para um programador
compreender o código ao lê-lo.
● Quando programadores precisam ler o
código?
– Manutenção em geral
● Novas funcionalidades
● Correções
● Adaptações em programas legados
5. Programas legadosProgramas legados
● Todo programa que não for descartado
(jogado fora), um dia vai ser código legado!
● Experiência pessoal: mais de 80% do tempo
que trabalho com desenvolvimento de
software, este trabalho tem algum
envolvimento com código legado.
6. Conselho para programadoresConselho para programadores
● Escreva o seu código de uma maneira que,
quando você for ler este código daqui a 5
anos, você ainda consiga entender.
● Melhor ainda, escreva seu código imaginando
que a pessoa que vai ler daqui a 5 anos é um
serial killer e tem seu endereço.
7. Voltando ao PythonVoltando ao Python
● Linguagem multi-paradigma
– Paradigma: conceito ou modelo mental específico, uma
forma de ver o mundo.
– Paradigma de programação: modelo mental ou forma
de ver o mundo que define e orienta a maneira como
um programador vai estruturar a solução de um
problema.
– Exemplos: funcional, orientado a objetos, estruturado,
em lógica, orientado a aspectos, por contrato, etc.
8. Paradigma EstruturadoParadigma Estruturado
● Semelhante a C, Pascal, Basic, Modula, etc
● Programa dividido em “funções” ou
“procedimentos”
● Completamente suporta pela linguagem
Python: é possível escrever um programa
inteiramente estruturado nesta linguagem.
9. ParadigmaParadigma
Orientado para ObjetosOrientado para Objetos
● Semelhante a Java, C#, C++, Smalltalk
● Programa é um conjunto de “Classes” e “Objetos”
● Classes definem como os objetos são construídos e
como se comportam.
● Objetos “trocam mensagens com outros objetos”
● Python suporta completamente o paradigma
orientado para objetos.
10. Paradigma funcionalParadigma funcional
● O paradigma
– Programa é um conjunto de funções que operam sobre
conjuntos e listas
– Definições matemáticas rigorosas para funções, conjuntos e
listas.
– Uso intensivo de recursão
● Suporte parcial em python
– Map/reduce/filter/comprehensions/closures
– Iteradores e ferramentas inspiradas em haskel
– Hacks para tail-recursion
11. ParadigmaParadigma
orientado a aspectosorientado a aspectos
●
O Paradigma
– Aspectos diferentes do programa são tratados em momentos diferentes
(segurança, autenticação, validação, tratamento de entradas, cálculos,
formatação de saídas, etc)
– Os aspectos são combinados um sobre o outro, com um aspecto
modificando o comportamento do programa ao ser combinado com
outro.
●
Suporte parcial em python
– Metaobjetos – objetos cujo comportamento é modificado em tempo de
execução.
– Decorators – injeção de modificação no comportamento de métodos e
objetos
12. ParadigmaParadigma
programação por contratoprogramação por contrato
● O paradigma:
– Cada objeto ou método opera através de um
contrato, composto de:
● Pré-condições para ser executado
● Pós-condições que são garantidas quando a execução é
finalizada
● Suporte em python
– Através de extensões (pycontract, zope.interface)
13. ParadigmaParadigma
Programação em LógicaProgramação em Lógica
● O paradigma
– O programa é composto de uma base de conhecimento
(“fatos” e “regras”), e de questões que são respondidas por
inferência na base de conhecimento
– Implementação tradicional é chamada PROLOG
– Usado em inteligência artificial (raciocínio baseado em
casos).
● Suporte em python
– Através de uma extensão: Pyke
14. Características da LinguagemCaracterísticas da Linguagem
● Interpretada (intepretador de bytecode, como Java ou
qualquer linguagem da plataforma .NET)
● Sistema de tipos dinâmico (como PHP, Ruby, Perl)
– Fortemente tipada: todo objeto tem um tipo que nunca
muda.
– Ligação dinâmica de nomes: um nome pode apontar para
um objeto em um momento e para outro em outro
momento: variáveis não tem tipo.
15. Filosofia – The Zen of PythonFilosofia – The Zen of Python
Tim PettersTim Petters
● Beautiful is better than ugly.
– Bonito é melhor que feio
● Explicit is better than implicit.
– Explícito é melhor que implícito
● Simple is better than complex.
– Simples é melhor que complexo
● Complex is better than complicated.
– Complexo é melhor que compicado
● Flat is better than nested.
– Plano é melhor que aninhado
●
Sparse is better than dense.
– Esparço é melhor que denso
● Readability counts.
– Legibilidade conta
●
Special cases aren't special enough
to break the rules.
– Casos especiais não são especiais o
suficiente para quebrar as regras
●
Although practicality beats purity.
– Porém, pragmatismo vence a pureza.
16. ●
Errors should never pass silently.
– Erros não devem nunca passar silenciosamente.
● Unless explicitly silenced.
– A não ser que sejam explicitamente silenciados.
● In the face of ambiguity, refuse the
temptation to guess.
– Ao se defrontar com uma ambiguidade, resista a
tentação de adivinhar.
●
There should be one-- and preferably only
one --obvious way to do it.
– Deve haver uma – e preferencialmente apenas
uma – maneira óbvia de fazer isto.
● Although that way may not be obvious at
first unless you're Dutch.
– Porém, esta maneira pode não ser óbvia à
primeira vista, a não ser que você seja Holandês
● Now is better than never.
– Agora é melhor do que nunca
● Although never is often better than *right* now.
– Porém, nunca é melhor do que “neste momento”
● If the implementation is hard to explain, it's a bad
idea.
– Se a implementação é difícil de explicar, é uma má
idéia
● If the implementation is easy to explain, it may be
a good idea.
– Se a implementação é fácil de explicar, pode ser uma
boa idéia
● Namespaces are one honking great idea -- let's do
more of those!
– Espaços de nomes são realmente uma grande idéia.
Vamos fazer mais destas coisas.
17. Quem usa python?Quem usa python?
● Google
– 3 linguagens oficiais:
C++, Java e Python
– Sistema de construção
de programas
– Análise de logs
● Yahoo
– Maps
– Groups
● Industrial Light and Magic
– Empresa de George Lucas
– Guerra nas estrelas: ameaça fantasma –
scripts de controle da renderização das
animações foram feitos em Python
● Batlefield Games
– Batlefield 3: status do jogador e
comportamento de alguns elementos
de cenário.
● NASA
– Sistema integrado de planejamento
– Motor de scripts principal
18. Quem usa python?Quem usa python?
● CIA
– Website principal feito em Zope/Plone (framework
python para WEB)
● Computação científica
– ScyPy – análise numérica
– PyLab – ambiente interativo para ScyPy e traçado
de gráficos
– Pandas – ambiente para análise estatística.
19. Aplicações interessantesAplicações interessantes
● Ipython
– Console interativo
● Exaile
– Player de música
● Pitivi
– Editor de vídeo não linear
● Zope/Plone
– CMS
● Ferramentas de
configuração da Red Hat
● 15654 projetos no
SourceForge
● Django
– Framework WEB
– Mais de 4500 sites/sistemas
registrados
20. Python na práticaPython na prática
● Algums exemplos em python, apenas para dar
uma idéia de que “cara” tem a linguagem
21. O básicoO básico
● Objetos e nomes
– O nome como uma
etiqueta colada sobre
um objeto, e não
uma caixa onde você
coloca um valor.
print "Oi, mundo!!!"
x = 1
print x, type(x)
x = 1.1
print x, type(x)
x = '1.1'
print x, type(x)
x = u'1.1'
print x, type(x)
22. A coisa doA coisa do
“espaço em branco”“espaço em branco”
● Indentação é
componente
sintático
– Significa que, se
indentar errado, o
programa não
compila, ou não vai
ter o comportamento
esperado.
def maior(x,y):
if x > y:
return x
else:
return y
def menor(x,y):
return min(x,y)
23. FatoriaisFatoriais
● Mesmo problema resolvido em Java e Python
– Versão 1
● Recursivo
– Versão 2 (só java):
● Números grandes ( > 26! )
– Versão 3 (interativa)
● Evita estouro de pilha, limite de recursão
24. Fat1.javaFat1.java
1 /**
2 * Programa de cálculo de fatorial
3 */
4 public class Fat1 {
5
6 /**
7 * Método que calcula o fatorial
8 */
9 public long fatorial(long x) {
10 // resistir à tentação de fazer em uma só linha
11 // para melhorar a legibilidade.
12 //
13 // return (x > 1) ? x * fatorial(x-1) : 1;
14 if (x > 1) {
15 return x * fatorial(x-1);
16 }
17 else {
18 return 1;
19 }
20 }
21
22
23 /**
24 * Método principal
25 */
26 public static void main(String[] args) {
27 Fat1 calculador = new Fat1();
28 if (args.length > 0) {
29 long param = Long.valueOf(args[0]);
30 long result = calculador.fatorial(param);
31 System.out.println(String.format("Fatorial de %d é %d", param, result));
32 }
33 else {
34 System.out.println ("Use java Fat1 <argumento>");
35 }
36 }
25. Fat1.javaFat1.java
(só método fatorial)(só método fatorial)
6 /**
7 * Método que calcula o fatorial
8 */
9 public long fatorial(long x) {
10 // resistir à tentação de fazer em uma só linha
11 // para melhorar a legibilidade.
12 //
13 // return (x > 1) ? x * fatorial(x-1) : 1;
14 if (x > 1) {
15 return x * fatorial(x-1);
16 }
17 else {
18 return 1;
19 }
20 }
26. fat1.pyfat1.py
1 # -*- coding: utf-8 -*-
2 import sys
3
4 """
5 Programa de cálculo de fatorial
6 """
7 class Fat1(object):
8 """
9 Classe de cálculo do fatorial, para
10 usar o mesmo paradigma que o programa
11 em java.
12 """
13 def fatorial(self, x):
14 "Método (função) que calcula o fatorial"
15 if x > 1:
16 return x * self.fatorial(x-1)
17 else:
18 return 1
19
20 # Equivalente ao método principal em java
21 if __name__ == '__main__':
22 calculador = Fat1()
23 if len(sys.argv) > 1:
24 l = long(sys.argv[1])
25 r = calculador.fatorial(l)
26 print "Fatorial de %d é %d" % (l,r)
27 else:
28 print "Use python %s <argumento>", sys.argv[0]
27. Fatorial estilo pythonFatorial estilo python
● Não precisa definir a classe, afinal é só uma
função
● Se for para usar com números pequenos, pode
ser recursivo (mais legível)
● A versão mais robusta (interativo) pode
calcular até o limite da memória RAM.
28. Versão recursivaVersão recursiva
import sys
def fatorial(x):
return x * fatorial(x-1) if x > 1 else 1
if len(sys.argv) > 1:
param = long(sys.argv[1])
result = fatorial(param)
print "Fatorial de %d é %d" % (param,
result)
else:
print "Use python %s <arg>" % sys.argv[0]