• 三元表达式,列表生成式,生成器生成式


    三元表达式

    可以将if...else..…分支变成一行

    语法:

    	`条件为真时的结果  if  判断的条件 lese  条件为假时的结果`
    
    a = 1
    b = 2
    #第一种写法
    erroStr = "More" if a > b else "Less"
    print(erroStr) # 运行结果为:Less
    #第二种写法
    print({True:'More',False:'less}[a > b]')#运行结果为Less
    #第三种写法
    print(("FalseValue", "TrueValue")[a > b]) # 运行结果为:FalseValue       
    

    列表生成式

    列表推导式可以利用 range 区间、列表、元组、集合和字典等数据类型,快速生成一个满足指定需求的列表。


    语法:

    [表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] ]

    此格式中,[if 条件表达式] 不是必须的,可以使用,也可以省略。

    列表生成式

    list1 = [f'1{line}' for line in range(1, 101)]# print(list1)

    Demo: 将name_list列表中的每一个人后缀都添加_dsb

    name_list = ['jason', '饼哥(大脸)', 'sean', 'egon']

    new_name_list = [name + '_dsb' for name in name_list]

    另外,以上所看到的列表推导式都只有一个循环,实际上它可使用多个循环,就像嵌套循环一样

    d_list = [(x, y) for x in range(5) for y in range(4)]

    d_list列表包含20个元素

    上面代码中,x 是遍历 range(5) 的迭代变量(计数器),因此该 x 可迭代 5 次;y 是遍历 range(4) 的计数器,因此该 y 可迭代 4 次。因此,该(x,y)表达式一共会迭代 20 次。上面的 for 表达式相当于如下嵌套循环

    代码结果:

    [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3)]

    当然,也支持三次嵌套的for循环表达式


    应用场景:数据量小时采用

    [line for line in range(1, 6)] ---> [1, 2, 3, 4, 5]
    

    优点:可依赖索引取值,取值方便

    缺点:和生成器表达式对比 浪费资源

    生成器表达式(元组生成式)

    语法:除了和列表生成式用的括号不一样,其他完全一样

    (表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] )

    例如,我们可以使用下面的代码生成一个包含数字 1~9 的元组:

    a = (x for x in range(1,10))print(a)

    运行结果:

    <generator object at 0x0000020BAD136620>

    从上面的执行结果可以看出,使用元组推导式生成的结果并不是一个元组,而是一个生成器对象


    如果想要使用元组推导式获得新元组或新元组中的元素,有以下三种方式:

    1 使用 tuple() 函数,可以直接将生成器对象转换成元组,例如:

    a = (x for x in range(1,10))

    print(tuple(a))

    运行结果为:

    (1, 2, 3, 4, 5, 6, 7, 8, 9)

    2 直接使用 for 循环遍历生成器对象,可以获得各个元素,例如:

    a = (x for x in range(1,10))

    for i in a:

    print(i,end=' ')

    print(tuple(a))

    运行结果:

    1 2 3 4 5 6 7 8 9 ()

    3 使用 __next__() 方法遍历生成器对象,也可以获得各个元素,例如:

    a = (x for x in range(3))

    print(a._next_())

    print(a._next_())

    print(a._next_())

    a = tuple(a)

    运行结果:

    0

    1

    2

    转换后的元组: ()

    注意,无论是使用 for 循环遍历生成器对象,还是使用 next() 方法遍历生成器对象,遍历后原生成器对象将不复存在,这就是遍历后转换原生成器对象却得到空元组的原因。

    应用场景:数据量过大时使用

    (line for line in range(1, 6)) ---> g生成器(1, 2, 3, 4, 5)
    

    优点:节省资源

    缺点:取值不方便

    还有集合生成式,字典生成式

  • 相关阅读:
    UVa 10474
    UVa 1339
    UVa 1368
    UVa 1585
    UVa 1586
    ACM中Java高效输入输出封装
    Ajax中Get请求与Post请求的区别
    AJAX——核心XMLHttpRequest对象
    PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
    PHP类方法重写原则
  • 原文地址:https://www.cnblogs.com/kai-/p/11858691.html
Copyright © 2020-2023  润新知