跟着我们一起学 Python 30天课程-第15天-生成器Generators

作者 : IT 大叔 本文共3558个字,预计阅读时间需要9分钟 发布时间: 2020-08-21

今天,我探讨了有关Python 生成器概念的所有内容。生成器的概念也存在于JavaScript世界中。它是在ES6版本的JavaScript中引入的,但是我在实际的JavaScript项目中并未使用它们太多。在今天阅读它们的同时,我意识到它们可能会很有用,并且已在多个Python库和框架中使用。

那么什么是发电机?

生成器是一种特殊的函数,它一次返回一组可迭代的值,这意味着可以循环遍历以逐个获取值。有时也称为可以“暂停”的功能。从理论上讲,生成器听起来很复杂且令人困惑。最好使用代码示例进行解释。我们已经使用内置的Python生成器range生成一系列值。

range_of_numbers = range(100) # a generator
for num in range_of_numbers: 
    print(num)
# Since range is a generator, it can be iterated or looped
def my_infinite_generator():
  num = 0
  while True:
    yield num
    num +=1

result = my_infinite_generator()
for i in result:
  print(i) # Kepps on printing values infinitely!

那么这个生成器函数到底是什么?它与普通函数有何不同?

函数只能使用return语句返回一个值。一旦函数到达return语句,它将返回该值并退出。生成器函数可以使用特殊关键字返回任意数量的值yield。无论何时yield到达该语句,函数执行都会暂停,并将控制权传递给调用该函数的人。

可以通过迭代或使用next在生成器上调用的另一个内置函数来提取生成器的值。在上面的代码块中,使用迭代(for循环)打印生成器的值。使用该next功能可以手动完成。

def my_infinite_generator():
  num = 0
  while True:
    yield num
    num +=1

result = my_infinite_generator()
print(next(result)) # 0
print(next(result)) # 1
print(next(result)) # 2
print(next(result)) # 3
print(next(result)) # 4

请注意生成器函数如何能够记住num的值并能够对其进行递增。每当yield到达语句时,它都会保存局部变量及其状态,然后将控件转移到调用方。

def my_generator(max):
  num = 0
  while num < 3:
    yield num
    num +=1

result = my_generator(3)
print(next(result)) # 0
print(next(result)) # 1
print(next(result)) # 2
print(next(result)) # Stop Iteration Error

迭代完成后(在上述情况下,当num = 3时),生成器函数会在进一步next调用它时自动引发StopIteration异常。如果使用for循环迭代同一生成器,则一旦生成器引发StopIteration,该循环将自动停止。for循环在内部处理并终止。

Performance benefits of using generators

生成器功能可提高内存效率。当处理需要大量处理才能计算出结果的大量数据时,生成器确实派上用场。内存是有限的资源,我们的系统只能在内存中保存有限数量的数据。

例如,如果我们必须创建一个接受数字并打印斐波那契数列直到该数字的函数,则常规方法将是这样的

def fibonacci(num):
  sequence = []
  a,b = 0,1
  for item in range(num):
    sequence.append(a)
    temp = a
    a = b
    b = temp + b
  return sequence

result = fibonacci(20)
print(result) # prints the fibonacci sequence

在上述功能中,整个序列作为列表存储在内存中。仅在将整个序列存储在内存中后才打印结果。数量较少时通常很好。但是,如果数量很大,则内存使用量将急剧增加,并且如果内存溢出,该过程甚至可能被终止。

使用生成器,可以使上述功能的存储效率更高

def fibonacci_generator(num):
  a,b = 0,1
  for item in range(num):
    yield a
    temp = a
    a = b
    b = temp + b

for num in fibonacci_generator(20):
  print(num)

在这种情况下,一次只在存储器中存储一个值,因此即使提供的数量很大,也可以打印值。

Composition

生成器可以组合在一起,或者换句话说,可以通过管道将它们组合在一起以组合来自不同生成器的结果。

例如,如果必须创建每个值均平方的斐波那契数列,则可以使用两个生成器函数来组成它们。

def fibonacci_generator(num):
  a,b = 0,1
  for item in range(num):
    yield a
    temp = a
    a = b
    b = temp + b

def square(nums):
  for num in nums:
    yield num**2

result = square(fibonacci_generator(5))

for num in result:
  print(num) # 0 1 1 4 9

在计算大型数据集并对其进行分层操作时,这种组合非常有用。

简而言之,这就是关于Python生成器的全部内容。今天探索生成器有助于我巩固围绕该概念的思维模型,现在我可能还可以想到在JavaScript中实现它们的方法。

明天标志着当前Python挑战的第三周开始,按照我计划的路线图,我将探索Python中的另一个重要主题-模块。我相信这会很有趣。

跟着我们一起学 Python 30天课程目录:

  1.  跟着我们一起学 Python 30天课程-第30天-免费Python资源 
  2.  跟着我们一起学 Python 30天课程-第29天-自动化测试 
  3.  跟着我们一起学 Python 30天课程-第28天-ML和数据科学II 
  4.  跟着我们一起学 Python 30天课程-第27天-ML和数据科学I 
  5.  跟着我们一起学 Python 30天课程-第26天-机器学习基础 
  6.  跟着我们一起学 Python 30天课程-第25天-Web 开发进阶
  7.  跟着我们一起学 Python 30天课程-第24天-Web开发基础 
  8.  跟着我们一起学 Python 30天课程-第23天-网页爬虫 
  9.  跟着我们一起学 Python 30天课程-第22天-脚本额外功能Scripting Extras 
  10.  跟着我们一起学 Python 30天课程-第21天-脚本编写基础 
  11.  跟着我们一起学 Python 30天课程-第20天-调试和测试 
  12.  跟着我们一起学 Python 30天课程-第19天-正则表达式 
  13.  跟着我们一起学 Python 30天课程-第18天-文件I / O 
  14.  跟着我们一起学 Python 30天课程-第17天-外部模块External Modules 
  15.  跟着我们一起学 Python 30天课程-第16天-模块基础Module Basics 
  16.  跟着我们一起学 Python 30天课程-第15天-生成器Generators 
  17.  跟着我们一起学 Python 30天课程-第14天-错误处理Error Handling 
  18.  跟着我们一起学 Python 30天课程-第13天-Decorators 
  19.  跟着我们一起学 Python 30天课程-第12天-Lambda Expressions & Comprehensions 
  20.  跟着我们一起学 Python 30天课程-第11天-函数编程Functional Programming基础 
  21.  跟着我们一起学 Python 30天课程-第10天-OOP Missing Pieces 
  22.  跟着我们一起学 Python 30天课程-第9天-OOP Pillars 
  23.  跟着我们一起学 Python 30天课程-第8天-OOP基础知识 
  24.  跟着我们一起学 Python 30天课程-第7天-开发环境搭建(Developer Environment) 
  25.  跟着我们一起学 Python 30天课程-第6天-循环II和函数(Loops II & Functions) 
  26.  跟着我们一起学 Python 30天课程-第5天-条件和循环I(Conditions & Loops I) 
  27.  跟着我们一起学 Python 30天课程-第4天-数据类型III(Data Types III) 
  28.  跟着我们一起学 Python 30天课程-第3天-数据类型II(Data Types II) 
  29.  跟着我们一起学 Python 30天课程-第2天-数据类型I(Data Types I) 
  30.  跟着我们一起学 Python 30天课程-第1天-简介 
免责声明:
1. 本站资源转自互联网,源码资源分享仅供交流学习,下载后切勿用于商业用途,否则开发者追究责任与本站无关!
2. 本站使用「署名 4.0 国际」创作协议,可自由转载、引用,但需署名原版权作者且注明文章出处
3. 未登录无法下载,登录使用金币下载所有资源。
IT小站 » 跟着我们一起学 Python 30天课程-第15天-生成器Generators

常见问题FAQ

没有金币/金币不足 怎么办?
本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
所有资源普通会员都能下载吗?
本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。

发表评论