我试图理解迭代器。我注意到 Python文档 认为迭代器是一个功能风格的构造。我真的不明白。
迭代器里面有一个状态是不是真的。所以当你打电话 it.__next__()
,你改变了迭代器的状态。据我所知,对象的变异状态不被认为是功能性的,因为函数式编程强调对象/闭包的不变性和组合能力。
实际上,问题出现了,因为我想编写一个Scheme过程/函数,它接受令牌并返回迭代器。
(define tokens->iterator
(lambda ls
(lambda ()
(if (null? ls)
'*eoi*
(let ((tok (car ls)))
(set! ls (cdr ls))
tok)))))
注意我必须使用 set!
变异 ls
这就是我提出这个问题的方法。
要使用它,
(define it (tokens->iterator 1 '+ 2))
为了测试它,
scheme@(guile-user)> (it)
$2 = 1
scheme@(guile-user)> (it)
$3 = +
scheme@(guile-user)> (it)
$4 = 2
scheme@(guile-user)> (it)
$5 = *eoi*
scheme@(guile-user)> (it)
$6 = *eoi*
只是为了好玩,我还将其翻译成Python:
def tokens_to_iterator(*tup):
ls = list(tup)
def iterator():
if not ls:
return "*eoi*"
else:
tok = ls.pop(0)
return tok
return iterator
类似地,pop()方法通过改变列表来移除并返回第一个元素。
要使用它,
it = tokens_to_iterator(1, "+", 2)
为了测试它,
>>> it()
1
>>> it()
'+'
>>> it()
2
>>> it()
'*eoi*'
>>> it()
'*eoi*'
任何人都可以澄清一下吗?顺便说一句,我正在使用Python 3和Guile Scheme,以防任何人有兴趣尝试这些例子。