生成式
1、列表生成式
对于这个range(1, 7)对象的1到6这六个数,如果某个数是偶数的话,我才想让它进行平方的操作,然后添加到列表的尾部,所以我可以添加这样一个if语句:
对2取余,如果i是偶数的话,对2取余的结果是0,也就是说i % 2
的布尔值是False,然后在进行not操作之后,它的布尔值就变成了True,这样才会进行平方的操作。
也就是说当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语句之后,那么price小于等于80的key-value对就被排除了。
因为字典中的key不允许重复,所以刚开始可能生成有1:1、1:2,但是1:1、1:2都被1:3给覆盖掉了,2:1、2:2被2:3覆盖掉了,3:1、3:2被3:3覆盖掉了。
- 没有元组生成式。