zoukankan      html  css  js  c++  java
  • python3 列表/字典/集合推导式

    '''各种推导式
        列表推导式:[结果 for循环 if条件]
        字典推导式:[k:v for循环 if条件]
        集合推导式:{结果 for循环 if条件}
        没有元组推导式:
        生成器推导式:(结果 for循环 if条件)
    '''
    '''生成器表达式:(结果 for 循环 if 条件)'''
    
    g = (i * 2 for i in range(10) if i %2 == 0)
    print(g)  # 此时打印的就是一个生成器对象,并不是数据
    print(list(g))  # list()函数可以把一个生成器拿空,并拿到列表[0, 4, 8, 12, 16]
    '''迭代器:可以一个一个的拿到数据,具有__iter__和__next__方法
    可迭代对象:具有__iter__的方法
    通过__iter__可以拿到一个对象的迭代器
    迭代器特点:
        1.省内存(生成器)
        2.惰性机制(不执行__next__不拿值)
        3.只能向前,不能反复(拿光了就没了)
    
    for循环内部使用的就是迭代器。
    当一个迭代器内的元素被拿空之后,继续执行__next__会报错:StopIteration
    
    生成器本质就是迭代器。
    生成器有两种创建方式:
        1、生成器函数
        2、生成器表达式
        
    生成器函数:函数内部有yield语句就是生成器函数
    '''
    def gen():
        print(111)
        yield "apple"
    g = gen()  # 注意,这句话并没有执行gen()这个函数,而是通过gen函数创建了一个生成器
    ret = g.__next__()  # 此时才开始执行生成器,并返回yield后面的数据。 返回:111
    print(ret)  # apple
    '''集合推导式{key for循环 if语句}'''
    lst = [3, 5, 1, 5, 2, 1, 7]
    s = {i for i in lst}
    print(s)
    
    返回结果:
    {1, 2, 3, 5, 7}
    '''字典推导式{key:value fox循环 if语句}'''
    lst = ["apple", "orange", "banana"]
    dic = {k:v for k,v in enumerate(lst)}
    print(dic)
    
    返回结果:
    {0: 'apple', 1: 'orange', 2: 'banana'}
    '''在[3,6,9]的基础上推到出[[1,2,3], [4,5,6],[7,8,9]]'''
    print([[i-2, i-1, i] for i in [3, 6, 9]])
    
    返回结果:
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    [0, 1, 2, 3, 4, 25, 36, 49, 64, 81]
    [25, 36, 49, 64, 81]
    ['apple', 'orange']
    [1, 4, 9, 16, 25, 36]
    [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    '''使用列表推导式得到[1, 4, 9, 16, 25, 36]'''
    print([i*i for i in range(1, 7)])
    '''列表生成式可以快速的创建一个列表'''
    lst = [i*i for i in range(10)]
    print(lst)
    lst2 = [i if i < 5 else i*i for i in range(10)]
    print(lst2)
    lst3 = [i*i for i in range(10) if i >= 5]
    print(lst3)
    lst4 = [i for i in ["apple", "orange", "banana", "pear"] if i.endswith("e")]
    print(lst4)
    '''
    列表推导式[结果 for 变量 in 可迭代对象 if 条件]
    获取1-100内所有的偶数
    '''
    lst = [i for i in range(1, 101) if i % 2 == 0]
    print(lst)
    [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]
    '''生成器表达式:(结果 for 变量 in 可迭代对象)'''
    gen = (i for i in range(10))
    print(gen)  # <generator object <genexpr> at 0x0000000007B28200>
    print(list(gen))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    <generator object <genexpr> at 0x0000000007A8B728>
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    '''
    生成器表达式:(结果 for 变量 in 可迭代对象 if条件)
    获取1-100内能被3整除的数
    '''
    gen = (i for i in range(1, 100) if i %3 == 0)
    print(gen)  # <generator object <genexpr> at 0x0000000006085D58>
    print(list(gen))  # [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
    <generator object <genexpr> at 0x0000000006085D58>
    [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
    '''100以内能被3整除的数的平方'''
    gen = (i**2 for i in range(1, 100) if i % 3 == 0)
    print(gen)  # <generator object <genexpr> at 0x0000000007A8B258>
    print(list(gen))
    <generator object <genexpr> at 0x0000000007A8B258>
    [9, 36, 81, 144, 225, 324, 441, 576, 729, 900, 1089, 1296, 1521, 1764, 2025, 2304, 2601, 2916, 3249, 3600, 3969, 4356, 4761, 5184, 5625, 6084, 6561, 7056, 7569, 8100, 8649, 9216, 9801]
    '''(结果 for 变量1 in 可迭代对象 for 变量 in 变量1 if条件)
    寻找名字中带有两个e的人的名字
    '''
    names = [["tom", "Billy", "Jefferson", "Andrew", "Wesley", "Steven", "Joe"],
            ["Alice", "Jill", "Ana", "Wendy", "Jennifer", "Sherry", "Eva"]]
    gen = (name for name_lst in names for name in name_lst if name.count("e") > 1)
    print(gen)  # <generator object <genexpr> at 0x0000000006085CA8>
    print(list(gen))  # ['Jefferson', 'Wesley', 'Steven', 'Jennifer']
    <generator object <genexpr> at 0x0000000006085CA8>
    ['Jefferson', 'Wesley', 'Steven', 'Jennifer']
    '''生成器表达式和列表推导式的区别
        1、列表推导式比较耗内存,一次性加载。生成器表达式几乎不占用内存,使用的时候才分配和使用内存。
        2、得到的值不一样,列表推导式得到的是一个列表,生成器表达式获取的是一个生成器。
    '''
    '''生成器,取值的时候才拿值'''
    def func():
        print(111)
        yield 222
        
    g = func()  # 生成器g
    g1 = (i for i in g)  # 生成器g1
    g2 = (i for i in g1)  # 生成器g2
    
    print(list(g))  # 111 [222]
    print(list(g1))  # []
    print(list(g2))  # []
    111
    [222]
    []
    []
    '''字典推导式{k:v for 变量 in 可迭代对象}'''
    dic = {"a": 1, "b": 2}
    new_dic = {dic[key]: key for key in dic}
    print(new_dic)  # {1: 'a', 2: 'b'}
    
    dic2 = {dic[k]:k for k in dic}
    print(dic2)  # {1: 'a', 2: 'b'}
    {1: 'a', 2: 'b'}
    {1: 'a', 2: 'b'}
    '''一个列表元素作为键值,一个列表元素作为值'''
    lst = ["apple" , "banana", "orange"]
    lst2 = ["苹果", "香蕉", "桔子"]
    dic = {lst[i]: lst2[i] for i in range(len(lst))}
    print(dic)  # {'apple': '苹果', 'banana': '香蕉', 'orange': '桔子'}
    {'apple': '苹果', 'banana': '香蕉', 'orange': '桔子'}
    '''
    集合推导式: {结果 for 变量 in 可迭代对象}
    取绝对值
    '''
    lst = [1, -1, 8, -8 , 12]
    s = {abs(i) for i in lst}
    print(s)  # {8, 1, 12}
    {8, 1, 12}
  • 相关阅读:
    接口自动化平台
    MAC安装社区版本IDEA
    Python比较图片的不同
    快看!markdown的语法原来如此简单~
    说一说你不了解的Tailwind CSS响应式设计~
    Tailwind CSS安装和构建的正确操作方式
    一款绝对让你惊艳的CSS框架——TailwindCSS
    备受争议的PHP前景究竟如何?我们该何去何从?
    laravel8更新之速率限制改进
    laravel8更新之维护模式改进
  • 原文地址:https://www.cnblogs.com/lilyxiaoyy/p/10762281.html
Copyright © 2011-2022 走看看