迭代器生成器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器生成器相关的知识,希望对你有一定的参考价值。

列表生成式

在认识迭代器生成器之前,我们先来了解一下列表生成式

什么是列表生成式呢?顾名思义,列表生成式可以帮助我们生成一个列表对象

now,现在有一个需求:将斐波那契数列的前十个元素依次存放到一个列表当中

你可能首先会想到这个

def fib(n):# 递归函数,不懂的同学可以访问我的另一篇博客http://www.cnblogs.com/Nathaniel-J/p/7753976.html
    if n<=1:return n
    else:return fib(n-1) + fib(n-2)

l = []
for i in range(1,11):
    l.append(fib(i))
print(l)

但有没有想过这个呢?

def fib(n):
    if n<=1:return n
    else:return fib(n-1) + fib(n-2)

# 装逼青年版--列表生成式
l2 = [fib(x) for x in range(11)]
print(l)

这就是列表生成式

 1 # 简单一点的版本
 2 l3 = [x for x in range(10)]
 3 print(l3)
 4 
 5 l3 = [x*x+2 for x in range(10)]
 6 print(l3)
 7 
 8 def add(x):
 9     return x + x
10 l3 = [add(x) for x in range(10)]
11 print(l3)
12 
13 print()
14 print()
15 # 稍微复杂一点的
16 l4 = [x for x in range(10) if x % 2 == 0]# 将10以内能被2整除的返回
17 print(l4)
18 
19 l4 = [x for x in range(10) for x in qwertyuiop]
20 print(l4)
21 
22 l4 = [x + n for x in qwe for n in ab]
23 print(l4)

 生成器

什么是生成器呢?

我们知道了什么是列表生成式

x = [x for x in range(10)]

现在只需要做一点小小的改动

x1 = (x for x in range(10))

没错,区别就是将外围的【】改成()

不信?打印一下type

print(type(x)) # <class list>
print(type(x1)) # <class generator>
print(x) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 是一个列表
print(x1) # <generator object <genexpr> at 0x1020dbf68> 生成器对象

我们知道,受内存限制,列表之中不可能无限放数据,而且,有时候我们创建了一个包含数万甚至更多元素的列表,可能需要的就只有那么几个而已,这个时候,内存就被极大的浪费了,而生成器就是专为解决此问题的

生成器在内部封装了一个算法,不断循环,每次循环将结果返回(毫无疑问,CPU 的速度是远远高于内存的),而不必将完整的列表创建出来,这样一来,就极大的节省了内存(相对于内存的速度,显然我们更接受 CPU 的速度)

OK, now,生成器对象有了,那么问题来了我需要的那些值呢?

什么?在生成器里?

错了,大错特错,这些值----压根就不存在!

打个比方,生成器就是一个伟大的手工艺人,你需要什么他就能给你做出来什么.怎么做呢?有个函数可以帮你

l3 = (x for x in range(5))
print(l3)
print(next(l3),end=  ) # 通过 next() 函数让生成器把值一个个的生产出来
print(next(l3),end=  )
print(next(l3),end=  )
print(next(l3),end=  )
print(next(l3))

l30 = [x for x in range(5)]
for i in l30:
    print(i,end=  )

不过这种方法太过变态,不如换用这种

l3 = (x for x in range(5))
for i in l3: # for 循环后边可以跟任何一个可迭代对象,显然 generator 也是一个可迭代对象
    print(i,end=  )

 而且有一个好处,不同担心StopIteration这个错误

技术分享图片
# 斐波那契数列生成器版本
def fib(m):
    x,y,z = 0,0,1
    while x < m:
        x += 1
        y,z = z,y+z
        yield y
for i in fib(9):
    print(i)
View Code
技术分享图片
# 通过生成器实现协程并行运算
import time
def func1():
    print(开始运动双手啦)
    time.sleep(0.5)
    while True:
        action = yield
        print(现在开始% s手画% s % (action[0],action[1]))


def func2():
    g = func1()
    next(g)
    for i in range(10):
        print(第% s 次运动:两只手都已经准备好啦!% )
        time.sleep(0.5)
        g.send([,])
        g.send([,])
func2()
View Code

 迭代器

什么是迭代器?很简单

满足两个条件就是迭代器   1.有iter()方法   2.有next()方法
注意生成器是迭代器,迭代器未必是生成器



以上是关于迭代器生成器的主要内容,如果未能解决你的问题,请参考以下文章

python:可迭代对象,迭代器,生成器函数,生成器的解析举例代码说明

python:可迭代对象,迭代器,生成器函数,生成器的解析举例代码说明

10.迭代器/生成器/协程函数/列表生成器

Interator和Generator

Interator和Generator

Interator和Generator