FLISOL 2013 - Python - Introdução Básica

FLISOL 2013 - Python - Introdução Básica

Introdução básica a Linguagem Python apresentada no FLISOL 2013.

7735d49d1b04ba5e18bbe107ad756b0d?s=128

Christian S. Perone

April 23, 2013
Tweet

Transcript

  1. 3.

    A I L A ▸ Christian S. Perone ▸ Trabalha

    como desenvolvedor ▸ Colaborador e mantenedor open-source ▸ Blog ▸ http://pyevolve.sourceforge.net/wordpress ▸ Projetos ▸ https://github.com/perone ▸ Twitter @tarantulae
  2. 4.

    A I L R A Apresentação I Características Read-Eval-Print Loop

    (REPL) Versões da Linguagem L Variáveis Tipos de Dados Funções Controles de Fluxo Orientação a Objetos Exceções Métodos Mágicos Módulos e Pacotes Dúvidas ?
  3. 6.

    A I L C ▸ VHLL (Very-High-Level Language) ▸ Interpretada

    ▸ Multiparadigma ▸ Imperativa ▸ Orientada a Objetos ▸ Funcional ▸ Tipagem dinâmica ▸ Fortemente tipada ▸ Baterias inclusas (Python Standard Library) ▸ Extensível ▸ Comunidades em diversas áreas
  4. 7.

    A I L R -E -P L (REPL) Uma das

    vantagens do Python é o prompt do interpretador, que quando executado apresenta um REPL (Read-Eval-Print Loop). No REPL do Python você pode interagir a qualquer momento com o interpretador, esta é uma das mais importantes ferramentas de aprendizado da linguagem, você pode testar pequenos trechos de código sem precisar encapsular isto em uma classe (aka Java) ou criar um arquivo de fonte separado. Exemplo de uso: >>> print ’Hello world’ Hello world >>> a = 2 >>> b = 3 >>> print a+b 5
  5. 8.

    A I L P Hoje temos duas principais versões da

    linguagem: Versão .x Lançada em de Out . Atualmente o branch da versão .x é o que tem mais módulos externos disponíveis e também é a mais utilizada pela comunidade. Esta introdução ao Python aborda esta versão da linguagem, mais especi camente a versão . .
  6. 9.

    A I L P Hoje temos duas principais versões da

    linguagem: Versão .x Lançada em de Out . Atualmente o branch da versão .x é o que tem mais módulos externos disponíveis e também é a mais utilizada pela comunidade. Esta introdução ao Python aborda esta versão da linguagem, mais especi camente a versão . . Versão .x Lançada em de Dez , foco em reparar algumas inconsistências da linguagem e reduzir a duplicação de recursos. Nesta versão a retrocompatibilidade de sintaxe com as versões anteriores foi quebrada.
  7. 10.

    A I L P Hoje temos duas principais versões da

    linguagem: Versão .x Lançada em de Out . Atualmente o branch da versão .x é o que tem mais módulos externos disponíveis e também é a mais utilizada pela comunidade. Esta introdução ao Python aborda esta versão da linguagem, mais especi camente a versão . . Versão .x Lançada em de Dez , foco em reparar algumas inconsistências da linguagem e reduzir a duplicação de recursos. Nesta versão a retrocompatibilidade de sintaxe com as versões anteriores foi quebrada. Ambas versões foram planejadas para coexistirem e receberem atualizações em paralelo. Muitos recursos que foram introduzidos na versão .x foram também portados para a versão .x.
  8. 12.

    A I L V Python é uma linguagem dinamicamente tipada,

    ou seja, os tipos das variáveis declaradas são resolvidos em tempo de execução (ao contrário de linguagens estaticamente tipadas como C por exemplo). Abaixo seguem alguns exemplos de declaração/atribuição de variáveis em Python: # Declaração de variável inteira var_x = 1 # Declaração de variável real var_y = 1 .34 # Declaração de variável string var_z = ’abcdef’
  9. 13.

    A I L V ▸ I Você pode usar a

    função type() para mostrar na tela qual o tipo da variável, como no exemplo abaixo usando o REPL do Python: >>> print type(var_x) <type ’int’> >>> print type(var_y) <type ’float’> >>> print type(var_z) <type ’str’>
  10. 14.

    A I L V ▸ M I Em Python, alguns

    tipos de dados são imutáveis, como por exemplo as strings e as tuplas. Esta abordagem, apesar de incomum a primeira vista, tem algumas vantagens:
  11. 15.

    A I L V ▸ M I Em Python, alguns

    tipos de dados são imutáveis, como por exemplo as strings e as tuplas. Esta abordagem, apesar de incomum a primeira vista, tem algumas vantagens: Performance a ideia de uma string imutável traz consigo um tamanho imutável conhecido no momento da criação e durante o tempo de vida do objeto.
  12. 16.

    A I L V ▸ M I Em Python, alguns

    tipos de dados são imutáveis, como por exemplo as strings e as tuplas. Esta abordagem, apesar de incomum a primeira vista, tem algumas vantagens: Performance a ideia de uma string imutável traz consigo um tamanho imutável conhecido no momento da criação e durante o tempo de vida do objeto. Memória as strings imutáveis podem ser reutilizadas, duas strings iguais podem apontar para o mesmo lugar da memória.
  13. 17.

    A I L V ▸ M I Em Python, alguns

    tipos de dados são imutáveis, como por exemplo as strings e as tuplas. Esta abordagem, apesar de incomum a primeira vista, tem algumas vantagens: Performance a ideia de uma string imutável traz consigo um tamanho imutável conhecido no momento da criação e durante o tempo de vida do objeto. Memória as strings imutáveis podem ser reutilizadas, duas strings iguais podem apontar para o mesmo lugar da memória. Design imutabilidade é um dos conceitos fundamentais da Programação Funcional, ela permite você ver o uxo do código como uma série de transformações de uma representação em outra ao invés de uma sequência de mutações in-place.
  14. 18.

    A I L V ▸ T Tudo em Python é

    um objeto, inclusive funções, classes, números, etc. Você pode usar o REPL do Python para mostrar os atributos de um objeto da seguinte forma usando o dir(): >>> minha_string = ’abc’ >>> dir(minha_string) [’__add__’, ’__class__’, ’__contains__’, ’__delattr__’, (... omitido por brevidade)]
  15. 19.

    A I L V ▸ T Tudo em Python é

    um objeto, inclusive funções, classes, números, etc. Você pode usar o REPL do Python para mostrar os atributos de um objeto da seguinte forma usando o dir(): >>> minha_string = ’abc’ >>> dir(minha_string) [’__add__’, ’__class__’, ’__contains__’, ’__delattr__’, (... omitido por brevidade)] Você pode também veri car a identidade de um objeto usando a função id(): >>> var_a = 1 >>> id(var_a) 32679628 N Esta identidade tem a garantia de ser única e constante para este objeto durante o tempo de vida do objeto.
  16. 20.

    A I L V ▸ N Em Python, variáveis não

    são o objeto em si mas sim nomes para um objeto. Um mesmo objeto pode ser referenciado por mais de um nome: >>> var_a = var_b = 5 >>> id(var_a) 3267963 >>> id(var_b) 3267963 O que este trecho de código faz é criar dois nomes para o mesmo objeto, neste caso o número . Ao usar a função id() do Python podemos constatar que de fato as duas variáveis estão apontando para o mesmo objeto.
  17. 21.

    A I L T D ▸ N Exemplos de operações

    matemáticas em Python: >>> 2+2 4 >>> (5 -5*6)/4 5 >>> 7/3 2 >>> 7/3. 2.3333333333333335 N A divisão por inteiro sempre retorna um inteiro. Na versão .x este comportamento padrão foi alterado.
  18. 22.

    A I L T D ▸ S As strings podem

    ser concatenadas e indexadas: >>> var_str = ’abc’ + ’def’ >>> var_str ’abcdef’ >>> var_str[2] ’c’ >>> var_str[ :2] ’ab’ >>> var_str[2:] ’cdef’ A sintaxe var_str[ :2] é chamada de slicing em Python.
  19. 23.

    A I L T D ▸ L As listas em

    Python podem conter diferentes tipos de dados: # Criando uma nova lista minha_lista = [1, 2.5, 5, ’string qualquer’] Ao contrário das strings, listas são mutáveis, o que signi ca que uma atribuição é naturalmente válida: >>> minha_lista[ ] = 666 >>> minha_lista [666, 2.5, 5, ’string qualquer’] >>> len(minha_lista) 4
  20. 24.

    A I L T D ▸ D Um dicionário em

    Python é uma estrutura que de ne uma relação de ∶ entre as respectivas chaves e valores. # Definindo um dicionário >>> meu_dicionario = {’nome’: ’Fulano’, ’idade’: 28} # Acessando valores do dicionário usando as chaves >>> meu_dicionario[’nome’] ’Fulano’ >>> meu_dicionario[’idade’] 28 # Apagando chaves/valores >>> del meu_dicionario[’nome’] # Atribuindo valores >>> meu_dicionario[’altura’] = 1.72
  21. 25.

    A I L T D ▸ T Tuplas não são

    nada mais do que listas imutáveis, ou seja, logo após sua criação não se pode alterá-las sem criar uma nova tupla. >>> minha_tupla = (’a’, ’b’, 2.5, 666) >>> minha_tupla (’a’, ’b’, 2.5, 666) >>> minha_tupla[1] ’b’ >>> tup = (’um’, 2, 3) >>> var_a, var_b, var_c = tup >>> print var_a, var_b, var_c um 2 3 Assim como em uma lista, elementos em uma tupla têm uma ordem e o slicing também é possível.
  22. 26.

    A I L T D ▸ C Sets (ou conjuntos)

    seguem a de nição matemática: são uma coleção de elementos distintos, ou seja, uma coleção onde itens não se repetem. Para de nir um conjunto em Python usamos o tipo set: # Usando uma lista >>> conjunto = set([1, 2, 3, 1, 2, 3]) >>> conjunto set([1, 2, 3]) # Notação usando chaves >>> conjunto = {1, 2, 3, 1, 2, 3} >>> conjunto set([1, 2, 3]) N A notação usando chaves foi incluída na versão . do Python e posteriormente portada para a versão . .
  23. 27.

    A I L F Em Python, as funções são declaradas

    usando a palavra reservada def (que signi ca de nition). Exemplo da declaração de uma função que fará a soma de dois parâmetros: def soma(a, b): return a+b Note que Python utiliza espaços para delimitar os blocos do programa, o número de espaços recomendado pelo guia de estilo o cial (PEP ) são espaços.
  24. 28.

    A I L F ▸ A P Funções em Python,

    além de podermos usar parâmetros padronizados, também podemos realizar chamadas para funções nomeando parâmetros: def adiciona_pessoa(nome, idade=28, sexo=’M’): print nome, idade, sexo >>> adiciona_pessoa(’christian’) christian 28 M >>> adiciona_pessoa(’laura’, sexo=’F’) laura 28 F >>> adiciona_pessoa(’pedro’, 12, ’M’) pedro 12 M
  25. 29.

    A I L C F ▸ I >>> x =

    2 >>> if x > : ... print "Maior que zero" ... elif x < : ... print "Menor que zero" ... else: ... print "Zero" ... Maior que zero
  26. 30.

    A I L C F ▸ F A palavra reservada

    for em Python pode iterar em itens de uma sequência (uma lista, uma string, chaves de um dicionário, etc.): >>> palavras = [’gato’, ’cachorro’] >>> for p in palavras: ... print p, len(p) gato 4 cachorro 8
  27. 31.

    A I L C F ▸ F II Se for

    preciso iterar em uma sequência numérica, você pode utilizar a função range(), que gera listas contendo progressões aritméticas: >>> range(6) [ , 1, 2, 3, 4, 5] >>> for i in range(len(palavras)): ... print i, palavras[i] gato 1 cachorro Existe também outra função chamada xrange() que retorna um generator ao invés de uma lista, eliminando desta forma a necessidade da criação de uma lista, que pode ser um gargalo de performance para iterações em progressões mais longas.
  28. 32.

    A I L C F ▸ F III Entretanto uma

    solução pythonica para este problema seria usando a função enumerate(): >>> list(enumerate(palavras)) [( , ’gato’), (1, ’cachorro’)] >>> for i,p in enumerate(palavras): ... print i,p gato 1 cachorro
  29. 33.

    A I L L C Em Python temos o conceito

    de List Comprehensions: >>> lista = [’ab’, ’cd’] >>> [x.upper() for x in lista] [’AB’, ’CD’] >>> lista = [1, 2, 1 , 2 ] >>> [x for x in lista if x < 1 ] [1, 2] A compreensão é a propriedade de classi cação em torno da qual se reagruparão os “elementos” que a ela correspondem. Indica os pontos comuns a determinados tipos de objetos. A extensão é a própria coleção desses objetos. (...) Tudo isto é muito simples. —L F , K , U “C ”.
  30. 34.

    A I L O O Python também suporta Orientação a

    Objetos e contém mecanismos para criação de classes, herança (múltipla), sobrescrita de métodos (de nidos pelo usuário ou de operadores matemáticos, etc.). Explícito é melhor que implícito. —T Z P , T P , .
  31. 35.

    A I L O O ▸ C Em Python, as

    classes são de nidas utilizando a palavra reservada class, um exemplo simples da de nição e instanciação de uma classe pode ser de nido como: class MinhaClasse(object): pass # Instanciando um objeto >>> objeto = MinhaClasse()
  32. 36.

    A I L O O ▸ C Para declarar o

    construtor de uma classe em Python, utilizamos o método mágico __init__(): class MinhaClasse(object): def __init__(self): pass
  33. 37.

    A I L O O ▸ A C Atributos de

    classe são atributos compartilhados entre todas instâncias da classe: class MinhaClasse(object): atributo_classe = 1 # Acessível através da classe >>> print MinhaClasse.atributo_classe 1 # Acessível também através dos objetos da classe >>> objeto = MinhaClasse() >>> print objeto.atributo_classe 1
  34. 38.

    A I L O O ▸ A I Atributos de

    instância são atributos únicos para cada objeto instanciado e só existem dentro do objeto: class MinhaClasse(object): def __init__(self, valor): self.valor = valor >>> objeto = MinhaClasse(3 ) >>> print objeto.valor 3 >>> print MinhaClasse.valor Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: type object ’MinhaClasse’ has no attribute ’valor’
  35. 39.

    A I L O O ▸ H S Em Python

    podemos ter herança simples: class ClasseBase(object): def nome(self): print ’Sou ClasseBase !’ def base(self): print ’Método da ClasseBase !’ class ClasseDerivada(ClasseBase): def nome(self): print ’Sou ClasseDerivada !’ >>> base = ClasseBase() >>> derivada = ClasseDerivada() >>> base.nome() Sou ClasseBase ! >>> derivada.nome() Sou ClasseDerivada ! >>> derivada.base() Método da ClasseBase !
  36. 40.

    A I L O O ▸ H M E também

    herança múltipla: class ClasseA(object): def metodo_a(self): print ’metodo_a !’ class ClasseB(object): def metodo_b(self): print ’metodo_b !’ class ClasseC(ClasseA, ClasseB): pass >>> obj = ClasseC() >>> obj.metodo_a() metodo_a ! >>> obj.metodo_b() metodo_b !
  37. 41.

    A I L O O ▸ M C B Ao

    sobrescrever um método da classe base, muitas vezes precisamos reutilizar o comportamento da classe base no método derivado: class ClasseBase(object): def metodo(self): print ’Metodo da ClasseBase !’ class ClasseDerivada(ClasseBase): def metodo(self): super(ClasseDerivada, self).metodo() print ’Metodo da ClasseDerivada !’ >>> obj = ClasseDerivada() >>> obj.metodo() Metodo da ClasseBase ! Metodo da ClasseDerivada !
  38. 42.

    A I L O O ▸ E Em Python não

    há um conceito de atributos privados como há em outras linguagens. Python encoraja os desenvolvedores a serem responsáveis.
  39. 43.

    A I L O O ▸ E II ▸ Um

    método que inicia com o caractere ’_’ indica que o método é um método não-público da API e que pode ser alterado no futuro sem aviso, exemplo: class MinhaClasse(object): def _metodo_interno(self): pass # (...) implementação
  40. 44.

    A I L O O ▸ E II ▸ Um

    método que inicia com o caractere ’_’ indica que o método é um método não-público da API e que pode ser alterado no futuro sem aviso, exemplo: class MinhaClasse(object): def _metodo_interno(self): pass # (...) implementação ▸ O interpretador utiliza name mangling quando o nome do método inicia com dois caracteres ’__’ (e acaba com no máximo um caractere ’_’ ), exemplo: class MinhaClasse(object): def __metodo_interno(self): pass # (...) implementação No exemplo acima, o método __metodo_interno() tem seu nome alterado para _MinhaClasse__metodo_interno().
  41. 45.

    A I L E ▸ T E Como em outras

    linguagens, Python também oferece tratamento de erros em tempo de execução, denominados Exceptions, ou Exceções. O tratamento destes erros é realizado através de blocos utilizando as palavras-chaves try e except: meu_dicionario = {’chave_a’: 1, ’chave_b’: 2} try: print meu_dicionario[’chave_c’] except KeyError: print ’Chave não encontrada !’
  42. 46.

    A I L E ▸ L E Para levantar exceções

    em Python, a palavra reservada raise deve ser utilizada: def verifica_numero_primo(numero): if numero < : raise ValueError(’O valor deve ser maior ’ ’ou igual a zero !’) # (...) No caso acima, uma exceção built-in ValueError será levantada. Você também pode criar classes de exceções próprias criando classes que herdam da classe nativa Exception.
  43. 47.

    A I L M M Métodos mágicos são métodos especiais

    para implementar protocolos, sobrescrever operadores, etc. Eles seguem sempre o mesmo formato: com dois underscores antes e depois do nome do método, como por exemplo __init__(). class MeuDicionario(object): def __init__(self): self.dicionario = {} def __getitem__(self, key): return self.dicionario[key] def __setitem__(self, chave, valor): self.dicionario[chave] = valor >>> dicionario = MeuDicionario() >>> dicionario[’chave’] = 1 >>> print dicionario[’chave’] 1
  44. 48.

    A I L M P ▸ M Qualquer arquivo arquivo

    contendo código-fonte Python é chamado de Módulo. Um módulo pode ser importado por outros módulos, de forma que as classes, funções, variáveis globais e outros objetos deste módulo possam ser acessados por outro módulo. A sintaxe para importação de um módulo é feita através do importação utilizando a palavra reservada import: # Arquivo minhas_funcoes.py def fibonacci(n): if n == : return if n == 1: return 1 return fibonacci(n-1) + fibonacci(n-2) # Arquivo usa_modulo.py import minhas_funcoes resultado = minhas_funcoes.fibonacci(8)
  45. 49.

    A I L M P ▸ M II Você também

    pode importar objetos especí cos diretamente para o namespace atual: # Importa todas funções (má prática) from minhas_funcoes import * resultado = fibonacci(8) # Importa apenas a função soma (boa prática) from minhas_funcoes import fibonacci resultado = fibonacci(8) # Importa módulo usando outro nome import minhas_funcoes as mf resultado = mf.fibonacci(2, 3)
  46. 50.

    A I L M P ▸ P Um pacote em

    Python não é nada além de uma estrutura de diretório contendo módulos. Juntamente com o conceito de módulos, os pacotes são uma maneira e caz de estruturar e organizar os módulos e evitar a poluição de namespaces. Exemplo da estrutura de um pacote: frontend/ __init__.py desktop/ __init__.py modulo_a.py web/ __init__.py modulo_b.py # Importando modulo ’modulo_a’ >>> from frontend.desktop import modulo_a >>> modulo_a.funcao()