好吧, 我会的
这一份庞大的名单, 终于被录入完毕｡
但请记住我们的关键术语｡
还记得我说过列表是可迭代的吗？
什么是可迭代的？
迭代对象是Python中任何一个我们可以在底层循环的对象.
它具有dunder输入方法｡
所以当创建对象时, 这个编辑器允许我们有一个可迭代的对象,
它可以被迭代来迭代一些东西, 或者迭代是从一个可迭代的对象中取出一个项目, 对它做一些事情, 然后进入下一个｡
我们所使用的循环, 如for循环或while循环, 我们称之为迭代｡
而是过程本身｡
还有发电机｡
实际上是可迭代的｡
也就是说生成元是可迭代的｡
您可以对它们进行迭代, 但并不是所有可迭代的都是生成器｡
例如, 范围就是生成器｡
所以它总是可迭代的｡
但是列表是一个可迭代的, 但它不是一个生成器｡
所以生成元是可迭代的子集｡
我知道这是一个很大的词｡
希望你还在我身边｡
生成器和正则可迭代对象之间的区别在于我们实现它们的方式｡
让我来给你们展示一个生成器的通用方法｡
让我们清除这段代码并定义我们自己的生成器｡
生成器通常是函数就像范围是函数一样｡
生成器通常是这样创建的｡
我们来说说生成函数｡
这个生成器函数有一个四个循环, 在一个范围内循环, 就像我们之前做的那样｡
但这里的区别在于, 让我们实际上回到之前的代码｡
她会把这个注释掉, 这样我们就能看到它的不同之处｡
生成器函数将｡
比如说, 创建这么多项｡
但我们不像在常规函数中那样返回, 我们将使用一个名为yield的关键字.
这里我们要让出, 所以, 项｡
所以注意这里的区别｡
现在, 如果我们想要, 就像这里, 我们可以传递一个数字｡
就像这样｡
但却没有返回｡
添加这个列表并创建所有这些数据, 我们将使用eald｡
现在希尔德做什么？
你看, 希尔德暂停了这个函数, 当我们对它做了什么的时候, 又回到了它, 这叫做next,
我们很快就会讲到｡
所以希尔德说, 嘿, 暂停这个函数, 只要希尔德, 我给予我, 当你告诉我继续, 然后我会继续｡
那么, 我们如何才能做到这一点？
好吧, 我可以说是生成器函数中的项｡
我会的｡
打印｡
项｡
这里, 我们要循环遍历生成函数, 然后给予它给生成函数,
假设现在是1000.
我们要打印生成函数中的每一项因为这是一个可迭代的｡
它会运行, 它会循环｡
对于这个数中的每一个项, 我们得到Y, 所以它会一直循环下去.
当我们回来的时候, 我们循环｡
我们来计算一下收益率｡
回来再跑｡
让我来告诉你我的意思｡
我要把这个注释掉, 把这个也注释掉｡
然后单击此处的“运行”｡
你看到了吗？
我们刚才在这里做的和下面的很相似, 但不是在内存中创建列表, 而是一个一个地继续｡
我们的记忆中只有一个项目｡
我们想怎么用就怎么用｡
在我们的例子中, 我们所做的只是打印项目｡
让我们进一步探讨这个关键字｡
它实际上是做什么的？
假设我们想把它乘以2, 就像我们在最初的列表例子中所做的那样｡
但是现在, 我们不做四个循环, 我们只调用函数｡
比如说, gee, 等于生成函数, 我们给予它100｡
现在, 如果我打印G, 然后单击“运行”｡
你看到了吗？
我得到一个生成器对象｡
记住, 这只是Python中的标准方法, 我们可以使用range和yield关键字创建一个生成函数｡
但是这个关键字给了我们一些力量, 因为如果我回到这里｡
我们不会得到什么特别的东西｡
事实上, 我们只是用yield关键字来得到一个值｡
我们能做的就是把它转化成一个可以很好地运行的生成器函数｡
这个我可以说下g｡
现在如果我在这里打印下一个G, 然后单击“运行”｡
我得零分｡
但这里有一个很酷的部分｡
如果我把下一个G做两次, 然后在这里做一次, 然后打印出来｡
我得到了｡
为什么会这样呢？
记住关键字暂停功能｡
刚才我用100来运行这个函数｡
范围100中的第一个项目为零｡
好吧, 我知道了
在我还没能运行它之前, 它就说, 嘿, 这是一个生成器函数, 但是你第一次运行它的时候｡
输出为0乘以2, 这样第一次运行这个函数时, 我就点击了Run.
我们会把它改成I｡
这只是零｡
如果我像这样再运行一次, 我们就成功了｡
现在我要你重复一遍, 然后找到一个.
所以一乘二｡
那是什么？
嗯, 一乘二｡
让我来解决｡
就像这样｡
确保这是I, 我得到2, 因为1乘以2等于2｡
如果我再运行一次, 然后单击“运行”｡
我得到了｡
你看, 我是说...
Hield, 就像我之前说的, 暂停函数, 当next被调用时再回来｡
所以如果它有一个yield关键字, 它就变成了一个生成器｡
它会跟踪这个状态, 我们称之为值, 它只在内存中保存最近的数据, 例如, 因为它会记住,
比如说, 在第14行, 如果我打印下一个G｡
它记得以前这个我是｡
嗯对｡
所以现在, 即使这段代码已经运行过了, 如果我在线运行它, 第14行｡
我有六个？
因为三乘以二等于六, 记住, 因为它要乘以二｡
所以我问你｡
假设我只做了一个范围｡
你知道吗？
让我们去掉乘以2｡
如果我这样做了, 并且我运行了不止一次, 如果我在这里单击“运行”, 会发生什么？
我得到一个停止｡
反覆运算｡
你看, next可以被调用很多次｡
在此范围到期之前, 重复此次数｡
而当我们超出范围内的项目数时｡
我们得到一个停止迭代错误｡
让我们知道, 嘿, 你不能再打给下一个了｡
我们已经到达了行的末尾, 当我们使用带范围的for循环时, 它实际上会为你检测到这一点｡
所以我们可以运行这样一个函数, 在这里我们使用range, 尽管range是一个生成器, 因为for循环会自动地说,
嘿, 一旦我遇到这个停止迭代, 我就会停止循环,
但是这对我们作为用户来说是隐藏的｡
发电机的概念很难理解, 尤其是刚开始｡
所以你们可能要看几遍, 但是在接下来的几个视频中, 我想让你们相信它们是多么的强大｡
我们下一班见｡