• 函数 生成器 生成器表达式


    一,生成器

    生成器实质就是迭代器。

    如何获取生成器:

    1,通过生成器函数

    2,通过各种推导式来实现生成器

    3,通过数据的转换也可以获取生成器

    函数:

    1 def order():
    2     lst = []
    3     for i in range(10000):
    4         lst.append('衣服'+str(i))
    5     return lst
    6 ll = order()

    生成器函数:

    1 def order():
    2     for i in range(10000):
    3         yield '衣服'+str(i)
    4 g = order()
    5 wanghua = g.__next__()
    6 print(wanghua)
    7 zhangyining = g.__next__()
    8 print(zhangyining)

    区别:第一种是一次性全部拿出来,会很占用内存。第二种使用生成器。一次性只取一个,用多少取多少。生成器是一个一个的指向下一个。不会回去,__next__()到哪,指针就指到哪儿。下一次继续获取指针指向的值。

    send()和__next__()都可以让生成器执行到下一个yield.

     1 def eat():
     2     print('我吃啥?')
     3     a = yield '包子'
     4     print('a=', a)
     5     b = yield '馅饼'
     6     print('b=', b)
     7     c = yield '牛肉汉堡'
     8     print('c=', c)
     9     yield 'GAME OVER'
    10 gen = eat()
    11 ret1 = gen.__next__()
    12 print(ret1)
    13 ret2 = gen.send('酸菜汤')
    14 print(ret2)
    15 ret3 = gen.send('羊肉')
    16 print(ret3)
    17 ret4 = gen.send('鸡肉卷')
    18 print(ret4)

    send()和__next__()区别:

    1,send和next都是生成器向下走一次

    2,send可以给上一个yield的位置传递值,不能给最后一个yield发送值。在第一次执行生成器代码的时候不能使用send()

     1 def func():
     2     yield 1
     3     yield 5
     4     yield 24
     5     yield 55
     6     yield 56
     7     yield 78
     8 func()
     9 for i in func():
    10     print(i)
    11 print(list(func()))

    二,列表推导式,生成器表达式以及其他推导式:

    1,列表推导式[结果 for循环 条件筛选]

    1 lst = []
    2 for i in range(100):
    3     if i % 2 == 0:
    4         lst.append(i)
    5 print(lst)
    6 
    7 lst = [i for i in range(100) if i % 2 == 0]
    8 print(lst)

    2,字典推导式{k:v for循环  条件筛选}

    dic = {'jj': '林俊杰', 'Jay': '周杰伦', 'Angelababy': '杨颖', 'Nikolas': '赵四'}
    dic1 = {v: k for k, v in dic.items()}
    print(dic1)

    3,集合推导式{k  for循环  条件}

    1 lst = [1,1,1,3,5,9,4,4,5,8,6,2,4,4,7,9,5,1,4,8,5,41,47,7,8,5]
    2 set = {el for el in lst}
    3 print(set)

     生成器表达式:

    (结果 for循环 条件)

    特点:

    1,惰性机制

    2,只能向前

    3,节省内存(鸡蛋)

    1 def func():
    2     print(111)
    3     yield 222
    4 g = func()
    5 g1 = (i for i in g)
    6 g2 = (i for i in g1)
    7 print(list(g))
    8 print(list(g1))
    9 print(list(g2))

    经典题型:

     1 def add(a, b):
     2     return a + b
     3 def test():
     4     for r_i in range(10):
     5         yield r_i
     6 g = test()
     7 
     8 for n in [1, 10, 10, 10, 10, 10, 10, 10]:
     9     g = (add(n, i) for i in g)
    10 
    11 print(list(g))
  • 相关阅读:
    JS开发框架DevExtreme v20.1.7上线
    Web开发:看如何定义Kendo UI Grid Width
    如何创建自定义DevExpress报表控件,看完你就懂了
    高性能HTML5/JavaScript开发框架DevExtreme全新发布v20.1.7|附下载
    WPF界面开发:如何将不同集合中的项目显示为同一父节点子项
    界面开发包DevExpress v20.1.7上线!即刻体验
    WPF界面开发2020:Scheduler等控件功能升级
    Winform界面开发看过来!一招教你使用属性网格自定义编辑器
    将从数据库查询出来的带有父子结构的list转换成treeList结构
    将JDBC ResultSet结果集转成List
  • 原文地址:https://www.cnblogs.com/982336352ryan/p/9469867.html
Copyright © 2020-2023  润新知