image-20211031232546648

# -*- 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)