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

my_list = []
for x in range(10):
  my_list.append(x * 2)
print(my_list)

listcomps way

Listcomps x 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(): retorna collections.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

Podemos 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

Concatenaçã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

  • += 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 lista

  • mas não consegue adicionar t[2] na lista t, pois t é 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ômica

  • entender 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 functionsortedcria 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()

Memory views

Last updated

Was this helpful?