2016-01-13 2 views
1

Я пытаюсь создать генератор, который печатает следующее число в списке. Это версия ракеток:Создание генератора в python

(require racket/generator) 

    (define my-gen 
    (generator 
    (_) 
    (for ([x (list 1 2 3))]) 
     (yield x))) 

)

Как это должно работать:

(my-gen) -> 1 
(my-gen) -> 2 

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

l = [1, 2, 3] 
def myGen(): 
    for element in l: 
     yield element 

g = myGen() 
print(next(g)) 

Каков наилучший способ сделать это в python?

+0

Что вы подразумеваете, не инициализируя его? Вы могли бы просто использовать выражение генератора - 'my_gen = (элемент для элемента в l)', но это действительно не обязательно, поскольку 'my_gen = iter (l)' будет достаточно в вашем примере. – AChampion

+0

Это именно то, что я имел в виду на самом деле, так как я читаю из определенного файла, и я пытался заставить генератор вернуть следующий элемент в списке на протяжении всей программы. – Lana

ответ

1

Использование functools.partial:

>>> import functools 
>>> l = [1, 2, 3] 
>>> my_gen = functools.partial(next, iter(l)) 
>>> my_gen() 
1 
>>> my_gen() 
2 
>>> my_gen() 
3 
>>> my_gen() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 
0

Это то, что вы ищете?

number = 1 
while(number<500 +1): 
    print('(my-gen) ->', number) 
    number +=1 
2
# Generator expression 
(exp for x in iter) 

# List comprehension 
[exp for x in iter] 

Итерация по выражению генератора или список понимание будет делать то же самое. Тем не менее, понимание списка создаст весь список в памяти, в то время как выражение генератора будет создавать элементы «на лету», поэтому вы сможете использовать его для очень больших.

В генераторе выше будет создан объект генератора, чтобы получить данные, которые вы перебираете или фильтруете по нему. Это может помочь вам

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