生成器与迭代器

# -*- codeing = utf-8 -*-
# @Time : 2021/10/31 11:11
# @Author : Wans
# @File : generator01.py
# @Sofware : PyCharm
'''
通过列表生成式(列表推导式),我们可以直接创建一个列表
但是,受内存限制,列表容量肯定是有限的。
而且,创建一个包含100万个元素的列表,不仅占用很大的存储看见,
如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了
所以如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢!
这样就不必创建完整的list,从而节省大量的空间,在python中,这种一边循环一边计算的机制称为生成器
generator
得到生成器的方式:
1.通过列表推导式得到生成器
2.
'''
# [x for x in range(100000000)]
# [0,2,3,7,6,3,6,8,9,6,5]
# newlist = [x*3 for x in range(10)]
# print(newlist)
# 得到生成器
g = (x*3 for x in range(10))
print(type(g))  # <class 'generator'>
# 通过调用__next__()方式得到元素
print(g.__next__())     # 0
# 方式2:next(生成器对象)    builtins    系统内置函数
# 每调用一次next则会产生一个元素
print(next(g))      # 3
# StopIteration 生成器本来就可以产生10个,得到10个,在调用next会抛出异常
# -*- codeing = utf-8 -*-
# @Time : 2021/10/31 11:33
# @Author : Wans
# @File : generator02.py
# @Sofware : PyCharm
# g = (x * 3 for x in range(10))
#
# while True:
#     try:
#         e = next(g)
#         print(e)
#     except StopIteration:
#         print('没有更多元素了!')
#         break
# 定义生成器的方式二:借助函数完成
# 只要函数中出现yield关键字,说明函数就不是函数,变成生成器了
# 斐波那契数列
'''
步骤:
1.定义一个函数,函数中使用yield关键字
2.调用函数,接收调用的结果
3.得到的结果就是生成器
4.借助与next(),__next__得到元素
'''
# def func():
#     n = 0
#     while True:
#         n += 1
#         print(n)
#         yield n  # return n + 暂停
#
#
# a = func()
# next(a)
# next(a)
# next(a)
# a.__next__()
def fib(length):
    a, b = 0, 1
    n = 0
    while n < length:
        # print(b)
        yield b
        a, b = b, a + b
        n += 1
    return '没有更多元素了!!!'     # return就是在得到StopIteration后的提示
g = fib(10)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
# -*- codeing = utf-8 -*-
# @Time : 2021/10/31 13:46
# @Author : Wans
# @File : generator03.py
# @Sofware : PyCharm
'''
生成器方法:
    __next__():     获取下一个元素
    send(value):    向每次生成器调用中传值 注意:第一次调用send(None)
'''
def gen():
    i = 0
    while i < 5:
        temp = yield i
        print('temp', temp)
        for x in range(temp):
            print('---------', x)
        i += 1
    return '没有更多的数据了'
g = gen()
# print(next(g))
# print(next(g))
g.send(None)
n1 = g.send(5)
n2 = g.send(5)
print(n1)
# -*- codeing = utf-8 -*-
# @Time : 2021/10/31 16:48
# @Author : Wans
# @File : generator04.py
# @Software : PyCharm
# 进程>线程>协程
# 迅雷:
def task1(n):
    for i in range(n):
        print('正在搬第{}块砖'.format(i + 1))
        yield None
def task2(i):
    for i in range(i):
        print('正在听第{}首歌'.format(i + 1))
        yield None
g1 = task1(5)
g2 = task2(5)
while True:
    # next(g1)
    # next(g2)
    try:
        g1.__next__()
        g2.__next__()
    except:
        break
'''
生成器:generator
定义生成器方式:
1.通过列表推导式的方式
    g = (x+1 for x in rang(6))
2.复杂+yield
    def func():
        ...
        yield
    
    g = func()
产生元素:
    1.next(generator)  ----》每次调用都会产生一个新的元素,如果元素产生完毕,再次调用的话就会产生异常
    2.生成器自己的方法:
        g.__next__()
        g.send(value)
    应用:协程
'''
# -*- codeing = utf-8 -*-
# @Time : 2021/10/31 0:28
# @Author : Wans
# @File : list01.py
# @Sofware : PyCharm
# 列表推导式
# 旧的列表-----》新的列表
# 1、列表推导式: 格式:[表达式 for 变量 in 旧列表] 或者 [表达式 for 变量 in 旧列表 if 条件]
# 过滤掉长度小于或者等于3的人名
names = ['tome', 'lily', 'abc', 'jack', 'steven', 'bob']
result = [name.capitalize() for name in names if len(name) > 3]
print(result)
# 将1-100之间能被3整除,组成一个新列表
nwelist = [i for i in range(1, 101) if i % 3 == 0 and i % 5 == 0]
print(nwelist)
# [(偶数,奇数),(),(),()] [(0,1),(0,3),(0,5)]
nwelist1 = [(i, j) for i in range(5) if i % 2 == 0 for j in range(10) if j % 2 != 0]
print(nwelist1)
# list1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 3, 5]] ---->[3 ,6 , 9, 5]
list1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 3, 5]]
nwelist2 = [i[-1] for i in list1]
print(nwelist2)
dict1 = {'name': 'tom', 'salart': 5000}
dict2 = {'name': 'lucy', 'salart': 8000}
dict3 = {'name': 'jack', 'salart': 4500}
dict4 = {'name': 'lily', 'salart': 3000}
list1 = [dict1, dict2, dict3, dict4]
# 如果薪资大于5000加200,低于等于5000加500
nwelist1 = [employee['salart'] + 300 if employee['salart'] > 5000 else employee['salart'] + 500 for employee in list1]
print(nwelist1)
'''
def func(names)
    newlist=[]
    for name in names:
        if len(name)>3:
            newlist.append(name)
        return newlist
print(func())
def func()
    newlist = []
    for i in range(5):  # 偶数
        if i % 2 == 0:
            for j in range(10):
                if j % 2 != 0:
                    newlist.append((i,j))
print(func())
'''
# 集合推导式
list1 = [1, 2, 3, 4, 1, 4, 5, 2, 1, 8, 9, 9]
set1 = {x for x in list1 if x > 5}
print(set1)
# 字典推导式
dict1 = {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}
newdict = {value: key for key, value in dict1.items()}
print(newdict)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Wans!
 评论
TwikooGitalk



