📜  Python|生成器表达式

📅  最后修改于: 2022-05-13 01:54:35.941000             🧑  作者: Mango

Python|生成器表达式

Python中,要创建迭代器,我们可以使用常规函数和生成器。生成器的编写方式与普通函数一样,但我们使用 yield() 而不是 return() 来返回结果。作为实现迭代器的工具,它更强大。由于它提供了按需评估元素,因此实现起来更容易也更方便。与遇到 return 语句完全终止的常规函数不同,生成器使用 yield 语句,其中函数的状态从上次调用中保存,并且可以在下次调用生成器函数时被拾取或恢复。生成器相对于列表的另一个巨大优势是它占用的内存少得多。

除此之外,另外两个函数 _next_() 和 _iter_() 使生成器函数更加紧凑和可靠。例子 :

Python3
# Python code to illustrate generator, yield() and next().
def generator():
    t = 1
    print ('First result is ',t)
    yield t
 
    t += 1
    print ('Second result is ',t)
    yield t
 
    t += 1
    print('Third result is ',t)
    yield t
 
call = generator()
next(call)
next(call)
next(call)


Python3
# Python code to illustrate generator expression
generator = (num ** 2 for num in range(10))
for num in generator:
    print(num)


Python3
string = 'geek'
li = list(string[i] for i in range(len(string)-1, -1, -1))
print(li)


输出 :

First result is  1
Second result is  2
Third result is  3

生成器函数和普通函数之间的区别 -

  • 一旦函数屈服,函数就会暂停,控制权就会转移给调用者。
  • 当函数终止时,StopIteration 会在进一步调用时自动引发。
  • 在连续调用之间会记住局部变量及其状态。
  • 生成器函数包含一个或多个 yield 语句而不是 return 语句。
  • 由于 _next_() 和 _iter_() 等方法是自动实现的,因此我们可以使用 next() 遍历项目。

还有各种其他表达式可以简单地编码为类似于列表推导式,但我们使用括号代替括号。这些表达式是为生成器立即被封闭函数使用的情况而设计的。生成器表达式允许创建没有 yield 关键字的生成器。但是,它并不共享使用 yield函数创建的生成器的全部功能。例子 :

Python3

# Python code to illustrate generator expression
generator = (num ** 2 for num in range(10))
for num in generator:
    print(num)

输出 :

0
1
4
9
16
25
36
49
64
81

我们还可以使用生成器表达式生成列表:

Python3

string = 'geek'
li = list(string[i] for i in range(len(string)-1, -1, -1))
print(li)

输出:

['k', 'e', 'e', 'g']