Python列表生成器

本篇将介绍python生成器,更多内容请参考:python学习指南

前言

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅访问前面几个元素,那后面绝大多数占用的空间都白白浪费了。
python生成器是用来代替"不一定能够使用全部元素的数组",等到使用某一元素时,才生成该元素,用来节省空间.

生成器创建方式

第一种:

在前面我们介绍python列表生成式,这里我们只需要把列表生成式的[]改成(),就创建了一个generatro

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

创建Lg的区别仅在于最外层的[](),L是一个list,而g是一个generator
上面表达式中我们可以直接列出list(L)的每一个元素,但我们打印g的时候,却打印了g的类型,那么,我们如何打印generator的每一个元素呢?
如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值:

>>>next(g)
0
>>>next(g)
1
>>>next(g)
4
>>>next(g)
9
>>>next(g)
16
>>>next(g)
25
>>>next(g)
36
>>>next(g)
49
>>>next(g)
64
>>>next(g)
81
>>>next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,知道计算出最后一个元素,没有更多元素时,抛出StopIteration的错误。
这样不断调用next(g)实在是太变态了,生成器是可迭代对象

>>>from collections import Iterable  #载入模块
>>>isinstance(g, Iterable)  #生成器是可迭代对象吗?
True

这样,知道用什么来了吧?
当然是使用强大的for...in迭代来实现

>>>g = (x * x for x in range(10))
>>>for n in g:
    print(n)
0
1
4
9
16
25
36
49
64
81

通过for迭代的方式来循环生成器,并不用关心StopIteration的错误。

使用关键字 yield 关键字

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

斐波那契数列生成器

def creatNum():
    print("---开始执行生成器方法---")
    a,b = 0,1
    for i in range(0,5):
        print("--step1--")
        yield b
        print("--step2--")
        a,b = b,a+b
        print("--step3--")
    print("--stop--")

print("直接调用方法...")
print(creatNum())

#这里用一个标识符来指向生成器(不要把creatNum()当做函数)
func = creatNum()

#使用for循环来执行生成器
for i in func:
    print(i)
输出结果: (执行完毕不会崩溃)

#直接调用方法...
<generator object creatNum at 0x101c30f10>
---开始执行生成器方法---
--step1--
1
--step2--
--step3--
--step1--
1
--step2--
--step3--
--step1--
2
--step2--
--step3--
--step1--
3
--step2--
--step3--
--step1--
5
--step2--
--step3--
--stop--

在执行生成器时,可以使用 生成器.send(param) 方法
send方法不光是执行一步next操作,还会把send里面的参数传到生成器中充当yield表达式的返回值

def test():
    i = 0
    while i < 5:
        temp = yield i
        print(temp)
        i += 1

t = test()

#先使用next执行,看能出来什么结果
t.__next__()
t.__next__()
print(t.__next__())

#使用send执行
t.send("1231231231223123")
print(t.send("hahahahhahaha"))
输出结果: (可见next输出temp为none , 而send 则把值传递进了生成器)

None
None
2
1231231231223123
hahahahhahaha
4

参考

  1. python生成器是怎样工作的
  2. Python中的yield关键字
  3. python生成器
  4. 廖雪峰-生成器

原文地址:https://www.cnblogs.com/miqi1992/p/8302597.html

时间: 2024-07-31 15:10:58

Python列表生成器的相关文章

python 列表生成器

python 列表生成器 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 一个循环 在C语言等其他语言中,for循环一般是这样的 如果python也这么写,那么真该看下python的基础教程了~ 但要注意的是,需要加一个[]来,否则会报错... 在上面的例子中,不仅可以嵌套for,甚至可以嵌套if语句 再看看,原来是什么样子 两个循环呢? 原来可能是这样的? 现在可以这样了!!!

python列表生成器与生成器

列表生成器是python内置的非常简单却非常强大的. 生成一个列表[1,2,3,4]可以用list(range(1,5)) 列表生成器的应用 如果上面的公式加上判断,就可以筛选出想要的结果,比如仅需要偶数的平方 使用多层循环 生成器 生成器与列表生成器的本质区别就是:一个已经生成数据了,使用时,如果数据过大,会产生内存溢出,而生成器是只有循环时,才会生成数据. 生成器与列表生成器的区别在于一个是[],一个是() 生成器书写 g=(x x ()) (g) 打印generator的方法是next(g

Python基础----生成器、三元表达式、列表生成式、生成器表达式

Python开发基础-Day9-生成器.三元表达式.列表生成式.生成器表达式 生成器 生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器,生成器在本质上就是迭代器. def foo(): print('first------>') yield 1 print('second----->') yield 2 print('third----->') yield 3 print('fouth----->') g=foo() from collections impor

python\列表和生成器表达式

一.协程函数的应用 写一个装饰器用于让协程函数不需要输入再执行一次next()函数 分析: 在装饰器中生成该协程函数的生成器, 并且执行一次next()函数 def firstNext(func): def wrapper(*args, **kwargs): g = func(*args, **kwargs) next(g) return g return wrapper @firstNext def eater(name): print("{} start to eat".forma

Python 列表\集合\ 字典推导式、生成器表达式

Python 列表\集合?字典推导式.生成器表达式 列表推导式 循环模式 l1 = [i for i in range(1,11)] l2 = [i ** 2 for i in range(100)] l3 = [f'python{i}' for i in range(50)] 筛选模式: l1 = [i for i in range(1,31) if i % 3 == 0] 嵌套循环: names = [['tom','billy','jefferson'],['wesley','steven

Python列表生成式和生成器

[1]列表生成器:列表生成式就是一个用来生成列表的特定语法形式的表达式. 1.基础语句结构:[exp for iter_var in iterable例如:a=[f(x) for x in range(10)] 2.工作过程: 迭代iterable中的每个元素:每次迭代都先把结果赋值给iter_var,然后通过exp得到一个新的计算值:最后把所有通过exp得到的计算值以一个新列表的形式返回. 相当于这样的过程:L = [] for iter_var in iterable: L.append(e

初学python随笔——列表生成器、生成器和迭代器

列表生成器 # 常见的是range()创建一个数字的列表 >>>[ x*x for x in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # 后边也可以加上判断语句 >>>[ x*x for x in range(10) if x%2 == 0] [0, 4, 16, 36, 64] # 字符也可以这么玩 >>> [m + n for m in 'ABC' for n in 'XYZ'] ['AX',

python之生成器-generator

在跟着廖雪峰的博客学习python,看到生成器这一章节的时候,首先提到了generator .yield,然后在搜索资料的时候,又查到了协程这一概念,这篇文章总结一下这几个概念. generator  从字面上理解,就是生成器,它的实现方式有两种: 1.不同于列表生成器([]),而是用 ()来表示.(原来这种叫做生成器表达式哦,哈哈) 访问方式,可以用for 循环来访问,也可以用 .next 来访问. N = ['Hello', 'World', 18, 'Apple', 'None'] hh

17. Python 生成式 &nbsp; 生成器 &nbsp; 迭代器

1.      生成式和生成器 列表生成式是python受欢迎的一种语法之一,通过一句简洁的语法,就能对元组元素进行过滤,还可以对得到的元素进行转换处理. 语法格式: [exp for val in collection if condition] 相当于 result = [] for val in collection: if (condition): result.append(exp) 例子: a = [x*x for x in xrange(10) if x%2 == 0] print