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 StopIteration
uma 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 yield
funçõ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 While
ciclo, cada tempo para executar yield
quando 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 while
ciclo e, mais uma vez veio para yield
a 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.walk
do 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 shell
comando tail -f /etc/crontab |grep anacron
para fazer a mesma coisa (de acordo com a Ctrl + C
terminar 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