Chapter 2 - An array of sequences
Built-in sequences
Container sequências: armazena referências para os objetos que contém (aceita diferentes tipos)
list, tuple and collections.deque can hold items of different types.
Flat sequências:
str, bytes, bytearray, memoryview and array.array hold items of one type.
Mutabilidade
Mutable sequências
list, bytearray, array.array, collections.deque and memoryview
Immutable sequências
tuple, str and byte
List Comprehensions in Python (aka listcomps)
Often seen as a part of functional programming in Python, list comprehensions allow you to create lists with a for loop with less code.
normal way
listcomps way
Listcomps x map
and filter
map
and filter
Iterator protocol is implemented whenever you iterate over a sequence of data. For example, when you use a for loop the following is happening on a background:
first
iter()
method is called on the object to converts it to an iterator object.next()
method is called on the iterator object to get the next element of the sequence.StopIteration
exception is raised when there are no elements left to call.
O que são generators?
Generators são uma forma simples de criarmos iteradores. Ele irá retornar um objeto (iterador) para que nós possamos iterar sobre este objeto (um valor de cada vez).
É muito simples criar uma função Generator, mas existem algumas peculiaridades. Por exemplo, nós usamos a declaração yield
ao invés de return. Se a função contém ao menos uma declaração yield
então ela se torna uma função Generator.
O
yield
pode ser lido como um pause, que retorna um objeto do tipo generator.O objeto Generator só pode ser iterado uma única vez.
Generator expressions
As Generators Expressions facilitam à criação de Generators. Assim como uma função lambda cria uma função anônima, uma Generator Expression cria uma função Generator anônima. A sintaxe é bem parecida com as famosas List Comprehensions com o pequeno detalhe de que os colchetes [ ] são subsituídos pelos parênteses ().
O padrão da maioria dessas expressões é algo dessa forma:
A expressão acima corresponde a função abaixo:
Tuples
listas imutáveis
armazenar registros
Tuples para agrupar dados
Tuple assignment and unpacking (Atribuição múltipla)
O poder das tuplas está no unpacking mechanism. Unpacking é a separação de um tuple (ou qualquer sequência) em várias variáveis. Cada variável recebe um valor do tuple.
Parallel Assignment
Trocar os valores de 2 variáveis
Nesse caso, não precisa de um terceira variável temporária.
Antes:
Tuplas:
Podemos usar (*) to unpack tuple
Função retorna (2 , 4) um par de números que consiste em seu quociente e o resto da divisão.
Então, podemos tentar utilizar a tupla como parâmetro.
No entanto, a função divmod()
recebe 2 parâmetros e não apenas 1. Podemos desestrutura a tupla, utilizando simplesmente o caractere (*).
Além disso, já podemos usar o assingment:
Namedtuple
Nesse caso, temos que passar para a função 2 parâmetros:
nome da classe
lista de campos
novos atributos
._fields
: exibe o nome dos campos da classe._make()
: pode instanciar uma namedtuple a partir de outra namedtuple.
._asdict()
: retornacollections.OrderedDict
exibindo também os campos da named tuple.
Uso do * para capturar itens excedentes
args e *kwargs
Antes de mais nada, eles não precisam se chamar args ou kwargs, mas precisam ter o e *, respectivamente! **Os nomes “args” são apenas uma convenção.
https://www.geeksforgeeks.org/args-kwargs-python/
*args exemplo
O interessante é que o *ags é lido como uma tupla, então podemos iterá-lo para pegar os valores.
**kwargs exemplo
A diferença aqui é que não passamos somente uma tupla, mas uma lista de chave-valores.Então, nesse caso temo um dicionário.
Passar uma lista como parâmetro para uma função que recebe n
valores
n
valoresPodemos passar a lista como parâmetro para invocar a função. usando *
Ou podemos passar uma lista chave-valor na qual as chaves devem ter o nome dos argumentos da função.
Slicing
https://www.youtube.com/watch?v=ajrtAuDg3yw
Multi-dimensional slicing and ellipsis
Assigning to slices
Podemos modificar (alterar valores, adicionar, substituir) sequências mutáveis utilizando slice.
Substituímos o valores nos índices 2, 3 e 4 por apenas 2 valores, reduzindo o tamanho da lista.
Operations +
*
with sequences
+
*
with sequencesConcatenação de sequências
Repetição
Nessas operações novos objetos são criados.
Building lists of lists
Correto
Uma lista que contém 3 listas de 4 itens cada
Errado
Uma lista com 3 referêncis para mesma lista, o que não era nossa intenção.
Operations +=
*=
with sequences
+=
*=
with sequences+=
invoca o método especial__iadd__
*=
invoca o método especial__imul__
Qual a diferença das operações em listas mutáveis e imutáveis?
Então, várias concatenações em listas imutáveis é ineficiente porque ao invés de apenas adicionar itens na lista, um novo objeto é criado com uma cópia do original.
A+= (corner case)
o interpretador consegue alterar o valor da lista
t[2]
, pois é uma listamas não consegue adicionar t[2] na lista
t
, poist
é uma tupla.
Dá para ver melhor com bytecode:
Alguns aprendizados a partir disso:
não inserir items mutáveis dentro de uma tupla
+=
não é uma operação atômicaentender melhor o bytecode pode ser algo útil
list.sort
O método list.sort()
ordena a lista in-place - não cria uma cópia do objeto. Tanto que não podemos atribuí-lo para outra variável:
Convenção do Python: Funções ou métodos que alteram objetos in-place sempre retornam None
.
sorted function
Algoritmo de ordenação Timsort baseado no Insertion Sort e Merge sort.
A built-in functionsorted
cria uma nova lista e a retorna - possui 2 argumentos possíveis (reversed
ekey
).
Bisect - binary search method in Python
Pode ser usado para buscar um elemento em uma lista.
Ex 1: nesse caso, a função bisect_left
retorna o índice da primeira ocorrência do elemento 285
.
Ex 2: nesse caso, a função bisect_left
retorna o índice da última ocorrência do elemento 285
.
lo/hi arguments
bisect.insort
insort(seq, item)
- insere um item na sequência de forma a mantê-la ordenada de forma crescente.
Arrays
mais eficiente para listas com um único tipo
array(data type, value list)
append
insert
pop
remove
index
reverse
array.tofile()
array.tofile()
Memory views
Last updated
Was this helpful?