Python 与迭代器相比,生成器返回一个隐式的iterable序列意味着什么?

Python 与迭代器相比,生成器返回一个隐式的iterable序列意味着什么?,python,iterator,generator,Python,Iterator,Generator,我是编程新手,在一个概念问题上遇到了麻烦 课堂上有人说,一个生成器用来分解执行。其次,也有人说“当使用生成器时,我们执行惰性求值,这会产生一个隐式的iterable序列。” 我不明白为什么它是“懒惰评估”这个概念。有一个隐式iterable序列意味着什么?这不是迭代器的用途吗 大多数在线网站只是谈论迭代器和生成器之间的区别,但我不明白分解执行可能意味着什么。因为我们只能在执行过程中使用生成器。这是否意味着它的工作方式类似于返回语句?​ 看看下面的生成器示例: # Lazy evaluation.

我是编程新手,在一个概念问题上遇到了麻烦

课堂上有人说,一个生成器用来分解执行。其次,也有人说“当使用生成器时,我们执行惰性求值,这会产生一个隐式的iterable序列。”

我不明白为什么它是“懒惰评估”这个概念。有一个隐式iterable序列意味着什么?这不是迭代器的用途吗


大多数在线网站只是谈论迭代器和生成器之间的区别,但我不明白分解执行可能意味着什么。因为我们只能在执行过程中使用生成器。这是否意味着它的工作方式类似于返回语句?​

看看下面的生成器示例:

# Lazy evaluation. Instead of an "instant" complete result
# you get an iterator that you can execute in steps to get
# all results, one by one.

# This can be useful to save memory if the results are big,
# or to advance code execution in steps, because the generator
# remembers state between next() calls
def get_three_ints(start=0):
    for next_int in range(start, start+3):
        print("I'm running!") # advance a little more in code
        yield next_int # suspend execution here. Wait for
                       # another next() # while returning
                       # next_int


gen = get_three_ints(5) # gen is a generator function because of yield
print(next(gen))
print(next(gen))
print(next(gen))

try:
    print(next(gen)) # raises StopIteration (the iterator was consumed)
except StopIteration:
    print("Got a StopIteration.\n")

# Another generator. A generator is implicitely iterable.
gen = get_three_ints(10)
for i in gen:
    print(i)

# This is because both an __iter__ and __next__ special methods
# were created in your generator object just by using the keyword yield
print()
print(type(gen),'\n')

gen_attrs = dir(gen)
print('__iter__' in gen_attrs)
print('__next__' in gen_attrs)

# The "opposite" of this is creating a function that executes at once
# and returns the complete result
def get_three_ints_now(start=0):
    return list(range(start, start+3))

print()
print(get_three_ints_now(20))

# Output:

I'm running!
5
I'm running!
6
I'm running!
7
Got a StopIteration.

I'm running!
10
I'm running!
11
I'm running!
12

<class 'generator'> 

True
True

[20, 21, 22]
#惰性评估。而不是“即时”的完整结果
#您得到了一个迭代器,可以分步执行以获得
#所有结果,一个接一个。
#如果结果很大,这有助于节省内存,
#或者逐步推进代码执行,因为生成器
#记住next()调用之间的状态
def获取三个整数(开始=0):
对于范围内的下一个整数(开始,开始+3):
打印(“我正在运行!”)#在代码方面再前进一点
产生下一个_int#在这里暂停执行。等待
#下一个()#返回时
#下一步
gen=获得三个整数(5)#由于产量的原因,gen是一个生成函数
打印(下一代)
打印(下一代)
打印(下一代)
尝试:
print(next(gen))#引发StopIteration(迭代器已被使用)
除停止迭代外:
打印(“得到一个停止迭代。\n”)
#另一台发电机。生成器是隐式可引用的。
gen=获得三个整数(10)
对于gen中的i:
印刷品(一)
#这是因为iter和next两种特殊方法
#仅通过使用关键字yield在生成器对象中创建
打印()
打印(类型(gen),“\n”)
gen_attrs=dir(gen)
打印(通用属性中的“iter”)
打印(gen属性中的“下一个”)
#与此相反的是创建一个立即执行的函数
#并返回完整的结果
def立即获取三个输入(开始=0):
返回列表(范围(开始,开始+3))
打印()
打印(立即获取三个输入(20))
#输出:
我在跑!
5.
我在跑!
6.
我在跑!
7.
有一个迭代停止了。
我在跑!
10
我在跑!
11
我在跑!
12
真的
真的
[20, 21, 22]

看看下面的生成器示例:

# Lazy evaluation. Instead of an "instant" complete result
# you get an iterator that you can execute in steps to get
# all results, one by one.

# This can be useful to save memory if the results are big,
# or to advance code execution in steps, because the generator
# remembers state between next() calls
def get_three_ints(start=0):
    for next_int in range(start, start+3):
        print("I'm running!") # advance a little more in code
        yield next_int # suspend execution here. Wait for
                       # another next() # while returning
                       # next_int


gen = get_three_ints(5) # gen is a generator function because of yield
print(next(gen))
print(next(gen))
print(next(gen))

try:
    print(next(gen)) # raises StopIteration (the iterator was consumed)
except StopIteration:
    print("Got a StopIteration.\n")

# Another generator. A generator is implicitely iterable.
gen = get_three_ints(10)
for i in gen:
    print(i)

# This is because both an __iter__ and __next__ special methods
# were created in your generator object just by using the keyword yield
print()
print(type(gen),'\n')

gen_attrs = dir(gen)
print('__iter__' in gen_attrs)
print('__next__' in gen_attrs)

# The "opposite" of this is creating a function that executes at once
# and returns the complete result
def get_three_ints_now(start=0):
    return list(range(start, start+3))

print()
print(get_three_ints_now(20))

# Output:

I'm running!
5
I'm running!
6
I'm running!
7
Got a StopIteration.

I'm running!
10
I'm running!
11
I'm running!
12

<class 'generator'> 

True
True

[20, 21, 22]
#惰性评估。而不是“即时”的完整结果
#您得到了一个迭代器,可以分步执行以获得
#所有结果,一个接一个。
#如果结果很大,这有助于节省内存,
#或者逐步推进代码执行,因为生成器
#记住next()调用之间的状态
def获取三个整数(开始=0):
对于范围内的下一个整数(开始,开始+3):
打印(“我正在运行!”)#在代码方面再前进一点
产生下一个_int#在这里暂停执行。等待
#下一个()#返回时
#下一步
gen=获得三个整数(5)#由于产量的原因,gen是一个生成函数
打印(下一代)
打印(下一代)
打印(下一代)
尝试:
print(next(gen))#引发StopIteration(迭代器已被使用)
除停止迭代外:
打印(“得到一个停止迭代。\n”)
#另一台发电机。生成器是隐式可引用的。
gen=获得三个整数(10)
对于gen中的i:
印刷品(一)
#这是因为iter和next两种特殊方法
#仅通过使用关键字yield在生成器对象中创建
打印()
打印(类型(gen),“\n”)
gen_attrs=dir(gen)
打印(通用属性中的“iter”)
打印(gen属性中的“下一个”)
#与此相反的是创建一个立即执行的函数
#并返回完整的结果
def立即获取三个输入(开始=0):
返回列表(范围(开始,开始+3))
打印()
打印(立即获取三个输入(20))
#输出:
我在跑!
5.
我在跑!
6.
我在跑!
7.
有一个迭代停止了。
我在跑!
10
我在跑!
11
我在跑!
12
真的
真的
[20, 21, 22]