zoukankan      html  css  js  c++  java
  • py 的 第 13 天

    ---恢复内容开始---

    1.生成器和生成器函数

    2.列表推导式

    一生成器

    什么是生成器。生成器实质就是迭代器。

    python中有三种方式来获取生成器。

    1通过生成器函数

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

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

    将函数中的return换成yield就是生成器

    运行的结果和上面啊不一样,为什么呢,由于函数中存在yield。那么这个函数就是一个生成器函数。这个时候。我们在执行这个函数的时候,就不再是函数的执行了。而是获取这个生成器,如何使用?想想迭代器。生成器的本质就是迭代器。所以。我们可以直接执行__next__()来执行

    那么我们可以看到,yield和return的效果一样,区别就是yield是分段来执行1个函数。return 呢?直接停止执行函数。

    当程序运行完最后一个yield。那么后面继续走 --next--()程序会报错

    def  c():

      lst=[]

      for i in range(0,10000):

        lst.appende("衣服"+str(i))

      return lst

    cl=c()

    这样就是一下子全部打印出来,太站内存

    def  c():

      for i in range(0,10000):

        yield "衣服“+str(i)

    cl=c()

    print(c.__next__())

    print(c.__next__())print(c.__next__())      这样就是你打印一次出一个,不会占用内存

    一次出一个,生成器一个一个的指向下一个,不会回去__next__()到哪指针就到哪下一次继续获取指针指向的值

    然后是 send方法send和__next__()一样都可以让生成器执行到下一个yield。

    send和next的区别

    都是往下走一次

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

     生成器可以使用for循环来循环内部元素

    def func():
        print(111)
    
        yield 222
        print(333)
        yield 444
        print(555)
        yield 666
    
    gen = func()
    for i in gen:
    

    print(i)

    结果: 111 222 333 444 555 666

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

    列表推导式是通过一行行来构建你要的列表,列表推导式看起来代码简单。但是出现错误之后很难排查。

    列表推导式的常用用法:

    【结果 for 变量 in可迭代对象】
    还可以进行筛选

    筛选模式:
    [ 结果 for 变量 in 可迭代对象 if 条件 ]

    生成器表达式和列表推导式基本一样 就是()换成【】但是更重要的是 生成器打印出的是地址,列表推导式表达的是人能看懂的字符

    打印结果就是一个生成器,我们可以使用for来循环这个生成器

    gen = ("麻花藤我第%s次爱你" % i for i in range(10))for i in gen:

    print(i)

    生成器表达方式也可以筛选   整除2是否为0count  XX出现几次  出现几次怎样 没有怎样

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

    1,列表推导式比较耗内存,一次性加载,生成器表达式几乎不占用内存使用的时候才分配和使用内存

    2.得到的值不一样。列表推导式得到的是一个列表,生成器表达式获取的是一个生成器

    生成器的惰性机制生成器只有在访问的时候才取值,说白了,你找他要他才给你值,不找他他就不执行。

    深坑--生成器,要值得时候才拿值

    字典推导式:

    # 把字典中的key和value互换
    dic = {'a': 1, 'b': '2'}
    new_dic = {dic[key]: key for key in dic}

    print(new_dic)

    # 在以下list中. 从lst1中获取的数据和lst2中相对应的位置的数据组成⼀一个新字典

    lst1 = ['jay', 'jj', 'sylar']
    lst2 = ['周杰伦', '林林俊杰', '邱彦涛']
    dic = {lst1[i]: lst2[i] for i in range(len(lst1))}

    print(dic)

    集合推导式:
    集合推导式可以帮我们直接⽣成一个集合. 集合的特点: ⽆序, 不重复. 所以集合推导式⾃带去重功能

    推导式有,列表推导式有,字典推导式,集合推导式,没有元组推导式

    生成器表达式(结果 for 变量 in 可迭代对象 if条件筛选)

    生成器表达式可以直接获取到生成器对象。生成器对象可以直接进行for循环,生成器具有惰性机制。

  • 相关阅读:
    cf359D Pair of Numbers
    cf671B Robin Hood
    [暑假集训--数位dp]hdu5787 K-wolf Number
    [暑假集训--数位dp]UESTC250 windy数
    [暑假集训--数位dp]LightOj1205 Palindromic Numbers
    [暑假集训--数位dp]LightOJ1140 How Many Zeroes?
    [暑假集训--数位dp]LightOj1032 Fast Bit Calculations
    [暑假集训--数位dp]hdu5898 odd-even number
    [暑假集训--数位dp]cf55D Beautiful numbers
    [暑假集训--数位dp]hdu3709 Balanced Number
  • 原文地址:https://www.cnblogs.com/Mrszhao/p/9474636.html
Copyright © 2011-2022 走看看