Python -> (11) Notas de Estudo

Iterators, geradores, decorador

  • iterator
  • gerador
  • gerador de expressões
  • Closures
  • decorador

iterator

Iteração é um dos mais poderosos recursos do Python é uma maneira de acessar os elementos da coleção. Iterator pode lembrar o objeto é uma posição transversal.
Iterator objeto iniciou uma visita do primeiro elemento da coleção até que todos os elementos são acessados sessão. Iterator só pode avançar e não para trás.

Criando um iterador:

O uso de uma classe como a necessidade de implementar dois métodos iterator (classe tem um construtor, construtor Python como classe __init__(), objeto quando ele executa a inicialização.): __iter__(), Retorna um objeto em si iterador .
__next__()Devoluções iterator próximo objeto iteração. Se não houver um próximo valor pode ser devolvido, deve lançar StopIterationuma exceção.

Exemplo 1: Criação de uma iteração digitais devolve o valor inicial 1, aumentando gradualmente de 1:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    x = self.a
    self.a += 1
    return x
 
myclass = MyNumbers()
myiter = iter(myclass)
 
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

Exemplo 2:

class Counter(object):
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def __iter__(self):
        return self

    def __next__(self):
        #返回下一个值直到当前值大于 high
        if self.current > self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1
>>> c = Counter(5,10)
>>> for i in c:
...   print(i, end=' ')
...
5 6 7 8 9 10

Nota: iterators só pode ser usado uma vez. Uma vez lançado StopIteration, ele vai continuar a jogar a mesma exceção:

>>> c = Counter(5,6)
>>> next(c)
5
>>> next(c)
6
>>> next(c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 11, in next
StopIteration
>>> next(c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 11, in next
StopIteration

Iterators no circuito por exemplo:

>>> iterator = iter(c)
>>> while True:
...     try:
...         x = iterator.__next__()
...         print(x, end=' ')
...     except StopIteration as e:
...         break
...
5 6 7 8 9 10
Usando um iterador:

Iterator Existem dois métodos básicos: iter()e next().
Cordas, listas, tuplas ou objetos podem ser usados para criar um iterador:

>>> list=[1,2,3,4]
>>> it = iter(list)    # 创建迭代器对象
>>> print (next(it))   # 输出迭代器的下一个元素
1
>>> print (next(it))
2

Iterator objeto pode ser usado para a declaração travessia convencional:

#!/usr/bin/python3

list = [1,2,3,4]
it = iter(list)   # 创建迭代器对象
for x in it:
    print (x, end=" ")

Você também pode usar a função next ():

#!/usr/bin/python3
 
import sys         # 引入 sys 模块
 
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
 
while True:
    try:
        print (next(it))
    except StopIteration:
        sys.exit()

iterator

Em Python, utilizando as yieldfunções são chamadas gerador (gerador).
A diferença é que, com uma função comum, o gerador é uma 返回迭代器função 只能用于迭代操作, mais fácil de entender o ponto 生成器就是一个迭代器。
durante uma chamada para o gerador em funcionamento, cada vez que experimenta pausas função rendimento e economia de toda a informação operacional atual 返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行.
Chamar uma função gerador, ele retorna um objeto iterador.
Exemplo 1:

>>> def my_generator():
...     print("Inside my generator")
...     yield 'a'
...     yield 'b'
...     yield 'c'
...
>>> my_generator()
<generator object my_generator at 0x7fbcfa0a6aa0>

No exemplo acima, utilizar a instrução rendimento cria um gerador simples, ele pode ser utilizado em um loop, assim como quaisquer outros iterators como:

>>> for char in my_generator():
...     print(char)
...
Inside my generator
a
b
c

Exemplo 2:

>>> def counter_generator(low, high):
...     while low <= high:
...        yield low
...        low += 1
... 
>>> for i in counter_generator(5,10):
...     print(i, end=' ')
... 
5 6 7 8 9 10

No Whileciclo, cada tempo para executar yieldquando a instrução, e retorna o valor do estado de baixo variável de suspender gerador. Quando a próxima chamada para o gerador, o gerador retoma baixo valor variável e, em seguida, aumentar a partir de um lugar antes do congelamento. Generator continua a whileciclo e, mais uma vez veio para yielda declaração ...

Exemplo 3:

#!/usr/bin/python3
 
import sys
 
def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
 
while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()


# 输出:0 1 1 2 3 5 8 13 21 34 55

Normalmente, usamos o gerador para avaliação preguiçosa. Tal gerador é uma boa maneira de usar um grande processamento de dados. Se você não quer carregar todos os dados na memória, você pode usar o gerador, apenas uma parte dos dados é passado para você.

os.path.walk()Função é o exemplo mais típico desta, ele usa uma função de chamada de retorno e a corrente os.walkdo gerador. Usando geradores economia de memória.

Podemos usar o gerador para gerar um número infinito de valores, tais como:

>>> def infinite_generator(start=0):
...     while True:
...         yield start
...         start += 1
...
>>> for num in infinite_generator(4):
...     print(num, end=' ')
...     if num > 20:
...         break
...
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

Um gerador de característica: eles não são reutilizáveis.

gerador de expressões

Gerando uma lista de expressões é um tipo de alto desempenho e derivação do gerador, para promover maior eficiência de memória.
Por exemplo, as tentativas de todos os números de 1 a 9 é soma dos quadrados:

>>> sum([x*x for x in range(1,10)])

Este exemplo é realmente criada pela primeira vez na memória uma lista do valor de um quadrado, em seguida, caminhar através da lista, após a liberação da memória somatório final. você pode entender o uso de memória é uma grande lista do que.

Pode ser usado para salvar expressão gerador de memória :

>>> sum(x*x for x in range(1,10))

Gramática gerador é sempre necessária para dirigir a expressão em suportes em um par, em ambos os lados e não pode vírgula. Exemplo expressão Uso Os exemplos seguintes são Builder válido:

>>> sum(x*x for x in range(1,10))
285
>>> g = (x*x for x in range(1,10))
>>> g
<generator object <genexpr> at 0x7fc559516b90>

Podemos gerador e gerador de expressões ligadas, no exemplo a seguir vamos ler o arquivo '/var/log/cron'e visualizar qualquer tarefa dada (buscamos por exemplo 'anacron') executar com êxito.

Podemos usar o shellcomando tail -f /etc/crontab |grep anacronpara fazer a mesma coisa (de acordo com a Ctrl + Cterminar a execução de comandos).

>>> jobtext = 'anacron'
>>> all = (line for line in open('/etc/crontab', 'r') )
>>> job = ( line for line in all if line.find(jobtext) != -1)
>>> text = next(job)
>>> text
'25 6\t* * *\troot\ttest -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )\n'
>>> text = next(job)
>>> text 
'47 6\t* * 7\troot\ttest -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )\n'
>>> text = next(job)
>>> text
'52 6\t1 * *\troot\ttest -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )\n'

Closures

Fecho (tampas) é uma função retorna um de função por outro . Nós usamos os fechos para remover código duplicado. No exemplo a seguir, criamos um fecho simples de soma digital.

>>> def add_number(num):
...     def adder(number):
...         #adder 是一个闭包
...         return num + number
...     return adder
...
>>> a_10 = add_number(10)
>>> a_10(21)
31
>>> a_10(34)
44
>>> a_5 = add_number(5)
>>> a_5(3)
8

decorador

Decorador (decoradores) alguns objetos usados ​​para adicionar dinamicamente um comportamento novo, foram utilizados os fechamentos é o mesmo.

Criar um exemplo simples, para imprimir algumas declarações antes e depois da função é executada:

>>> def my_decorator(func):
...     def wrapper(*args, **kwargs):
...         print("Before call")
...         result = func(*args, **kwargs)
...         print("After call")
...         return result
...     return wrapper
...
>>> @my_decorator
... def add(a, b):
...     #我们的求和函数
...     return a + b
...
>>> add(1, 3)
Before call
After call
4
Publicado 33 artigos originais · ganhou elogios 1 · vista 1234

Acho que você gosta

Origin blog.csdn.net/weixin_44783002/article/details/104747594
Recomendado
Clasificación