列表生成式

a = [i+1 for i in range(10)]
print(a)

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

这就是列表生成式

生成器(generator)

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。

如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的    list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(generator)。

# 列表生成式:
L = [x * x for x in range(10)]
print(L)
# 生成器:
g = (x * x for x in range(10))
print(g)

输出结果:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
<generator object <genexpr> at 0x00000267824C0258>

list可以直接打印出结果,但是generator只能通过next()获得下一个返回值

g = (x * x for x in range(4))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))

输出结果:

0
1
4
9

Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
StopIteration

generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

生成器示例:

def fib(max_n):                            # 斐波那契数列生成器
    n, a, b = 0, 0, 1
    while n < max_n:
        yield b                            # 函数中出现yield则函数变成生成器
        a, b = b, a+b
        n = n+1
    return "done"

f = fib(6)
print(f.__next__())                        # 生成器生成一个数(f.__next__()=next(f))
print("______")                            # 生成器无法返回,之后生成的数据不包含以上的数

while True:
    try:
        x = next(f)                        # 循环生成数列
        print("f:", x)                     # 输出计算结果
    except StopIteration as e:             # 当循环次数大于max_n时,运行以下
        print("Generator return value:", e.value)
        break

输出结果:

1
______
f: 1
f: 2
f: 3
f: 5
f: 8

当函数中出现 ‘yield’ 时这个函数就成了一个 generator 的函数

generator在执行的时候遇到 yield 时会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

通过yield实现在单线程的情况下实现并发运算的效果:

import time

def consumer(name):
    print("%s开始吃包子了" % name)
    while True:
        produce = yield                                # 函数在此暂停,等待唤醒
        print("%s吃了%i个包子" % (name, produce+1))      # 唤醒后执行

def producer(name):
    c = consumer("A")
    c2 = consumer("B")
    c.__next__()
    c2.__next__()
    print("%s准备开始生产" % name)
    for i in range(3):
        time.sleep(1)
        print("已经做了%i个包子" % (i+1))
        c.send(i)                                       # 将i发送给produce,并唤醒函数
        c2.send(i)

producer("C")

输出结果:

A开始吃包子了
B开始吃包子了
C准备开始生产
已经做了1个包子
A吃了1个包子
B吃了1个包子
已经做了2个包子
A吃了2个包子
B吃了2个包子
已经做了3个包子
A吃了3个包子
B吃了3个包子

在 producer 函数中 c 和 c2 轮流调用 consumer 函数

send() 和 next() 一样可以唤醒生成器,而且还能给 yield 传值

迭代器

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如list、tuple、dict、set、str等;

一类是generator,包括生成器和带 yield 的 generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

可以使用isinstance()判断一个对象是否是Iterable对象

而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

*可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator.

生成器都是Iterator对象,但list、dict、str 虽然是 Iterable ,却不是Iterator。
把list、dict、str 等 Iterable 变成Iterator可以使用 iter() 函数.

 

 

Python生成器(generator)和迭代器(Iterator)的更多相关文章

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

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

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

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

  3. 生成器generator和迭代器Iterator

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

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

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

  5. Python中生成器generator和迭代器Iterator的使用方法

    一.生成器 1. 生成器的定义 把所需要值得计算方法储存起来,不会先直接生成数值,而是等到什么时候使用什么时候生成,每次生成一个,减少计算机占用内存空间 2. 生成器的创建方式 第一种只要把一个列表生 ...

  6. 【python之路29】python生成器generator与迭代器

    一.python生成器 python生成器原理: 只要函数中存在yield,则函数就变为生成器函数 #!usr/bin/env python # -*- coding:utf-8 -*- def xr ...

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

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

  8. Python 生成器 (generator) & 迭代器 (iterator)

    python 生成器 & 迭代器 生成器 (generator) 列表生成式 列表生成式用来生成一个列表,虽然写的是表达式,但是储存的是计算出来的结果,因此生成的列表受到内存大小的限制 示例: ...

  9. 【Python之路】特别篇--生成器(constructor)、迭代器(iterator)、可迭代对象(iterable)

    生成器(constructor) 生成器函数在Python中与迭代器协议的概念联系在一起.包含yield语句的函数会被特地编译成生成器 !!! 当函数被调用时,他们返回一个生成器对象,这个对象支持迭代 ...

  10. Python学习笔记014——迭代器 Iterator

    1 迭代器的定义 凡是能被next()函数调用并不断返回一个值的对象均称之为迭代器(Iterator) 2 迭代器的说明 Python中的Iterator对象表示的是一个数据流,被函数next()函数 ...

随机推荐

  1. JQuery学习二-字典操作

    1. 数组中添加map var arr = []; var key = 'Jeremy'; var value = '!!!!' arr.push({ 'key': key, 'value': val ...

  2. please select android sdk(出现小红叉)

    问题原因: 在项目中通过 git 协同开发,项目是 kotlin 与 Java 混合开发.在 build.gradle 中添加依赖之后就出现这个问题了,点击运行无法编译. 在网上找了各种解决办法都没能 ...

  3. 安卓constraintLayout中app:srcCompat设置的图片显示不出来

    使用 app:srcCompat 的时候 引入的图片显示不出来的解决方案 首先查看的你的Activity 继承的是那个Activity 如果是继承AppcompatActivity  使用 Image ...

  4. Orchard是如何呈现内容的

    首先Orchard是一个建立在ASP.NET MVC框架上的CMS应用框架.Orchard在呈现内容的时候也遵循MVC的规律,也是通过Controller来处理Url请求并决定用那个View来呈现那种 ...

  5. PAT 1112 Stucked Keyboard

    1112 Stucked Keyboard (20 分)   On a broken keyboard, some of the keys are always stucked. So when yo ...

  6. 选择器:first-child与:last-child失效的解决方法

    作为还在努力练习的代码小白来说,有时类名或者ID名太多很容易就会搞混,为此,在练习中会想着借用多样的选择器来设置而不是每一个标签都设一个类名(Id名),在此次练习中使用选择器:first-child与 ...

  7. 蓝桥杯 每周一练 第一周(3n+1问题)

    [问题描述] 考虑如下的序列生成算法:从整数 n 开始,如果 n 是偶数,把它除以 2:如果 n 是奇数,把它乘 3 加1. 用新得到的值重复上述步骤,直到 n = 1 时停止.例如,n = 22 时 ...

  8. 版本管理工具Git(3)VS2013下如何使用git

    Git系列导航 版本管理工具Git(1)带你认识git 版本管理工具Git(2)git的安装及使用 版本管理工具Git(3)VS下如何使用git VS下创建项目 vs中新建项目MyGitTest201 ...

  9. 201621123075 Week03-面向对象入门

    1.本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联系.步骤如下: 1.1 写出你认 ...

  10. SSM 框架 整合<SpringMVC+Spring+MyBatis>

    一 框架的搭建1.建立一个maven项目 2.建立五个module(entity,dao,service,action,web-view) 3.给予它们之间的依赖关系 dao-->entity ...