geradores de Python detalhados

1. A definição de gerador

Em Python, enquanto o mecanismo de ciclo de cálculo lado, conhecido como um gerador de: gerador.

 

2. Por que deveria Builder

Uma lista de todos os dados na memória, se houver dados em massa, em seguida, será muito consumo de memória.

Tais como: só precisa de acesso os primeiros elementos por trás dos elementos que a grande maioria do espaço ocupado são desperdiçados.

Se os elementos da lista extrapolado de acordo com algum algoritmo, então podemos continuar a calcular os elementos subsequentes ao longo do ciclo, para que você não criar uma lista completa, economizando um monte de espaço.

Simplificando: eu quero obter dados enormes, e quer que ele ocupe menos espaço, em seguida, usar um gerador!

 

3. Como criar gerador

O primeiro método é muito simples, desde que um tipo de lista geração de []mudança (), cria um gerador:

 

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

 Criando Le gdiferem apenas na camada mais externa []e (), Luma lista e gum gerador.

 

Segundo método, se uma função contém yielda palavra-chave, então essa função não é mais uma função comum, mas um gerador. função de chamada é criar um gerador de objetos (gerador).

 

4. As obras de gerador

Chave (1) gerador (gerador) capaz de iteração é que ele tem um método seguinte (),

  princípio de funcionamento é chamando repetidamente o método next () até que você capturar uma exceção.

(2) rendimento já não funcionam com uma função comum, mas um gerador de gerador.

  próxima chamada disponível () para gerar valores de objeto. próxima duas maneiras t .__ próxima __ () | seguinte (t).

  Disponível para circuito adquire um valor de retorno (A cada vez, o que leva um gerador de valor)

  (Não é substancialmente utilizado next()para obter um valor de retorno é, mas a utilização de directos foriterações do ciclo).

(3) proporcionar o retorno equivalente para devolver um valor, e lembrar-se esta posição de retorno, a iteração seguinte, o código é executado a partir da próxima instrução de rendimento.

(4) .send () e próxima () do mesmo, de modo que o gerador pode continuar a percorrer uma etapa adicional (rendimento de paragem próximo encontro) para baixo, mas send () pode transmitir um valor que, como resultado do rendimento global de expressão

  - em outras palavras, você pode enviar uma força para modificar o valor do rendimento expressão. Tal como uma atribuição de função de escoamento, A = rendimento de 5, esta primeira iteração voltará a 5, um ainda não atribuído. Segunda iteração, utilizando .send (10), em seguida, é forçado para modificar a expressão de rendimento 5 é 10, originalmente 5, então A = 10

 

Rendimento valor processo de retorno sob sentimentos ( preocupação: onde cada parada, na próxima vez que começar de onde ) e send () parâmetro passando processo de comunicação,

Pensando em como Nenhum é gerado (primeiro valor :. Rendimento retorna valor i 0, parou no rendimento i, Temp não atribuir um valor a um segundo valor, a partir de impressão, a temperatura não foi atribuído, de modo a impressão Nenhum, i é incrementado por 1, enquanto continua a determinação, o rendimento do valor de retorno de i 1, parado no rendimento i):

 

 

 

Bem, ele não falava muito, Cuihua, em castanhas:

 

 1 #encoding:UTF-8  
 2 def yield_test(n):  
 3     for i in range(n):  
 4         yield call(i)  
 5         print("i=",i)      
 6     print("Done.")  
 7   
 8 def call(i):  
 9     return i*2  
10   
11 for i in yield_test(5):  
12     print(i,",")

 

  resultados:

 

>>>   
0 ,  
i= 0  
2 ,  
i= 1  
4 ,  
i= 2  
6 ,  
i= 3  
8 ,  
i= 4  
Done.
>>>

 

 A chave para entender é que: quando a próxima iteração, o código é executado a partir da próxima declaração de rendimento.

 

 resumo:

O que é um gerador?

Builder apenas para salvar um conjunto de algoritmos para gerar valor, e não deixe que este algoritmo irá agora começar, mas quando eu ajustá-lo, e quando ele começa a calcular um novo valor e retorno para você.

 

 

exercícios:

 

def count_down(n):
    while n >= 0:
        newn = yield n
        print('newn', newn)
        if newn:
            print('if')
            n = newn
            print('n =', n)
        else:
            n -= 1


cd = count_down(5)
for i in cd:
    print(i, ',')
    if i == 5:
        cd.send(3)

 

 

resultados:

 

Nota: xx = rendimento aa
Resumo: O efeito de envio () é para atribuir um valor de xx (parâmetro de envio) é enviado, em seguida, para permitir que as executa a próxima geração de rendimento ..

Use send (params) situação diferente.
Nota: Se um produtor não começar, ele deve ser necessário para iniciar o gerador () antes do uso de envio, eo método pode ser iniciada generator.next () ou generator.send (Nenhum) para se apresentar no primeiro um rendimento, após você pode usar o send (params) continuou os valores de entrada.
Se ele for iniciado, em seguida, enviar (params) papel é dar xx valor atribuído (o parâmetro de envio) para enviar, e depois deixe o construtor executar a próxima rendimento.

Por send (None), também é bem compreendido, porque o gerador não chegou à primeira declaração de rendimento, se acontecer um valor verdadeiro, então não há ninguém para "receber"-lo. Uma vez que o gerador começou, objetos de aceitar (esquerda ou da esquerda do valor xx = número recebido),
então você pode usar o send (params) continuou os valores de entrada.

▲ Note-se que cada um dos send () será executado com a declaração de rendimento, mas não executa a tarefa, haverá apenas um valor de retorno, o equivalente a retornar após a função de saída, de modo que a atribuição depois que o valor de retorno não será executado.

 

Publicado 43 artigos originais · ganhou elogios 28 · vê 40000 +

Acho que você gosta

Origin blog.csdn.net/u013380694/article/details/101285849
Recomendado
Clasificación