x生成式、生成器、迭代器、可迭代对象的关系如下图:

python 生成所有组合密码字典_整除

1.列表生成式

列表生成式就是一个用来生成列表的特定语法形式的表达式。是Python提供的一种生 成列表的简洁形式, 可快速生成一个新的list。

普通的语法格式:[exp for iter_var in iterable]
带过滤功能语法格式: [exp for iter_var in iterable if_exp]
循环嵌套语法格式: [exp for iter_var_A in iterable_A for iter_var_B in iterable_B]

(需求1)接收变量k,a,b。之前我们的做法是:

python 生成所有组合密码字典_列表生成式_02


列表生成式可以把上边12、13、14三行语句,用一行代码实现(第18行)

python 生成所有组合密码字典_列表生成式_03

*(需求2)生成一个列表,列表元素分别为[1 * 1, 2 * * 2, 3 * * 3, 4 * * 4… n * * n]。**之前做法:

python 生成所有组合密码字典_python 生成所有组合密码字典_04


列表生成式做法:

python 生成所有组合密码字典_列表生成式_05

通过上边两个例子,我们可以总结出来列表生成式的语法是:
[experssion for item in 序列 if 判断语句]

(需求3)找出1~10之间的所有的偶数

python 生成所有组合密码字典_python 生成所有组合密码字典_06


最简单的作法:

python 生成所有组合密码字典_生成式_07


(需求4)找出1~100之间所有的质数

判断num是否为质数,如果是质数,返回True,否则返回False
什么是质数?
    只能被1和本身整除的数,就是质数
    方法:
    依次判断num能被(2,num)整除
    如果能被其中其中一个数整除,不是质数
    当循环结束,都没有发现能被整除的数,那么就是质数

代码实现如下:

python 生成所有组合密码字典_python 生成所有组合密码字典_08

执行结果如下:

(0、1不是质数)

python 生成所有组合密码字典_生成式_09


(需求5)将列表中所有内容都变成小写

python 生成所有组合密码字典_整除_10


python 生成所有组合密码字典_python 生成所有组合密码字典_11


(需求6)找出/var/log目录中,所有以.log结尾的文件名或者目录名

python 生成所有组合密码字典_整除_12

(需求7)找出1~10之间所有偶数, 并且返回一个列表,(包含以这个偶数为半径的圆的面积)

最先想到以及最简单的做法:

python 生成所有组合密码字典_python 生成所有组合密码字典_13


列表生成式的做法:

python 生成所有组合密码字典_列表生成式_14


函数做法:

python 生成所有组合密码字典_整除_15

2.列表生成式变形-for循环嵌套

需求:将3x3的矩阵转换成一堆数组

[
 [1,2,3],
 [4,5,6],
 [7,8,9]
 ]
 输出[1,2,3,4,5,6,7,8,9]

之前的做法:

python 生成所有组合密码字典_列表生成式_16

列表生成式做法:

python 生成所有组合密码字典_列表生成式_17

使用内置方法:

python 生成所有组合密码字典_列表生成式_18

3.列表生成式和三元运算符结合

需求:找出1~100之间所有奇数, 并且返回一个列表。如果能被3整除, 返回返回该数的平方,否则返回该数的三次方 。

python 生成所有组合密码字典_列表生成式_19


如果列表生成式和三元运算符结合在一起, if语句放前面

4.字典生成式

(需求1)假设有20个学生,学生分数在60~100之间,筛选出成绩在90分以上的学生

之前的做法:

python 生成所有组合密码字典_生成式_20


字典生成式做法:

24行这一句代码实现上图12-16

26行这一句代码实现上图18-22

python 生成所有组合密码字典_整除_21


(需求2)将所有的key值变为大写

普通做法:

python 生成所有组合密码字典_python 生成所有组合密码字典_22


字典生成式做法:

python 生成所有组合密码字典_整除_23


(需求3)大小写key值合并(value值相加),统一以小写输出

普通做法:

python 生成所有组合密码字典_python 生成所有组合密码字典_24


字典生成式做法:

d = dict(a=2, b=1, c=2, B=9, A=10)
print({k.lower(): d.get(k.lower(), 0) + d.get(k.upper(), 0) for k in d})

或者

python 生成所有组合密码字典_python 生成所有组合密码字典_25

这里解释一下:== d.get(key.lower(), 0)==, 如果key值不存在,默认返回0;

5.集合生成式

print({i ** 2 for i in {1, 2, 3}})

python 生成所有组合密码字典_python 生成所有组合密码字典_26

print({i ** 2 for i in {1, 2, 3, 9, 12} if i % 3 == 0})

输出结果为什么?????

python 生成所有组合密码字典_python 生成所有组合密码字典_27

python 生成所有组合密码字典_列表生成式_28


因为集合是无序的呀,小傻瓜