生成器&迭代器

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

所以如果列表元素可以按照某种算法推算出来,那我们是否可以在循环中的过程不断推算出后续的元素呢?就不必创建完整的列表了,从而节省大量的内存。在python中一边循环一百年计算的机制成为生成器:generator。

要创建一个generator,有很多方法,第一种方法最简单,只要把列表生成式的[]改为() ,就创建了一个generator:

L = [x * x for x in range(10)]
print(L)
打印结果:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
g = (x * x for x in range(10))
print(g)
打印结果:
<generator object <genexpr> at 0x1022ef630>

可以通过next()函数获得generator的下一个返回值:

 next(g)
 next(g)
 next(g)
 next(g)
 next(g)
结果:
0
1
4
9
16

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

generator非常强大。如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。

比如,著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:

1, 1, 2, 3, 5, 8, 13, 21, 34, ...

斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1
    return ‘done‘

这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

举个简单的例子,定义一个generator,依次返回数字1,3,5:

def odd():
    print(‘step 1‘)
    yield 1
    print(‘step 2‘)
    yield(3)
    print(‘step 3‘)
    yield(5)
时间: 2024-08-10 02:09:29

生成器&迭代器的相关文章

Python 生成器&迭代器

Python 生成器 带有 yield 的函数在 Python 中被称之为 generator(生成器),用斐波那契数列: def fab(max):     n, a, b = 0, 0, 1     while n < max:         yield b         a, b = b, a + b         n = n + 1 执行: 1 2 3 4 5 6 7 8 9 >>> for n in fab(5):     print n 1 1 2 3 5 简单地

python高级之生成器&amp;迭代器

python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象(iterable):对象中含有__iter__()方法 迭代器(iterator):对象含有__next__()方法,并且迭代器也有__iter__()方法 生成器(generator):生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅 列表/集合/字典推导式(list,set,dict compreh

【python基础】生成器&amp;迭代器

一.生成器:generator 按照规则去生成一定的数据 1.列表推导式和生成器的区别 列表推导式: 一次性生成所有满足条件的数据 生成器: 你要一个数据, 我生成出来给你一个 2.生成器表达式 生成器对象 = (表达式 for item in 容器) 生成器对象 = (表达式 for item in 容器 if 条件) 生成器对象 = (表达式 for item in 容器 for item2 in 容器2) 3.通过生成器对象获取数据 (1)next(g) (2)for in 依次获取生成器

python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化

1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = False   def check_log(func): def inner(): res = func() if LOGIN_INFO: print('验证成功!') return res else: print('验证失败!') return inner   def check_admin(func)

Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json &amp; pickle 数据序列化

一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了.所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间.在Python中,这种一边循环一边计算的机制,称为生成器:generator. 要创建一个generator,有很多种

Python学习之旅 —— 基础篇(五)字符串格式化、递归、生成器&amp;迭代器、模块

本篇要点:字符串格式化递归生成器和迭代器模块 一.字符串格式化 字符串格式化的两种方式:占位符 %, format函数1.占位符% %[(name)][flags][width].[precision]typecode - (name) 可选,用于选择指定的key - flags 可选,可供选择的值有: - + 右对齐:正数前加正好,负数前加负号: - - 左对齐:正数前无符号,负数前加负号: - 空格 右对齐:正数前加空格,负数前加负号: - 0 右对齐:正数前无符号,负数前加负号:用0填充空

python初识生成器 迭代器

生成器 带有 yield 的函数在 Python 中被称之为 generator(生成器) def xragns(): #定义函数生成器 print('小伙') yield ('好') #加上yield就会生成一个生成器 print('python') yield('hao') print('编程') yield('hao') x = xragns() #执行函数生代器仅仅是获得内部不会执行 ret = x.__next__() #生成器的next方法才会向下执行 执行函数寻找下一个yield

python列表生成式&amp;生成器&amp;迭代器

一.列表生成式 什么是列表生成式? 列表生成式是快速生成列表的一种方式.(貌似有些废话) 更专业点的说法:列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 在python2.7里 举个例子,要生成list [1,2,3,4,5],可以用range(1,6) >>> range(1,6) [1, 2, 3, 4, 5] 但是如果要生成[1x1,2x2,3x3,4x4,5x5]怎么做呢? 普通青年做法: >>&

python学习笔记-(八)装饰器、生成器&amp;迭代器

本节课程内容概览: 1.装饰器 2.列表生成式&迭代器&生成器 3.json&pickle数据序列化 1. 装饰器 1.1 定义: 本质上是个函数,功能是装饰其他函数—就是为其他函数添加附加功能 1.2 装饰器原则: 1)  不能修改被装饰函数的源代码: 2)  不能修改被装饰函数的调用方式: 1.3 实现装饰器知识储备: 1.3.1 函数即“变量” 定义一个函数相当于把函数体赋值给了函数名 变量可以指向函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

生成器 迭代器,装饰器 ,软件开发规范

一.生成器 1.列表生成式 有列表data=[1,2,3,4],要求将列表data里面的数据均加1:  除了循环,可以用列表生成式一行写出替代多行的循环 1 data=[1,2,3,4] 2 data=[i+1 for i in data] 3 print(data) 生成式中也可以写三元运算 #需求:列表中小于3的都*2,大于等于3的+1 data=[i*2 if i<3 else i+1 for i in data] 列表生成式,是python内置的一种直接生成list的表达式,可以直接生成