你好, 欢迎回来｡
在这个视频中, 我们将看到Python中的可迭代性｡
在上一个视频中,
我们看了迭代器, 那么到底什么是可迭代的？
一个可迭代对象是一个拥有__iter__（）方法或__iter__（）方法的对象｡
看起来像这样｡
一旦在任何对象中定义了这个方法, 它现在就是一个可迭代对象｡
让我们来定义一下｡
让我们定义一个FirstHundredIterable｡
这个FirstHundredIterable只会定义__iter__（）, 或者__iter（）方法, 这个__iter__（）方法告诉Python,
你希望能够迭代这个可迭代对象, 就像在for循环中一样, 或者你想做一些,
或者你想把它变成一个列表｡
它有什么可退的？
它必须返回一个迭代器｡
因此, 返回FirstHundredGenerator（）｡
现在你可以打印FirstHundredIterable的和, 它会喜欢它,
它会告诉你4950.
你也可以使用for循环来迭代它, 这样就可以了｡
它也给予你那里的所有数字｡
所以这就是一个可迭代的｡
没有什么神奇的, 也不必做任何做作的事情｡
对于Python来说, 要想让它成为一个可迭代对象, 你所要做的就是定义这个方法,
而这个方法必须返回一些你可以调用__next__（）的东西｡
它必须返回一个迭代器｡
所有的生成器都是迭代器, 所以这当然可以是一个生成器｡
现在如果你想让这个简单一点, 你可以做到, 而不是让一个单独的类返回FirstHundredIterator,
你可以问自己...
这里有一个__iter__（）方法, 它返回一个这种类型的对象｡
在这个类的上下文中, FirstHundredGenerator（）是什么？
这是一个相当模糊的问题, 但我要说的是自我｡
Self始终是当前对象, 你在这里所做的就是返回一个对象, 所以你肯定能做到.
现在,
您不再需要这个FirstHundredIterable, 您只需在此处返回FirstHundredGenerator（）, 它就会保持现在的样子｡
现在你的生成器有点混乱,
因为它既是一个迭代器, 又是一个可迭代对象,
在某些情况下, 这可能会让人感到困惑,
但在其他情况下, 它确实很方便, 因为它比用一个单独的类来做这些要简单得多｡
同样, 可迭代对象使用此__iter__（）方法返回一个迭代器｡
所以你也可以从迭代器本身做这个, 因为self总是一个迭代器, 因为self是一个拥有dunder
__next__（）方法的对象.
我在前面提到过for循环, 我们需要一个定义了dunder __len__（）和dunder
__getitem__（）的对象｡
那是怎么回事？
让我们定义另一个可迭代对象, 它将有一个__len__（）, len（self｡
汽车）, 我将在这里初始化汽车｡
假设我们有self｡
汽车等于这个两元素列表, 那么我们定义一个dunder __len__（）方法,
它返回列表的长度,
我们还定义了一个__getitem__（）方法, 它接受我们想要检索的索引,
只返回self｡
汽车[i]｡
在前面的课程中,
我们讨论过, 当你有一个像这样的对象, 它有__len__（）和__getitem__（）方法, 你可以在它上面使用for循环｡
实际上, 如果我们在AnotherIterable（）中对car进行处理, 你会看到它打印出了汽车,
Fiesta和Focus｡
那么这也是一个可迭代的吗？
它没有__iter__（）方法｡
它不返回任何发电机｡
答案是肯定的｡
在Python中,
你可以用一个返回可迭代对象的__iter__（）方法来定义可迭代对象, 或者你可以有一个具有长度和getitem的对象｡
这两个都是可迭代的, 你可以使用for循环, 你可以使用__sum__（）,
你可以在其中使用__len__（）...
对不起, 不是__len__（）, 您可以在其中使用__list__（）｡
所以这两件事都是可迭代的｡
现在, 好吗？
现在我们已经了解了一些关于可迭代程序的知识, 它们和迭代器有什么不同, 但是它们通常是在一起的,
手牵着手｡
迭代器用于获取下一个值, 而可迭代对象用于遍历迭代器的所有值｡
所以迭代器可以让你一步一步的走, 如果你想这样做的话, 通过调用__next__（）,
而可迭代的可以让你遍历所有的元素｡
这段视频到此为止｡
如果如果说不通, 你会想,
"我到底为什么需要这个？ “放心吧｡
在几节课的时间里,
当我们学习异步Python时, 你会说, “哦,
天哪, 这太有意义了｡ ”
只是给你一些提示｡
而且,
当你想使用或浏览一个稍长的列表时, 你可以使用生成器来完成｡
现在我还要说, 现在我们在这里, 而不是有my_numbers
= [x for x in
[1, 2,
3, 4, 5]], 这是一个列表解析｡
my_numbers_gen（）, 您可以执行生成器理解｡
这个实例不是很有用, 但它现在也是一个生成器对象｡
这只是对序列进行迭代的简写｡
接下来可以执行（my_numbers_gen）｡
你可以把它打印出来｡
所以生成器理解,
也是一个很流行的事情, 也不是打印出来的｡
所以就想提一下｡
这不是元组理解;这是一个生成器理解｡
我们可以用它来动态创建一个生成器对象, 让我们也用这个语法调用__next__（）｡
同样,
它所做的就是检查这个列表, 并在调用__next__（）时生成每个数字｡
所以它不会复制整个列表, 而这个会｡
这将复制列表并为您给予另一个副本｡
这样,
您就可以一个一个地检查它, 而不必复制整个列表｡
当然这个例子并不很好｡
你可以只迭代这个列表, 因为你已经有了它,
但它在其他情况下也很有用, 比如当你迭代另一个生成器时,
你想对它做一些动态的修改｡
因此, 它可以在未来的情况下有用｡
稍后我们会遇到更多这样的例子｡
我只想给予你们一点语法｡
不管怎样, 这段视频到此为止｡
我不想再耽误你了｡
下次见｡