• 生成器


    1 生成器:
    就是自己用python代码写的迭代器,本质就是迭代器。
    l1=[1,2,3]
    iter1=l1.__iter__()
    两种方法:
    1,通过生成器函数。
    2,生成器表达式。
    通过两种方式构建一个生成器


    生成器函数:
    def func1(x):
    x+=1
    yield x
    dof=func1(5)
    print(god.__next__())
    一个next对应一个yield
    yield将值返回给 生成器对象.__next__()

    yield return
    return 结束函数,给函数的执行者返回值
    yield 不会结束函数,一个next对应一个yield,给生成器对象。__next__() 返回值。




    迭代器与生成器的区别:
    第一种:自定制的区别
    l1=[1,2,3,4,5]
    l1.__iter__()

    def func1(x):
    x+=1
    yield x
    x+=3
    yield x
    x+=5
    yield x
    g1=func1(5)
    print(g1.__next__())
    print(g1.__next__())
    print(g1.__next__())

    区别2:
    内存级别的区别
    迭代器是需要可迭代对象进行转化,可迭代对象非常占内存。
    生成器直接创建,不需要转化,从本质就节省内存。
    def func1():
    for i in range(100000):
    yield i
    g1=func1()
    for i in range(50):
    print(g1.__next__())


    send与next
    def func1():
    /print(1)
    count=yield 6
    print(count)
    /print(2)
    count1=yield 7
    print(count1)
    /print(3)
    yield 8

    g= func1()
    next(g)
    g.send('alex')
    g.send('alex')
    g.send('taibai')
    g.send('taibai')

    send与next一样,也是对生成器取值(执行一个yield)的方法。
    send可以给上一个yield传值。
    第一次取值永远都是next。
    最后一个yield永远也得不到send传的值。


    def cloth1(n):
    for i in range(n+1):
    print('衣服%s号'%i)
    cloth1(10000)

    def cloth2(n):
    for i in range(1,n+1):
    yield '衣服%s号'%i
    g=cloth2(1000)
    for i in range(50):
    print(g.__next__())
    for i in range(50):
    print(g.__next__())

    列表推导式:一行代码几乎搞定你需要的任何列表。
    循环模式:[变量(加工后的变量) for 变量 in iterable]
    l=[i for i in range(1,101)]
    print(1)
    l2=['python%s期'% i for i in range(16)]
    print(l2)
    print

    列表推导式
    优点:一行解决,方便。
    缺点:容易着迷,不易排错,不能超过三次循环。
    列表推导式不能解决所有列表的问题,所以不要太刻意用。
    生成器表达式:将列表推导式的[]换成()即可。
    g=(i for i in range (1000000))
    print(g.__next__())
    print(g.__next__())

    筛选模式:
    # l3 = [i for i in range(1,31) if i % 2 == 0]
    # print(l3)
    # print([i for i in range(1,31) if i % 3 == 0])
    # print([i**2 for i in range(1,31) if i % 3 == 0])
    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
    ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    print([j for i in names for j in i if j.count('e') == 2])
  • 相关阅读:
    bzoj3757 苹果树
    bzoj2743 [HEOI2012]采花
    bzoj4241 历史研究
    bzoj4448 [Scoi2015]情报传递
    bzoj3295 [Cqoi2011]动态逆序对
    bzoj4034 [HAOI2015]T2
    bzoj3339 Rmq Problem
    BZOJ 1017 魔兽地图
    BZOJ 1021 循环的债务
    SUOI #37 清点更多船只
  • 原文地址:https://www.cnblogs.com/13507215809qwer-/p/9512625.html
Copyright © 2020-2023  润新知