python中的前一个屈服操作

2024-10-03 09:11:52 发布

您现在位置:Python中文网/ 问答频道 /正文

最近我在python中使用了“yield”。我发现生成器函数非常有用。我的问题是,是否有东西可以减少生成器对象中富有想象力的光标。至于next(genfun)如何移动和输出容器中的+第i项,我想知道是否存在任何函数可以调用类似previous(genfun)的内容并移动到容器中的-1th项

实际工作

def wordbyword():
  words = ["a","b","c","d","e"]
  for word in words:
    yield word

getword = wordbyword()

next(getword)
next(getword)

输出的

a
b

我希望看到和实现的是

def wordbyword():
  words = ["a","b","c","d","e"]
  for word in words:
    yield word

getword = wordbyword()

next(getword)
next(getword)
previous(getword)

预期产出

a
b
a

这听起来可能有点傻,但在生成器中是否有此之前的,如果没有,为什么会这样?。为什么我们不能减少迭代器,或者我不知道现有的方法,请告诉我一些情况。什么是最接近的方法来实现我手头上的东西


Tags: 对象方法函数infordef容器word
3条回答

在生成器对象上迭代会消耗它的元素,因此在使用next之后没有什么可返回的。您可以将生成器转换为list,并实现自己的nextprevious

index = 0


def next(lst):
    global index
    index += 1
    if index > len(lst):
        raise StopIteration
    return lst[index - 1]


def previous(lst):
    global index
    index -= 1
    if index == 0:
        raise StopIteration
    return lst[index - 1]

getword = list(wordbyword())
print(next(getword)) # a
print(next(getword)) # b
print(previous(getword)) # a

不,在生成器函数中没有这样的函数来排序返回。原因是Python不会以本机方式在生成器函数中存储上一个值,并且由于它不会存储该值,因此也无法执行重新计算

例如,如果生成器是对时间敏感的函数,例如

def time_sensitive_generator():
    yield datetime.now()

您将无法重新计算此生成器函数中的上一个值

当然,这只是无法计算以前的值的许多可能情况中的一种,但这就是想法

如果你不自己存储价值,它将永远丢失。

如前所述,没有这样的功能,因为生成器的整个点都是具有较小的内存占用。您需要存储结果

您可以自动存储以前的结果。生成器的一个用例是当您有一个概念上无限的列表(例如素数列表)时,您只需要一个初始段。您可以编写一个生成器,作为副作用构建这些初始段。有一个可选的history参数,生成器在生成时附加到该参数。例如:

def wordbyword(history = None):
  words = ["a","b","c","d","e"]
  for word in words:
      if isinstance(history,list): history.append(word)
      yield word

如果使用不带参数的生成器getword = wordbyword(),它将像普通生成器一样工作,但如果向其传递一个列表,该列表将存储不断增长的历史:

hist = []
getword = wordbyword(hist)

print(next(getword)) #a
print(next(getword)) #b
print(hist) #['a','b']

相关问题 更多 >