推导式用途:
对一个列表(集合,字典)根据条件进行循环遍历,把符合条件的筛选出来并生成新的列表(集合,字典)。括号内可以写for循环和if-else并且可以多层嵌套for、if,甚至可以在里面再嵌套一个推导式
列表推导式:
中括号内写入for循环,对一个列表进行遍历,然后写一个if条件判断,对每次循环取出的值进行判断,结果为True的话将当前遍历到的值写入到新生成的列表中。
str1 = ['aaaa', 'bbb', 'cccc', 'ddd', 'eee', 'ffff', 'ggggg']
formula1 = [str2 for str2 in str1 if len(str2) >= 4] # 循环遍历str列表,通过if表达式判断把通过的值赋给新的列表
print(formula1)
formula2 = [str2.upper() for str2 in str1 if len(str2) >= 4] # 把列表中长度大于等于4的元素取出并转换为大写
print(formula2)
生成100以内质数
内层嵌套推导式生成所有的非质数
formula3 = [x for x in range(2, 101) if not [y for y in range(2, x) if x % y == 0]]
print(formula3)
集合推导式:
集合推导式使用的是花括号,用法和列表推导式一样
str1 = ['aaaa', 'bbb', 'cccc', 'ddd', 'eee', 'ffff', 'ggggg']
formula = {str2 for str2 in str1 if len(str2) >= 4}
print(formula)
字典推导式:
字典推导式和集合推导式一样使用花括号,区别是字典推导式同时取出键和值,中间用冒号分开。还要注意字典要使用items()函数,该函数将字典的键和值以列表方式返回
dict1 = {
'name': 'zhangsan',
'age': 18,
'sex': 'man',
}
formula = {key: value for key, value in dict1.items() if key == 'name'}
print(formula)
生成式:
元组推导式又叫生成式。生成式是按照一个规则生成一个迭代器。语法和推导式类似,不同的是生成式用小括号,并且规则可以写成一个函数。
生成式返回的结果不可以直接打印,需要使用__next__()方法或者next(),每使用一次生成一个值,调用次数不能超过存量,不然会报错。
注意:同时调用两种方法效果是相互叠加的,比如用__next__()方法返回1,再用next()方法返回的不是1,是继续__next__()的下一个值2。
y = (x for x in range(100) if x % 2 == 0)
for i in range(25):
print(y.__next__()) #打印2
print(next(y)) #打印3
使用函数完成生成式,这里的yield是一个关键字,作用是返回一个值并暂停。我们可以看出来当实例化num()方法时,就是在调用num()方法,方法一直在运行,只是yield关键字使其进入阻塞状态,当使用next()调用时,方法进入cpu运行,当再次执行到yield语句时,再次进入阻塞状态
def num(): # 生成质数的生成器
x = 0
while True:
x += 1
n = 0
for i in range(1, x + 1):
if x % i == 0:
n += 1
if n == 2:
yield x
g = num() # 实例化对象,g就是生成器
for i in range(20):
print(next(g))