• Day12 python基础---生成器,列表推导式,生成器表达式


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

    生成器的构建方式:

      1.通过生成器函数

      2.生成器表达式

    1.生成器函数:

    def func1(x):
        x += 1
        print(1111)
        yield x
        x +=2
        print(2222)
        yield 'alex'
    
    g_obj = func1(5)  # 生成器函数对象
    print(g_obj)  # <generator object func1 at 0x0000025E5D618780>
    print(g_obj.__next__())  #一个next对应一个yield
    print(g_obj.__next__())  #yield 将值返回给 生成器对象.__next__()

    2.yield vs return 对比

    return :结束函数,给函数的执行者返回值

    yield : 不会结束函数,一个next对应yield,给 生成器对象.__next__() 返回值

    3.生成器函数  vs 迭代器 区别

      1.内存级别的区别

        迭代器是需要可迭代对象进行转化。可迭代对象非常占内存

        生成器直接创建,不需要转化,从本质就节约内存。

      2.生成器可自定制的

    def func1():
        for i in range(1000000):
            yield i
    
    g1 = func1()
    for i in range(50):
        print(g1.__next__())

    4.send 与 next的区别

      1.send 与next一样,也是对生成器取值(执行一个yield)的方法。

      2.send 可以给上一个yield传值。

      3.第一次取值永远都是next

      4.最后一个yield 永远也得不到send传的值。

    def func1():
        print(1)
        yield 6
        print(2)
        yield 7
        print(3)
        yield 8
        return
    
    g = func1()
    print(next(g))
    print(g.send('alex'))
    print(g.send('taibai'))

    5.生成器表达式:

      循环模式:(变量(加工后的变量) for 变量 in iterable)

    g = (i for i in range(100000000000))
    print(g)
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())

      筛选模式:(变量(加工后的变量) for 变量 in iterable  if 条件)

    g = (i for i in range(100000000000) if i % 2 == 0)
    print(g)
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())

    二,列表推导式:一行代码几乎搞定你需要的任何列表

      优点:一行解决,方便

      缺点:容易着迷,不易排错,不能超过三次循环

      结论:列表推导式不能解决所有列表问题,所以不要太刻意使用

    #列表循环一般写法:
    l1 = []
    for num in range(1,101):
        l1.append(num)
    print(l1)
    
    #列表推导式写法
      # 循环模式  [变量(加工后的变量) for 变量 in iterable]
    l = [i for i in range(1,101)]
    print(l)
    l2 = ['python%s期' % i for i in range(1,16)]
    print(l2)
    print([i*i for i in range(1,11)])
    
      # 筛选模式 [变量(加工后的变量) for 变量 in iterable if 条件]
    l3 = [i for i in range(1,31) if i % 2 == 0]  #30以内所有偶数
    print(l3)
    print([i for i in range(1,31) if i % 3 == 0])  #30以内所有能被3整除的数
    print([i**2 for i in range(1,31) if i % 3 == 0])   #30以内所有能被3整除的数的平方
    
    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])  #找到嵌套列表中名字含有两个'e'的
    所有名字

    三,字典推导式:

    #将一个字典的key和value对调
    mcase = {'a':10,'b':34}
    mcase_frequency = {mcase[k]: k for k in mcase}
    print(mcase_frequency)
    
    #合并大小写对应的value值,将k统一小写
    mcase = {'a':10,'b':34,'A':7,'z':3}
    mcase_frequency = {k.lower():mcase.get(k.lower(),0) + mcase.get(k.upper(),0) for k in mcase.keys()}
    print(mcase_frequency)

    四,集合推导式

    #例:计算列表中每个值的平方,自带去重功能
    squared = {x**2 for x in [1, -1, 2]}
    print(squared)
    # Output: set([1, 4])
  • 相关阅读:
    MySQL_创建数据库和表
    MySQL注释的3中方法
    子查询概念和分类
    弱网测试如何进行
    Fiddler_ 移动端抓包配置IOS&Android,Fiddler获取APP端的流量
    Fiddler_HTTPS 如何抓包和浏览器设置
    Fiddler_弱网测试
    Three.js 游戏操作案例
    flex 教程
    JS知识
  • 原文地址:https://www.cnblogs.com/lianyeah/p/9506127.html
Copyright © 2020-2023  润新知