zoukankan      html  css  js  c++  java
  • python基础 day12 生成器、生成器表达式、列表字典集合推导式

    一、生成器

    生成器的本质就是迭代器
    唯一的区别是:生成器我们自己用python代码构建的数据结构,而迭代器是python提供的,或者转化得来的。

    • 获取生成器的三种方式

      1.生成器函数

      2.生成器表达式

      3.python内部提供

    • 生成器函数获取生成器

    def func():
        yield 3
        yield 4
    ret = func()
    print(ret)  # <generator object func at 0x0000025DF985F580>生成器对象
    
    print(next(ret))  # 3
    print(next(ret))
    '''
    3
    4
    '''  # 一个next对应一个yield
    
    • return 和yield的区别:

      return是结束函数,一个函数只存在一个return,并给函数执行者返回值

      函数中只要有yield,那么它就是生成器函数而不是函数了

      生成器函数中可以存在多个yield,一个yield对应一个next,yield不会结束函数

    def gen_fun():
        for i in range(1,5001):
            yield i
    ret = gen_fun()
    
    for i in range(200):
        print(next(ret))
    
    for i in range(100):
        print(next(ret))
    
    • yield from
    def func():
        li = [1, 2, 3, 4, 5]
        yield from li  # 将li这个列表变成了迭代器返回
    
    ret = func()
    print(next(ret))
    print(next(ret))
    print(next(ret))
    print(next(ret))
    print(next(ret))
    
    def func():
        list1 = [1, 2, 3, 4, 5]
        list2 = [6, 7, 8]
        yield from list1
        yield from list2
    
    g = func()
    for i in range(8):
        print(next(g))
    

    二、生成器表达式,列表推导式

    • 列表推导式

    用一行代码构建一个比较复杂有规律的列表

    1. 循环模式:[变量(加工后的变量) for 变量 in iterable]
    li = [i for i in range(1, 11)]
    print(li)
    
    # 1.将10以内的所有整数的平方写入列表
    list1 = [i ** 2 for i in range(1, 11)]
    print(list1)
    # 2.100以内所有偶数
    list2 = [i for i in range(2, 101, 2)]
    print(list2)
    # 3.从Jason的女朋友1号到Jason的女朋友100号写入列表
    list3 = [f'Jason的女朋友{i}号' for i in range(1, 101)]
    print(list3)
    # 4.构建[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
    list4 = [i for i in range(1, 11)] + list('JQKA')
    print(list4)
    
    1. 筛选模式:[变量(加工后的变量) for 变量 in iterable if 条件]
    # 1.100以内能被3整除的数字
    list1 = [i for i in range(101) if i % 3 == 0]
    print(list1)
    # 2.过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
    li = ['jason', 'a', 'carly', 'cc', 'dog']
    list2 = [i.upper() for i in li if len(i) >= 3]
    print(list2)
    # 3.筛选出来含有两个'e'的所有的字符串全部大写
    list3 = [['jason', 'a', 'ceely', 'cc', 'eeg', 'aece'], ['eye', 'uuueee', 'sex']]
    list4 = [j.upper() for i in list3 for j in i if j.count('e') == 2]
    print(list4)
    
    • 生成器表达式:

    写法上与列表推导式唯一的区别就是[]变成(),但是生成器推导式非常节省内存

    list1 = (i for i in range(101) if i % 3 == 0)
    print(list1)
    print(next(list1))
    print(next(list1))
    print(next(list1))
    

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

    1.写法上[] 和 ()
    2.本质上iterable(可迭代对象) 和iterator(迭代器)的区别

    • 字典推导式
    list1 = ['k1', 'k2', 'k3']
    list2 = ['v1', 'v2', 'v3']
    dic = {list1[i]: list2[i] for i in range(len(list1))}
    print(dic)
    
    • 集合推导式
    set1 = {i for i in range(1, 11)}
    print(set1)
    
  • 相关阅读:
    Git/GitHub使用技巧
    《暗时间》第一遍读书心得整理
    学习方法摘要总结
    Py爬虫项目
    2018年6月12日
    狐狸坑蛋糕
    Codeforces 371C Hanburgers
    【别忘咯】 关于运算优先级
    【noip 2009】 乌龟棋 记忆化搜索&动规
    【Openjudge】 算24
  • 原文地址:https://www.cnblogs.com/west-yang/p/12602571.html
Copyright © 2011-2022 走看看