# listcomps: 列表推导式 ; genexps: 生成器表达式# 使用for循环创建一个100以内的奇数列表print("for循环创建")# 需要先创建一个空列表
lis =[]# range 包前不包后, 从1开始 100结束for i inrange(1,101):# % 求余数if i %2!=0:
lis.append(i)print(lis)print('------------------------')# 将for循环改变为列表推导式print("列表推导式创建创建")
lis1 =[i for i inrange(1,101)if i %2!=0]print(lis1)# 列表推导式的作用并不是做到循环做不到的事情,而是让代码变得更简洁,执行速度也会有极小的提升
1.1 列表推导式的局部作用域
# 设置一个变量x, 初始值为100
x =100print("x的初始值是:", x)
lis =[]for y inrange(10):# 这里主要是为了修改外部x的值,而多做的操作
x = y +5
lis.append(x)print(lis)# 此时x的值将会发生改变print("创建完列表后x的值是:", x)print('--------------------------')
z =100print("z的初始值是:", z)
lis1 =[z +5for z inrange(10)]print(lis1)print("创建完列表后z的值是:", z)# 这里的作用是,使用列表推导式可以避免在创建序列的时候,中间变量与代码中的某些全局变量一样,导致出现异常BUGprint('--------------------------')
u =[p for p inrange(10)]print(u)# print(p) # 此时会报错,因为列表推导式执行完以后,中间变量就会被自动删除掉
1.2 map与filter
print("map函数的使用")
lis =[1,2,3,4,5,6,7,8,9,10]# lambda表达式 : 前面是函数的参数,后面是返回值,适用于一些比较简单的函数
add =lambda num : num +5# map 对可迭代序列中的每个元素执行一次add函数,返回一个生成器
lis1 =map(add, lis)print('-----------------------')print("filter函数的使用")# filter 对可迭代序列中的每个元素执行一次函数,判断结果是否为True,保留所有判断结果为True的元素,返回一个生成器
lis2 =filter(lambda num: num >10, lis1)for i in lis2:print(i)
二、 生成器表达式
# 生成器表达式和列表推导式形式一样,不同点在于列表用[],生成器用()# 列表推导式是生成后在使用,生成器表达式则是在使用时逐个生成,更节省内存和时间# 列表推导式生成的序列可以重复遍历使用,生成器则是只能遍历一次
tup =(x for x inrange(100))print("第一次遍历tup")for i in tup:print(i)print("第二次遍历tup")for i in tup:print(i)
lis =[x for x inrange(10)]print("第一次遍历lis")for i in lis:print(i)print("第二次遍历lis")for i in lis:print(i)