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_
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?
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...
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!
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)
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))
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
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'
É 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'
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;
- 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']
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)
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;
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
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;
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;
-> 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;
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;
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;
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;
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;
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;
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
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
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
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;
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!")