2016-04-24 8 views
-3

Я учусь генератор в питона, здесь функции:Что отличается от этих двух функций с помощью отправки в Python

import math 
def is_primes(number): 
    if number > 1: 
     if number == 2: 
      return True 
     if number % 2 == 0: 
      return False 
     for current in range(3, int(math.sqrt(number) + 1), 2): 
      if number % current == 0: 
       return False 
     return True 
    return False 


def get_primes1(number): 
    while True: 
     if is_primes(number): 
      yield number 
     number +=1 

def get_primes2(number): 
    while True: 
     if is_primes(number): 
      number=yield number 
     number +=1 

при использовании функции отправки:

a=get_primes1(2) 
b=get_primes2(2) 
a.send(None)#return 2 
b.send(None)#return 2 
a.send(1)#return 3,the parameter in send() looks useless. 
b.send(1)#return 1,normal 

при использовании «а. send (1) "и" b.send (1) "Повторно, a.send (1) возвращает большее значение, но b.send (1) все равно возвращает одно и то же значение.

я проверить значение функции отправки:

возобновляет выполнение и `` посылает «» значения в функцию генератора. Аргумент value становится результатом текущего вывода. Метод send() возвращает следующее значение, полученное генератором, или вызывает StopIteration, если генератор выходит, не давая другого значения. Когда send() вызывается для запуска генератора, он должен быть вызван с None как аргумент, потому что нет выражения yield, которое могло бы получить значение.

+2

ли не ваш пример демонстрирует именно то, что вы спрашиваете? Вещь, которая отличается *, - это то, что отличается! * '.send' имеет эффект, если вы назначаете результат' yield', как и в 'get_primes2'. Если вы '.send (None)', это игнорируется в любом случае. – jonrsharpe

+0

Я думаю, что «send (x)» и x будет отправлен на get_primes1() и снова уступят ... @ jonrsharpe –

+2

Неясно, в чем ваш вопрос. – jonrsharpe

ответ

2

Как функция отправки работает в генераторе?

def counter(): 
    total = 0 

    while True: 
     increment = yield total #If next() was called, 
           #increment is assigned None. 
           #If send() was called, 
           #increment is assigned send()'s argument. 

     if increment: 
      total += increment 
     else: 
      total += 1 


g = counter() 
print(next(g)) 
print(next(g)) 
print(g.send(3)) 
print(next(g)) 

--output:-- 
0 
1 
4 
5 

значение экспрессирующем выходом является никто всякий раз, когда генератор возобновляется нормальным следующего() вызова.


метод

Send() для генератора-итератора, который возобновляет генератор и «посылает» значение, которое становится результатом текущего выход экспрессии. Метод Send() возвращает следующее значение, выданное посредством генератор

См PEP 342

но b.send (1) по-прежнему возвращать тот же value.why есть разница?

Поскольку вы перезагружаете number к стоимости отправки() 'ы аргумента снова и снова:

a: number = 2 
    number += 1 
    number += 1 

b: number = 2 
    number = 1 
    number += 1 
    number = 1 
    number += 1 
+0

Точно ...Здесь ничего не передается функции, и она используется как обратный вызов. Хороший пример @ 7stud. – Pouria

+0

жаль беспокоить!. в вашем примере (increment = yield total), означает ли это, что при вызове send() возвращает аргумент return output() или возвращает None (а затем increment = аргумент send)? –

+1

@DavidLee, см. Комментарий в коде. – 7stud

 Смежные вопросы

  • Нет связанных вопросов^_^