Python基础教程:推导式

古城微笑少年丶 2022-10-09 12:11 369阅读 0赞

列表推导式

推导式用来创建一些有规律的可变数据结构,能够让代码变得更加简洁。

比如,我们想要通过循环的方法创建一个数字从 1 到 50 的列表,可以这样做:

  1. lst = []
  2. for i in range(1, 51):
  3. lst.append(i)
  4. print(lst)

如果使用列表推导式,我们只需要一行代码:

  1. print([i for i in range(1, 51)])

我们就成功创建了一个 列表推导式。我们还可以运用字符串的格式化实现更多样化的输出:

  1. print([f"Python{ i} 期" for i in range(1, 51)])

前面两种是列表推导式的普通循环模式,它的基本结构为:

  1. [加工后的变量 for循环]

除了普通循环模式,我们还可以通过给循环增加筛选条件,实现筛选模式的列表推导式:

  1. print([i for i in range(1, 51) if i > 25])

筛选模式的列表推导式的基本结构为:

  1. [加工后的变量 for循环 加工条件]

列表推导式还支持嵌套。

对于这样一个嵌套的循环:

  1. ''' Python学习交流,免费公开课,免费资料, 免费答疑,系统学习加QQ群:579817333 '''
  2. lst = []
  3. for i in range(2):
  4. for j in range(2):
  5. lst.append(i + j)
  6. print(lst)

改成列表推导式结构就成了这样:

  1. print([i + j for i in range(2) for j in range(2)])

嵌套的列表推导式同样可以使用条件进行筛选:

  1. print([(i, j) for i in range(5) if i > 3 for j in range(6) if j < 3])

虽然列表推导式能节省很多代码,但是最多建议嵌套三层。

生成器可以让代码更加简化。比如,我们想求字符串 “alex,meet” 中每个字母 e 的索引。如果用 for 循环来写是可以实现的,但是需要多行代码:

  1. s = 'alex,meet'
  2. count = 0
  3. lst = []
  4. for i in s:
  5. if i == 'e':
  6. lst.append(count)
  7. count += 1
  8. print(lst)
  9. 输出结果为:[2, 6, 7]

而如果使用列表生成器的话,只需要一行代码即可实现:

  1. print([i for i in range(len(s)) if s[i] == 'e'])

字典推导式和集合推导式

除了列表之外,其他可变数据类型,比如字典字典和集合也可以通过推导式的方法来创建:

  1. ''' Python学习交流,免费公开课,免费资料, 免费答疑,系统学习加QQ群:579817333 '''
  2. # 字典推导式
  3. print({ i:i+1 for i in range(3)}) # 字典推导式普通循环模式
  4. print({ f"Python{ i}":i+1 for i in range(3)}) # {变量:变量 for循环}
  5. print({ i:i+1 for i in range(3) if i > 1}) # 字典推导式筛选模式
  6. # {加工后的变量:加工的后的变量 for循环 加工条件}
  7. # 集合推导式
  8. print({ i for i in range(3)}) # 集合推导式普通循环模式 {变量 for循环}
  9. print({ i for i in range(3) if i >2}) # 集合推导式筛选模式
  10. # {加工后的变量 for循环 加工条件}

生成器表达式(推导式)

我们前面学到的 生成器,除了可以通过函数的方式实现,还可以使用表达式来实现。与列表表达式相似,生成器表达式也有普通模式和筛选模式:

  1. # 普通模式:
  2. g = (i for i in range(3))
  3. # 筛选模式:
  4. g = (i for i in range(3) if i + 1 == 2)

生成器推导式的好处有三个:简化代码,提高逼格和提高可读性。

同列表表达式一样,生成器推导式用于生成一些有规律的数据。当我们需要生成的数据较大时,建议使用生成器推导式。

发表评论

表情:
评论列表 (有 0 条评论,369人围观)

还没有评论,来说两句吧...

相关阅读