九、Python的生成式

生成式

1、列表生成式

在这里插入图片描述
在这里插入图片描述

  • 在列表生成式中使用if语句

对于这个range(1, 7)对象的1到6这六个数,如果某个数是偶数的话,我才想让它进行平方的操作,然后添加到列表的尾部,所以我可以添加这样一个if语句:
在这里插入图片描述
对2取余,如果i是偶数的话,对2取余的结果是0,也就是说i % 2的布尔值是False,然后在进行not操作之后,它的布尔值就变成了True,这样才会进行平方的操作。
在这里插入图片描述

  • 在列表生成式中使用双重循环

在这里插入图片描述

  • 在列表生成式中,既使用双重的for-in循环,又使用if语句

在这里插入图片描述
也就是说当i不等于j的时候,我们才将它添加到列表中。

  • 列表生成式支持嵌套

在这里插入图片描述
大家看,最外面是一个列表生成式,在这个列表生成式的内部又嵌套了另一个列表生成式,最外面列表生成式对应一个for-in循环,里面嵌套的这个列表生成式也对应一个for-in循环,所以外面的for-in循环就相当于是一个双层循环中的外层循环,里面的for-in循环就相当于是内层循环,所以我们先来看外层循环,外层循环是从0到3,比如说第一次 i 是0,然后开始执行外层循环的循环体,也就是内层循环了;
对于内层循环matrix是一个二维列表,那么我在进行循环的时候,每一次迭代呢其实对应的元素都是二维列表中的一维列表,所以第一次迭代的时候外层循环 i 是0,所以这个row[0]就代表着每一个一维列表中的索引为0的元素,然后生成一个列表;
外层循环第二次迭代的时候 i 是1,然后执行外层循环的循环体,也就是内层循环,对于matrix这个二维列表的话,它的每一行都取出索引为1的元素,然后生成一个列表,以此类推。

我把这个列表生成式写成for-in循环,这样大家就更好理解了,以上代码就相当于:
在这里插入图片描述
上图所选中的这一部分,就是我们这个列表生成式的语法格式中表示列表元素的表达式,也就是说我们生成的列表每个元素又都是一个列表。
在这里插入图片描述
然后我们对[row[i] for row in matrix]这一部分再进行拆解:
在这里插入图片描述
所以,最后:
在这里插入图片描述
这样我们把改写后的双重for-in循环,和前面我们写的这个嵌套的列表生成式,对比着看就比较容易理解了。
外层循环第一次迭代的时候 i 是0,那么对于内层循环就会依次取出每个一维列表中索引为0的元素,然后生成一个新列表,也就是[1, 5, 9],好,外层循环的下一次迭代 i 变成1了,那么对于内层循环来讲就会依次取出matrix这个二维列表中每个一维列表的索引为1的元素,组成一个新列表,剩下的以此类推,这样大家就比较容易理解了。

2、集合生成式

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
因为集合是没有顺序的,所以生产的集合并没有按顺序。


在这里插入图片描述
在这里插入图片描述
最后,集合生成式也是支持嵌套的,大家可以自己举个例子验证一下。

3、字典生成式

在这里插入图片描述
通过for-in循环和内置函数zip来并行遍历items和prices这两个列表,可以这样实现:
在这里插入图片描述
但是这种使用for-in循环和zip内置函数的这种解决方案,还有更好的替代,那就是使用字典生成式:
在这里插入图片描述
在这里插入图片描述
如上图所示,我们要遍历的这个可迭代对象,就是通过内置函数zip将items和prices进行打包压缩后生成了zip对象,关键字for前面的部分就是字典中每个键值对的一个表达式,它是由表示字典key的表达式、冒号:以及表示字典value的表达式组成的,因为我们要取得item中每个元素的大写,所以我们调用upper方法,对于price我们直接就拿过来用,作为value。
在这里插入图片描述

  • 在字典生成式中使用if语句

在这里插入图片描述
由于这个字典生成式比较长,我可以换行把它分成几部分,这样看的就比较清楚了:
在这里插入图片描述
添加了if语句之后,那么price小于等于80的key-value对就被排除了。

  • 在字典生成式中使用双重for-in循环

在这里插入图片描述
因为字典中的key不允许重复,所以刚开始可能生成有1:1、1:2,但是1:1、1:2都被1:3给覆盖掉了,2:1、2:2被2:3覆盖掉了,3:1、3:2被3:3覆盖掉了。
在这里插入图片描述

  • 在字典生成式中既可以使用双重for-in循环,又可以使用if语句

在这里插入图片描述

  • 没有元组生成式。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值