Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Minicurso de Python na FURB 2017

Minicurso de Python na FURB 2017

Sildes do minicurso de Python ministrado na Semana Pedagogica 2017 na FURB em Blumenau/SC

Andre Machado

April 21, 2017
Tweet

More Decks by Andre Machado

Other Decks in Technology

Transcript

  1. Quem sou eu? Backend Developer na M2Agro; Pythonista e pai

    a 3 anos, mas na área a quase 10; Nerd padrão; De Recife, morando em Blumenau; [email protected] https://about.me/andresmachado twitter: @andresmachado_
  2. Ementa • Aula 01 - Introdução a linguagem Python ◦

    Um pouco de história ◦ O Zen do Python ◦ O que podemos fazer com Python ◦ Cases de sucesso no mundo ◦ Características da linguagem ◦ Tipagem e dados primitivos no Python • Aula 02 - Indo mais a fundo ◦ Python data model e os "__magicmethods__" ◦ Estruturas de dados no Python e suas diferenças ◦ Compreensão de listas e expressões geradoras ◦ Dicionários e Manipulação de arquivos (context managers com "with") ◦ Mini-projeto: Desenvolvendo uma lista de convidados Pythonica • Aula 03 - Conclusão ◦ DefaultDict e namedtuple - Estruturas de dados avançada ◦ Orientação a objetos com Python ◦ Uma introdução a @decorators (decoradores) ◦ Introdução ao paradigma funcional com Python e o módulo functools ◦ Mini-projeto: Concluindo a lista de convidados Pythonica ◦ Conclusão: o que fazer agora?
  3. Um pouco de história • Seu criador foi Guido Van

    Rossum em 1991 • Linguagem dinâmica, interpretada e de tipagem forte • Sim, o nome veio do grupo de humor Monty Python • Foi baseada na linguagem ABC, uma das primeiras a utilizar o conceito de orientação a objetos • Sua implementação principal é em C (CPython), embora existam outras implementações como o PyPy, Jython(Java), IronPython(.NET) e etc...
  4. Zen do Python (PEP 20) Bonito é melhor que feio.

    Explícito é melhor que implícito. Simples é melhor que complexo. Complexo é melhor que complicado. Linear é melhor do que aninhado. Esparso é melhor que denso. Legibilidade conta. Casos especiais não são especiais o bastante para quebrar as regras. Ainda que praticidade vença a pureza. Erros nunca devem passar silenciosamente. A menos que sejam explicitamente silenciados. Diante da ambigüidade, recuse a tentação de adivinhar. Deveria haver um — e preferencialmente só um — modo óbvio para fazer algo. Embora esse modo possa não ser óbvio a princípio a menos que você seja holandês. Agora é melhor que nunca. Embora nunca freqüentemente seja melhor que *já*. Se a implementação é difícil de explicar, é uma má idéia. Se a implementação é fácil de explicar, talvez seja uma boa idéia. Namespaces são uma grande idéia — vamos ter mais dessas!
  5. alguns números do python (de acordo com o developer survey

    2017 do stack overflow) https://stackoverflow.com/insights/survey/2017/
  6. Indentação • A indentação não é apenas visual, se o

    código estiver indentado errado o programa não roda (e o interpretador alerta); • É muito parecido com escrever pseudocódigo; • Esta obrigação mantém a legibilidade e facilidade de escrita do código; for i in range(100): if i % 5 == 0 and i % 3 == 0: print("FizzBuzz") elif i % 3 == 0: print("Fizz") elif i % 5 == 0: print("Buzz") else: print(i)
  7. Portabilidade • Windows • UNIX • Android • JVM •

    .NET • CLI • Desktop App • WebApp • Microservices
  8. Facilidade de escrita from datetime import datetime name = "Andre"

    now = datetime.now() birthday = datetime(1987, 05, 14) diff = now - birthday age = diff.days // 365 print("Meu nome é %s e eu tenho %d anos" % (name, age))
  9. Batteries Included • Strings • Data Types • Math •

    File and Directory Access • Persistência de dados • Compressão de dados • File Formats • Logging • Testing (unittest, doctest) • Raspagem de dados • Protocolos de Internet • Multimedia
  10. Tipagem Python tem tipagem dinâmica, porém forte; Você pode alterar

    o tipo de uma variável em tempo de execução e passar qualquer tipo de valor dentro de funções e métodos; Por causa de sua tipagem forte, ele não realiza conversões automáticas de tipos >>> "a" + 10 TypeError: Can't convert 'int' object to str implicitly A menos que seja explicitamente convertido >>> "a" + str(10) 'a10'
  11. Tipos "built-in" • Strings • Integers • Dicts • Lists

    • Tuples • Boolean • Float • Long • Sets • Docstrings
  12. Strings Strings são indexadas como se fossem arrays (Index Zero)

    É possível acessar cada item separadamente, porém, strings são imutáveis e não aceitam atribuição de valores; Strings aceitam "slicing": >>> a_string = 'Python is a beautiful programming language' >>> len(a_string) 42 >>> a_string[0:6] # Retorne os valores do index 0 até o indice 2 'Python' >>> a_string[6:22] # A partir do indice 3 (inclusivo) até o indice 5 (exclusivo) ' is a beautiful ' >>> a_string[6:] # Você pode omitir o indice final para considerar: 'Toda a string a partir do indice 6' ' is a beautiful programming language' >>> nova_lista[::-1] # Hack importante! Você pode inverter os valores da lista passando um indice negativo no parametro 'stride'; 'egaugnal gnimmargorp lufituaeb a si nohtyP'
  13. Formatação de Strings O método format() da API de strings

    permite a formatação de diversas maneiras SHUT UP AND SHOW ME THE CODE!
  14. Listas (Arrays) Listas também são zeroth-index (indice 0); Ao contrário

    das strings, elas são bem mais flexíveis quanto a atribuição de valores e por isso são mutáveis; Listas possuem tamanho indefinido; Também são heterogêneas, você pode ter diversos tipos de valores dentro da sua lista;
  15. Listas (Slicing) Assim como as strings, listas também aceitam slice

    - list(start:end:stride) >>> nova_lista = 'Python is a beautiful programming language'.split(') ['Python', 'is', 'a', 'beautiful', 'programming', 'language'] >>> nova_lista[0:2] # Retorne os valores do index 0 até o índice 2 ['Python', 'is'] # O índice 2 ('a') é exclusivo, por isso não está no retorno >>> nova_lista[3:5] # A partir do índice 3 (inclusivo) até o índice 5 (exclusivo) ['beautiful', 'programming'] >>> nova_lista[3:] # Você pode omitir o índice final para considerar: 'Toda a lista a partir do índice 3' ['beautiful', 'programming', 'language'] >>> nova_lista[::-1] # Hack importante! Você pode inverter os valores da lista passando um índice negativo no parâmetro 'stride'; ['language', 'programming', 'beautiful', 'a', 'is', 'Python'] >>> nova_lista[-2:] # Passar índices negativos no parâmetro 'start' fatia a lista de trás pra frente; ['programming', 'language']
  16. O jeito mais fácil de ordenar uma lista é utilizando

    o método sorted() O sorted() aceita argumentos para modificar o seu comportamento; O antigo método list.sort() também funciona, mas ele não é "puro", pois modifica a lista in-place, por isso é recomendado o sorted() por não alterar o valor original da lista; Listas (Ordenando)
  17. Definindo funções Funções sao definidas com a palavra chave def;

    Podem receber dois tipos de atributos, nomeados (**kwargs) ou posicionais (*args); São High Order Functions, ou seja, aceitam outras funções como parâmetro, podem retornar outras funções e podem ser passadas como parâmetros;
  18. Estruturas de dados no Python e suas diferenças • Lists

    ◦ Filas (queue - deque) ◦ Pilhas (stack) • Tuples • Sets • Dictionaries
  19. Mais sobre Listas • Usando listas como "pilhas" ◦ Você

    pode utilizar listas como pilhas utilizando o método pop() • Usando listas como "filas" ◦ Para utilizar listas como filas, utilize o tipo deque da biblioteca collections ▪ deque.append() ▪ deque.popleft() • Desempacotamento de sequências • Outros métodos ◦ append() ◦ extend(l) ◦ insert(i, x) ◦ remove(x) ◦ pop([i]) ◦ index(i) ◦ count(x) ◦ reverse() ◦ O método del
  20. Tuplas Tuplas, assim como strings são estruturas imutáveis e não

    aceitam atribuição de valores depois de instanciadas; Servem como coleção de valores tão bem e de forma mais sucinta que os dicionários; Aceitam estruturas mutáveis como valor; Uma tupla também possui unpacking (ela é uma sequência); Tuplas podem ser aninhadas; Tuplas aceitam packing;
  21. Sets Sets são coleções desordenadas com elementos únicos'; Sets também

    suportam operações matemáticas como união, interseção, diferença e diferença simétrica; São indicados para testes de diferenças e remoção de itens duplicados;
  22. Dicionários (Dictionaries / Dicts) Dicionários são conjuntos de pares chave

    -> valor sem ordem definida; São muito úteis para agrupar valores; A função principal de um dicionário é servir como etiquetas para armazenagem e recuperação de valores Apenas estruturas imutáveis podem ser chaves dentro de um dicionário, tuplas podem ser chaves desde que não possuam nenhum valor mutável;
  23. List compreheension Uma compreensão de lista é uma construção sintática

    disponível em algumas linguagens de programação para criação de uma lista baseada em listas existentes. Ela segue a forma da notação de definição de conjunto matemática (compreensão de conjunto) como forma distinta para uso de funções de mapa e filtro. (wikipedia) A LC, substitui o uso das funções MAP, FILTER e REDUCE no Python que apesar de disponíveis, têm seu uso desencorajado pelo core team da linguagem por serem menos concisos e legíveis;
  24. Expressões e funções geradoras Um gerador é uma expressão/função que

    gera um iterável que pode ser consumido por um iterador Funções geradora é qualquer classe que possua implementado o magicmethod __iter__ chamando a palavra reservada yield OU função que yield algum valor Por definição, iteradores produz valor iterando sobre uma coleção; Geradores são objetos que não instanciam valores diretamente na memória, consumindo um valor de cada vez até esgotar a pilha list(), sum(), any(), all() todos consome expressões geradoras, ou seja, iteradores;
  25. Leitura e escrita de arquivos A função open() é a

    responsável por abrir e manipular os arquivos no sistema; Um arquivo deve ser sempre aberto para uso e fechado após seu uso; A biblioteca padrão do já trás a possibilidade de manipular arquivos CSV;
  26. Gerenciador de contexto (with) O with() serve para facilitar a

    manipulação de arquivos; Ele pode ser usado com outras coisas no Python, como Locks() de processos paralelos; Você não precisa se preocupar em fechar o arquivo após o uso;
  27. defaultdict Muito útil para contagem de valores; Se uma chave

    não é encontrada, ele chama a função passada como argumento ao invés de levantar uma KeyError Exception
  28. namedtuples namedtuples são estruturas idênticas as tuplas comuns, porém seus

    atributos podem ser acessados através da notação de ponto; Elas são perfeitas para manter a legibilidade do código, pois retornam parâmetros nomeados; Quaisquer valores podem servir como fieldnames, desde que não sejam keywords ou comecem com underscore; São excelentes para atribuir valores a resultados em leitura de arquivos ou bancos de dados;
  29. Mini projeto - Lista de convidados Pythonica Objetivo: Controlar todos

    os convidados do meu evento • Funcionalidades: ◦ Posso adicionar convidados; ◦ Posso remover convidados; ◦ Posso listar convidados; ◦ Posso consultar se um convidado está na minha lista; ◦ Posso dizer quantos convidados possue minha lista; ◦ Minha lista fica salva em um arquivo local, então eu posso recuperá-la a qualquer momento
  30. Python data model e os "__magicmethods__" Os métodos mágicos ou

    dunder methods (__add__) são os métodos implementados por padrão em cada objeto e são definidos pelo Data Model; Todas as classes por padrão herdam da classe Object; Esses métodos são chamados de métodos mágicos porque fazem parte do modelo de dados do Python. Esses métodos são chamados pelo interpretador quando uma sintaxe especial é acionada. Como, por exemplo, quando acessamos os itens do dicionário por sua chave o interpretador invoca a função dict.__getitem__(): Como toda linguagem de programação orientada a objeto, esses métodos podem receber sobrecargas e com isso atribuir comportamentos "magicamente" a nossas classes; A funções "built-in" do Python utilizam estes métodos para realizar operações
  31. Python data model e os "__magicmethods__" Açúcar sintático __magicmethod__ x

    < y x.__lt__(y) x <= y x.__le__(y) x == y x.__eq__(y) x != y x.__ne__(y) x > y x.__gt__(y) x >= y x.__ge__(y)
  32. Python data model e os "__magicattributes__" Assim como os "__magicmethods__"

    os "__magicattributes__" também são definidos na criação de uma função ou classe; Contém informações básicas sobre cada objeto;
  33. Python data model e os "__magicattributes__" Attribute Meaning __doc__ The

    function’s documentation string, or None if unavailable; not inherited by subclasses Writable __name__ The function’s name Writable __module__ The name of the module the function was defined in, or None if unavailable. Writable __defaults__ A tuple containing default argument values for those arguments that have defaults, or None if no arguments have a default value Writable __globals__ A reference to the dictionary that holds the function’s global variables — the global namespace of the module in which the function was defined. Read-only __dict__ The namespace supporting arbitrary function attributes. Writable __closure__ None or a tuple of cells that contain bindings for the function’s free variables. Read-only __annotations__ A dict containing annotations of parameters. The keys of the dict are the parameter names, and 'return' for the return annotation, if provided. Writable __kwdefaults__ A dict containing defaults for keyword-only parameters. Writable
  34. Definição de classes, métodos e atributos Não existe o conceito

    de métodos/atributos privados, públicos e etc… Por convenção se usa um underline na frente do nome do método/atributo apenas para informar que aquele método/atributo não deve ser chamado de fora da função, mesmo que eles estejam disponíveis; Classes suportam herança múltipla; Não se utiliza getters e setters, pode, mas não é Pythonico;
  35. Decoradores Decoradores é uma forma prática de adicionar funcionalidades aos

    nossos métodos, classes ou funções; O Django utiliza diversos @decorators em seu código; @login_required def boas_vindas(request): return HttpResponse("Seja bem-vindo!")