纵有疾风起
人生不言弃

Python表达式与生成式

前言

  本章节中的所有知识点均为在不丧失代码可读性的前提下最大程度精简代码的一系列操作。其中涉及到一些性能问题(微乎其微)可以不做考虑。

三元表达式

  三元表达式中有三个重要的元素:

    1.条件是第一元素   

    2.条件成立返回的值是第二元素   

    3.条件不成立返回的值是第三元素

def func(x,y):    if x > y:        return "条件成立"    else:        return "条件不成立"res1 = func(1,2)print(res1)# ==== 三元表达式 ====x = 1y = 2# 条件成立后返回的值放在第一位,条件放在第二位,条件不成立后返回的值放在第三位res2 = "条件成立" if x > y else "条件不成立"print(res2)# ==== 执行结果 ===="""条件不成立条件不成立"""

列表生成式

  应用场景:

# 需求:提取出列表l中以 male 结尾的元素l = ["Yunya-male", "Jack-male", "Cuihua-Female", "Mary-Female", "Laura-Female", "Tom-male"]new_l = []for name in l:    if name.endswith("-male"):        new_l.append(name)print(new_l)# ==== 列表生成式 ====# 第一位放需要添加的元素。中间放迭代变量,最后放if条件。只有if条件成立后迭代变量才会被添加至新列表中new_l2 = [name for name in l if name.endswith("-male")]# new_l2 = [name for name in l if name.endswith("-male") else "x"] # 注意不能跟else,不符合条件的迭代变量将会被直接舍弃print(new_l2)# ==== 执行结果 ===="""['Yunya-male', 'Jack-male', 'Tom-male']['Yunya-male', 'Jack-male', 'Tom-male']"""

  如何快速掌握列表生成式:

# 在列表生成式中,也可以将成功返回的结果做一些处理。l = [str(i) for i in range(10) if i > 5]print(l)# 怎么样读懂列表生成式?# 1:先看循环后面的代码 for i in range(10) if i > 5。看看要循环几次# 2:再看前面代码 str(i) ,看看要生成什么值。# ==== 执行结果 ===="""['6', '7', '8', '9']"""

  注意:列表生成式与range()的迭代变量没有任何关系:

# 需求:生成一个列表,里面包含8个值为15的元素l = [15 for i in range(8)]  # 可以看到迭代变量i与条件成立后添加值没有任何关系。

字典生成式

# 1.可以设定默认的value值dic1 = {i:"value" for i in range(10) if i > 5}print(dic1) # 2.对于迭代一些特殊格式的容器。可以直接生成出字典items = [("name","Yunya"),("age",18),("gender","male")]dic2 = {k:v for k,v in items}print(dic2)# ==== 执行结果 ===="""{6: 'value', 7: 'value', 8: 'value', 9: 'value'}{'name': 'Yunya', 'age': 18, 'gender': 'male'}"""

集合生成式

# 1.字典生成式不要 :value 就是集合生成式li = ["a","b","a","b","c","d","d","e"]set1 = {i for i in li}print(set1)# ==== 执行结果 ===="""{'a', 'b', 'c', 'e', 'd'}"""

生成器表达式

# 生成器表达式和列表生成式使用方式一样。只是符号不一样,一个是[],一个是()g = (i for i in range(10) if i > 5)print(g)print(g.__next__())print(g.__next__())print(g.__next__())# ==== 执行结果 ===="""<generator object <genexpr> at 0x0000023A84B9E350>678"""

  应用场景:

# 统计文件中的字符个数# === 方式1 ===with open(file="计算机硬件基础.txt",mode="rt",encoding="utf-8") as f:    res1 = 0    for line in f:        res1 += len(line)    print(res1)# === 方式2 ===# sum()是内置函数,接收一个可迭代对象。将其中元素进行迭代以进行累加操作with open(file="计算机硬件基础.txt",mode="rt",encoding="utf-8") as f:    res2 = sum(len(line) for line in f) # 如果是将生成器表达式作为参数传递给另一个函数,可以不用套括号。    print(res2)# ==== 执行结果 ===="""959959"""

扩展:为何没有元组生成式

  元组本身就是不可变类型,对比列表生成式,它的工作原理其实就是迭代一个可迭代对象然后使用append()进行添加元素。由于元组是不可变类型故不能尝试改变其本身容器中元素的个数。

 

文章转载于:https://www.cnblogs.com/Yunya-Cnblogs/p/12919551.html

原著是一个有趣的人,若有侵权,请通知删除

未经允许不得转载:起风网 » Python表达式与生成式
分享到: 生成海报

评论 抢沙发

评论前必须登录!

立即登录