Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python产生了关键字的重要性和关于生成器的混淆?_Python_Python 3.x_Iterator_Generator - Fatal编程技术网

Python产生了关键字的重要性和关于生成器的混淆?

Python产生了关键字的重要性和关于生成器的混淆?,python,python-3.x,iterator,generator,Python,Python 3.x,Iterator,Generator,我很困惑为什么我们不说收益率b,如果我去掉收益率a,区别会是什么 我只是对它们与正常函数的比较感到困惑 def fibonacci(n): """ A generator for creating the Fibonacci numbers """ a, b, counter = 0, 1, 0 while True: if (counter > n): return yield a a, b

我很困惑为什么我们不说
收益率b
,如果我去掉
收益率a
,区别会是什么

我只是对它们与正常函数的比较感到困惑

def fibonacci(n):
    """ A generator for creating the Fibonacci numbers """
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(5)
for x in f:
    print(x, " ", end="") # 
print()

正常功能看起来几乎相同:

def fibonacci(n):
    """ A function for creating the Fibonacci numbers """
    a, b, counter = 0, 1, 0
    numbers = []
    while True:
        if (counter > n): 
            return numbers
        numbers.append(a)
        a, b = b, a + b
        counter += 1
def fibonacci(n):
“”“用于创建斐波那契数的函数”“”
a、 b,计数器=0,1,0
数字=[]
尽管如此:
如果(计数器>n):
返回号码
数字。附加(a)
a、 b=b,a+b
计数器+=1
b
仅用于跟踪流程的内部状态
a
是唯一通过迭代器或返回值直接公开的值,
b
仅用于计算
a

正则函数计算所有请求的斐波那契数,然后将它们存储在一个列表中,并将该列表返回给调用者。如果
n
很大,这可能需要大量的时间和内存


另一方面,生成器函数几乎立即返回,因为它还没有计算任何内容。它只返回了一个
生成器
实例,当传递到
下一个
时,该实例将计算序列中的下一个斐波那契数并返回它,然后返回等待,直到再次调用
下一个
。它只使用少量的固定内存,每次调用
next
只需要执行少量加法所需的时间。

看起来
a
包含序列中的“当前”数字,
b
包含“下一个”数字。你可以说
yield b
;这是函数最终想要产生的值。但是,如果您这样做,您将不得不在下一次迭代中跳过
生成a
,因为这与当前迭代中的
b
值相同。那么,如果生成器相同,我们为什么还要使用它们呢?这就是我困惑的地方!它们不一样,但定义看起来很相似。函数在返回之前创建所有请求的斐波那契数的列表。生成器函数创建一个生成器,它只计算在迭代时实际请求的每个数。因此,它们是C++中的空余函数,但具有保存结果的能力,好像它们是通过引用权传递的。不完全是这样,假设“空虚函数”是指不返回值的函数。code>fibonacci仍然返回一个值,但该值与协同程序非常相似,它类似于一个函数,但更一般,因为您可以暂停它的执行并在以后恢复它,而不必退出并重新启动。