生成器和迭代器

'''
通过列表推导式,可以直接创建一个列表
但是受到内存的限制,列表的容量肯定是有限的
那么现在我们要创建一个100W元素的列表,应该用一个什么方法
如果列表的元素可以推理出来,用到哪里推到哪里,不断释放资源就不会浪费内存
这样就不需要创建一个完整的列表
一边循环一遍创建的方式就是生成器
'''

# 得到生成器的方式有几种:
# 1.通过列表推导式 [x for x in range(1000000000000)] ,[x for x in range(10000) if x%3 = 0]这种的不算
# 得到生成器generator 把方括号变成小括号 a = (x for x in range(10000) if x%3 = 0) 这种就行
# 那么如何取出里面的元素?需要的时候帮你产生一个
# (1)print(a.__next__()) 不参加参数的话就是调用一次,也就是产生一次
# (2)用系统自带的next next(a) 这种方式也可以
# 但是如果是(1)和(2)里面结合的话 就是都可以使用 ,但是也是有一次算一次,不会因为重新用了新方法而从头开始
# 如果调用的次数超过异常的那么可以用try 和 except 来进行
# 在可能产生异常的代码 进行try处理

# 2.借助函数完成
# 斐波那契函数
# 只要函数中出现了yield那么就是一个生成器了
# def func():
# n = 0
# while True:
# n += 1
# yield n # 这个yield 是一个关键,告诉底层这是一个生成器
'''
步骤:
1.定义一个函数,函数中使用yield关键字
2.调用函数,接受调用的结果
3.得到的结果就是生成器
4.借助__next__() 和next()
yield = return n + 暂停
'''

# 斐波那契函数:
# def fib(length):
# a, b = 0, 1
# n = 0
# while n < length:
# yield b
# a, b = b, a + b
# n += 1
# return 'ab' 这一行的作用就是在生成器没有更多的产生的时候就会return这个值,以报错信息的方式告我们的

# g = fib(10)
# print(g)
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))


# def gen():
# i = 0
# while i < 5:
# temp = yield i
# print('temp:',temp)
# i+=1
# return '没有更多的了'
#
# g = gen()
# print(next(g))
# print(next(g))
# print(next(g))
# g.send(None)
# g = g.send('哈哈')
# print(g)

'''
生成器方法:
__next__():获取下一个元素
send(value):获得下一个元素,同时可以往里面送数据 注意:第一次调用必须传一个空值
'''

# 携程(进场---线程----携程)
# 迅雷下载的时候 默认是开十个线程
def task1(n):
for i in range(n):
print('正在搬砖第{}块'.format(i))
yield None
def task2(n):
for i in range(n):
print('正在听第{}歌'.format(i))
yield None

g1 = task1(10)
g2 = task2(10)

for i in range(10):
g1.__next__()
g2.__next__()

posted @ 2020-02-14 13:02  smartcat994  阅读(104)  评论(0编辑  收藏  举报