Python 当前生成器值是否可以与之前生成的值交互?

Python 当前生成器值是否可以与之前生成的值交互?,python,generator,yield,Python,Generator,Yield,我知道,yield会动态生成一个值,根据我的理解,这意味着它不会将该值保留在内存中,因此当前值不应该能够与最后一个值交互 但我只是想确定情况确实如此,有人能证实这是否可行吗 我将使用5作为number中的值 不带发电机的示例: def factorial(number): result = number if number <= 1: return 1 else: for x in reversed(range(1, number))

我知道,yield会动态生成一个值,根据我的理解,这意味着它不会将该值保留在内存中,因此当前值不应该能够与最后一个值交互

但我只是想确定情况确实如此,有人能证实这是否可行吗

我将使用5作为number中的值

不带发电机的示例:

def factorial(number):
    result = number
    if number <= 1:
        return 1
    else:
        for x in reversed(range(1, number)): # (4,1) reversed
            result *= x # 5*4*3*2*1
    return result # returns 120
def阶乘(数字):
结果=数量

如果数字生成器可以是有状态的:

def fibs():
    a, b = 1, 1
    while True:
        yield b
        a, b = b, a + b

g = fibs()

for i in range(10):
    print next(g)
这里的状态是局部变量。当生成器生成的迭代器处于活动状态时,它们保持活动状态

编辑。我瞎了这是一个阶乘

def factorials():
    i = 1
    a = 1
    while True:
        yield a
        i+=1
        a*=i
或者,如果你需要一个函数,而不是它们的流,那么这里有一个单行程序

print reduce(lambda a, b: a*b, (range(1, 10+1)))

生成器可以是有状态的:

def fibs():
    a, b = 1, 1
    while True:
        yield b
        a, b = b, a + b

g = fibs()

for i in range(10):
    print next(g)
这里的状态是局部变量。当生成器生成的迭代器处于活动状态时,它们保持活动状态

编辑。我瞎了这是一个阶乘

def factorials():
    i = 1
    a = 1
    while True:
        yield a
        i+=1
        a*=i
或者,如果你需要一个函数,而不是它们的流,那么这里有一个单行程序

print reduce(lambda a, b: a*b, (range(1, 10+1)))

但是,使用生成器执行
factorial()
有什么意义呢?你将把它作为一个函数来使用——你不会用它来迭代或生成任何东西。为什么使用收益率?“根据我的理解,这意味着它不会将值保留在内存中”-正确。“因此当前值不能与最后一个值交互”-不正确。这就是变量的用途。“不带生成器的示例:”-不正确。
反向
范围
都是生成器。如果您的意思是将
factorial
转换为生成器,因为它只返回一个值,那么将
return
转换为
yield
就是所需的全部。你是说一个可以生成连续阶乘的生成器,你可以调用它,比如
factorial(range(10))
?@Amadan我希望我能给你和Primusa一个正确的回答,但我的知识有限,我只是在看一个关于收益率函数的视频,此人指出,在大型循环中,返回函数将花费更长的时间和更多的内存使用,而收益函数是即时的,内存使用很少,在我的原始帖子中的示例中,如果你要对200000之类的东西进行阶乘,则需要几秒钟,所以我想知道使用yield是否可以立即返回200000个元素的列表,这需要一些内存。假设使用相同的算法,生成200000个元素所需的工作量是相同的,但是您可以对其进行切片。这就是为什么我说生成器通常只在可能有多个值的情况下才有意义——始终只返回一个值的生成器不是很有用;如果你想让他们送到,把他们放在卡车上(占用空间),然后一次把他们全部交给你是有道理的。在一个建筑工地上,当一个家伙把它们放在墙上,用灰浆打它们时,你希望它们一个接一个地交给你,而不是一下子全部扔给你。但是用发电机做
factorial()
有什么意义呢?你将把它作为一个函数来使用——你不会用它来迭代或生成任何东西。为什么使用收益率?“根据我的理解,这意味着它不会将值保留在内存中”-正确。“因此当前值不能与最后一个值交互”-不正确。这就是变量的用途。“不带生成器的示例:”-不正确。
反向
范围
都是生成器。如果您的意思是将
factorial
转换为生成器,因为它只返回一个值,那么将
return
转换为
yield
就是所需的全部。你是说一个可以生成连续阶乘的生成器,你可以调用它,比如
factorial(range(10))
?@Amadan我希望我能给你和Primusa一个正确的回答,但我的知识有限,我只是在看一个关于收益率函数的视频,此人指出,在大型循环中,返回函数将花费更长的时间和更多的内存使用,而收益函数是即时的,内存使用很少,在我的原始帖子中的示例中,如果你要对200000之类的东西进行阶乘,则需要几秒钟,所以我想知道使用yield是否可以立即返回200000个元素的列表,这需要一些内存。假设使用相同的算法,生成200000个元素所需的工作量是相同的,但是您可以对其进行切片。这就是为什么我说生成器通常只在可能有多个值的情况下才有意义——始终只返回一个值的生成器不是很有用;如果你想让他们送到,把他们放在卡车上(占用空间),然后一次把他们全部交给你是有道理的。在一个建筑工地上,当一个人把它们放在墙上,用灰浆打它们时,你希望它们一个接一个地交给你,而不是一下子扔给你。注意:实际上我们不计算阶乘,我们只是把前100个存储在一个表中。它们增长得如此之快,以至于对于更大的应用来说,唯一的用例是数字理论。在这种情况下,您可以使用特定于领域的东西,比如从素因子分解计算它们。注意:实际上,我们不计算因子,我们只是将前100个存储在表中。它们增长得如此之快,以至于对于更大的应用来说,唯一的用例是数字理论。在这种情况下,您可以使用特定于领域的东西,比如从素因子分解计算它们。