一、生成器

1. 生成器的定义

  • 把所需要值得计算方法储存起来,不会先直接生成数值,而是等到什么时候使用什么时候生成,每次生成一个,减少计算机占用内存空间

2. 生成器的创建方式

  • 第一种只要把一个列表生成式的 [ ] 改成 ( )
ret = (n + 1 for n in range(0,10))
# 返回值是生成了一个生成器对象<genexpr>储存在16进制的地址中<generator object <genexpr> at 0x7f909f4be150>
# 如果调用次数超过生成器内值的总数量,会报错
  • 第二种方法使用yield创建生成器
  • 只要在一个函数中存在至少一个yield关键字,该函数就不是普通函数,是一个生成器
  • 返回一个对象,需要使用变量接收
  • 生成器可以用for进行遍历得到所有的值
# 定义一个斐波那契数列的生成器
def creatnum():
print('-----start------')
a,b = 0,1
for i in range(5):
print('----1-----')
# 每次执行函数都会停在此处,并将b值返回
yield b
print('----2-----')
a,b = b,a+b
print('----3-----')
print('-----stop-----') f = creatnum()
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
  • 打印结果
-----start------
----1-----
1
----2-----
----3-----
----1-----
1
----2-----
----3-----
----1-----
2
----2-----
----3-----
----1-----
3
----2-----
----3-----
----1-----
5

3. 启动生成器的方法

  • 第一种:
next(生成器的名称)
  • 第二种:
# 生成器第一次调用时尽量不要使用send,非要使用必须用send(None)
send()方法

二、迭代器

  1. 可迭代数据类型(具有可迭代功能)

    • 把可以通过for...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable)

      例如:列表,元组,字典,集合等数据类型,但他们不是可迭代对象
    • generator(生成器)
      • yield
      • 列表生成器
      • 生成器都是可迭代对象
  2. 如何判断一个对象是不是有可迭代功能

    from collections import Iterator
    # 列表是可迭代的
    result = isinstance([1,2], Iterable)
    print(result)
    # isinstance函数会返回一个bool值 True为可迭代,反之False
  3. 将具有迭代功能的数据类型转化为可迭代器

    • 可以被next()调用并不断返回下一个值的对象称之为迭代器Iterator
  4. 迭代器的判断方式

    from collections import Iterator
    # 列表是可迭代对象
    # isinstance函数会返回一个bool值 True为迭代器,反之False
    result = isinstance([1,2], Iterator)
    print(result)
  5. 可迭代对象的本质

    • 我们分析对可迭代对象进行迭代使用的过程,发现每迭代一次(即在for...in...中每循环一次)都会返回对象中的下一条数据,一直向后读取数据直到迭代了所有数据后结束。那么,在这个过程中就应该有一个“人”去记录每次访问到了第几条数据,以便每次迭代都可以返回下一条数据。我们把这个能帮助我们进行数据迭代的“人”称为迭代器(Iterator)。

    • 可迭代对象的本质就是可以向我们提供一个这样的中间“人”即迭代器帮助我们对其进行迭代遍历使用。

    • 可迭代对象通过__iter__方法向我们提供一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据.

    • 那么也就是说,一个具备了__iter__方法的对象,就是一个可迭代对象。

    from collections import Iterable
    # 使用isinstance() 函数检测某个对象是否是一个可迭代的对象 class MyClass(object):
    # 可迭代对象的本质是,类中是否定义了 __iter__() 方法
    def __iter__(self):
    return self c1 = MyClass()
    # 对象c1不是可迭代对象
    result = isinstance(c1, Iterable)
    print(result)
  • 举例说明迭代器本质原理

    比如,数学中有个著名的斐波拉契数列(Fibonacci),数列中第一个数为0,第二个数为1,其后的每一个数都可由前两个数相加得到: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

    现在我们想要通过for...in...循环来遍历迭代斐波那契数列中的前n个数。那么这个斐波那契数列我们就可以用迭代器来实现,每次迭代都通过数学计算来生成下一个数。

class Fibonacci():

    def __init__(self, num):
# 通过构造方法,保存num到类的成员属性中
self.num = num
# 定义变量保存斐波那契数列前两个值
self.a = 0
self.b = 1 # 记录当前的变量值
self.current_index = 0 def __iter__(self):
# 返回迭代器,因自身就是迭代器,故可以返回自己
return self def __next__(self): # 判断是否生成完毕
if self.current_index < self.num:
# 返回
result = self.a # 交换两个变量值
self.a, self.b = self.b, self.a+self.b self.current_index += 1 return result else:
# 停止迭代
raise StopIteration if __name__ == '__main__':
# 创建迭代器
fib_iterator = Fibonacci(5) # 使用迭代器,输出斐波那契数列值
for value in fib_iterator:
print(value, end=" ")

Python中生成器generator和迭代器Iterator的使用方法的更多相关文章

  1. Python之生成器(generator)和迭代器(Iterator)

    generator 生成器generator:一边循环一边计算的机制. 生成器是一个特殊的程序,可以被用于控制循环的迭代行为.python中的生成器是迭代器的一种,使用yield返回值函数,每次调用y ...

  2. 生成器generator和迭代器Iterator

    一.列表生成式       在学习生成器迭代器之前先了解一下什么是列表生成式,列表生成式是Python内置的非常简单却强大的可以用来创建list的生成式.什么意思?举个例子,如果想生成列表[0,1,2 ...

  3. 学习python第十二天,函数4 生成器generator和迭代器Iterator

    在Python中,这种一边循环一边计算的机制,称为生成器:generator 要创建一个generator,有很多种方法.第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个genera ...

  4. Python 生成器 Generator 和迭代器 Iterator

    #最近一周刚开始接触python,基本的语法,和使用特性和Java差别还是蛮大的. 今天接触到Python的迭代器和生成器有点不是很明白,所以搜索了先关资料整理了一些自己的理解和心得 简述(Profi ...

  5. python生成器(generator)、迭代器(iterator)、可迭代对象(iterable)区别

    三者联系 迭代器(iterator)是一个更抽象的概念,任何对象,如果它的类有next方法(next python3)和__iter__方法返回自己本身,即为迭代器 通常生成器是通过调用一个或多个yi ...

  6. python中生成器generator

    通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素 ...

  7. Python中生成器和迭代器的区别(代码在Python3.5下测试):

    https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...

  8. python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解

    python中"生成器"."迭代器"."闭包"."装饰器"的深入理解 一.生成器 1.生成器定义:在python中,一边 ...

  9. Python的生成器Generator小结

    一. 生成器的介绍 在介绍生成器(Generator)之前,我们首先需要熟悉列表生成式,列表生成式是Python内置的简单又强大的用来创建列表的生成式. 举个例子, 如果我们想生成[1*1,2*2,3 ...

随机推荐

  1. Laravel技巧:使用load、with预加载 区别

    1.使用load $posts = Post::all(); $posts->load('user'); 2.使用with $posts = Post::with('user')->all ...

  2. 在layui中使用ajax不起作用

    又是一个坑,坑了我一个下午.在layui插件中使用jquery的ajax请求,一点反应都没有,不管是改成get还是post请求,后台毫无反应,前端谷歌调试也没有报半点错. js代码如下: layui. ...

  3. day 7-8 协程

    不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去调 只要你用并发,就会有锁的问题,但是你不能一直去自己加锁吧那么我们 ...

  4. java日志框架之logback(一)——logback工程简介

    Logback工程 致力于成为log4j工程的继承者 Logback的架构足够泛型化,故能够应用于许多不同的环境.当前,logback划分为三个组件: logback-core logback-cla ...

  5. Python 爬虫 解析库的使用 --- Beautiful Soup

    知道了正则表达式的相关用法,但是一旦正则表达式写的有问题,得到的可能就不是我们想要的结果了.而且对于一个网页来说,都有一定的特殊结构和层级关系,而且有很多节点都有id或class来做区分,所以借助它们 ...

  6. idea 方便的设置代码段

    使用快捷键(ctrl+alt+s)找到:从idea的菜单File->Settings->Editor->Live Templates 先添加Template Group,然后添加Li ...

  7. Swagger2常用注解及其说明 (转)

    Api 用在Controller中,标记一个Controller作为swagger的文档资源 属性名称 说明 value Controller的注解 description 对api资源的描述 hid ...

  8. Selenium简单回顾

    一.Selenium介绍 1.Selenium(浏览器自动化测试框架): Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的 ...

  9. Java多线程2:线程的使用及其生命周期

    一.线程的使用方式 1.继承Thread类,重写父类的run()方法 优点:实现简单,只需实例化继承类的实例,即可使用线程 缺点:扩展性不足,Java是单继承的语言,如果一个类已经继承了其他类,就无法 ...

  10. python之对字符串类型的数组求平均值

    该字符串是在网页表格中复制的,所以数字间由制表符间隔,先将其转换成列表,再进行统计计算.代码如下: str = "-18.1 -18.3 -18 -18.2 -18 -17.4 -18 -1 ...