Knight_day12

  • 生成器

    生成器:自己用python代码写的迭代器,生成器本质就是迭代器。

    构建一个生成器:

      1.通过生成器函数

        函数的return换成yield

      2.生成器表达式

    单独的 生成器名() 不执行,为生成器对象

    执行:生成器名().__next__() 一个next对应一个yield,yield将值返回给生成器名().__next__()

    yield vs return:

      return结束函数,给函数执行者返回值

      yield不会结束函数,一个next返回一个yield,给生成器对象.__next__()

    生成器函数 vs 迭代器:

      1.自定制区别

      2.内存级别区别

        对于迭代器:可迭代对象 ----> 迭代器 在可迭代对象创建时就已经占用了内存

        对于生成器:直接创建,无需转化,从本质节省内存。

              yield每次记住位置

# 全部打印
def cloth1(n):
    for i in range(1, n + 1):
        print(f'衣服{i}号')
cloth1(10000)

# 需要多少打印多少且保留位置
def cloth2(n):
    for i in range(1, n + 1):
        yield i
c = cloth2(10000)
for i in range(100):
    print(c.__next__())
for i in range(500):
    print(c.__next__())

 

    send vs next:

      send与next一样也是对生成器取值(执行一个yield)的方法。

      send可以给上一个yield传值,且必须传值。

      注意:1.第一次取值不能用send,永远是next。

         2.最后一个yield永远得不到send传的值

  • 列表推导式,生成器表达式

    列表推导式:

      一行代码几乎满足需要的任何列表

      模式:

        循环模式:

          [变量(加工后变量) for 变量 in interable]

        筛选模式:

          循环模式后加 if 判断

      优点:一行解决,方便

      缺点:容易着迷,不易排错,不能超过三次循环,不能解决所有列表问题,不要刻意用

    生成器表达式:

      将列表推导式的 [] 换成 () 即可。用__next__()读。一般用于数据量大的情况。

    字典表达式:

lst1 = ['k1', 'k2', 'k3']
lst2 = [1, 2, 3]
dic = {lst1[i]: lst2[i] for i in range(len(lst2))}
print(dic)
'''
{'k1': 1, 'k2': 2, 'k3': 3}
'''


dic = {'k1': 1, 'k2': 2, 'k3': 3}
dic_inverse = {dic[i]: i for i in dic}
print(dic_inverse)
'''
{1: 'k1', 2: 'k2', 3: 'k3'}
'''

 

    集合推导式: 天然去重

lst1 = [1, -1, 4, 9, -9]
s = {i**2 for i in lst1}
print(s)
'''
{16, 1, 81}
'''

 

    

posted @ 2022-02-13 21:47  夜色无边  阅读(43)  评论(0)    收藏  举报