10分钟了解Python黑魔法 Yield、Iterator、Generator_generate iterator yield

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

今天,我们来讨论Python的yieldIteratorgenerator,它们可以在许多教程中看到,但总是引起一些混淆。

点我,查原文,代码即可运行

就像decorators一样,这三个概念是紧密联系在一起的。例如,如果你想知道什么是yield,你必须首先了解什么是generator。但在理解generator之前,你又必须理解iterator是什么,但在理解iterator之前,您必须要知道iterable对象是什么。他们的关系如下图:

Iterables 可迭代的

可迭代是指能够通过迭代的方法遍历的对象,比如列表、字符串、元组、字典、集合等等。简单的例子:

mylist = [1, 2, 3]
for i in mylist:
    print(i)

可迭代对象如何工作?

让我们看看Python解释器在遇到迭代操作时如何处理迭代,例如for ... in x

  • 调用 iter(x) 函数
  • 检查对象是否实现了 _iter__ 方法,如果实现了,则调用它以获取迭代器;
  • 如果未实现 _iter__ 方法,但实现了_getitem__ 方法,Python将创建一个迭代器并尝试按顺序获取元素(从索引0开始);
  • 如果两个方法都未实现,将抛出TypeError异常,指示无法迭代该对象。

因此具有 __iter__ 方法或 __getitem__方法的对象通常称为可迭代对象。

如何判断一个对象是否可迭代?
  • 方法一:使用dir函数,检查对象是否实现了__iter__ 或者 __getitem__方法。
mylist = [1, 2, 3]
mylistMethod = dir(mylist)
print(mylistMethod) #查看mylist的方法
print('\_\_iter\_\_' in dir(mylist) or '\_\_getitem\_\_' in dir(mylist)) # True

  • 方法二:使用isinstance函数,检查对象是否是Iterable类型。
from collections import Iterable
mylist = [1, 2, 3]
print(isinstance(mylist, Iterable)) # True

Iterator 迭代器

迭代器是一个包含可数数量值的对象。 它可以迭代,这意味着您可以遍历所有值。 让我们看一个迭代器示例:

for i in range(5):
    print(i) # 0 1 2 3 4

像这样,一个个打印元素的过程就叫可迭代的,这个过程也是我们日常代码编写中接触最多的操作。

简单来说,带有next()方法的可迭代对象就是一个迭代器,或者说一个可迭代对象和一个迭代器的关系是:Python从一个可迭代对象中获取一个迭代器。具体关系如下图:

所以上面提到的列表、字符串等不是迭代器。 但是,您可以使用Python内置 iter()函数来获取它们的迭代器对象。 让我们使用迭代器模式来重写前面的例子:

mylist = [1,2,3]
it = iter(mylist) # 获取迭代器对象
while True:
    try:
        print(next(it))
    except StopIteration:
        print("Stop iteration!")
        break

在上面的代码中,我们首先使用iterable对象mylist来构造迭代器it,并不断调用迭代器上的next()函数来获取下一个元素。 如果没有字符,迭代器将抛出 StopIteration 异常并退出循环。

Generator 生成器

Python 提供了一个生成器来创建迭代器函数。 生成器是一种特殊类型的函数,它不返回单个值,而是返回一个包含一系列值的迭代器对象。 在生成器函数中,使用 yield 语句而不是 return 语句。

现在我们已经知道for循环背后的机制了,但是如果数据量太大,比如for i in range(1000000),使用for循环将所有的值存储在内存中不仅占用大量的存储空间 但是如果我们只需要访问前几个元素,空间就浪费了。 在这种情况下,我们可以使用 generator

生成器的思路是,我们不需要一次性把这个列表全部创建出来,只需要记住它的创建规则,然后在需要用到的时候,再一次次的计算和创建。 我们来看一个例子:

my_generator = (x\*x for x in range(10))
for i in my_generator:
    print(i) # 0 1 4 9 16 25 36 49 64 81

my_generator 是一个生成器,它的每一个元素都是一个生成器对象。 我们可以使用 next() 函数来获取下一个元素。

Yield 产生器

简单来说,你可以把yield当成return,但它返回的是一个生成器。 记住,刚开始学习的时候不需要了解这个yield是什么,但是一定要了解它的运行机制!
让我们看一下下面的代码片段:

def test():
    print("First")
    yield 1
    print("Second")
    yield 2
    print("Third")
    yield 3
my_generator = test() # 创建生成器
print(type(my_generator)) # <class 'generator'>

我们可以在这里看到如果一个函数使用 yield 作为返回值,那么它就变成了一个生成器函数。
与普通函数不同,生成器函数被调用后,函数体中的代码不会立即执行(执行my_generator=test()后不打印任何值),而是返回一个生成器!正如我们前面提到的:generator 是迭代器,而 yield 可以被视为 return ,不难猜测下面代码的结果:

def test():
    print("First")
    yield 1
    print("Second")
    yield 2
    print("Third")
    yield 3
for item in test():
    print(item)
# 输出:
"""
First
1
Second
2
Third
3
"""

next 函数是如何运行的?

def test():
    print("First")
    yield 1
    print("Second")
    yield 2
    print("Third")
    yield 3

my_generator = test() # 创建生成器
a = next(my_generator) # First
print(a) # 1
b = next(my_generator) # Second
print(b) # 
c = next(my_generator) # Third
print(c) # 3
d = next(my_generator) # StopIteration
print(d) # error


### 一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。



![](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)



### 二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。



![](https://img-blog.csdnimg.cn/img_convert/8c4513c1a906b72cbf93031e6781512b.png)



### 三、入门学习视频



我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。



![](https://img-blog.csdnimg.cn/afc935d834c5452090670f48eda180e0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56iL5bqP5aqb56eD56eD,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值