zoukankan      html  css  js  c++  java
  • python开发函数进阶:生成器表达式&各种推导式

    一,生成器表达式

    #生成器表达式比列表解析更省内存,因为惰性运算

    1 #!/usr/bin/env python
    2 #_*_coding:utf-8_*_
    3 
    4 new_2 = (i*i for i in range(100))  #生成器表达式
    5 print(list(new_2))
    6 #注意括号是小括号

    对比

    #!/usr/bin/env python
    #_*_coding:utf-8_*_
    
    # egg_list=['鸡蛋%s' %i for i in range(10)]  列表推倒式
    # print(egg_list)
    
    # laomuji = ('鸡蛋%s' %i for i in range(1,11))  生成器表达式
    # print(laomuji)
    # print(next(laomuji))
    # print(next(laomuji))

     小知识

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 
     4 #小知识
     5 def func():
     6     yield from 'ABC'   #相当于下面的for i in 
     7     # for i in 'ABC':
     8     #     yield i
     9 g = func()
    10 print(next(g))

    二,各种推导式

    #推导式套路
    # variable = [out_exp_res for out_exp in input_list if out_exp == 2]
    # out_exp_res:  列表生成元素表达式,可以是有返回值的函数。
    # for out_exp in input_list:  迭代input_list将out_exp传入out_exp_res表达式中。
    # if out_exp == 2:  根据条件过滤哪些值可以。

    1.列表推导式

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 
     4 #列表推导式
     5 #普通版本
     6 new_l = []
     7 for i in range(100):
     8     new_l.append(i*i)
     9 list(range(100))
    10 #进阶版本
    11 new_l = [i*i for i in range(100)]  #列表推倒式
    12 print(new_l)
    13 
    14 print(len([ i+5 for i in range(100) if i % 3 == 0 ]))  
    15 #执行过程  for >> if >> i+5 >> append[i+5]
    16 #详解过程
    17 # new_l = []
    18 # for i in range(100):
    19 #     if i % 3 == 0:
    20 #         new_l.append(i+5)
    21 
    22 print(len([i//2 if i%2==0 else i for i in range(100) if i % 3 == 0 ]))  #三元运算肯定要返回个值
    23 #执行过程  for >> 后if >> 前if >> append[i//2]
    24 #详解过程
    25 # for i in range(100):
    26 #     if i % 3 == 0:
    27 #         if i%2 == 0:
    28 #             new_l.append(i//2)
    29 #         else:
    30 #             new_l.append(i)
    31 
    32 
    33 # 30以内的数字,所有能被3整除的整数
    34 print([i for i in range(30) if i%3 == 0])
    35 # 30以内的数字,所有能被3整除的整数的平方
    36 print([i*i for i in range(30) if i%3 == 0])
    37 # 找到嵌套列表中名字含有2个'e'的所有名字
    38 # names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
    39 #          ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    40 # print([name for lst in names for name in lst if name.count('e') >=2])  从前往后看
    41 # 执行过程
    42 # 第一个for >> 第二个for >> if >> append[name]

    2.字典推导式

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 
     4 #字典推导式
     5 # 将一个字典的key和value对调
     6 mcase = {'a': 10, 'b': 34}
     7 for i in mcase:
     8     print(i)
     9 #[i for i in mcase]  #列表推导式
    10 print({key:key+'1' for key in mcase})     #更改k
    11 print({key:mcase[key] for key in mcase})  #取values
    12 print({mcase[key]:key for key in mcase})  #kv 对调
    13 
    14 #合并大小写对应的value值,将k统一成小写
    15 mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
    16 mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase}
    17 print(mcase_frequency)
    18 # 执行过程
    19 # for k in mcase >> k.lower() : values >> mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) >> {}
    20 # mcase.get# (k.lower(), 0)  get 到了就返回值,get不到就返回0

    3.集合推导式

    1 #!/usr/bin/env python
    2 #_*_coding:utf-8_*_
    3 
    4 #集合推导式,自带去重功能
    5 l = [-1,1,2,1]
    6 print({i for i in l})
    7 print({i*i for i in l})

     小结:练习题

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 
     4 #练习题
     5 # 例1:  过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
     6 str_l = ['a','ab','abc','abcd','abcde']
     7 print([i.upper() for i in str_l if len(i) > 3])
     8 # 例2:  求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
     9 print([(x,y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1])
    10 # 例3:  求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
    11 M = [[1,2,3],[4,5,6],[7,8,9]]
    12 print([i[2] for i in M])
  • 相关阅读:
    将"089,0760,009"变为 89,760,9
    单向循环链表
    双链表复习
    【C语言】scanf()输入浮点型数据
    【C语言】一元二次方程(求实根和虚根)
    输入一个三位正整数,输出百位数,十位数,个位数
    输入身份证号,输出出生日期
    比较四个数的大小
    比较三个数的大小
    比较两个数的大小
  • 原文地址:https://www.cnblogs.com/jokerbj/p/7291773.html
Copyright © 2011-2022 走看看