Practical Examples
In Python, iteration allows us to go over a list of items to perform particular operations. Uma maneira comum de criar uma iteração é usar os loops for
, que têm o seguinte formato geral.
for i in iterable:
expression
como discutido no meu artigo anterior, podemos criar os nossos iteradores personalizados que podem ser usados como iterables nos loops for
. Para satisfazer o “teste do pato” para iteradores, a classe personalizada precisa implementar os métodos __iter__()
e __next__()
. Um exemplo específico é dado abaixo.
No trecho de código acima, temos implementado __iter__()
e __next__()
métodos que fazem as instâncias da classe personalizada Cubes
iteradores, de tal forma que a instância foi capaz de ser utilizado em um for
loop.
Callables
além do tipo de dados incorporado dict
, outro importante tipo de dicionário é defaultdict
, disponível no módulo collections
. Este tipo de dados tipo dicionário tem o seguinte construtor: defaultdict(])
. Especificamente, o argumento default_factory
é um tipo de chamável, como uma função ou função lambda.
In my previous article, I showed that we could use the defaultdict
by passing a lambda function. Aqui está o exemplo de seu uso.
>>> from collections import defaultdict
>>> letter_counts = defaultdict(lambda: 0)
>>> for i in 'abcddddeeeee':
... letter_counts += 1
...
>>> letter_counts.items()
dict_items()
notavelmente, podemos ter maior flexibilidade para usar o tipo de dados defaultdict
se criarmos a nossa própria fábrica padrão. Com a filosofia “duck typing”, a classe personalizada precisa implementar o método __call__()
, que é fazer algo chamável. Vamos ver como funciona.
As shown in the above code, we create the DucklingFactory
class, whose __call__()
function returns a list of one Duckling
instance. Usando esta função de fábrica, seremos capazes de fazer o número desejado de patinhos multiplicando a lista padrão de patinhos.
ordenação com Len ()
Outra Possível utilização de dactilografia de pato é implementar a função custom len()
, que pode ser usada na ordenação de uma lista usando a função sort()
. Como uma nota lateral, algumas pessoas se referem à função len()
como uma função mágica, porque ela é implementada chamando a função __len__()
por trás da cena (aquelas funções com duplo underscores como prefixo e sufixo são chamadas de funções mágicas).
suponha que queremos classificar uma lista de patos com base no comprimento do nome de cada pato. Aqui está como podemos aplicar a datilografia de pato neste caso.
In the above code snippet, the custom NamedDuck
class implements the __str__()
and __len__()
functions, which enable us to use the str()
and len()
functions on its instances in Lines 10 and 12, respectively. Importante, como você pode ver, embora a lista esteja misturada com patos e strings nomeados, todos os elementos podem chamar as funções str()
e len()
, de modo que a lista pode ser ordenada usando o len()
como a chave e usado na compreensão da lista quando queremos imprimir o resultado ordenado.
assim, a implicação mais ampla deste uso é que quando temos uma lista mista de elementos de diferentes tipos de dados, desde que cada tipo de dados implemente as mesmas funções, os elementos passarão no teste do pato e serão aplicados com as operações adequadas. Aqui está um exemplo de caso de uso geral usando a função len() em uma lista mista de tipos de dados de str
, tuple
, e list
.
>>> mixed_list = ]
>>> mixed_list.sort(key=len)
>>> mixed_list
, (1, 2), 'Amazing']