• 列表推导式三种模式和生成器


    1、循环模式。[变量(加工后的变量) for 变量 in iterable]

    print([i for i in range(1,101)])
    # map:返回一个迭代器, 循环 类似于列表推导式的循环模式。
    l1 = [1, 2, 3, 4, 5]
    print([i**2 for i in l1])
    iter3 = map(lambda x: x**2, l1)
    print(list(iter3))

    2、三元模式

    # 如果i可以整除3就返回一个*,else返回i
    print(['*' if i % 3 == 0 else i for i in range(1,21)])

    3、筛选模式 [变量(加工后的变量) for 变量 in iterable if 条件]

    # 三十以内所有的偶数留到列表中
    print([i for i in range(1,31) if i % 2 == 0])
    # filter:返回一个迭代器  ***
    # 过滤 类似于列表推导式的筛选模式。
    l1 = [2, 4, 5, 6, 7, 8, 10]
    iter2 = filter(lambda x: x % 2 == 0, l1)
    for i in iter2:
        print(i)

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

    1,生成器函数。(yield)

    def func():
        print(111)
        print(222)
        yield 666
        yield 777
        
        
    ret = func()
    print(ret)
    # 一个next 对应一个yield
    print(next(ret))
    print(next(ret))

    2,生成器表达式。(i for i in range(100))就是列表推导式把中括号变成小括号。生成器对象:gentor

    2.1)第一次取值不能用send传参 

    2.2)最后一个yield 永远也得不到send的传的值

    send:send(gentor)
    给上一个yield发送一个值
    send 对应yield取值。

    next:next(gentor) 
    对应一个yield 取值。

    def func():
        count = yield 666
        print(count)
        num = yield 'rock'
        print(num)
        yield 'wwww'
        n1 = yield 'fff'
        print(n1)
    genor = func()
    # print(next(genor))
    # print(next(genor))
    # # send不仅能对应yield取值,而且可以给上一个yield发送一个值
    print(genor.send(None))
    print(genor.send('888'))
    print(genor.send('777'))
    print(genor.send('111'))
    # print(genor.send('222'))

    yield 与 return 区别?

    return 终止函数,yield 不会终止生成器函数。

    都会返回一个值,return给函数的执行者返回值,yield是给next()返回值

    yield 返回的单个值时返回的是原数据类型返回多个值时返回的是一个元组

    def func():
        yield 3, 4, 5, 6
        
        
    genor = func()  
    print(next(genor))

    yield from 将一个可迭代对象变成一个迭代器返回。

    # yield from 将一个可迭代对象变成一个迭代器返回
    def func():
        lst = ['111', '222', '333', '444']
        yield from lst
        
        
    genor = func()
    print(next(genor))    # 111
    print(next(genor))    # 222
    print(next(genor))    # 333
    for i in genor:
        print(i)

    yeild详解 https://juejin.im/post/5b3af9fb51882507d4487144

    # 字符串
    astr = 'ABC'
    # 列表
    alist = [1, 2, 3]
    # 字典
    adict = {"name": "wangbm", "age": 18}
    # 生成器
    agen = (i for i in range(4, 8))
    
    
    def gen(*args, **kw):
        for item in args:
            yield from item
    
    
    new_list = gen(astr, alist, adict, agen)
    print(list(new_list))
    # ['A', 'B', 'C', 1, 2, 3, 'name', 'age', 4, 5, 6, 7]
  • 相关阅读:
    Redis学习笔记(九、Redis总结)
    菜鸟刷面试题(二、RabbitMQ篇)
    RabbitMQ学习笔记(八、RabbitMQ总结)
    MongoDB学习笔记(七、MongoDB总结)
    菜鸟刷面试题(一、Java基础篇)
    朋友圈点赞
    队列变换
    犯二的程度
    猴子选大王
    最大销售增幅
  • 原文地址:https://www.cnblogs.com/chen55555/p/10217891.html
Copyright © 2020-2023  润新知