zoukankan      html  css  js  c++  java
  • Python_day13_2018.7.18(生成器和生成器表达式)

    本节主要内容:

      1.生成器和生成器函数

      2.列表推导式

    一.生成器

      什么是生成器,生成器实质是迭代器

    三个获取生成器的方法:

      1.通过生成器函数

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

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

    def func():   

      print("111")   

      return 222

    ret = func()

    print(ret)

    结果: 111 222

    ------------把return换成yield --------------

    def func():   

      print("111")   

      yield  222

    ret = func()

    print(ret)   #ret没有执行函数,只是获取到生成器的内存地址.

    由于函数中存在了了yield. 那么这个函数就是一个生成器 函数. 这个时候. 我们再执行这个函数的时候. 就不再是函数的执行了.

    而是获取这个生成器. 如何使用呢? 想想迭代器. ⽣生成器的本质是迭代器. 所以. 我们可以直接执行__next__()来执行.

    def func():   

      print("111")   

      yield 222

    gener = func()  # 这个时候函数不不会执行. 而是获取到生成器器

    ret = gener.__next__()  # 这个时候函数才会执⾏行行. yield的作⽤用和return⼀一样. 也是返回 数据

    print(ret)

    结果: 111 222

    send和__next__()区别:

    1. send和next()都是让⽣生成器向下走一次

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

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

    lst = [ ]

    for i int rang(1,15)

      lst.append(i)

    print(lst)

    替换成列表推导式:

    lst = [i for i in rang(1,15)]

    proint(lst)

    列表推导式的常见写法:

    [结果 for 变量 in 可迭代对象]

    帅选模式:

    [结果 for 变量 in 可迭代对象 if 条件 ]

    #获取1-100内所有的偶数

    lst = [i for i in rang(1,101) if i % 2 == 0]

    print(lst)

     生成器表达式和列表推导式的语法基本上是一样的. 只是把[ ]替换成( )

    gen = (i for i in rang(10))

    print(gen)

    结果:打印出来的是生成器gen的内存地址.

    gen = (i for i in rang(10))

    for i in gen

    print(i)   #我们可以使用for循环来循环这个生成器:

    生成器表达式也可以进行筛选:

    gen = (i for i in rang(1,100)  if i % 3 == 0 )

    for num in gen:

    print( num )

    ⽣生成器表达式和列列表推导式的区别:

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

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

    def func()

      print(111)

      yield 222

    g = func( )            #生成器

    g1 = (i for i in g)   

    g2 = (o for i in g1)   #生成器g1中的数据, g1的数据来源是g 但是g 已近取完了,g1 也就没有数据了

    print(list(g))

    print(list(g1))   #生成器g1 ,但是g1 的数据来源与g

    print(list(g2))    #生成器g1中的数据, g1的数据来源是g 但是g 已近取完了,g1 也就没有数据了.

    # day14作业默写
    # 1,整理今天的博客,写课上代码,整理流程图。
    # 2,用列表推导式做下列小题
    # (1) 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母

    # lis = ["abc","zc","ahdd","a","df","jshdh"]
    # new_list = [i.upper() for i in lis if len(i) >= 3]
    # print(new_list)

    # (2) 求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
    # lis = [(x,y) for x in range(0,6) for y in range(1,6) if x % 2 == 0 and y % 2 != 0]
    # print(lis)
    # (3) 求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]

    # M = [[1,2,3],[4,5,6],[7,8,9]]
    # lis = [ i[2] for i in M ]
    # print(lis)

    # # (4) 求出50以内能被3整除的数的平方,并放入到一个列表中。

    # lis = [i**2 for i in range(1,51) if i % 3 == 0]
    # print(lis)

    # (5) 构建一个列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']

    # lis = ["python%s" % i for i in range(1,11)]
    # print(lis)

    # (6) 构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]

    # lis = [(i,i+1) for i in range(6)]
    # print(lis)

    # (7) 构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

    # lis = [i for i in range(0,19) if i % 2 == 0]
    # print(lis)

    # (8) 有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']

    # l1 = ['alex', 'WuSir', '老男孩', '太白']
    # lis = [i+str(l1.index(i)) for i in l1]
    # print(lis)

    # (9)有以下数据类型:
    # x = {
    # 'name':'alex',
    # 'Values':[{'timestamp':1517991992.94,
    # 'values':100,},
    # {'timestamp': 1517992000.94,
    # 'values': 200,},
    # {'timestamp': 1517992014.94,
    # 'values': 300,},
    # {'timestamp': 1517992744.94,
    # 'values': 350},
    # {'timestamp': 1517992800.94,
    # 'values': 280}
    # ],}
    # # 将上面的数据通过列表推导式转换成下面的类型:[[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]
    #
    # lis = [[el.get("timestamp"),el.get('values')] for el in x.get("Values") ]
    # print(lis)
  • 相关阅读:
    计算时代之大数据-分类阅读时代
    从语言到库到框架,再到API,再到标记最后到DSL语言
    Angular指令1
    宇宙量子计算理论
    Angular实现瀑布流的库angular-deckgrid
    Markdown会干掉Html吗?
    基于Html5缓存的页面P2P技术可行性探讨
    一个艰难的决定
    CentOS7 安装 MariaDB-10.4.7
    MongoDB-4 GridFS 文件存储
  • 原文地址:https://www.cnblogs.com/kcwxx/p/9332395.html
Copyright © 2011-2022 走看看